commit 335473cdba4ae667fd733e0a6734ad8fcd2f5d69 Author: helenclx Date: Thu Jul 25 06:10:24 2024 +0000 Build: (33f509f) Correct build folder name diff --git a/404.html b/404.html new file mode 100644 index 00000000..ae80e33e --- /dev/null +++ b/404.html @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 404: Page Not Found | Leilukin's Hub + + +
+ Leilukin's Hub website banner +

404: Page Not Found

+ + +

Oops! Either the page you are looking for does not exist, or it has been moved to a diffrent part of this site.

+ +
+ 🏠 Back to Home +
+
+ + \ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 00000000..d0ad71a8 --- /dev/null +++ b/about/index.html @@ -0,0 +1,493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + About | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

About

+ + + +

About this website and its webmaster.

+ + +
+ + + + + + +
+
+

The Website

+
+

Leilukin's Hub is a literal queer-coded website (as in, this website is coded by a queer person) that serves as a personal hub for my interests and self-expression, as well as my own corner on the internet outside social media platforms.

+

On this site, you can find various stuff I have created or curated.

+

This website is mostly safe for work, but since I am an adult, I made my website with an adult audience in mind. I add content warnings for not safe for work and adult content.

+

Feel free to drop a message and say hi on my guestbook!

+

leilukin.com is hosted on Netlify.

+

Originally, Leilukin's Hub was hosted on Neocities. Now visiting leilukin.neocities.org will redirect you to leilukin.com. That said, I still post about updates to Leilukin's Hub on my Neocities profile, so if you also have a Neocities account, you can still follow me through my Neocities profile.

+

More information about this site can be found on the following pages:

+ +
+ +
+

You can link to my website with the following button. I strongly recommend you to upload my site button to your own website instead of hotlinking the button.

+Leilukin's Hub website button +

(I created this site button myself with Adobe Photoshop CS5)

+
+
+

The Webmaster

+
+

Avatar of a drawing of Leilukin bee

+

You can call me Leilukin. I am a Malaysian Chinese, queer, non-binary lesbian born in the early 90s. My pronouns are they/them and she/her in English, and in Chinese.

+

I speak Mandarin, English, Cantonese and Malay, though I am most fluent in Mandarin and English.

+

I am also autistic, so I use this website as a platform to catalogue my interests.

+

Leilukin is not my real name, but it is an internet pseudonym that I have used since I was a teenager, so the name has become my online identity, and I prefer to go by Leilukin in informal online spaces.

+

You can contact me via email: contact@leilukin.com. Using plain text email is encouraged.

+

Check out my Now page to learn what I am doing right now.

+

Social media platforms you can find me on:

+ +

However, I am most active on Tumblr, so if you want to interact with me on a social media platform, Tumblr would be the best option.

+

I also have media catalogues online on the following platforms:

+ +

If you enjoy my work, you can support me on Ko-Fi.

+
+ + Buy Me a Coffee at ko-fi.com +
+
+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/accessibility/index.html b/accessibility/index.html new file mode 100644 index 00000000..58dc4d5d --- /dev/null +++ b/accessibility/index.html @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Accessibility | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Accessibility

+ + + +

Leilukin's Hub's accessibility statement.

+ + +
+ + + + + + +
+ +

Even though this website is primarily meant to be my own space of self-expression, I also want every visitor to my website to have the best possible experience of browsing my website. Accessibility is also relevant to me as a disabled and neurodivergent person.

+

Therefore, I strive to design my website to be accessible, including to fellow disabled and neurodivergent people, by aiming to meet Web Content Accessibility Guidelines (WCAG) 2.2 Level AA standards.

+
+

Accessibility Features

+
+

High-level overview of the accessibility features of this site:

+
    +
  • Responsive design and mobile-friendly layout
  • +
  • Semantic HTML, enhanced by Web Accessibility Initiative – Accessible Rich Internet Applications (WAI-ARIA)
  • +
  • Sufficient colour contrast between text and background colours
  • +
  • Alt text for all non-decorative images, occasionally accompanied with longer image descriptions
  • +
  • Keyboard navigation-friendly: Every interactive element can be focused and interacted with keyboard buttons, with visible outline when focused
  • +
  • Logical content and heading flow
  • +
  • Links to skip to the main content or the top of the page
  • +
  • Sufficient font size that can be enlarged without breaking the site layout
  • +
  • No autoplaying audio or video
  • +
+

This site uses the Lexend font family as the default font and Intel One Mono as the monospaced font to improve text readability.

+
+

Testing

+
+

I use the following tools to test my site for accessibility:

+ +

In addition, I test the accessibility of my website manually by navigating with keyboard alone.

+
+

Feedback

+
+

Feedback from disabled and neurodivergent people are welcome. You can contact me via email for feedbacks and suggestions for improving the accessibility of this site.

+ + +

(This accessibility statement was last updated on 14 July 2024)

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/adoptables/index.html b/adoptables/index.html new file mode 100644 index 00000000..80fea8e7 --- /dev/null +++ b/adoptables/index.html @@ -0,0 +1,617 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Adoptables | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Adoptables

+ + + +

A collection of stuff I have adopted from other websites.

+ + +
+ + + + + + +
+
+

(This page was last updated on 22 July 2024)

+
+ +
+

Virtual Pets

+

Feel free to check out my virtual pets and feed them!

+
    +
  • + Tam, my tamaNOTchi +
  • +
  • + Shelly, my Wobble +
  • +
+
+ +
+

Personal Website Adoptables

+

These are adopted from other personal websites.

+ + +
+ +
+

Pixel Cliques

+ +

The Apple

+ The Apple pixel clique + +

Made by a Girl

+ Made by a Girl pixel clique +
+ +
+

Kitty Friends Pixel Club

+

An old pixel club about cats, revived by Divergent Rays.

+ +

My Kitty Friends

+
    +
  • + Leilukin's black kitty friend +
  • +
  • + Leilukin's purple kitty friend +
  • +
+

Created on 21 July 2024. If you want to adopt any of my kitty friends, please link back to my website and do not hotlink the images.

+ +

Adopted Kitty Friends

+ +
+ +
+

Salad Magazine

+

Salad Magazine is a web-based zine for creative works run by Kalechips.

+ +

Ink Snail and Sparkle Snail

+
+ Black ink snail pixel art by Semper + Sparkle snail pixel art by Semper +
+

These snails were made by Semper as part of the Sparkle Snails entry for Issue 3.

+
+ +
+

32-Bit Cafe Code Jam: Destination Vacation

+

Stuff I collected from 32-Bit Cafe's Community Code Jam #4: Destination Vacation in June 2024, including a passport with stamps from the code jam entries, and extra goodies from some of the participants.

+ +
+ + +
+ + + + +
+
+ + + + + + + \ No newline at end of file diff --git a/archive/index.html b/archive/index.html new file mode 100644 index 00000000..057dbe42 --- /dev/null +++ b/archive/index.html @@ -0,0 +1,910 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Archive | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Archive

+ + + +

All contents published on Leilukin's Hub.

+ + +
+ + + + + + +
+ + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/articles/anti-harry-potter-jk-rowling-masterlist/index.html b/articles/anti-harry-potter-jk-rowling-masterlist/index.html new file mode 100644 index 00000000..272cd93c --- /dev/null +++ b/articles/anti-harry-potter-jk-rowling-masterlist/index.html @@ -0,0 +1,589 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Anti-Harry Potter and Anti-J. K. Rowling Masterlist | Articles | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Anti-Harry Potter and Anti-J. K. Rowling Masterlist

+ + + + +
+ + + + + + + + + +
+
+ An anime girl crossing arms with a sidelong look and a Harry Potter-free message +
+This site is Harry Potter free. Lookin [sic] for it? Leave. +
+
+

(Credit to Tumblr user comradesaucegay for this Harry Potter-free website banner)

+

Like many millennials, I grew up with the Harry Potter series and was a major fan of the series. I had read the original 7 books and watched their film adaptations. The series was a passion of mine during my early- to mid-teen years. While the Harry Potter novels were far from the first books I read, they were the first fantasy novels I read, and the series’ concept of a magical world set in a contemporary setting fascinated teenage me.

+

However, even during my Harry Potter fixation years, there were things from the series that bothered me, from the idea of house elves being a slave race that naturally love being slaves, to Snape’s unconvincing “redemption” arc. As I got older and became more aware of social issues, I started to notice more problems with the series. In addition, reading more books has also made me realise that even on a technical writing level, the Harry Potter series was mediocre at best. As a result, I had stopped becoming a Harry Potter fan even before J. K. Rowling’s transphobia got mainstream attention.

+

Unfortunately, many adults with nostalgia goggles still refuse to let go of Harry Potter, and they believe Harry Potter can be separated or “reclaimed” by J. K. Rowling, despite how much Rowling’s worldview and prejudice are inextricably linked to her writing.

+

Therefore, I am compiling this masterlist by curating various materials that are critical of the Harry Potter series and J. K. Rowling. Items are ordered in chronological order. This is far from a comprehensive list of all the pieces that criticise Harry Potter and Rowling; this list is my curated list of ones that I have read, watched or listened to, and I personally endorse.

+
+

Articles

+
+ +
+

Videos

+
+ +
+

Podcasts

+
+
    +
  • The Shrieking Shack — A book reading podcast hosted by Xeecee and Liz. Originally a Harry Potter reread podcast made by and for lapsed fans that goes through every chapter of the Harry Potter books and their film adaptations and analyses the writing and politics of the series and J. K. Rowling.
  • +
+ + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/articles/designated-lesbian-syndrome-fandom/index.html b/articles/designated-lesbian-syndrome-fandom/index.html new file mode 100644 index 00000000..d2a5b7fe --- /dev/null +++ b/articles/designated-lesbian-syndrome-fandom/index.html @@ -0,0 +1,493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Designated Lesbian Syndrome in Fandom | Articles | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Designated Lesbian Syndrome in Fandom

+ + + + +
+ + + + + + +
+

Over the years of interacting with and observing fandom, I have come to dislike fandom and shipping culture for many reasons. One major reason I want to talk about here is the "Designated Lesbian Syndrome" phenomenon.

+

I first encountered this term from Tumblr user desolationlesbian's post:

+
+

Designated Lesbian Syndrome (n.): When fans of a piece of media pick two female characters and pair them together as the token F/F ship and put them in everything, but do not bother to engage with their dynamic in any way more substantive than having them hold hands in the background. Everyone agrees it’s a good ship and it has nothing but their full support, yet this never materializes into real effort or content creation.

+

Most common with works that have little-to-no narratively important women, but in rare cases can even happen to major and complex characters who are then reduced to token background lesbians as everyone hones in on the boys.

+
+

The example I am most familiar with is the fandom of Grand Admiral Thrawn and the Chiss from Star Wars — specifically, some shippers of Thrawn/Eli Vanto, also known as Thranto, pair Ar'alani and Karyn Faro as their token "pair-the-spares" femslash ship. However, while Thranto shippers have create fan content about the Ar'alani/Karyn Faro ship, they do not do it with even a fraction of the interest and enthusiasm as they do Thranto. This is evident in the difference between the amount of fan works these two pairings have received on Archive On Our Own (AO3): as of this writing, the Thrawn | Mitth'raw'nuruodo/Eli Vanto tag contains 1,358 works, while the Ar'alani/Karyn Faro tag contains 34 works only. It is also worth noting that if you use the tag page's filter function, you will notice that out of these 34 Ar'alani/Faro works, 23 of them are also tagged with Thrawn/Eli Vanto, proving the significant overlap between Thranto and Ar'alani/Faro shippers.

+

Part of the Designated Lesbian Syndrome also involves shippers headcanonning the female characters who could be considered "threats" to their favourite ship that involved male characters as lesbians. It does not matter if the female characters are actually romantically involved with the male characters' in the source material or not. Thrawn never has a canon love interest in both Legends and the Disney continuities, but the fact that Ar'alani and Faro are close to Thrawn as his long-time friend and protégée respectively is enough to make them the go-to candidates for lesbian headcanons from shippers who ship Thrawn with anyone else. Lesbian Ar'alani and Faro headcanons are most common among Thrawn/Eli shippers, but I had seen at least one Thrawn/Governor Pryce (a pairing that I cannot stand at all) shipper literally headcanons Ar'alani as a lesbian so Pryce does not need to worry about Ar'alani fighting with Pryce over Thrawn.

+

Ar'alani and Karyn Faro are unfortunately perfect examples of the above post by desolationlesbian of major female characters who are reduced to token background lesbians by shippers. As a huge fan of both Ar'alani and Faro as characters, I find it immensely frustrating, to the extent that the Thrawn shipping fandom has utterly turned me off on both Thranto and Ar'alani/Faro ships.

+

As a lesbian myself, I loathe the Designated Lesbian Syndrome with a passion, because this phenomenon is literally tokenism, specifically tokenisation of lesbians. As a consequence, I have reached the point where when it comes to fandoms with big Male/Male (M/M) ships that are not canon, I only trust lesbian headcanons from fellow lesbians. Yes, this means I do not trust lesbian Ar'alani and Karyn Faro headcanons from people who are not lesbians.

+

I really hate that it comes to this because as a lesbian, in theory I am in favour of lesbian headcanons for female characters who are cishet-coded or who do not have a canon sexuality. Unfortunately, lesbian headcanons have been used as a progressive way to get female characters out of the way of Male/Male ships (and occasionally Male/Female ships as well, though this phenomenon is more common in fandoms of M/M ships), not because these shippers actually care about lesbians and the female characters.

+

These shippers rarely put as much energy in talking about or creating fan content for the female characters they headcanon as lesbians as they do the male characters from their ships. These shippers can pretend they care about lesbians all they want, but my lesbian ass can see through their performative bullshit, and recognise their lesbian headcanons are nothing more than tokenism.

+ + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/articles/index.html b/articles/index.html new file mode 100644 index 00000000..0c079365 --- /dev/null +++ b/articles/index.html @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Articles | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Articles

+ + + +

List of articles published on my website.

+ + +
+ + + + + + + + + +
+
+

My Articles

+
+

Articles I have written.

+ +
+

My Articles for Video Games with Their Own Pages

+
+
    +
  • My Cassette Beasts shrine Articles page
  • +
  • My Star Wars: Knights of the Old Republic shrine Articles page
  • +
+
+ +
+

Articles featuring other people's interview with me.

+ + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/articles/kotor2-modder-interview-ars-technica/index.html b/articles/kotor2-modder-interview-ars-technica/index.html new file mode 100644 index 00000000..465d93b2 --- /dev/null +++ b/articles/kotor2-modder-interview-ars-technica/index.html @@ -0,0 +1,498 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The modders who spent 15 years fixing Knights of the Old Republic 2 @ Ars Technica | Articles | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

The modders who spent 15 years fixing Knights of the Old Republic 2 @ Ars Technica

+ + + + +
+ + + + + + +
+

On 6 December 2019, to celebrate the 15th anniversary of Star Wars: Knights of the Old Republic 2, Ars Technica has published an article about the modding community of KotOR 2. I was interviewed by the author of this article, Austin Taylor, for my same-gender romance mods for KotOR 2.

+
+
+

Romance? Yes, Please

+
+

Unlike the first KOTOR, there are no same-gender romance options in Obsidian’s sequel. Leilukin, a modder on the Nexus Forums, has focused much of her modding work since 2016 on fixing that oversight.

+

“As much as I love KOTOR2, I have always been frustrated by the fact that the romance content with the companions and certain NPCs… are all heterosexual,” she said.

+

Some of these fixes are relatively simple. In vanilla KOTOR2, for instance, only male characters can recruit The Handmaiden upon leaving Telos, while female characters are the only ones who can recruit The Disciple during the main quest on Dantooine. By default, Leiluken’s mod simply flips that gender check, so only male characters can recruit the Disciple and only females can recruit The Handmaiden.

+

But Leiluken’s mod goes further than that. The most challenging part, she said, was finding every reference to the Exile’s gender throughout the game spoken by gender-specific party members, then “add[ing] extra dialogue that replaces the pronouns and splic[ing] voiceover files myself.”

+

To recruit both The Handmaiden and The Disciple at the same time, players can install the PartySwap mod by DarthTyren. That mod was initially lacking the same-gender romance dialogue from Leiluken’s mod. But Leiluken has since added a compatibility installation option, letting the two mods now work together and fully opening up the same-gender romance options of your dreams.

+
+

Read the full article on Ars Technica here: +The modders who spent 15 years fixing Knights of the Old Republic 2

+ + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/articles/lgbtq-booklet-interview-misi-bawang/index.html b/articles/lgbtq-booklet-interview-misi-bawang/index.html new file mode 100644 index 00000000..13bf29f0 --- /dev/null +++ b/articles/lgbtq-booklet-interview-misi-bawang/index.html @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Floating in a Sky Full of Pride: LGBTQ+ Booklet Artist Interview from MISI:Bawang | Articles | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Floating in a Sky Full of Pride: LGBTQ+ Booklet Artist Interview from MISI:Bawang

+ + + + +
+ + + + + + +
+

(This article is also available on my art blog on Tumblr)

+

Floating in a Sky Full of Pride, the LGBTQ+ booklet of MISI:Bawang, a Malaysian digital booklet project, has been released on Valentine’s Day 2022. Since my submitted art piece, Life of a Bee with Pride, has been selected to be included in the booklet, I had received the honour of being interviewed by MISI:Bawang to share my personal experience with my LGBTQ+ identity, favourite queer art/media, and a ✨ special message to the Malaysian LGBTQ+ community. 🏳‍🌈

+

First slide of MISI:Bawang's interview with me for their LGBTQ+ booklet

+

Second slide of MISI:Bawang's interview with me for their LGBTQ+ booklet

+

Third slide of MISI:Bawang's interview with me for their LGBTQ+ booklet

+

MISI:Bawang has shared their interview with me and other Malaysian LGBTQ+ artists and authors who submitted their work to the booklet on Twitter and Instagram. Here are the Twitter thread and Instagram post that include my interview.

+

Text version of my interview below:

+
+

“What was your experience discovering your LGBTQ+ identity?”

+
+
+

The first clear signs of my attraction to women I was aware of started from my secondary school days. However, due to lack of knowledge and awareness of same-gender attraction and identities, I brushed it off as a teenage phase.

+

However, that changed as I started becoming active on Tumblr since I was 19. At first, I joined Tumblr to connect with people who share my interest in Star Wars and BioWare games. This led me to get to know LGBTQ+ from different parts of the world, which is especially helped by the fact that BioWare games are known for LGBTQ+ representation, therefore LGBTQ+ people are visible in BioWare player communities. This started my journey of questioning my sexuality and gender.

+

As I continue to stay on Tumblr, my engagement with LGBTQ+ people on Tumblr had gone beyond shared interest in entertainment media. Through Tumblr, I discovered many LGBTQ+ resources that helped me figure out my identity. As a result, at the age of 22, I eventually realised that I am a non-binary lesbian.

+
+
+ +
+
+

A Summer’s End - Hong Kong 1986 is the LGBTQ+ art that gives me comfort, inspiration and strength the most. It is an indie visual novel developed by the Asian Canadian studio Oracle and Bone. The story is about a lesbian romance that takes place in Hong Kong in the year of 1986.

+

A Summer’s End is the LGBTQ+ art I relate to most because it strongly resonates with my identity as a Cantonese-speaking Chinese lesbian who has grown up with Hong Kong media. I relate to both the protagonists, Michelle and Sam, as their characters represent different parts of my life as a Chinese lesbian. I also relate to the story’s theme of hoping for the future of our homeland despite the political uncertainties.

+
+
+

“Do you have a message to LGBTQ+ community living in Malaysia?”

+
+
+

First and foremost, you are not alone. LGBTQ+ Malaysians have a community that continues to survive despite the hardship we have to face due to society’s bigotry and misunderstanding of LGBTQ+ people and identities.

+

I hope the LGBTQ+ community in Malaysia will continue to grow and thrive, and more LGBTQ+ Malaysians who are still questioning and feeling lonely could be reached out. Let us work towards a future where we could live freely.

+
+ + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/articles/my-dislike-of-shipping-culture/index.html b/articles/my-dislike-of-shipping-culture/index.html new file mode 100644 index 00000000..1be1feb8 --- /dev/null +++ b/articles/my-dislike-of-shipping-culture/index.html @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + My Disinterest in Shipping and Dislike of Shipping Culture | Articles | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

My Disinterest in Shipping and Dislike of Shipping Culture

+ + + + +
+ + + + + + +
+

(Note: The original version of this writing was posted on my Tumblr blog on 3 May 2021)

+

I feel that the older I get, the less interested I am in shipping in general, and the less I can understand grown adults in late 20s or older who build their personality around shipping and cannot engage with any fiction without shipping something (before I remade my Tumblr account in 2015, I used to follow a 30-something-year-old fandom blogger who was literally like this).

+

I have also come to actually dislike shipping culture, especially the mindset of engaging with media primarily through a shipping lens at the expense of the characterisation, non-romantic relationships, themes, and general content of a piece of media. Throughout my years of experience with various fandoms, I have witnessed so many incredible characters and non-romantic relationships get ignored or underappreciated by the fandom because they’re not part of a popular ship. On the other hand, there are also many amazing characters get mischaracterised to make a fanon ship work, or get reduced to a handful of tropes as shippers Flanderise them in their shipping fan works.

+

Do not even get me started on the shippers who will complain about not being able to enjoy a piece of media just because “there’s no couple to ship”. For example, I’ve literally seen people on Tumblr make such complaints about the film Parasite, as if a profound piece of art that brutally critiques the class system does not matter if it does not provide any shipping material. It’s honestly very infuriating to see shippers like these are so willing to ignore art with meaningful story, characters and themes just because it lacks shipping fodder for them to project fanon onto.

+

Speaking of fanon, I really hate it when shippers, particularly shippers of popular non-canon pairings, expect anyone who is a fan of the same piece of media or any of the characters involved in the pairing to care about ships and treat the popular fanon ships as canon. These shippers also tend to act like their fanon and headcanons are universal, using languages like “the fandom has decided–” and “everyone has agreed that–”. And these shippers wonder why others who do not engage with that piece of media for shipping get sick and tired of shipping taking over discussions about said piece of media.

+

If you are so invested in shipping to the point that you are willing to disregard a piece of media just because you cannot find anything to ship, or you treat it as a personal attack when people talk about being sick and tired of shipping culture as well as how shipping dominates discussions about a piece of media, maybe you need to consider taking a step back from shipping and learning to take your shipping goggles off when you interact with a piece of media.

+ + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/articles/palestine-masterlist/index.html b/articles/palestine-masterlist/index.html new file mode 100644 index 00000000..5d163e3b --- /dev/null +++ b/articles/palestine-masterlist/index.html @@ -0,0 +1,557 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Palestine Masterlist | Articles | Leilukin's Hub + + + +
Skip to content
+
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Palestine Masterlist

+ + + + +
+ + + + + + +
+

Stand with Palestine

+

(Credit to rosemary for the Stand with Palestine button)

+

From the river to the sea, Palestine will be free.

+

Here, I am compiling a list of resources related to Palestine. This list is not comprehensive by any means, but I still want to do my part in using my platform to support an important cause.

+
+

Educate Yourself

+
+ +
+

Articles

+
+ +
+

Donations and Charities

+
+ +
+

Boycotts

+
+
    +
  • BDS Movement
  • +
  • Attention to website owners: Boycott Wix — The BDS movement has listed Wix as an organic boycott target, meaning the BDS movement did not initiate this grassroots boycott campaign, but supports it due to the boycotted brand's complicity in Israel's genocide and apartheid against Palestinians.
  • +
+
+

Spotlight Crowdfunding Campaigns

+
+

There have been Palestinians who reached out to me on Tumblr to ask for help with sharing their fundraising campaigns, so I am using my platform to share these campaigns. These campaigns have been verified by other Palestinians on Tumblr, so I encourage you to help to donate and share.

+ + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/assets/adoptables/32bitcafe-vacation/alexandra-stamp.png b/assets/adoptables/32bitcafe-vacation/alexandra-stamp.png new file mode 100644 index 00000000..8f514238 Binary files /dev/null and b/assets/adoptables/32bitcafe-vacation/alexandra-stamp.png differ diff --git a/assets/adoptables/32bitcafe-vacation/passport.png b/assets/adoptables/32bitcafe-vacation/passport.png new file mode 100644 index 00000000..2fcc0d1c Binary files /dev/null and b/assets/adoptables/32bitcafe-vacation/passport.png differ diff --git a/assets/adoptables/32bitcafe-vacation/ribose-riverfish.png b/assets/adoptables/32bitcafe-vacation/ribose-riverfish.png new file mode 100644 index 00000000..0b94bf54 Binary files /dev/null and b/assets/adoptables/32bitcafe-vacation/ribose-riverfish.png differ diff --git a/assets/adoptables/alexandra-diddles.png b/assets/adoptables/alexandra-diddles.png new file mode 100644 index 00000000..9428a3f3 Binary files /dev/null and b/assets/adoptables/alexandra-diddles.png differ diff --git a/assets/adoptables/kittyfriends/artwork-bat.gif b/assets/adoptables/kittyfriends/artwork-bat.gif new file mode 100644 index 00000000..ae9787b0 Binary files /dev/null and b/assets/adoptables/kittyfriends/artwork-bat.gif differ diff --git a/assets/adoptables/kittyfriends/artwork-pumpkin.gif b/assets/adoptables/kittyfriends/artwork-pumpkin.gif new file mode 100644 index 00000000..afea50bf Binary files /dev/null and b/assets/adoptables/kittyfriends/artwork-pumpkin.gif differ diff --git a/assets/adoptables/kittyfriends/artwork-vampire.gif b/assets/adoptables/kittyfriends/artwork-vampire.gif new file mode 100644 index 00000000..b5c79c1a Binary files /dev/null and b/assets/adoptables/kittyfriends/artwork-vampire.gif differ diff --git a/assets/adoptables/kittyfriends/artwork-witch.gif b/assets/adoptables/kittyfriends/artwork-witch.gif new file mode 100644 index 00000000..75ab6cd3 Binary files /dev/null and b/assets/adoptables/kittyfriends/artwork-witch.gif differ diff --git a/assets/adoptables/kittyfriends/krish.png b/assets/adoptables/kittyfriends/krish.png new file mode 100644 index 00000000..44802248 Binary files /dev/null and b/assets/adoptables/kittyfriends/krish.png differ diff --git a/assets/adoptables/kittyfriends/leilukin-blackkitty.png b/assets/adoptables/kittyfriends/leilukin-blackkitty.png new file mode 100644 index 00000000..d512f470 Binary files /dev/null and b/assets/adoptables/kittyfriends/leilukin-blackkitty.png differ diff --git a/assets/adoptables/kittyfriends/leilukin-purplekitty.png b/assets/adoptables/kittyfriends/leilukin-purplekitty.png new file mode 100644 index 00000000..18f919ef Binary files /dev/null and b/assets/adoptables/kittyfriends/leilukin-purplekitty.png differ diff --git a/assets/adoptables/kittyfriends/owl-small-owlcat.gif b/assets/adoptables/kittyfriends/owl-small-owlcat.gif new file mode 100644 index 00000000..904aca52 Binary files /dev/null and b/assets/adoptables/kittyfriends/owl-small-owlcat.gif differ diff --git a/assets/adoptables/kittyfriends/rosemary-ghostcat.gif b/assets/adoptables/kittyfriends/rosemary-ghostcat.gif new file mode 100644 index 00000000..45c8ccb7 Binary files /dev/null and b/assets/adoptables/kittyfriends/rosemary-ghostcat.gif differ diff --git a/assets/adoptables/kittyfriends/sakuradreams-Simba.gif b/assets/adoptables/kittyfriends/sakuradreams-Simba.gif new file mode 100644 index 00000000..34fa97c2 Binary files /dev/null and b/assets/adoptables/kittyfriends/sakuradreams-Simba.gif differ diff --git a/assets/adoptables/kittyfriends/solaria-garfield.gif b/assets/adoptables/kittyfriends/solaria-garfield.gif new file mode 100644 index 00000000..9242e8c9 Binary files /dev/null and b/assets/adoptables/kittyfriends/solaria-garfield.gif differ diff --git a/assets/adoptables/lostletters-moomin.png b/assets/adoptables/lostletters-moomin.png new file mode 100644 index 00000000..9262fd51 Binary files /dev/null and b/assets/adoptables/lostletters-moomin.png differ diff --git a/assets/adoptables/lou-frog.gif b/assets/adoptables/lou-frog.gif new file mode 100644 index 00000000..cfc2317b Binary files /dev/null and b/assets/adoptables/lou-frog.gif differ diff --git a/assets/adoptables/lou-greenkaoani.gif b/assets/adoptables/lou-greenkaoani.gif new file mode 100644 index 00000000..9d37391a Binary files /dev/null and b/assets/adoptables/lou-greenkaoani.gif differ diff --git a/assets/adoptables/lou-maneki-neko.png b/assets/adoptables/lou-maneki-neko.png new file mode 100644 index 00000000..a244bbc9 Binary files /dev/null and b/assets/adoptables/lou-maneki-neko.png differ diff --git a/assets/adoptables/lou-tamagotchi.gif b/assets/adoptables/lou-tamagotchi.gif new file mode 100644 index 00000000..d3569adb Binary files /dev/null and b/assets/adoptables/lou-tamagotchi.gif differ diff --git a/assets/adoptables/pixelcliques/madebyagirl.png b/assets/adoptables/pixelcliques/madebyagirl.png new file mode 100644 index 00000000..877a20ea Binary files /dev/null and b/assets/adoptables/pixelcliques/madebyagirl.png differ diff --git a/assets/adoptables/pixelcliques/theapple.gif b/assets/adoptables/pixelcliques/theapple.gif new file mode 100644 index 00000000..4a31dec8 Binary files /dev/null and b/assets/adoptables/pixelcliques/theapple.gif differ diff --git a/assets/adoptables/salad-magazine/semper-inksnail-black.png b/assets/adoptables/salad-magazine/semper-inksnail-black.png new file mode 100644 index 00000000..fa10b8fc Binary files /dev/null and b/assets/adoptables/salad-magazine/semper-inksnail-black.png differ diff --git a/assets/adoptables/salad-magazine/semper-inksnail-sparkle.png b/assets/adoptables/salad-magazine/semper-inksnail-sparkle.png new file mode 100644 index 00000000..eb80f36e Binary files /dev/null and b/assets/adoptables/salad-magazine/semper-inksnail-sparkle.png differ diff --git a/assets/adoptables/wings-dolphinclassic.gif b/assets/adoptables/wings-dolphinclassic.gif new file mode 100644 index 00000000..f84afe96 Binary files /dev/null and b/assets/adoptables/wings-dolphinclassic.gif differ diff --git a/assets/adoptables/wings-rainbowmoon.png b/assets/adoptables/wings-rainbowmoon.png new file mode 100644 index 00000000..c5338e5a Binary files /dev/null and b/assets/adoptables/wings-rainbowmoon.png differ diff --git a/assets/banners/harry-potter-free-site.png b/assets/banners/harry-potter-free-site.png new file mode 100644 index 00000000..21d8814a Binary files /dev/null and b/assets/banners/harry-potter-free-site.png differ diff --git a/assets/buttons/communities/32-bit-cafe.png b/assets/buttons/communities/32-bit-cafe.png new file mode 100644 index 00000000..52edf506 Binary files /dev/null and b/assets/buttons/communities/32-bit-cafe.png differ diff --git a/assets/buttons/communities/saladmagazine.png b/assets/buttons/communities/saladmagazine.png new file mode 100644 index 00000000..19f21253 Binary files /dev/null and b/assets/buttons/communities/saladmagazine.png differ diff --git a/assets/buttons/directories/accessiblenet.png b/assets/buttons/directories/accessiblenet.png new file mode 100644 index 00000000..1054d02d Binary files /dev/null and b/assets/buttons/directories/accessiblenet.png differ diff --git a/assets/buttons/directories/bukmarkclub.png b/assets/buttons/directories/bukmarkclub.png new file mode 100644 index 00000000..d0db15f1 Binary files /dev/null and b/assets/buttons/directories/bukmarkclub.png differ diff --git a/assets/buttons/directories/indieseek.png b/assets/buttons/directories/indieseek.png new file mode 100644 index 00000000..265a8ee6 Binary files /dev/null and b/assets/buttons/directories/indieseek.png differ diff --git a/assets/buttons/directories/linklane.png b/assets/buttons/directories/linklane.png new file mode 100644 index 00000000..a6771431 Binary files /dev/null and b/assets/buttons/directories/linklane.png differ diff --git a/assets/buttons/directories/list-me.png b/assets/buttons/directories/list-me.png new file mode 100644 index 00000000..e5858061 Binary files /dev/null and b/assets/buttons/directories/list-me.png differ diff --git a/assets/buttons/directories/responsiveweb.png b/assets/buttons/directories/responsiveweb.png new file mode 100644 index 00000000..13694150 Binary files /dev/null and b/assets/buttons/directories/responsiveweb.png differ diff --git a/assets/buttons/directories/smoothsailing.png b/assets/buttons/directories/smoothsailing.png new file mode 100644 index 00000000..adec903d Binary files /dev/null and b/assets/buttons/directories/smoothsailing.png differ diff --git a/assets/buttons/misc/ko-fi.webp b/assets/buttons/misc/ko-fi.webp new file mode 100644 index 00000000..46402609 Binary files /dev/null and b/assets/buttons/misc/ko-fi.webp differ diff --git a/assets/buttons/misc/standwithpalestine.png b/assets/buttons/misc/standwithpalestine.png new file mode 100644 index 00000000..70a5e9eb Binary files /dev/null and b/assets/buttons/misc/standwithpalestine.png differ diff --git a/assets/buttons/pride/9_stripe.png b/assets/buttons/pride/9_stripe.png new file mode 100644 index 00000000..195e8911 Binary files /dev/null and b/assets/buttons/pride/9_stripe.png differ diff --git a/assets/buttons/pride/agender.png b/assets/buttons/pride/agender.png new file mode 100644 index 00000000..e03c95e3 Binary files /dev/null and b/assets/buttons/pride/agender.png differ diff --git a/assets/buttons/pride/bigender.png b/assets/buttons/pride/bigender.png new file mode 100644 index 00000000..3d4cbcba Binary files /dev/null and b/assets/buttons/pride/bigender.png differ diff --git a/assets/buttons/pride/demigirl.png b/assets/buttons/pride/demigirl.png new file mode 100644 index 00000000..5f8333cf Binary files /dev/null and b/assets/buttons/pride/demigirl.png differ diff --git a/assets/buttons/pride/disability.png b/assets/buttons/pride/disability.png new file mode 100644 index 00000000..e801e463 Binary files /dev/null and b/assets/buttons/pride/disability.png differ diff --git a/assets/buttons/pride/lesbian.png b/assets/buttons/pride/lesbian.png new file mode 100644 index 00000000..63e3b80c Binary files /dev/null and b/assets/buttons/pride/lesbian.png differ diff --git a/assets/buttons/pride/nonbinary.png b/assets/buttons/pride/nonbinary.png new file mode 100644 index 00000000..e0377abe Binary files /dev/null and b/assets/buttons/pride/nonbinary.png differ diff --git a/assets/buttons/pride/progress.png b/assets/buttons/pride/progress.png new file mode 100644 index 00000000..2b27b04e Binary files /dev/null and b/assets/buttons/pride/progress.png differ diff --git a/assets/buttons/sites/10kph.png b/assets/buttons/sites/10kph.png new file mode 100644 index 00000000..472099b9 Binary files /dev/null and b/assets/buttons/sites/10kph.png differ diff --git a/assets/buttons/sites/autisticasfxxk.gif b/assets/buttons/sites/autisticasfxxk.gif new file mode 100644 index 00000000..022e28e2 Binary files /dev/null and b/assets/buttons/sites/autisticasfxxk.gif differ diff --git a/assets/buttons/sites/chrisburnell.gif b/assets/buttons/sites/chrisburnell.gif new file mode 100644 index 00000000..c033fe5a Binary files /dev/null and b/assets/buttons/sites/chrisburnell.gif differ diff --git a/assets/buttons/sites/divergentrays.png b/assets/buttons/sites/divergentrays.png new file mode 100644 index 00000000..13a30b00 Binary files /dev/null and b/assets/buttons/sites/divergentrays.png differ diff --git a/assets/buttons/sites/dryadglen.png b/assets/buttons/sites/dryadglen.png new file mode 100644 index 00000000..9e708cb3 Binary files /dev/null and b/assets/buttons/sites/dryadglen.png differ diff --git a/assets/buttons/sites/frills.png b/assets/buttons/sites/frills.png new file mode 100644 index 00000000..97f9b349 Binary files /dev/null and b/assets/buttons/sites/frills.png differ diff --git a/assets/buttons/sites/groundedwren.png b/assets/buttons/sites/groundedwren.png new file mode 100644 index 00000000..3ed78c84 Binary files /dev/null and b/assets/buttons/sites/groundedwren.png differ diff --git a/assets/buttons/sites/jasminesjournal.png b/assets/buttons/sites/jasminesjournal.png new file mode 100644 index 00000000..275e383c Binary files /dev/null and b/assets/buttons/sites/jasminesjournal.png differ diff --git a/assets/buttons/sites/jefbecker.png b/assets/buttons/sites/jefbecker.png new file mode 100644 index 00000000..fbcc2fef Binary files /dev/null and b/assets/buttons/sites/jefbecker.png differ diff --git a/assets/buttons/sites/kalechips.png b/assets/buttons/sites/kalechips.png new file mode 100644 index 00000000..de731020 Binary files /dev/null and b/assets/buttons/sites/kalechips.png differ diff --git a/assets/buttons/sites/lostletters.gif b/assets/buttons/sites/lostletters.gif new file mode 100644 index 00000000..08062813 Binary files /dev/null and b/assets/buttons/sites/lostletters.gif differ diff --git a/assets/buttons/sites/macaque.png b/assets/buttons/sites/macaque.png new file mode 100644 index 00000000..62c7fddb Binary files /dev/null and b/assets/buttons/sites/macaque.png differ diff --git a/assets/buttons/sites/mycorrhiza.png b/assets/buttons/sites/mycorrhiza.png new file mode 100644 index 00000000..65e7f3ed Binary files /dev/null and b/assets/buttons/sites/mycorrhiza.png differ diff --git a/assets/buttons/sites/owlsroost.gif b/assets/buttons/sites/owlsroost.gif new file mode 100644 index 00000000..47ef1acc Binary files /dev/null and b/assets/buttons/sites/owlsroost.gif differ diff --git a/assets/buttons/sites/pinkvampyr.gif b/assets/buttons/sites/pinkvampyr.gif new file mode 100644 index 00000000..37f136f6 Binary files /dev/null and b/assets/buttons/sites/pinkvampyr.gif differ diff --git a/assets/buttons/sites/sanguineroyal.gif b/assets/buttons/sites/sanguineroyal.gif new file mode 100644 index 00000000..0af30f2f Binary files /dev/null and b/assets/buttons/sites/sanguineroyal.gif differ diff --git a/assets/buttons/sites/solaria.png b/assets/buttons/sites/solaria.png new file mode 100644 index 00000000..c33c5e17 Binary files /dev/null and b/assets/buttons/sites/solaria.png differ diff --git a/assets/buttons/sites/starbreaker.avif b/assets/buttons/sites/starbreaker.avif new file mode 100644 index 00000000..90f179ed Binary files /dev/null and b/assets/buttons/sites/starbreaker.avif differ diff --git a/assets/buttons/sites/symliadoo.png b/assets/buttons/sites/symliadoo.png new file mode 100644 index 00000000..198e53c7 Binary files /dev/null and b/assets/buttons/sites/symliadoo.png differ diff --git a/assets/buttons/sites/whiona.png b/assets/buttons/sites/whiona.png new file mode 100644 index 00000000..0d35601a Binary files /dev/null and b/assets/buttons/sites/whiona.png differ diff --git a/assets/buttons/sites/wings.png b/assets/buttons/sites/wings.png new file mode 100644 index 00000000..1e5f1716 Binary files /dev/null and b/assets/buttons/sites/wings.png differ diff --git a/assets/buttons/sites/xandra.png b/assets/buttons/sites/xandra.png new file mode 100644 index 00000000..79990e6d Binary files /dev/null and b/assets/buttons/sites/xandra.png differ diff --git a/assets/buttons/webrings/queercoded-left.png b/assets/buttons/webrings/queercoded-left.png new file mode 100644 index 00000000..e38d6110 Binary files /dev/null and b/assets/buttons/webrings/queercoded-left.png differ diff --git a/assets/buttons/webrings/queercoded-right.png b/assets/buttons/webrings/queercoded-right.png new file mode 100644 index 00000000..a4eaa35e Binary files /dev/null and b/assets/buttons/webrings/queercoded-right.png differ diff --git a/assets/buttons/webrings/queercoded.png b/assets/buttons/webrings/queercoded.png new file mode 100644 index 00000000..e907872f Binary files /dev/null and b/assets/buttons/webrings/queercoded.png differ diff --git a/assets/cliques/OTF.png b/assets/cliques/OTF.png new file mode 100644 index 00000000..5cbecb2e Binary files /dev/null and b/assets/cliques/OTF.png differ diff --git a/assets/cliques/breloom.png b/assets/cliques/breloom.png new file mode 100644 index 00000000..fd162b2d Binary files /dev/null and b/assets/cliques/breloom.png differ diff --git a/assets/cliques/caffeineNATION.png b/assets/cliques/caffeineNATION.png new file mode 100644 index 00000000..f1d795fb Binary files /dev/null and b/assets/cliques/caffeineNATION.png differ diff --git a/assets/cliques/linked.png b/assets/cliques/linked.png new file mode 100644 index 00000000..5b033208 Binary files /dev/null and b/assets/cliques/linked.png differ diff --git a/assets/cliques/myjam.png b/assets/cliques/myjam.png new file mode 100644 index 00000000..eb3453ca Binary files /dev/null and b/assets/cliques/myjam.png differ diff --git a/assets/cliques/unexpectedsong.png b/assets/cliques/unexpectedsong.png new file mode 100644 index 00000000..6b3c9da0 Binary files /dev/null and b/assets/cliques/unexpectedsong.png differ diff --git a/assets/css/asummersend.css b/assets/css/asummersend.css new file mode 100644 index 00000000..a2ea7501 --- /dev/null +++ b/assets/css/asummersend.css @@ -0,0 +1,32 @@ +:root { + --clr-body-bg: #1f0033; + --img-body-bg: none; + --clr-body-txt: #fceaff; + --clr-content-bg: #101010; + + --clr-top-btn-bg: #fd60e1; + --clr-top-btn-txt: #101010; + + --clr-main-heading: #FF29D8; + --clr-sub-heading: #FF29D8; + --clr-title-border: #d3aad5; + --clr-bold-txt: #ff9933; + --clr-link: #d270ff; + --clr-link-hover: #7E4197; + --clr-quote-bg: #222121; + --clr-quote-border: #4d4385; + + --clr-code-bg: #241445; + --clr-code-border: #82668f; + --clr-dates: rgb(158, 203, 255); + + --clr-link-btn-bg: #873eb5; + --clr-link-btn-txt: white; + --clr-link-btn-hover: #241445; + + --clr-hero-bg: #101010; + --clr-navbar-bg: #181818; + --clr-navbar-link: white; + + --clr-main-footer-bg: #181818; +} diff --git a/assets/css/cassettebeasts.css b/assets/css/cassettebeasts.css new file mode 100644 index 00000000..c52427ec --- /dev/null +++ b/assets/css/cassettebeasts.css @@ -0,0 +1,60 @@ +:root { + --clr-body-bg: #e4e3e3; + --clr-body-txt: #141414; + --clr-content-bg: #ffffff; + + --clr-top-btn-bg: #552190; + --clr-top-btn-txt: #ffffff; + + --clr-main-heading: #171717; + --clr-sub-heading: #111111; + --clr-title-border: #7629db; + --clr-bold-txt: #da4500; + --clr-link: #7629db; + --clr-link-hover: #270e48; + --clr-quote-bg: #f3f2f2; + --clr-quote-border: #414141; + --clr-cw-hover: rgb(250, 229, 229); + + --clr-code-bg: #f3f2f2; + --clr-code-border: #414141; + --clr-dates: rgb(58, 150, 255); + + --clr-link-btn-bg: #873eb5; + --clr-link-btn-txt: white; + --clr-link-btn-hover: #241445; + + --clr-hero-bg: #7944B6; + --clr-navbar-bg: #9b59b6; + --clr-navbar-link: white; + + --clr-main-footer-bg: #9b59b6; +} + +@media (prefers-color-scheme: dark) { + :root { + --clr-body-bg: #141414; + --clr-body-txt: #fff; + --clr-content-bg: #242424; + + --clr-top-btn-bg: #552190; + + --clr-main-heading: #daaced; + --clr-sub-heading: #fff; + --clr-title-border: #9964de; + --clr-bold-txt: #ff9869; + --clr-link: #ce97ff; + --clr-link-hover: #b366f7; + --clr-quote-bg: #141414; + --clr-quote-border: #f3f2f2; + + --clr-navbar-bg: #3a0873; + --clr-main-footer-bg: #3a0873; + } +} + +.hero__top-bar, +.footer, +.footer a { color: var(--clr-navbar-link); } + +.footer a:focus { outline-color: var(--clr-navbar-link); } \ No newline at end of file diff --git a/assets/css/components.css b/assets/css/components.css new file mode 100644 index 00000000..279704ec --- /dev/null +++ b/assets/css/components.css @@ -0,0 +1,225 @@ +/* Text Box */ +.text-box { + background: var(--clr-quote-bg); + border: 0.1em solid var(--clr-main-heading); + padding: 0.8em; + margin: 1em 0; + display: grid; + gap: 1em; +} + +/* Inline Navigation */ +.inline-nav { + --inline-nav-gap: 0.5em; + list-style-type: ""; + margin: 0; + padding: 0; + display: flex; + gap: 0.25em var(--inline-nav-gap); + flex-wrap: wrap; +} + +.inline-nav li:not(:last-child)::after { + content: '•'; + padding-left: var(--inline-nav-gap); +} + +/* Mod Entry */ +.mod-entry, +.mod-entry__downloads { + display: grid; + align-items: center; +} + +.mod-entry { + gap: 1em; + background: var(--clr-mod-entry-bg); + margin: 1em 0; + padding: 1em; +} + +.mod-entry__downloads { + gap: 0.5em; +} + +/* Tablet screen size */ +@media only screen and (min-width: 37.5rem) { + .mod-entry__downloads { + grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); + } +} + +/* Skip to content button */ +.skip-btn a { + position: absolute; + display: inline-block; + left: 0; + top: -1000px; + overflow: hidden; + transition: top 0.5s ease; + background: var(--clr-content-bg); + font-size: 1.25rem; + z-index: 1000; + padding: 0.3em 0.7em; +} + +.skip-btn a:focus { + top: 0; + transition: top 0.3s ease; +} + +/* Link button */ +.link-btn--wrapper { + list-style-type: ""; + padding: 0; + display: flex; + flex-wrap: wrap; + gap: 0.5em; +} + +.link-btn { + --btn-right-padding: 0.8em; + text-align: center; + display: inline-block; + border: 0.1em solid var(--clr-link-btn-bg); + border-radius: 0.5em; + padding: 0.4em var(--btn-right-padding); + background: var(--clr-link-btn-bg); + color: var(--clr-link-btn-txt); + font-weight: 700; +} + +.link-btn, +.link-btn:hover, +.link-btn:visited { text-decoration: none; } + +.link-btn:hover { + background: var(--clr-link-btn-hover); + transition: 0.2s; +} + +.link-btn:focus { + outline: 0.15em solid var(--clr-link-btn-txt); + outline-offset: -0.25em; +} + +a.link-btn[href^="http"]:not([href*="leilukin.com"]) { padding-right: calc(var(--btn-right-padding) + var(--sz-external-link)); } + +/* Content Accordion */ +* + .content-accordion { margin-top: var(--sz-paragraph-margin); } +.content-accordion { padding: 0.5em 0; } +.content-accordion__summary { font-weight: 700; } +.content-accordion__content { padding: 0.5em 1em; } +.content-accordion__content p + p { margin-top: 1em; } + +/* Content warning accordion */ +* + .contnet-warning { margin-top: var(--sz-paragraph-margin); } + +.contnet-warning { + border: 0.1em solid var(--clr-title-border); + border-radius: 0.2em; +} + +.contnet-warning__warning { + padding: 0.8em; + --stripe-color: var(--clr-quote-bg); + background-image: repeating-linear-gradient( + 45deg, + transparent, + transparent 0.5em, + var(--stripe-color) 0.5em, + var(--stripe-color) 1em + ); +} + +.contnet-warning__warning:hover, +.contnet-warning__warning:focus { --stripe-color: var(--clr-cw-hover); } + +.contnet-warning__content { padding: 1em; } + +/* Adoptables wrapper */ +.adoptables { + list-style-type: ""; + margin: 0; + padding: 0; + display: flex; + flex-wrap: wrap; + align-items: flex-end; + gap: 0.5em; + overflow-x: clip; + overflow-clip-margin: 0.5em; +} + +p + .adoptables { margin-top: 1em; } + +/* Web button lists */ +.web-btn-wrapper { + display: flex; + flex-wrap: wrap; + gap: 0.5em; + align-items: center; + list-style-type: ""; + padding: 0; + margin: 0; + overflow-x: clip; + overflow-clip-margin: 0.5em; +} + +/* Tabs */ +.tabwrap section { display: none; } + +.tabwrap section:target, +.tabwrap section:has(*:target) { display: block; } + +.tabs { + list-style-type: ""; + padding: 0; + margin: 0; + display: flex; + flex-wrap: wrap; + gap: 0.5em; +} + +.tab__btn { + display: inline-block; + color: var(--clr-code-bg); + background-color: var(--clr-title-border); + text-decoration: none; + padding: 0.4em 0.8em; +} + +.tab__btn:hover { background-color: #d5c2d6; } + +.tab__btn:focus { + outline: 0.2em solid var(--clr-title-border); + outline-offset: 0.15em; +} + +/* Web ring */ +.webring { + border: 0.08em outset; + text-align: center; +} + +.webring__name { + margin: 0; + padding: 0.2em 0.5em; + border: 0.08em solid; +} + +.webring__links { + list-style-type: ""; + padding: 0; + margin: 0 !important; + display: flex; + flex-wrap: wrap; +} + +.webring__link { + flex: 1; + border: 0.08em solid; + padding: 0.2em 0.4em; +} + +/* Remove external link icon from Website Carbon badge */ +#wcb_a::after { all: revert; } \ No newline at end of file diff --git a/assets/css/content.css b/assets/css/content.css new file mode 100644 index 00000000..61ce398c --- /dev/null +++ b/assets/css/content.css @@ -0,0 +1,56 @@ +/* MAIN CONTENT */ +content-wrapper, +.content--divided { display: grid; } + +content-wrapper, +.content--divided { gap: 1rem; } + +.content:not(.content--divided), +.content__section { padding: 1.5rem var(--sz-main-padding); } + +.main__header { + padding: 2.5rem var(--sz-main-padding); + text-align: center; + display: grid; +} + +.content:not(.content--divided), +.content__section { background-color: var(--clr-content-bg); } + +.article__info { + text-align: center; + display: grid; + gap: 0.2em; +} + +.content > * + .h2, +.content__section > * + .h2 { margin-top: 2em; } + +.content > * + :not([class]), +.content__section > * + :not([class]) { margin-top: var(--sz-paragraph-margin); } + +.content ul:not([class]), .content ol:not([class]) { + display: grid; + gap: var(--sz-content-list-gap); +} + +.content ul ul, .content ol ol, +.content ul ol, .content ol ul { margin-top: var(--sz-content-list-gap); } + +.sidebar--sticky { + position: sticky; + top: var(--sz-navbar-ht); +} + +/* Desktop main content layout */ +@media only screen and (min-width: 60rem) { + content-wrapper { + padding: 0 var(--sz-main-padding); + grid-template-areas: 'leftbar content rightbar'; + grid-template-columns: minmax(0, 18vw) minmax(min(60ch, 40vw), 2.5fr) minmax(0, 18vw); + } + + .content { grid-area: content; } + .left-sidebar { grid-area: leftbar; } + .right-sidebar { grid-area: rightbar; } +} diff --git a/assets/css/general.css b/assets/css/general.css new file mode 100644 index 00000000..6cc226eb --- /dev/null +++ b/assets/css/general.css @@ -0,0 +1,126 @@ +/* GENERAL STYLES */ +@media (prefers-reduced-motion: no-preference) { + html { scroll-behavior: smooth; } +} + +body { + display: flex; + align-items: center; + flex-direction: column; + font-family: var(--ff-default), system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + color: var(--clr-body-txt); + background-color: var(--clr-body-bg); +} + +main { + width: 100%; + display: grid; + font-size: var(--fs-main); +} + +h1 { + color: var(--clr-main-heading); + font-size: var(--fs-h1); + border-bottom: 0.18rem solid var(--clr-title-border); + padding-bottom: 0.3em; + margin-bottom: 0.5em; +} + +h2, h3, h4, h5, h6 { color: var(--clr-sub-heading); } +h1, h2, h3 { line-height: 1.2; } +h2, .h2 { font-size: var(--fs-h2); } +h3, .h3 { font-size: var(--fs-h3); } + +h2:has(+ *[class]:not(.heading-anchor)), .h2:has(+ *[class]), +h3:has(+ *[class]:not(.heading-anchor)), .h3:has(+ *[class]) { margin-bottom: 0.5em; } + +h4, .h4 { font-size: var(--fs-h4); } + +strong { color: var(--clr-bold-txt); } + +:focus { outline: 0.15em solid currentColor; } + +a { + font-weight: 700; + color: var(--clr-link); +} + +a:hover { color: var(--clr-link-hover); } +a:not([class]):focus { outline: 0.15rem solid var(--clr-link); } +a:hover img, a:focus img { outline: 0.2em solid currentColor; } + +a[href^="http"]:not([href*="leilukin.com"]):not(:has(img, svg, picture)), +.external-link { padding-right: var(--sz-external-link); } + +a[href^="http"]:not([href*="leilukin.com"]):not(:has(img, svg, picture))::after, +.external-link::after { + position: absolute; + content: ""; + display: inline-block; + width: 1em; + height: 1em; + margin-left: 0.3em; + background-color: currentColor; + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3C!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--%3E%3Cpath d='M320 0c-17.7 0-32 14.3-32 32s14.3 32 32 32h82.7L201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L448 109.3V192c0 17.7 14.3 32 32 32s32-14.3 32-32V32c0-17.7-14.3-32-32-32H320zM80 32C35.8 32 0 67.8 0 112V432c0 44.2 35.8 80 80 80H400c44.2 0 80-35.8 80-80V320c0-17.7-14.3-32-32-32s-32 14.3-32 32V432c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16V112c0-8.8 7.2-16 16-16H192c17.7 0 32-14.3 32-32s-14.3-32-32-32H80z'/%3E%3C/svg%3E"); + mask-repeat: no-repeat; + mask-size: 90%; + transform: translateY(0.25em); +} + +:not(.c-blockquote) > blockquote, +.c-blockquote { + padding: 1em 1.4em 1.4em; + border-inline-start: 0.1em solid var(--clr-main-heading); + background-color: var(--clr-quote-bg); + margin-bottom: 1em; +} + +blockquote > * + :not([class]), +* + blockquote, +* + .c-blockquote, +.c-blockquote__attribution { margin-top: var(--sz-paragraph-margin); } + +button:hover { cursor: pointer; } +details:focus { outline-offset: 0.2em; } + +figure { + margin-bottom: var(--sz-paragraph-margin); + display: grid; + place-content: center; + justify-items: center; +} + +figcaption { + text-align: center; + font-size: 0.9em; + margin-top: 0.2em; +} + +code { + font-family: var(--ff-monospace), ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace; + word-break: break-word; +} + +:not(pre) > code { padding: 0.125em 0.25em; } +:not(pre) > code, +pre { background-color: var(--clr-code-bg); } + +pre { + border: 0.1em solid var(--clr-code-border); + max-width: 90vw; + overflow: auto; + padding: 1rem; +} + +pre > code { white-space: pre; } + +summary { cursor: pointer; } + +dl { + display: grid; + gap: 1em; + grid-template-columns: auto auto; +} + +dt { font-weight: 700; } +dd {grid-column-start: 2; } \ No newline at end of file diff --git a/assets/css/global.css b/assets/css/global.css new file mode 100644 index 00000000..395ba97e --- /dev/null +++ b/assets/css/global.css @@ -0,0 +1,107 @@ +/* ------------------- */ +/* Custom Properties */ +/* ------------------- */ +:root { + --clr-body-bg: #08031A; + --clr-body-txt: #fceaff; + --clr-content-bg: #3d2163; + + --clr-top-btn-bg: #FFD05A; + --clr-top-btn-txt: #08031A; + + --clr-main-heading: #ED64F5; + --clr-sub-heading: #e8b86f; + --clr-title-border: #d3aad5; + --clr-bold-txt: #ff9933; + --clr-link: #ED64F5; + --clr-link-hover: #c355c9; + --clr-quote-bg: #13092D; + --clr-quote-border: #999999; + --clr-cw-hover: rgb(58, 0, 0); + + --clr-code-bg: #241445; + --clr-code-border: #82668f; + --clr-dates: rgb(121, 184, 255); + + --clr-link-btn-bg: #873eb5; + --clr-link-btn-txt: white; + --clr-link-btn-hover: #241445; + + --clr-hero-bg: black; + --clr-navbar-bg: #222; + --clr-navbar-link: white; + --clr-main-footer-bg: #13092D; + + --clr-mod-entry-bg: #241445; + + --ff-default: 'Lexend'; + --ff-monospace: 'Inter One Mono'; + + --fs-main: 1.2rem; + --fs-h1: clamp(2rem, 1rem + 5vw, 3rem); + --fs-h2: clamp(1.55rem, 1rem + 3vw, 2.15rem); + --fs-h3: clamp(1.55rem, 1rem + 3vw, 1.8rem); + --fs-h4: clamp(1.4rem, 1rem + 3vw, 1.6rem); + + --sz-paragraph-margin: 1.15em; + --sz-main-padding: clamp(1rem, 5%, 4rem); + --sz-navbar-ht: 4rem; + --sz-external-link: 1.25em; + --sz-content-list-gap: 0.7em; +} + +/* ------------------- */ +/* CSS Reset */ +/* ------------------- */ + +/* Box sizing rules */ +*, +*::before, +*::after { box-sizing: border-box; } + +/* Prevent font size inflation */ +html { + -moz-text-size-adjust: none; + -webkit-text-size-adjust: none; + text-size-adjust: none; +} + +/* Remove default margin in favour of better control in authored CSS */ +body, h1, h2, h3, h4, p, +figure, blockquote, dl, dd { margin: 0; } + +/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */ +ul[role='list'], +ol[role='list'] { list-style-type: ""; } + +/* Set core body defaults */ +body { + min-height: 100vh; + line-height: 1.5; +} + +/* Set shorter line heights on headings and interactive elements */ +h1, h2, h3, h4, +button, input, label { line-height: 1.1; } + +/* Balance text wrapping on headings */ +h1, h2, h3, h4 { text-wrap: balance; } + +/* A elements that don't have a class get default styles */ +a:not([class]) { text-decoration-skip-ink: auto; } + +/* Make images easier to work with */ +img, +picture { + max-width: 100%; + display: block; +} + +/* Inherit fonts for inputs and buttons */ +input, button, textarea, select { font: inherit; } + +/* Make sure textareas without a rows attribute are not tiny */ +textarea:not([rows]) { min-height: 10em; } + +/* Anything that has been anchored to should have extra scroll margin */ +:target { scroll-margin-block: 5ex; } \ No newline at end of file diff --git a/assets/css/misc.css b/assets/css/misc.css new file mode 100644 index 00000000..89ff480c --- /dev/null +++ b/assets/css/misc.css @@ -0,0 +1,159 @@ +/* ------------------- */ +/* Custom Properties */ +/* ------------------- */ +:root { + --clr-body-bg: #08031A; + --clr-body-txt: #fceaff; + --clr-h1: #BA6FE8; + --clr-link-btn-bg: #7A37A3; + --clr-link-btn-hover: #BA6FE8; + + --ff-default: 'Lexend'; + + --fs-h1: clamp(2rem, 1.5rem + 5vw, 3.5rem); + --fs-p: 1.25rem; + --fs-link-btn: clamp(1.55rem, 1rem + 3vw, 2.15rem); + + --fw-reg: 400; + --fw-link-btn: 600; +} + +/* ------------------- */ +/* CSS Reset */ +/* ------------------- */ + +/* Box sizing rules */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +/* Prevent font size inflation */ +html { + -moz-text-size-adjust: none; + -webkit-text-size-adjust: none; + text-size-adjust: none; +} + +/* Remove default margin in favour of better control in authored CSS */ +body, h1, h2, h3, h4, p, +figure, blockquote, dl, dd { + margin: 0; +} + +/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */ +ul[role='list'], +ol[role='list'] { + list-style-type: ""; +} + +/* Set core body defaults */ +body { + min-height: 100vh; + line-height: 1.5; +} + +/* Set shorter line heights on headings and interactive elements */ +h1, h2, h3, h4, +button, input, label { + line-height: 1.1; +} + +/* Balance text wrapping on headings */ +h1, h2, +h3, h4 { + text-wrap: balance; +} + +/* A elements that don't have a class get default styles */ +a:not([class]) { + text-decoration-skip-ink: auto; + color: currentColor; +} + +/* Make images easier to work with */ +img, +picture { + max-width: 100%; + display: block; +} + +/* Inherit fonts for inputs and buttons */ +input, button, +textarea, select { + font: inherit; +} + +/* Make sure textareas without a rows attribute are not tiny */ +textarea:not([rows]) { + min-height: 10em; +} + +/* Anything that has been anchored to should have extra scroll margin */ +:target { + scroll-margin-block: 5ex; +} + +/* ------------------- */ +/* STYLING BEGINS */ +/* ------------------- */ + +body { + font-size: var(--clr-body-bg); + font-family: var(--ff-default), system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + color: var(--clr-body-txt); + background: var(--clr-body-bg); + text-align: center; +} + +body, main { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} + +main { max-width: 90%; } + +h1 { + font-size: var(--fs-h1); + color: var(--clr-h1); + font-weight: var(--fw-reg); + letter-spacing: 0.08em; + margin: 2rem 0; + line-height: 1; +} + +p { font-size: var(--fs-p); } + +.index__btn-wrapper { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin: 1.5rem 0; +} + +.index__link { + text-decoration: none; + font-size: var(--fs-link-btn); + font-weight: var(--fw-link-btn); + border: none; + border-radius: 0.4em; + padding: 0.4em 0.75em; + margin: 0.5rem; + background: var(--clr-link-btn-bg); + color: var(--clr-body-txt); + text-transform: uppercase; +} + +.index__link:hover { + cursor: pointer; + background: var(--clr-link-btn-hover); + transition: 0.2s; +} + +.index__link:focus { + outline: 0.1em solid var(--clr-body-txt); + outline-offset: -0.15em; +} \ No newline at end of file diff --git a/assets/css/plugins.css b/assets/css/plugins.css new file mode 100644 index 00000000..6c80b835 --- /dev/null +++ b/assets/css/plugins.css @@ -0,0 +1,48 @@ +/* HEADING WRAPPER AND ANCHOR */ +.heading-wrapper { + display: flex; + gap: 0.3em; + align-items: baseline; +} + +* + .heading-wrapper { margin-top: 1.8em; } + +.heading-anchor { + order: -1; + text-underline-offset: 0.1em; +} + +.heading-anchor:focus { + outline: 0.13em solid currentColor; + outline-offset: 0.05em; +} + +.heading-anchor [hidden] { display: block; } + +/* BLOCKQUOTES With CITATIONS */ +.c-blockquote__attribution { text-align: left; } + +.c-blockquote__attribution::before { + content: "—"; + margin-right: 0.3em; +} + +/* FOOTNOTES */ +.footnote-ref { margin-left: 0.2em; } +.footnote-ref a:target { scroll-margin-block: calc(var(--sz-navbar-ht) + 5ex); } + +.footnotes { + margin-top: 3em; + border-top: 0.15em solid var(--clr-title-border); + padding-top: 1em; +} + +.footnotes-list { + display: grid; + gap: 0.3em; +} + +.footnotes-list :target { + background-color: var(--clr-quote-bg); + outline: 0.1em dashed var(--clr-title-border); +} diff --git a/assets/css/pridesymbols.css b/assets/css/pridesymbols.css new file mode 100644 index 00000000..0ca2bf04 --- /dev/null +++ b/assets/css/pridesymbols.css @@ -0,0 +1,207 @@ +/* Pride flag backgrounds */ +.flag-rainbow { + background: linear-gradient( + #e40303 0 16.67%, + #ff8c00 0 33.33%, + #ffed00 0 50%, + #008026 0 66.67%, + #004dff 0 83.33%, + #750787 0 100% + ); +} + +.flag-lesbian { + background: linear-gradient( + #d52d00 0 14.29%, + #ef7627 0 28.57%, + #ff9a56 0 42.86%, + #ffffff 0 57.14%, + #d362a4 0 71.43%, + #b85490 0 86.71%, + #a30262 0 100% + ); +} + +.flag-bi { + background: linear-gradient( + #d60270 0 40%, + #9b4f97 0 60%, + #0038a7 0 100% + ); +} + +.flag-trans { + background: linear-gradient( + #5bcefa 0 20%, + #f5a9b8 0 40%, + #ffffff 0 60%, + #f5a9b8 0 80%, + #5bcefa 0 100% + ); +} + +.flag-intersex { + background: radial-gradient(closest-side circle at center, + #ffd800 44%, + #7902aa 44%, + #7902aa 56%, + #ffd800 56% + ); +} + +.flag-ace { + background: linear-gradient( + #000000 0 25%, + #a3a3a3 0 50%, + #ffffff 0 75%, + #800080 0 100% + ); +} + +.flag-aro { + background: linear-gradient( + #0a2 20%, + #7d6 0 40%, + white 0 60%, + darkgray 0 80%, + black 0 + ); +} + +.flag-non-binary { + background: linear-gradient( + #fff430 0 25%, + #ffffff 0 50%, + #9c59d1 0 75%, + #000000 0 100% + ); +} + +.flag-pan { + background: linear-gradient( + #ff218c 0 33.33%, + #ffd800 0 66.67%, + #21b1ff 0 100% + ); +} + +.flag-genderfluid { + background: linear-gradient( + #ff76a4 0 20%, + #ffffff 0 40%, + #c011d7 0 60%, + #000000 0 80%, + #2f3cbe 0 100% + ); +} + +.flag-agender { + background: linear-gradient( + black 0 14.28%, + silver 0 28.57%, + white 0 42.85%, + #a3fa73 0 57.14%, + white 0 71.42%, + silver 0 85.71%, + black 0 + ); +} + +.flag-demigirl { + background: linear-gradient( + #7F7F7F 0 14.28%, + #C4C4C4 0 28.57%, + #FDADC8 0 42.85%, + white 0 57.14%, + #FDADC8 0 71.42%, + #C4C4C4 0 85.71%, + #7F7F7F 0 + ); +} + +.flag-bigender { + background: linear-gradient( + #d074a2 0 14.28%, + #f8a1cd 0 28.57%, + #d9c6ea 0 42.85%, + white 0 57.14%, + #d9c6ea 0 71.42%, + #90c8ec 0 85.71%, + #6583d5 0 + ); +} + +.flag-gilbert-baker { + background: linear-gradient( + #FF6599 12.5%, + #e40303 0 25%, + #ff8c00 0 37.5%, + #ffed00 0 50%, + #008026 0 62.5%, + #00C0C0 0 75%, + #004dff 0 87.5%, + #750787 0 + ); +} + +.flag-gilbert-baker-2017 { + background: linear-gradient( + #CD66FF 11.1%, + #FF6599 0 22.2%, + #e40303 0 33.3%, + #ff8c00 0 44.4%, + #ffed00 0 55.5%, + #008026 0 66.6%, + #00C0C0 0 77.7%, + #004dff 0 88.8%, + #750787 0 + ); +} + +.flag-progress { + background: + conic-gradient(at 14% 50%, #0000 221.25deg, #ffffff 222deg 318deg, #0000 318.25deg), + conic-gradient(at 23% 50%, #0000 221.25deg, #f5a9b8 222deg 318deg, #0000 318.25deg), + conic-gradient(at 32% 50%, #0000 221.25deg, #5bcefa 222deg 318deg, #0000 318.25deg), + conic-gradient(at 41% 50%, #0000 221.25deg, #784F17 222deg 318deg, #0000 318.25deg), + conic-gradient(at 50% 50%, #0000 221.25deg, black 222deg 318deg, #0000 318.25deg), + linear-gradient(#e40303 0 16.66%, #ff8c00 0 33.33%, #ffed00 0 50%, #008026 0 66.66%, #004dff 0 83.33%, #750787 0); +} + +.flag-progress-intersex { + background: + radial-gradient(circle at 9.75% 50%, #0000 6.66%, #7902aa 6.7% 8.33%, #0000 8.4%), + conic-gradient(at 26.66% 50%, #0000 222.75deg, #ffd800 0 317.25deg, #0000 0), + conic-gradient(at 33% 50%, #0000 222.75deg, #ffffff 0 317.25deg, #0000 0), + conic-gradient(at 39% 50%, #0000 222.75deg, #f5a9b8 0 317.25deg, #0000 0), + conic-gradient(at 45.66% 50%, #0000 222.75deg, #5bcefa 0 317.25deg, #0000 0), + conic-gradient(at 52% 50%, #0000 222.75deg, #753000 0 317.25deg, #0000 0), + conic-gradient(at 58.33% 50%, #0000 222.75deg, #000 0 317.25deg, #0000 0), + linear-gradient(#e40303 0 16.66%, #ff8c00 0 33.33%, #ffed00 0 50%, #008026 0 66.66%, #004dff 0 83.33%, #750787 0); +} + +.flag-progress-intersex-lesbian { + background: + radial-gradient(circle at 9.75% 50%, #0000 6.66%, #7902aa 6.7% 8.33%, #0000 8.4%), + conic-gradient(at 26.66% 50%, #0000 222.75deg, #ffd800 0 317.25deg, #0000 0), + conic-gradient(at 33% 50%, #0000 222.75deg, #ffffff 0 317.25deg, #0000 0), + conic-gradient(at 39% 50%, #0000 222.75deg, #f5a9b8 0 317.25deg, #0000 0), + conic-gradient(at 45.66% 50%, #0000 222.75deg, #5bcefa 0 317.25deg, #0000 0), + conic-gradient(at 52% 50%, #0000 222.75deg, #753000 0 317.25deg, #0000 0), + conic-gradient(at 58.33% 50%, #0000 222.75deg, #000 0 317.25deg, #0000 0), + linear-gradient(#d52d00 0 14.29%, #ef7627 0 28.57%, #ff9a56 0 42.86%, #ffffff 0 57.14%, #d362a4 0 71.43%, #b85490 0 86.71%, #a30262 0 100%); +} + +.symbol-venus { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='12pt' height='12pt' viewBox='0 0 12 12' version='1.1'%3E%3Cg id='surface1'%3E%3Cpath style='fill:none;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(35.15%25,0%25,64.85%25);stroke-opacity:1;stroke-miterlimit:10;' d='M 85 85 C 85 98.789062 73.789062 110 60 110 C 46.210938 110 35 98.789062 35 85 C 35 71.210938 46.210938 60 60 60 C 73.789062 60 85 71.210938 85 85 Z M 85 85 ' transform='matrix(0.1,0,0,-0.1,0,12)'/%3E%3Cpath style='fill:none;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(35.15%25,0%25,64.85%25);stroke-opacity:1;stroke-miterlimit:10;' d='M 60 10 L 60 60 ' transform='matrix(0.1,0,0,-0.1,0,12)'/%3E%3Cpath style='fill:none;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(35.15%25,0%25,64.85%25);stroke-opacity:1;stroke-miterlimit:10;' d='M 35 35 L 85 35 ' transform='matrix(0.1,0,0,-0.1,0,12)'/%3E%3C/g%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-size: 100% 100%; +} + +.flag-disability { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xml:space='preserve' width='651.83' height='300' viewBox='-90.33 0 651.83 300'%3E%3Cpath fill='%233BB07D' stroke='%233BB07D' stroke-miterlimit='10' stroke-width='.351' d='M561.5 300 162.902.664h-50.634L510.867 300z'/%3E%3Cpath fill='%237BC2E0' stroke='%237BC2E0' stroke-miterlimit='10' stroke-width='.351' d='M510.711 300 112.113.664H61.478L460.078 300z'/%3E%3Cpath fill='%23E8E8E8' stroke='%23E8E8E8' stroke-miterlimit='10' stroke-width='.351' d='M460.077 300 61.478.664H8.094L406.693 300z'/%3E%3Cpath fill='%23EEDE77' stroke='%23EEDE77' stroke-miterlimit='10' stroke-width='.351' d='M406.692 300 8.095.664h-49.111L357.584 300z'/%3E%3Cpath fill='%23CF7280' stroke='%23CF7280' stroke-miterlimit='10' stroke-width='.351' d='M357.378 300-41.22.664h-49.11L308.27 300z'/%3E%3C/svg%3E"); + background-color: #595959; + background-repeat: no-repeat; + background-size: auto 100%; + background-position: center; +} \ No newline at end of file diff --git a/assets/css/starwarskotor.css b/assets/css/starwarskotor.css new file mode 100644 index 00000000..93e74599 --- /dev/null +++ b/assets/css/starwarskotor.css @@ -0,0 +1,32 @@ +:root { + --clr-body-bg: #212121; + --img-body-bg: none; + --clr-body-txt: #fceaff; + --clr-content-bg: #000000; + + --clr-top-btn-bg: #FFD05A; + --clr-top-btn-txt: #000000; + + --clr-main-heading: #ffae00; + --clr-sub-heading: #ffae00; + --clr-title-border: #ffe387; + --clr-bold-txt: #ff9933; + --clr-link: #bb9671; + --clr-link-hover: #94575a; + --clr-quote-bg: #2f2d2d; + --clr-quote-border: #4d4385; + + --clr-code-bg: #241445; + --clr-code-border: #e4dbbe; + --clr-dates: rgb(158, 203, 255); + + --clr-link-btn-bg: #873eb5; + --clr-link-btn-txt: white; + --clr-link-btn-hover: #241445; + + --clr-hero-bg: black; + --clr-navbar-bg: #171717; + --clr-navbar-link: white; + + --clr-main-footer-bg: #171717; +} \ No newline at end of file diff --git a/assets/css/tooltips.css b/assets/css/tooltips.css new file mode 100644 index 00000000..334310f2 --- /dev/null +++ b/assets/css/tooltips.css @@ -0,0 +1,49 @@ +/* ARIA Tooltips by Scott O'Hara: https://github.com/scottaohara/a11y_tooltips */ + +[data-tooltip] { + display: inline-block; + position: relative; +} + +[data-tooltip-block] { display: block; } + +.tooltip { + font-size: .825rem; + left: 0; + min-width: 20ch; + max-width: 44ch; + pointer-events: none; + position: absolute; + top: 100%; + z-index: 2; +} + +.push-up .tooltip { + bottom: 100%; + top: auto; +} + +.push-right .tooltip { + left: auto; + right: 0; +} + +.tooltip__content { + background-color: var(--clr-quote-bg); + border: 0.15em solid var(--clr-main-heading); + display: inline-block; + opacity: 0; + padding: .625em; + visibility: hidden; +} + +.tooltip__content > * { margin: .5em 0; } +.tooltip__content :last-child { margin-bottom: 0; } +.tooltip__content :first-child { margin-top: 0; } + +.tooltip--show .tooltip__content { + opacity: 1; + pointer-events: auto; + transition: opacity .1s ease-in; + visibility: visible; +} diff --git a/assets/css/utility.css b/assets/css/utility.css new file mode 100644 index 00000000..b7e30055 --- /dev/null +++ b/assets/css/utility.css @@ -0,0 +1,48 @@ +/* UTILITY CLASSES */ +.bold-text { font-weight: 700; } +.center-text { text-align: center; } +.inline-img { display: inline-block; } + +.center-el { + display: grid; + place-content: center; +} + +.indent-text { + padding: 1em 0 1em 2em; + display: grid; + gap: 1em; +} + +.date-style { + font-weight: 700; + color: var(--clr-dates); +} + +.inline-icon { + vertical-align: -10%; + height: 1em; + fill: currentColor; +} + +.inline-list { + display: flex; + flex-wrap: wrap; + gap: 0.7em 1.5em; +} + +.hidden { display: none; } + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border: 0; + outline: 0; + outline-offset: 0; +} \ No newline at end of file diff --git a/assets/favicon/android-chrome-192x192.png b/assets/favicon/android-chrome-192x192.png new file mode 100644 index 00000000..65096d8a Binary files /dev/null and b/assets/favicon/android-chrome-192x192.png differ diff --git a/assets/favicon/android-chrome-512x512.png b/assets/favicon/android-chrome-512x512.png new file mode 100644 index 00000000..a36d4d55 Binary files /dev/null and b/assets/favicon/android-chrome-512x512.png differ diff --git a/assets/favicon/apple-touch-icon.png b/assets/favicon/apple-touch-icon.png new file mode 100644 index 00000000..81ef2aee Binary files /dev/null and b/assets/favicon/apple-touch-icon.png differ diff --git a/assets/favicon/favicon-16x16.png b/assets/favicon/favicon-16x16.png new file mode 100644 index 00000000..8f3d69c8 Binary files /dev/null and b/assets/favicon/favicon-16x16.png differ diff --git a/assets/favicon/favicon-32x32.png b/assets/favicon/favicon-32x32.png new file mode 100644 index 00000000..196961ba Binary files /dev/null and b/assets/favicon/favicon-32x32.png differ diff --git a/assets/favicon/favicon.ico b/assets/favicon/favicon.ico new file mode 100644 index 00000000..425bbd1c Binary files /dev/null and b/assets/favicon/favicon.ico differ diff --git a/assets/favicon/site.webmanifest b/assets/favicon/site.webmanifest new file mode 100644 index 00000000..c431917a --- /dev/null +++ b/assets/favicon/site.webmanifest @@ -0,0 +1,20 @@ +{ + "name": "Leilukin's Hub", + "short_name": "Leilukin's Hub", + "icons": + [ + { + "src": "/assets/favicon/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/assets/favicon/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#7A37A3", + "background_color": "#000000", + "display": "standalone" +} \ No newline at end of file diff --git a/assets/fonts/intel-one-mono/IntelOneMono-Bold.woff2 b/assets/fonts/intel-one-mono/IntelOneMono-Bold.woff2 new file mode 100644 index 00000000..ad52b0cb Binary files /dev/null and b/assets/fonts/intel-one-mono/IntelOneMono-Bold.woff2 differ diff --git a/assets/fonts/intel-one-mono/IntelOneMono-BoldItalic.woff2 b/assets/fonts/intel-one-mono/IntelOneMono-BoldItalic.woff2 new file mode 100644 index 00000000..2615c524 Binary files /dev/null and b/assets/fonts/intel-one-mono/IntelOneMono-BoldItalic.woff2 differ diff --git a/assets/fonts/intel-one-mono/IntelOneMono-Italic.woff2 b/assets/fonts/intel-one-mono/IntelOneMono-Italic.woff2 new file mode 100644 index 00000000..13ae19c1 Binary files /dev/null and b/assets/fonts/intel-one-mono/IntelOneMono-Italic.woff2 differ diff --git a/assets/fonts/intel-one-mono/IntelOneMono-Medium.woff2 b/assets/fonts/intel-one-mono/IntelOneMono-Medium.woff2 new file mode 100644 index 00000000..745887a2 Binary files /dev/null and b/assets/fonts/intel-one-mono/IntelOneMono-Medium.woff2 differ diff --git a/assets/fonts/intel-one-mono/IntelOneMono-MediumItalic.woff2 b/assets/fonts/intel-one-mono/IntelOneMono-MediumItalic.woff2 new file mode 100644 index 00000000..ad65b31b Binary files /dev/null and b/assets/fonts/intel-one-mono/IntelOneMono-MediumItalic.woff2 differ diff --git a/assets/fonts/intel-one-mono/IntelOneMono-Regular.woff2 b/assets/fonts/intel-one-mono/IntelOneMono-Regular.woff2 new file mode 100644 index 00000000..dd0187ec Binary files /dev/null and b/assets/fonts/intel-one-mono/IntelOneMono-Regular.woff2 differ diff --git a/assets/fonts/intel-one-mono/intel-one-mono.css b/assets/fonts/intel-one-mono/intel-one-mono.css new file mode 100644 index 00000000..7013ec21 --- /dev/null +++ b/assets/fonts/intel-one-mono/intel-one-mono.css @@ -0,0 +1,47 @@ +@font-face { + font-display: swap; + font-family: 'Intel One Mono'; + font-style: normal; + font-weight: 400; + src: url('/assets/fonts/intel-one-mono/IntelOneMono-Regular.woff2') format('woff2'); +} + +@font-face { + font-display: swap; + font-family: 'Intel One Mono'; + font-style: italic; + font-weight: 400; + src: url('/assets/fonts/intel-one-mono/IntelOneMono-Italic.woff2') format('woff2'); +} + +@font-face { + font-display: swap; + font-family: 'Intel One Mono'; + font-style: normal; + font-weight: 600; + src: url('/assets/fonts/intel-one-mono/IntelOneMono-Medium.woff2') format('woff2'); +} + +@font-face { + font-display: swap; + font-family: 'Intel One Mono'; + font-style: italic; + font-weight: 600; + src: url('/assets/fonts/intel-one-mono/IntelOneMono-MediumItalic.woff2') format('woff2'); +} + +@font-face { + font-display: swap; + font-family: 'Intel One Mono'; + font-style: normal; + font-weight: 700; + src: url('/assets/fonts/intel-one-mono/IntelOneMono-Bold.woff2') format('woff2'); +} + +@font-face { + font-display: swap; + font-family: 'Intel One Mono'; + font-style: italic; + font-weight: 700; + src: url('/assets/fonts/intel-one-mono/IntelOneMono-BoldItalic.woff2') format('woff2'); +} diff --git a/assets/fonts/lexend/lexend-v19-latin-600.woff2 b/assets/fonts/lexend/lexend-v19-latin-600.woff2 new file mode 100644 index 00000000..17519ab6 Binary files /dev/null and b/assets/fonts/lexend/lexend-v19-latin-600.woff2 differ diff --git a/assets/fonts/lexend/lexend-v19-latin-700.woff2 b/assets/fonts/lexend/lexend-v19-latin-700.woff2 new file mode 100644 index 00000000..1703656f Binary files /dev/null and b/assets/fonts/lexend/lexend-v19-latin-700.woff2 differ diff --git a/assets/fonts/lexend/lexend-v19-latin-900.woff2 b/assets/fonts/lexend/lexend-v19-latin-900.woff2 new file mode 100644 index 00000000..abea4a5b Binary files /dev/null and b/assets/fonts/lexend/lexend-v19-latin-900.woff2 differ diff --git a/assets/fonts/lexend/lexend-v19-latin-regular.woff2 b/assets/fonts/lexend/lexend-v19-latin-regular.woff2 new file mode 100644 index 00000000..debbd371 Binary files /dev/null and b/assets/fonts/lexend/lexend-v19-latin-regular.woff2 differ diff --git a/assets/images/articles/lgbtq-booklet-interview-misi-bawang/Bawang-Booklet-Interview-Leilukin-1.avif b/assets/images/articles/lgbtq-booklet-interview-misi-bawang/Bawang-Booklet-Interview-Leilukin-1.avif new file mode 100644 index 00000000..c02902dc Binary files /dev/null and b/assets/images/articles/lgbtq-booklet-interview-misi-bawang/Bawang-Booklet-Interview-Leilukin-1.avif differ diff --git a/assets/images/articles/lgbtq-booklet-interview-misi-bawang/Bawang-Booklet-Interview-Leilukin-2.avif b/assets/images/articles/lgbtq-booklet-interview-misi-bawang/Bawang-Booklet-Interview-Leilukin-2.avif new file mode 100644 index 00000000..d76f0d7c Binary files /dev/null and b/assets/images/articles/lgbtq-booklet-interview-misi-bawang/Bawang-Booklet-Interview-Leilukin-2.avif differ diff --git a/assets/images/articles/lgbtq-booklet-interview-misi-bawang/Bawang-Booklet-Interview-Leilukin-3.avif b/assets/images/articles/lgbtq-booklet-interview-misi-bawang/Bawang-Booklet-Interview-Leilukin-3.avif new file mode 100644 index 00000000..f2469de4 Binary files /dev/null and b/assets/images/articles/lgbtq-booklet-interview-misi-bawang/Bawang-Booklet-Interview-Leilukin-3.avif differ diff --git a/assets/images/posts/a-summers-end-review/My-review-for-A-Summer-s-End-on-Steam.avif b/assets/images/posts/a-summers-end-review/My-review-for-A-Summer-s-End-on-Steam.avif new file mode 100644 index 00000000..a68232d6 Binary files /dev/null and b/assets/images/posts/a-summers-end-review/My-review-for-A-Summer-s-End-on-Steam.avif differ diff --git a/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/1-year-cassette-beasts-anniversary-mastodon-boost.avif b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/1-year-cassette-beasts-anniversary-mastodon-boost.avif new file mode 100644 index 00000000..af2957f0 Binary files /dev/null and b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/1-year-cassette-beasts-anniversary-mastodon-boost.avif differ diff --git a/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/1-year-cassette-beasts-anniversary-twitter-reply.avif b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/1-year-cassette-beasts-anniversary-twitter-reply.avif new file mode 100644 index 00000000..74d6ad13 Binary files /dev/null and b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/1-year-cassette-beasts-anniversary-twitter-reply.avif differ diff --git a/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/1-year-cassette-beasts-anniversary-twitter-repost.avif b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/1-year-cassette-beasts-anniversary-twitter-repost.avif new file mode 100644 index 00000000..500f5c58 Binary files /dev/null and b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/1-year-cassette-beasts-anniversary-twitter-repost.avif differ diff --git a/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/leilukin-s-hub-cassette-beasts-anniversary.avif b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/leilukin-s-hub-cassette-beasts-anniversary.avif new file mode 100644 index 00000000..f01d0be7 Binary files /dev/null and b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/leilukin-s-hub-cassette-beasts-anniversary.avif differ diff --git a/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/leilukin-s-hub-lesbian-visibility-day.avif b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/leilukin-s-hub-lesbian-visibility-day.avif new file mode 100644 index 00000000..6ce4531e Binary files /dev/null and b/assets/images/posts/lesbian-visibility-day-cassette-beasts-anni/leilukin-s-hub-lesbian-visibility-day.avif differ diff --git a/assets/images/posts/nexusmods-lifetime-premium/Screenshot-2024-03-06-at-20-49-26-Nexus-Mods-Home.avif b/assets/images/posts/nexusmods-lifetime-premium/Screenshot-2024-03-06-at-20-49-26-Nexus-Mods-Home.avif new file mode 100644 index 00000000..c3b4a3b2 Binary files /dev/null and b/assets/images/posts/nexusmods-lifetime-premium/Screenshot-2024-03-06-at-20-49-26-Nexus-Mods-Home.avif differ diff --git a/assets/images/posts/nexusmods-lifetime-premium/Screenshot-2024-03-06-at-20-52-27-Nexus-Mods-Users.avif b/assets/images/posts/nexusmods-lifetime-premium/Screenshot-2024-03-06-at-20-52-27-Nexus-Mods-Users.avif new file mode 100644 index 00000000..dd19604e Binary files /dev/null and b/assets/images/posts/nexusmods-lifetime-premium/Screenshot-2024-03-06-at-20-52-27-Nexus-Mods-Users.avif differ diff --git a/assets/images/posts/nexusmods-lifetime-premium/thunderbird-2024-03-06-20-45-36-381.avif b/assets/images/posts/nexusmods-lifetime-premium/thunderbird-2024-03-06-20-45-36-381.avif new file mode 100644 index 00000000..f9746c69 Binary files /dev/null and b/assets/images/posts/nexusmods-lifetime-premium/thunderbird-2024-03-06-20-45-36-381.avif differ diff --git a/assets/images/posts/pombomb-plushie/2023-10-11-14-25-27.avif b/assets/images/posts/pombomb-plushie/2023-10-11-14-25-27.avif new file mode 100644 index 00000000..9400605c Binary files /dev/null and b/assets/images/posts/pombomb-plushie/2023-10-11-14-25-27.avif differ diff --git a/assets/images/posts/pombomb-plushie/2023-10-11-14-28-36.avif b/assets/images/posts/pombomb-plushie/2023-10-11-14-28-36.avif new file mode 100644 index 00000000..bd4babef Binary files /dev/null and b/assets/images/posts/pombomb-plushie/2023-10-11-14-28-36.avif differ diff --git a/assets/images/posts/pombomb-plushie/2023-10-11-14-29-09.avif b/assets/images/posts/pombomb-plushie/2023-10-11-14-29-09.avif new file mode 100644 index 00000000..a65c1fac Binary files /dev/null and b/assets/images/posts/pombomb-plushie/2023-10-11-14-29-09.avif differ diff --git a/assets/images/posts/pombomb-plushie/2023-10-11-14-30-36.avif b/assets/images/posts/pombomb-plushie/2023-10-11-14-30-36.avif new file mode 100644 index 00000000..01b71803 Binary files /dev/null and b/assets/images/posts/pombomb-plushie/2023-10-11-14-30-36.avif differ diff --git a/assets/images/posts/pombomb-plushie/Bytten-Studio-on-my-Pombomb-plushie.avif b/assets/images/posts/pombomb-plushie/Bytten-Studio-on-my-Pombomb-plushie.avif new file mode 100644 index 00000000..b02b0249 Binary files /dev/null and b/assets/images/posts/pombomb-plushie/Bytten-Studio-on-my-Pombomb-plushie.avif differ diff --git a/assets/js/3FtQ7AG7yZ.js b/assets/js/3FtQ7AG7yZ.js new file mode 100644 index 00000000..fee71ee6 --- /dev/null +++ b/assets/js/3FtQ7AG7yZ.js @@ -0,0 +1,160 @@ +const statusCafeContent = document.getElementById("statuscafe-content"); + statusCafeContent.innerHTML = ` +

Fetching data from status.cafe...

+ `; + + const fetchStatusCafe = async () => { + try { + const res = await fetch('https://status.cafe/users/leilukin/status.json'); + const data = await res.json(); + + if (!data.content.length) { + document.getElementById("statuscafe-content").innerHTML = "No status yet." + return; + } + + document.getElementById("statuscafe-userinfo").innerHTML = data.face + ' ' + data.timeAgo; + statusCafeContent.innerHTML = data.content; + } catch (error) { + console.error(error); + document.getElementById("statuscafe-content").textContent = `[ERROR] ${error}`; + } + }; + fetchStatusCafe(); +const hero = document.querySelector(".hero"); + const heroTopBarEl = document.querySelector(".hero__top-bar"); + const headerImgEl = document.querySelector(".hero__img"); + + + const todayEvent = getTodayEvent(); + + if (todayEvent) { + heroTopBarEl.classList.remove('hidden'); + heroTopBarEl.innerHTML = todayEvent.blurb; + + if (todayEvent.class) { + headerImgEl.classList.add(todayEvent.class); + } + } + + function getTodayEvent() { + const date = new Date(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const year = date.getFullYear(); + const weekOfMonth = Math.ceil(day / 7); + + const leilukinsHubLaunchDate = new Date("2022-09-11").getFullYear(); + const siteAnniversary = year - leilukinsHubLaunchDate; + + if (month === 3 && day === 1) + return { + blurb: `Today is Zero Discrimination Day`, + class: "flag-progress-intersex", + }; + else if (month === 3 && day === 8) + return { + blurb: `Today is International Women's Day}`, + class: "symbol-venus", + }; + else if (month === 3 && day === 31) + return { + blurb: `Today is Trans Day of Visibility`, + class: "flag-trans", + }; + else if (month === 4 && day === 6) + return { + blurb: `Today is International Asexuality Day`, + class: "flag-ace", + }; + else if (month === 4 && day === 26) + return { + blurb: `Today is Lesbian Visibility Day`, + class: "flag-lesbian", + }; + else if (month === 4 && weekOfMonth === 4) + return { + blurb: `This week is Lesbian Visibility Week`, + class: "flag-lesbian", + }; + else if (month === 5 && day === 17) + return { + blurb: `Today is International Day Against Homophobia, Biphobia and Transphobia`, + class: "flag-progress", + }; + else if (month === 5 && day === 19) + return { + blurb: `Today is Agender Pride Day`, + class: "flag-agender", + }; + else if (month === 5 && day === 25) + return { + blurb: `Today is Pansexual and Panromantic Awareness and Visibility Day`, + class: "flag-pan", + }; + else if (month === 6) + return { + blurb: `Happy Pride Month!`, + class: "flag-progress-intersex", + }; + else if (month === 7 && day === 14) + return { + blurb: `Today is Non-Binary People's Day`, + class: "flag-non-binary", + }; + else if (month === 7 && day === 28) + return { + blurb: `Today is Leilukin's Birthday` + }; + else if (month === 7) + return{ + blurb: `Happy Disability Pride Month!`, + class: "flag-disability" + } + else if (month === 8 && day === 25) + return { + blurb: `Today is Aromantic Spectrum Visibility Day`, + class: "flag-aro", + }; + else if (month === 9 && day === 11) + return { + blurb: `Today is the ${siteAnniversary}-year anniversary of the launch of Leilukin's Hub` + }; + else if (month === 9 && day === 23) + return { + blurb: `Today is Bi Visibility Day`, + class: "flag-bi", + }; + else if (month === 10 && day === 8) + return { + blurb: `Today is International Lesbian Day`, + class: "flag-lesbian", + }; + else if (month === 10 && day === 11) + return { + blurb: `Today is National Coming Out Day`, + class: "flag-rainbow", + }; + else if (month === 10 && day === 17) + return { + blurb: `Today is the start of Genderfluid Visibility Week`, + class: "flag-genderfluid", + }; + else if (month === 10 && day === 24) + return { + blurb: `Today is the start of Ace Week`, + class: "flag-ace", + }; + else if (month === 10 && day === 26) + return { + blurb: `Today is Intersex Awareness Day`, + class: "flag-intersex", + }; + else if (month === 11 && day === 13) + return { + blurb: `Today is the start of Transgender Awareness Week`, + class: "flag-trans", + }; + else + return null; + } \ No newline at end of file diff --git a/assets/js/62Mp3lT1M6.js b/assets/js/62Mp3lT1M6.js new file mode 100644 index 00000000..a9b93fea --- /dev/null +++ b/assets/js/62Mp3lT1M6.js @@ -0,0 +1,1297 @@ +/** + * Author: Vera Konigin + * Site: https://groundedwren.neocities.org + * Contact: vera@groundedwren.com + * + * File Description: A web component to site SVG icons easily +*/ + +/** + * By default, any JavaScript code written is defined in the global namespace, which means it's accessible directly under the "window" element. + * If you have a lot of scripts, this can lead to clutter and naming collisions (what if two different scripts use a variable called "i"? They can inadvertently mess each other up). + * To get around this, we define the registerNamespace function in the global namespace, which just confines all the code in the function passed to it to a property under window. + * That property is represented as the "path" parameter. It is passed to the function for ease of access. +*/ +function registerNamespace(path, nsFunc) +{ + var ancestors = path.split("."); + + var ns = window; + for(var i = 0; i < ancestors.length; i++) + { + ns[ancestors[i]] = ns[ancestors[i]] || {}; + ns = ns[ancestors[i]]; + } + nsFunc(ns); +} + +registerNamespace("GW.Controls.SVGLib", function(ns) { + const XML_NAMESPACE = "http://www.w3.org/2000/svg"; + + /** + * https://www.w3.org/TR/SVG/eltindex.html + */ + ns.ElementTypes = { + svg: "svg", //viewBox, preserveAspectRatio, zoomAndPan, transform - https://www.w3.org/TR/SVG/struct.html#SVGElement + circle: "circle", //cx, cy, r - https://www.w3.org/TR/SVG/shapes.html#CircleElement + linearGradient: "linearGradient", //x1, y1, x2, y2, gradientUnits, gradientTransform, spreadMethod, href - https://www.w3.org/TR/SVG/pservers.html#LinearGradientElement + stop: "stop", //offset, stop-color https://www.w3.org/TR/SVG/pservers.html#StopElement + defs: "defs", //https://www.w3.org/TR/SVG/struct.html#DefsElement + rect: "rect", //x, y, width, height, rx, ry - https://www.w3.org/TR/SVG/shapes.html#RectElement + text: "text", //x, y, dominant-baseline, text-anchor, fill - https://www.w3.org/TR/SVG/text.html#TextElement + a: "a", //href, target - https://developer.mozilla.org/en-US/docs/Web/SVG/Element/a + path: "path", //d, pathLength - https://developer.mozilla.org/en-US/docs/Web/SVG/Element/path + title: "title", // - https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title + desc: "desc", // - https://developer.mozilla.org/en-US/docs/Web/SVG/Element/desc + foreignObject: "foreignObject", // - https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject + }; + + /** + * Shortcut to create an SVG element and append it to a parent + * @param parent the parent element + * ... see ns.createElement + */ + function createChildElement(parent, elementType, attributes, innerHTML) + { + var childEl = createElement(elementType, attributes, innerHTML); + parent.appendChild(childEl); + return childEl; + } + ns.createChildElement = createChildElement; + + /** + * Creates an SVG element to spec + * @param elementType type of SVG element (see ns.ElementTypes) + * @param attributes object of attributes and values + * @param innerHTML inner HTML + */ + function createElement(elementType, attributes, innerHTML) + { + var el = document.createElementNS(XML_NAMESPACE, elementType); + Object.keys(attributes || {}).forEach((attr) => el.setAttributeNS(null, attr, attributes[attr])); + el.innerHTML = innerHTML || null; + return el; + } + ns.createElement = createElement; + + //#region Icons + const ICON_CITATION = ""; + const ICON_CLASS = "icon"; + + /** + * Icon SVG path definitions + */ + ns.Icons = { + "circle-info": { + title: "info", + viewBox: "0 0 512 512", + d: "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z" + }, + "play": { + title: "play", + viewBox: "0 0 384 512", + d: "M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z" + }, + "backward-step": { + title: "backward step", + viewBox: "0 0 320 512", + d: "M267.5 440.6c9.5 7.9 22.8 9.7 34.1 4.4s18.4-16.6 18.4-29V96c0-12.4-7.2-23.7-18.4-29s-24.5-3.6-34.1 4.4l-192 160L64 241V96c0-17.7-14.3-32-32-32S0 78.3 0 96V416c0 17.7 14.3 32 32 32s32-14.3 32-32V271l11.5 9.6 192 160z" + }, + "forward-step": { + title: "forward step", + viewBox: "0 0 320 512", + d: "M52.5 440.6c-9.5 7.9-22.8 9.7-34.1 4.4S0 428.4 0 416V96C0 83.6 7.2 72.3 18.4 67s24.5-3.6 34.1 4.4l192 160L256 241V96c0-17.7 14.3-32 32-32s32 14.3 32 32V416c0 17.7-14.3 32-32 32s-32-14.3-32-32V271l-11.5 9.6-192 160z" + }, + "pause": { + title: "pause", + viewBox: "0 0 320 512", + d: "M48 64C21.5 64 0 85.5 0 112V400c0 26.5 21.5 48 48 48H80c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H48zm192 0c-26.5 0-48 21.5-48 48V400c0 26.5 21.5 48 48 48h32c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H240z" + }, + "triangle-exclamation": { + title: "warning", + viewBox: "0 0 512 512", + d: "M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480H40c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24V296c0 13.3 10.7 24 24 24s24-10.7 24-24V184c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z" + }, + "laptop-code": { + title: "coding", + viewBox: "0 0 640 512", + d: "M64 96c0-35.3 28.7-64 64-64H512c35.3 0 64 28.7 64 64V352H512V96H128V352H64V96zM0 403.2C0 392.6 8.6 384 19.2 384H620.8c10.6 0 19.2 8.6 19.2 19.2c0 42.4-34.4 76.8-76.8 76.8H76.8C34.4 480 0 445.6 0 403.2zM281 209l-31 31 31 31c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0l-48-48c-9.4-9.4-9.4-24.6 0-33.9l48-48c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9zM393 175l48 48c9.4 9.4 9.4 24.6 0 33.9l-48 48c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l31-31-31-31c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0z" + }, + "guitar": { + title: "guitar", + viewBox: "0 0 512 512", + d: "M465 7c-9.4-9.4-24.6-9.4-33.9 0L383 55c-2.4 2.4-4.3 5.3-5.5 8.5l-15.4 41-77.5 77.6c-45.1-29.4-99.3-30.2-131 1.6c-11 11-18 24.6-21.4 39.6c-3.7 16.6-19.1 30.7-36.1 31.6c-25.6 1.3-49.3 10.7-67.3 28.6C-16 328.4-7.6 409.4 47.5 464.5s136.1 63.5 180.9 18.7c17.9-17.9 27.4-41.7 28.6-67.3c.9-17 15-32.3 31.6-36.1c15-3.4 28.6-10.5 39.6-21.4c31.8-31.8 31-85.9 1.6-131l77.6-77.6 41-15.4c3.2-1.2 6.1-3.1 8.5-5.5l48-48c9.4-9.4 9.4-24.6 0-33.9L465 7zM208 256a48 48 0 1 1 0 96 48 48 0 1 1 0-96z" + }, + "pen-fancy": { + title: "pen", + viewBox: "0 0 512 512", + d: "M373.5 27.1C388.5 9.9 410.2 0 433 0c43.6 0 79 35.4 79 79c0 22.8-9.9 44.6-27.1 59.6L277.7 319l-10.3-10.3-64-64L193 234.3 373.5 27.1zM170.3 256.9l10.4 10.4 64 64 10.4 10.4-19.2 83.4c-3.9 17.1-16.9 30.7-33.8 35.4L24.4 510.3l95.4-95.4c2.6 .7 5.4 1.1 8.3 1.1c17.7 0 32-14.3 32-32s-14.3-32-32-32s-32 14.3-32 32c0 2.9 .4 5.6 1.1 8.3L1.7 487.6 51.5 310c4.7-16.9 18.3-29.9 35.4-33.8l83.4-19.2z" + }, + "glasses": { + title: "glasses", + viewBox: "0 0 576 512", + d: "M118.6 80c-11.5 0-21.4 7.9-24 19.1L57 260.3c20.5-6.2 48.3-12.3 78.7-12.3c32.3 0 61.8 6.9 82.8 13.5c10.6 3.3 19.3 6.7 25.4 9.2c3.1 1.3 5.5 2.4 7.3 3.2c.9 .4 1.6 .7 2.1 1l.6 .3 .2 .1 .1 0 0 0 0 0s0 0-6.3 12.7h0l6.3-12.7c5.8 2.9 10.4 7.3 13.5 12.7h40.6c3.1-5.3 7.7-9.8 13.5-12.7l6.3 12.7h0c-6.3-12.7-6.3-12.7-6.3-12.7l0 0 0 0 .1 0 .2-.1 .6-.3c.5-.2 1.2-.6 2.1-1c1.8-.8 4.2-1.9 7.3-3.2c6.1-2.6 14.8-5.9 25.4-9.2c21-6.6 50.4-13.5 82.8-13.5c30.4 0 58.2 6.1 78.7 12.3L481.4 99.1c-2.6-11.2-12.6-19.1-24-19.1c-3.1 0-6.2 .6-9.2 1.8L416.9 94.3c-12.3 4.9-26.3-1.1-31.2-13.4s1.1-26.3 13.4-31.2l31.3-12.5c8.6-3.4 17.7-5.2 27-5.2c33.8 0 63.1 23.3 70.8 56.2l43.9 188c1.7 7.3 2.9 14.7 3.5 22.1c.3 1.9 .5 3.8 .5 5.7v6.7V352v16c0 61.9-50.1 112-112 112H419.7c-59.4 0-108.5-46.4-111.8-105.8L306.6 352H269.4l-1.2 22.2C264.9 433.6 215.8 480 156.3 480H112C50.1 480 0 429.9 0 368V352 310.7 304c0-1.9 .2-3.8 .5-5.7c.6-7.4 1.8-14.8 3.5-22.1l43.9-188C55.5 55.3 84.8 32 118.6 32c9.2 0 18.4 1.8 27 5.2l31.3 12.5c12.3 4.9 18.3 18.9 13.4 31.2s-18.9 18.3-31.2 13.4L127.8 81.8c-2.9-1.2-6-1.8-9.2-1.8zM64 325.4V368c0 26.5 21.5 48 48 48h44.3c25.5 0 46.5-19.9 47.9-45.3l2.5-45.6c-2.3-.8-4.9-1.7-7.5-2.5c-17.2-5.4-39.9-10.5-63.6-10.5c-23.7 0-46.2 5.1-63.2 10.5c-3.1 1-5.9 1.9-8.5 2.9zM512 368V325.4c-2.6-.9-5.5-1.9-8.5-2.9c-17-5.4-39.5-10.5-63.2-10.5c-23.7 0-46.4 5.1-63.6 10.5c-2.7 .8-5.2 1.7-7.5 2.5l2.5 45.6c1.4 25.4 22.5 45.3 47.9 45.3H464c26.5 0 48-21.5 48-48z" + }, + "clock": { + title: "glasses", + viewBox: "0 0 512 512", + d: "M256 0a256 256 0 1 1 0 512A256 256 0 1 1 256 0zM232 120V256c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2V120c0-13.3-10.7-24-24-24s-24 10.7-24 24z" + }, + "envelope": { + title: "envelope", + viewBox: "0 0 512 512", + d: "M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z" + }, + "discord": { + title: "discord", + viewBox: "0 0 640 512", + d: "M524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z" + }, + "plus": { + title: "plus", + viewBox: "0 0 448 512", + d: "M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32V224H48c-17.7 0-32 14.3-32 32s14.3 32 32 32H192V432c0 17.7 14.3 32 32 32s32-14.3 32-32V288H400c17.7 0 32-14.3 32-32s-14.3-32-32-32H256V80z" + }, + "circle-check": { + title: "done", + viewBox: "0 0 512 512", + d: "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM369 209L241 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L335 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z" + }, + "delete-left": { + title: "delete", + viewBox: "0 0 576 512", + d: "M576 128c0-35.3-28.7-64-64-64H205.3c-17 0-33.3 6.7-45.3 18.7L9.4 233.4c-6 6-9.4 14.1-9.4 22.6s3.4 16.6 9.4 22.6L160 429.3c12 12 28.3 18.7 45.3 18.7H512c35.3 0 64-28.7 64-64V128zM271 175c9.4-9.4 24.6-9.4 33.9 0l47 47 47-47c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9l-47 47 47 47c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0l-47-47-47 47c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l47-47-47-47c-9.4-9.4-9.4-24.6 0-33.9z" + }, + "link": { + title: "link", + viewBox: "0 0 640 512", + d: "M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z" + }, + "xmark": { + title: "close", + viewBox: "0 0 384 512", + d: "M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z" + }, + "trash": { + title: "trash", + viewBox: "0 0 448 512", + d: "M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z" + }, + "thumbtack": { + title: "trash", + viewBox: "0 0 384 512", + d: "M32 32C32 14.3 46.3 0 64 0H320c17.7 0 32 14.3 32 32s-14.3 32-32 32H290.5l11.4 148.2c36.7 19.9 65.7 53.2 79.5 94.7l1 3c3.3 9.8 1.6 20.5-4.4 28.8s-15.7 13.3-26 13.3H32c-10.3 0-19.9-4.9-26-13.3s-7.7-19.1-4.4-28.8l1-3c13.8-41.5 42.8-74.8 79.5-94.7L93.5 64H64C46.3 64 32 49.7 32 32zM160 384h64v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V384z" + }, + "pen-to-square": { + title: "edit", + viewBox: "0 0 512 512", + d: "M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L362.3 51.7l97.9 97.9 30.1-30.1c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L437.7 172.3 339.7 74.3 172.4 241.7zM96 64C43 64 0 107 0 160V416c0 53 43 96 96 96H352c53 0 96-43 96-96V320c0-17.7-14.3-32-32-32s-32 14.3-32 32v96c0 17.7-14.3 32-32 32H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h96c17.7 0 32-14.3 32-32s-14.3-32-32-32H96z" + }, + "book": { + title: "book", + viewBox: "0 0 448 512", + d: "M96 0C43 0 0 43 0 96V416c0 53 43 96 96 96H384h32c17.7 0 32-14.3 32-32s-14.3-32-32-32V384c17.7 0 32-14.3 32-32V32c0-17.7-14.3-32-32-32H384 96zm0 384H352v64H96c-17.7 0-32-14.3-32-32s14.3-32 32-32zm32-240c0-8.8 7.2-16 16-16H336c8.8 0 16 7.2 16 16s-7.2 16-16 16H144c-8.8 0-16-7.2-16-16zm16 48H336c8.8 0 16 7.2 16 16s-7.2 16-16 16H144c-8.8 0-16-7.2-16-16s7.2-16 16-16z" + }, + "gamepad": { + title: "game", + viewBox: "0 0 640 512", + d: "M192 64C86 64 0 150 0 256S86 448 192 448H448c106 0 192-86 192-192s-86-192-192-192H192zM496 168a40 40 0 1 1 0 80 40 40 0 1 1 0-80zM392 304a40 40 0 1 1 80 0 40 40 0 1 1 -80 0zM168 200c0-13.3 10.7-24 24-24s24 10.7 24 24v32h32c13.3 0 24 10.7 24 24s-10.7 24-24 24H216v32c0 13.3-10.7 24-24 24s-24-10.7-24-24V280H136c-13.3 0-24-10.7-24-24s10.7-24 24-24h32V200z" + }, + "hammer": { + title: "game", + viewBox: "0 0 576 512", + d: "M413.5 237.5c-28.2 4.8-58.2-3.6-80-25.4l-38.1-38.1C280.4 159 272 138.8 272 117.6V105.5L192.3 62c-5.3-2.9-8.6-8.6-8.3-14.7s3.9-11.5 9.5-14l47.2-21C259.1 4.2 279 0 299.2 0h18.1c36.7 0 72 14 98.7 39.1l44.6 42c24.2 22.8 33.2 55.7 26.6 86L503 183l8-8c9.4-9.4 24.6-9.4 33.9 0l24 24c9.4 9.4 9.4 24.6 0 33.9l-88 88c-9.4 9.4-24.6 9.4-33.9 0l-24-24c-9.4-9.4-9.4-24.6 0-33.9l8-8-17.5-17.5zM27.4 377.1L260.9 182.6c3.5 4.9 7.5 9.6 11.8 14l38.1 38.1c6 6 12.4 11.2 19.2 15.7L134.9 484.6c-14.5 17.4-36 27.4-58.6 27.4C34.1 512 0 477.8 0 435.7c0-22.6 10.1-44.1 27.4-58.6z" + }, + "location-dot": { + title: "location", + viewBox: "0 0 384 512", + d: "M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 128a64 64 0 1 1 0 128 64 64 0 1 1 0-128z" + }, + "box-open": { + title: "box", + viewBox: "0 0 640 512", + d: "M58.9 42.1c3-6.1 9.6-9.6 16.3-8.7L320 64 564.8 33.4c6.7-.8 13.3 2.7 16.3 8.7l41.7 83.4c9 17.9-.6 39.6-19.8 45.1L439.6 217.3c-13.9 4-28.8-1.9-36.2-14.3L320 64 236.6 203c-7.4 12.4-22.3 18.3-36.2 14.3L37.1 170.6c-19.3-5.5-28.8-27.2-19.8-45.1L58.9 42.1zM321.1 128l54.9 91.4c14.9 24.8 44.6 36.6 72.5 28.6L576 211.6v167c0 22-15 41.2-36.4 46.6l-204.1 51c-10.2 2.6-20.9 2.6-31 0l-204.1-51C79 419.7 64 400.5 64 378.5v-167L191.6 248c27.8 8 57.6-3.8 72.5-28.6L318.9 128h2.2z" + }, + "calendar": { + title: "box", + viewBox: "0 0 448 512", + d: "M128 0c17.7 0 32 14.3 32 32V64H288V32c0-17.7 14.3-32 32-32s32 14.3 32 32V64h48c26.5 0 48 21.5 48 48v48H0V112C0 85.5 21.5 64 48 64H96V32c0-17.7 14.3-32 32-32zM0 192H448V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V192zm64 80v32c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V272c0-8.8-7.2-16-16-16H80c-8.8 0-16 7.2-16 16zm128 0v32c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V272c0-8.8-7.2-16-16-16H208c-8.8 0-16 7.2-16 16zm144-16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V272c0-8.8-7.2-16-16-16H336zM64 400v32c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V400c0-8.8-7.2-16-16-16H80c-8.8 0-16 7.2-16 16zm144-16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V400c0-8.8-7.2-16-16-16H208zm112 16v32c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V400c0-8.8-7.2-16-16-16H336c-8.8 0-16 7.2-16 16z" + }, + "people-group": { + title: "people", + viewBox: "0 0 640 512", + d: "M72 88a56 56 0 1 1 112 0A56 56 0 1 1 72 88zM64 245.7C54 256.9 48 271.8 48 288s6 31.1 16 42.3V245.7zm144.4-49.3C178.7 222.7 160 261.2 160 304c0 34.3 12 65.8 32 90.5V416c0 17.7-14.3 32-32 32H96c-17.7 0-32-14.3-32-32V389.2C26.2 371.2 0 332.7 0 288c0-61.9 50.1-112 112-112h32c24 0 46.2 7.5 64.4 20.3zM448 416V394.5c20-24.7 32-56.2 32-90.5c0-42.8-18.7-81.3-48.4-107.7C449.8 183.5 472 176 496 176h32c61.9 0 112 50.1 112 112c0 44.7-26.2 83.2-64 101.2V416c0 17.7-14.3 32-32 32H480c-17.7 0-32-14.3-32-32zm8-328a56 56 0 1 1 112 0A56 56 0 1 1 456 88zM576 245.7v84.7c10-11.3 16-26.1 16-42.3s-6-31.1-16-42.3zM320 32a64 64 0 1 1 0 128 64 64 0 1 1 0-128zM240 304c0 16.2 6 31 16 42.3V261.7c-10 11.3-16 26.1-16 42.3zm144-42.3v84.7c10-11.3 16-26.1 16-42.3s-6-31.1-16-42.3zM448 304c0 44.7-26.2 83.2-64 101.2V448c0 17.7-14.3 32-32 32H288c-17.7 0-32-14.3-32-32V405.2c-37.8-18-64-56.5-64-101.2c0-61.9 50.1-112 112-112h32c61.9 0 112 50.1 112 112z" + }, + "comments": { + title: "comments", + viewBox: "0 0 640 512", + d: "M208 352c114.9 0 208-78.8 208-176S322.9 0 208 0S0 78.8 0 176c0 38.6 14.7 74.3 39.6 103.4c-3.5 9.4-8.7 17.7-14.2 24.7c-4.8 6.2-9.7 11-13.3 14.3c-1.8 1.6-3.3 2.9-4.3 3.7c-.5 .4-.9 .7-1.1 .8l-.2 .2 0 0 0 0C1 327.2-1.4 334.4 .8 340.9S9.1 352 16 352c21.8 0 43.8-5.6 62.1-12.5c9.2-3.5 17.8-7.4 25.3-11.4C134.1 343.3 169.8 352 208 352zM448 176c0 112.3-99.1 196.9-216.5 207C255.8 457.4 336.4 512 432 512c38.2 0 73.9-8.7 104.7-23.9c7.5 4 16 7.9 25.2 11.4c18.3 6.9 40.3 12.5 62.1 12.5c6.9 0 13.1-4.5 15.2-11.1c2.1-6.6-.2-13.8-5.8-17.9l0 0 0 0-.2-.2c-.2-.2-.6-.4-1.1-.8c-1-.8-2.5-2-4.3-3.7c-3.6-3.3-8.5-8.1-13.3-14.3c-5.5-7-10.7-15.4-14.2-24.7c24.9-29 39.6-64.7 39.6-103.4c0-92.8-84.9-168.9-192.6-175.5c.4 5.1 .6 10.3 .6 15.5z" + }, + "clipboard-check": { + title: "clipboard", + viewBox: "0 0 384 512", + d: "M192 0c-41.8 0-77.4 26.7-90.5 64H64C28.7 64 0 92.7 0 128V448c0 35.3 28.7 64 64 64H320c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64H282.5C269.4 26.7 233.8 0 192 0zm0 64a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM305 273L177 401c-9.4 9.4-24.6 9.4-33.9 0L79 337c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L271 239c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z" + }, + "user": { + title: "clipboard", + viewBox: "0 0 448 512", + d: "M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z" + }, + "door-open": { + title: "open door", + viewBox: "0 0 576 512", + d: "M320 32c0-9.9-4.5-19.2-12.3-25.2S289.8-1.4 280.2 1l-179.9 45C79 51.3 64 70.5 64 92.5V448H32c-17.7 0-32 14.3-32 32s14.3 32 32 32H96 288h32V480 32zM256 256c0 17.7-10.7 32-24 32s-24-14.3-24-32s10.7-32 24-32s24 14.3 24 32zm96-128h96V480c0 17.7 14.3 32 32 32h64c17.7 0 32-14.3 32-32s-14.3-32-32-32H512V128c0-35.3-28.7-64-64-64H352v64z" + }, + "scroll": { + title: "scroll", + viewBox: "0 0 576 512", + d: "M0 80v48c0 17.7 14.3 32 32 32H48 96V80c0-26.5-21.5-48-48-48S0 53.5 0 80zM112 32c10 13.4 16 30 16 48V384c0 35.3 28.7 64 64 64s64-28.7 64-64v-5.3c0-32.4 26.3-58.7 58.7-58.7H480V128c0-53-43-96-96-96H112zM464 480c61.9 0 112-50.1 112-112c0-8.8-7.2-16-16-16H314.7c-14.7 0-26.7 11.9-26.7 26.7V384c0 53-43 96-96 96H368h96z" + }, + "star": { + title: "star", + viewBox: "0 0 576 512", + d: "M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z" + }, + "boxes-stacked": { + title: "stacked boxes", + viewBox: "0 0 576 512", + d: "M248 0H208c-26.5 0-48 21.5-48 48V160c0 35.3 28.7 64 64 64H352c35.3 0 64-28.7 64-64V48c0-26.5-21.5-48-48-48H328V80c0 8.8-7.2 16-16 16H264c-8.8 0-16-7.2-16-16V0zM64 256c-35.3 0-64 28.7-64 64V448c0 35.3 28.7 64 64 64H224c35.3 0 64-28.7 64-64V320c0-35.3-28.7-64-64-64H184v80c0 8.8-7.2 16-16 16H120c-8.8 0-16-7.2-16-16V256H64zM352 512H512c35.3 0 64-28.7 64-64V320c0-35.3-28.7-64-64-64H472v80c0 8.8-7.2 16-16 16H408c-8.8 0-16-7.2-16-16V256H352c-15 0-28.8 5.1-39.7 13.8c4.9 10.4 7.7 22 7.7 34.2V464c0 12.2-2.8 23.8-7.7 34.2C323.2 506.9 337 512 352 512z" + }, + "person-running": { + title: "person running", + viewBox: "0 0 448 512", + d: "M320 48a48 48 0 1 0 -96 0 48 48 0 1 0 96 0zM125.7 175.5c9.9-9.9 23.4-15.5 37.5-15.5c1.9 0 3.8 .1 5.6 .3L137.6 254c-9.3 28 1.7 58.8 26.8 74.5l86.2 53.9-25.4 88.8c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l28.7-100.4c5.9-20.6-2.6-42.6-20.7-53.9L238 299l30.9-82.4 5.1 12.3C289 264.7 323.9 288 362.7 288H384c17.7 0 32-14.3 32-32s-14.3-32-32-32H362.7c-12.9 0-24.6-7.8-29.5-19.7l-6.3-15c-14.6-35.1-44.1-61.9-80.5-73.1l-48.7-15c-11.1-3.4-22.7-5.2-34.4-5.2c-31 0-60.8 12.3-82.7 34.3L57.4 153.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l23.1-23.1zM91.2 352H32c-17.7 0-32 14.3-32 32s14.3 32 32 32h69.6c19 0 36.2-11.2 43.9-28.5L157 361.6l-9.5-6c-17.5-10.9-30.5-26.8-37.9-44.9L91.2 352z" + }, + "handshake": { + title: "handshake", + viewBox: "0 0 640 512", + d: "M323.4 85.2l-96.8 78.4c-16.1 13-19.2 36.4-7 53.1c12.9 17.8 38 21.3 55.3 7.8l99.3-77.2c7-5.4 17-4.2 22.5 2.8s4.2 17-2.8 22.5l-20.9 16.2L550.2 352H592c26.5 0 48-21.5 48-48V176c0-26.5-21.5-48-48-48H516h-4-.7l-3.9-2.5L434.8 79c-15.3-9.8-33.2-15-51.4-15c-21.8 0-43 7.5-60 21.2zm22.8 124.4l-51.7 40.2C263 274.4 217.3 268 193.7 235.6c-22.2-30.5-16.6-73.1 12.7-96.8l83.2-67.3c-11.6-4.9-24.1-7.4-36.8-7.4C234 64 215.7 69.6 200 80l-72 48H48c-26.5 0-48 21.5-48 48V304c0 26.5 21.5 48 48 48H156.2l91.4 83.4c19.6 17.9 49.9 16.5 67.8-3.1c5.5-6.1 9.2-13.2 11.1-20.6l17 15.6c19.5 17.9 49.9 16.6 67.8-2.9c4.5-4.9 7.8-10.6 9.9-16.5c19.4 13 45.8 10.3 62.1-7.5c17.9-19.5 16.6-49.9-2.9-67.8l-134.2-123z" + }, + "reply": { + title: "reply", + viewBox: "0 0 512 512", + d: "M205 34.8c11.5 5.1 19 16.6 19 29.2v64H336c97.2 0 176 78.8 176 176c0 113.3-81.5 163.9-100.2 174.1c-2.5 1.4-5.3 1.9-8.1 1.9c-10.9 0-19.7-8.9-19.7-19.7c0-7.5 4.3-14.4 9.8-19.5c9.4-8.8 22.2-26.4 22.2-56.7c0-53-43-96-96-96H224v64c0 12.6-7.4 24.1-19 29.2s-25 3-34.4-5.4l-160-144C3.9 225.7 0 217.1 0 208s3.9-17.7 10.6-23.8l160-144c9.4-8.5 22.9-10.6 34.4-5.4z" + }, + "d20": { + title: "d20", + viewBox: "0 0 512 512", + d: "M48.7 125.8l53.2 31.9c7.8 4.7 17.8 2 22.2-5.9L201.6 12.1c3-5.4-.9-12.1-7.1-12.1c-1.6 0-3.2 .5-4.6 1.4L47.9 98.8c-9.6 6.6-9.2 20.9 .8 26.9zM16 171.7V295.3c0 8 10.4 11 14.7 4.4l60-92c5-7.6 2.6-17.8-5.2-22.5L40.2 158C29.6 151.6 16 159.3 16 171.7zM310.4 12.1l77.6 139.6c4.4 7.9 14.5 10.6 22.2 5.9l53.2-31.9c10-6 10.4-20.3 .8-26.9L322.1 1.4c-1.4-.9-3-1.4-4.6-1.4c-6.2 0-10.1 6.7-7.1 12.1zM496 171.7c0-12.4-13.6-20.1-24.2-13.7l-45.3 27.2c-7.8 4.7-10.1 14.9-5.2 22.5l60 92c4.3 6.7 14.7 3.6 14.7-4.4V171.7zm-49.3 246L286.1 436.6c-8.1 .9-14.1 7.8-14.1 15.9v52.8c0 3.7 3 6.8 6.8 6.8c.8 0 1.6-.1 2.4-.4l172.7-64c6.1-2.2 10.1-8 10.1-14.5c0-9.3-8.1-16.5-17.3-15.4zM233.2 512c3.7 0 6.8-3 6.8-6.8V452.6c0-8.1-6.1-14.9-14.1-15.9l-160.6-19c-9.2-1.1-17.3 6.1-17.3 15.4c0 6.5 4 12.3 10.1 14.5l172.7 64c.8 .3 1.6 .4 2.4 .4zM41.7 382.9l170.9 20.2c7.8 .9 13.4-7.5 9.5-14.3l-85.7-150c-5.9-10.4-20.7-10.8-27.3-.8L30.2 358.2c-6.5 9.9-.3 23.3 11.5 24.7zm439.6-24.8L402.9 238.1c-6.5-10-21.4-9.6-27.3 .8L290.2 388.5c-3.9 6.8 1.6 15.2 9.5 14.3l170.1-20c11.8-1.4 18-14.7 11.5-24.6zm-216.9 11l78.4-137.2c6.1-10.7-1.6-23.9-13.9-23.9H183.1c-12.3 0-20 13.3-13.9 23.9l78.4 137.2c3.7 6.4 13 6.4 16.7 0zM174.4 176H337.6c12.2 0 19.9-13.1 14-23.8l-80-144c-2.8-5.1-8.2-8.2-14-8.2h-3.2c-5.8 0-11.2 3.2-14 8.2l-80 144c-5.9 10.7 1.8 23.8 14 23.8z" + }, + "screwdriver-wrench": { + title: "settings", + viewBox: "0 0 512 512", + d: "M78.6 5C69.1-2.4 55.6-1.5 47 7L7 47c-8.5 8.5-9.4 22-2.1 31.6l80 104c4.5 5.9 11.6 9.4 19 9.4h54.1l109 109c-14.7 29-10 65.4 14.3 89.6l112 112c12.5 12.5 32.8 12.5 45.3 0l64-64c12.5-12.5 12.5-32.8 0-45.3l-112-112c-24.2-24.2-60.6-29-89.6-14.3l-109-109V104c0-7.5-3.5-14.5-9.4-19L78.6 5zM19.9 396.1C7.2 408.8 0 426.1 0 444.1C0 481.6 30.4 512 67.9 512c18 0 35.3-7.2 48-19.9L233.7 374.3c-7.8-20.9-9-43.6-3.6-65.1l-61.7-61.7L19.9 396.1zM512 144c0-10.5-1.1-20.7-3.2-30.5c-2.4-11.2-16.1-14.1-24.2-6l-63.9 63.9c-3 3-7.1 4.7-11.3 4.7H352c-8.8 0-16-7.2-16-16V102.6c0-4.2 1.7-8.3 4.7-11.3l63.9-63.9c8.1-8.1 5.2-21.8-6-24.2C388.7 1.1 378.5 0 368 0C288.5 0 224 64.5 224 144l0 .8 85.3 85.3c36-9.1 75.8 .5 104 28.7L429 274.5c49-23 83-72.8 83-130.5zM56 432a24 24 0 1 1 48 0 24 24 0 1 1 -48 0z" + }, + "dumbbell": { + title: "dumbbell", + viewBox: "0 0 640 512", + d: "M96 64c0-17.7 14.3-32 32-32h32c17.7 0 32 14.3 32 32V224v64V448c0 17.7-14.3 32-32 32H128c-17.7 0-32-14.3-32-32V384H64c-17.7 0-32-14.3-32-32V288c-17.7 0-32-14.3-32-32s14.3-32 32-32V160c0-17.7 14.3-32 32-32H96V64zm448 0v64h32c17.7 0 32 14.3 32 32v64c17.7 0 32 14.3 32 32s-14.3 32-32 32v64c0 17.7-14.3 32-32 32H544v64c0 17.7-14.3 32-32 32H480c-17.7 0-32-14.3-32-32V288 224 64c0-17.7 14.3-32 32-32h32c17.7 0 32 14.3 32 32zM416 224v64H224V224H416z" + }, + "chevron-down": { + title: "chevron down", + viewBox: "0 0 512 512", + d: "M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z" + }, + "chevron-up": { + title: "chevron up", + viewBox: "0 0 512 512", + d: "M233.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L256 173.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z" + }, + "chevron-left": { + title: "chevron left", + viewBox: "0 0 320 512", + d: "M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l192 192c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256 246.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-192 192z" + }, + "chevron-right": { + title: "chevron right", + viewBox: "0 0 320 512", + d: "M310.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L242.7 256 73.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z" + }, + }; + + ns.createIcon = function createIcon(iconDef, title, desc, classes, style) + { + var iconEl = createElement( + ns.ElementTypes.svg, + { + "viewBox": iconDef.viewBox, + "class": `${ICON_CLASS} ${classes}`, + "role": "img", + "style": style || "" + }, + ICON_CITATION + ); + + iconEl.insertAdjacentHTML("afterbegin", + `` + ); + + createChildElement( + iconEl, + ns.ElementTypes.title, + {}, + title || iconDef.title + ); + if (desc) + { + createChildElement( + iconEl, + ns.ElementTypes.desc, + {}, + desc + ); + } + + createChildElement( + iconEl, + ns.ElementTypes.path, + { + "d": iconDef.d + } + ); + + return iconEl; + }; + //#endregion +}); + +registerNamespace("GW.Controls", function(ns) { + ns.IconEl = class IconEl extends HTMLElement + { + //#region staticProperties + static observedAttributes = []; + static instanceCount = 0; + static instanceMap = {}; + //#endregion + + //#region instance properties + instanceId; + iconObj; + titleText; + isInitialized; + + //#region element properties + //#endregion + //#endregion + + constructor() + { + super(); + this.instanceId = IconEl.instanceCount++; + IconEl.instanceMap[this.instanceId] = this; + } + + get idKey() + { + return `gw-icon-${this.instanceId}`; + } + + //#region HTMLElement implementation + connectedCallback() + { + if (this.isInitialized) { return; } + + this.iconObj = ns.SVGLib.Icons[this.getAttribute("iconKey")]; + + this.titleText = this.getAttribute("title"); + if (this.hasAttribute("titleId")) + { + const titleEl = document.getElementById(this.getAttribute("titleId")); + this.titleText = titleEl.innerText; + titleEl.remove(); + } + + this.iconDescription = this.getAttribute("description"); + this.iconClasses = this.getAttribute("iconClasses"); + this.iconStyle = this.getAttribute("iconStyle"); + + this.renderContent(); + this.isInitialized = true; + } + //#endregion + + renderContent() + { + if (!this.iconObj) + { + debugger; + return; + } + + //Markup + this.insertAdjacentHTML("beforebegin", + `` + ); + this.appendChild( + ns.SVGLib.createIcon( + this.iconObj, + this.titleText, + this.iconDescription, + this.iconClasses, + this.iconStyle, + ) + ); + + //element properties + } + }; + customElements.define("gw-icon", ns.IconEl); +}); +/** + * Author: Vera Konigin + * Site: https://groundedwren.neocities.org + * Contact: vera@groundedwren.com + * + * File Description: Gizmo for reading from Google Sheets. + * Neocities editor users will see a lot of linter errors in this file, but none of them are real errors. The linter just doesn't understand some modern JS. +*/ + +/** + * By default, any JavaScript code written is defined in the global namespace, which means it's accessible directly under the "window" element. + * If you have a lot of scripts, this can lead to clutter and naming collisions (what if two different scripts use a variable called "i"? They can inadvertently mess each other up). + * To get around this, we define the registerNamespace function in the global namespace, which just confines all the code in the function passed to it to a property under window. + * That property is represented as the "path" parameter. It is passed to the function for ease of access. +*/ +function registerNamespace(path, nsFunc) +{ + var ancestors = path.split("."); + + var ns = window; + for(var i = 0; i < ancestors.length; i++) + { + ns[ancestors[i]] = ns[ancestors[i]] || {}; + ns = ns[ancestors[i]]; + } + nsFunc(ns); +} + +registerNamespace("GW.Gizmos", function(ns) { + /** + * A class to read from one page in a google sheet document + */ + ns.GoogleSheetsReader = class GoogleSheetsReader + { + //setResponse is intended for React - it's how google responds to our GET. Fortunately valid JSON is inside this call, so we can just parse it out. + static #RESPONSE_PREFIX = "setResponse("; + static #RESPONSE_SUFFIX = ");"; + + //Here we can define any custom types based on column label. "Timestamp" is intended for ISO 8601 format date/time strings. + static #CUSTOM_LABEL_TYPES = { + "Timestamp": "timestamp" + }; + + spreadsheetId; //The ID of the spreadsheet. This is the part just after /d/ in the docs.google.com URL + sheetName; //The name of the particular sheet we're after + + #sheetURL; //Composed request URL + + loadPromise = null; //A promise created when loading begins and which resolves when data has finished loading. + tableJSON = null; //Raw JS Object version of the returned JSON. + rowData = null; //Parsed row data + colData = null; //A shortcut to the the column data in tableJSON + colIndex = null; //An index from column label to its metadata, plus array position + + /** + * Constructs a GoogleSheetsReader object + * spreadsheetId is the part of the docs.google.com URL just after /d/ + * sheetName is the name of the particular page + */ + constructor(spreadsheetId, sheetName) + { + this.spreadsheetId = spreadsheetId; + this.sheetName = sheetName; + this.#sheetURL = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/gviz/tq?sheet=${sheetName}`; + } + + /** + * Loads and parses sheet data via HTTP GET + * Returns null on success, and an error string on failure. + */ + async loadData() + { + this.loadPromise = this.#loadData(); + return this.loadPromise; + } + + async #loadData() + { + this.tableJSON = null; + this.rowData = null; + this.colData = null; + this.colIndex = null; + + const response = await fetch(this.#sheetURL); + if (response.ok) + { + return response.text().then((unparsedData) => + { + //This is parsing out the valid JSON from the React method they gave us + const targetData = unparsedData.split( + GoogleSheetsReader.#RESPONSE_PREFIX + )[1].split( + GoogleSheetsReader.#RESPONSE_SUFFIX + )[0]; + + this.tableJSON = GoogleSheetsReader.#applyCustomLabelTypes(JSON.parse(targetData).table); + this.rowData = GoogleSheetsReader.#parseAllRows(this.tableJSON); + this.colIndex = GoogleSheetsReader.#indexColumns(this.tableJSON); + this.colData = this.tableJSON.cols; + + return null; + }); + } + else + { + return response.statusText || response.status; + } + } + + /** + * Overrides any google-returned column data types with custom ones based on label + */ + static #applyCustomLabelTypes(tableJSON) + { + tableJSON.cols.forEach(col => { + if(this.#CUSTOM_LABEL_TYPES[col.label]) + { + col.type = this.#CUSTOM_LABEL_TYPES[col.label] + }; + }); + return tableJSON; + } + + static #parseAllRows(tableJSON) + { + const rowDataArray = []; + for(let i = 0; i < tableJSON.rows.length; i++) + { + rowDataArray.push(this.#parseRow(i, tableJSON)); + } + return rowDataArray; + } + + static #parseRow(rowIdx, tableJSON) + { + const rowData = {}; + const cells = tableJSON.rows[rowIdx].c; + + for(let i = 0; i < cells.length; i++) + { + rowData[tableJSON.cols[i].label] = this.#parseCellType(cells[i], tableJSON.cols[i].type); + } + return rowData; + } + + /** + * Parses a cell based on its type. Further custom types will need their own parsing added here. + */ + static #parseCellType(cellData, cellType) + { + switch (cellType) + { + case "string": + return cellData ? cellData.v : cellData; + case "number": + return cellData ? cellData.v : cellData; + case "datetime": + case "date": + return (cellData && cellData.v) ? eval("new " + cellData.v) : null; + case "timestamp": + const cellTimestamp = new Date(cellData ? cellData.v : ""); + return isNaN(cellTimestamp) ? null : cellTimestamp; + default: + return cellData; + } + } + + static #indexColumns(tableJSON) + { + const colIndex = {}; + for(let i = 0; i < tableJSON.cols.length; i++) + { + const colData = tableJSON.cols[i]; + colIndex[colData.label] = {...colData, index: i}; + } + return colIndex; + } + }; +}); +/** + * @file Comments control + * @author Vera Konigin vera@groundedwren.com + * https://groundedwren.neocities.org + */ + +window.GW = window.GW || {}; +(function Controls(ns) { + ns.CommentForm = class CommentForm extends HTMLElement { + //#region staticProperties + static instanceCount = 0; + static instanceMap = {}; + //#endregion + + //#region instance properties + instanceId; + isInitialized; + titleText; + discordURL; + encodedPath; + fallbackEmail; + + //#region element properties + formEl; + titleEl; + bannerEl; + + dispNameInpt; + emailInpt; + websiteInpt; + respToInpt; + commentInpt; + + resetBtn; + submitBtn; + //#endregion + //#endregion + + constructor() { + super(); + this.instanceId = CommentForm.instanceCount++; + CommentForm.instanceMap[this.instanceId] = this; + } + + get idKey() { + return `gw-comment-form-${this.instanceId}`; + } + + connectedCallback() { + if (this.isInitialized) { return; } + + this.titleText = this.getAttribute("titleText") || "Add a Comment"; + this.discordURL = this.getAttribute("discordURL"); + this.encodedPath = this.getAttribute("encodedPath"); + this.fallbackEmail = this.getAttribute("fallbackEmail"); + + this.renderContent(); + this.registerHandlers(); + + this.isInitialized = true; + } + + renderContent() { + //Markup + this.innerHTML = ` +
+

${this.titleText}

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+ + Comments are manually approved +
+ +
+ `; + + //element properties + this.formEl = document.getElementById(`${this.idKey}-form`); + this.titleEl = document.getElementById(`${this.idKey}-title`); + this.bannerEl = document.getElementById(`${this.idKey}-banner`); + + this.dispNameInpt = document.getElementById(`${this.idKey}-dispName`); + this.emailInpt = document.getElementById(`${this.idKey}-email`); + this.websiteInpt = document.getElementById(`${this.idKey}-website`); + this.respToInpt = document.getElementById(`${this.idKey}-respTo`); + this.commentInpt = document.getElementById(`${this.idKey}-comment`); + + this.resetBtn = document.getElementById(`${this.idKey}-reset`); + this.submitBtn = document.getElementById(`${this.idKey}-submit`); + + //default values + this.dispNameInpt.value = localStorage.getItem("comment-name") || ""; + this.emailInpt.value = localStorage.getItem("comment-email") || ""; + this.websiteInpt.value = localStorage.getItem("comment-website") || ""; + } + + //#region Handlers + registerHandlers() { + this.formEl.onsubmit = this.onSubmit; + } + + onSubmit = (event) => { + event.preventDefault(); + + const contentObj = { + name: this.dispNameInpt.value, + email: this.emailInpt.value, + website: this.websiteInpt.value, + responseTo: this.respToInpt.value, + comment: ( + this.commentInpt.value || "" + ).replaceAll("\n", "
").replaceAll("(", "\\("), + timestamp: new Date().toUTCString(), + }; + const contentAry = []; + for (let contentKey in contentObj) { + contentAry.push(`${contentKey}=${contentObj[contentKey]}`); + } + + const request = new XMLHttpRequest(); + request.open( + "POST", + this.discordURL || atob("aHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGkvd2ViaG9va3Mv" + this.encodedPath), + true + ); + request.setRequestHeader("Content-Type", "application/json"); + + request.onreadystatechange = () => { + if (request.readyState !== XMLHttpRequest.DONE) { return; } + if (Math.floor(request.status / 100) !== 2) { + console.log(request.responseText); + this.bannerEl.classList.add("warning"); + this.bannerEl.innerHTML = + ` + + + That didn't work. + ${this.fallbackEmail + ? `Click here to send as an email instead.` + : "" + } + + `; + } + else { + alert("Your comment has been submitted!"); + } + }; + + request.send(JSON.stringify({ + embeds: [{ + fields: Object.keys(contentObj).map(key => { return { name: key, value: contentObj[key] }}) + }] + })); + + localStorage.setItem("comment-name", contentObj.name); + localStorage.setItem("comment-email", contentObj.email); + localStorage.setItem("comment-website", contentObj.website); + + this.formEl.reset(); + this.dispNameInpt.value = contentObj.name; + this.emailInpt.value = contentObj.email; + this.websiteInpt.value = contentObj.website; + }; + //#endregion + }; + customElements.define("gw-comment-form", ns.CommentForm); + + ns.CommentList = class CommentList extends HTMLElement { + //#region staticProperties + static instanceCount = 0; + static instanceMap = {}; + static Data = []; + //#endregion + + //#region instance properties + instanceId; + isInitialized; + gSpreadsheetId; + gSheetId; + isNewestFirst; + gwCommentFormId; + + //#region element properties + //#endregion + //#endregion + + constructor() { + super(); + this.instanceId = CommentList.instanceCount++; + CommentList.instanceMap[this.instanceId] = this; + CommentList.Data[this.instanceId] = {}; + } + + get idKey() { + return `gw-comment-list-${this.instanceId}`; + } + + connectedCallback() { + if (this.isInitialized) { return; } + + this.gSpreadsheetId = this.getAttribute("gSpreadsheetId"); + this.gSheetId = this.getAttribute("gSheetId"); + this.isNewestFirst = this.getAttribute("isNewestFirst"); + this.gwCommentFormId = this.getAttribute("gwCommentFormId"); + + this.loadAndRender(); + + this.isInitialized = true; + } + + async loadAndRender() { + this.innerHTML = ` +
+ + Comments loading.... +
+ ` + + const sheetReader = new GW.Gizmos.GoogleSheetsReader(this.gSpreadsheetId, this.gSheetId); + await sheetReader.loadData(); + this.innerHTML = ""; + + const allComments = sheetReader.rowData; + if (this.isNewestFirst) { + allComments.reverse(); + } + + this.renderContent(); + this.registerHandlers(); + + const allCommentsIndex = {}; + const topLevelCommentIdxs = []; + const childCommentIdxs = []; + for (let i = 0; i < allComments.length; i++) { + const comment = allComments[i]; + allCommentsIndex[comment.ID] = i; + if (!comment.ResponseTo) { + topLevelCommentIdxs.push(i); + } + else { + childCommentIdxs.push(i); + } + } + childCommentIdxs.forEach(childIdx => { + const replyId = allComments[childIdx].ResponseTo; + const respondeeComment = allComments[allCommentsIndex[replyId]]; + + respondeeComment.ChildIdxs = respondeeComment.ChildIdxs || []; + respondeeComment.ChildIdxs.push(childIdx); + }); + + let commentsToBuild = []; + topLevelCommentIdxs.forEach( + topCommentIdx => commentsToBuild.push({ + parent: this.containerEl, + comment: allComments[topCommentIdx] + }) + ); + + while (commentsToBuild.length > 0) { + let { parent, comment } = commentsToBuild.shift(); + if (!comment.Timestamp) { + continue; + } + + CommentList.Data[this.instanceId][comment.ID] = comment; + + parent.insertAdjacentHTML("beforeend", ` + + `); + + const commentEl = document.getElementById(`${this.idKey}-cmt-${comment.ID}`); + (comment.ChildIdxs || []).forEach( + childIdx => commentsToBuild.push({ + parent: commentEl.articleEl, + comment: allComments[childIdx] + }) + ); + } + } + + renderContent() { + //Markup + this.innerHTML = ` +
+
+ `; + + //element properties + this.containerEl = document.getElementById(`${this.idKey}-container`); + } + + //#region Handlers + registerHandlers() { + } + //#endregion + }; + customElements.define("gw-comment-list", ns.CommentList); + + ns.CommentCard = class CommentCard extends HTMLElement { + //#region staticProperties + static instanceCount = 0; + static instanceMap = {}; + //#endregion + + //#region instance properties + instanceId; + isInitialized; + + commentId; + gwCommentFormId; + + replyToId; + numChildren; + commenterName; + datetime; + websiteURL; + commentText; + + //#region element properties + articleEl; + replyBtn; + //#endregion + //#endregion + + constructor() { + super(); + this.instanceId = CommentCard.instanceCount++; + CommentCard.instanceMap[this.instanceId] = this; + } + + get idKey() { + return `gw-comment-card-${this.instanceId}`; + } + + //#region HTMLElement implementation + connectedCallback() { + if (this.isInitialized) { return; } + + this.commentId = this.getAttribute("commentId"); + this.gwCommentFormId = this.getAttribute("gwCommentFormId"); + + const commentData = ns.CommentList.Data[this.getAttribute("listInstance")][this.commentId]; + + this.replyToId = commentData.ResponseTo; + this.numChildren = (commentData.ChildIdxs || []).length; + this.commenterName = commentData["Display Name"]; + this.datetime = commentData.Timestamp; + this.websiteURL = commentData.Website; + this.commentText = this.parseCommentText(commentData.Comment); + + this.renderContent(); + this.registerHandlers(); + + this.isInitialized = true; + } + //#endregion + + renderContent() { + let headerText = this.replyToId + ? `Comment #${this.commentId} replying to #${this.replyToId}` + : `Top level comment #${this.commentId}`; + headerText += ` with ${this.numChildren} direct ${this.numChildren == 1 ? "reply" : "replies"}`; + + const displayTimestamp = this.datetime.toLocaleString( + undefined, + { dateStyle: "short", timeStyle: "short" } + ); + + const commenterNameEl = this.websiteURL + ? `${this.commenterName}` + : `${this.commenterName}`; + + //Markup + this.innerHTML = ` +
+
+ + ${commenterNameEl} +
+ + +
+
+
${this.commentText}
+ +
+ `; + + //element properties + this.articleEl = document.getElementById(`${this.idKey}-article`); + this.timestamp = document.getElementById(`${this.idKey}-timestamp`); + this.replyBtn = document.getElementById(`${this.idKey}-reply`); + this.hideBtn = document.getElementById(`${this.idKey}-hide`); + this.showBtn = document.getElementById(`${this.idKey}-show`); + } + + //#region Handlers + registerHandlers() { + this.replyBtn.onclick = this.onReply; + this.hideBtn.onclick = this.onHide; + this.showBtn.onclick = this.onShow; + } + + onReply = () => { + const gwCommentForm = document.getElementById(this.gwCommentFormId); + const respToInpt = gwCommentForm.respToInpt; + if (!respToInpt) { + alert("Comment form not found"); + return; + } + + respToInpt.value = this.commentId; + respToInpt.focus(); + }; + + onHide = () => { + this.classList.add("collapsed"); + this.showBtn.focus(); + }; + + onShow = () => { + this.classList.remove("collapsed"); + this.timestamp.focus(); + }; + //#endregion + + parseCommentText(commentString) { + let commentText = ""; + let linkObj = {}; + + for(let i = 0; i < commentString.length; i++){ + let char = commentString.charAt(i); + switch (char) { + case '[': + linkObj = {tStart: i}; + break; + case ']': + if(linkObj.tStart !== undefined && linkObj.tStart !== i-1) { + linkObj.tEnd = i; + } + else { linkObj = {}; } + break; + case '(': + if(linkObj.tEnd !== undefined && linkObj.tEnd === i-1) { + linkObj.lStart = i; + } + else { linkObj = {}; } + break; + case ')': + if(linkObj.lStart !== undefined && linkObj.lStart !== i-1) { + linkObj.lEnd = i; + } + else { linkObj = {}; } + break; + } + if(linkObj.lEnd !== undefined) { + const linkText = commentString.substring(linkObj.tStart + 1, linkObj.tEnd); + const linkURL = commentString.substring(linkObj.lStart + 1, linkObj.lEnd); + commentText = commentText.substring(0, commentText.length - (i - linkObj.tStart)); + commentText += `${linkText}`; + linkObj = {}; + } + else { + commentText += char; + } + } + return commentText; + } + }; + customElements.define("gw-comment-card", ns.CommentCard); +}) (window.GW.Controls = window.GW.Controls || {}); +const hero = document.querySelector(".hero"); + const heroTopBarEl = document.querySelector(".hero__top-bar"); + const headerImgEl = document.querySelector(".hero__img"); + + + const todayEvent = getTodayEvent(); + + if (todayEvent) { + heroTopBarEl.classList.remove('hidden'); + heroTopBarEl.innerHTML = todayEvent.blurb; + + if (todayEvent.class) { + headerImgEl.classList.add(todayEvent.class); + } + } + + function getTodayEvent() { + const date = new Date(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const year = date.getFullYear(); + const weekOfMonth = Math.ceil(day / 7); + + const leilukinsHubLaunchDate = new Date("2022-09-11").getFullYear(); + const siteAnniversary = year - leilukinsHubLaunchDate; + + if (month === 3 && day === 1) + return { + blurb: `Today is Zero Discrimination Day`, + class: "flag-progress-intersex", + }; + else if (month === 3 && day === 8) + return { + blurb: `Today is International Women's Day}`, + class: "symbol-venus", + }; + else if (month === 3 && day === 31) + return { + blurb: `Today is Trans Day of Visibility`, + class: "flag-trans", + }; + else if (month === 4 && day === 6) + return { + blurb: `Today is International Asexuality Day`, + class: "flag-ace", + }; + else if (month === 4 && day === 26) + return { + blurb: `Today is Lesbian Visibility Day`, + class: "flag-lesbian", + }; + else if (month === 4 && weekOfMonth === 4) + return { + blurb: `This week is Lesbian Visibility Week`, + class: "flag-lesbian", + }; + else if (month === 5 && day === 17) + return { + blurb: `Today is International Day Against Homophobia, Biphobia and Transphobia`, + class: "flag-progress", + }; + else if (month === 5 && day === 19) + return { + blurb: `Today is Agender Pride Day`, + class: "flag-agender", + }; + else if (month === 5 && day === 25) + return { + blurb: `Today is Pansexual and Panromantic Awareness and Visibility Day`, + class: "flag-pan", + }; + else if (month === 6) + return { + blurb: `Happy Pride Month!`, + class: "flag-progress-intersex", + }; + else if (month === 7 && day === 14) + return { + blurb: `Today is Non-Binary People's Day`, + class: "flag-non-binary", + }; + else if (month === 7 && day === 28) + return { + blurb: `Today is Leilukin's Birthday` + }; + else if (month === 7) + return{ + blurb: `Happy Disability Pride Month!`, + class: "flag-disability" + } + else if (month === 8 && day === 25) + return { + blurb: `Today is Aromantic Spectrum Visibility Day`, + class: "flag-aro", + }; + else if (month === 9 && day === 11) + return { + blurb: `Today is the ${siteAnniversary}-year anniversary of the launch of Leilukin's Hub` + }; + else if (month === 9 && day === 23) + return { + blurb: `Today is Bi Visibility Day`, + class: "flag-bi", + }; + else if (month === 10 && day === 8) + return { + blurb: `Today is International Lesbian Day`, + class: "flag-lesbian", + }; + else if (month === 10 && day === 11) + return { + blurb: `Today is National Coming Out Day`, + class: "flag-rainbow", + }; + else if (month === 10 && day === 17) + return { + blurb: `Today is the start of Genderfluid Visibility Week`, + class: "flag-genderfluid", + }; + else if (month === 10 && day === 24) + return { + blurb: `Today is the start of Ace Week`, + class: "flag-ace", + }; + else if (month === 10 && day === 26) + return { + blurb: `Today is Intersex Awareness Day`, + class: "flag-intersex", + }; + else if (month === 11 && day === 13) + return { + blurb: `Today is the start of Transgender Awareness Week`, + class: "flag-trans", + }; + else + return null; + } \ No newline at end of file diff --git a/assets/js/6W8gpmFSkt.js b/assets/js/6W8gpmFSkt.js new file mode 100644 index 00000000..acda6fdf --- /dev/null +++ b/assets/js/6W8gpmFSkt.js @@ -0,0 +1,34 @@ +const hero = document.querySelector(".hero"); + const heroTopBarEl = document.querySelector(".hero__top-bar"); + const headerImgEl = document.querySelector(".hero__img"); + + + const todayEvent = getTodayEvent(); + + if (todayEvent) { + heroTopBarEl.classList.remove('hidden'); + heroTopBarEl.innerHTML = todayEvent; + } + + function getTodayEvent() { + const date = new Date(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const year = date.getFullYear(); + + const kotor1ReleaseDate = new Date("2003-07-15").getFullYear(); + const kotor2ReleaseDate = new Date("2004-12-06").getFullYear(); + const kotor1Anniversary = year - kotor1ReleaseDate; + const kotor2Anniversary = year - kotor2ReleaseDate; + + if (month === 7 && day === 15) + return ` + Today is the ${kotor1Anniversary}-year anniversary of the release of Star Wars: Knihgts of the Old Republic + `; + else if (month === 12 && day === 6) + return ` + Today is the ${kotor2Anniversary}-year anniversary of the release of Star Wars: Knights of the Old Republic II — The Sith Lords + `; + else + return null; + } \ No newline at end of file diff --git a/assets/js/HyLrkULTf1.js b/assets/js/HyLrkULTf1.js new file mode 100644 index 00000000..02238cd3 --- /dev/null +++ b/assets/js/HyLrkULTf1.js @@ -0,0 +1,34 @@ +const hero = document.querySelector(".hero"); + const heroTopBarEl = document.querySelector(".hero__top-bar"); + const headerImgEl = document.querySelector(".hero__img"); + + + const todayEvent = getTodayEvent(); + + if (todayEvent) { + heroTopBarEl.classList.remove('hidden'); + heroTopBarEl.innerHTML = todayEvent; + } + + function getTodayEvent() { + const date = new Date(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const year = date.getFullYear(); + + const cbReleaseDate = new Date("2023-04-26").getFullYear(); + const pierReleaseDate = new Date("2023-10-04").getFullYear(); + const cbAnniversary = year - cbReleaseDate; + const pierAnniversary = year - pierReleaseDate; + + if (month === 4 && day === 26) + return ` + Today is the ${cbAnniversary}-year anniversary of the release of Cassette Beasts! + `; + else if (month === 10 && day === 4) + return ` + Today is the ${pierAnniversary}-year anniversary of the release of Pier of the Unknown, the first DLC expansion of Cassette Beasts! + `; + else + return null; + } \ No newline at end of file diff --git a/assets/js/MnPoD-suxd.js b/assets/js/MnPoD-suxd.js new file mode 100644 index 00000000..b00bb421 --- /dev/null +++ b/assets/js/MnPoD-suxd.js @@ -0,0 +1,137 @@ +const hero = document.querySelector(".hero"); + const heroTopBarEl = document.querySelector(".hero__top-bar"); + const headerImgEl = document.querySelector(".hero__img"); + + + const todayEvent = getTodayEvent(); + + if (todayEvent) { + heroTopBarEl.classList.remove('hidden'); + heroTopBarEl.innerHTML = todayEvent.blurb; + + if (todayEvent.class) { + headerImgEl.classList.add(todayEvent.class); + } + } + + function getTodayEvent() { + const date = new Date(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const year = date.getFullYear(); + const weekOfMonth = Math.ceil(day / 7); + + const leilukinsHubLaunchDate = new Date("2022-09-11").getFullYear(); + const siteAnniversary = year - leilukinsHubLaunchDate; + + if (month === 3 && day === 1) + return { + blurb: `Today is Zero Discrimination Day`, + class: "flag-progress-intersex", + }; + else if (month === 3 && day === 8) + return { + blurb: `Today is International Women's Day}`, + class: "symbol-venus", + }; + else if (month === 3 && day === 31) + return { + blurb: `Today is Trans Day of Visibility`, + class: "flag-trans", + }; + else if (month === 4 && day === 6) + return { + blurb: `Today is International Asexuality Day`, + class: "flag-ace", + }; + else if (month === 4 && day === 26) + return { + blurb: `Today is Lesbian Visibility Day`, + class: "flag-lesbian", + }; + else if (month === 4 && weekOfMonth === 4) + return { + blurb: `This week is Lesbian Visibility Week`, + class: "flag-lesbian", + }; + else if (month === 5 && day === 17) + return { + blurb: `Today is International Day Against Homophobia, Biphobia and Transphobia`, + class: "flag-progress", + }; + else if (month === 5 && day === 19) + return { + blurb: `Today is Agender Pride Day`, + class: "flag-agender", + }; + else if (month === 5 && day === 25) + return { + blurb: `Today is Pansexual and Panromantic Awareness and Visibility Day`, + class: "flag-pan", + }; + else if (month === 6) + return { + blurb: `Happy Pride Month!`, + class: "flag-progress-intersex", + }; + else if (month === 7 && day === 14) + return { + blurb: `Today is Non-Binary People's Day`, + class: "flag-non-binary", + }; + else if (month === 7 && day === 28) + return { + blurb: `Today is Leilukin's Birthday` + }; + else if (month === 7) + return{ + blurb: `Happy Disability Pride Month!`, + class: "flag-disability" + } + else if (month === 8 && day === 25) + return { + blurb: `Today is Aromantic Spectrum Visibility Day`, + class: "flag-aro", + }; + else if (month === 9 && day === 11) + return { + blurb: `Today is the ${siteAnniversary}-year anniversary of the launch of Leilukin's Hub` + }; + else if (month === 9 && day === 23) + return { + blurb: `Today is Bi Visibility Day`, + class: "flag-bi", + }; + else if (month === 10 && day === 8) + return { + blurb: `Today is International Lesbian Day`, + class: "flag-lesbian", + }; + else if (month === 10 && day === 11) + return { + blurb: `Today is National Coming Out Day`, + class: "flag-rainbow", + }; + else if (month === 10 && day === 17) + return { + blurb: `Today is the start of Genderfluid Visibility Week`, + class: "flag-genderfluid", + }; + else if (month === 10 && day === 24) + return { + blurb: `Today is the start of Ace Week`, + class: "flag-ace", + }; + else if (month === 10 && day === 26) + return { + blurb: `Today is Intersex Awareness Day`, + class: "flag-intersex", + }; + else if (month === 11 && day === 13) + return { + blurb: `Today is the start of Transgender Awareness Week`, + class: "flag-trans", + }; + else + return null; + } \ No newline at end of file diff --git a/assets/js/details-utils.js b/assets/js/details-utils.js new file mode 100644 index 00000000..5bf72107 --- /dev/null +++ b/assets/js/details-utils.js @@ -0,0 +1,367 @@ +class DetailsUtilsForceState { + constructor(detail, options = {}) { + this.options = Object.assign({ + closeClickOutside: false, // can also be a media query str + forceStateClose: false, // can also be a media query str + forceStateOpen: false, // can also be a media query str + closeEsc: false, // can also be a media query str + forceStateRestore: true, + }, options); + + this.detail = detail; + this.summary = detail.querySelector(":scope > summary"); + this._previousStates = {}; + } + + getMatchMedia(el, mq) { + if(!el) return; + if(mq && mq === true) { + return { + matches: true + }; + } + + if(mq && "matchMedia" in window) { + return window.matchMedia(mq); + } + } + + // warning: no error checking if the open/close media queries are configured wrong and overlap in weird ways + init() { + let openMatchMedia = this.getMatchMedia(this.detail, this.options.forceStateOpen); + let closeMatchMedia = this.getMatchMedia(this.detail, this.options.forceStateClose); + + // When both force-close and force-open are valid, it toggles state + if( openMatchMedia && openMatchMedia.matches && closeMatchMedia && closeMatchMedia.matches ) { + this.setState(!this.detail.open); + } else { + if( openMatchMedia && openMatchMedia.matches ) { + this.setState(true); + } + + if( closeMatchMedia && closeMatchMedia.matches ) { + this.setState(false); + } + } + + this.addListener(openMatchMedia, "for-open"); + this.addListener(closeMatchMedia, "for-close"); + } + + addListener(matchmedia, type) { + if(!matchmedia || !("addListener" in matchmedia)) { + return; + } + + // Force stated based on force-open/force-close attribute value in a media query listener + matchmedia.addListener(e => { + if(e.matches) { + this._previousStates[type] = this.detail.open; + if(this.detail.open !== (type === "for-open")) { + this.setState(type === "for-open"); + } + } else { + if(this.options.forceStateRestore && this._previousStates[type] !== undefined) { + if(this.detail.open !== this._previousStates[type]) { + this.setState(this._previousStates[type]); + } + } + } + }); + } + + + toggle() { + let clickEvent = new MouseEvent("click", { + view: window, + bubbles: true, + cancelable: true + }); + this.summary.dispatchEvent(clickEvent); + } + + triggerClickToClose() { + if(this.summary && this.options.closeClickOutside) { + this.toggle(); + } + } + + setState(setOpen) { + if( setOpen ) { + this.detail.setAttribute("open", "open"); + } else { + this.detail.removeAttribute("open"); + } + } +} + +class DetailsUtilsAnimateDetails { + constructor(detail) { + this.duration = { + open: 200, + close: 150 + }; + this.detail = detail; + this.summary = this.detail.querySelector(":scope > summary"); + + let contentTarget = this.detail.getAttribute("data-du-animate-target"); + if(contentTarget) { + this.content = this.detail.closest(contentTarget); + } + + if(!this.content) { + this.content = this.summary.nextElementSibling; + } + if(!this.content) { + // TODO wrap in an element? + throw new Error("For now requires a child element for animation."); + } + + this.summary.addEventListener("click", this.onclick.bind(this)); + } + + parseAnimationFrames(property, ...frames) { + let keyframes = []; + for(let frame of frames) { + let obj = {}; + obj[property] = frame; + keyframes.push(obj); + } + return keyframes; + } + + getKeyframes(open) { + let frames = this.parseAnimationFrames("maxHeight", "0px", `${this.getContentHeight()}px`); + if(!open) { + return frames.filter(() => true).reverse(); + } + return frames; + } + + getContentHeight() { + if(this.contentHeight) { + return this.contentHeight; + } + + // make sure it’s open before we measure otherwise it will be 0 + if(this.detail.open) { + this.contentHeight = this.content.offsetHeight; + return this.contentHeight; + } + } + + animate(open, duration) { + this.isPending = true; + let frames = this.getKeyframes(open); + this.animation = this.content.animate(frames, { + duration, + easing: "ease-out" + }); + this.detail.classList.add("details-animating") + + this.animation.finished.catch(e => {}).finally(() => { + this.isPending = false; + this.detail.classList.remove("details-animating"); + }); + + // close() has to wait to remove the [open] attribute manually until after the animation runs + // open() doesn’t have to wait, it needs [open] added before it animates + if(!open) { + this.animation.finished.catch(e => {}).finally(() => { + this.detail.removeAttribute("open"); + }); + } + } + + open() { + if(this.contentHeight) { + this.animate(true, this.duration.open); + } else { + // must wait a frame if we haven’t cached the contentHeight + requestAnimationFrame(() => this.animate(true, this.duration.open)); + } + } + + close() { + this.animate(false, this.duration.close); + } + + useAnimation() { + return "matchMedia" in window && !window.matchMedia('(prefers-reduced-motion: reduce)').matches; + } + + // happens before state change when toggling + onclick(event) { + // do nothing if the click is inside of a link + if(event.target.closest("a[href]") || !this.useAnimation()) { + return; + } + + if(this.isPending) { + if(this.animation) { + this.animation.cancel(); + } + } else if(this.detail.open) { + // cancel the click because we want to wait to remove [open] until after the animation + event.preventDefault(); + this.close(); + } else { + this.open(); + } + } +} + +class DetailsUtils extends HTMLElement { + constructor() { + super(); + + this.attrs = { + animate: "animate", + closeEsc: "close-esc", + closeClickOutside: "close-click-outside", + forceStateClose: "force-close", + forceStateOpen: "force-open", + forceStateRestore: "force-restore", + toggleDocumentClass: "toggle-document-class", + closeClickOutsideButton: "data-du-close-click", + }; + + this.options = {}; + + this._connect(); + } + + getAttributeValue(name) { + let value = this.getAttribute(name); + if(value === undefined || value === "") { + return true; + } else if(value) { + return value; + } + return false; + } + + connectedCallback() { + this._connect(); + } + + _connect() { + if (this.children.length) { + this._init(); + return; + } + + // not yet available, watch it for init + this._observer = new MutationObserver(this._init.bind(this)); + this._observer.observe(this, { childList: true }); + } + + _init() { + if(this.initialized) { + return; + } + this.initialized = true; + + this.options.closeClickOutside = this.getAttributeValue(this.attrs.closeClickOutside); + this.options.closeEsc = this.getAttributeValue(this.attrs.closeEsc); + this.options.forceStateClose = this.getAttributeValue(this.attrs.forceStateClose); + this.options.forceStateOpen = this.getAttributeValue(this.attrs.forceStateOpen); + this.options.forceStateRestore = this.getAttributeValue(this.attrs.forceStateRestore); + + // TODO support nesting + let details = Array.from(this.querySelectorAll(`:scope details`)); + for(let detail of details) { + // override initial state based on viewport (if needed) + let fs = new DetailsUtilsForceState(detail, this.options); + fs.init(); + + if(this.hasAttribute(this.attrs.animate)) { + // animate the menus + new DetailsUtilsAnimateDetails(detail); + } + } + + this.bindCloseOnEsc(details); + this.bindClickoutToClose(details); + + this.toggleDocumentClassName = this.getAttribute(this.attrs.toggleDocumentClass); + if(this.toggleDocumentClassName) { + this.bindToggleDocumentClass(details); + } + } + + bindCloseOnEsc(details) { + if(!this.options.closeEsc) { + return; + } + + document.documentElement.addEventListener("keydown", event => { + if(event.keyCode === 27) { + for(let detail of details) { + if (detail.open) { + let fs = new DetailsUtilsForceState(detail, this.options); + let mm = fs.getMatchMedia(detail, this.options.closeEsc); + if(!mm || mm && mm.matches) { + fs.toggle(); + } + } + } + } + }, false); + } + + isChildOfParent(target, parent) { + while(target && target.parentNode) { + if(target.parentNode === parent) { + return true; + } + target = target.parentNode; + } + return false; + } + + onClickoutToClose(detail, event) { + let fs = new DetailsUtilsForceState(detail, this.options); + let mm = fs.getMatchMedia(detail, this.options.closeClickOutside); + if(mm && !mm.matches) { + // don’t close if has a media query but it doesn’t match current viewport size + // useful for viewport navigation that must stay open (e.g. list of horizontal links) + return; + } + + let isCloseButton = event.target.hasAttribute(this.attrs.closeClickOutsideButton); + if((isCloseButton || !this.isChildOfParent(event.target, detail)) && detail.open) { + fs.triggerClickToClose(detail); + } + } + + bindClickoutToClose(details) { + // Note: Scoped to document + document.documentElement.addEventListener("mousedown", event => { + for(let detail of details) { + this.onClickoutToClose(detail, event); + } + }, false); + + // Note: Scoped to this element only + this.addEventListener("keypress", event => { + if(event.which === 13 || event.which === 32) { // enter, space + for(let detail of details) { + this.onClickoutToClose(detail, event); + } + } + }, false); + } + + bindToggleDocumentClass(details) { + for(let detail of details) { + detail.addEventListener("toggle", (event) => { + document.documentElement.classList.toggle( this.toggleDocumentClassName, event.target.open ); + }); + } + } +} + +if(typeof window !== "undefined" && ("customElements" in window)) { + window.customElements.define("details-utils", DetailsUtils); +} diff --git a/assets/js/tooltips.js b/assets/js/tooltips.js new file mode 100644 index 00000000..e597045a --- /dev/null +++ b/assets/js/tooltips.js @@ -0,0 +1,303 @@ +/* ARIA Tooltips by Scott O'Hara: https://github.com/scottaohara/a11y_tooltips */ + +'use strict'; + +if (typeof Object.assign != 'function') { + // Must be writable: true, enumerable: false, configurable: true + Object.defineProperty(Object, "assign", { + value: function assign(target, varArgs) { // .length of function is 2 + 'use strict'; + if (target == null) { // TypeError if undefined or null + throw new TypeError('Cannot convert undefined or null to object'); + } + + var to = Object(target); + + for (var index = 1; index < arguments.length; index++) { + var nextSource = arguments[index]; + + if (nextSource != null) { // Skip over if undefined or null + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + return to; + }, + writable: true, + configurable: true + }); +} + +var util = { + keyCodes: { + ESC: 27 + }, + + generateID: function ( base ) { + return base + Math.floor(Math.random() * 999); + } +}; + + +(function ( w, doc, undefined ) { + /** + * ARIA Tooltips + * Widget to reveal a short description, or + * the element's accessible name on hover/focus. + * + * Author: Scott O'Hara + * Version: 1.0.0 + * License: MIT + */ + + var tipConfig = { + baseID: 'tt_', + ariaHiddenTip: true, + + tipWrapperClass: 'tooltip', + tipContentClass: 'tooltip__content', + + tipTypeAttr: 'data-tooltip', + tipContentAttr: 'data-tooltip-content', + + tipSelector: '[data-tooltip-tip]', + triggerSelector: '[data-tooltip-trigger]' + }; + + + var ARIAtip = function ( inst, options ) { + var el = inst; + var elID; + var elTip; + var elTipID; + var elTrigger; + var tipContent; + var tipType; + var _options = Object.assign(tipConfig, options); + + + var init = function () { + // if an element has an ID, use that as the + // basis for the tooltip's ID. Or, generate one. + elID = el.id || util.generateID(_options.baseID); + // the element that will trigger the tooltip on hover or focus. + elTrigger = el.querySelector(_options.triggerSelector); + // base the tip's ID off from the element's tip + elTipID = elID + '_tip'; + // determine the type of tip + tipType = tipType(); + // retrieve the content for the tip (flatted text string) + tipContent = getTipContent(); + // create the tip + createTip(); + // add/modify the necessary attributes of the trigger. + setupTrigger(); + // get the generated tooltip + elTip = el.querySelector('.'+_options.tipContentClass); + // Attach the various events to the triggers + attachEvents(); + }; + + + /** + * A tooltip can either provide a description to + * the element that it is associated with, or it + * can provide a means to visually display the element's + * accessible name (making it not actually a tooltip then, + * but rather the accessible name that is revealed on + * hover/focus). + */ + var tipType = function () { + if ( el.getAttribute(_options.tipTypeAttr) === 'label' ) { + return 'label'; + } + else { + return 'description'; + } + }; + + + /** + * The content of a tooltip can come from different sources + * so as to allow for fallback content in case this script + * cannot run. + * + * A tip could be sourced from an element in the DOM via + * the attribute data-tooltip-tip (a child of the widget), + * or an ID referenced from data-tooltip-source (does not + * have to be a child of the widget), + * the trigger's title or aria-label attribute + */ + var getTipContent = function () { + var returnTextString; // text string to return + var tipAttrContent = el.getAttribute(_options.tipContentAttr); + var tipAriaLabel = elTrigger.getAttribute('aria-label'); + var widgetChild = el.querySelector(_options.tipSelector); + + if ( tipAttrContent ) { + returnTextString = tipAttrContent; + } + else if ( widgetChild ) { + returnTextString = widgetChild.textContent; + widgetChild.parentNode.removeChild(widgetChild); + } + else if ( tipAriaLabel && tipType === 'label' ) { + returnTextString = tipAriaLabel; + elTrigger.removeAttribute('aria-label'); + } + else if ( elTrigger.title ) { + returnTextString = elTrigger.title; + } + + // an element cannot have both a custom tooltip + // and a tooltip from a title attribute. So no + // matter what, remove the title attribute. + elTrigger.removeAttribute('title'); + + return returnTextString; + }; + + + /** + * Create the necessary tooltip components for each + * instance of the widget. + */ + var createTip = function () { + var tipOuter = doc.createElement('span'); + var tipInner = doc.createElement('span'); + + tipOuter.classList.add(_options.tipWrapperClass); + tipInner.classList.add(_options.tipContentClass); + tipInner.textContent = tipContent; + tipInner.id = elTipID; + + if ( tipType !== 'label') { + tipInner.setAttribute('role', 'tooltip'); + } + // this is a bit silly, as it shows how unnecessary the + // tooltip role is, but it ensures that a screen reader's + // virtual cursor cannot interact with the tooltip by itself, + // and helps reduce Chrome on PC w/JAWS and NVDA announcing the tooltip + // multiple times, when it's shown/hidden. + // If you want to reveal the tips anyway, + // set the ariaHiddenTip config to false. + if ( _options.ariaHiddenTip ) { + tipInner.setAttribute('aria-hidden', 'true'); + } + + tipOuter.appendChild(tipInner); + el.appendChild(tipOuter); + }; + + + /** + * Ensure the tooltip trigger has the appropriate + * attributes on it, and that they point to the + * correct IDs. + */ + var setupTrigger = function () { + if ( tipType === 'label' ) { + elTrigger.setAttribute('aria-labelledby', elTipID); + } + else { + elTrigger.setAttribute('aria-describedby', elTipID); + } + }; + + + /** + * Check the current viewport to determine if the tooltip + * will be revealed outside of the current viewport's bounds. + * If so, try to reposition to ensure it's within. + */ + var checkPositioning = function () { + var bounding = elTip.getBoundingClientRect(); + + if ( bounding.bottom > w.innerHeight ) { + el.classList.add('push-up'); + } + + if ( bounding.right > w.innerWidth ) { + el.classList.add('push-right'); + } + }; + + + /** + * Remove the positioning classes, assuming the next time + * the element is interacted with, it will require the + * default positioning. + */ + var resetPositioning = function () { + el.classList.remove('push-up', 'push-right'); + }; + + + /** + * Add class to show tooltip. + * Checks positioning to help ensure within viewport. + * Adds global event to escape tip. + */ + var showTip = function () { + el.classList.add(_options.tipWrapperClass + '--show'); + checkPositioning(); + doc.addEventListener('keydown', globalEscape, false); + doc.addEventListener('touchend', hideTip, false); + }; + + + /** + * Removes classes for show and/or suppressed tip. + * Removes classes for positioning. + * Removes global event to escape tip. + */ + var hideTip = function () { + el.classList.remove(_options.tipWrapperClass + '--show'); + resetPositioning(); + doc.removeEventListener('keydown', globalEscape); + doc.addEventListener('touchend', hideTip); + }; + + + /** + * Global event to allow the ESC key to close + * an invoked tooltip, regardless of where focus/hover + * is in the DOM. + * + * Calls both hideTip and suppressTip functions to help + * better replicate native tooltip suppression behavior. + */ + var globalEscape = function ( e ) { + var keyCode = e.keyCode || e.which; + + switch ( keyCode ) { + case util.keyCodes.ESC: + e.preventDefault(); + hideTip(); + break; + + default: + break; + } + }; + + + var attachEvents = function () { + elTrigger.addEventListener('mouseenter', showTip, false); + elTrigger.addEventListener('focus', showTip, false); + + el.addEventListener('mouseleave', hideTip, false); + elTrigger.addEventListener('blur', hideTip, false); + }; + + + init.call(this); + return this; + }; // ARIAtip + + w.ARIAtip = ARIAtip; +})( window, document ); \ No newline at end of file diff --git a/assets/js/u1Q464ZfAb.js b/assets/js/u1Q464ZfAb.js new file mode 100644 index 00000000..ae6b102b --- /dev/null +++ b/assets/js/u1Q464ZfAb.js @@ -0,0 +1,40 @@ +const hero = document.querySelector(".hero"); + const heroTopBarEl = document.querySelector(".hero__top-bar"); + const headerImgEl = document.querySelector(".hero__img"); + + + const todayEvent = getTodayEvent(); + + if (todayEvent) { + heroTopBarEl.classList.remove('hidden'); + heroTopBarEl.innerHTML = todayEvent; + } + + function getTodayEvent() { + const date = new Date(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const year = date.getFullYear(); + + const aseReleaseDate = new Date("2020-04-23").getFullYear(); + const aseAnniversary = year - aseReleaseDate; + + if (month === 2 && day === 16) + return ` + Today is Michelle Cheung's birthday. Happy Birthday Michelle! + `; + else if (month === 4 && day === 23) + return ` + Today is the ${aseAnniversary}-year anniversary of the release of A Summer’s End — Hong Kong 1986! + `; + else if (month === 8 && day === 9) + return ` + Today is Cecelia Cortes' birthday. Happy Birthday Cecelia! + `; + else if (month === 12 && day === 28) + return ` + Today is Sam Wong's birthday. Happy Birthday Sam! + `; + else + return null; + } \ No newline at end of file diff --git a/assets/layouts/Leilukins-Hub-blog-layout-2023-09.avif b/assets/layouts/Leilukins-Hub-blog-layout-2023-09.avif new file mode 100644 index 00000000..99f95d95 Binary files /dev/null and b/assets/layouts/Leilukins-Hub-blog-layout-2023-09.avif differ diff --git a/assets/layouts/Leilukins-Hub-blog-layout-2024-04.avif b/assets/layouts/Leilukins-Hub-blog-layout-2024-04.avif new file mode 100644 index 00000000..c4283e93 Binary files /dev/null and b/assets/layouts/Leilukins-Hub-blog-layout-2024-04.avif differ diff --git a/assets/layouts/Leilukins-Hub-layout-2022-index.avif b/assets/layouts/Leilukins-Hub-layout-2022-index.avif new file mode 100644 index 00000000..3a29d58a Binary files /dev/null and b/assets/layouts/Leilukins-Hub-layout-2022-index.avif differ diff --git a/assets/layouts/Leilukins-Hub-layout-2022-page.avif b/assets/layouts/Leilukins-Hub-layout-2022-page.avif new file mode 100644 index 00000000..5d1cc7dd Binary files /dev/null and b/assets/layouts/Leilukins-Hub-layout-2022-page.avif differ diff --git a/assets/layouts/Leilukins-Hub-layout-2023-01.avif b/assets/layouts/Leilukins-Hub-layout-2023-01.avif new file mode 100644 index 00000000..c24a118b Binary files /dev/null and b/assets/layouts/Leilukins-Hub-layout-2023-01.avif differ diff --git a/assets/layouts/Leilukins-Hub-layout-2023-06.avif b/assets/layouts/Leilukins-Hub-layout-2023-06.avif new file mode 100644 index 00000000..8d0440ff Binary files /dev/null and b/assets/layouts/Leilukins-Hub-layout-2023-06.avif differ diff --git a/assets/layouts/Leilukins-Hub-layout-2024-04.avif b/assets/layouts/Leilukins-Hub-layout-2024-04.avif new file mode 100644 index 00000000..ceb0d923 Binary files /dev/null and b/assets/layouts/Leilukins-Hub-layout-2024-04.avif differ diff --git a/assets/leilukin/Leilukins-Hub-button.png b/assets/leilukin/Leilukins-Hub-button.png new file mode 100644 index 00000000..eda445f6 Binary files /dev/null and b/assets/leilukin/Leilukins-Hub-button.png differ diff --git a/assets/leilukin/Leilukins-Hub-website-banner.avif b/assets/leilukin/Leilukins-Hub-website-banner.avif new file mode 100644 index 00000000..d5de58dc Binary files /dev/null and b/assets/leilukin/Leilukins-Hub-website-banner.avif differ diff --git a/assets/leilukin/leilukin-bee.avif b/assets/leilukin/leilukin-bee.avif new file mode 100644 index 00000000..d3415583 Binary files /dev/null and b/assets/leilukin/leilukin-bee.avif differ diff --git a/assets/projects/art/bee-diamond-hibiscus.avif b/assets/projects/art/bee-diamond-hibiscus.avif new file mode 100644 index 00000000..89d4acab Binary files /dev/null and b/assets/projects/art/bee-diamond-hibiscus.avif differ diff --git a/assets/projects/art/joltik-finds-oran-berry.avif b/assets/projects/art/joltik-finds-oran-berry.avif new file mode 100644 index 00000000..9b26787b Binary files /dev/null and b/assets/projects/art/joltik-finds-oran-berry.avif differ diff --git a/assets/projects/art/life-of-a-bee-with-pride.avif b/assets/projects/art/life-of-a-bee-with-pride.avif new file mode 100644 index 00000000..fde6afc7 Binary files /dev/null and b/assets/projects/art/life-of-a-bee-with-pride.avif differ diff --git a/assets/projects/art/pride-hibiscuses.avif b/assets/projects/art/pride-hibiscuses.avif new file mode 100644 index 00000000..f1f6398b Binary files /dev/null and b/assets/projects/art/pride-hibiscuses.avif differ diff --git a/assets/projects/kotor1mods/Bastila-and-Carth-Romance-Removal.avif b/assets/projects/kotor1mods/Bastila-and-Carth-Romance-Removal.avif new file mode 100644 index 00000000..bc76baf6 Binary files /dev/null and b/assets/projects/kotor1mods/Bastila-and-Carth-Romance-Removal.avif differ diff --git a/assets/projects/kotor1mods/Belaya-Unique-Look.avif b/assets/projects/kotor1mods/Belaya-Unique-Look.avif new file mode 100644 index 00000000..b389f220 Binary files /dev/null and b/assets/projects/kotor1mods/Belaya-Unique-Look.avif differ diff --git a/assets/projects/kotor1mods/Carth-Onasi-and-Male-PC-Romance.avif b/assets/projects/kotor1mods/Carth-Onasi-and-Male-PC-Romance.avif new file mode 100644 index 00000000..f7509f98 Binary files /dev/null and b/assets/projects/kotor1mods/Carth-Onasi-and-Male-PC-Romance.avif differ diff --git a/assets/projects/kotor1mods/Darth-Revan-Texture-for-Star-Forge-Robes.avif b/assets/projects/kotor1mods/Darth-Revan-Texture-for-Star-Forge-Robes.avif new file mode 100644 index 00000000..a37e8ac1 Binary files /dev/null and b/assets/projects/kotor1mods/Darth-Revan-Texture-for-Star-Forge-Robes.avif differ diff --git a/assets/projects/kotor1mods/Human-Xor-Restoration.avif b/assets/projects/kotor1mods/Human-Xor-Restoration.avif new file mode 100644 index 00000000..79327342 Binary files /dev/null and b/assets/projects/kotor1mods/Human-Xor-Restoration.avif differ diff --git a/assets/projects/kotor1mods/Human-Xor-Unique-Look.avif b/assets/projects/kotor1mods/Human-Xor-Unique-Look.avif new file mode 100644 index 00000000..3d6d5b57 Binary files /dev/null and b/assets/projects/kotor1mods/Human-Xor-Unique-Look.avif differ diff --git a/assets/projects/kotor1mods/Jolee-in-Unique-Outfit-Introduction.avif b/assets/projects/kotor1mods/Jolee-in-Unique-Outfit-Introduction.avif new file mode 100644 index 00000000..0ca8f084 Binary files /dev/null and b/assets/projects/kotor1mods/Jolee-in-Unique-Outfit-Introduction.avif differ diff --git a/assets/projects/kotor1mods/Juhani-Dialogue-Restoration.avif b/assets/projects/kotor1mods/Juhani-Dialogue-Restoration.avif new file mode 100644 index 00000000..c4b5fc44 Binary files /dev/null and b/assets/projects/kotor1mods/Juhani-Dialogue-Restoration.avif differ diff --git a/assets/projects/kotor1mods/K1-No-Gendered-Dialogue-Male-NPCs.avif b/assets/projects/kotor1mods/K1-No-Gendered-Dialogue-Male-NPCs.avif new file mode 100644 index 00000000..032d080f Binary files /dev/null and b/assets/projects/kotor1mods/K1-No-Gendered-Dialogue-Male-NPCs.avif differ diff --git a/assets/projects/kotor1mods/K1-Twilek-Female-NPC-Diversity.avif b/assets/projects/kotor1mods/K1-Twilek-Female-NPC-Diversity.avif new file mode 100644 index 00000000..59e01ff1 Binary files /dev/null and b/assets/projects/kotor1mods/K1-Twilek-Female-NPC-Diversity.avif differ diff --git a/assets/projects/kotor1mods/K1-Twilek-Male-NPC-Diversity.avif b/assets/projects/kotor1mods/K1-Twilek-Male-NPC-Diversity.avif new file mode 100644 index 00000000..bae04c13 Binary files /dev/null and b/assets/projects/kotor1mods/K1-Twilek-Male-NPC-Diversity.avif differ diff --git a/assets/projects/kotor1mods/KotOR-1-Improved-Party-Outfits.avif b/assets/projects/kotor1mods/KotOR-1-Improved-Party-Outfits.avif new file mode 100644 index 00000000..c779dc76 Binary files /dev/null and b/assets/projects/kotor1mods/KotOR-1-Improved-Party-Outfits.avif differ diff --git a/assets/projects/kotor1mods/Leilukins-Juhanis-Outfit-Reskin-Pack.avif b/assets/projects/kotor1mods/Leilukins-Juhanis-Outfit-Reskin-Pack.avif new file mode 100644 index 00000000..16c99789 Binary files /dev/null and b/assets/projects/kotor1mods/Leilukins-Juhanis-Outfit-Reskin-Pack.avif differ diff --git a/assets/projects/kotor1mods/Mysterious-Box-Music-for-Unknown-World.avif b/assets/projects/kotor1mods/Mysterious-Box-Music-for-Unknown-World.avif new file mode 100644 index 00000000..eaaf7c36 Binary files /dev/null and b/assets/projects/kotor1mods/Mysterious-Box-Music-for-Unknown-World.avif differ diff --git a/assets/projects/kotor1mods/PC-Dialogue-with-Daviks-Slaves-Change.avif b/assets/projects/kotor1mods/PC-Dialogue-with-Daviks-Slaves-Change.avif new file mode 100644 index 00000000..b39ef334 Binary files /dev/null and b/assets/projects/kotor1mods/PC-Dialogue-with-Daviks-Slaves-Change.avif differ diff --git a/assets/projects/kotor1mods/Trask-Ulgo-Without-Tutorials.avif b/assets/projects/kotor1mods/Trask-Ulgo-Without-Tutorials.avif new file mode 100644 index 00000000..4486742a Binary files /dev/null and b/assets/projects/kotor1mods/Trask-Ulgo-Without-Tutorials.avif differ diff --git a/assets/projects/kotor2mods/Alternate-Revan-Romances.avif b/assets/projects/kotor2mods/Alternate-Revan-Romances.avif new file mode 100644 index 00000000..5219cd07 Binary files /dev/null and b/assets/projects/kotor2mods/Alternate-Revan-Romances.avif differ diff --git a/assets/projects/kotor2mods/Atton-Rand-and-Male-Exile-Romance.avif b/assets/projects/kotor2mods/Atton-Rand-and-Male-Exile-Romance.avif new file mode 100644 index 00000000..a8199e60 Binary files /dev/null and b/assets/projects/kotor2mods/Atton-Rand-and-Male-Exile-Romance.avif differ diff --git a/assets/projects/kotor2mods/Dahnis-Flirt-Option-for-Female-PC.avif b/assets/projects/kotor2mods/Dahnis-Flirt-Option-for-Female-PC.avif new file mode 100644 index 00000000..f6fd16ba Binary files /dev/null and b/assets/projects/kotor2mods/Dahnis-Flirt-Option-for-Female-PC.avif differ diff --git a/assets/projects/kotor2mods/Dahnis-Unique-Look.avif b/assets/projects/kotor2mods/Dahnis-Unique-Look.avif new file mode 100644 index 00000000..5af1deaa Binary files /dev/null and b/assets/projects/kotor2mods/Dahnis-Unique-Look.avif differ diff --git a/assets/projects/kotor2mods/Darth-Sion-and-Male-Exile-Mod.avif b/assets/projects/kotor2mods/Darth-Sion-and-Male-Exile-Mod.avif new file mode 100644 index 00000000..9b63e30f Binary files /dev/null and b/assets/projects/kotor2mods/Darth-Sion-and-Male-Exile-Mod.avif differ diff --git a/assets/projects/kotor2mods/Exiles-Trial-Overlay-Removal.avif b/assets/projects/kotor2mods/Exiles-Trial-Overlay-Removal.avif new file mode 100644 index 00000000..49bd286d Binary files /dev/null and b/assets/projects/kotor2mods/Exiles-Trial-Overlay-Removal.avif differ diff --git a/assets/projects/kotor2mods/Handmaiden-Disciple-Same-Gender-Romances.avif b/assets/projects/kotor2mods/Handmaiden-Disciple-Same-Gender-Romances.avif new file mode 100644 index 00000000..83256ff8 Binary files /dev/null and b/assets/projects/kotor2mods/Handmaiden-Disciple-Same-Gender-Romances.avif differ diff --git a/assets/projects/kotor2mods/Juhani-Item-Pack-for-TSL.avif b/assets/projects/kotor2mods/Juhani-Item-Pack-for-TSL.avif new file mode 100644 index 00000000..62134de0 Binary files /dev/null and b/assets/projects/kotor2mods/Juhani-Item-Pack-for-TSL.avif differ diff --git a/assets/projects/kotor2mods/Leilukins-Kreia-Reskin.avif b/assets/projects/kotor2mods/Leilukins-Kreia-Reskin.avif new file mode 100644 index 00000000..9f59b113 Binary files /dev/null and b/assets/projects/kotor2mods/Leilukins-Kreia-Reskin.avif differ diff --git a/assets/projects/kotor2mods/Lonna-Vash-Mod-for-TSLRCM.avif b/assets/projects/kotor2mods/Lonna-Vash-Mod-for-TSLRCM.avif new file mode 100644 index 00000000..ae4f139b Binary files /dev/null and b/assets/projects/kotor2mods/Lonna-Vash-Mod-for-TSLRCM.avif differ diff --git a/assets/projects/kotor2mods/Love-Between-Brianna-and-the-Exile-TSLRCM.avif b/assets/projects/kotor2mods/Love-Between-Brianna-and-the-Exile-TSLRCM.avif new file mode 100644 index 00000000..8ed68d7e Binary files /dev/null and b/assets/projects/kotor2mods/Love-Between-Brianna-and-the-Exile-TSLRCM.avif differ diff --git a/assets/projects/kotor2mods/No-Jealousy-Lock-Handmaiden.avif b/assets/projects/kotor2mods/No-Jealousy-Lock-Handmaiden.avif new file mode 100644 index 00000000..195a4924 Binary files /dev/null and b/assets/projects/kotor2mods/No-Jealousy-Lock-Handmaiden.avif differ diff --git a/assets/projects/kotor2mods/PartySwap-ExtEnclave-Comp-Patch.avif b/assets/projects/kotor2mods/PartySwap-ExtEnclave-Comp-Patch.avif new file mode 100644 index 00000000..c90b4dea Binary files /dev/null and b/assets/projects/kotor2mods/PartySwap-ExtEnclave-Comp-Patch.avif differ diff --git a/assets/projects/kotor2mods/PartySwap.avif b/assets/projects/kotor2mods/PartySwap.avif new file mode 100644 index 00000000..bb5dde19 Binary files /dev/null and b/assets/projects/kotor2mods/PartySwap.avif differ diff --git a/assets/projects/kotor2mods/Prologue-Item-Recovery.avif b/assets/projects/kotor2mods/Prologue-Item-Recovery.avif new file mode 100644 index 00000000..97867370 Binary files /dev/null and b/assets/projects/kotor2mods/Prologue-Item-Recovery.avif differ diff --git a/assets/projects/kotor2mods/Remote-Tells-Influence-Patch.avif b/assets/projects/kotor2mods/Remote-Tells-Influence-Patch.avif new file mode 100644 index 00000000..c4a76594 Binary files /dev/null and b/assets/projects/kotor2mods/Remote-Tells-Influence-Patch.avif differ diff --git a/assets/projects/kotor2mods/TSL-Improved-Party-Outfits.avif b/assets/projects/kotor2mods/TSL-Improved-Party-Outfits.avif new file mode 100644 index 00000000..3666e56c Binary files /dev/null and b/assets/projects/kotor2mods/TSL-Improved-Party-Outfits.avif differ diff --git a/assets/projects/kotor2mods/TSL-Twilek-Male-NPC-Diversity.avif b/assets/projects/kotor2mods/TSL-Twilek-Male-NPC-Diversity.avif new file mode 100644 index 00000000..20924dd4 Binary files /dev/null and b/assets/projects/kotor2mods/TSL-Twilek-Male-NPC-Diversity.avif differ diff --git a/assets/projects/kotor2mods/TSL-Workbnch-Lightsaber-Creation.avif b/assets/projects/kotor2mods/TSL-Workbnch-Lightsaber-Creation.avif new file mode 100644 index 00000000..01f43922 Binary files /dev/null and b/assets/projects/kotor2mods/TSL-Workbnch-Lightsaber-Creation.avif differ diff --git a/assets/projects/kotor2mods/Visas-Marr-and-Female-Exile-Romance.avif b/assets/projects/kotor2mods/Visas-Marr-and-Female-Exile-Romance.avif new file mode 100644 index 00000000..e55b1299 Binary files /dev/null and b/assets/projects/kotor2mods/Visas-Marr-and-Female-Exile-Romance.avif differ diff --git a/assets/projects/kotor2mods/Visas-Visible-Jedi-Robes.avif b/assets/projects/kotor2mods/Visas-Visible-Jedi-Robes.avif new file mode 100644 index 00000000..a5bba2d7 Binary files /dev/null and b/assets/projects/kotor2mods/Visas-Visible-Jedi-Robes.avif differ diff --git a/assets/projects/playlists/Mandopop-LGBTQ+-Anthem-Cover.avif b/assets/projects/playlists/Mandopop-LGBTQ+-Anthem-Cover.avif new file mode 100644 index 00000000..68baec74 Binary files /dev/null and b/assets/projects/playlists/Mandopop-LGBTQ+-Anthem-Cover.avif differ diff --git a/assets/projects/playlists/My-Dear-Summer-Lover-cover.avif b/assets/projects/playlists/My-Dear-Summer-Lover-cover.avif new file mode 100644 index 00000000..3993e14b Binary files /dev/null and b/assets/projects/playlists/My-Dear-Summer-Lover-cover.avif differ diff --git a/assets/shrines/asummersend/images/ASE_Key_art_intro.avif b/assets/shrines/asummersend/images/ASE_Key_art_intro.avif new file mode 100644 index 00000000..e3e98978 Binary files /dev/null and b/assets/shrines/asummersend/images/ASE_Key_art_intro.avif differ diff --git a/assets/shrines/asummersend/images/ASE_Key_art_main.avif b/assets/shrines/asummersend/images/ASE_Key_art_main.avif new file mode 100644 index 00000000..f656d9ad Binary files /dev/null and b/assets/shrines/asummersend/images/ASE_Key_art_main.avif differ diff --git a/assets/shrines/asummersend/images/ase-icon.png b/assets/shrines/asummersend/images/ase-icon.png new file mode 100644 index 00000000..7537db27 Binary files /dev/null and b/assets/shrines/asummersend/images/ase-icon.png differ diff --git a/assets/shrines/asummersend/images/asummersend-header-320.avif b/assets/shrines/asummersend/images/asummersend-header-320.avif new file mode 100644 index 00000000..4e80bdc2 Binary files /dev/null and b/assets/shrines/asummersend/images/asummersend-header-320.avif differ diff --git a/assets/shrines/asummersend/images/asummersend-header.avif b/assets/shrines/asummersend/images/asummersend-header.avif new file mode 100644 index 00000000..dabddaf2 Binary files /dev/null and b/assets/shrines/asummersend/images/asummersend-header.avif differ diff --git a/assets/shrines/asummersend/screenshots/ASE-Screenshot-01.avif b/assets/shrines/asummersend/screenshots/ASE-Screenshot-01.avif new file mode 100644 index 00000000..8c982619 Binary files /dev/null and b/assets/shrines/asummersend/screenshots/ASE-Screenshot-01.avif differ diff --git a/assets/shrines/asummersend/screenshots/ASE-Screenshot-02.avif b/assets/shrines/asummersend/screenshots/ASE-Screenshot-02.avif new file mode 100644 index 00000000..93069133 Binary files /dev/null and b/assets/shrines/asummersend/screenshots/ASE-Screenshot-02.avif differ diff --git a/assets/shrines/asummersend/screenshots/ASE-Screenshot-03.avif b/assets/shrines/asummersend/screenshots/ASE-Screenshot-03.avif new file mode 100644 index 00000000..a8b20a28 Binary files /dev/null and b/assets/shrines/asummersend/screenshots/ASE-Screenshot-03.avif differ diff --git a/assets/shrines/asummersend/screenshots/ASE-Screenshot-04.avif b/assets/shrines/asummersend/screenshots/ASE-Screenshot-04.avif new file mode 100644 index 00000000..d6084c34 Binary files /dev/null and b/assets/shrines/asummersend/screenshots/ASE-Screenshot-04.avif differ diff --git a/assets/shrines/asummersend/screenshots/ASE-Screenshot-05.avif b/assets/shrines/asummersend/screenshots/ASE-Screenshot-05.avif new file mode 100644 index 00000000..1b3a4973 Binary files /dev/null and b/assets/shrines/asummersend/screenshots/ASE-Screenshot-05.avif differ diff --git a/assets/shrines/asummersend/screenshots/ASE-Screenshot-06.avif b/assets/shrines/asummersend/screenshots/ASE-Screenshot-06.avif new file mode 100644 index 00000000..90e90177 Binary files /dev/null and b/assets/shrines/asummersend/screenshots/ASE-Screenshot-06.avif differ diff --git a/assets/shrines/asummersend/screenshots/ASE-Screenshot-07.avif b/assets/shrines/asummersend/screenshots/ASE-Screenshot-07.avif new file mode 100644 index 00000000..450203e4 Binary files /dev/null and b/assets/shrines/asummersend/screenshots/ASE-Screenshot-07.avif differ diff --git a/assets/shrines/asummersend/screenshots/ASE-Screenshot-08.avif b/assets/shrines/asummersend/screenshots/ASE-Screenshot-08.avif new file mode 100644 index 00000000..7f29a3b1 Binary files /dev/null and b/assets/shrines/asummersend/screenshots/ASE-Screenshot-08.avif differ diff --git a/assets/shrines/asummersend/screenshots/ASE-Screenshot-09.avif b/assets/shrines/asummersend/screenshots/ASE-Screenshot-09.avif new file mode 100644 index 00000000..163593ff Binary files /dev/null and b/assets/shrines/asummersend/screenshots/ASE-Screenshot-09.avif differ diff --git a/assets/shrines/cassettebeasts/gamelog/cb-character-kristine.avif b/assets/shrines/cassettebeasts/gamelog/cb-character-kristine.avif new file mode 100644 index 00000000..e64a0e64 Binary files /dev/null and b/assets/shrines/cassettebeasts/gamelog/cb-character-kristine.avif differ diff --git a/assets/shrines/cassettebeasts/images/CassetteBeasts_keyart_16_9.avif b/assets/shrines/cassettebeasts/images/CassetteBeasts_keyart_16_9.avif new file mode 100644 index 00000000..d36505ac Binary files /dev/null and b/assets/shrines/cassettebeasts/images/CassetteBeasts_keyart_16_9.avif differ diff --git a/assets/shrines/cassettebeasts/images/cassettebeasts-header-320.avif b/assets/shrines/cassettebeasts/images/cassettebeasts-header-320.avif new file mode 100644 index 00000000..b99b18e1 Binary files /dev/null and b/assets/shrines/cassettebeasts/images/cassettebeasts-header-320.avif differ diff --git a/assets/shrines/cassettebeasts/images/cassettebeasts-header-640.avif b/assets/shrines/cassettebeasts/images/cassettebeasts-header-640.avif new file mode 100644 index 00000000..b50919bf Binary files /dev/null and b/assets/shrines/cassettebeasts/images/cassettebeasts-header-640.avif differ diff --git a/assets/shrines/cassettebeasts/images/cassettebeasts-website-header-bg.avif b/assets/shrines/cassettebeasts/images/cassettebeasts-website-header-bg.avif new file mode 100644 index 00000000..f52279e0 Binary files /dev/null and b/assets/shrines/cassettebeasts/images/cassettebeasts-website-header-bg.avif differ diff --git a/assets/shrines/cassettebeasts/images/cassettebeasts-website_screenshot_02.avif b/assets/shrines/cassettebeasts/images/cassettebeasts-website_screenshot_02.avif new file mode 100644 index 00000000..7f83d04a Binary files /dev/null and b/assets/shrines/cassettebeasts/images/cassettebeasts-website_screenshot_02.avif differ diff --git a/assets/shrines/cassettebeasts/images/cassettebeasts-website_screenshot_07.avif b/assets/shrines/cassettebeasts/images/cassettebeasts-website_screenshot_07.avif new file mode 100644 index 00000000..b80cf2d3 Binary files /dev/null and b/assets/shrines/cassettebeasts/images/cassettebeasts-website_screenshot_07.avif differ diff --git a/assets/shrines/cassettebeasts/images/cb-icon.png b/assets/shrines/cassettebeasts/images/cb-icon.png new file mode 100644 index 00000000..c669c0f1 Binary files /dev/null and b/assets/shrines/cassettebeasts/images/cb-icon.png differ diff --git a/assets/shrines/cassettebeasts/socmed/Screenshot-2023-10-05-at-14-27-39-Lockstin-on-X.avif b/assets/shrines/cassettebeasts/socmed/Screenshot-2023-10-05-at-14-27-39-Lockstin-on-X.avif new file mode 100644 index 00000000..aa542d8d Binary files /dev/null and b/assets/shrines/cassettebeasts/socmed/Screenshot-2023-10-05-at-14-27-39-Lockstin-on-X.avif differ diff --git a/assets/shrines/starwarskotor/articles/juhani-lesbian-in-game-evidence.avif b/assets/shrines/starwarskotor/articles/juhani-lesbian-in-game-evidence.avif new file mode 100644 index 00000000..548956ab Binary files /dev/null and b/assets/shrines/starwarskotor/articles/juhani-lesbian-in-game-evidence.avif differ diff --git a/assets/shrines/starwarskotor/articles/partyswap-ownership-takeover.avif b/assets/shrines/starwarskotor/articles/partyswap-ownership-takeover.avif new file mode 100644 index 00000000..276dcc89 Binary files /dev/null and b/assets/shrines/starwarskotor/articles/partyswap-ownership-takeover.avif differ diff --git a/assets/shrines/starwarskotor/images/kotor-icon.png b/assets/shrines/starwarskotor/images/kotor-icon.png new file mode 100644 index 00000000..fab645c7 Binary files /dev/null and b/assets/shrines/starwarskotor/images/kotor-icon.png differ diff --git a/assets/shrines/starwarskotor/images/swkotor-header-320.avif b/assets/shrines/starwarskotor/images/swkotor-header-320.avif new file mode 100644 index 00000000..aa78ea0d Binary files /dev/null and b/assets/shrines/starwarskotor/images/swkotor-header-320.avif differ diff --git a/assets/shrines/starwarskotor/images/swkotor-header.avif b/assets/shrines/starwarskotor/images/swkotor-header.avif new file mode 100644 index 00000000..2b99d641 Binary files /dev/null and b/assets/shrines/starwarskotor/images/swkotor-header.avif differ diff --git a/assets/shrines/starwarskotor/universes/myexile-yunhua-yang.avif b/assets/shrines/starwarskotor/universes/myexile-yunhua-yang.avif new file mode 100644 index 00000000..9c7247ee Binary files /dev/null and b/assets/shrines/starwarskotor/universes/myexile-yunhua-yang.avif differ diff --git a/assets/shrines/starwarskotor/universes/myrevan-jiaxuan-cheng.avif b/assets/shrines/starwarskotor/universes/myrevan-jiaxuan-cheng.avif new file mode 100644 index 00000000..cd130562 Binary files /dev/null and b/assets/shrines/starwarskotor/universes/myrevan-jiaxuan-cheng.avif differ diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 00000000..5d2b8162 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,646 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Welcome to Leilukin's Hub Blog!

+ + + +

Blog hosted on Leilukin's pwesonal website.

+ + +
+ + + + + + +
+ +
+

Other Blogs

+

Leilukin's Hub also has a tumbleblog at tumbleblog.leilukin.com, where I make shorter or more casual posts, as well as sharing stuff that I found interesting or inspirational. Feel free to check it out!

+
+ +
+

Blog Posts

+ + + + + + + + + + + +
+ + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/page/2/index.html b/blog/page/2/index.html new file mode 100644 index 00000000..f8842bd1 --- /dev/null +++ b/blog/page/2/index.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Welcome to Leilukin's Hub Blog!

+ + + +

Blog hosted on Leilukin's pwesonal website.

+ + +
+ + + + + + +
+ +
+

Other Blogs

+

Leilukin's Hub also has a tumbleblog at tumbleblog.leilukin.com, where I make shorter or more casual posts, as well as sharing stuff that I found interesting or inspirational. Feel free to check it out!

+
+ +
+

Blog Posts

+ + + + + + + + + + + +
+ + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/page/3/index.html b/blog/page/3/index.html new file mode 100644 index 00000000..a05d5903 --- /dev/null +++ b/blog/page/3/index.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Welcome to Leilukin's Hub Blog!

+ + + +

Blog hosted on Leilukin's pwesonal website.

+ + +
+ + + + + + +
+ +
+

Other Blogs

+

Leilukin's Hub also has a tumbleblog at tumbleblog.leilukin.com, where I make shorter or more casual posts, as well as sharing stuff that I found interesting or inspirational. Feel free to check it out!

+
+ +
+

Blog Posts

+ + + + + + + + + + + +
+ + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/page/4/index.html b/blog/page/4/index.html new file mode 100644 index 00000000..ae55716e --- /dev/null +++ b/blog/page/4/index.html @@ -0,0 +1,647 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Welcome to Leilukin's Hub Blog!

+ + + +

Blog hosted on Leilukin's pwesonal website.

+ + +
+ + + + + + +
+ +
+

Other Blogs

+

Leilukin's Hub also has a tumbleblog at tumbleblog.leilukin.com, where I make shorter or more casual posts, as well as sharing stuff that I found interesting or inspirational. Feel free to check it out!

+
+ +
+

Blog Posts

+ + + + + + + + + + + +
+ + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-01-26-new-year-leilukins-hub-redesign/index.html b/blog/posts/2023-01-26-new-year-leilukins-hub-redesign/index.html new file mode 100644 index 00000000..92e13c36 --- /dev/null +++ b/blog/posts/2023-01-26-new-year-leilukins-hub-redesign/index.html @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2023 New Year Redesign of Leilukin's Hub | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

2023 New Year Redesign of Leilukin's Hub

+ + + + +
+ + + + + + +
+

A screenshot of Leilukin's Hub home page, with its layout design released on January 26, 2023

+

In light of a new year, the Leilukin's Hub website has received a new design on 26 January 2023!

+

I have wanted to rewrite and redesign this site after learning HTML and CSS more and getting better at writing those languages. With Visual Studio Code and the Live Server extension installed, I have also finally found a good workflow for me to write and test HTML and CSS.

+

Looking at other Neocities websites have also given me more ideas in enhancing my own website. Special thanks to sadgrl.online, whose various web building resources, including the Layout Builder, have helped tremendously in redesigning this site.

+

With this 2023 new year redesign of this website, the index page, which is for when you visit the link leilukin.neocities.org, you will be presented with a very simple splash page, but when you click the "Enter" button to enter, you will be brought to my website's home page, and can start properly browsing my website, and enjoying the new design!

+

Highlights of the 2023 New Year redesign of Leilukin's Hub:

+
    +
  • Uses purple colour schemes primarily, as purple is one of my favourite colours.
  • +
  • Each page category has their own CSS file, allowing me to give certain pages unique elements. However, the site still has a main CSS file to be imported into CSS files of other pages, saving me time to edit the CSS files one by one just to tweak a certain part of the main layout design.
  • +
  • Background image added.
  • +
  • Sidebars added, with the contents being sticky, so you can still see them while scrolling through.
  • +
  • The navigation links are now on the right sidebar. Previously, the navigation links of my website are in a row placed at the header section.
  • +
  • The table of contents of some of my pages is now placed on the left sidebar.
  • +
  • The website changelog page adds archives for the layout designs of this site and old changelog.
  • +
  • My video game mod pages have added a filter function, so you can use buttons to view a specific category of mods.
  • +
+

After spending many hours on this site redesign, I am very pleased with how it turns out. Hope you enjoy it!

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-01-28-leilukins-hub-now-has-a-blog/index.html b/blog/posts/2023-01-28-leilukins-hub-now-has-a-blog/index.html new file mode 100644 index 00000000..39c3c8ce --- /dev/null +++ b/blog/posts/2023-01-28-leilukins-hub-now-has-a-blog/index.html @@ -0,0 +1,508 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Leilukin's Hub Now has a Blog! | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Leilukin's Hub Now has a Blog!

+ + + + +
+ + + + + + +
+

I finally built a blog on my own website!

+

After launching this site in September 2022, I had been considering setting up a blog here, as I want a blog that is hosted on my own site, but it was not until I discovered Zonelets, a HTML blogging engine created with Neocities in mind, and it was exactly what I was looking for to build a blog on my own Neocities site: it is simple enough for beginners to use, yet also open for more customisation and flexibility for users who have enough knowledge about HTML, CSS and JavaScript.

+

My site does have an articles section, but what makes this blog different from the articles is that the articles are meant to be timeless, sort of like my public statements for certain topics, while posts from this blog are more like journals or reactions to a timely subject.

+

Welcome to my blog! Hope you enjoy your stay on this blog and my website!

+

UPDATE on 16 April 2024: +After discovering the static site generator Eleventy, I decided to rebuild my entire website, including this blog, with Eleventy. Therefore, I no longer use Zonelets, and now this blog is powered by Eleventy.

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-05-09-onboard-the-dracula-daily-hype-train/index.html b/blog/posts/2023-05-09-onboard-the-dracula-daily-hype-train/index.html new file mode 100644 index 00000000..385d3755 --- /dev/null +++ b/blog/posts/2023-05-09-onboard-the-dracula-daily-hype-train/index.html @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Onboard the Dracula Daily Hype Train | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Onboard the Dracula Daily Hype Train

+ + + + +
+ + + + + + +
+

Dracula Daily, the free subscription newsletter that sends Bram Stoker's 1897 novel Dracula to subscribers via email, became an internet sensation, especially on Tumblr. Some of my Tumblr mutuals were also on the hype train, though I missed it.

+

Fortunately, Dracula Daily returns in 2023, so I decided to sign up to subscribe to the newsletter and join the hype. This year, Re: Dracula, the audio drama podcast adaptation of Dracula, also debuts. Like Dracula Daily, Re: Dracula releases new entries in as close to real time as it happens, meaning you can now enjoy Dracula Daily in audio form as well, with excellent voice acting and sound design to enhance the experience.

+

Confession: This is actually my first time reading Dracula, so I am looking forward to this serialised way of reading the novel!

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-06-23-june-2023-leilukins-hub-layout-rewrite/index.html b/blog/posts/2023-06-23-june-2023-leilukins-hub-layout-rewrite/index.html new file mode 100644 index 00000000..77262e28 --- /dev/null +++ b/blog/posts/2023-06-23-june-2023-leilukins-hub-layout-rewrite/index.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + June 2023 Leilukin's Hub Layout Rewrite | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

June 2023 Leilukin's Hub Layout Rewrite

+ + + + +
+ + + + + + +
+

A screenshot of Leilukin's Hub home page, with its new layout released on June 23, 2023

+

Happy Pride Month! It is always Pride on this literally queer-coded (as in, literally coded by a queer person) website, so Leilukin's Hub decided to celebrate Pride Month with a major update — rewriting the entire website's layout!

+

This new layout remains the same colour scheme as the previous one, which went live in January this year. The most noticeable change you would see in this new layout is the sticky navigation bar, a feature that previously only existed in my shrines. However, under the hood the HTML, CSS and JavaScript all have been rewritten from the ground up to optimise the site's layout.

+

Highlights of the June 2023 layout rewrite of Leilukin's Hub:

+
    +
  • A new navigation bar throughout the entire website, instead of putting links to this site's pages on the sidebar. The design of this navigation bar is inspired by the dropdown menu bar at the end of this article: 6 Best Practices for Building Responsive Dropdown Menus.
  • +
  • Rewrite the HTML elements to improve the website's layout.
  • +
  • Use a mobile-first workflow to rewrite the CSS of this website to make the website more responsive to various screen sizes (mobile, tablet and desktop).
  • +
  • Streamline the CSS of the main parts of the site into one CSS file. The only pages that also have their own CSS due to unique elements with custom classes exclusive to the pages are my mod pages. The shrines still have their own CSS files, however.
  • +
  • Use Andy Bell's modern CSS reset for the CSS of the entire website.
  • +
  • The header, navigation bar and footer have their own scripts to dynamically render the content of these elements with JavaScript's innerHTML property.
  • +
  • Add a "Back to top" link to the footer to quickly scroll back to the top of the page you are viewing
  • +
+

Rewriting the layout of this entire website has taken me many hours on this site redesign. Nevertheless, I am very pleased with how it turns out. Enjoy!

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-07-28-my-first-birthday-after-the-launch-of-leilukins-hub/index.html b/blog/posts/2023-07-28-my-first-birthday-after-the-launch-of-leilukins-hub/index.html new file mode 100644 index 00000000..2a1097a6 --- /dev/null +++ b/blog/posts/2023-07-28-my-first-birthday-after-the-launch-of-leilukins-hub/index.html @@ -0,0 +1,507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + My First Birthday After the Launch of Leilukin's Hub | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

My First Birthday After the Launch of Leilukin's Hub

+ + + + +
+ + + + + + +
+

28 July is my birthday, and in 2023, it also marks my first birthday after the launch of this personal website. I have had a nice birthday this year.

+

I spent the moments counting down to my birthday by playing Cassette Beasts, which has become one of my all-time favourite video games, to the extent that I am planning to make a shrine for it on this site. I defeated Lamento Mori, who in the lore of Cassette Beasts is an Archangel, one of the eldritch entities in the game's settings, that specifically embodies humanity's fear of death. It is both amusing and poetic that I celebrated the countdown to my birthday by defeating a boss in a video game that represents death.

+

Since I have been playing and loving Cassette Beasts, and I want to support indie developers of indie games I love, I decided to purchase the Deluxe Edition on Steam, which includes the soundtrack, the art book and the Cosplay Pack as a birthday gift for myself. I received the base game as a Steam gift from a friend, and now I chose to use my money to support the developers myself as well. Not to mention, the music of Cassette Beasts is amazing. "Same Old Story", the battle theme of the Archangels, in particular, has become one of my all-time favourite battle themes in video games.

+

I had my birthday celebration with my family and received birthday wishes from friends.

+

Happy Birthday to me!

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-09-11-happy-1st-anniversary-to-leilukins-hub/index.html b/blog/posts/2023-09-11-happy-1st-anniversary-to-leilukins-hub/index.html new file mode 100644 index 00000000..f49975ba --- /dev/null +++ b/blog/posts/2023-09-11-happy-1st-anniversary-to-leilukins-hub/index.html @@ -0,0 +1,508 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Happy 1st Anniversary to Leilukin's Hub | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Happy 1st Anniversary to Leilukin's Hub

+ + + + +
+ + + + + + +
+

11 September 2023 marks the first anniversary of Leilukin's Hub, my personal website, hosted on Neocities. I am proud to be able to succeed in not only building my own website, but also updating, improving and maintaining my website to achieve my vision for my own personal hub on the internet outside social media platforms.

+

I registered a Neocities account on 28 May 2022, while my own website, Leilukin's Hub, was officially launched on 11 September 2022. I set up this website because I wanted to have a personal web page outside social media platforms to gather various stuff and resources I had created or compiled on online spaces throughout the years. Furthermore, I settled for Neocities because I like the flexibility of customisation by coding my website with HTML, CSS and JavaScript. Initially, I considered and tried Carrd to create my web pages, but free accounts on Carrd can only add up to 100 elements on a web page, which is not enough for my purpose.

+

This site's changelog and layout archive document the evolution of Leilukin's Hub throughout the past year: from the humble beginning of a simple black background with white text and light brown titles, to the responsive, mobile-friendly, full-fledged personal website with its own site button, RSS feed, a blog and multiple shrines.

+

Coding my own website was also an excellent way to put my HTML and CSS knowledge and skills into good use. I already had basic knowledge of HTML and CSS from what I learned from my teenage years of customising my blog on Blogger.

+

Working on Leilukin's Hub had ignited my interest in coding, so I took courses to learn more about HTML, CSS, JavaScript and more about coding, and in turn, I put my new coding knowledge into good use by improving and adding more features to Leilukin's Hub, which was totally worth it. Therefore, I have also compiled resources for building websites here for those who need it.

+

You may feel intimidated by the idea of building your website because you do not know how to code, but good news! There are plenty of resources for you to learn HTML, CSS and JavaScript, including free courses. Neocities also has its own HTML course for you to get started. Happy coding!

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-10-13-my-cassette-beasts-pombomb-plushie-arrived/index.html b/blog/posts/2023-10-13-my-cassette-beasts-pombomb-plushie-arrived/index.html new file mode 100644 index 00000000..3a4ca381 --- /dev/null +++ b/blog/posts/2023-10-13-my-cassette-beasts-pombomb-plushie-arrived/index.html @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + My Cassette Beasts Pombomb Plushie Arrived! | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

My Cassette Beasts Pombomb Plushie Arrived!

+ + + + +
+ + + + + + +
+

YAAAYYYYYYYY! I finally received my Pombomb plushie on 11 October 2023!

+

Official Cassette Beasts Pombom plushie wrapped in a plastic bag

+

Side view of the official Cassette Beasts Pombom plushie

+

Front view of the official Cassette Beasts Pombom plushie

+

Back view of the official Cassette Beasts Pombom plushie

+

(Original uncompressed photos can be viewed in my Pombomb plushie gallery on Postimage)

+

Cassette Beasts has become my favourite monster collecting game and one of my all-time favourite games since the first time I played it. In fact, I have created a Cassette Beasts shrine on my own website here. Among the monsters from Cassette Beasts, Pombomb is one of my favourites.

+

I love Cassette Beasts and Pombomb so much that I am willing to spend money on not only the official Pombomb plushie itself, but also the shipping fee to import it to my region. It took a month for this cutie to arrive at my home, but it is worth the wait!

+

The plushie is very well-made; it is firm decently sized.

+

Even better, when I shared my Pombomb plushie, Bytten Studio, the developer of Cassette Beasts retweeted me!

+ +

Screenshot of ByttenStudio's retweet of Leilukin's Cassette Beasts Pombomb plushie

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-10-30-support-for-my-steam-review-of-a-summers-end/index.html b/blog/posts/2023-10-30-support-for-my-steam-review-of-a-summers-end/index.html new file mode 100644 index 00000000..3822d1f6 --- /dev/null +++ b/blog/posts/2023-10-30-support-for-my-steam-review-of-a-summers-end/index.html @@ -0,0 +1,517 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Support for My Steam Review of A Summer’s End — Hong Kong 1986 | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Support for My Steam Review of A Summer’s End — Hong Kong 1986

+ + + + +
+ + + + + + +
+

As part of my effort to support and promote A Summer’s End — Hong Kong 1986, the sapphic visual novel and my absolute favourite piece of queer art ever, I left a glowing review on Steam on 17 August 2023, talking about how much A Summer’s End means too me as a Cantonese-speaking Chinese lesbian who grew up with Hong Kong media. I love A Summer’s End so much that I had created a shrine for it on my own website here.

+

Since then, as of the writing of this post on 30 October 2023, my review made to the top of the most helpful reviews in the past 90 days on the Steam store page of A Summer’s End with 12 votes.

+

Screenshot of Leilukin's review of A Summer’s End — Hong Kong 1986 on Steam

+

In addition, I have received multiple Steam awards, with Steam Points along with them, including:

+
    +
  • Heartwarning, which awards 200 Steam Points, given by two people
  • +
  • Golden Unicorn, which awards 800 Steam Points, given by one person
  • +
  • Take My Points, which awards 1,600(!) Steam Points, given by one person
  • +
+

Recently, on 22 October 2023, the guestbook of my website here have also received a message from someone named Rob, who expressed appreciation for my Steam review:

+
+

Thanks so much for your steam review of A Summer’s End!! So glad you have this board, so I could thank you for the heart warming review. I want to get this game for a friend of mine who is new to speaking english, and the story definitely will resonate with her.

+

I am introducing her to visual novels to hopefully help aid in her learning and practice.

+
+

I am amazed by the amount of appreciation my Steam review of A Summer’s End has been given. Thank you! A Summer’s End truly deserves all the love and support it can get.

+

I cannot stress enough that A Summer’s End is important because LGBTQ+ Hong Kong people and Cantonese speakers are criminally underrepresented in media. This is why we need to be vocal about our support for queer art made by non-white people, to signify to both the creators and every LGBTQ+ people that stories of queer non-white people deserve to be told.

+

Therefore, here is your reminder to check out A Summer’s End — Hong Kong 1986 if you have not already, especially you are also an Asian sapphic woman!

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-11-19-i-can-finally-game-on-a-solid-state-drive/index.html b/blog/posts/2023-11-19-i-can-finally-game-on-a-solid-state-drive/index.html new file mode 100644 index 00000000..a2c77429 --- /dev/null +++ b/blog/posts/2023-11-19-i-can-finally-game-on-a-solid-state-drive/index.html @@ -0,0 +1,505 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I Can Finally Game on a Solid-State Drive | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

I Can Finally Game on a Solid-State Drive

+ + + + +
+ + + + + + +
+

The laptop I am using for doing everything on desktop — including coding and managing this very website and blog — is the first gaming laptop I ever had. I bought this laptop in 2018, meaning I have used it for 5 years by the time of this writing.

+

In 2018, I was able to purchase a budget gaming laptop with a solid-state drive (SSD) as its system drive. However, the SSD only had a 258GB storage capacity, which is paltry by today's hard drive standards, especially if you are a gamer, since the installation size of mainstream video games has grown bigger over time (which is actually one of the reasons I rarely play new AAA games any more).

+

This means that even though I immediately experienced the night-and-day difference in how much the speed of booting my operating system compared to all the laptops I owned previously, I was unable to enjoy the benefit of gaming on an SSD, which is faster loading of games, because I still had to install video games on my hard disk drive to preserve the space of my SSD system drive... until now.

+

After using my gaming laptop for 5 years, my SSD started displaying signs of age with random shutdowns and blue screens of death, followed by a "No Bootable Device" error even after my laptop restarted. As the issue became more frequent, and none of the possible solutions I found online worked at all, I finally asked for professional help to replace my corrupted SSD system drive. I chose a 1TB SSD with Windows 11 installed as my new system drive.

+

As a result, on 16 November, my 5-year-old gaming laptop was reborn with a new SSD system drive. A new SSD with much larger storage capacity means I can finally experience gaming on an SSD, and the benefit that came with it. It truly felt like I had a new computer again, since I needed to reinstall all the apps I use, but it was a small price to pay, and I have always kept lists of apps I use in case I am in situations where I needed to restart my system like this.

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2023-11-20-finally-beat-a-bugs-life-video-game-24-years-later/index.html b/blog/posts/2023-11-20-finally-beat-a-bugs-life-video-game-24-years-later/index.html new file mode 100644 index 00000000..f9324aa8 --- /dev/null +++ b/blog/posts/2023-11-20-finally-beat-a-bugs-life-video-game-24-years-later/index.html @@ -0,0 +1,507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Finally Beat A Bug's Life The Video Game — 24 Years Later | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Finally Beat A Bug's Life The Video Game — 24 Years Later

+ + + + +
+ + + + + + +
+

A Bug's Life was one of my favourite films in my childhood, to the extent I had lost count of how many times I rewatched it even just as a child alone by playing the CD on my house's television over and over. I was such a huge fan of A Bug's Life that I had also played its tie-in game, specifically the 3D action platformer game, and it became one of my childhood favourite video games as well.

+

However, I had a regret relating to A Bug's Life the video game for years — I did not finish the game. I managed to reach Level 15, the final level of the game, but the reason I did not beat it was my CD-ROM of the game literally broke into pieces inside the CD-ROM drive, accompanied by a loud breaking sound, when I was playing Level 15, likely due to the CD-ROM being dislocated. It happened in 1999. Needless to say, the breaking of the CD-ROM of one of my childhood favourite video games broke my heart. My family and I had tried to look for a new copy of A Bug's Life video game, but with no success because at that time the stores in my local area no longer sold it.

+

Over the years growing up, I still harbour nostalgia for A Bug's Life. While my love for the film had been tainted by the fact that both Kevin Spacey, who voiced Hopper, and John Lasseter, the director, were accused of sexual misconduct, my wish of being able to finish the tie-in video game myself lingered from time to time. I had watched playthrough videos of A Bug's Life video game on YouTube to help to fill the void, but it was not the same as playing the game myself. The main obstacle that prevented my wish from being fulfilled was the fact that it was a very old game that its PC version is no longer officially sold, not even on online game stores such as Steam and GOG. In other words, A Bug's Life the video game had become an abandonware. As a result, I sought out My Abandonware, which does provide the game to download for free.

+

From My Abandonware, I downloaded and installed the Full-Rip with dgVoodoo by Destabilize version of A Bug's Life video game on my Windows 11. I was delighted when I successfully launched and played the old childhood favourite video game for the first time. Soon, I searched for a save file of the PC version of A Bug's Life video game that unlocked all levels, and found it on The Tech Game. Finally, at long last, on 20 November 2023, after 24 years, I successfully beat A Bug's Life video game by myself. I did not aim for 100% completion because my main goal was to defeat Hopper, the final boss, myself.

+

Given that the game was released in 1998, the graphics were obviously dated, and the camera and control were also awkward, but playing it again for the first time in decades brought back childhood memories of the game, and I still enjoy the game's soundtrack. This experience has also deepened my appreciation for internet archives, including ones that archive old video games. Thank you, My Abandonware, for allowing a childhood video game goal of mine got fulfilled decades later.

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-03-06-i-received-a-lifetime-premium-membership-on-nexus-mods-for-free/index.html b/blog/posts/2024-03-06-i-received-a-lifetime-premium-membership-on-nexus-mods-for-free/index.html new file mode 100644 index 00000000..7c654d60 --- /dev/null +++ b/blog/posts/2024-03-06-i-received-a-lifetime-premium-membership-on-nexus-mods-for-free/index.html @@ -0,0 +1,517 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I Received a Lifetime Premium Membership on Nexus Mods for Free | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

I Received a Lifetime Premium Membership on Nexus Mods for Free

+ + + + +
+ + + + + + +
+

A partial email message from Nexus Mods about a free lifetime Premium membership reward

+

[Image description: A partial email message from Nexus Mods that reads:

+
+

Hey leilukin,

+

Congratulations! Many people are downloading your mods and your efforts have been recognised with a free Nexus Mods Premium reward.

+

To see and redeem your rewards, you can visit your rewards tab on the billing page.

+

Redeem now

+
+

End desctiption.]

+

Nexus Mods website notification about a lifetime Premium membership reward

+

[Image description: A notification on the Nexus Mods website that reads, "Your mods reached 30,000 UDLs! Enjoy Lifetime Premium membership on us." End description.]

+

The Membership tab on Nexus Mods account settings showing lifetime Premium membership

+

[Image description: The Membership tab in the Nexus Mods account setting page, showing the current membershiup being "Mod Author Reward: Lifetime Premium", starting from 6th Mar 2024 with no end date. End description.]

+

Wow, I just got informed by Nexus Mods via email and website notification that I have received a lifetime Premium membership for free on Nexus Mods as a mod author reward, since all my mods that are hosted on Nexus Mods have reached 30,000 unique downloads in total!

+

It was actually only through receiving this reward that I learned about Nexus Mods' program to reward free Premium memberships to mod authors.

+

I never spent a single cent on Nexus Mods, and my mods are all passion projects, so I never expected to enjoy any extra benefits or privileges on Nexus Mods.

+

That said, I cannot complain about receiving a premium membership on a website I use regularly for free, even though the unlimited mod download speed is the only benefit I am really interested in. After all, I do download a lot of mods for various video games from Nexus Mods.

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-04-21-april-2024-leilukins-hub-overhaul-with-eleventy/index.html b/blog/posts/2024-04-21-april-2024-leilukins-hub-overhaul-with-eleventy/index.html new file mode 100644 index 00000000..7bdee780 --- /dev/null +++ b/blog/posts/2024-04-21-april-2024-leilukins-hub-overhaul-with-eleventy/index.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + April 2024 Leilukin's Hub Overhaul with Eleventy | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

April 2024 Leilukin's Hub Overhaul with Eleventy

+ + + + +
+ + + + + + + + + +
+

Leilukin's Hub just overgone a major overhaul: In April 2024, I have been rebuilding this entire website with the static site generator (SSG), Eleventy, and the process was completed on 20 April 2024.

+

After building this website for more than a year, Eleventy finally provided the solution for me to maintain, manage and update my website in more dynamic and sufficient ways to save time.

+
+

Challenges of Maintaining a Growing Website

+
+

Leilukin's Hub has come a long way since launch on 11 September 2022, from a small website with a few pages and a simple layout, to a full-fledged personal website with multiple articles, a blog, a couple of shrines with additional features such as sticky navigation bar, table of contents, etc. Meanwhile, I have also been learning web development, which helped to improve this website in multiple ways.

+

However, more content on my website also means more work to maintain. In particular, I have been trying to find ways to render components that share across multiple pages on my site, such as the header, navigation bar and footer, without having to copy and pasting the code of these components over and over whenever I want to add a new page. I had used JavaScript for this, but it is still not the best solution because I still needed to add a link to my JavaScript file in HTML. Thankfully, I eventually discovered Eleventy as the solution.

+
+

Why Eleventy?

+
+

There are many static site generators, so why I choose Eleventy over others? The main reason is Eleventy's flexibility. You can start building your website with Eleventy with something as simple as an index.md Markdown file.

+

In addition, Eleventy's own features, support for many template languages and plugins allow me to have control over how I build and customise my own website, some of which I will highlight as I elaborate the changes and improvements I had made to this website below.

+
+

New Features of Leilukin's Hub

+
+
+

Pagination

+
+

Leilukin's Hub blog and main changelogs page now has pagination, thanks to Eleventy's built-in support for the feature.

+
+

Estimated Reading Time for Articles and Blog Posts

+
+

Thanks to Emoji Read Time, a community plugin for Eleventy, my articles and blog posts now show the piece's estimated reading time before the main content.

+
+ +
+

For the articles, blog posts and some other pages that have headings, I have enabled anchor links on the headings by referring to the 11ty Slugs and Anchors guide from the website 11ty Rocks!, installing and configuring the markdown-it-anchor plugin.

+

Having a plugin that automatically generates heading anchor links also allows me to generate table of contents by installing uncenter's eleventy-plugin-toc plugin.

+
+

Content Categories

+
+

Eleventy's collection feature allows users to group site content by tags and create custom collections. This feature allows me to add categories to my articles and blog posts, and in turn allows visitors to browse my website by categories.

+
+

Archive for All My Articles and Blog Posts

+
+

Eleventy's collection feature also allows me to dynamically display links to my articles and posts when I make a new one, without needing to edit more pages to add the new links myself. Therefore, I took advantage of this feature by creating an [archive] page to display all my articles and blog posts.

+

Furthermore, my articles, blog and posts now has a right sidebar with links to my articles, blog posts as well as their archives and categories.

+
+ +
+

Some contents on Leilukin's Hub now has breadcrumbs, which shows the locations of these contents within this website and provides another means for visitors to navigate this site.

+
+

Now Page

+
+

Inspired by the nownownow.com website, I have added a Now page to Leilukin's Hub. This page is about what I am doing and focusing at the moment. The page can be updated at any time, so feel free to check it out when you visit this website to learn what I am up to!

+
+

Improved Features of Leilukin's Hub

+
+
+

Blog

+
+

Leilukin's Hub blog was launched on 28 January 2023. Formerly, the blog was built with Zonelets; now I take advantage of Eleventy's flexibility by recreating Leilukin's Hub blog with it, thus using the main site's layout for the blog instead of using a different layout. This makes the blog actually feels like it is part of this website.

+
+

Site Map

+
+

Visually, my site map does not change much other than tweaking the spacing, but under the hood, I use the Eleventy's official Navigation plugin to generate the links to my pages in a hierarchical manner.

+
+

RSS Feed

+
+

I had created an RSS feed for Leilukin's Hub's changelogs and blog posts for a while, but previously I had to create new entries in the feed manually by using RSS Builder. Now by installing and setting up Eleventy's official RSS plugin, new feed entries will be generated automatically when I make new changelogs, articles and blog posts.

+
+

Other Notable Changes of Leilukin's Hub

+
+

The following changes are not related to any features inherent to Eleventy or its plugins, but they were part of my process of rebuilding Leilukin's Hub.

+
+

Direct Visit to Leilukin's Hub Home Page

+
+

I have removed the splash page that was used as the very first page you saw when you visited the link leilukin.neocities.org. Now when you visit the link to my website, you will immediately see the home page wihout any extra step.

+
+

My Creation Page Renamed to Projects

+
+

The page listing the things I have created has been renamed from "My Creation" to "Projects".

+
+

Site Updates being Blog Posts

+
+

Previously, longer site updates were made into their own pages, since Leilukin's Hub did not have its own blog when I made the first site update post. Now these updates are converted into blog posts.

+
+ +
+

Formerly, pages that featured my interviews were on their own page called "featured". Now, these featured articles are merged into the articles page.

+
+

Responsive Shrine Header Images

+
+

I have created two different resolutions of each header image of my shrines. Which version of the shrine header image gets displayed depends on if your screen is horizontal or vertical.

+
+

Scroll-to-Top Function

+
+

Previously, this site's scroll-to-top function was placed in the footer. Now, I created a scroll-to-top button in the bottom right corner of the page when you scroll down.

+
+

Site Layout

+
+

The main title of each page is now displayed above both the main content and sidebars, instead of just above the main content like in the previous layout. This change was made so when this site is viewed on mobile, the table of contents of the left sidebar will be displayed above the main content but still below the page's main title. Previously, I had to place the table of contents on both the left sidebar and the main content's body, and hide the sidebar table of contents when viewed on mobile.

+

I also use CSS grid to set the page layout in that the main content's width will remain the same instead of expanding if there is no sidebar on the page.

+
+

Use GitHub Actions to deploy Leilukin's Hub to Neocities

+
+

Eleventy is great for reducing many workloads in maintaining and updating my website, so how about publishing the website to Neocities? That is where the GitHub actions comes in.

+

Before I decided to use a static site generator to rebuild Leilukin's Hub, I discovered the GitHub action named deploy-to-neocities, which as the name suggests, allows you to publish your website directly from a GitHub repository to Neocities. I succeeded in deploying all the files of Leilukin's Hub to Neocities with it even before starting to rebuild my website with Eleventy.

+

I have been using Visual Studio Code to write the code for Leilukin's Hub, and saving a copy of all the files of my website on my own computer. The combination of creating a Git repository for Leilukin's Hub and using the deploy-to-neocities GitHub action saves the time and workload needed to log in to Neocities, navigate the files and folders and open a file to edit the code every time I want to make a change to my website.

+
+

A Week's Worth of Effort Well-Spent

+
+

I had spent a whole week in rebuilding Leilukin's Hub from scratch with Eleventy, and at last completing the process on 20 April 2024. Most of the time rebuilding this website was spent on setting up layout templates, rather than changing the format of my articles and blog posts from HTML to markdown. However, the effort and time spent was worth it, and Leilukin's Hub feels new again.

+

Welcome to the rebuilt Leilukin's Hub! 🥳

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-04-27-lesbian-visibility-day1-year-anniversary-of-cassette-beasts/index.html b/blog/posts/2024-04-27-lesbian-visibility-day1-year-anniversary-of-cassette-beasts/index.html new file mode 100644 index 00000000..7d8ca89b --- /dev/null +++ b/blog/posts/2024-04-27-lesbian-visibility-day1-year-anniversary-of-cassette-beasts/index.html @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Happy Lesbian Visibility Day and 1-Year Anniversary of Cassette Beasts | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Happy Lesbian Visibility Day and 1-Year Anniversary of Cassette Beasts

+ + + + +
+ + + + + + +
+

26 April 2024 was a day of celebration for me, as it was both Lesbian Visibility Day and the first anniversary of the release of Cassette Beasts, my all-time favourite video game.

+

As a lesbian, Lesbian Visibility Day and Lesbian Visibility Week are an important annual event, as there can never be enough lesbians nor love for lesbians. It had been about 8 years ago when I finally realised I was a lesbian, and I am still happy and proud to be a lesbian.

+

Meanwhile, Cassette Beasts has become my all-time favourite video game ever since I started playing it in July 2023, to the extent I had created a shrine for the game on my own website. There are no words adequate to describe the depth of my love for Cassette Beasts.

+

As a lesbian fan of Cassette Beasts, I am also absolutely delighted by the fact that the initial release date of Cassette Beasts coincided with Lesbian Visibility Day on April 26. For bonus points, Cassette Beasts features not only LGBTQ+ representation in both the main and supporting cast, but also an actual canon old married lesbian couple in the supporting characters Ianthe and Wilma.

+

To celebrate both Lesbian Visibility Day and the 1-year anniversary of Cassette Beasts' release, I made lesbian pride icons featuring the Cassette Beasts logo as well as Ianthe and Wilma both individually and together, and shared them on social media accounts, including Tumblr, Twitter, Mastodon and Bluesky. I had also shared them in the official Bytten Studio Discord server.

+
https://www.tumblr.com/lesbiannova/748826429723148288/happy-lesbian-visibility-day-and-happy-birthday
+

My Cassette Beasts lesbian pride icons have been well-received, by not only other fans of the game, but also the developer Bytten Studio themselves. On Twitter, Bytten Studio not only retweeted, but also replied to my icons.

+

Bytten Studio's Twitter account retweeted Leilukin's lesbian pride Cassette Beasts icons

+

Twitter exchange between Bytten Studio and Leilukin about the lesbian pride Cassette Beasts icons

+

On Mastodon, Bytten Studio also boosted my icons.

+

The official Cassette Beasts account on Mastodon boosted Leilukin's lesbian pride Cassette Beasts icons

+

Furthermore, I had set up my website's header to display the lesbian pride flag and a blurb about Lesbian Visibility Day, and my Cassette Beasts shrine to display a blurb about the game's release anniversary, both on April 26 annually.

+

Leilukin's Hub header displaying lesbian pride flag and a top blurb about Lesbian Visibility Day

+

Cassette Beasts shrine displaying a top blurb about the 1-year anniversary of Cassette Beasts' release

+

In conclusion, this had been an exciting day for me as a lesbian gaymer.

+

On a somewhat related note, I love the fact that this week is not only Lesbian Visibility Week, but also has two of my all-time favourite games, Cassette Beasts and A Summer’s End — Hong Kong 1986 (which I had also created a shrine for), both of which happen to feature lesbian representation, celebrating their release anniversaries.

+

Happy Lesbian Visibility Day and Happy Birthday to Cassette Beasts!

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-05-14-james-somerton-my-video-game-footage/index.html b/blog/posts/2024-05-14-james-somerton-my-video-game-footage/index.html new file mode 100644 index 00000000..c1e0fbce --- /dev/null +++ b/blog/posts/2024-05-14-james-somerton-my-video-game-footage/index.html @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + James Somerton Used My Video Game Footage Without Credit or Permission | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

James Somerton Used My Video Game Footage Without Credit or Permission

+ + + + +
+ + + + + + +
+

It has been five months since Hbomberguy released his "Plagiarism and You(Tube)" video essay on 2 December 2023, which set off a YouTube plagiarism scandal, with another YouTuber James Somerton being the main focus of Hbomberguy's video essay. I do not write this post to recap or rehash the entire James Somerton debacle. Instead, I want to talk about something personal related to one of James Somerton's videos — James Somerton had used one of my video game footage in one of his videos without crediting me or asking for my permission.

+

On 5 November 2021, James Somerton released a video essay on his YouTube channel titled "Video Games and the Choice to be Gay". As of this writing, the video has been made private, but Somerton's videos have been archived on the Internet Archive with two playlists: James Somerton youtube archive and James Somerton- Public Records, so you can still watch "Video Games and the Choice to be Gay" directly on the Internet Archive in both the Youtube archive and the Public Records playlists. Alternately, you can watch the video through one of the Wayback Machine snapshots.

+

I first discovered "Video Games and the Choice to be Gay" through a Dragon Age fan blog on Tumblr shortly after the video was published. The video piqued my interest because LGBTQ+ representation in video games is relevant to me as a queer, non-binary lesbian gamer, and the video games discussed in Somerton's video included Star Wars: Knights of the Old Republic, Dragon Age and Mass Effect, which was also relevant to me since I used to be a huge fan of BioWare games. As a result, "Video Games and the Choice to be Gay" ended up being the first and only James Somerton video I have actually watched.

+

Before finished watching it, one thing from "Video Games and the Choice to be Gay" that caught my attention was when Somerton talked about Juhani from Star Wars: Knights of the Old Republic, who was the very first confirmed gay and lesbian character from both BioWare games and the entire Star Wars franchise, including the old Expended Universe, one of the Knights of the Old Republic (KotOR) footage shown on screen in the video included one of my KotOR footage about Juhani and her romance with the female player character.

+

Specifically, the clip from Somerton's video at the timestamp from 12:09 to 12:13 was actually from my 5 March 2016 video footage of Juhani's love confession with the Juhani Romance Enhancement mod, specifically at the timestamp 0:10 to 0:16.

+

Here is a back-to-back comparison between the clips from my original footage and Somerton's video respectively, proving the clip from Somerton's video was originally from my footage:

+
+

I immediately recognised my clip through the appearance of the female player character and her outfit, which was from the Segan Wyndh Jedi Armor mod. Furthermore, there are not many videos about Juhani's romance out there, so the player character's appearance, which can vary depending on how the player customises their character in the character creator or with mods, in Somerton's video only stood out to me even more. My footage of Juhani's love confession was part of my Juhani romance and conversation video series, to compliment my Juhani romance guide, which I am still proud to say is the most comprehensive guide about Juhani's romance on the internet.

+

To be honest, even back then, I was already a little disappointed that James Somerton used my footage in his video without a single word about the clip's source, both in the video itself and the video description, nor had Somerton ever reached out to me about using my footage in his video (on a related note, Somerton and I never had any direct interactions). I do not own the intellectual property of Star Wars or KotOR, but capturing video game footage requires one to actually play through the game, which takes time, especially role-playing games like KotOR. In addition, I had spent a great deal of effort on promoting Juhani's romance, including writing a guide and recording video footage about it because Juhani's romance is also infamous for being buggy and tricky to successfully complete, to the extent many KotOR fans were not even aware that Juhani can actually be romanced by the (female) player character.

+

However, I did not dare to say a word about Somerton's usage of my Juhani romance footage, because Somerton was already a fairly popular YouTuber with 138K subscribers by the time the video was released (at least according to the Wayback Machine snapshot of the video on 5 November 2021), while I do not even consider myself a YouTuber, since my YouTube channel only consists of video game footage I recorded myself without commentary. I did not bring up Somerton's usage of my Juhani romance footage because I did not want to come across as trying to start a drama or gain attention. I also tried to look at the positives by considering it an honour that at least my Juhani romance videos get noticed by a popular YouTuber.

+

As for Somerton's "Video Games and the Choice to be Gay" video itself, my initial thoughts after watching were that it was an interesting take on queer representation in Video games. I elaborated my thoughts when I shared the video with a friend:

+
+

Your mileage may vary on his opinions on certain individual examples from BioWare games that he brought up, and I cannot comment on Hades and The Last of Us 2 because I've never played them, but I very much agree with his main points about how LGBTQ+ representation in mainstream video games tend to be superficial and shallow because major game companies want their games to appeal as many people as possible, thus they're still unwilling to take too much risk so they won't offend the gamer bros too much. Honestly, this is how I feel about BioWare's games in general, despite BioWare's reputation as a progressive game company, especially when it comes to queer representation. I would give BioWare the benefit of the doubt for Juhani because she was the first confirmed queer character in both BioWare games and Star Wars, but when it comes to BioWare's original IPs, they could have done better.

+

I also strongly agree with him about the importance of us LGBTQ+ gamers supporting indie queer developers and their work, instead of relying on mainstream video games (and mainstream media in general) for queer representation.

+
+

That said, I did not bring up the fact that Somerton used my KotOR footage to my friend back then.

+

As mentioned above, "Video Games and the Choice to be Gay" was the first and only James Somerton video I have ever watched. I did not subscribe to Somerton's channel, nor did I have the time nor enough interest to watch any other Somerton's videos. No YouTubers I followed referenced Somerton's videos or were associated with him, and no one in my social media circles talked about him either. Therefore, after watching "Video Games and the Choice to be Gay" in November 2021, Somerton simply went off of my radar until his plagiarism scandal broke out two years later in December 2023.

+

After the James Somerton's plagiarism scandal broke out, it was revealed that "Video Games and the Choice to be Gay" plagiarised a paragraph of Robert Grosso's article "Queer Characters in Gaming - A Brief History" on TechRaptor and ripped off Verity Ritchie's (also known as verilybitchie) video essay "Hοѡ Biѕeхυаlity Chaոɡeԁ Video Gaⅿes".

+

"Video Games and the Choice to be Gay" was not covered in Hbomberguy's "Plagiarism and You(Tube)" video, so I did not realise that Somerton's video essay about queer representation in video games was also largely built upon other queer creators' works without credit, until one day before I began to write this post, when I searched about the video myself and discovered the sources through the website James Somerton Transcripts. This led to me watching Verity Ritchie's original video as well as listening to and reading their Patreon post and podcast episode about Somerton ripping off their video, realising that the main framework and talking points from Somerton's video was actually from Verity's video.

+

I felt guilty about giving Somerton credit for Verity's takes about queer representation in video games, although I still firmly stand by what I said about the importance of supporting indie queer developers and their work instead of relying on mainstream video games for queer representation. I was not aware of Verity when I discovered Somerton's video in 2021, but I became aware of Verity and their YouTube channel in early 2023, after discovering their "The Consumerist Dystopia of Harry Potter" video, which I included and recommended in my Anti-Harry Potter and Anti-J. K. Rowling Masterlist, so I recommend fellow queer gamers to check out Verity's "Hοѡ Biѕeхυаlity Chaոɡeԁ Video Gaⅿes" if you are interested in the topic of queer representation in video games.

+

The final push for me to write this post, was seeing Verity crediting the source of the gameplay footage featured in "Hοѡ Biѕeхυаlity Chaոɡeԁ Video Gaⅿes", as well as listening to them and their co-writer Ada Černoša talking about Somerton's lack of gameplay footage in "Video Games and the Choice to be Gay", doubting the gameplay footage in the video are his own, and that recording gameplay footage take time and effort. This made Somerton's usage of my video game footage without credit leave a more sour taste in my mouth, enough that I decided to, at last, talk about this and confirm that James Somerton had indeed used someone else's gameplay footage without credit or permission, with I being at least one of that someone else.

+

I do not expect anything from writing this post. James Somerton has destroyed his own reputation and internet career at this point without my help, so I merely just want to get Somerton's uncredited usage of my video game footage off my chest after being hesitant to bring it up since 2021.

+

(Update, 17 May 2024: Re-uploaded my comparison video for better quality, and updated the links to Somerton's video on the Internet Archive)

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-05-29-new-guestbook-leilukins-hub/index.html b/blog/posts/2024-05-29-new-guestbook-leilukins-hub/index.html new file mode 100644 index 00000000..5f52bf41 --- /dev/null +++ b/blog/posts/2024-05-29-new-guestbook-leilukins-hub/index.html @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The Search for a Guestbook Solution for Leilukin's Hub | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

The Search for a Guestbook Solution for Leilukin's Hub

+ + + + +
+ + + + + + +
+

On 4 May 2024, the guestbook service 123Guestbook announced that their service would be closed on 1 July 2024.

+

I created an account on 123Guestbook and started using it as Leilukin's Hub's guestbook since 25 July 2023. When my 123Guestbook guestbook was open, I received multiple nice messages expressing appreciation for my website and work, including my Cassette Beasts shrine and my A Summer’s End — Hong Kong 1986 shrine and Steam review, so I am sad to see 123Guestbook go. 123Guestbook has been around since 2005, so its closure is a sad reminder that you cannot predict when your favourite website might be gone.

+

In light of 123Guestbook's closure, I have disabled the function to add new messages to Leilukin's Hub's previous guestbook at 123Guestbook, and archived the old guestbook at the Internet Archive and archive.today.

+

123Guestbook shutting down means I need to find a replacement for Leilukin's Hub guestbook. This turned out to be a more difficult task than I expected, because I was struggling to find an alternative guestbook that satisfied my needs.

+

Initially, I looked into other guestbook services such as SmartGB, UltraGuest and the new Atabook. Dedicated guestbook services offer the ability to moderate messages and change the guestbook's style, but I ended up finding their style customisation options too limited for my liking. It does not help that UltraGuest's guestbook is not mobile-friendly either. This was also when I realised that 123Guestbook's guestbook is also not mobile-friendly.

+

In addition, I began to prefer to add features to my website by embedding it on my web page, so it looks like they are part of my website, instead of having to add an external link, or using the HTML <iframe> element, unless the website explicitly uses it for their embeds, such as YouTube. Therefore, another ideal feature for my guestbook is one that I can place into my web page's code.

+

Later, I discovered and tried out HTML Comment Box, which can be used as a guestbook or a comment widget on your website, and even briefly added it to Leilukin's Hub as my guestbook on 14 May 2024. HTML Comment Box widget suits my need for adding a guestbook by including it in my web page's code, so I also created Leilukin's Hub's own guestbook page.

+

You can also customise the look of HTML Comment Box with CSS, but (at least as far as I know) you cannot edit the widget's HTML. I found this an issue because HTML Comment Box's widget is not great in accessibility — the comment form does not have form labels (the HTML <label> element), and instead it relies on placeholder text to tell users the purpose of each input. Using input placeholder text to replace form labels causes accessibility issues.

+

When I tried to look for more guestbook alternatives, I suddenly remembered Firebase Realtime Database, and that I had learned to use it from Scrimba to create a JavaScript project with a database without SQL, and decided to code my own guestbook that uses Firebase Realtime Database to store messages. It gave me full control of the look of my guestbook, and more practice in coding things myself. I succeed in implementing it on 19 May 2024. Unfortunately, I was not able to implement features to reply to messages and notify me when a new message was received.

+

I became increasingly frustrated with not being able to find a way to add a guestbook to my static website that also satisfies my needs, until I discovered the solution that leads to the current iteration of Leilukin's Hub guestbook — Grounded Wren's guestbook code.

+

Grounded Wren's guestbook code provides just about every guestbook feature I could ask for: message moderation, message replies, full control of the style, notifications for new messages, and making the guestbook actually part of my website. Granted, the guestbook still requires some external tools, namely Discord webhook and Google Sheets, to function, but that is the limitation of not being able to use PHP on static websites because the hosting service (including Neocities) does not support it.

+

Finally, I began to use Grounded Wren's guestbook code for the shiny new Leilukin's Hub's guestbook since 25 May 2024! I am relieved that my search for a guestbook solution for Leilukin's Hub to replace 123Guestbook was finally completed.

+

(That said, it is important to point out that unfortunately, Neocities' stricter Content Security Policy since around the start of 2024 prevents widgets like HTML Comment Box and Grounded Wren's guestbook code from properly working on newly registered sites on the free tier. Leilukin's Hub's Neocities account was registered in 2022, so those widgets worked on this site despite being on the free tier, but it is important information for new Neocities users to know)

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-05-31-domain-name-hosting-change-leilukins-hub/index.html b/blog/posts/2024-05-31-domain-name-hosting-change-leilukins-hub/index.html new file mode 100644 index 00000000..cb2b6f38 --- /dev/null +++ b/blog/posts/2024-05-31-domain-name-hosting-change-leilukins-hub/index.html @@ -0,0 +1,598 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Custom Domain Name and Hosting Change for Leilukin's Hub | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Custom Domain Name and Hosting Change for Leilukin's Hub

+ + + + +
+ + + + + + + + + +
+

Major news: Leilukin's Hub has a custom domain name: leilukin.com! In addition, Leilukin's Hub is now hosted on Netlify, with the leilukin.com domain name pointing to the Netlify host.

+
+

Moving Beyond Neocities

+
+

Leilukin's Hub has grown significantly since its launch on Neocities in September 2022, not just in how many pages it has, but also the fact that the site includes various resources I have shared across the internet (most notably, some of my Star Wars: Knights of the Old Republic articles and guides).

+

Furthermore, web development has become more than a hobby to me — after starting to build my own website and relearning HTML and CSS, my interest in web development has grown enough to the point I started taking online web development courses and aspiring to become a serious web developer, by taking online courses on platforms such as freeCodeCamp and Scrimba. While Leilukin's Hub is still a hobby website, I have been using this site to practice and grow my web development skills, including using a static site generator, namely Eleventy, to rebuild and overhaul this site in April 2024.

+

As much I appreciate Neocities for being a good platform for beginner and hobbyist webmasters to get their start in creating their own websites for free, throughout my journey in learning web development more seriously, I have also discovered other static site hosting platforms, such as GitHub Pages and Netlify, and looked into them as alternatives to Neocities.

+

Meanwhile, I have been considering purchasing a domain name for Leilukin's Hub. A custom domain name makes my website address easier to remember. Also, I have been using Leilukin as my internet pseudonym for about 17 years at this point, so it feels right to finally own a domain name with that name for my own website.

+
+

New Host for Leilukin's Hub

+
+

Neocities provides a Supporter subscription plan with benefits including larger storage, custom domain support and removing file type restrictions, but 50 GB storage is overkill for me when the free tier's 1GB storage is already more than enough for Leilukin's Hub at its current stage.

+

Not to mention, the above-mentioned GitHub Pages and Netlify already provide custom domain support and no file upload type restriction for free. Getting a custom domain name already requires money, so I need to carefully consider if it is worth for me to spend 5 USD per month on top of my domain name to host my hobby website.

+

After much deliberation, I settled for Netlify as the new hosting platform for Leilukin's Hub. I am already using GitHub Pages to host my developer portfolio website (with a custom domain name too) as well as some of my other developer projects, and I already have a Netlify account to deploy some of my developer projects. In addition, Netlify allows you to import and deploy a project from a GitHub repository, so I may as well make use of Netlify.

+

The process of deploying Leilukin's Hub from its GitHub repository went smoothly, so it was time to proceed to the next step: buying and setting up a custom domain.

+
+

Custom Domain for Leilukin's Hub

+
+

After comparing various domain name registrars, I chose to buy my domain name from Porkbun for its competitive price for domain names. The leilukin.com domain name was not taken, so I seized the opportunity to place an order for it, and later succeeded in purchasing and registering it as my own.

+

Upon owning leilukin.com, I followed Netlify's instructions to set up DNS records to point leilukin.com to my website on Netlify. I lacked experience in such things, so it took a bit longer for me to set it up properly, but I eventually did it. Visiting leilukin.com will lead you to Leilukin's Hub on Netlify.

+

Since Porkbun provides an email forwarding feature for its domain names for free, I also decided to make use of it and set up a new email address with the leilkin.com domain name, contact@leilukin.com, and forward emails sent to this address to my Outlook mailbox. This means now you can email me at contact@leilukin.com.

+
+

Redirect to New Domain Name

+
+

There was one last piece of the puzzle to make the Leilukin's Hub's transition from Neocities to Netlify seamless: a way to redirect the leilukin.neocities.org address to leiulkin.com.

+

I want a way to redirect my Neocities site address instead of placing a web page to announce the hosting change, because I have shared my Neocities site and some of its content on multiple platforms on the internet. Redirect eliminates the need for visitors to leilukin.neocities.org to click a link just to go to the new address.

+

After researching ways to redirect web pages, I used JavaScript, specifically the location.replace() method, for two reasons: it removes leilukin.neocities.org from page history, and using JavaScript allows me to write custom code to ensure only the domain gets changed, while the rest of the URL's path remains intact. For example, if you visit leilukin.neocities.org/blog, you will get redirected to leilukin.com/blog.

+

With the redirect function set up, leilukin.com was officially ready!

+
+

What Happens Now with My Neocities Account

+
+

What happens now with my Neocities account and the Neocities version of Leilukin's Hub?

+

leilukin.neocities.org, the Neocities version of Leilukin's Hub will no longer be updated. Visiting leilukin.neocities.org will redirect you to leiulkin.com, my new domain on Netlify. That said, I still post about updates to Leilukin's Hub on my Neocities profile.

+

I am still using my Neocities account and logging in almost daily. A couple of fellow webmasters and I have been following each other on Neocities, so I am not abandoning my Neocities account any time soon, and Neocities users are still welcome to follow me and post messages on my Neocities profile page.

+

(Update, 4 June 2024: Originally, even when Leilukin's Hub began to switch host to Netlify, I still deployed Leilukin's Hub to Neocities by using the deploy-to-neocities GitHub action, in order to notify my Neocities followers of updates to Leilukin's Hub, but I have changed my mind and decided to stop pushing Leilukin's Hub's updates to Neocities, so I can focus on my website's hosting on Netlify)

+

Welcome to leilukin.com! 🥳 Not going to lie, I am excited that this major news for my website is officially announced just a day before Pride Month starts! 🏳️‍🌈

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-06-12-performance-improvement-leilukins-hub/index.html b/blog/posts/2024-06-12-performance-improvement-leilukins-hub/index.html new file mode 100644 index 00000000..ec07a897 --- /dev/null +++ b/blog/posts/2024-06-12-performance-improvement-leilukins-hub/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Improving Site Performance of Leilukin's Hub | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Improving Site Performance of Leilukin's Hub

+ + + + +
+ + + + + + +
+

Since Leilukin's Hub migrated to Netlify and got a custom domain name on 31 May 2024, I have been working on improving the performance of this website. After discovering the static site generator Eleventy and began to rebuilt Leilukin's Hub with Eleventy, I found the Eleventy Leaderboard which inspired me to look into Google Lighthouse more, since the Eleventy Leaderboard measures the Lighthouse score of websites built with Eleventy.

+

I use PageSpeed Insights to measure my website's Lighthouse score. My website achieved 100 in the categories of Accessibility, Best Practices and SEO, but the Performance score could use improvement. As a result, I studied about ways to improve website performance based on PageSpeed Insights' reports about my site.

+
+

Optimising Custom Fonts

+
+

During the tests of Leilukin's Hub, PageSpeed Insights reported that the biggest factor in impacting the performance of this website is Cumulative Layout Shift (CLS). It took me a while to figure out using a custom font, namely the Lexend font family, was the cause of CLS of Leilukin's Hub — due to using a custom font as the default font, there was a flash of unstyled text (FOUT) for the entire page of Leilukin's Hub before the Lexend font loaded.

+

This prompted me to research ways to optimise web fonts. Eventually, I solved the issue of FOUT and CLS by preloading the Lexend regular and bold typeface files (I used google-webfonts-helper to obtain the font files in WOFF2 format) in the <head> element, and turning my CSS stylesheet for Lexend into inline CSS by placing a <style> block for the CSS in the <head> element. Leilukin's Hub Lighthouse performance score improved as a result.

+

By testing the site performance of Leilukin's Hub, I also learned that using Font Awesome could impact site performance, largely due to Font Awesome's large CSS files, so I decided to optimise the Font Awesome assets on Leilukin's Hub by using only the brand icons, while removing unused and unneeded font files and CSS properties.

+
+

Converting Images to AVIF Format

+
+

The next step to improve the site performance of Leilukin's Hub was converting most images on this website to AVIF format, upon PageSpeed Insight's suggestions of using next-gen image formats such as WEBP and AVIF. I used GNU Image Manipulation Program, Shutter Encoder and ImageMagick to carry out the task of converting images to AVIF.

+

Converting images to AVIF reduces the images' file sizes, which in turn saves bandwidth. Being able to host images in AVIF format adds to one more reason I am glad that I decided to migrate Leilukin's Hub from Neocities to Netlify. One of the reasons for the migration is Netlify' lack of file type restriction for free, unlike Neocities which requires paying for the Supporter plan.

+

The only disadvantage of Netlify's free plan compared to Neocities' free plan is the lower monthly bandwidth limit — Netlify limits monthly bandwidth for free tier users to 100GB across all deployed sites and projects, while Neocities' limit is 200GB for one website. However, even 100GB per month is more than enough for average users, though taking steps to save bandwidth like using AVIF images still certainly helps.

+

On the subject of images, I have also set all images other than the header to lazy loading to reduce page load times.

+
+

Perfect Lighthouse Score Achieved

+
+

At last, after my effort in optimising this website to improve its performance, Leilukin's Hub reached a 100 Performance score, and thus achieved a perfect Lighthouse score!

+

I have come to care about my website's performance, because not only has web development evolved into more than a hobby for me, but also it makes visitors' experience with browsing my website better with faster loading times.

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-06-21-leilukins-hub-tumbleblog-launched/index.html b/blog/posts/2024-06-21-leilukins-hub-tumbleblog-launched/index.html new file mode 100644 index 00000000..b0ede270 --- /dev/null +++ b/blog/posts/2024-06-21-leilukins-hub-tumbleblog-launched/index.html @@ -0,0 +1,507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Leilukin's Hub Tumbleblog Launched | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Leilukin's Hub Tumbleblog Launched

+ + + + +
+ + + + + + +
+

Leilukin's Hub now has a tumbleblog at tumbleblog.leilukin.com!

+

I have been considering the idea of creating a microblog or tumbleblog for my website. The main site of Leilukin's Hub already has a blog, but I also want another blog for shorter or more casual posts to document my thoughts and various stuff I find interesting or inspirational, especially ones that I am not sure how or where to put in the main site of Leilukin's Hub yet.

+

Tumblr has served me adequately for this purpose, which is one of the reasons it remains the social media platform I am the most active on since 2011 (yes, this means I have been on Tumblr for 13 years at this point). However, one of the reasons I eventually decided to create my own website was to not relying on social media to share my creations and interests. Therefore, an ideal Tumblr-style microblog for Leilukin's Hub would be self-hosted and sharing the same domain name of leilukin.com. After struggling to figure out how to implement a tumbleblog for Leilukin's Hub, I finally discovered the ideal blogging engine for my needs: Chyrp Lite.

+

Chyrp Lite has everything I am looking for to build a self-hosted Tumblr-style blog. The website explicitly states that you can have a tumbleblog with the blogging engine, with feathers that allow you to make not only text posts, but also image posts, audio posts, video posts, quote posts, link posts and even posts with files attached to allow visitors to download. Chyrp Lite is written in PHP, so it cannot be hosted on platforms that support static sites only, such as Neocities, GitHub Pages, Netlify (which is where leilukin.com is currently hosted on), etc. This is where InfinityFree came in.

+

InfinityFree is among the few hosting platforms that provides PHP and MySQL support for free, so I had created an InfinityFree account to start learning about PHP, even before discovering Chyrp Lite. In addition, InfinityFree supports custom domain without additional charges, so I have also added the leilukin.com domain name to my InfinityFree account, in case I need to host something with PHP and want to use a subdomain of leilukin.com for it. Now, I got to make use of what I learned to build this tumbleblog for Leilukin's Hub.

+

I started with adding a tumbleblog.leilukin.com custom subdomain to InfinityFree, configuring the DNS records on Porkbun (which manages the leilukin.com domain name), and requesting a free SSL certificate from InfinityFree to add HTTPS support to this blog. After making sure the tumbleblog.leilukin.com subdomain is ready, I followed the Quick Start Guide to set up Chyrp Lite, by uploading the blogging engine's files to InfinityFree with FTP, creating a MySQL database for this tumbleblog, and installing Chyrp Lite into my InfinityFree server. At last, I successfully installed Chyrp Lite on InfinityFree.

+

Leilukin's Hub Tumbleblog is now officially launched! 🥳

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-06-24-cassette-beasts-fanlisting-approved/index.html b/blog/posts/2024-06-24-cassette-beasts-fanlisting-approved/index.html new file mode 100644 index 00000000..87aa4abe --- /dev/null +++ b/blog/posts/2024-06-24-cassette-beasts-fanlisting-approved/index.html @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + My Cassette Beasts Fanlisting Application has been Approved | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

My Cassette Beasts Fanlisting Application has been Approved

+ + + + +
+ + + + + + +
+

On 22 June 2024, I submitted an application form to The Fanlistings Network, also known as TFL.org, to build and run a Cassette Beasts fanlisting, and now TFL.org has approved my application! Cassette Beasts is now on TFL.org's approved list under the Games category and the Computer, Console, & Video Games subcategory (view the web archive version).

+
+ What is a fanlisting? +

For those who do not know what a fanlisting is, TFL.org has defined fanslitings as below:

+
+

A fanlisting is simply an online listing of fans of a subject, such as a TV show, actor, or musician, that is created by an individual and open for fans from around the world to join. There are no costs, and the only requirements to join a fanlisting are your name and country. Fanlistings do not have to be large sites (although some are) - they are just a place where you can have your name listed along with other fans of the same subject. TheFanlistings.org is the original (but not only) web directory for fanlistings, dedicated to uniting fans across the globe.

+
+
+
+

This is a major moment for me as both a webmaster and a Cassette Beasts fan. As a webmaster, I have been applying and joining fanlistings since I built my own website, as I have always found fanlistings a neat idea to gather and discover other people who share your interests across the world, as listing your country is a requirement when you apply to join a fanlisting. Recently, I have been considering building and running a fanlisting myself, with Cassette Beasts being my first choice since there is no fanlisting for Cassette Beasts yet. I began to dabble in PHP, so I can use a script like BellaBuffs to build a fanlisting. With my application approved by The Fanlistings Network, the Cassette Beasts fanlisting will be the first fanlisting I build and run.

+

Cassette Beasts has become my favourite video game ever since I started playing it in July 2023, to the extent that not only I have a Cassette Beasts shrine on my website, I had already begun to consider creating the shrine even before beating the main campaign. I have also been tirelessly recommending the game throughout various online spaces. Therefore, I am honoured to be given this opportunity to build and run a fanlisting for Cassette Beasts that is approved by The Fanlistings Network, to add to my ongoing effort to boost the game's visibility.

+

The Cassette Beasts fanlisting is not ready yet at this moment, especially since I was not certain if The Fanlistings Network would approve my application, but now with their approval, I am going to work on building the Cassette Beasts fanlisting. TFL.org has a rule that fanlisting owners need to complete their fanlisting within four weeks, so stay tuned for upcoming updates for my Cassette Beasts fanlisting!

+

Now that I will be running my own fanlisting, I will be also creating a fanlisting collective to gather all fanlistings I own, join and have applied to in one place. Since Netlify, which currently hosts the main site of Leilukin's Hub, does not support PHP, I will be hosting my fanlisting collective, including my Cassette Beasts fanlisting, on InfinityFree.

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/2024-07-02-fanlisting-collective-launch/index.html b/blog/posts/2024-07-02-fanlisting-collective-launch/index.html new file mode 100644 index 00000000..688c2162 --- /dev/null +++ b/blog/posts/2024-07-02-fanlisting-collective-launch/index.html @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cassette Beasts Fanlisting and My Fanlisting Collective Launched | Blog | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

Cassette Beasts Fanlisting and My Fanlisting Collective Launched

+ + + + +
+ + + + + + +
+

I am incredibly excited to announce the official launch of Land of Confusion, The Fanlistings Network-approved fanlisting for Cassette Beasts, and Beehive, my fanlisting collective! 🥳

+

If you are a fan of Cassette Beasts, feel free to join my fanlisting! If you like fanlistings as well, feel free to check out my fanlisting collective!

+

In addition, in light of the launch of my first fanlisting, I am also releasing my fork of BellaBuffs, the fanlisting script written in PHP, with integration of PHPMailer, the email sending library!

+

My fanlisting collective and Cassette Beasts fanlisting are hosted on InfinityFree, since Netlify, which currently hosts the main site of Leilukin's Hub, does not support PHP.

+
+

A Milestone

+
+

In my previous post, I announced that The Fanlistings Network (also known as TFL.org) had approved my application for building and running a fanlisting for Cassette Beasts.

+

After completing the Cassette Beasts fanlisting on 30 June 2024, I submitted a finished form to TFL.org to let them know that I have finished my fanlisting. The Fanlistings Network responded by emailing me and informing me thatthey have added the URL of my Cassette Beasts fanlisting to the list of approved fanlistings under the Games category and the Computer, Console, & Video Games subcategory (view the web archive version).

+

The launch of my Cassette Beasts fanlisting is a major moment for me as both a webmaster and a Cassette Beasts fan, as I am enthusiastic about the fact that the very first fanlisting I create would be for my absolute favourite video game.

+
+

First Foray in PHP

+
+

My Cassette Beasts fanlisting is powered by BellaBuffs. I was new to PHP when I started considering building fanlistings myself, as my main site Leilukin's Hub is a static site, so building the Cassette Beasts fanlisting was my first foray in learning to code in PHP.

+

Before starting to actually work on building the Cassette Beasts fanlisting, I tried out Enthusiast, the other commonly used fanlisting script also written in PHP. I tried Erin's fork of Enthusiast specifically, since InfinityFree uses version 8.2 of PHP Enthusiast also has extra features that BellaBuffs does not have, including allowing fanlisting members to set passwords and even managing the entire fanlisting collective.

+

Unfortunately, I encountered a critical issue with Enthusiast when I tried it: whenever I added a fanlisting to my joined fanlisting list in the admin panel, the home page of the fanlisting collective would go completely blank. I do not know the cause of the issue, and I was not familiar enough with PHP to be confident in attempting to investigate the entire fanlisting collective code just to find the culprit, especially when it uses MySQL database to store data, adding another complexity in troubleshooting it.

+

Therefore, I later tried BellaBuffs, and chose BellaBuffs as the script to power my fanlistings, then code my own fanlisting collective myself.

+

There were a few setbacks I encountered when I was building the Cassette Beasts fanlisting with BellaBuffs and hosting the fanlisting on InfinityFree — I learned that InfinityFree's free hosting plan does not support PHP mail() function, which is used by BellaBuffs.

+
+

Integrating PHPMailer into BellaBuffs

+
+

BellaBuffs includes the optional features to email new members after submitting the join form, email the fanlisting admin when a new member joins or email new members when their applications were approved. The original BellaBuffs script achieved this by using PHP's built-in mail() feature, which unfortunately the free hosting of InfinityFree does not support, so I had to figure out an alternative way for my fanlisting on InfinityFree to send emails.

+

Thankfully, InfinityFree suggested using PHPMailer, and even providing a contact form powered by PHPMailer as a sample. As a result, I spent time in trying to incorporate PHPMailer into BellaBuffs based on the InfinityFree's PHPMailer contact form code, and voilà, I did it!

+

I am glad that despite my inexperience in PHP, I was able to apply the programming knowledge I learned from building my main site and taking online coding courses to build my fanlisting.

+

After successfully setting up the Cassette Beasts fanlisting, I decided to fork BellaBuffs and release my version of the fanlisting script with PHPMailer integration, in case there are others who want to use BellaBuffs to build fanlistings, but cannot or do not want to use the PHP mail() function.

+

You can download my BellaBuffs fork and learn about how to use it from its GitHub repository.

+
+

Building Beehive

+
+

To give myself more practice in PHP as I built my first fanlisting, I decided to code my fanlisting collective in PHP as well.

+

I decided to name my fanlisting collective Beehive, since I have been using my drawing of a bee with a pair of glasses as my main avatar on the Internet, I figured it would be a good idea to name a subsite of mine something related to bees.

+

Furthermore, Beehive is a fitting name for a fanlisting collective, as beehives house honey bees, while this website houses all the fanlistings I created, maintain, joined and have applied to join.

+

Welcome to Beehive! 🐝

+ + + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/posts/index.html b/blog/posts/index.html new file mode 100644 index 00000000..1fca3edc --- /dev/null +++ b/blog/posts/index.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blog Archive | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Blog Archive

+ + + +

Archive of blog posts on Leilukin's Hub

+ + +
+ + + + + + +
+ + + + +
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/a-bugs-life/index.html b/categories/a-bugs-life/index.html new file mode 100644 index 00000000..2da66824 --- /dev/null +++ b/categories/a-bugs-life/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "a bug's life" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "a bug's life"

+ + + +

All contents under the "a bug's life" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "a bug's life"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/a-summers-end/index.html b/categories/a-summers-end/index.html new file mode 100644 index 00000000..6b8a90a1 --- /dev/null +++ b/categories/a-summers-end/index.html @@ -0,0 +1,485 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "a summer's end" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "a summer's end"

+ + + +

All contents under the "a summer's end" category on Leilukin's Hub.

+ + +
+ + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/categories/cassette-beasts/index.html b/categories/cassette-beasts/index.html new file mode 100644 index 00000000..22824bb4 --- /dev/null +++ b/categories/cassette-beasts/index.html @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "cassette beasts" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "cassette beasts"

+ + + +

All contents under the "cassette beasts" category on Leilukin's Hub.

+ + +
+ + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/categories/code-projects/index.html b/categories/code-projects/index.html new file mode 100644 index 00000000..ee3a7862 --- /dev/null +++ b/categories/code-projects/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "code projects" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "code projects"

+ + + +

All contents under the "code projects" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "code projects"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/dracula-daily/index.html b/categories/dracula-daily/index.html new file mode 100644 index 00000000..83d04e6d --- /dev/null +++ b/categories/dracula-daily/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "dracula daily" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "dracula daily"

+ + + +

All contents under the "dracula daily" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "dracula daily"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/fandom-culture/index.html b/categories/fandom-culture/index.html new file mode 100644 index 00000000..d067551a --- /dev/null +++ b/categories/fandom-culture/index.html @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "fandom culture" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "fandom culture"

+ + + +

All contents under the "fandom culture" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

2 Contents Filed Under "fandom culture"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/gaming/index.html b/categories/gaming/index.html new file mode 100644 index 00000000..e57a7748 --- /dev/null +++ b/categories/gaming/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "gaming" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "gaming"

+ + + +

All contents under the "gaming" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "gaming"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/harry-potter/index.html b/categories/harry-potter/index.html new file mode 100644 index 00000000..6431b8aa --- /dev/null +++ b/categories/harry-potter/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "harry potter" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "harry potter"

+ + + +

All contents under the "harry potter" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "harry potter"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 00000000..f65d2e03 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Categories | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Categories

+ + + +

All content categories on Leilukin's Hub.

+ + +
+ + + + + + +
+ + + +

See all contents on this website in the archive.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/jk-rowling/index.html b/categories/jk-rowling/index.html new file mode 100644 index 00000000..9fa36798 --- /dev/null +++ b/categories/jk-rowling/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "jk rowling" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "jk rowling"

+ + + +

All contents under the "jk rowling" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "jk rowling"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/lesbian/index.html b/categories/lesbian/index.html new file mode 100644 index 00000000..4f0185dd --- /dev/null +++ b/categories/lesbian/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "lesbian" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "lesbian"

+ + + +

All contents under the "lesbian" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "lesbian"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/lgbtq/index.html b/categories/lgbtq/index.html new file mode 100644 index 00000000..271788e5 --- /dev/null +++ b/categories/lgbtq/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "lgbtq+" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "lgbtq+"

+ + + +

All contents under the "lgbtq+" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "lgbtq+"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/life-updates/index.html b/categories/life-updates/index.html new file mode 100644 index 00000000..3e1a7d59 --- /dev/null +++ b/categories/life-updates/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "life updates" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "life updates"

+ + + +

All contents under the "life updates" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "life updates"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/malaysia/index.html b/categories/malaysia/index.html new file mode 100644 index 00000000..90abba45 --- /dev/null +++ b/categories/malaysia/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "malaysia" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "malaysia"

+ + + +

All contents under the "malaysia" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "malaysia"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/my-birthday/index.html b/categories/my-birthday/index.html new file mode 100644 index 00000000..1242b9c1 --- /dev/null +++ b/categories/my-birthday/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "my birthday" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "my birthday"

+ + + +

All contents under the "my birthday" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "my birthday"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/my-interviews/index.html b/categories/my-interviews/index.html new file mode 100644 index 00000000..5f766537 --- /dev/null +++ b/categories/my-interviews/index.html @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "my interviews" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "my interviews"

+ + + +

All contents under the "my interviews" category on Leilukin's Hub.

+ + +
+ + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/categories/palestine/index.html b/categories/palestine/index.html new file mode 100644 index 00000000..cf60dfa1 --- /dev/null +++ b/categories/palestine/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "palestine" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "palestine"

+ + + +

All contents under the "palestine" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "palestine"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/shrines/index.html b/categories/shrines/index.html new file mode 100644 index 00000000..026bdc43 --- /dev/null +++ b/categories/shrines/index.html @@ -0,0 +1,485 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "shrines" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "shrines"

+ + + +

All contents under the "shrines" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

3 Contents Filed Under "shrines"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/site-anniversary/index.html b/categories/site-anniversary/index.html new file mode 100644 index 00000000..112b9ead --- /dev/null +++ b/categories/site-anniversary/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "site anniversary" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "site anniversary"

+ + + +

All contents under the "site anniversary" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "site anniversary"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/site-updates/index.html b/categories/site-updates/index.html new file mode 100644 index 00000000..4341d6ee --- /dev/null +++ b/categories/site-updates/index.html @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "site updates" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "site updates"

+ + + +

All contents under the "site updates" category on Leilukin's Hub.

+ + +
+ + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/categories/star-wars-kotor-2/index.html b/categories/star-wars-kotor-2/index.html new file mode 100644 index 00000000..f492c7d0 --- /dev/null +++ b/categories/star-wars-kotor-2/index.html @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "star wars kotor 2" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "star wars kotor 2"

+ + + +

All contents under the "star wars kotor 2" category on Leilukin's Hub.

+ + +
+ + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/categories/star-wars-kotor/index.html b/categories/star-wars-kotor/index.html new file mode 100644 index 00000000..394628ce --- /dev/null +++ b/categories/star-wars-kotor/index.html @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "star wars kotor" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "star wars kotor"

+ + + +

All contents under the "star wars kotor" category on Leilukin's Hub.

+ + +
+ + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/categories/video-game-mods/index.html b/categories/video-game-mods/index.html new file mode 100644 index 00000000..9e14bf49 --- /dev/null +++ b/categories/video-game-mods/index.html @@ -0,0 +1,545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "video game mods" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "video game mods"

+ + + +

All contents under the "video game mods" category on Leilukin's Hub.

+ + +
+ + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/categories/web-development/index.html b/categories/web-development/index.html new file mode 100644 index 00000000..8b67638c --- /dev/null +++ b/categories/web-development/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "web development" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "web development"

+ + + +

All contents under the "web development" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "web development"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/categories/youtube/index.html b/categories/youtube/index.html new file mode 100644 index 00000000..b7bf699a --- /dev/null +++ b/categories/youtube/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content Category: "youtube" | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Content Category: "youtube"

+ + + +

All contents under the "youtube" category on Leilukin's Hub.

+ + +
+ + + + + + +
+ + +

1 Contents Filed Under "youtube"

+ + + + +

See all content categories.

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/2022/index.html b/changelogs/2022/index.html new file mode 100644 index 00000000..b32a589e --- /dev/null +++ b/changelogs/2022/index.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Website Changelog Archive: 2022 | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelog Archive: 2022

+ + + +

Changelog of my website during the year of 2022.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + + + +
+

+ 29 December 2022 +

+ +
+ + + +
+

+ 19 December 2022 +

+ +
+ +
    +
  • Added new resource, Star Wars: Knights of the Old Republic save files, to my resources page: KotOR 2 Light Side Female Saves with The Sith Lords Restored Content Mod and PartySwap.
  • +
+ +
+

+ 16 December 2022 +

+ +
+ + + +
+

+ 11 December 2022 +

+ +
+ + + +
+

+ 8 December 2022 +

+ +
+ + + +
+

+ 27 November 2022 +

+ +
+ + + +
+

+ 24 November 2022 +

+ +
+ + + +
+

+ 22 November 2022 +

+ +
+ + + +
+

+ 16 November 2022 +

+ +
+ + + +
+

+ 12 November 2022 +

+ +
+ + + +
+

+ 9 November 2022 +

+ +
+ + + +
+

+ 23 October 2022 +

+ +
+ + + +
+

+ 22 October 2022 +

+ +
+ + + +
+

+ 17 October 2022 +

+ +
+ +
    +
  • Added new resource, Star Wars: Knights of the Old Republic save files, to my resources page: Light Side Female Saves with KOTOR 1 Community Patch and All Romances.
  • +
+ +
+

+ 16 October 2022 +

+ +
+ + + +
+

+ 11 October 2022 +

+ +
+ + + +
+

+ 6 October 2022 +

+ +
+ + + +
+

+ 5 October 2022 +

+ +
+ + + +
+

+ 4 October 2022 +

+ +
+ + + +
+

+ 3 October 2022 +

+ +
+ + + +
+

+ 1 October 2022 +

+ +
+ + + +
+

+ 30 September 2022 +

+ +
+ + + +
+

+ 25 September 2022 +

+ +
+ +
    +
  • Added a button to my Buy Me a Coffee page on the home page and About page.
  • +
  • The top banner on each page is now linked to the home page.
  • +
+ +
+

+ 20 September 2022 +

+ +
+ + + +
+

+ 16 September 2022 +

+ +
+ +
    +
  • Adjusted the font size, line and paragraph spacing of the website to make it easier to read and more responsive.
  • +
  • Redesigned the buttons on the website.
  • +
+ +
+

+ 12 September 2022 +

+ +
+ + + +
+

+ 11 September 2022 +

+ +
+ +
    +
  • Website launch.
  • +
+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/2023/index.html b/changelogs/2023/index.html new file mode 100644 index 00000000..2ee4bf79 --- /dev/null +++ b/changelogs/2023/index.html @@ -0,0 +1,1203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Website Changelog Archive: 2023 | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelog Archive: 2023

+ + + +

Changelog of my website during the year of 2023.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + + + +
+

+ 20 November 2023 +

+ +
+ + + +
+

+ 19 November 2023 +

+ +
+ + + +
+

+ 9 November 2023 +

+ +
+ +
    +
  • Added extra header elements to the main site and the shrines to be dynamically displayed on certain days to celebrate special events. (Credit to KotOR Community Portal for the inspiration)
  • +
+ +
+

+ 30 October 2023 +

+ +
+ + + +
+

+ 18 October 2023 +

+ +
+ + + +
+

+ 13 October 2023 +

+ +
+ + + +
+

+ 4 October 2023 +

+ +
+ +
    +
  • Cassette Beasts shrine: Updated the Development History section of the Trivia page with info about the release of Update 1.5 and "Pier of the Unknown" DLC.
  • +
+ +
+

+ 3 October 2023 +

+ +
+ +
    +
  • Changed this website's font to Noto Sans.
  • +
  • Cassette Beasts shrine: Added link to my record of all the bootleg mosnters I have encountered to the Game Log page.
  • +
+ +
+

+ 28 September 2023 +

+ +
+ + + +
+

+ 15 September 2023 +

+ +
+ + + +
+

+ 13 September 2023 +

+ +
+ + + +
+

+ 11 September 2023 +

+ +
+ + + +
+

+ 10 September 2023 +

+ +
+ + + +
+

+ 7 September 2023 +

+ +
+ + + +
+

+ 6 September 2023 +

+ +
+ +
    +
  • Moved pages of my video game mods and playlists to Projects page.
  • +
+ +
+

+ 4 September 2023 +

+ +
+ + + +
+

+ 30 August 2023 +

+ +
+ + + +
+

+ 29 August 2023 +

+ +
+ +
    +
  • Added link button for the site's RSS feed.
  • +
  • Fixed the overflow issue of header images.
  • +
  • Added custom style for the Site Map page.
  • +
  • Improved accessibility of the site's design by customising the CSS :focus selector.
  • +
+ +
+

+ 28 August 2023 +

+ +
+ +
    +
  • A Summer’s End — Hong Kong 1986 shrine: Updated the main page with information about the spiritual sequel In the Ocean I Learned to Float.
  • +
  • Cassette Beasts shrine: Adjusted header image and added more images to the home page.
  • +
  • Leilukin Hub now has an RSS feed.
  • +
+ +
+

+ 26 August 2023 +

+ +
+ + + +
+

+ 21 August 2023 +

+ +
+ + + +
+

+ 18 August 2023 +

+ +
+ + + +
+

+ 15 August 2023 +

+ +
+ + + +
+

+ 14 August 2023 +

+ +
+ + + +
+

+ 13 August 2023 +

+ +
+ +
    +
  • Streamlined JavaScript code for the website's components.
  • +
  • Added JavaScript scripts to generate article table of contents automatically.
  • +
+ +
+

+ 10 August 2023 +

+ +
+ + + +
+

+ 8 August 2023 +

+ +
+ + + +
+

+ 3 August 2023 +

+ +
+ + + +
+

+ 28 July 2023 +

+ +
+ + + +
+

+ 27 July 2023 +

+ +
+ + + +
+

+ 26 July 2023 +

+ +
+ +
    +
  • Leilukin's Hub now has a site button for you to link to!
  • +
  • Restructured the navigation bar.
  • +
  • Rearranged CSS and JavaScript file directories.
  • +
  • Renamed custom CSS properties.
  • +
+ +
+

+ 25 July 2023 +

+ +
+ +
    +
  • Leilukin's Hub now has a guestbook!
  • +
  • A Summer’s End — Hong Kong 1986 shrine: Replaced some of the images on the shrine's pages, including the header image.
  • +
  • Moved the link to the site map from the navigation bar to the footer.
  • +
+ +
+

+ 12 July 2023 +

+ +
+ + + +
+

+ 28 June 2023 +

+ +
+ + + +
+

+ 27 June 2023 +

+ +
+ + + +
+

+ 26 June 2023 +

+ +
+ +
    +
  • Replaced incorrect uses of semantic HTML tags throughout the entire website, such as replacing <em> that were used for media titles with <cite>, <strong> that were used for styling with custom CSS class.
  • +
+ +
+

+ 23 June 2023 +

+ +
+ +
    +
  • The HTML, CSS and JavaScript of entire website has been rewritten to improve the site's layout! See the June 2023 Layout Rewrite for more information!
  • +
+ +
+

+ 15 June 2023 +

+ +
+ +
    +
  • Removed unnecessary CSS files.
  • +
  • Refactored the index page's HTML and CSS.
  • +
+ +
+

+ 11 June 2023 +

+ +
+ + + +
+

+ 9 May 2023 +

+ +
+ + + +
+

+ 5 May 2023 +

+ +
+ +
    +
  • Modify the web application manifest of this site to make this site look more like a mobile app when added to a mobile device's home screen.
  • +
+ +
+

+ 27 March 2023 +

+ +
+ + + +
+

+ 23 March 2023 +

+ +
+ +
    +
  • Switch the content of the left and right sidebars. Navigation links are now on the left sidebar, while the table of contents on the right sidebar.
  • +
  • Proper indentation of the HTML codes.
  • +
+ +
+

+ 22 March 2023 +

+ +
+ +
    +
  • Added the dates of publication of articles.
  • +
+ +
+

+ 20 March 2023 +

+ +
+ +
    +
  • Tweaked the format of the dates of publication and update of articles.
  • +
+ +
+

+ 19 March 2023 +

+ +
+ + + +
+

+ 2 March 2023 +

+ +
+ + + +
+

+ 18 February 2023 +

+ +
+ + + +
+

+ 17 February 2023 +

+ +
+ + + +
+

+ 16 February 2023 +

+ +
+ + + +
+

+ 10 February 2023 +

+ +
+ + + +
+

+ 7 February 2023 +

+ +
+ + + +
+

+ 31 January 2023 +

+ +
+ + + +
+

+ 30 January 2023 +

+ +
+ + + +
+

+ 28 January 2023 +

+ +
+ +
    +
  • Added a Links page.
  • +
  • Move the link to changelog to the sidebar.
  • +
  • Due to these new changes to the navigation links on the sidebar, I wrote a JavaScript file to dynamically generate the contents on the right sidebar and the footer across multiple pages on this site.
  • +
  • Adjust the line spacing and the spacing between the listed items on the changelog page.
  • +
  • Made adjustments to the relative paths in the HTML files, to ensure this site's favicons will show up on the title bar by default.
  • +
  • Fixed the issue of the page style not applied to the Not Found page.
  • +
  • Updated the About page.
  • +
  • Update the Page Not Found page.
  • +
+ +
+

+ 26 January 2023 +

+ +
+ + + +
+

+ 25 January 2023 +

+ +
+ + + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/2024/index.html b/changelogs/2024/index.html new file mode 100644 index 00000000..cdfe42b8 --- /dev/null +++ b/changelogs/2024/index.html @@ -0,0 +1,1021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Website Changelog Archive: 2024 | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelog Archive: 2024

+ + + +

Changelog of my website during the year of 2024.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + + + +
+

+ 22 July 2024 +

+ +
+ + + +
+

+ 21 July 2024 +

+ +
+ + + +
+

+ 20 July 2024 +

+ +
+ +
    +
  • Remake the mobile version of navigation menu by using the HTML popover attirbutes, allowing the navigation menu to be dismissed without JavaScript
  • +
+ +
+

+ 18 July 2024 +

+ +
+ +
    +
  • Add list of web cliques I joined to the home page
  • +
  • Add pixel cliques I joined to the Adoptables page
  • +
  • Add a Joined tab to the Links page to list the web cliques and widgets of web rings I joined, as well as linking to my fanlisting collective.
  • +
  • Upgrade Eleventy to version 3.0
  • +
  • Bundle page-specific CSS and JavaScript in the <head> element with Eleventy 3.0's built-in bundle plugin
  • +
+ +
+

+ 13 July 2024 +

+ +
+ +
    +
  • Add an inline SVG icon to external links
  • +
  • Use inline SVG for Font Awesome icons to remove the need of hosting Font Awesome assets
  • +
  • Add dark mode support for Cassette Beasts shrine based on user preference in system setting
  • +
+ +
+

+ 6 July 2024 +

+ +
+ + + +
+

+ 3 July 2024 +

+ +
+ + + +
+

+ 2 July 2024 +

+ +
+ + + +
+

+ 27 June 2024 +

+ +
+ + + +
+

+ 26 June 2024 +

+ +
+ + + +
+

+ 24 June 2024 +

+ +
+ + + +
+

+ 23 June 2024 +

+ +
+ + + +
+

+ 21 June 2024 +

+ +
+ + + +
+

+ 19 June 2024 +

+ +
+ + + +
+

+ 13 June 2024 +

+ +
+ +
    +
  • Add a Virtual Pets section to the home page.
  • +
  • The status.cafe widget and the Website Carbon badge on the home page will display a note about JavaScript being required for these widgets if the visitor has disabled JavaScript.
  • +
  • Remove JavaScript from the "Back to top" button.
  • +
+ +
+

+ 12 June 2024 +

+ +
+ + + +
+

+ 11 June 2024 +

+ +
+ +
    +
  • Improve "Back to top" button and footer link: +
      +
    • Replace arrow unicode with inline SVG for the button and border styling for the footer link
    • +
    • Display the footer link only if JavaScript is disabled
    • +
    • Use anchor HTML tag (<a>) instead of button tag (<button>) for the button
    • +
    +
  • +
  • Disable smooth scrolling for users with reduced motion settings.
  • +
+ +
+

+ 9 June 2024 +

+ +
+ +
    +
  • Convert most of the images on this website to AVIF format to reduce file size and save bandwidth.
  • +
  • Improve my status.cafe widget: +
      +
    • Write local JavaScript code to fetch data from status.cafe.
    • +
    • Display a loading message before the data fetch request is completed.
    • +
    • Display an error message if the data fetching fails.
    • +
    • Add a link to my status.cafe profile below the widget.
    • +
    +
  • +
+ +
+

+ 7 June 2024 +

+ +
+ +
    +
  • Update Leilukin's Hub's site button. This time, I made my site button myself by using Adobe Photoshop CS5.
  • +
  • Add a colophon page.
  • +
+ +
+

+ 6 June 2024 +

+ +
+ +
    +
  • Remove unused Font Awesome assets, including font and CSS files, to improve site performance.
  • +
  • Convert header images, playlist covers and my avatar to AVIF format to reduce file size.
  • +
  • Set shrine index images, shrine home page images and my avatar to lazy loading.
  • +
+ +
+

+ 4 June 2024 +

+ +
+ +
    +
  • Preload the Lexend regular and Lexend 700 font files to improve site performance, remove flash of unstyled text (FOUT) and prevent Cumulative Layout Shift (CLS).
  • +
  • Replace the Webrings section of my home page with a Badges section (though you can still see the list of webrings I have joined on my Links page).
  • +
  • Updates to Leilukin's Hub will no longer be pushed to Neocities. Read the "What Happens Now with My Neocities Account" section of my blog post, "Custom Domain Name and Hosting Change for Leilukin's Hub" for more information.
  • +
+ +
+

+ 2 June 2024 +

+ +
+ +
    +
  • Update the guestbook to add a warning message and a link to send comments via email if the Discord webhook fails.
  • +
+ +
+

+ 31 May 2024 +

+ +
+ + + +
+

+ 29 May 2024 +

+ +
+ + + +
+

+ 26 May 2024 +

+ +
+ +
    +
  • A Summer’s End — Hong Kong 1986 shrine: Add Passion Patch screenshots section to the Gallery page (Warning: The Passion Patch screenshots are not safe for work, though they are hidden by default when you visit the gallery page).
  • +
  • Add a "Skip to content" button for screen reader and keyboard users (thank you Kale for the inspiration).
  • +
+ +
+

+ 26 May 2024 +

+ +
+ +
    +
  • Add "Personal Sites I Love" section to the Links page.
  • +
+ +
+

+ 25 May 2024 +

+ +
+ + + +
+

+ 22 May 2024 +

+ +
+ + + +
+

+ 20 May 2024 +

+ +
+ +
    +
  • Replace the entire site's default font from Noto Sans to Lexend.
  • +
+ +
+

+ 19 May 2024 +

+ +
+ + + +
+

+ 18 May 2024 +

+ +
+ + + +
+

+ 14 May 2024 +

+ +
+ + + +
+

+ 9 May 2024 +

+ +
+ + + +
+

+ 29 April 2024 +

+ +
+ +
    +
  • Turn the top navigation manu into a hamburger menu when this website is viewed on mobile devices.
  • +
+ +
+

+ 27 April 2024 +

+ +
+ + + +
+

+ 21 April 2024 +

+ +
+ + + +
+

+ 20 April 2024 +

+ +
+ +
    +
  • Finished overhauling this entire website with the static site generator Eleventy.
  • +
+ +
+

+ 5 April 2024 +

+ +
+ + + +
+

+ 6 March 2024 +

+ +
+ + + +
+

+ 8 February 2024 +

+ +
+ + + +
+

+ 7 February 2024 +

+ +
+ +
    +
  • Projects: Added My Characters section.
  • +
+ +
+

+ 9 January 2024 +

+ +
+ + + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/index.html b/changelogs/index.html new file mode 100644 index 00000000..acdbda0a --- /dev/null +++ b/changelogs/index.html @@ -0,0 +1,736 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelogs | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelogs

+ + + +

Changelogs of my website.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + +

Latest Changelogs

+ +

22 July 2024

+ + +

21 July 2024

+ + +

20 July 2024

+
    +
  • Remake the mobile version of navigation menu by using the HTML popover attirbutes, allowing the navigation menu to be dismissed without JavaScript
  • +
+ +

18 July 2024

+
    +
  • Add list of web cliques I joined to the home page
  • +
  • Add pixel cliques I joined to the Adoptables page
  • +
  • Add a Joined tab to the Links page to list the web cliques and widgets of web rings I joined, as well as linking to my fanlisting collective.
  • +
  • Upgrade Eleventy to version 3.0
  • +
  • Bundle page-specific CSS and JavaScript in the <head> element with Eleventy 3.0's built-in bundle plugin
  • +
+ +

13 July 2024

+
    +
  • Add an inline SVG icon to external links
  • +
  • Use inline SVG for Font Awesome icons to remove the need of hosting Font Awesome assets
  • +
  • Add dark mode support for Cassette Beasts shrine based on user preference in system setting
  • +
+ +

6 July 2024

+ + +

3 July 2024

+ + +

2 July 2024

+ + +

27 June 2024

+ + +

26 June 2024

+ + +

24 June 2024

+ + +

23 June 2024

+ + +

21 June 2024

+ + +

19 June 2024

+ + +

13 June 2024

+
    +
  • Add a Virtual Pets section to the home page.
  • +
  • The status.cafe widget and the Website Carbon badge on the home page will display a note about JavaScript being required for these widgets if the visitor has disabled JavaScript.
  • +
  • Remove JavaScript from the "Back to top" button.
  • +
+ +

12 June 2024

+ + +

11 June 2024

+
    +
  • Improve "Back to top" button and footer link: +
      +
    • Replace arrow unicode with inline SVG for the button and border styling for the footer link
    • +
    • Display the footer link only if JavaScript is disabled
    • +
    • Use anchor HTML tag (<a>) instead of button tag (<button>) for the button
    • +
    +
  • +
  • Disable smooth scrolling for users with reduced motion settings.
  • +
+ +

9 June 2024

+
    +
  • Convert most of the images on this website to AVIF format to reduce file size and save bandwidth.
  • +
  • Improve my status.cafe widget: +
      +
    • Write local JavaScript code to fetch data from status.cafe.
    • +
    • Display a loading message before the data fetch request is completed.
    • +
    • Display an error message if the data fetching fails.
    • +
    • Add a link to my status.cafe profile below the widget.
    • +
    +
  • +
+ +

7 June 2024

+
    +
  • Update Leilukin's Hub's site button. This time, I made my site button myself by using Adobe Photoshop CS5.
  • +
  • Add a colophon page.
  • +
+ +

6 June 2024

+
    +
  • Remove unused Font Awesome assets, including font and CSS files, to improve site performance.
  • +
  • Convert header images, playlist covers and my avatar to AVIF format to reduce file size.
  • +
  • Set shrine index images, shrine home page images and my avatar to lazy loading.
  • +
+ + + + + + + + + + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/layouts/index.html b/changelogs/layouts/index.html new file mode 100644 index 00000000..d2baa38a --- /dev/null +++ b/changelogs/layouts/index.html @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Website Layout Archive | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Layout Archive

+ + + +

An archive for the page layout designs mt website has used.

+ + +
+ + + + + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ +
+

20 April 2024

+
+

Leilukin's Hub home page on 11 September 2023

+

Leilukin's Hub blog on 11 September 2023

+
+

11 September 2023 Blog Layout

+
+

Leilukin's Hub blog on 11 September 2023

+
+

23 June 2023

+
+

Leilukin's Hub home page on 23 June 2023

+
+

26 January 2023

+
+

Leilukin's Hub home page on 26 January 2023

+
+

11 September 2022 (Site Launch)

+
+

Leilukin's Hub index page during the site's launch on 11 September 2022

+

Leilukin's Hub My Creation page during the site's launch on 11 September 2022

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/page/2/index.html b/changelogs/page/2/index.html new file mode 100644 index 00000000..2a917559 --- /dev/null +++ b/changelogs/page/2/index.html @@ -0,0 +1,710 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelogs | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelogs

+ + + +

Changelogs of my website.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + +

Latest Changelogs

+ +

4 June 2024

+
    +
  • Preload the Lexend regular and Lexend 700 font files to improve site performance, remove flash of unstyled text (FOUT) and prevent Cumulative Layout Shift (CLS).
  • +
  • Replace the Webrings section of my home page with a Badges section (though you can still see the list of webrings I have joined on my Links page).
  • +
  • Updates to Leilukin's Hub will no longer be pushed to Neocities. Read the "What Happens Now with My Neocities Account" section of my blog post, "Custom Domain Name and Hosting Change for Leilukin's Hub" for more information.
  • +
+ +

2 June 2024

+
    +
  • Update the guestbook to add a warning message and a link to send comments via email if the Discord webhook fails.
  • +
+ +

31 May 2024

+ + +

29 May 2024

+ + +

26 May 2024

+
    +
  • A Summer’s End — Hong Kong 1986 shrine: Add Passion Patch screenshots section to the Gallery page (Warning: The Passion Patch screenshots are not safe for work, though they are hidden by default when you visit the gallery page).
  • +
  • Add a "Skip to content" button for screen reader and keyboard users (thank you Kale for the inspiration).
  • +
+ +

26 May 2024

+
    +
  • Add "Personal Sites I Love" section to the Links page.
  • +
+ +

25 May 2024

+ + +

22 May 2024

+ + +

20 May 2024

+
    +
  • Replace the entire site's default font from Noto Sans to Lexend.
  • +
+ +

19 May 2024

+ + +

18 May 2024

+ + +

14 May 2024

+ + +

9 May 2024

+ + +

29 April 2024

+
    +
  • Turn the top navigation manu into a hamburger menu when this website is viewed on mobile devices.
  • +
+ +

27 April 2024

+ + +

21 April 2024

+ + +

20 April 2024

+
    +
  • Finished overhauling this entire website with the static site generator Eleventy.
  • +
+ +

5 April 2024

+ + +

6 March 2024

+ + +

8 February 2024

+ + + + + + + + + + + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/page/3/index.html b/changelogs/page/3/index.html new file mode 100644 index 00000000..9679bc2d --- /dev/null +++ b/changelogs/page/3/index.html @@ -0,0 +1,708 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelogs | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelogs

+ + + +

Changelogs of my website.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + +

Latest Changelogs

+ +

7 February 2024

+
    +
  • Projects: Added My Characters section.
  • +
+ +

9 January 2024

+ + +

20 November 2023

+ + +

19 November 2023

+ + +

9 November 2023

+
    +
  • Added extra header elements to the main site and the shrines to be dynamically displayed on certain days to celebrate special events. (Credit to KotOR Community Portal for the inspiration)
  • +
+ +

30 October 2023

+ + +

18 October 2023

+ + +

13 October 2023

+ + +

4 October 2023

+
    +
  • Cassette Beasts shrine: Updated the Development History section of the Trivia page with info about the release of Update 1.5 and "Pier of the Unknown" DLC.
  • +
+ +

3 October 2023

+
    +
  • Changed this website's font to Noto Sans.
  • +
  • Cassette Beasts shrine: Added link to my record of all the bootleg mosnters I have encountered to the Game Log page.
  • +
+ +

28 September 2023

+ + +

15 September 2023

+ + +

13 September 2023

+ + +

11 September 2023

+ + +

10 September 2023

+ + +

7 September 2023

+ + +

6 September 2023

+
    +
  • Moved pages of my video game mods and playlists to Projects page.
  • +
+ +

4 September 2023

+ + +

30 August 2023

+ + +

29 August 2023

+
    +
  • Added link button for the site's RSS feed.
  • +
  • Fixed the overflow issue of header images.
  • +
  • Added custom style for the Site Map page.
  • +
  • Improved accessibility of the site's design by customising the CSS :focus selector.
  • +
+ + + + + + + + + + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/page/4/index.html b/changelogs/page/4/index.html new file mode 100644 index 00000000..630040d8 --- /dev/null +++ b/changelogs/page/4/index.html @@ -0,0 +1,733 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelogs | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelogs

+ + + +

Changelogs of my website.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + +

Latest Changelogs

+ +

28 August 2023

+
    +
  • A Summer’s End — Hong Kong 1986 shrine: Updated the main page with information about the spiritual sequel In the Ocean I Learned to Float.
  • +
  • Cassette Beasts shrine: Adjusted header image and added more images to the home page.
  • +
  • Leilukin Hub now has an RSS feed.
  • +
+ +

26 August 2023

+ + +

21 August 2023

+ + +

18 August 2023

+ + +

15 August 2023

+ + +

14 August 2023

+ + +

13 August 2023

+
    +
  • Streamlined JavaScript code for the website's components.
  • +
  • Added JavaScript scripts to generate article table of contents automatically.
  • +
+ +

10 August 2023

+ + +

8 August 2023

+ + +

3 August 2023

+ + +

28 July 2023

+ + +

27 July 2023

+ + +

26 July 2023

+
    +
  • Leilukin's Hub now has a site button for you to link to!
  • +
  • Restructured the navigation bar.
  • +
  • Rearranged CSS and JavaScript file directories.
  • +
  • Renamed custom CSS properties.
  • +
+ +

25 July 2023

+
    +
  • Leilukin's Hub now has a guestbook!
  • +
  • A Summer’s End — Hong Kong 1986 shrine: Replaced some of the images on the shrine's pages, including the header image.
  • +
  • Moved the link to the site map from the navigation bar to the footer.
  • +
+ +

12 July 2023

+ + +

28 June 2023

+ + +

27 June 2023

+ + +

26 June 2023

+
    +
  • Replaced incorrect uses of semantic HTML tags throughout the entire website, such as replacing <em> that were used for media titles with <cite>, <strong> that were used for styling with custom CSS class.
  • +
+ +

23 June 2023

+
    +
  • The HTML, CSS and JavaScript of entire website has been rewritten to improve the site's layout! See the June 2023 Layout Rewrite for more information!
  • +
+ +

15 June 2023

+
    +
  • Removed unnecessary CSS files.
  • +
  • Refactored the index page's HTML and CSS.
  • +
+ + + + + + + + + + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/page/5/index.html b/changelogs/page/5/index.html new file mode 100644 index 00000000..c7eeb1b5 --- /dev/null +++ b/changelogs/page/5/index.html @@ -0,0 +1,721 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelogs | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelogs

+ + + +

Changelogs of my website.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + +

Latest Changelogs

+ +

11 June 2023

+ + +

9 May 2023

+ + +

5 May 2023

+
    +
  • Modify the web application manifest of this site to make this site look more like a mobile app when added to a mobile device's home screen.
  • +
+ +

27 March 2023

+ + +

23 March 2023

+
    +
  • Switch the content of the left and right sidebars. Navigation links are now on the left sidebar, while the table of contents on the right sidebar.
  • +
  • Proper indentation of the HTML codes.
  • +
+ +

22 March 2023

+
    +
  • Added the dates of publication of articles.
  • +
+ +

20 March 2023

+
    +
  • Tweaked the format of the dates of publication and update of articles.
  • +
+ +

19 March 2023

+ + +

2 March 2023

+ + +

18 February 2023

+ + +

17 February 2023

+ + +

16 February 2023

+ + +

10 February 2023

+ + +

7 February 2023

+ + +

31 January 2023

+ + +

30 January 2023

+ + +

28 January 2023

+
    +
  • Added a Links page.
  • +
  • Move the link to changelog to the sidebar.
  • +
  • Due to these new changes to the navigation links on the sidebar, I wrote a JavaScript file to dynamically generate the contents on the right sidebar and the footer across multiple pages on this site.
  • +
  • Adjust the line spacing and the spacing between the listed items on the changelog page.
  • +
  • Made adjustments to the relative paths in the HTML files, to ensure this site's favicons will show up on the title bar by default.
  • +
  • Fixed the issue of the page style not applied to the Not Found page.
  • +
  • Updated the About page.
  • +
  • Update the Page Not Found page.
  • +
+ +

26 January 2023

+ + +

25 January 2023

+ + +

29 December 2022

+ + + + + + + + + + + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/page/6/index.html b/changelogs/page/6/index.html new file mode 100644 index 00000000..1b2d2487 --- /dev/null +++ b/changelogs/page/6/index.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelogs | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelogs

+ + + +

Changelogs of my website.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + +

Latest Changelogs

+ +

19 December 2022

+
    +
  • Added new resource, Star Wars: Knights of the Old Republic save files, to my resources page: KotOR 2 Light Side Female Saves with The Sith Lords Restored Content Mod and PartySwap.
  • +
+ +

16 December 2022

+ + +

11 December 2022

+ + +

8 December 2022

+ + +

27 November 2022

+ + +

24 November 2022

+ + +

22 November 2022

+ + +

16 November 2022

+ + +

12 November 2022

+ + +

9 November 2022

+ + +

23 October 2022

+ + +

22 October 2022

+ + +

17 October 2022

+
    +
  • Added new resource, Star Wars: Knights of the Old Republic save files, to my resources page: Light Side Female Saves with KOTOR 1 Community Patch and All Romances.
  • +
+ +

16 October 2022

+ + +

11 October 2022

+ + +

6 October 2022

+ + +

5 October 2022

+ + +

4 October 2022

+ + +

3 October 2022

+ + +

1 October 2022

+ + + + + + + + + + + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/changelogs/page/7/index.html b/changelogs/page/7/index.html new file mode 100644 index 00000000..08518cb8 --- /dev/null +++ b/changelogs/page/7/index.html @@ -0,0 +1,632 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelogs | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Website Changelogs

+ + + +

Changelogs of my website.

+ + +
+ + + + + + +
+ + + + + +

To get notified of the updates on this website, you can subscribe to the Leilukin's Hub RSS feed, which contains new articles, blog posts and website changelogs.

+ + +

Latest Changelogs

+ +

30 September 2022

+ + +

25 September 2022

+
    +
  • Added a button to my Buy Me a Coffee page on the home page and About page.
  • +
  • The top banner on each page is now linked to the home page.
  • +
+ +

20 September 2022

+ + +

16 September 2022

+
    +
  • Adjusted the font size, line and paragraph spacing of the website to make it easier to read and more responsive.
  • +
  • Redesigned the buttons on the website.
  • +
+ +

12 September 2022

+ + +

11 September 2022

+
    +
  • Website launch.
  • +
+ + + + + + + + + + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/colophon/index.html b/colophon/index.html new file mode 100644 index 00000000..b65372f1 --- /dev/null +++ b/colophon/index.html @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Colophon | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Colophon

+ + + +

Leilukin's Hub's colophon page.

+ + +
+ + + + + + + + + +
+ +

Information about how this website is built.

+
+

Technology

+
+
    +
  • Built with the static site generator Eleventy (version 3.0)
  • +
  • Templating languages: Nunjucks and Markdown
  • +
  • Code written with Visual Studio Code
  • +
  • JavaScript runtime: Bun
  • +
  • Source code available on GitHub and its Gitea mirror
  • +
+
+

Host and Domain

+
+
    +
  • Deployed to Netlify from this site's GitHub repository
  • +
  • The domain name, leilukin.com, was registered on 30 May 2024, was purchased from, registered on, and is managed by Porkbun
  • +
+
+

Plugins

+
+ +
+

Eleventy Community Plugins

+
+ +
+

markdown-it plugins

+
+

Eleventy has the Markdown parser markdown-it built in to render Markdown to HTML.

+ +
+

Self-hosted Assets

+
+
    +
  • Lexend font family — used as the default font of this site
  • +
  • Intel One Mono typeface — used as the monospaced font of this site
  • +
+
+

JavaScript

+
+

Due to this website being a static site, JavaScript is used to create dynamic and interactive components of this site. Here is a list of how JavaScript is used on this site:

+
    +
  • The header of every page uses JavaScript to detect the visitor's current date, so the header will display a top blurb and in some cases also changes the header background on certain dates, including: + +
  • +
  • Scott O'Hara's ARIA Tooltips script is used to implement accessible tooltips that meet Web Content Accessibility Guidelines (WCAG) 2.2 success criterion for 1.4.13: Content on Hover or Focus (Level AA), by allowing visitors to see tooltips on keyboard focus and dismiss tooltips by pressing the Escape key.
  • +
  • Zach Leatherman's details-utils JavaScript package is used to automatically expand sidebar table of contents on wide screens.
  • +
  • status.cafe widget, which is placed on the home page, uses JavaScript to fetch data of my latest status update.
  • +
  • Website Carbon Badge, which is placed on the home page, uses JavaScript to calculate the carbon footprint of this website.
  • +
  • Links page's Joined tab includes webring widgets that use JavaScript.
  • +
  • Guestbook uses JavaScript to render a form, send form data to my private Discord channel via Discord webhook, and fetch data from Google Sheets to display messages on the web page (guestbook code by Vera Konigin).
  • +
+

You can still access most of the content of this site with JavaScript disabled, but the above components will not work as intended.

+ + +

(This colophon page was last updated on 20 July 2024)

+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/feed.xml b/feed.xml new file mode 100644 index 00000000..4bef6973 --- /dev/null +++ b/feed.xml @@ -0,0 +1,373 @@ + + + Leilukin's Hub + Leilukin's personal website. + + + 2024-07-25T06:10:20Z + https://leilukin.com + + Leilukin + contact@leilukin.com + + + + Changelog: 22 July 2024 + + 2024-07-22T00:00:00Z + https://leilukin.com/ + <ul> +<li>Add a <a href="https://zine.kalechips.net/index">Salad Magazine</a> section to my <a href="https://leilukin.com/adoptables">Adoptables pages</a>.</li> +</ul> + + + + + Changelog: 21 July 2024 + + 2024-07-21T00:00:00Z + https://leilukin.com/ + <ul> +<li>Add a section for the <a href="https://divergentrays.com/kitty">Kitty Friends Pixel Club</a> to my <a href="https://leilukin.com/adoptables">Adoptables page</a>, including my kitty friends!</li> +</ul> + + + + + Changelog: 20 July 2024 + + 2024-07-20T00:00:00Z + https://leilukin.com/ + <ul> +<li>Remake the mobile version of navigation menu by using the HTML <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/popover"><code>popover</code></a> attirbutes, allowing the navigation menu to be dismissed without JavaScript</li> +</ul> + + + + + Changelog: 18 July 2024 + + 2024-07-18T00:00:00Z + https://leilukin.com/ + <ul> +<li>Add list of web cliques I joined to the home page</li> +<li>Add pixel cliques I joined to the <a href="https://leilukin.com/adoptables">Adoptables page</a></li> +<li>Add a <a href="https://leilukin.com/links/#joined">Joined</a> tab to the <a href="https://leilukin.com/links">Links page</a> to list the web cliques and widgets of web rings I joined, as well as linking to my fanlisting collective.</li> +<li>Upgrade Eleventy to version 3.0</li> +<li>Bundle page-specific CSS and JavaScript in the <code>&lt;head&gt;</code> element with Eleventy 3.0's <a href="https://github.com/11ty/eleventy-plugin-bundle">built-in bundle plugin</a></li> +</ul> + + + + + Changelog: 13 July 2024 + + 2024-07-13T00:00:00Z + https://leilukin.com/ + <ul> +<li>Add an inline SVG icon to external links</li> +<li>Use inline SVG for Font Awesome icons to remove the need of hosting Font Awesome assets</li> +<li>Add dark mode support for <a href="https://leilukin.com/shrines/cassettebeasts"><cite>Cassette Beasts</cite> shrine</a> based on user preference in system setting</li> +</ul> + + + + + Changelog: 6 July 2024 + + 2024-07-06T00:00:00Z + https://leilukin.com/ + <ul> +<li>Implement accessible tooltips that meet Web Content Accessibility Guidelines (WCAG) 2.2 success criterion for <a href="https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html">1.4.13: Content on Hover or Focus (Level AA)</a>, by utilising <a href="https://github.com/scottaohara/a11y_tooltips">Scott O'Hara's ARIA Tooltips</a> script. (Thank you <a href="https://www.groundedwren.com/">Vera</a> for your feedback on my previous implementation of the tooltips)</li> +</ul> + + + + + Changelog: 3 July 2024 + + 2024-07-03T00:00:00Z + https://leilukin.com/ + <ul> +<li>Add <a href="https://leilukin.com/links/#articles">Articles</a> and <a href="https://leilukin.com/links/#resources">Resources</a> tabs to the <a href="https://leilukin.com/links">links page</a>.</li> +<li>Show visible stylised tooltips for some website buttons on mouse hover or keyboard focus (thanks to <a href="https://solaria.neocities.org/accessibility">Solaria's web accessibility guide</a> for the inspiration).</li> +<li>Add a list of webrings my website is part of to the home page.</li> +</ul> + + + + + Changelog: 2 July 2024 + + 2024-07-02T00:00:00Z + https://leilukin.com/ + <ul> +<li>The main site header now would display a Disability Pride Month blurb and the disability pride flag during July</li> +<li><a href="https://fan.leilukin.com/">My fanlisting collective</a> and <a href="https://fan.leilukin.com/cassettebeasts"><cite>Cassette Beasts</cite> fanlisting</a> launched!</li> +<li><a href="https://leilukin.com/projects">Projects page</a>: +<ul> +<li>Reorganised pages for my video game mods into their own directory</li> +<li>Add code projects, started with <a href="https://leilukin.com/projects/code/bellabuffs-phpmailer">BellaBuffs with PHPMailer Integration</a></li> +</ul> +</li> +<li>New blog post: <a href="https://leilukin.com/blog/posts/2024-07-02-fanlisting-collective-launch">Cassette Beasts Fanlisting and My Fanlisting Collective Launched</a></li> +<li><a href="https://leilukin.com/links">Links page</a>: +<ul> +<li>Add tabs to sort my link collection by category (thanks to <a href="https://kalechips.net/projects/snippets/tabs">Kalechips' JavaScript-free tabs code scnippet</a> for the inspiration)</li> +<li>Add <a href="https://leilukin.com/links/#webmastery">webmastery resources</a></li> +</ul> +</li> +</ul> + + + + + Cassette Beasts Fanlisting and My Fanlisting Collective Launched | Blog + + 2024-07-02T00:00:00Z + https://leilukin.com/blog/posts/2024-07-02-fanlisting-collective-launch/ + <p>I am incredibly excited to announce the official launch of <a href="https://fan.leilukin.com/cassettebeasts">Land of Confusion</a>, <a href="https://thefanlistings.org/">The Fanlistings Network</a>-approved fanlisting for <cite>Cassette Beasts</cite>, and <a href="https://fan.leilukin.com/">Beehive</a>, my fanlisting collective! 🥳</p> +<p>If you are a fan of <cite>Cassette Beasts</cite>, feel free to join my fanlisting! If you like fanlistings as well, feel free to check out my fanlisting collective!</p> +<p>In addition, in light of the launch of my first fanlisting, I am also releasing <a href="https://leilukin.com/projects/code/bellabuffs-phpmailer">my fork of BellaBuffs</a>, the fanlisting script written in PHP, with integration of <a href="https://github.com/PHPMailer/PHPMailer">PHPMailer</a>, the email sending library!</p> +<p>My fanlisting collective and <cite>Cassette Beasts</cite> fanlisting are hosted on <a href="https://www.infinityfree.com/">InfinityFree</a>, since <a href="https://www.netlify.com/">Netlify</a>, which currently hosts the main site of Leilukin's Hub, does not support PHP.</p> +<div class="heading-wrapper h2"> +<h2 id="a-milestone">A Milestone</h2> +<a class="heading-anchor" href="https://leilukin.com/blog/posts/2024-07-02-fanlisting-collective-launch/#a-milestone" aria-labelledby="a-milestone"><span hidden="">#</span></a></div> +<p>In <a href="https://leilukin.com/blog/posts/2024-06-24-cassette-beasts-fanlisting-approved">my previous post</a>, I announced that The Fanlistings Network (also known as TFL.org) had approved my application for building and running a fanlisting for <cite>Cassette Beasts</cite>.</p> +<p>After completing the <cite>Cassette Beasts</cite> fanlisting on 30 June 2024, I submitted a <a href="https://thefanlistings.org/finished.php">finished form</a> to TFL.org to let them know that I have finished my fanlisting. The Fanlistings Network responded by emailing me and informing me thatthey have added the URL of my <cite>Cassette Beasts</cite> fanlisting to the list of approved fanlistings under the Games category and the <a href="https://www.thefanlistings.org/browse.php?show=games&amp;start=8">Computer, Console, &amp; Video Games subcategory</a> (<a href="https://web.archive.org/web/20240702062715/https://www.thefanlistings.org/browse.php?show=games&amp;start=8">view the web archive version</a>).</p> +<p>The launch of my <cite>Cassette Beasts</cite> fanlisting is a major moment for me as both a webmaster and a <cite>Cassette Beasts</cite> fan, as I am enthusiastic about the fact that the very first fanlisting I create would be for my absolute favourite video game.</p> +<div class="heading-wrapper h2"> +<h2 id="first-foray-in-php">First Foray in PHP</h2> +<a class="heading-anchor" href="https://leilukin.com/blog/posts/2024-07-02-fanlisting-collective-launch/#first-foray-in-php" aria-labelledby="first-foray-in-php"><span hidden="">#</span></a></div> +<p>My <cite>Cassette Beasts</cite> fanlisting is powered by <a href="https://www.jemjabella.co.uk/scripts/bellabuffs/">BellaBuffs</a>. I was new to PHP when I started considering building fanlistings myself, as my main site Leilukin's Hub is a static site, so building the <cite>Cassette Beasts</cite> fanlisting was my first foray in learning to code in PHP.</p> +<p>Before starting to actually work on building the <cite>Cassette Beasts</cite> fanlisting, I tried out <a href="https://scripts.indisguise.org/enthusiast/">Enthusiast</a>, the other commonly used fanlisting script also written in PHP. I tried <a href="https://github.com/DudeThatsErin/enth">Erin's fork of Enthusiast</a> specifically, since InfinityFree uses version 8.2 of PHP Enthusiast also has extra features that BellaBuffs does not have, including allowing fanlisting members to set passwords and even managing the entire fanlisting collective.</p> +<p>Unfortunately, I encountered a critical issue with Enthusiast when I tried it: whenever I added a fanlisting to my joined fanlisting list in the admin panel, the home page of the fanlisting collective would go completely blank. I do not know the cause of the issue, and I was not familiar enough with PHP to be confident in attempting to investigate the entire fanlisting collective code just to find the culprit, especially when it uses MySQL database to store data, adding another complexity in troubleshooting it.</p> +<p>Therefore, I later tried BellaBuffs, and chose BellaBuffs as the script to power my fanlistings, then code my own fanlisting collective myself.</p> +<p>There were a few setbacks I encountered when I was building the <a href="https://fan.leilukin.com/cassettebeasts"><cite>Cassette Beasts</cite> fanlisting</a> with BellaBuffs and hosting the fanlisting on InfinityFree — I learned that InfinityFree's free hosting plan <a href="https://forum.infinityfree.com/t/sending-email-from-your-website-php-mail/49242">does not support PHP <code>mail()</code> function</a>, which is used by BellaBuffs.</p> +<div class="heading-wrapper h2"> +<h2 id="integrating-phpmailer-into-bellabuffs">Integrating PHPMailer into BellaBuffs</h2> +<a class="heading-anchor" href="https://leilukin.com/blog/posts/2024-07-02-fanlisting-collective-launch/#integrating-phpmailer-into-bellabuffs" aria-labelledby="integrating-phpmailer-into-bellabuffs"><span hidden="">#</span></a></div> +<p>BellaBuffs includes the optional features to email new members after submitting the join form, email the fanlisting admin when a new member joins or email new members when their applications were approved. The original BellaBuffs script achieved this by using PHP's built-in <code>mail()</code> feature, which unfortunately the free hosting of InfinityFree does not support, so I had to figure out an alternative way for my fanlisting on InfinityFree to send emails.</p> +<p>Thankfully, InfinityFree suggested using PHPMailer, and even providing a <a href="https://github.com/InfinityFreeHosting/contactform">contact form powered by PHPMailer</a> as a sample. As a result, I spent time in trying to incorporate PHPMailer into BellaBuffs based on the InfinityFree's PHPMailer contact form code, and voilà, I did it!</p> +<p>I am glad that despite my inexperience in PHP, I was able to apply the programming knowledge I learned from building my main site and taking online coding courses to build my fanlisting.</p> +<p>After successfully setting up the <cite>Cassette Beasts</cite> fanlisting, I decided to fork BellaBuffs and release my version of the fanlisting script with PHPMailer integration, in case there are others who want to use BellaBuffs to build fanlistings, but cannot or do not want to use the PHP <code>mail()</code> function.</p> +<p>You can download my BellaBuffs fork and learn about how to use it from <a href="https://github.com/helenclx/BellaBuffs-PHPMailer">its GitHub repository</a>.</p> +<div class="heading-wrapper h2"> +<h2 id="building-beehive">Building Beehive</h2> +<a class="heading-anchor" href="https://leilukin.com/blog/posts/2024-07-02-fanlisting-collective-launch/#building-beehive" aria-labelledby="building-beehive"><span hidden="">#</span></a></div> +<p>To give myself more practice in PHP as I built my first fanlisting, I decided to code my fanlisting collective in PHP as well.</p> +<p>I decided to name my fanlisting collective Beehive, since I have been using my drawing of a bee with a pair of glasses as my main avatar on the Internet, I figured it would be a good idea to name a subsite of mine something related to bees.</p> +<p>Furthermore, Beehive is a fitting name for a fanlisting collective, as beehives house honey bees, while this website houses all the fanlistings I created, maintain, joined and have applied to join.</p> +<p>Welcome to Beehive! 🐝</p> + + + + + Changelog: 27 June 2024 + + 2024-06-27T00:00:00Z + https://leilukin.com/ + <ul> +<li>Added a <a href="https://leilukin.com/articles/palestine-masterlist/#spotlight-crowdfunding-campaigns">Spotlight Crowdfunding Campaigns</a> section to my <a href="https://leilukin.com/articles/palestine-masterlist">Palestine masterlist</a> to highlight fundraising campaigns that I have been asked to help and share by Palestinians on Tumblr, and that have been vetted by other Palestinians on Tumblr.</li> +</ul> + + + + + Changelog: 26 June 2024 + + 2024-06-26T00:00:00Z + https://leilukin.com/ + <ul> +<li>Added my other websites to my <a href="https://leilukin.com/projects">Projects page</a>.</li> +</ul> + + + + + Changelog: 24 June 2024 + + 2024-06-24T00:00:00Z + https://leilukin.com/ + <ul> +<li>New blog post: <a href="https://leilukin.com/blog/posts/2024-06-24-cassette-beasts-fanlisting-approved">My Cassette Beasts Fanlisting Application has been Approved</a></li> +</ul> + + + + + My Cassette Beasts Fanlisting Application has been Approved | Blog + + 2024-06-24T00:00:00Z + https://leilukin.com/blog/posts/2024-06-24-cassette-beasts-fanlisting-approved/ + <p>On 22 June 2024, I submitted an <a href="https://thefanlistings.org/start/apply.php">application form</a> to <a href="https://thefanlistings.org/">The Fanlistings Network</a>, also known as TFL.org, to build and run a <cite>Cassette Beasts</cite> fanlisting, and now TFL.org has approved my application! <cite>Cassette Beasts</cite> is now on TFL.org's approved list under the Games category and the <a href="https://www.thefanlistings.org/browse.php?show=games&amp;start=8">Computer, Console, &amp; Video Games subcategory</a> (<a href="https://web.archive.org/web/20240624045621/https%3A%2F%2Fwww.thefanlistings.org%2Fbrowse.php%3Fshow%3Dgames%26start%3D8">view the web archive version</a>).</p> +<details class="content-accordion"> + <summary class="content-accordion__summary">What is a fanlisting?</summary> + <div class="content-accordion__content"><p>For those who do not know what a fanlisting is, TFL.org has defined fanslitings as below:</p> +<blockquote> +<p>A fanlisting is simply an online listing of fans of a subject, such as a TV show, actor, or musician, that is created by an individual and open for fans from around the world to join. There are no costs, and the only requirements to join a fanlisting are your name and country. Fanlistings do not have to be large sites (although some are) - they are just a place where you can have your name listed along with other fans of the same subject. TheFanlistings.org is the original (but not only) web directory for fanlistings, dedicated to uniting fans across the globe.</p> +</blockquote> +</div> + </details> +<p>This is a major moment for me as both a webmaster and a <cite>Cassette Beasts</cite> fan. As a webmaster, I have been applying and joining fanlistings since I built my own website, as I have always found fanlistings a neat idea to gather and discover other people who share your interests across the world, as listing your country is a requirement when you apply to join a fanlisting. Recently, I have been considering building and running a fanlisting myself, with <cite>Cassette Beasts</cite> being my first choice since there is no fanlisting for <cite>Cassette Beasts</cite> yet. I began to dabble in PHP, so I can use a script like <a href="https://www.jemjabella.co.uk/scripts/bellabuffs/">BellaBuffs</a> to build a fanlisting. With my application approved by The Fanlistings Network, the <cite>Cassette Beasts</cite> fanlisting will be the first fanlisting I build and run.</p> +<p><cite>Cassette Beasts</cite> has become my favourite video game ever since I started playing it in July 2023, to the extent that not only I have a <a href="https://leilukin.com/shrines/cassettebeasts"><cite>Cassette Beasts</cite> shrine</a> on my website, I had already begun to consider creating the shrine even before beating the main campaign. I have also been tirelessly recommending the game throughout various online spaces. Therefore, I am honoured to be given this opportunity to build and run a fanlisting for <cite>Cassette Beasts</cite> that is approved by The Fanlistings Network, to add to my ongoing effort to boost the game's visibility.</p> +<p>The <cite>Cassette Beasts</cite> fanlisting is not ready yet at this moment, especially since I was not certain if The Fanlistings Network would approve my application, but now with their approval, I am going to work on building the <cite>Cassette Beasts</cite> fanlisting. TFL.org has a <a href="https://thefanlistings.org/start/rules.php">rule</a> that fanlisting owners need to complete their fanlisting within four weeks, so stay tuned for upcoming updates for my <cite>Cassette Beasts</cite> fanlisting!</p> +<p>Now that I will be running my own fanlisting, I will be also creating a fanlisting collective to gather all fanlistings I own, join and have applied to in one place. Since <a href="https://www.netlify.com/">Netlify</a>, which currently hosts the main site of Leilukin's Hub, does not support PHP, I will be hosting my fanlisting collective, including my <cite>Cassette Beasts</cite> fanlisting, on <a href="https://www.infinityfree.com/">InfinityFree</a>.</p> + + + + + Changelog: 23 June 2024 + + 2024-06-23T00:00:00Z + https://leilukin.com/ + <ul> +<li>Add <a href="https://leilukin.com/adoptables">Adoptables page</a>.</li> +</ul> + + + + + Changelog: 21 June 2024 + + 2024-06-21T00:00:00Z + https://leilukin.com/ + <ul> +<li>Leilukin's Hub now has a tumbleblog at <a href="https://tumbleblog.leilukin.com/">tumbleblog.leilukin.com</a>! Read the latest blog post to learn more: <a href="https://leilukin.com/blog/posts/2024-06-21-leilukins-hub-tumbleblog-launched">Leilukin's Hub Tumbleblog Launched</a>.</li> +</ul> + + + + + Leilukin's Hub Tumbleblog Launched | Blog + + 2024-06-21T00:00:00Z + https://leilukin.com/blog/posts/2024-06-21-leilukins-hub-tumbleblog-launched/ + <p>Leilukin's Hub now has a <a href="https://jaypeeonline.net/internet/tumbleblogs/">tumbleblog</a> at <a href="https://tumbleblog.leilukin.com/">tumbleblog.leilukin.com</a>!</p> +<p>I have been considering the idea of creating a microblog or tumbleblog for my website. The main site of <a href="https://leilukin.com/">Leilukin's Hub</a> already has a <a href="https://leilukin.com/blog/">blog</a>, but I also want another blog for shorter or more casual posts to document my thoughts and various stuff I find interesting or inspirational, especially ones that I am not sure how or where to put in the main site of Leilukin's Hub yet.</p> +<p>Tumblr has served me adequately for this purpose, which is one of the reasons it remains the social media platform I am the most active on since 2011 (yes, this means I have been on Tumblr for 13 years at this point). However, one of the reasons I eventually decided to create my own website was to not relying on social media to share my creations and interests. Therefore, an ideal Tumblr-style microblog for Leilukin's Hub would be self-hosted and sharing the same domain name of <code>leilukin.com</code>. After struggling to figure out how to implement a tumbleblog for Leilukin's Hub, I finally discovered the ideal blogging engine for my needs: <a href="https://chyrplite.net/">Chyrp Lite</a>.</p> +<p>Chyrp Lite has everything I am looking for to build a self-hosted Tumblr-style blog. The website explicitly states that you can have a tumbleblog with the blogging engine, with feathers that allow you to make not only text posts, but also image posts, audio posts, video posts, quote posts, link posts and even posts with files attached to allow visitors to download. Chyrp Lite is written in PHP, so it cannot be hosted on platforms that support static sites only, such as Neocities, GitHub Pages, Netlify (which is where <code>leilukin.com</code> is currently hosted on), etc. This is where <a href="https://www.infinityfree.com/">InfinityFree</a> came in.</p> +<p>InfinityFree is among the few hosting platforms that provides PHP and MySQL support for free, so I had created an InfinityFree account to start learning about PHP, even before discovering Chyrp Lite. In addition, InfinityFree supports custom domain without additional charges, so I have also added the <code>leilukin.com</code> domain name to my InfinityFree account, in case I need to host something with PHP and want to use a subdomain of <code>leilukin.com</code> for it. Now, I got to make use of what I learned to build this tumbleblog for Leilukin's Hub.</p> +<p>I started with adding a <code>tumbleblog.leilukin.com</code> custom subdomain to InfinityFree, configuring the DNS records on Porkbun (which manages the <code>leilukin.com</code> domain name), and requesting a free SSL certificate from InfinityFree to add HTTPS support to this blog. After making sure the <code>tumbleblog.leilukin.com</code> subdomain is ready, I followed the <a href="https://chyrplite.net/wiki/Quick-Start-Guide.html">Quick Start Guide</a> to set up Chyrp Lite, by uploading the blogging engine's files to InfinityFree with FTP, creating a MySQL database for this tumbleblog, and installing Chyrp Lite into my InfinityFree server. At last, I successfully installed Chyrp Lite on InfinityFree.</p> +<p>Leilukin's Hub Tumbleblog is now officially launched! 🥳</p> + + + + + Changelog: 19 June 2024 + + 2024-06-19T00:00:00Z + https://leilukin.com/ + <ul> +<li>Add new article: <a href="https://leilukin.com/articles/palestine-masterlist">Palestine Masterlist</a>.</li> +</ul> + + + + + Palestine Masterlist | Articles + + 2024-06-19T00:00:00Z + https://leilukin.com/articles/palestine-masterlist/ + <p><img src="https://leilukin.com/assets/buttons/misc/standwithpalestine.png" alt="Stand with Palestine" /></p> +<p>(Credit to <a href="https://hillhouse.neocities.org/journal/notes/palestine">rosemary</a> for the Stand with Palestine button)</p> +<p>From the river to the sea, Palestine will be free.</p> +<p>Here, I am compiling a list of resources related to Palestine. This list is not comprehensive by any means, but I still want to do my part in using my platform to support an important cause.</p> +<div class="heading-wrapper h2"> +<h2 id="educate-yourself">Educate Yourself</h2> +<a class="heading-anchor" href="https://leilukin.com/articles/palestine-masterlist/#educate-yourself" aria-labelledby="educate-yourself"><span hidden="">#</span></a></div> +<ul> +<li><a href="https://decolonizepalestine.com/">Decolonize Palestine</a></li> +<li>Haymarket's <a href="https://www.haymarketbooks.org/blogs/495-free-ebooks-for-a-free-palestine">Free Ebooks for a Free Palestine</a></li> +<li><a href="https://today.visualizingpalestine.org/">Palestine, Today: Explore how Palestine has been transformed since the Nakba</a></li> +<li><a href="https://palopenmaps.org/">Palestine Open Maps</a></li> +<li><a href="https://www.palestineremembered.com/">Palestine Remembered</a></li> +</ul> +<div class="heading-wrapper h2"> +<h2 id="articles">Articles</h2> +<a class="heading-anchor" href="https://leilukin.com/articles/palestine-masterlist/#articles" aria-labelledby="articles"><span hidden="">#</span></a></div> +<ul> +<li><a href="https://medium.com/@thegriefwitch/what-is-the-ethical-way-to-climb-out-of-hell-8ed51bdc327b">What is the Ethical Way to Climb Out of Hell?</a> by The Grief Witch (17 October 2023)</li> +</ul> +<div class="heading-wrapper h2"> +<h2 id="donations-and-charities">Donations and Charities</h2> +<a class="heading-anchor" href="https://leilukin.com/articles/palestine-masterlist/#donations-and-charities" aria-labelledby="donations-and-charities"><span hidden="">#</span></a></div> +<ul> +<li><a href="https://arab.org/click-to-help/palestine/">Daily click to help Palestine on arab.org</a></li> +<li><a href="https://www.pcrf.net/">Palestine Children's Relief Fund</a></li> +<li><a href="https://gazaesims.com/">eSims for Gaza</a></li> +<li><a href="https://gazafunds.com/">Gaza Funds</a></li> +<li><a href="https://docs.google.com/spreadsheets/d/1yYkNp5U3ANwILl2MknJi9G7ArY4uVTEEQ1CVfzR8Ioo/edit?gid=0#gid=0">verified Gaza Evacuation Fundraiser List</a></li> +<li><a href="https://docs.google.com/spreadsheets/d/1vtMLLOzuc6GpkFySyVtKQOY2j-Vvg0UsChMCFst_WLA/htmlview">Operation Olive Branch</a></li> +<li><a href="https://www.gofundme.com/f/helping-the-people-of-gaza-mutual-aid-fund">Helping the People of Gaza - Mutual Aid Fund</a></li> +<li><a href="https://x.com/careforgaza">Care for Gaza</a></li> +<li><a href="https://x.com/GazaDirectAid">Direct Aid for Gaza</a></li> +<li><a href="https://gaza-city.ensany.com/campaign/6737?lang=en">Life For Gaza</a></li> +<li><a href="https://www.taawon.org/en/content/gaza-needs-us-now">Taawon</a></li> +<li><a href="https://www.wfp.org/emergencies/palestine-emergency">World Food Programme (WFP)</a></li> +<li><a href="https://www.map.org.uk/">Medical Aid for Palestinians</a></li> +<li><a href="https://www.gofundme.com/f/urgent-help-dribrahem-to-treat-the-pateints-homeless-people">Help Dr. Ibrahem to treat the pateints homeless people</a></li> +<li><a href="https://www.gofundme.com/f/support-for-marginalized-refugees-in-jordan">Support for Tents in Gaza</a></li> +<li><a href="https://gaza-city.ensany.com/campaign/6737?lang=EN">Gaza Municipality's water project</a></li> +</ul> +<div class="heading-wrapper h2"> +<h2 id="boycotts">Boycotts</h2> +<a class="heading-anchor" href="https://leilukin.com/articles/palestine-masterlist/#boycotts" aria-labelledby="boycotts"><span hidden="">#</span></a></div> +<ul> +<li><a href="https://bdsmovement.net/">BDS Movement</a></li> +<li>Attention to website owners: <a href="https://boycottwix.org/">Boycott Wix</a> — The BDS movement has <a href="https://bdsmovement.net/Act-Now-Against-These-Companies-Profiting-From-Genocide">listed Wix as an organic boycott target</a>, meaning the BDS movement did not initiate this grassroots boycott campaign, but supports it due to the boycotted brand's complicity in Israel's genocide and apartheid against Palestinians.</li> +</ul> +<div class="heading-wrapper h2"> +<h2 id="spotlight-crowdfunding-campaigns">Spotlight Crowdfunding Campaigns</h2> +<a class="heading-anchor" href="https://leilukin.com/articles/palestine-masterlist/#spotlight-crowdfunding-campaigns" aria-labelledby="spotlight-crowdfunding-campaigns"><span hidden="">#</span></a></div> +<p>There have been Palestinians who reached out to me on Tumblr to ask for help with sharing their fundraising campaigns, so I am using my platform to share these campaigns. These campaigns have been verified by other Palestinians on Tumblr, so I encourage you to help to donate and share.</p> +<ul> +<li><a href="https://www.gofundme.com/f/ne9gzx-help-them-to-survive">Help...Save a Pregnant Mother's Life and Support Her Family</a> (verified by <a href="https://www.tumblr.com/nabulsi/751944563232587777">nabulsi</a> and <a href="https://www.tumblr.com/90-ghost/752304563682476032">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/help-sahar-and-her-family-to-evacuate-gaza">Help Sahar and Her Family to Evacuate Gaza</a> (verified by <a href="https://www.tumblr.com/el-shab-hussein/749777880017502208/another-fundraiser-i-trust">el-shab-hussein</a>)</li> +<li><a href="https://www.gofundme.com/f/help-us-escape-gaza-a-mothers-plea-for-safety">Help Us Escape Gaza: A Mother's Plea for Safety</a> (verified by <a href="https://docs.google.com/spreadsheets/d/1yYkNp5U3ANwILl2MknJi9G7ArY4uVTEEQ1CVfzR8Ioo/edit?pli=1&amp;gid=0#gid=0&amp;range=B186">el-shab-hussein and nabulsi</a>)</li> +<li><a href="https://www.gofundme.com/f/from-war-to-education-abdelrahmans-resilient-journey">From War to Education: Abdelrahman Resilient Journey</a> (verified by <a href="https://www.tumblr.com/nabulsi/753544070688915456">nabulsi</a> and <a href="https://www.tumblr.com/90-ghost/753258782216404992">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/i-have-nothing-left-my-home-and-workplace-have-be">Please Help Tahani save her children and husband</a> (verified by <a href="https://www.tumblr.com/el-shab-hussein/748756401076207616/list-of-fundraisers-for-direct-contacts-from">el-shab-hussein</a>)</li> +<li><a href="https://www.gofundme.com/f/please-help-shamaly-family-start-a-new-life">Please help Shamaly family SURVIVE Gaza &amp; start a new life!</a> (verified by <a href="https://www.tumblr.com/nabulsi/753715707609530368">nabulsi</a>)</li> +<li><a href="https://www.gofundme.com/f/reunite-us-with-our-beloved-4-kids-stuck-in-gaza">Help us reunite with our kids who are stuck in Gaza</a> (verified by <a href="https://www.tumblr.com/90-ghost/754096091530723328/donate-to-help-us-reunite-with-our-kids-who-are">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/help-alaa-family-to-survive-the-war-in-gaza">Urgent ! Save kids life .</a> (verified by <a href="https://www.tumblr.com/90-ghost/751443466082484224">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/wyuehr-trapped-family-in-gaza-appeals-for-help-to-survive">Trapped Family in Gaza Appeals for Help to Survive</a> (verified by <a href="https://www.tumblr.com/nabulsi/753363183754952704">nabulsi</a>, <a href="https://www.tumblr.com/fairuzfan/752928036559749120">fairuzfan</a> and <a href="https://www.tumblr.com/90-ghost/752026987709825024">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/help-ahmed-family-to-travel">Help Ahmed family to travel to a save place</a> (veridied by <a href="https://www.tumblr.com/nabulsi/752576616277868544/hello-how-are-you-my-name-is-ahmed-im-from">nabulsi</a>)</li> +<li><a href="https://www.gofundme.com/f/byt93-help-my-family-escape-gaza">Help my family escape Gaza</a> (verified by <a href="https://www.tumblr.com/nabulsi/754296720770383872/donate-to-help-my-family-escape-gaza-organized-by">nabulsi</a>)</li> +<li><a href="https://www.gofundme.com/f/hope-for-gaza-support-ashrafs-family-rebuild-their-lives">Hope for Gaza: Support Ashraf's Family Rebuild Their Lives</a> (verified by <a href="https://www.tumblr.com/90-ghost/754535164856664064/legit-fundraiser">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/help-sara-and-her-family-to-evacuate-gaza">Help Zaen and Yehya to get out of Gaza</a> (verified by <a href="https://www.tumblr.com/90-ghost/754093176508268544">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/btuqqt-save-my-familys-life">A Father's Plea: Help Save My Family</a> (verified by <a href="https://www.tumblr.com/el-shab-hussein/754087744556449792/vetted-family-fundraiser-masterpost-3">el-shab-hussein</a>)</li> +<li><a href="https://www.gofundme.com/f/help-moamen-majed-rebuild-his-life-after-the-war">Help Moamen Majed rebuild his life after the war</a> (verified by <a href="https://www.tumblr.com/90-ghost/755355718664830976/moamenmajed-gaza-are-they-a-vetted-fundraiser">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/save-gaza-a-brighter-future-for-aya-and-her-family">Save Gaza: A Brighter Future for Aya and Her Family</a> (verified by <a href="https://www.tumblr.com/90-ghost/754992024939347968">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/emergency-help-my-relatives-evacuate-to-safety">EMERGENCY: help my relatives evacuate to safety</a> (verified by <a href="https://www.tumblr.com/90-ghost/756556584649424896">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/support-safaas-quest-to-get-her-family-to-safety">Support Safaa's Quest To Get Her Family To Safety</a> (verified by <a href="https://www.tumblr.com/90-ghost/756556669674274816">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/help-doaa-rebuild-her-sewing-business">Help Doaa Rebuild Her Sewing Business</a> (verified by <a href="https://www.tumblr.com/90-ghost/756556522290626560">90-ghost</a>)</li> +<li><a href="https://www.gofundme.com/f/help-the-munna-tashmali-family-rebuild-their-home-and-future">Help the Munna Tashmali Family Rebuild Their Home and Future</a> (verified by <a href="https://www.tumblr.com/nabulsi/754393532315353089/donate-to-help-the-munna-tashmali-family-rebuild">nabulsi</a>)</li> +</ul> + + + + + Changelog: 13 June 2024 + + 2024-06-13T00:00:00Z + https://leilukin.com/ + <ul> +<li>Add a Virtual Pets section to the home page.</li> +<li>The <a href="https://status.cafe/">status.cafe</a> widget and the <a href="https://www.websitecarbon.com/badge/">Website Carbon badge</a> on the home page will display a note about JavaScript being required for these widgets if the visitor has disabled JavaScript.</li> +<li>Remove JavaScript from the &quot;Back to top&quot; button.</li> +</ul> + + + + + Changelog: 12 June 2024 + + 2024-06-12T00:00:00Z + https://leilukin.com/ + <ul> +<li>Remake the navigation hamburger menu for mobile, so JavaScript is no longer needed to open and close the navigation menu, although JavaScript is still used to enable closing the menu with the Escape key. (Special thanks to Kale for the <a href="https://kalechips.net/projects/snippets/burger">accessible hamburger menu code snippet</a>).</li> +<li>New blog post: <a href="https://leilukin.com/blog/posts/2024-06-12-performance-improvement-leilukins-hub/">Improving Site Performance of Leilukin's Hub</a>.</li> +</ul> + + + \ No newline at end of file diff --git a/guestbook/index.html b/guestbook/index.html new file mode 100644 index 00000000..fcf16672 --- /dev/null +++ b/guestbook/index.html @@ -0,0 +1,611 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Guestbook | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Guestbook

+ + + +

Leave a message for Leilukin.

+ + +
+ + + + + + +
+ + +

Guestbook Archive: 123Guestbook

+ +

Feel free to say hi and connect with me! The comment field supports Markdown links and and HTML.

+ +

JavaScript is required for this guestbook to function. Special thanks to Vera Konigin for this guestbook widget!

+ + + + +

Guest Messages

+ + + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..83adbe10 --- /dev/null +++ b/index.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Welcome to Leilukin's Hub!

+ + + + +
+ + + + + + +
+ +
+

Hello! You can call me Leilukin. Welcome to my website! This site is my own personal hub and corner on the internet.

+ +

You can browse all my contents published on this site through the Archive page, or the Content Categories page. You can use the site map to navigate this website.

+ +

Feel free to drop a message and say hi on my guestbook! You can also contact me by sending me an email. Using plain text email is encouraged.

+ +

Read the About page to learn more about this site and its webmaster.

+ +

Enjoy your stay!

+ + +
+ +
+

Link to My Website

+ +

You can link to my website with the following button. I strongly recommend you to upload my site button to your own website instead of hotlinking the button.

+ +Leilukin's Hub website button + +

(I created this site button myself with Adobe Photoshop CS5)

+
+ +
+

What is New?

+ +
+

Major News: 31 May 2024

+

Leilukin's Hub now has a custom domain name: leilukin.com! In addition, this site is now hosted on Netlify.

+

You can read my blog post about the new domain name and hosting change for more information.

+
+ +
+

My Lastest Status

+
+
+ +
+ +

View my statuses on status.cafe

+
+ +
+ +

Changelog: 22 July 2024

+ + +

View all site changelogs

+
+

You can subscribe to the Leilukin's Hub RSS feed to get notified of the updates on this website, including new articles, blog posts and website changelogs.

+
+ +
+

Spotlight: Palestine

+ Stand with Palestine +

From the river to the sea, Palestine will be free.

+

Palestine Masterlist

+

(Credit to rosemary for the Stand with Palestine button)

+
+ +
+

Virtual Pets

+

Feel free to check out my virtual pets and feed them!

+
    +
  • + Tam, my tamaNOTchi +
  • +
  • + Shelly, my Wobble +
  • +
+
+ +
+

Always Proud

+
    +
  • + 2018 Progress Flag +
  • +
  • + 9 stripe rainbow flag +
  • +
  • + Lesbian pride flag +
  • +
  • + Non-binary pride flag +
  • +
  • + Demigirl pride flag +
  • +
  • + Agender pride flag +
  • +
  • + Bigender pride flag +
  • +
  • + Disability pride flag +
  • +
+

Credit to Dime for these pride buttons!

+
+ +
+

Web Cliques

+ + +

Pixel cliques I joined can be found on my Adoptables page.

+
+ +
+

Webrings

+

Leilukin's Hub is part of the following webrings:

+ + +

Pending webring membership:

+ +
+ +
+

Badges

+
+ +
+ +
+ +
+

Support Me

+

If you enjoy my work, you can support me on Ko-Fi.

+
+ + Buy Me a Coffee at ko-fi.com +
+
+ + +
+ + + + +
+
+ + + + + + + \ No newline at end of file diff --git a/links/index.html b/links/index.html new file mode 100644 index 00000000..695dc2e1 --- /dev/null +++ b/links/index.html @@ -0,0 +1,1042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Links | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Links

+ + + +

A curated collection of links.

+ + +
+ + + + + + +
+ + +
+

Link to My Website

+

You can link to my website with the following button. I strongly recommend you to upload my site button to your own website instead of hotlinking the button.

+ +Leilukin's Hub website button + +

(I created this site button myself with Adobe Photoshop CS5)

+
+ +
+

Links by Category

+ +

Use the following tabs to view my link collection by category.

+ +
+ +
+ +
+
+

+ Websites +

+ +
+

Personal Sites I Enjoy

+ + + + +

Link Exchanges

+ + +

Directories

+ + + +

Communities

+ + + + Back to tabs +
+
+
+

+ Joined +

+ +
+ +

Web Cliques

+ + +

Pixel cliques I joined can be found on my Adoptables page.

+ +

Fanlistings

+

Check out Beehive, my fanlisting collective to see all the fanlistings I own, have joined or have applied to join.

+ +

Webrings

+ + + + Back to tabs +
+
+
+

+ Webmastery +

+ +
+
+

Webmastery Tutorials

+
+ +
+

Webmastery Guides

+
+ +
+

Web Accessibility

+
+ +
+

Webmastery Resources

+
+ + + + +

(This Webmastery list was last updated on 21 July 2024)

+ + Back to tabs +
+
+
+

+ Articles +

+ +
+
+

LGBTQ+

+
+ +
+

Race

+
+ +
+

Media Criticism

+
+ +
+

Web

+
+ +
+

Uncategorised

+
+ + + + +

(This Articles list was last updated on 23 July 2024)

+ + Back to tabs +
+
+
+

+ Resources +

+ +
+
+

Archives

+
+ +
+

Bypass Paywalls

+
+ +
+

Gaming

+
+ +
+

Video Game Mods

+
+

These are lists of video game mods I use for my own playthroughs.

+ +
+

Images

+
+
    +
  • Squoosh — Privacy-friendly image compressor
  • +
+
+

Privacy

+
+ +
+

Software and Website Alternatives

+
+
    +
  • AlternativeTo — Crowdsourced software recommendations
  • +
  • Indie Wiki Buddy — Browser extension to discover indie wiki alternatives to Fandom.com wikis, and redirect Fandom.com wikis to a Breezewiki front end
  • +
+ + + + Back to tabs +
+
+ + +
+ + + + +
+
+ + + + + + + \ No newline at end of file diff --git a/now/index.html b/now/index.html new file mode 100644 index 00000000..527aa9c6 --- /dev/null +++ b/now/index.html @@ -0,0 +1,454 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Now | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Now

+ + + +

What Leilukin is doing now.

+ + +
+ + + + + + +
+

This page was last updated on 2 July 2024.

+

This is my /now page. You can find more pages like this at nownownow.com.

+

You can also check out my status.cafe profile for my latest short status updates.

+
+

Participating in Personal Web Spaces

+
+

I have been making a more active effort in participating in personal web spaces and connecting with other webmasters, through various methods including leaving messages on others' guestbooks, sending other webmasters emails, linking to each other's websites, following each other's Neocities profiles, etc.

+

Furthermore, I joined 32-Bit Cafe on both its Discourse forum and Discord on 15 June 2024, and earned the New Member of the Month for June 2024 on the Discourse forum.

+
+

What I am Working on

+
+
+

Building a Cassette Beasts Fanlisting and My Fanlisting Collective

+
+

I had been working on building buiing the Cassette Beasts fanlisting, with the approval from The Fanlistings Network, and my fanlisting colellective to gather all fanlistings I own, join and have applied in one place. Both the Cassette Beasts fanlisting and my fanlisting collective have been launched on 2 July 2024.

+
+

Updating my Star Wars: Knights of the Old Republic mods

+
+

As part of my collaboration with KOtOR Community Portal's mod builds, I have updated KotOR 1 Twi'lek Male NPC Diversity, PartySwap and PartySwap and Extended Enclave Compatibility Patch to ensure my mods are bug-free and compatible with other mods in the mod builds, and to prepare for the next iteration of the mod builds.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/projects/code/bellabuffs-phpmailer/index.html b/projects/code/bellabuffs-phpmailer/index.html new file mode 100644 index 00000000..f23f4e28 --- /dev/null +++ b/projects/code/bellabuffs-phpmailer/index.html @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BellaBuffs with PHPMailer Integration | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

BellaBuffs with PHPMailer Integration

+ + + +

My fork of BellaBuffs, with PHPMailer powering the email sending features.

+ + +
+ + + + + + +
+ +

This is a fork of the fanlisting PHP script BullaBuffs, with the email sending library PHPMailer integrated.

+

BellaBuffs includes the optional features to email new members after submitting the join form, email the fanlisting admin when a new member joins or email new members when their applications were approved. The original BellaBuffs script achieved this by using PHP's built-in mail() feature.

+

This fork replaces the PHP mail() functions from BellaBuffs with PHPMailer, allowing a fanlisting to send out emails with SMTP, provided the fanlisting owner chooses to enable them, even if the hosting server does not support the PHP mail() function.

+

I created this BellaBuffs fork when I was building the Cassette Beasts fanlisting with BellaBuffs and hosting the fanlisting on InfinityFree. I learned that InfinityFree's free hosting plan does not support PHP mail() function, so incorporating PHPMailer was the solution to allow the Cassette Beasts fanlisting to send emails.

+

More information about my BellaBuffs fork and instructions for how to use it can be found on its GitHub repository and its Gitea repository mirror.

+
+

Features

+
+
    +
  • Integrate PHPMailer for the email sending features, should the fanlisting owner enables these features
  • +
  • Email sending features are enabled by default, but can be disabled in prefs.php
  • +
  • HTML5 form validation, including E-mail and URL input types and the required attribute
  • +
  • Update list of countries
  • +
  • Add a buttons folder (with a placeholder file to enable the folder to be pushed via Git), so users do not need to manually create the folder to store uploaded buttons
  • +
  • Allows fnalisting members to change their favourites with the update form if favourites field is enabled
  • +
+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/projects/index.html b/projects/index.html new file mode 100644 index 00000000..0c83bd33 --- /dev/null +++ b/projects/index.html @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Projects | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Projects

+ + + +

Things Leilukin has created.

+ + +
+ + + + + + + + + +
+
+

My Other Websites

+
+ +
+
+

My Code Projects

+
+ +
+
+

My Drawings

+
+

My drawings can be found on my art blog on Tumblr:

+

🎨 Leilukin's Art Blog

+
+
+

My Video Game Mods

+
+

I have created mods (short for "modifications") for the following video games:

+ +
+
+

My Playlists

+
+

You can check out the playlists I have made on my dedicated page.

+
+
+

My Characters

+
+

I have created my own characters for various media and universes. You can check out my characters here.

+
+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/projects/playlists/index.html b/projects/playlists/index.html new file mode 100644 index 00000000..8973ceb6 --- /dev/null +++ b/projects/playlists/index.html @@ -0,0 +1,545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + My Music Playlists | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

My Music Playlists

+ + + +

Music playlists that I have created.

+ + +
+ + + + + + + + + +
+
+

My Dear Summer Lover

+
+
+ Cover image of A Summer’s End fanmix 'My Dear Summer Lover: A Sam x Michelle Fanmix' +
+[Image description: Sam and Michelle from A Summer’s End almost kisses, with a play symbol and text on the top left corner, and the text "My Dear Summer Lover: A Sam x Michelle Fanmix" in a digital style font in front.] +
+
+

A fanmix for the visual novel A Summer’s End — Hong Kong 1986, dedicated to Sam and Michelle’s love story.

+

This mix contains mostly Cantonese and English songs, with one Mandarin song. Majority of these songs were performed by Hong Kong artists and released in the 80s, because A Summer’s End took place in Hong Kong and in the 80s.

+

I have carefully selected and arranged these tracks, so the lyrics would reflect Sam and Michelle’s relationship development throughout A Summer’s End. Therefore, the content of this mix could be considered spoilers if you have not played the visual novel.

+

Since Oracle and Bone has cited Anita Mui as a major inspiration for them and this visual novel, I have also included multiple songs performed by Anita Mui in this mix. Because A Summer’s End is a lesbian story, when I was choosing which songs to include in this mix, I also prioritize songs that were performed by women artists.

+

Tracklist:

+
    +
  1. 輕輕嘆 (Sigh Softly) — Deanie Ip
  2. +
  3. 愛我便說愛我吧 (Just Say You Love Me) — Anita Mui
  4. +
  5. 夏日戀人 (Summer Lover) — Anita Mui
  6. +
  7. 星空下的戀人 (Lovers Under the Stars) — Shirley Kwan
  8. +
  9. I Want Your Love — CHIC
  10. +
  11. 激情 (Passion) — Sandy Lam
  12. +
  13. When Will I See You Again — Teresa Carpio
  14. +
  15. 愛你、想你 (Love You, Miss You) — Anita Mui
  16. +
  17. Within You’ll Remain — Julia Hsu
  18. +
  19. I Want to Know What Love Is — Tina Arena
  20. +
  21. Touch — Anita Mui
  22. +
  23. 親密愛人 (Intimate Lover) — Anita Mui
  24. +
+

Listen on Spotify

+ +
+

Mandopop LGBTQ+ Anthem 華語流行音樂同志國歌

+
+
+ Cover of the Mandopop LGBTQ+ Anthem playlist +
+同志國歌[Image description: A progress pride flag, with the Traditional Chinese words, 同志國歌, meaning queer anthem on top.] +
+
+

A collection of Mandarin queer anthems.

+

I made this playlist after discovering Wikipedia's list of Chinese queer anthems on the article 同志國歌, the Mandarin article for Gay Anthem.

+

Listen on Spotify

+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/projects/videogamemods/kotor1/index.html b/projects/videogamemods/kotor1/index.html new file mode 100644 index 00000000..1afc3cc7 --- /dev/null +++ b/projects/videogamemods/kotor1/index.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + My Mods for Star Wars: Knights of the Old Republic | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

My Mods for Star Wars: Knights of the Old Republic

+ + + +

List of video game mods I have made for Star Wars: Knights of the Old Republic.

+ + +
+ + + + + + + + + +
+

Please make sure you have read and followed my instructions before asking for help or reporting any issue with my mods!

+

If your issue is not addressed on my mod's page, ask for support or report issues with my mods on the mod's page on Deadly Stream, Nexus Mods or send me an email.

+
+

Player & Party Members

+
+
+

Juhani Dialogue Restoration

+
+

+Banner of Juhani Dialogue Restoration mod +

Restores Juhani's conversations with the player that are unused or easy to miss in vanilla KotOR.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Carth Onasi and Male PC Romance

+
+

+Banner of Carth Onasi and Male PC Romance mod +

Makes Carth Onasi's romance subplot available for male player characters. Read the FAQ article before asking questions about my same-gender romance mods for the KotOR series!

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Bastila and Carth Romance Removal

+
+

+Banner of Bastila and Carth Romance Removal mod +

Removes Bastila and Carth's romance by removing all romance-related dialogue from their conversations.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Leilukin's Juhani's Outfit Reskin Pack

+
+

+Banner of Leilukin's Juhani's Outfit Reskin Pack mod +

Reskins Juhani's outfit by changing the outfit's color scheme, with multiple versions of reskin provided.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Jolee in Unique Outfit Introduction

+
+

+Banner of Jolee in Unique Outfit Introduction mod +

Makes Jolee Bindo wear his signature robe when you meet him on Kashyyyk, before he joins your party.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

KotOR 1 Improved Party Outfits

+
+

+Banner of KotOR 1 Improved Party Outfits mod +

Adds new items to improve the properties of the default outfits of the human and humanoid party members of TSL, namely Bastila, Canderous, Carth, Jolee, Juhani and Mission.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Darth Revan Texture for Star Forge Robes

+
+

+Banner of Darth Revan Texture for Star Forge Robes mod +

Makes the Star Forge Robes to have the same texture and inventory icon as Darth Revan's Robes.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Non-Playable Characters

+
+
+

KotOR 1 Twi'lek Male NPC Diversity

+
+

+Banner of KotOR 1 Twi'lek Male NPC Diversity mod +

Diversifies the appearances of Twi'lek male NPCs in KotOR 1 by giving the named Twi'lek male NPCs different looks instead of the generic NPC looks.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

KotOR 1 Twi'lek Female NPC Diversity

+
+

+Banner of KotOR 1 Twi'lek Female NPC Diversity mod +

Diversifies the appearances of Twi'lek female NPCs by giving the named Twi'lek female NPCs different looks instead of the generic NPC looks.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Belaya's Unique Look

+
+

+Banner of Belaya's Unique Look mod +

Gives the NPC Belaya a unique look instead of a generic NPC look.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Human Xor Restoration

+
+

+Banner of Human Xor Restoration mod +

Restores the original appearance of the NPC Xor in the Xbox version of KotOR, by changing his species from a Twi'lek to a human.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Human Xor Unique Look

+
+

+Banner of Human Xor Unique Look mod +

Changes the NPC Xor's appearance by making him a human with a unique look to make him different from other human NPCs.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

KotOR 1 No Gendered Dialogue from Male NPCs

+
+

+Banner of KotOR 1 No Gendered Dialogue from Male NPCs mod +

MOD_DESC

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

PC Dialogue with Davik's Slaves Change

+
+

+Banner of PC Dialogue with Davik's Slaves Change mod +

Removes the option for the player character to flirt with Davik Kang's slaves, or give the player Dark Side options for requesting a massage from the slaves. Threatening the slaves also gives the player Dark Side points.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Gameplay

+
+
+

Trask Ulgo Without Tutorials

+
+

+Banner of Trask Ulgo Without Tutorials mod +

Removes the tutorial elements from the game, while keeps Trask Ulgo as a party member in the first area of the Endar Spire.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Music

+
+
+

Mysterious Box Music for Unknown World

+
+

+Banner of Mysterious Box Music for Unknown World mod +

This mod will make the Mysterious Box's ambient music played in some areas of the Unknown World.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/projects/videogamemods/kotor2/index.html b/projects/videogamemods/kotor2/index.html new file mode 100644 index 00000000..8aba156d --- /dev/null +++ b/projects/videogamemods/kotor2/index.html @@ -0,0 +1,735 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + My Mods for Star Wars: Knights of the Old Republic II: The Sith Lords | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + + + +

My Mods for Star Wars: Knights of the Old Republic II: The Sith Lords

+ + + +

List of video game mods I have made for Star Wars: Knights of the Old Republic II: The Sith Lords.

+ + +
+ + + + + + + + + +
+

Please make sure you have read and followed my instructions before asking for help or reporting any issue with my mods!

+

If your issue is not addressed on my mod's page, ask for support or report issues with my mods on the mod's page on Deadly Stream, Nexus Mods or send me an email.

+
+

Important Note for Steam Users

+
+

If you play KotOR 2 on Steam, I DO NOT recommend using the Steam Workshop to mod KotOR 2 at all, especially if you want to use any of my mods. I recommend reading this post on why NOT to use the Steam Workshop.

+

The sheer amount of mod compatibility issues the Steam Workshop can cause to KotOR 2 mods is precisely why I will never upload any of my KotOR 2 mods to Steam Workshop.

+
+

Same-Gender Romances

+
+

Before you ask any questions about my same-gender romance mods for the KotOR series, read the FAQ article first!

+
+

Atton Rand and Male Exile Romance

+
+

+Banner of Atton Rand and Male Exile Romance mod +

Makes Atton flirts with and expresses romantic interests for male Exiles.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Handmaiden and Female Exile - Disciple and Male Exile Romance

+
+

+Banner of Handmaiden and Female Exile - Disciple and Male Exile Romance mod +

Makes the Handmaiden a romance option for female Exiles and the Disciple a romance option for male Exiles.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Visas Marr and Female Exile Romance

+
+

+Banner of Visas Marr and Female Exile Romance mod +

Makes the Visas Marr romance scene available for female Exiles.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Alternate Revan Romances REDUX

+
+

+Banner of Alternate Revan Romances REDUX mod +

Gives players options to set Revan's love ineterest(s), or lack thereof. Updated version of felixfelicitas' Alternate Revan Romances mod.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Darth Sion and Male Exile Mod

+
+

+Banner of Darth Sion and Male Exile Mod mod +

Makes Darth Sion develop the same affections to a male Exile like he did to a female Exile in vanilla KotOR 2.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Dahnis Flirt Option for Female PC

+
+

+Banner of Dahnis Flirt Option for Female PC mod +

Makes the NPC Dahnis flirt with the player character regardless of gender, including a female PC. A female PC also gets the option to flirt back.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+

Party Members

+
+

PartySwap

+
+

+Banner of PartySwap mod +

Allows you to recruit both Handmaiden and Disciple in the same playthrough regardless of the player character's gender. Mod originally created by DarthTyren. I have taken over the management and development of this mod since July 2023 due to DarthTyren's departure from the KotOR modding scene.

+

Download the mod:

+
Deadly Stream
+

+
+

Leilukin’s Kreia Reskin

+
+

+Banner of Leilukin’s Kreia Reskin mod +

My version of a retexture of Kreia.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

No Jealousy Lock in Handmaiden Dialogue

+
+

+Banner of No Jealousy Lock in Handmaiden Dialogue mod +

Allows you to continue to talk to Handmaiden even if you have much higher influence with Visas than with Handmaiden.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Visas Visible Jedi Robes

+
+

+Banner of Visas Visible Jedi Robes mod +

Makes Jedi robes visible on Visas Marr's body when you equip her with one.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Love Between Brianna and the Exile - The Sith Lords Restored Content Mod Version

+
+

+Banner of Love Between Brianna and the Exile - The Sith Lords Restored Content Mod Version mod +

Updated version of DarthShgaad's Love Between Brianna and the Exile mod, made to be more compatible with The Sith Lords Restored Content Mod (TSLRCM).

+

Download the mod:

+
Dropbox
+

+
+

NPCs

+
+
+

Lonna Vash Mod for TSLRCM

+
+

+Banner of Lonna Vash Mod for TSLRCM mod +

Restores Jedi Master Lonna Vash's cut conversation by allowing the player to meet and talk to her in the secret tomb on Korriban. Updated version of Sikon's Lonna Vash Mod, made to be fully compatible with The Sith Lord Restored Content Mod (TSLRCM).

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

TSL Twi'lek Male NPC Diversity

+
+

+Banner of TSL Twi'lek Male NPC Diversity mod +

Diversifies the appearances of Twi'lek male NPCs in KotOR 2: TSL by giving the named Twi'lek male NPCs different looks.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Dahnis Unique Look

+
+

+Banner of Dahnis Unique Look mod +

Gives the NPC Dahnis a unique appearance to make her look different from other Twi'lek women NPCs.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Items

+
+
+

TSL Improved Party Outfits

+
+

+Banner of TSL Improved Party Outfits mod +

Adds new items to improve the properties of the default outfits of the human and humanoid party members of KotOR II, namely Atton, Bao-Dur, the Disciple, the Handmaiden, Kreia, Mandalore, Mira and Visas.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Juhani Item Pack for TSL

+
+

+Banner of Juhani Item Pack for TSL mod +

Adds a new Jedi robe, a new headband and a new armband to In KotOR II: TSL, named after Juhani, with item descriptions that indicate these items once belonged to Juhani.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Prologue Item Recovery

+
+

+Banner of Prologue Item Recovery mod +

Allows you to recover the items you obtain from the prologue, regardless if you choose to skip the prologue or not.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

TSL Workbench Lightsaber Creation

+
+

+Banner of TSL Workbench Lightsaber Creation mod +

Allows you to create lightsabers at a workbench, including double-bladed, one-handed or short lightsabers, with any color focusing crystals available in the game, after completing the quest to craft your first lightsaber.

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Miscellaneous

+
+
+

Exile's Trial Overlay Removal

+
+

+Banner of Exile's Trial Overlay Removal mod +

Removes the blue overlay of the scene of the Exile's trial on Coruscant in The Sith Lords Restored Content Mod (TSLRCM).

+

Download the mod:

+
Deadly StreamNexus Mods
+

+
+

Patches

+
+
+

PartySwap and Extended Enclave Compatibility Patch

+
+

+Banner of PartySwap and Extended Enclave Compatibility Patch mod +

A standalone patch to make DarthTyren's PartySwap mod compatible with danil-ch and Darth Hayze's Extended Enclave mod.

+

Download the mod:

+
Deadly Stream
+

+
+

Remote Tells Influence Patch for The Sith Lords Restored Content Mod

+
+

+Banner of Remote Tells Influence Patch for The Sith Lords Restored Content Mod mod +

A patch to make tk102's Remote Tells Influence mod more compatible with The Sith Lords Restored Content Mod (TSLRCM).

+

Download the mod:

+
Dropbox
+

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/asummersend/gallery/index.html b/shrines/asummersend/gallery/index.html new file mode 100644 index 00000000..5d843ab1 --- /dev/null +++ b/shrines/asummersend/gallery/index.html @@ -0,0 +1,549 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gallery | A Summer’s End — Hong Kong 1986 Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of A Summer’s End — Hong Kong 1986 Shrine + + +
+
+ + + + +
+
+ + +

A Summer’s End — Hong Kong 1986 Gallery

+ + + +

My gallery for A Summer’s End — Hong Kong 1986.

+ + +
+ + + + + + + + + +
+

A Summer’s End — Hong Kong 1986 was lovingly crafted by its developer Oracle and Bone with gorgeous art, so i want to make a page dedicated to my appreciation for the visual novel’s art.

+

The game has an in-game gallery that gradually unlocks as you progress the story, though certain scene art only unlocks if you pick certain dialogue options. Check out Dialog Choices Guide (AKA Lesbianism 101) on Steam for how to unlock all scenes, and thus the entire in-game gallery.

+

I also highly recommend checking out the official site of A Summer’s End and the social media accounts of Oracle and Bone's for more beauriful art about the visual novel!

+
+

My Favourite Screenshots

+
+

Sam dances in a club

+

Sam approaches Michelle and they stand close together at the balcony window of Sam's house

+

Close-up of Sam and Michelle almost kissing

+

Sam and Michelle kiss in Sam's house

+

Sam and Michelle kiss under the rain

+

Sam and Michelle ride a motorcycle

+

Sam and Michelle begin their intimate moment

+

Sam and Michelle sit together in a restaurant

+

Sam and Michelle stand and pose together for a photograph

+
+

Passion Patch Screenshots

+
+

A Summer’s End — Hong Kong 1986 offers an optional adult content patch, also referred to as Passion Patch, to the game. Installation guide for the patch can be found on the official website.

+

I had played A Summer’s End with the Passion Patch enabled and unlocked all scenes from the patch by referring to the Dialog Choices Guide (AKA Lesbianism 101) on Steam.

+

The sex scenes between Sam and Michelle added by the Passion Patch are easily the best sapphic sex scenes I have ever seen in any game. Furthermore, Oracle and Bone had written a blog post about their thought process behind the sexual content in A Summer’s End. Therefore, I want to dedicate this section to screenshots of these scenes.

+
+ Content Warning: Adult Content +

Sam kisses Michelle's cleavage and strokes Michelle's thigh

+

Sam licks Michelle's bare stomach

+

Michelle, with her shirt opened and bra exposed, pulls Sam's hand towards her lower body

+

Sam fingers Michelle, whose breasts and stomach are exposed

+

Sam naked on top of Michelle, who caresses Sam's bare breast

+

These screenshots of A Summer’s End's Passion Patch can also be viewed on my Postimages gallery, and are available in PNG and AVIF formats.

+
+
+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/asummersend/index.html b/shrines/asummersend/index.html new file mode 100644 index 00000000..f8c34242 --- /dev/null +++ b/shrines/asummersend/index.html @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A Summer’s End — Hong Kong 1986 Shrine | A Summer’s End — Hong Kong 1986 Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of A Summer’s End — Hong Kong 1986 Shrine + + +
+
+ + + + +
+
+ + +

A Summer’s End — Hong Kong 1986 Shrine

+ + + +

Leilukin's shrine for A Summer’s End — Hong Kong 1986.

+ + +
+ + + + + + + + + +
+
+

Welcome to My A Summer’s End — Hong Kong 1986 Shrine!

+
+

Promotional image of A Summer’s End — Hong Kong 1986

+

A Summer’s End — Hong Kong 1986 is a visual novel developed by Oracle and Bone, a Canada-based independent studio consists of two Asian queer women, Charissa So and Tida Kietsungden. The visual novel tells of a lesbian romance story between Michelle Cheung, an office worker, and Sam Wong, a video store owner, that takes place in Hong Kong in the year of 1986.

+

Initially released in English on 23 April 2020, A Summer’s End has also been translated into Simplified Chinese, Traditional Chinese, Cantonese and Korean. The Chinese translations were released on 9 July 2021, while the Korean translation was released on 21 December 2023.

+

A Summer’s End is available on Steam and itch.io. It also has an official website.

+

On 22 April 2023, a day before A Summer’s End's third year anniversary, Oracle and Bone announced a spiritual sequel: In the Ocean I Learned to Float, which takes place in the winter of 1988, two years after the events of A Summer’s End.

+
+
+

How I Discovered A Summer’s End — Hong Kong 1986

+
+

Key art of A Summer’s End — Hong Kong 1986

+

I first learned about A Summer’s End — Hong Kong 1986 through Linux Game Consortium, a Linux gaming news website. There was a period where I set up my gaming laptop to dual boot Windows 10 and Linux, so I ended up following Linux gaming news for a while. While Windows is still my main platform for gaming, the discovery of A Summer’s End was the biggest unexpected benefit and surprise when I tried out Linux.

+

As a lesbian, the premise of a visual novel about a sapphic romance already caught my interest, but what urged me to play it even more was the Hong Kong setting, which made my interest in the game personal, since I am a Cantonese-speaking Chinese lesbian who grew up with Hong Kong media. Not to mention, it is rare to see a fiction that tells of a sapphic love story that takes place in Hong Kong.

+
+
+

Why A Summer’s End — Hong Kong 1986 Means a Great Deal to Me

+
+

Screenshot of A Summer’s End with Sam and Michelle kissing

+

As a Chinese lesbian who speaks Cantonese and had engaged with a lot of Hong Kong media during my teenage years, A Summer’s End — Hong Kong 1986 is the lesbian story that I relate to and feel represented the most.

+

I relate to both the protagonists, Michelle and Sam, as their characters represent different parts of my life as a Chinese lesbian. I also relate to the story's theme of hoping for the future of our homeland despite the political uncertainties.

+

My standards for lesbian representation in media has also become much higher because of this visual novel, since A Summer’s End is also a perfect example of how some of the best representations of minority groups are actually found in media made by indie creators, especially those who are part of those minority groups, so we shouldn't rely on mainstream media for representation especially when big name media companies are going to just give us scraps.

+

If you ask me to list just one piece of queer art that means everything to me, that gives me comfort, inspiration, and strength the most, A Summer’s End would be it.

+

I seriously cannot recommend A Summer’s End enough, especially for Asian sapphic women.

+

(I also posted this section of text as my review of A Summer’s End on Steam, and received a lot of support for it)

+
+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/asummersend/playlists/index.html b/shrines/asummersend/playlists/index.html new file mode 100644 index 00000000..b4b30e94 --- /dev/null +++ b/shrines/asummersend/playlists/index.html @@ -0,0 +1,573 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Playlists | A Summer’s End — Hong Kong 1986 Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of A Summer’s End — Hong Kong 1986 Shrine + + +
+
+ + + + +
+
+ + +

A Summer’s End — Hong Kong 1986 Playlists

+ + + +

List of A Summer’s End — Hong Kong 1986 playlists.

+ + +
+ + + + + + + + + +
+

A Summer’s End — Hong Kong 1986 is a gold mine of music. Not only that the visual novel has a great soundtrack (its official soundtrack was released on August 21, 2020), but the developer Oracle and Bone has also compiled playlists related to the game.

+

As a tribute to A Summer’s End, I have also created a fanmix myself.

+
+

Sam's Mixtape

+
+

Compiled by Oracle and Bone, Sam’s Mixtape A-Side and B-Side are playlists of the songs that Sam was listening to on the first day she met Michelle.

+
+

Sam's Mixtape A-Side

+
+

Listen on Spotify

+ +
+

Sam's Mixtape B-Side

+
+

Listen on Spotify

+ +
+

夏日戀人 (Summer Lover)

+
+

Oracle and Bone compiled this playlist as a tribute to Anita Mui, who was a major inspiration for A Summer’s End — Hong Kong 1986.

+

Listen on Spotify

+ +
+

My Dear Summer Lover

+
+
+ Cover image of A Summer’s End fanmix 'My Dear Summer Lover: A Sam x Michelle Fanmix' +
+[Image description: Sam and Michelle from A Summer’s End almost kisses, with a play symbol and text on the top left corner, and the text "My Dear Summer Lover: A Sam x Michelle Fanmix" in a digital style font in front.] +
+
+

My fanmix for A Summer’s End — Hong Kong 1986, dedicated to Sam and Michelle’s love story.

+

This mix contains mostly Cantonese and English songs, with one Mandarin song. Majority of these songs were performed by Hong Kong artists and released in the 80s, because A Summer’s End took place in Hong Kong and in the 80s.

+

I have carefully selected and arranged these tracks, so the lyrics would reflect Sam and Michelle’s relationship development throughout A Summer’s End. Therefore, the content of this mix could be considered spoilers if you have not played the visual novel.

+

Since Oracle and Bone has cited Anita Mui as a major inspiration for them and this visual novel, I have also included multiple songs performed by Anita Mui in this mix. Because A Summer’s End is a lesbian story, when I was choosing which songs to include in this mix, I also prioritize songs that were performed by women artists.

+

Tracklist:

+
    +
  1. 輕輕嘆 (Sigh Softly) — Deanie Ip
  2. +
  3. 愛我便說愛我吧 (Just Say You Love Me) — Anita Mui
  4. +
  5. 夏日戀人 (Summer Lover) — Anita Mui
  6. +
  7. 星空下的戀人 (Lovers Under the Stars) — Shirley Kwan
  8. +
  9. I Want Your Love — CHIC
  10. +
  11. 激情 (Passion) — Sandy Lam
  12. +
  13. When Will I See You Again — Teresa Carpio
  14. +
  15. 愛你、想你 (Love You, Miss You) — Anita Mui
  16. +
  17. Within You’ll Remain — Julia Hsu
  18. +
  19. I Want to Know What Love Is — Tina Arena
  20. +
  21. Touch — Anita Mui
  22. +
  23. 親密愛人 (Intimate Lover) — Anita Mui
  24. +
+

Listen on Spotify

+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/asummersend/trivia/index.html b/shrines/asummersend/trivia/index.html new file mode 100644 index 00000000..dc327f53 --- /dev/null +++ b/shrines/asummersend/trivia/index.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Trivia | A Summer’s End — Hong Kong 1986 Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of A Summer’s End — Hong Kong 1986 Shrine + + +
+
+ + + + +
+
+ + +

A Summer’s End — Hong Kong 1986 Trivia

+ + + +

A collection of trivia about A Summer’s End — Hong Kong 1986.

+ + +
+ + + + + + + + + +
+

Here is a collection of trivia about the characters from A Summer’s End — Hong Kong 1986 provided by the developer Oracle and Bone on their social media pages, especially Tumblr.

+
+

Movies and Music References

+
+

A Summer’s End contains many references to movies and music. This community post on Steam compiles a list of the movie and music references made in the game. Please be aware it contains spoilers!

+

Movies and Music in A Summer’s End – Hong Kong 1986

+
+

Character Trivia

+
+
+

Chinese Names

+
+

Michelle Cheung's Chinese name is 張鳳霞, while Sam Wong's Chinese name is 黃嘉欣[Footnote #1]. Oracle and Bone had commented on their idea behind the characters' Chinese names in a response to a fan's question on Tumblr:

+
+

A part of how we came up with their names was by referencing names of Hong Kong film actresses from their time period as a little homage to them. We also thought of how their names might reflect their upbringing. For example, despite Michelle being younger than Sam, she has a more old fashioned sounding Chinese name. The meaning of their Chinese names was also important to us. We particularly wanted Michelle’s name to have metaphoric meaning that reflected her story as well as the themes of the game.

+
+
+

Birthdays

+
+ +
+

Zodiac Signs

+
+ +
+

Myers–Briggs Type Indicator

+
+ +
+

Inspirations

+
+
    +
  • The character and fashion of Cecelia has been largely inspired by Anita Mui.[Footnote #8]
  • +
+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/cassettebeasts/articles/cassette-beasts-more-than-a-pokemon-clone/index.html b/shrines/cassettebeasts/articles/cassette-beasts-more-than-a-pokemon-clone/index.html new file mode 100644 index 00000000..099c6e75 --- /dev/null +++ b/shrines/cassettebeasts/articles/cassette-beasts-more-than-a-pokemon-clone/index.html @@ -0,0 +1,756 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + How Cassette Beasts is Much More than a Pokémon Clone | Articles | Cassette Beasts Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of Cassette Beasts Shrine + + +
+
+ + + + +
+
+ + + + +

How Cassette Beasts is Much More than a Pokémon Clone

+ + + + +
+ + + + + + + + + +
+
+

Introduction

+
+

There is no denying that Pokémon is one of the largest entertainment franchises in the world and the most influential series in the monster collector genre of video games, and thus inspiring many games in the genre. Cassette Beasts, an indie monster collecting role-playing game developed by the England-based indie studio Bytten Studio, is not an exception, as it does share similarities to Pokémon.

+

However, calling Cassette Beasts a Pokémon clone is doing it a massive disservice, because Cassette Beasts executes many mechanics and aspects of Pokémon games in different, and sometimes arguably better ways.

+

Furthermore, there are things in Cassette Beasts that you would not find in Pokémon games, at least in the main series games, thanks to Bytten Studio's creativity and passion that a gigantic corporate-owned franchise like Pokémon can only dream of.

+
+

Features that Exist in Pokémon that are Done Differently in Cassette Beasts

+
+

By the time Cassette Beasts was released on 26 April 2023, the main video game series of Pokémon had reached its ninth generation with the release of Scarlet and Violet. Pokémon had existed for 27 years since the release of Red and Green versions in Japan in February 1996.

+

However, despite remaining one of the best-selling video game series in the world, Pokémon has got the reputation of repeating the same formula in their games over and over. Cassette Beasts, on the other hand, executes some features and mechanics that exist in the Pokémon game series with their own unique spin on them. Therefore, even the similarities between Cassette Beasts and Pokémon are not as straightforward as you may think

+
+

Monster Capture Mechanic

+
+

One of the most notable differences between Pokémon and Cassette Beasts is their mechanics to capture monsters. In Pokémon, you catch the creatures by using Poké Balls, but in Cassette Beasts, you do not actually catch the monsters, but you record the essence of the monsters into a cassette tape.

+

A common criticism of the monster collector genre is the ethical question of essentially enslaving creatures by capturing and subjugating them into obeying you, as well as enganging in dog fighting by making the creatures fight each other, to the extent that even Pokémon tries to tackle it as the main theme of the story of Black and White, though whether the execution is effective or not is debatable. Cassette Beasts' method of recording monsters solves this moral dilemma of the genre from the get-go, because you are not actually catching the monsters in the traditional sense. In fact, Jay Baylis, artist and writer of Cassette Beasts had stated in a Shacknews interview that their idea of recording monsters is intended to avert the issue of basically enslaving creatures in the monster collecting genre.

+

Gameplay-wise, a notable improvement Cassette Beasts has over Pokémon when it comes to monster capture mechanics is that in Cassette Beasts, when you are recording a monster, the percentage of success rate is displayed on screen. Furthermore, a monster that is in the process of being recorded cannot be knocked out, so you can deal more damage to the monster to improve your odds of successfully recording the monster. In Pokémon, you have to be extra careful about not knocking out the Pokémon you want to catch, and when you try to catch one, you can only hope that the RNG is in your favour.

+
+

Battle System

+
+

The battle system in both Cassette Beasts and Pokémon involves fights between monsters. However, while in Pokémon you send out the monsters you captured to fight, in Cassette Beasts you transform into monsters to battle by using the cassette tapes you have used to record the monsters.

+

Furthermore, most of the battles in the main series Pokémon games take place in one-on-one formats, also known as single battles. In Cassette Beasts, you almost always battle alongside a partner, making two-on-two the format of most battles in the game, which in Pokémon is also known as double battles, which are underutilised in the main series Pokémon games. Two-on-two battles require more nuanced strategies than brute-forcing a single opponent in one-on-one battles.

+

The move system in battles is also different in Pokémon and Cassette Beasts. In Pokémon, every Pokémon is limited to having four move slots, meaning each can only use up to four moves in battle. In Cassette Beasts, battle moves come in the form of stickers on monster cassette tapes; the base number of sticker slots varies between monsters, with 4 being the minimum, and can be increased by upgrading the star level of the monster tapes, up to a maximum of 8 natural slots. Some stickers have the bonus of adding sticker slots.

+

Pokémon uses Power Points (PP) to restrict how many times each move can be, while Cassette Beasts uses Action Points (AP), which is generated for every turn during battle, even after you switch into a different monster tape. Different moves cost varying amounts of AP or none at all, with stronger moves require more AP to use, while some moves require no AP.

+
+

Type Match-Ups

+
+

Both Pokémon and Cassette Beasts have elemental types on every monster, and how these types interact with each other is a core element in their battle systems. However, how said interactions play out in Pokémon and Cassette Beasts are different.

+

In Pokémon, type advantage simply means dealing extra damage to your opponent, while type disadvantage simply means dealing less damage, and certain types are immune to damage from another type.

+

In Cassette Beasts, type match-ups are based on chemical reactions, so type advantage gives your opponent a debuff, while type disadvantage gives your opponent a buff, and certain types and temporary change the type of the opponent in battle. For example, Water-type moves reduce the melee and ranged attacks of Fire-type monsters; Fire-type moves giving a healing buff to Water-type monsters; Fire-type moves turn Plastic-type monsters into Poison-types. While type advantage means more damage in Cassette Beasts, it is not as drastic as in Pokémon.

+

Cassette Beasts actually provides an in-game type chart in the game itself. You can obtain the chart by opening the Ranger Guidebook, and the type chart can be accessed during your battles. In addition, when you are choosing your moves during battles, you can see the icons that hint on the effects of your moves against your opponent.

+
+

Level System

+
+

In both Pokémon and Cassette Beasts, gaining experience to level up is a core part of the games' progression. However, there are differences in their level systems.

+

In Pokémon, from Generation 1 to 5, only the Pokémon you send out in battle and optionally the Pokémon that holds the Exp. Share item will gain experience after winning a battle. This means that if you want to add a Pokémon you just caught to your party, you often have to grind for experience points for the newly-caught Pokémon to catch up with the levels of other members in your party. The games starting from Generation 6 solve the grinding issue by making Exp. Share becomes an optional item that will reward the experience points you earned to all non-fainted members in your party. Starting from Let's Go! Pikachu and Let's Go! Eevee, the effects Exp. Share are present from the start of the game.

+

In Cassette Beasts, levels are instead tied to your human and your companion characters, which means that in addition to base stats, the strength of the monsters you recorded are tied to your human character's level. This means that unlike Pokémon, after you record a low-level monster and add them to your party, you do not have to spend time in grinding the levels of your monsters just to make them catch up with the rest of your party.

+

Monster tapes have their own level system in the form of the star system. When you upgrade a monster's star level, they gain new stickers. When you upgrade a monster to 5 stars, the monster will gain an additional biography entry in the bestiary, and some monsters can be remastered (the Pokémon equivalent is evolution) into stronger forms.

+

Earning experience points means not only levelling up your human player and companion characters, but also upgrading the star levels of your monster tapes. Some monsters can be remastered when being upgraded to 5 stars. It is worth noting that experience points are shared between all your monster tapes as well, including ones that have been broken (or "fainted") in battle, unlike Pokémon where fainted Pokémon cannot gain any experience points at all.

+
+

Field Moves

+
+

Both Pokémon and Cassette Beasts have field moves — moves that are used outside of battles and often required to access new areas of the map and explore every nook and cranny.

+

From Generation 1 to 6 of the main series Pokémon games, field moves usually take the form of HMs, though some TMs also have uses outside battles. Both HMs and TMs are items to teach Pokémon moves, and these moves take up move slots. From Generation 7 onwards, Pokémon games remove HMs, and assign field moves to certain Pokémon that you can use outside battles, so you longer need to worry about wasting move slots of Pokémon in your party.

+

In Cassette Beats, it is your human character that learn these field moves by recording certain monsters. The game will provide hints to which monsters can give you these field moves through townsfolk gossips. Since it is your human character that uses these field moves, you do not need to worry about wasting any move slots in your monster cassette tapes.

+
+

Monsters with Alternate Colour Schemes

+
+

In both Pokémon and Cassette Beasts, there is a rare chance you may encounter monsters with different colour schemes than their regular counterparts. In Pokémon, they are referred to as Shiny Pokémon, while in Cassette Beasts, they are called bootlegs.

+

Shiny Pokémon do not provide additional benefits in gameplay, but bootlegs do, since bootlegs can be of any type, and have a higher chance of getting moves (or stickers) with additional effects and enhancements, referred to as sticker attributes.

+
+

Music

+
+

Both Pokémon and Cassette Beasts are notable for their soundtracks, and music is among the most praised (which is well-deserved, in my opinions) aspects in both, though Cassette Beasts does it differently in that it includes music with vocal lyrics: for the music of the main hub, Habourtown, the vocals play when you are indoor; for battle music, the vocals play when you and your partner fuse, which heightens the dynamic of the battles.

+
+

Story and Plot

+
+

The core plot of the main series Pokémon games, except for Legends: Arceus, is about a child going on a journey and become the best Pokémon Trainer in their region by claiming the Champion title. However, the main plot of Cassette Beasts is about the protagonist finding their way back home after bring transported to New Wirral, an island that exists in a different dimension from Earth and where humans from various dimensions are also transported and strended on.

+

The protagonists of Pokémon games become the new Champion of their region by defeating Gym Leaders or Trial Captains, then the Elite Four and the current standing Champion. In Cassette Beasts, the closest thing to an equivalent to Gym Leaders is the Ranger Captains, and one of the main quests involves defeating all the Captains across the map, but even then, you do not beat the Ranger Captains and become a Captain yourself for the glory of becoming the best monster battler, but to prove your ability to help the Rangers Guild to protect New Wirral and support the island's community.

+

Cassette Beasts has a more mature and adult story than Pokémon. As a franchise primarily targetted at children, the main human characters in Pokémon are children, so the stories of Pokémon games are mainly about children's fantasy adventures to be the best Pokémon Trainer. On the flip side, the main characters in Cassette Beasts, including your human companions, are adults, and the game is not afraid to discuss topics and issues relevant to adulthood, particularly through the stories of your companion characters. The story of Cassette Beasts is also unabashedly left-wing with anti-capitalist and anti-imperialist messages, which I frankly doubt will get explored with such authenticity in a corporate-owned mega franchise like Pokémon.

+

In addition, Cassette Beasts' story can get genuinely dark at times, most notably in the cosmic horror presented by the Archangels, the eldritch entities that you need to defeat in boss battles to gather clues about a way out of New Wirral and return home.

+Major Story Spoilers for Cassette Beasts +

Towards the end of the main quest, it is revealed that Archangels are egregores created from humanity's desires and ideas. Aleph, the main antagonist and final boss of the main story, is an Archangel that is an incarnation of conquest, and his goal is to leave New Wirral and cause chaos across reality.

+

While Pokémon has its own fair share of sinister villains, the threat the main villain of Cassette Beasts poses is even greater in scope than any Pokémon villain, maybe except for Rainbow Rocket Giovanni from Ultra Sun and Ultra Moon, who shares the goal of ruling the multiverse.

+

Moreover, even though the player character and their party are able to defeat the main villain in the end, the game makes it clear that since Archangels are not flesh and blood and born from human ideas, as long as humans are interested in conquest Aleph will return at some point. This reflects our world in that defeating a tyrant does not magically solve everything, especially when the system that enables tyrants' rise to power still exists.

+
+
+
+

Features Cassette Beasts Has But Pokémon Lacks

+
+

Cassette Beasts is not satisfied with just doing Pokémon's core mechanics in different ways, but it also adds features that do not exist in the Pokémon games, at least in the main series games as of Scarlet and Violet.

+

In this section, I am adding a counter for the things Cassette Beasts has that Pokémon lacks, to further prove that Cassette Beasts is perfectly capable of standing on its own apart from Pokémon. If Bytten Studios only want to make a Pokémon clone, they did not need to do these additional things at all, but they did it anyway. If this is still not evidence of Bytten Studio's passion for their game to build its own identity, I do not know what is.

+

Even if one day the Pokémon games decide to add any of the below features, it would still not change the fact that Cassette Beasts had done them earlier.

+
+

Character Creator with Pronouns Options

+
+

Character customisation has existed in Pokémon games since X and Y, but to date, none of the games provide options to choose your character's pronouns. However, Cassette Beasts allows you to choose they/them pronouns in addition to he/him and she/her, and your pronouns options will be reflected in-game.

+

I use they/them pronouns myself, so pronouns options are a welcome addition.

+

They Did Not Need To But They Did It Anyway counter: 1

+
+

Fusions of Every Monster

+
+

The concept of monster fusions by combining the designs of two monsters together are popular in the Pokémon fandom, showing up in fan art and dedicated websites such as web developer Alex Onsager's Pokemon Fusion website. However, in the official Pokémon franchise, fusions are exclusive to very few Pokémon to create alternate forms, namely Kyurem, Necrozma and Calyrex, all Legendary Pokémon, and they can only fuse with a specific few Legendary Pokémon.

+

In Cassette Beasts, monster fusions are a defining feature both in gameplay and the lore. Any two of the 141 monsters in-game can fuse together, thus there are 19,881 fusion combination in total. The nature and origins of fusion is also explored in the game's story and lore.

+

They Did Not Need To But They Did It Anyway counter: 2

+
+

Companion and Relationship System with Human Characters

+
+

While the primary draw of the Pokémon franchise has always been the monster creatures, like other media in the mons genre, human characters do play a notable role in the Pokémon franchise from the beginning: in the main series games, you play as a human trainer of Pokémon, battling other human NPC trainers including your rivals, Gym Leaders/Trial Captains, Elite Four, Champions and villains. In some games, you also occasionally team up with other human NPC trainers in battles. However, the main series Pokémon games do not have any dedicated companion and relationship mechanic with human characters.

+

Conversely, human relationships are a major focus in Cassette Beasts both in story and game mechanics: you are accompanied by a companion character throughout your adventures in New Wirral, with 5 out of 6 of the potential partners being humans; each companion character has their own story and quest for you to explore; each have a relationship level that can be raised by gaining experience points with them, and higher relationship levels make you stronger when you fuse in battle.

+

Human characters in Pokémon interest me as much as the creatures themselves, because the Pokémon world is populated by both Pokémon and humans, thus I find the humans' relationships with the creatures and each other also an important element of the Pokémon world. Unfortunately, I often feel that human characters are an aspect of the Pokémon games that are underappreciated by the Western Pokémon fandom, who tend to focus more on the creatures themselves. Therefore, seeing a Pokémon-inspired game, especially one that is developed by a Western studio like Cassette Beasts, actually make the effort in fleshing out human characters and relationships was the biggest pleasant surprise for me when I started playing Cassette Beasts for the first time.

+

Pokémon has a spin-off game that focus more on human characters: Pokémon Masters EX, but the fact that it is a gacha game means it is a glorified gambling game that wants you to spend real-world money to gamble to collect the human trainers. However, that is not the case at all in Cassette Beasts, since it does not have any in-app purchases whatsovever. In fact, Cassette Beasts' companion and relationship systems prove that Pokémon can do more with their human characters without predatory monetisation tactics.

+

They Did Not Need To But They Did It Anyway counter: 3

+
+

Romance Options

+
+

Related to the above point about the companion system and relationship mechanic with human characters, the main series Pokémon games do not have any option for the player to pursue a romance with another character. The closest the main series games attempted a romance arc for the player character is Omega Ruby and Alpha Sapphire, where the protagonist and their neighbour rival are implied to become a couple in the post-game story by going on a date, as well as Black 2 and White 2, where the protagonist can pursue an optional subplot with a different-gender NPC who eventually develops a crush on the protagonist.

+

Cassette Beasts, on the other hand, as an addition to its companion system and relationship mechanic, provides players the option to pursue a romance with one of their human companions after raising their relationship level to 5, the highest without romance, with unambiguously romantic dialogue and scenes.

+

Even though I do not play monster collecting games for romances, nor am I asking for Pokémon to add romance options to their games because I am too old to be invested in romances involving fictional children, romance options are a nice addition to a game that is made with adult players in mind like Cassette Beasts.

+

They Did Not Need To But They Did It Anyway counter: 4

+

If the existence of the option to romance your human companion is not enough, in Cassette Beasts you can romance any of the human companions regardless of your player character's gender. In other words, all the human companions in Cassette Beasts are available as same-gender romance options, which is a blessing for LGBTQ+ players like me.

+

They Did Not Need To But They Did It Anyway counter: 5

+
+

Canon LGBTQ+ Characters and Representation

+
+

Pokémon is not known for explicitly canon LGBTQ+ representation. The franchise does not have a single confirmed canon same-gender couple. In the shipping side of the Pokémon fandom, particularly among LGBTQ+ fans, some same-gender pairings are popular, but it does not change the fact that there is no character in the Pokémon franchise who is officially confirmed to be attracted to the same-gender.

+

On the flip side, Cassette Beasts has canon LGBTQ+ characters. For characters who are attracted to the samge gender, the most notable ones are the human companions, who can be romanced by the player character regardless of gender, meaning they are canonically bisexual. Furthermore, the game also has a pair of NPCs who are revealed in-game to be a gay married couple.

+Minor Quest Spoilers for Cassette Beasts +

To be specific, this pair of NPCs in question are Leader Ianthe and Ranger Wilma, members of the Ranger Guild. After you defeat all 12 Ranger Captains, and you challenge Ianthe to a battle, Ianthe will reveal that she will fight alongside her wife, who is none other than Ranger Wilma, the woman in charge of the Ranger Guild store. Yes, Cassette Beasts has a canon married lesbian couple.

+
+
+

As for transgender and non-binary representation, Pokémon has a few ambiguously canon ones, namely Beauty Nova, a minor female NPC Trainer from X and Y who is heavily implied to be a trans woman, and Blanche from Pokémon GO, who is not referred to by gendered pronouns in the English version of the game and official social media accounts. Some other human characters are also commonly interpreted or headcanonned as trans by LGBTQ+ fans, but none of them are officially confirmed to be trans or non-binary.

+

In Cassette Beasts, not only that the player can chose to go by they/them pronouns via the character creator, but there is also a Ranger Captain named Skip who is canonically non-binary and uses they/them pronouns.

+

In addition to having canon LGBTQ+ characters, Cassette Beasts's voice cast also includes multiple openly LGBTQ+ voice actors, such as Allegra Clark, J. Michael Tatum, Kayleigh McKee, Liz Morey, Marin M. Miller and Risa Mei. In fact, both Captain Skip and their voice actor Marin M. Miller are non-binary and go by they/them pronouns.

+

Looking for LGBTQ+ representation in monster collecting games? Instead of waiting for corporate franchises like Pokémon to give you scraps, how about looking at indie titles that actually has canon LGBTQ+ characters like Cassette Beasts instead?

+

They Did Not Need To But They Did It Anyway counter: 6

+
+

Voice Acting

+
+

Despite some attempts to tell more developed stories with more dialogue and cinematic cutscenes, as of Scarlet and Violet, none of the main series Pokémon games have any voice acting in their dialogue.

+

On the other hand, Cassette Beasts has voiced dialogue. Even though the amount of voiced dialogue in Cassette Beasts is limited, voice acting helps to bring the characters to life and add more character to the game.

+

It is more notable when you remember that being an indie game, Cassette Beasts could have completely avoid adding voice acting to save development budget, but the developers added it anyway.

+

They Did Not Need To But They Did It Anyway counter: 7

+

Oh, and there is more! Cassette Beasts actually has an impressive voice cast, especially for an indie game, featuring established, well-known voice actors including Yuri Lowenthal, Tara Platt, Allegra Clark, Aleks Le, Sean Chiplock, J. Michael Tatum, Jennifer Losi, Kayleigh McKee, Risa Mei, Marin M. Miller, Cindy Robinson, Edwyn Tiong, etc.

+

Bytten Studio and Raw Fury could have just hire unknowns to save budget, but nope, they achieved the remarkable feat of getting multiple famous voice actors for an indie game.

+

They Did Not Need To But They Did It Anyway counter: 8

+
+

Custom Game Modes

+
+

The Pokémon player base has various methods of changing up ways of playing the games for fun or for a self-imposed challenge, with the most popular including the Nuzlocke Challenge and randomizers. These modes of playing Pokémon games are never part of the official games.

+

Cassette Beasts include custom game modes that serve similar purposes as these fan-made game mods for Pokémon: permadeath mode, similar to Pokémon's Nuzlocke Challenge, and randomisation mode. These custom game modes can be unlocked by completing the main story or through the cheats.

+

They Did Not Need To But They Did It Anyway counter: 9

+
+

Level Scaling and Enemy AI Adjustment Options

+
+

A common criticism of the Pokémon games from long-time players is the lack of difficulty settings, and even the only pair of games that actually have it, Black 2 and White 2, require you to complete the main campaign to unlock. Moreover, the open-world design of Scarlet and Violet has been criticised for the lack of level scaling in opponents' Pokémon.

+

However, the settings menu of Cassette Beasts already includes sliders to adjust the game's difficulty through the level scaling and enemy AI options from the get go, and does not require you to perform extra steps to unlock, so you are free to make the game easier or more difficult as you wish.

+

They Did Not Need To But They Did It Anyway counter: 10

+
+

Built-In Mod Support

+
+

Pokémon modding and ROM hacks have existed in the Pokémon player community since the beginning of the series, but modding Pokémon games is never officially supported by Nintendo, Game Freak or The Pokémon Company.

+

Cassette Beasts, on the other hand, has built-in support for mods. In fact, the official Cassette Beasts wiki has modding guides, and the official Bytten Studio Discord server has a dedicated Cassette Beasts modding channel.

+

They Did Not Need To But They Did It Anyway counter: 11

+
+

Conclusion

+
+

While it is understandable to compare Cassette Beasts to Pokémon, Cassette Beasts has countless claims to forge its own identity apart from the pioneer of the monster collecting role-playing game genre, as explained throughout this essay. As someone who has played Pokémon games since the Red Version from Generation 1, but has become jaded with the state of the series since Sword and Shield from Generation 8 and is losing interest in playing their recent titles, Cassette Beasts provides a perfect indie alternative for something different.

+

Frequent releases and rushed development schedules have taken their toll on the quality of recent Pokémon titles, resulting in cutting corners like empty maps, removal of National PokéDex, etc., and in the case of Scarlet and Violet, glitches and performance issues. Furthermore, as a multi-billion dollar corporate-owned franchise, Pokémon is primarily targeted at children and meant to be able to be enjoyed by everyone, so despite a few attempts to do something new, maximising profit is still prioritised over innovation.

+

Art that tries to appeal to everyone, even if not bad, tends to be bland and reluctant to take creative risks. Cassette Beasts is another evidence that indie games can be much more creative than AAA games.

+

Therefore, if you think you have outgrown Pokémon and looking for a more sophisticated and mature monster collector game that actually treats the player like an adult, go play Cassette Beasts.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/cassettebeasts/articles/index.html b/shrines/cassettebeasts/articles/index.html new file mode 100644 index 00000000..1b97ee8e --- /dev/null +++ b/shrines/cassettebeasts/articles/index.html @@ -0,0 +1,576 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Articles | Cassette Beasts Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of Cassette Beasts Shrine + + +
+
+ + + + +
+
+ + +

Cassette Beasts Articles

+ + + +

List of articles written by me or other people that I recommend for Cassette Beasts.

+ + +
+ + + + + + + + + +
+
+

My Cassette Beasts Articles

+
+ +
+

Cassette Beasts Articles I Recommend

+
+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/cassettebeasts/facts/index.html b/shrines/cassettebeasts/facts/index.html new file mode 100644 index 00000000..aae1792b --- /dev/null +++ b/shrines/cassettebeasts/facts/index.html @@ -0,0 +1,792 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Facts | Cassette Beasts Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of Cassette Beasts Shrine + + +
+
+ + + + +
+
+ + +

Cassette Beasts Facts

+ + + +

A collection of facts and trivia about Cassette Beasts.

+ + +
+ + + + + + + + + +
+
+

Where to Find Cassette Beasts Facts and Trivia

+
+

You can find facts and trivia about the game from:

+ +

Here is a list of interviews that staff who worked on Cassette Beasts participated in and discussed Cassette Beasts.

+
+

Development History

+
+
+
Late 2019
+
Development of Cassette Beasts began[Footnote #1].
+
11 May 2020
+
Reveal trailer released.
+
19 October 2021
+
Bytten Studio's partnership with publisher Raw Fury was officially announced, with an announcement trailer.
+
29 March 2023
+
Main voice cast announced.
+
26 April 2023
+
Cassette Beasts released on PC and Xbox PC Game Pass with a PC release trailer, which also confirmed the release date of Xbox Series X/S, Xbox One, and Nintendo Switch versions to be 25 May 2023.
+
27 April 2023
+
Hotfix 1.1.2 live.
+
10 May 2023
+
Hotfix 1.1.3 live.
+
25 May 2023
+
Cassette Beasts released on Xbox Series X|S, Xbox One, Gamepass and Nintendo Switch, with a console release trailer.
+
28 June 2023
+
Update 1.2 “Catacombs” live. Online multiplayer mode and "Pier of the Unknown" DLC expansion announced.
+
12 September 2023
+
"Pier of of the Unknown" DLC confirmed to be released on 4 October 2023 with a new trailer.
+
3 October 2023
+
Update 1.5 live.
+
4 October 2023
+
"Pier of of the Unknown" DLC released, with a new trailer.
+
11 December 2023
+
Multiplayer future showcase released, with announcement of its planned release in Q1 2024 and updates about its features.
+
25 March 2024
+
Multiplayer beta available on Steam. Multiplayer update confirmed to be released on 20 May 2024 with an announcement trailer. Android and iOS versions announced to be released in 2024.
+
22 April 2024
+
Android and iOS versions announced to be released on 4 June 2024 with a trailer.
+
20 May 2024
+
Multiplayer update and version update 1.6.0 live on all platforms, with a launch trailer.
+
31 May 2024
+
Physical edition for Nintendo Switch announced.
+
1 June 2024
+
Release of the mobile versions announced to be delayed until later in Summer 2024.
+
6 June 2024
+
Physical edition for Nintendo Switch released and available for pre-orders on Super Rare Games.
+
26 June 2024
+
Version update 1.6.2 live on all platforms.
+
+
+

Accolades

+
+

Cassette Beasts was nominated for The British Game at the 20th British Academy (BAFTA) Games Awards.

+

Bytten Studio was nominated for "Best Small Studio" at the Develop:Star Awards 2024.

+
+

Design Philosophy

+
+

On 12 October 2023, Bytten Studio wrote a Steam blog post "Cassette Beasts - Design & Expectations" about their design philosophy of Cassette Beasts to celebrate the game reaching 350,000+ players.

+

Cassette Beasts very consciously opens with exploration and combat within the first minute of the game and leaves the lore for later, because Bytten Studio believes in giving players the game first and selling the players on the story later.[Footnote #2]

+
+

Influences and Inspirations

+
+

The YouTube channel Lockstin & Gnoggin has a video that explains the names and designs of the monsters and Archangels: EVERY Cassette Beast EXPLAINED! 🖭. The video was retweeted by Bytten Studio.

+

The idea of copying monster forms to transform into came from Tom Coxon's dream. Jay Baylis, inspired by Kamen Rider, later suggested doing the copying and transforming with physical cassette tapes.[Footnote #1:1]

+

Another oddball source of inspiration for Tom the story “The Beatles Never Broke Up”, about a man who in 2009 hit his head and woke up in another world where the Beatles still exist, where people still use analogue technology, and where parallel universe travel is commonplace.[Footnote #1:2]

+

The presentation of Archangels is inspired a little by the Witches in Puella Magi Madoka Magica.[Footnote #1:3]

+

The way the relationship system ties into fusions is heavily influenced by Steven Universe, which both Tom and Jay are fans of.[Footnote #1:4]

+

The AP system in Cassette Beasts is taken from board and card games.[Footnote #1:5]

+

Jay cited comic author Grant Morrison as an influence on the broader themes of the game (as well as the strange English surrealism of the setting), as Morrison's stories often explore the nature of fiction, multiple realities, and their influence on one another.[Footnote #1:6]

+

Archangels Morgante and Aleph were inspired by Morgan le Fay and King Arthur from Arturian legends, but with an unusual twist that Aleph is portrayed as a conqueror instead of a "rightful king" to reflect Britain's history of conquest.[Footnote #3]

+

The ideas for the other Archangels came after Morgante and Aleph. Their themes were kind of arbitrarily chosen to match the design Jay had given them.[Footnote #3:1]

+

Bytten Studio made a point to not put in a huge amount of Japanese mythological monsters in comparison to mythology from other nations, especially since well-known mons franchises such as Shin Megami Tensei, Pokémon and Digimon are Japanese franchises; they do not want to seem derivative.[Footnote #4]

+

Barkley was not inspired by anything in particular; he was added in the game to surprise players as a non-human partner.[Footnote #5]

+
+

Developer Notes

+
+
+

Partner Character Dialogue Styles

+
+

Jay Baylis, the writer of the game, has shared a style guide he wrote during development for writing dialogue for the partner characters in the modding channel of the official Bytten Studio Discord server. This can serves as a reference for anyone who is adding new dialogue for these characters in mods.

+
+

Kayleigh

+
+

Casual friendly dialogue with very few Americanisms.

+

Common words and phrases:

+
    +
  • Thanks a million
  • +
  • Sorry
  • +
  • Brilliant
  • +
+
+

Meredith

+
+

Often staggers her words, like, uh, this. Uses British slang where appropriate. Most likely to (mildly) swear/curse.

+

Common words and phrases:

+
    +
  • Uh
  • +
  • Urgh
  • +
  • Mate
  • +
  • Bloody
  • +
+
+

Eugene

+
+

American - uses a lot of exclamations! Like this! More like a shonen hero. Less likely to keep up with "lore".

+

Common words and phrases:

+
    +
  • Man
  • +
  • Pumped
  • +
  • Badass
  • +
  • Buddy
  • +
  • Momentous
  • +
+
+

Felix

+
+

Opposite of Eugene. Often ends with full stops. Less energetic, more friendly. More likely to discuss the in-universe lore than others.

+

Common words and phrases:

+
    +
  • Rad
  • +
  • No worries
  • +
  • appreciate
  • +
  • unorthodox
  • +
  • folks
  • +
+
+

Viola

+
+

Lightly used Shakespearian English. Very formal. Often uses quotes adapted (made less complex) from actual Shakespeare.

+

Common words and phrases:

+
    +
  • Dear [character name]
  • +
  • Alas
  • +
  • Spirit (instead of Archangels)
  • +
+
+

The Developers

+
+

Jay Baylis' favourite monster catching game is Pokémon Ruby/Sapphire.[Footnote #6]

+

Tom Coxon's favourite monster catching game is Siralim Ultimate.[Footnote #7]

+
+

Frequently Asked Topics

+
+

This section compiles topics that do not fit into other sections of this page, but are commonly asked about by Cassette Beasts players that have been answered officially by Bytten Studio.

+
+

Cassette Beasts not available on PlayStation

+
+

Jay Baylis had addressed the subject of Cassette Beasts not being available on PlayStation in a thread on the official Cassette Beasts Subreddit:

+
+

Releasing a game on any platform is a huge undertaking and lots of choices have to be made. Originally we focused on Cassette Beasts as a game for PC and Switch as we didn't think we'd have the resources to port to anything beyond that - however, getting the opportunity for Cassette Beasts to be a part of the Xbox Game Pass service meant we would also have to port the game to Xbox, of course.

+

Furthermore, Godot 3 (the game engine Cassette Beasts is made in) is not easy to port, and cannot be done "out the box" - it requires an external partnership to do so (unlike engines like Unity and Unreal). Only a handful of Godot games had been ported to Switch before Cassette Beasts and they were all 2D games. Cassette Beasts is the first game developed from the ground up as a 3D Godot game to ever be ported to console. This has been a huge challenge for both us and, more importantly, the porting team we've worked with! What's more, every update and DLC made takes longer to release with every platform you add.

+

This doesn't mean that porting to Playstation won't/cannot ever happen, but we wouldn't promise anything unless we knew for sure. Game development is a series of trade-offs, and decisions like this aren't really made down to personal preference for platforms - personally, I mostly play games on PS5 at the moment.

+
+
+

Possibility of adding new partners

+
+

Bytten Studio never hinted at any possibility of adding new partners to Cassette Beasts. In fact, Jay Baylis had stated in Bytten Studio's AMA on the r/NintendoSwitch Subreddit on 1 July 2023 that:

+
+

[...]the current number of partner characters is baked into the design of the game in a number of ways, making it very difficult to organically add new ones in.

+
+
+

Sunny's lack of screen time and content

+
+

Sunny, a minor NPC who appears after the completion of Eugene's quest line, has become immensely popular in the player base despite her limited screen time, wishing she could have a larger role in the game, most commonly to become a partner, with some players even expressing disappointment that Sunny only gets a minor role in the game, and questioning why.

+

The reason why Sunny has little screen time and content was that she was added late into the game's development and only intended by Bytten Studio as a little side story after Eugene's quest to surprise players. Bytten Studio never intended Sunny to have a huge role or much content, and they did not expect Sunny would become this popular in the player base.

+
+
+

We believe that a lot of the secret sauce for Cassette Beasts' appeal is in its ability to surprise the player in various ways, so things don't get too predictable. Sunny is a character that I wrote into the game quite late, as I had envisioned her whole sequence of events as being something unexpected and funny that you wouldn't expect happening as a consequence of the questline that proceeds it. Sunny's appearance is, ultimately, just a fun little side story that I cooked up to add some more flavour to the goings-on in Harbourtown. However, it's clear that she's very popular for a character who appears in exactly two cutscenes, which isn't something we entirely expected!

+
+
Jay Baylis (u/SamuriFerret). Comment during Bytten Studio's AMA on the r/NintendoSwitch Subreddit. 1 July 2023.
+
+
+
+

[...]in hindsight, given her popularity in the community, we all wish we'd given Sunny more screen-time. She was a late, unplanned addition as we neared the release.

+
+
Tom Coxon (u/tcoxon). Comment during Bytten Studio's AMA on the r/JRPG Subreddit. 26 March 2024.
+
+
+
+

Sunny was a late addition to the game as I pitched a short storyline involving the gang rehabilitating a Landkeeper after Eugene's quest. It's very apparent we underestimated how popular she'd turn out to be!

+
+
Jay Baylis. Comment during Bytten Studio's AMA on the r/JRPG Subreddit. 26 March 2024.
+
+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/cassettebeasts/featured/index.html b/shrines/cassettebeasts/featured/index.html new file mode 100644 index 00000000..c16db812 --- /dev/null +++ b/shrines/cassettebeasts/featured/index.html @@ -0,0 +1,616 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Featured | Cassette Beasts Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of Cassette Beasts Shrine + + +
+
+ + + + +
+
+ + +

Cassette Beasts Featured Pieces

+ + + +

A collection of reviews, articles and commentary videos from other people about Cassette Beasts.

+ + +
+ + + + + + + + + +
+

Here is a collection of reviews, articles and commentary videos from other people about Cassette Beasts. If you need more convincing than my words about why you should play Cassette Beasts, check these links out. 😎

+
+

Reviews

+
+ +
+

Articles

+
+ +
+

Videos

+
+ +
+

Podcasts

+
+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/cassettebeasts/gamelog/index.html b/shrines/cassettebeasts/gamelog/index.html new file mode 100644 index 00000000..6c484070 --- /dev/null +++ b/shrines/cassettebeasts/gamelog/index.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Game Log | Cassette Beasts Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of Cassette Beasts Shrine + + +
+
+ + + + +
+
+ + +

Cassette Beasts Game Log

+ + + +

A catalogue of my Cassette Beasts characters and save profiles.

+ + +
+ + + + + + + + + +
+
+

Character Profile: Kristine

+
+

Cassette Beasts screenshot of Kristine, a custom player character

+

My first and main character for Cassette Beasts. The first save file was created on 18 July 2023, and the main story was beaten on 30 July 2023. The second save file was created on 18 October 2023.

+
+
Name
+
Kristine
+
Pronouns
+
They/Them
+
Starter Monster Tape
+
Bansheep
+
Romance
+
Meredith
+
Final Station Location
+
Behind the tree stump to the top right of Autumn Hill
+
Gift Bootleg Received
+
litter-type Pombomb
+
First Wild Bootleg
+
Air-type Weevillite (obtained on 14 August 2023)
+
+
+

Character Trivia

+
+
    +
  • I named Kristine after Kris, the female player character of Pokémon Crystal and the first female player character of the Pokémon video game series.
  • +
+
+

Bootleg Record

+
+

I have kept track of all the bootleg monsters I have encountered in my saves. You can check out my bootleg record here.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/cassettebeasts/index.html b/shrines/cassettebeasts/index.html new file mode 100644 index 00000000..b6669c9c --- /dev/null +++ b/shrines/cassettebeasts/index.html @@ -0,0 +1,608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cassette Beasts Shrine | Cassette Beasts Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of Cassette Beasts Shrine + + +
+
+ + + + +
+
+ + +

Cassette Beasts Shrine

+ + + +

Leilukin's shrine for Cassette Beasts.

+ + +
+ + + + + + + + + +
+
+

Welcome to My Cassette Beasts Shrine!

+
+

Promotional image of Cassette Beasts

+

Cassette Beasts is a 2D/3D hybrid monster collecting open-world role-playing video game developed by Bytten Studio, an indie team based in Brighton, United Kingdom, co-founded by Jay Baylis and Tom Coxon, and published by Raw Fury.

+

First released on Steam and Windows on 26 April 2023, later on console on 25 May 2023, Cassette Beasts is available on Windows, Linux, Steam, Xbox Series X|S, Xbox One, Gamepass and Nintendo Switch.

+

Cassette Beasts also has an official website and official wiki.

+

You can buy Cassette Beasts from below links:

+ +
+
+

Why You Should Play Cassette Beasts

+
+

Header of the Cassette Beasts official website

+

Cassette Beasts is a masterpiece of a monster collecting game with refreshing takes on the genre, from monster collecting mechanic, battle system, elemental type match ups, story, characters, lore, world building, map design, etc, with an amazing soundtrack that goes along with the game.

+

Indie monster collecting games in particular need all the support they can get to let more people (especially Western audiences) know that Pokémon is not the only monster collecting game worth your attention, and Cassette Beasts is one of those indie games that prove indie games can be more creative than AAA games.

+

I cannot recommend Cassette Beasts enough if you like monster collecting games, including, if not especially, if you like Pokémon but want an indie alternative, or something different after finding Pokémon games getting stale, or becoming jaded by the direction of the Pokémon games.

+

If you need more convincing on how Cassette Beasts is much more than a Pokémon clone, I have written a huge essay on this shrine.

+
+
+

My Interest In Cassette Beasts

+
+

Official screenshot of Harbourtown in Cassette Beasts

+

On 30 June 2023, when the Steam Summer Sale 2023 just started, I received Cassette Beasts as a Steam gift from a generous friend, who knew that I had been looking for independant monster collecting games, since I mostly play indie games instead of AAA games nowadays.

+

I started my first playthrough of Cassette Beasts on 18 July 2023, and I was immediately hooked. I could already feel this game has everything I could ask for in an indie alternative to Pokémon.

+

I ended up spending around 34 hours to beat the main campaign, and that was because I made the deliberate decision to max out the companion characters' relationship level before advancing to the final portion of the main story, since this game has more focus on human characters and relationships than what you may expect in a monster-collecting game.

+

I love Cassette Beasts so much that I also purchased its Deluxe Edition, which includes the soundtrack, the art book and the Cosplay Pack as a birthday present for myself on 28 July 2023. In addition, I also bought the official plushie of Pombomb, my favourite monster from the game.

+

Moreover, I ended up unlocking all 123 achievements on Steam on 13 March 2024. Very few RPGs make me want to unlock all the achievements, so it is telling how much I love Cassette Beasts that I am willing to spend time and effort to work for all the achievements.

+

Cassette Beasts not only is my Game of the Year of 2023, but also it has become my absolute favourite monster collecting game, and even my all-time favourite video game ever.

+
+
+

My Contributions to the Cassette Beasts Community

+
+

Pre-release artwork of Kayleigh, Meredith and Eugene from Cassette Beasts

+

Since I got into Cassette Beasts, I have been making a great deal of effort in promoting the game online, by talking about and recommending the game on my online spaces, including this shrine on my website, as well as social media platforms such as Tumblr and Twitter.

+

I am involved in the Cassette Beasts community by joining and participating in the official Bytten Studio Discord server.

+

In addition, my passion for Cassette Beasts drives me to contribute to the effort of documenting information about the game. I have recorded footages, made compilation videos and shared them on my YouTube channel for archival and reference purposes. I am also a contributor to the official Cassette Beasts wiki. You can check out my Cassette Beasts video playlists on YouTube and my user page on the Cassette Beasts wiki.

+

Since I already had basic skills and knowledge of Python, I contributed my code to cbpickaxe, a Python library and set of scripts for data mining Cassette Beasts, specifically to add support for finding dialogue strings of IDs that require pronoun identifiers. My code was approved and merged into cbpickaxe starting from version 0.1.2.

+

I created and am running Land of Confusion, the fanlisting for Cassette Beasts which is part of The Fanlistings Network. If you are a fan of Cassette Beasts, you are more than welcome to join my fanlisting!

+

On Tumblr, I run the Cassette Beasts Source blog, an unofficial Cassette Beasts fan site blog that I founded on 25 February 2024. I created a fan site blog on Tumblr due to the fact that Bytten Studio does not have an official Tumblr account, and I want a Tumblr blog dedicated to sharing and archiving Cassette Beasts news and fan works.

+

I have also contributed to Cassette Beasts TVTropes pages (I have had a TVTropes account since 18 February 2012), by editing the pages to add information about the game. I was the one who created the Trivia page for the game on TVTropes.

+
+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/cassettebeasts/resources/index.html b/shrines/cassettebeasts/resources/index.html new file mode 100644 index 00000000..ac610c24 --- /dev/null +++ b/shrines/cassettebeasts/resources/index.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Resources | Cassette Beasts Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + Banner of Cassette Beasts Shrine + + +
+
+ + + + +
+
+ + +

Cassette Beasts Resources

+ + + +

A collection of resources for Cassette Beasts.

+ + +
+ + + + + + + + + +
+
+

Discussions

+
+ +
+

Graphics

+
+ +
+

Game Guides

+
+ +
+

Modding

+
+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/index.html b/shrines/index.html new file mode 100644 index 00000000..68a15a5a --- /dev/null +++ b/shrines/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shrines | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Shrines

+ + + +

Index of Leilukin's web shrines.

+ + +
+ + + + + + +
+ +

A web shrine is a special web page dedicated to a specific topic, often one that the webmaster is interested in and passionate about, to celebrate or share information about their interest.

+ +

Here is a list of shrines I have made for my own website.

+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/articles/arren-kae-kreia-theory/index.html b/shrines/starwarskotor/articles/arren-kae-kreia-theory/index.html new file mode 100644 index 00000000..bbc9bba2 --- /dev/null +++ b/shrines/starwarskotor/articles/arren-kae-kreia-theory/index.html @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Why I Personally Do Not Subscribe to the “Arren Kae is Kreia” Theory | Articles | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

Why I Personally Do Not Subscribe to the “Arren Kae is Kreia” Theory

+ + + + +
+ + + + + + +
+

(Note: This article was originally published on Tumblr)

+

If you are a fan of Star Wars: Knights of the Old Republic II: The Sith Lords, you might have heard of the theory that Arren Kae, mother of Brianna the Handmaiden, and Kreia are the same person. If you have not heard of the theory, a compilation of the in-game evidence used to support the theory can be found on the Let’s Play Archive. The theory has become so popular that many fans of the game take it for granted, which can make it easy to forget that the theory was never officially confirmed.

+

I think the “Arren Kae is Kreia” theory is well-thought-out, and I agree that there are multiple in-game evidence that can support the theory. However, personally I do not subscribe to the theory, nor incorporate it into my headcanons for Knights of the Old Republic 2. I have eventually decided that in my KotOR 2 headcanons, I keep Arren and Kreia as two different people. Why?

+

Firstly, I want Brianna to have more positive women role models, especially given her troubled relationships with her sisters and Atris. Arren was the reason Brianna wants to be a Jedi, and the Kreia we see in the game is definitely not a good role model for someone who wants to be a Jedi. Kreia might have been a better person when she was a Jedi, but we never know for sure. Not to mention Kreia doesn’t treat Brianna any better than the other party members. Brianna deserves better.

+

Secondly, I like the theory suggested by an anonymous message I received on Tumblr that Arren Kae was to Kreia what the Exile was to Atris. The KotOR 2 game itself already builds up parallels between Kreia and Atris: both were fallen Jedi who personally felt betrayed by the Jedi in some ways, and many of the things in KotOR 2 happen because of their plans, schemes and manipulation. Therefore, I love the idea that if Arren and Kreia were two different people, they had similar dynamics to the Exile and Atris, in that Arren and Kreia were very good friends in the past, with Kreia potentionally having romantic feelings for Arren, but Arren's departure and exile from the Jedi Order became a catalyst for Kreia's disillusionment with the Jedi Order, and it only got worse from there.

+

Ultimately, since the "Arren Kae is Kreia" theory is never officially confirmed, I am free to choose to not subscribe to the theory, regardless of how popular the theory is in the fandom, and come up with my own theory about Arren Kae instead.

+

In conclusion, Keeping Arren Kae and Kreia as two different people in my KotOR headcanons allows Arren to be a positive influence in Brianna’s life that Brianna needs. Also, there are many interesting ideas and possibilities about Arren and Kreia’s dynamics that could be explored.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/articles/faq-same-gender-romance-mods/index.html b/shrines/starwarskotor/articles/faq-same-gender-romance-mods/index.html new file mode 100644 index 00000000..d72aeb37 --- /dev/null +++ b/shrines/starwarskotor/articles/faq-same-gender-romance-mods/index.html @@ -0,0 +1,726 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequently Asked Questions (FAQ) for My Star Wars: KotOR Same-Gender Romance Mods | Articles | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

Frequently Asked Questions (FAQ) for My Star Wars: KotOR Same-Gender Romance Mods

+ + + + +
+ + + + + + + + + +
+

(Note: This FAQ article was originally published on Nexus Mods. I decided to host this article on my own website instead for better management and formatting)

+

This article compiles the frequently asked questions I have received for my same-gender romance mods for Star Wars: Knights of the Old Republic (KotOR) series.

+

PLEASE READ THIS ARTICLE BEFORE ASKING QUESTIONS ABOUT MY ROMANCE MODS!

+

My same-gender romance mods for KotOR 1 include:

+ +

My same-gender romance mods for KotOR 2 include:

+ +

I have also compiled a list of all the same-gender romance mods various modders had created throughout the history of KotOR modding.

+
+

Technical Questions

+
+
+

I am having problems with your mod / I cannot get your mod to work / Your mod does not work for me.

+
+

Please make sure you have downloaded and installed the latest version of my mods, and read the Read Me files of my mods to make sure you have followed ALL the information and instructions in my Read Me files before asking questions for technical support.

+

When you are asking for technical support, please provide details for the issues you encountered: when and how did your problem start happening and what mods you have installed. Simply saying "mod doesn't work" DOES NOT help the mod author to figure out the cause of your issue. When I ask you for more details, please answer my questions honestly, so I can identify how to solve your problems. Telling me ALL the mods you use will help me greatly in figuring out if your issue was caused by mod conflict or not.

+

If you play KotOR 2 on Steam, make sure there are no leftover Steam Workshop folders in your Steam directory, because Steam Workshop mods will likely conflict with my mods, and even unsubscribing Steam Workshop mods does not always remove all Workshop mod files completely. To check for any leftover Steam Workshop files, go to the Steam Workshop folder in your Steam directory (/\Steam\SteamApps\Workshop\), and delete all the sub-folders in the Steam Workshop folder if they are present.

+
+

When I installed your mod, I got the error message: "[ERROR] Unhandled exception: Access violation at address [a bunch of numbers]. Write of address [a bunch of numbers] (0)".

+
+

Try to right-click your KotOR 2 folder or subfolders, go to Properties and uncheck the "Read-only", then try to install my mod again to see if it works.

+

First, go to the folder where your KotOR 2 game is installed, and go to the Modules folder, then check if the .mod files mentioned in the error messages are in your Modules folder.

+

For example, for Handmaiden and Female Exile – Disciple and Male Exile Romance mod, you need to check if these .mod files are in your Modules folder:

+
    +
  • 003EBO.mod
  • +
  • 006EBO.mod
  • +
  • 262TEL.mod
  • +
  • 301NAR.mod
  • +
  • 303NAR.mod
  • +
  • 402DXN.mod
  • +
  • 602DAN.mod
  • +
  • 610DAN.mod
  • +
  • 650DAN.mod
  • +
  • 907MAL.mod
  • +
  • 908MAL.mod
  • +
  • 909MAL.mod
  • +
  • 950COR.mod
  • +
+

If you cannot find those .mod files in your Modules folder, your issue might be caused by your computer registering two different installation locations for KotOR 2. I suggest you check out this guide on how to make sure your computer recognize the version of KotOR 2 game where you want to install KotOR 2 mods on. While the guide focuses on Steam version of KotOR 2, you could edit the registry to make your computer properly recognise the installation location of your KotOR 2 game.

+

Here are the default installation locations of KotOR 2 depending on the game version:

+
    +
  • Steam (32-bit Windows): C:\Program Files\Steam\steamapps\common\Knights of the Old Republic II
  • +
  • Steam (64-bit Windows): C:\Program Files (x86)\Steam\steamapps\common\Knights of the Old Republic II
  • +
  • Retail CD (32-bit Windows): C:\Program Files\LucasArts\SWKotOR2\
  • +
  • Retail CD (64-bit Windows): C:\Program Files (x86)\LucasArts\SWKotOR2\
  • +
  • Steam (32-bit Windows): C:\GOG Games\Star Wars - KotOR2
  • +
+

If you do not know if you have Windows 64-bit or 32-bit, refer this article to find out.

+
+

Will you upload your mods to Steam Workshop?

+
+

NO. I do not use Steam Workshop, and frankly, I hate the Steam Workshop for how terrible it is for modding KotOR 2 and how much mod compatibility issues it causes. I suggest you read this post on why using Steam Workshop is NOT recommend for modding KotOR 2. Therefore, I DO NOT want any of my mods to be added to the Steam Workshop.

+

STOP ASKING FOR ANY OF MY MODS TO BE ADDED THE STEAM WORKHOP. MY ASNWER WILL ALWAYS BE A FIRM NO, FULL STOP. NO EXCEPTIONS.

+
+

I am having problems a KotOR 2 mod of yours, and I am using the Steam Workshop. Can you help me?

+
+

See my answer to the previous question. I am not responsible for any bugs caused by you using any mods from the Steam Workshop. The only suggestion I will give you for compatibility issues between my mods and the Steam Workshop is to get rid of all your Steam Workshop mods entirely, and make sure there are no leftover Steam Workshop folders in your Steam directory. In order to do this, go to the Steam Workshop folder in your Steam directory (/\Steam\SteamApps\Workshop), and delete all the sub-folders in the Steam Workshop folder.

+
+

Does this mod work with [insert a different mod here]?

+
+

Please read the “Mod Compatibility” section of my mod description and Read Me files before asking. If there is a mod you want to use that was not mentioned in my mod description and Read Me files, you can still ask me. Just make sure you tell me the actual name of the mod and ideally, provide a link to the mod you want to ask about, so I can check the mod out myself to confirm if it is compatible with my mod. Do not expect me to know the existence of every single KotOR mod out there.

+
+

Are your romance mods compatible with KotOR Community Portal's mod builds?

+
+

Yes, all my KotOR mods, not just my same-gender romance mods, are compatible with KotOR Community Portal's mod builds.

+

That said, some of my mods require you to install at a very specific point of the mod builds:

+
    +
  • Handmaiden and Female Exile - Disciple and Male Exile Romance should be installed immediately after PartySwap and before Extended Enclave. If you also want to install Extended Enclave, you should use the compatibility patch included in my Handmaiden/Disciple romance mod, instead of the standalone patch I made for the mod build. If you plan on using Kreia's Fall In-Game Cutscene, you need to install the compatibility patch included in my mod.
  • +
  • Atton Rand and Male Exile Romance needs to be installed after PartySwap. If you also use Kreia's Fall In-Game Cutscene, you need to install the compatibility patch provided by Atton Rand and Male Exile Romance.
  • +
  • Visas Marr and Female Exile Romance needs to be installed after PartySwap.
  • +
+
+

Can I use your mods with non-English localizations of the KotOR games and The Sith Lords Restored Content Mod (TSLRCM)?

+
+

No. I play and mod the KotOR game in English exclusively. Some of my mods in particular will cause your game to crash if you are playing a non-English localization of the KotOR games and TSLRCM, because those mods add custom dialogues that do not exist in the vanilla game in order to prevent characters from referring to the player character as the wrong gender. The only solution to crashes caused by you playing on a non-English localization is to play the KotOR games and TSLRCM in English.

+

If you are interested in making a non-English translation or localization of my mods yourself, you may contact me to ask for my permission to do so. However, since I am not familiar with any of the non-English languages officially supported by the KotOR games, I am unable to provide support for any issues players may have with using your non-English translation or localization of my mod.

+
+

For your KotOR 2 mods that require The Sith Lords Restored Content Mod (TSLRCM) to work, will you make an alternate version that does not require TSLRCM?

+
+

No, I will not make a no-TSLRCM version of my mods that require TSLRCM to function. TSLRCM is widely agreed by players, including KotOR modders, to be an essential mod for the best experience with KotOR 2. Making a non-TSLRCM version of content mod like this would require me to spend extra time to replay KotOR 2 without TSLRCM, and therefore subjecting myself to a lesser experience with the game, which I consider a massive waste of my time. In general, if you see any KotOR 2 mod that requires TSLRCM to work (not just my mods), do not expect to see a non-TSLRCM version.

+

If you are having issues with using TSLRCM, I suggest you report the bugs you encountered and ask for help for solving your issues on the TSLRCM forum on Deadly Stream.

+
+

How to install your mods on the Xbox/Android/iOS/Nintendo Switch/any other non-PC version of KotOR or KotOR 2?

+
+

Sorry, I cannot help directly with modding the KotOR games on any console or mobile devices, because I only own the PC version of the KotOR games. I make no promises that I will port my KotOR mods for those platforms specifically either.

+

Some of my mods require TSLPatcher to install to make the mod work properly, especially if you also want to use other mods in addition to my mods and for KotOR 2, The Sith Lords Restored Content Mod. Simply copying and pasting files from my mod to your game's directory does NOT guarantee my mod will work as intended, and you may encounter bugs that could possibly game-breaking.

+

For Android and iOS users, I suggest referring to the KotOR Community Portal's modding guide, specifically their general instructions in their mobile mod builds. See this page for KotOR 1 and this page for KotOR 2.

+

For Nintendo Switch users, in order to mod the KotOR game on Switch, first you need to hack your Switch or install a modchip in your Switch, then use the KotOR Switch Modding Framework and KotOR II Switch Modding Framework to install mods. According to JacqylFrost, the creator of these frameworks, both TSLRCM and my Handmaiden same-geneder romance mod work with the KotOR 2 version of the framework. I suggest you ask JacqylFrost directly if you need help with modding the KotOR games on Switch.

+

For Steam Deck users, you may refer to JacqylFrost's Steam Deck modding guide on the KotOR subreddit.

+
+

Mod Content Questions

+
+
+

Will you add kissing scenes to your romance mods?

+
+

No. The goal of my same-gender romance mods is not necessary to add new content, but to allow players to experience the pre-existing romance content in the KotOR series without the heterosexual gender restrictions. Kissing scenes are beyond the scope of my mods, and I do not necessary have the skills required (such as modelling, animations, etc.) to create them either, especially given how limited the animations in these old games are.

+

For Carth Onasi and Male PC Romance mod for KotOR 1, if you want your male PC to kiss Carth, you may install cjt0202's Carth Romance Fix mod, then install the compatibility patch provided in my mod.

+
+

Will you make a romance mod for Canderous/Bao-Dur/Mira/any other character with no romance content in the vanilla game?

+
+

No. Due to the fact that these characters were never intended to be romance options for the player character, creating romance content for these characters require extra work and effort, namely writing new dialogue, scripting and animating new scenes, and ideally, finding voice actors or using voice synthesithers for these new content, because some people (myself included) find it immersion-breaking to see party member suddenly become silent in certain lines despite being voiced in every other dialogue. This goes beyond my modding capabilities, and I do not have enough time and desire to put this large amount of work in video game mods for the foreseeable future.

+
+

Why do you make everyone gay?

+
+

I am a lesbian who would like to see more representation of LGBTQ+ people and relationships in media, including Star Wars, and I am not the only one who feels this way. I made these same-gender romance mods for fellow LGBTQ+ players who want more gay content in KotOR as well. I find KotOR 2's complete lack of same-gender romance options especially disaappointing, since the first KotOR at least has Juhani as a canon lesbian romance option, so I made these mods to fill the void. In fact, after releasing my same-gender romance mods, many other LGBTQ+ players have expressed gratitute for the existence of these mods, and consider these mods a huge improvement to their KotOR experience.

+

Cisgender heterosexual people already get countless representations in media, including Star Wars, bcause cishet people are considered the default and the norm. If the idea that everyone in your favorite piece of media could be gay makes you uncomfortable, perhaps you meed to examine why you feel that way. Keep in mind that LGBTQ+ people already have to see countless pieces of mainstream media filled with cisgender heterosexual characters without a single LGBTQ+ character even existing.

+

Frankly, opposing the concept or existence of same-gender romance mods for video games is homophobic. As a gay person, this is a stance I will not change my mind on. Any comment or message that tries to argue with me otherwise will be ignored or deleted without response.

+
+

Character X being gay does not fit his/her character.

+
+

That is just your opinion, and an opinion I will never agree with. Like it or not, there will always be someone who would like to see gay content for any of the characters affected by my same-gender romance mods.

+
+

Alternate Revan Romances REDUX Questions

+
+
+

Will you make Juhani a romance option for male Revan too?

+
+

No. I will never make Juhani a romance option for male characters under any circumstances. I also do not support any mods that make Juhani a romance option for male characters.

+

It is my firm belief that Juhani should remain a lesbian and her romance should remain exclusive to female characters because she is an officially confirmed lesbian character. Read this article about my stance on protecting Juhani's status as a lesbian, and why.

+
+

The AI-generated voice for Juhani in the Juhani cameo add-on is robotic.

+
+

I know an AI cannot beat a human voice actor when it comes to delivering emotions, but getting a voice actor doing a Juhani impression instead of an AI for those new lines is much easier said than done. I do not have the money to hire voice actors, and whether I can find a voice actor who is able to do a Juhani impression is another big question, especially given how unique Juhani's voice is. An AI voice synthiser is genuinely the best option for me with the very limited resources I have as one person and fan of the game who makes mods for free. Unless someone is willing to volunteer to voice Juhani for a mod, likely for free, I can never make any promise that there will be an actual voice actor for Juhani's dialogue in this mod.

+
+

Handmaiden and Female Exile - Disciple and Male Exile Romances Questions

+
+
+

I playing as a female player character, but Handmaiden does not join my party after I leave the Telos Academy!

+
+

If Handmaiden does not join your female Exile's party when you are using my Handmaiden romance mod, the possible causes for this happening include:

+
    +
  • You did not install my mod correctly. Either you get errors when installing the “Default Installation” option, or you did not install DarthTyren's PartySwap mod first before installing the “PartySwap Compatible” option of my mod.
  • +
  • You have a holorec.dlg file in the Override folder, either from a mod you are using or a mod you previously used. If there is a holorec.dlg in your Override folder, delete it.
  • +
  • You may have some leftover Steam Workshop folders in your Steam directory that overrides the portion where Handmaiden is supposed to join your party. To solve this, go to the Steam Workshop folder in your Steam directory (/\Steam\SteamApps\Workshop\), and delete all the sub-folders in the Steam Workshop folder.
  • +
  • Similar to the above, you may have some leftover files from a mod you used in your previous playthrough in your KotOR 2 game directory that interferes the portion where Handmaiden is supposed to join your party. The best way to solve this is to uninstall your game, delete your KotOR 2 game folder entirely, and then re-install the game and the mods you want to use.
  • +
+
+

Can you make your mod so you always recruit Handmaiden or Disciple only regardless of the Exile's gender?

+
+

No, and I see no point in making such mod when DarthTyren's PartySwap mod already exists to allow you to recruit both Handmaiden and Disciple in a single playthrough regardless of the Exile's gender. Additionally, my mod's primary goal is enabling same-gender romfnce options, so neither male Exile/Handmaiden nor female Exile/Disciple romance is a priority of my mod.

+

Therefore, if you want Handmaiden or Disciple in your party regardless of your Exile's gender, my recommendation is to install PartySwap. If you also want same-gender romance with Handmaiden or Disciple, install the PartySwap compatible installation option of my mod after PartySwap. Even if you prefer Handmaiden to Disciple, or vice versa, I will still recommend you to use PartySwap instead so you can get the most out of the party members in a single playthrough.

+
+

I cannot spar with the Handmaiden when she joins my party!

+
+

This is not a problem with my mod. The FAQ of The Sith Lords Restored Content Mod (TSLRCM)'s mod page and Read Me file already addressed this:

+
+

Due to a bug, sparring with Handmaiden while in outer space (directly after leaving the Telos Academy) made the fight unwinnable. So for TSLRCM you will have to travel to another planet, exit and re-enter for the option to appear, giving a glitch-free sparring. It's not gone, no worries!

+
+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/articles/handmaiden-sisters-mother/index.html b/shrines/starwarskotor/articles/handmaiden-sisters-mother/index.html new file mode 100644 index 00000000..96acf519 --- /dev/null +++ b/shrines/starwarskotor/articles/handmaiden-sisters-mother/index.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Where is the Mother of the Handmaiden's Sisters? | Articles | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

Where is the Mother of the Handmaiden's Sisters?

+ + + + +
+ + + + + + +
+

(Note: This article was originally published on Tumblr)

+

In Star Wars: Knights of the Old Republic II: The Sith Lords, from the first conversation you could have with Brianna, also known as The Last Handmaiden, in the secret Jedi academy on Telos, to the moment where you train Brianna to become a Jedi Guardian if she joins your party, the game has consistently shown that Brianna's family plays a major part of her story and character arc due to her identity as an illegitimate child of the Echani general Yusanis and Jedi Knight Arren Kae. I have always enjoyed Brianna's arc, so even when I am playing a female Jedi Exile, I always use mods that allow Brianna to join a female Exile's party.

+

As I have thought more about Brianna's family drama, one day I have come to realise that there is a mystery about Brianna's family that I find it unfortunate that we know next to nothing about: the mother of Brianna's sisters.

+

I find it curious that we never get to learn anything about the mother of Brianna's sisters at all, aside from the fact that she was not Arren Kae. Given what we know about Brianna's family and the drama surrounding it, the realization that the game never explores the mother of Brianna's sisters has made me want to ask a lot of questions about her:

+

Where is she? Is she still alive? How is her relationship with Yusanis and her own biological daughters? How much did she know about Yusanis' affair with Arren? Did she know Arren? Did she actually know Brianna? If so, how did she feel about Brianna?

+

In the conversation where Brianna confirms she had a different mother than her sisters, she says she never saw her mother's face, so we can assume that Arren was not part of Brianna's life when Brianna grew up. In the same conversation, the extent Brianna talks about her father, like the reason her father went to fight in the Mandalorian Wars was to join her mother and how he had changed after returning from the war, suggests that Brianna knows her father well enough, so I guess she have lived with her father, though this makes me wonder: was the mother of Brianna's sisters part of Brianna's life when she grew up?

+

I also wonder, when exactly did Brianna's sisters know about their father's affair with Arren? Did Yusanis tell them himself or did they find out in another way? Did Brianna and her sisters know each other before learning about their father's affair?

+

I guess it makes sense that we know more about Arren Kae than we did the mother of Brianna's sisters, since she was the mother of one of the party members, while the Handmaiden Sisters are NPCs who are not even given any names. Arren is also mentioned by Mical the Disciple as one of Revan's masters, and Revan is an important character in both Knights of the Old Republic games. If you subscribe to the theory that Arren Kae and Kreia are the same person (I have my own reasons not to, however), Arren's importance increases even more.

+

However, I would still like to know at least a little more about the mother of Brianna's sisters, since Brianna's complicated relationship with her sisters also affects Brianna's character and story arc.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/articles/index.html b/shrines/starwarskotor/articles/index.html new file mode 100644 index 00000000..eb83ea4a --- /dev/null +++ b/shrines/starwarskotor/articles/index.html @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Articles | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + +

Star Wars: Knights of the Old Republic Articles

+ + + +

List of articles written by me or other people that I recommend for the Star Wars: Knights of the Old Republic series.

+ + +
+ + + + + + + + + +
+
+

My Articles for Both Games

+
+ +
+

My KotOR 1 Articles

+
+ +
+

My KotOR 2 Articles

+
+ +
+

KotOR Articles I Recommend

+
+
    +
  • This essay about Juhani by Tumblr user somblog is an excellent analysis of Juhani's character.
  • +
  • In Defense of Peragus: it’s not just well-designed, it’s a uniquely good level too by Snigaroo on the KotOR Subreddit — An excellent essay that goes into detail in explaining why some of us actually find Peragus a good level. I am among the minority that genuinely enjoy Peragus, to the extent that I never even considered using any mod to skip the level, and I replay all the hologram recordings throughout Peragus and the Harbinger every time I replay KotOR 2.
  • +
+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/articles/juhani-hostility-towards-canderous/index.html b/shrines/starwarskotor/articles/juhani-hostility-towards-canderous/index.html new file mode 100644 index 00000000..4de2a244 --- /dev/null +++ b/shrines/starwarskotor/articles/juhani-hostility-towards-canderous/index.html @@ -0,0 +1,505 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + How to Access Juhani's Conversaion about Canderous without Restoration Mods | Articles | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

How to Access Juhani's Conversaion about Canderous without Restoration Mods

+ + + + +
+ + + + + + +
+
+

If you follow the modding scene of Star Wars: Knights of the Old Republic, you might be aware of a conversation with Juhani where the player asks her why she is hostile towards Canderous. It is a commonly assumed that it is cut content, because the condition to trigger said conversation is unknown by the KotOR community, and there are mods that aim to restore said conversation.

+

After thorough investigation into the game files, I finally discovered that it is actually possible to access Juhani's conversation about Canderous without any restoration mod. However, the issue is that in the vanilla game, the condition to make said conversation available is very specific, thus making it extremely easy to miss. Therefore, what restoration mods do to this specific Juhani conversation is making it easier to access.

+
+

Here are the conditions to make Juhani's conversation about Canderous without restoration mods:

+
+

Firstly, you need to have both Canderous and Juhani in your party when talking to certain NPCs on Dantooine. Canderous will make comments when you talk to those NPCs, then Juhani will interject and show hostility towards Canderous. Specifically, these interjections happen when you:

+
    +
  • Talk to Gar at the courtyard outside the Jedi Enclave and ask him about the problems with kath hounds and Mandalorians
  • +
  • Accuse Handon Guld of murdering Calder Nettic for cheating on his wife, during the "Murdered Settler" side quest
  • +
  • Tell Nurik Sandral you are investigating Shen Matale's disappearance, during the "Sandral-Matele Feud" side quest
  • +
+

You need to hear Juhani's interjections to Canderous' comments on at least two of the above occasions.

+

Secondly, you need to progress Juhani's conversations to the point where she reveals that her family fled to Taris because the Mandalorians attacked the Cathar homeworld and slaughtered many Cathar people. It is after this conversation where you get the dialogue option to ask Juhani why she is hostile towards Canderous.

+

As evidence, I have recorded and compile the above video myself showing Juhani's interactions with Canderous and Juhani's conversation about Canderous.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/articles/juhani-lesbian-evidence/index.html b/shrines/starwarskotor/articles/juhani-lesbian-evidence/index.html new file mode 100644 index 00000000..e73ae7c6 --- /dev/null +++ b/shrines/starwarskotor/articles/juhani-lesbian-evidence/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Evidence of Juhani being a Lesbian from Star Wars: Knights of the Old Republic's Game Files | Articles | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

Evidence of Juhani being a Lesbian from Star Wars: Knights of the Old Republic's Game Files

+ + + + +
+ + + + + + +
+

(Note: This article was originally published on Tumblr)

+

The fact that Juhani from Star Wars: Knights of the Old Republic is a canon lesbian character is a fairly common knowledge among LGBTQ+ fans of Star Wars. However, occasionally I still see people who do not know that the first KotOR game has the very first confirmed gay character in any Star Wars media, including the old Star Wars Expanded Universe; there are some other people who actually believe that Juhani is bisexual.

+

Therefore, as a lesbian and someone who has made mods for the Knights of the Old Republic games and written a detailed Juhani romance guide, I would like to present hard evidence from the game files to point out that Juhani is in fact a lesbian, a woman who is exclusively attracted to women.

+

The most crucial evidence comes from k_hjuh_dialog.dlg, Juhani’s main dialogue file which contains all the conversations covered in my Juhani Romance Guide. If you use the KotOR Tool to browse the game files, k_hjuh_dialog.dlg is under KotOR I > BIFs > templates.bif > Dialog. I recommend using DLGEditor to view the .dlg files from KotOR games.

+

Here is a screenshot of my DLGEditor with the most relevant part of the k_hjuh_dialog.dlg file:

+
+ Screenshot of DLG Editor 2.3.2 displaying Juhani's main dialogue file +
+(View the screenshot in its original size) +
+
+

The highlighted dialogue shown in the screenshot (”I feel I must apologize for the way I acted towards you before, in the grove. It was wrong of me.”) is the beginning of your first personal conversation with Juhani after Juhani joins your party. Here is a video of the conversation in question:

+
+

As shown in the screenshot above, once you begin this conversation, the script k_hjuh_p17 will fire, and this is the source of the script in question:

+
void main()
+{
+    int iGender = GetGender(GetPCSpeaker());
+    if (iGender == GENDER_FEMALE)
+    {
+        SetGlobalBoolean("T_JUHANIROM", TRUE);
+    }
+}
+
+

(In KotOR Tool, you can see the source script k_hjuh_p17.nss under KotOR I > BIFs > scripts.bif > Script, Source)

+

As you may have guessed from the above script, k_hjuh_p17 sets the Global Boolean T_JUHANIROM to TRUE if, and ONLY IF, the player character is female. The T_JUHANIROM global is used by the game to check if Juhani’s romance is active or not. In other words, the game activates Juhani’s romance ONLY IF your player character is female, as soon as you start Juhani’s personal conversation after she joins your party. If your player character is male, Juhani’s romance will NOT be activated.

+

Here is the hard evidence from KotOR's game files that Juhani is a lesbian, a woman who is exclusively attracted to women. Juhani is NOT straight. Juhani is NOT bisexual.

+

The game used to have a bug that allowed male player characters to access Juhani’s romance, which is probably why some thought that Juhani is bisexual. However, the bug had been fixed in later patches. By fixing the bug, the game has made sure that ONLY a female player character can romance Juhani.

+

Even though the word “lesbian” or “gay” is never used in any of the KotOR games, it does not change the fact that Juhani is a woman character who can only be romanced by a woman player character, which means Juhani is gay, a lesbian.

+

In conclusion, Juhani is a canon lesbian character and has always been intended to be such.

+

I would also like to emphasise that I DO NOT support any mods that make Juhani a romance option for male characters under any circumstances, because such mods would be erasing the identity of the very first confirmed lesbian character in any Star Wars media. Not to mention, Juhani is the ONLY confirmed LGBTQ+ character in the entire KotOR series (Belaya from KotOR 1 and Luxa from KotOR 2 are heavily implied to be gay or bisexual, but their sexuality is never confirmed). Please respect LGBTQ+ representation and the identities of canon LGBTQ+ characters. You can read more about my stance on this matter in my other article: Keep Juhani a Lesbian and Keep Juhani's Romance Exclusive to Female Characters.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/articles/keep-juhani-a-lesbian/index.html b/shrines/starwarskotor/articles/keep-juhani-a-lesbian/index.html new file mode 100644 index 00000000..2061611f --- /dev/null +++ b/shrines/starwarskotor/articles/keep-juhani-a-lesbian/index.html @@ -0,0 +1,501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Keep Juhani a Lesbian and Keep Juhani's Romance Exclusive to Female Characters | Articles | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

Keep Juhani a Lesbian and Keep Juhani's Romance Exclusive to Female Characters

+ + + + +
+ + + + + + +
+

For those who do not know, Juhani is a character introduced in the video game Star Wars: Knights of the Old Republic (KotOR), which was developed by BioWare. She is best known not only for being a lesbian and a romance option for female player characters, but also the very first confirmed gay character in both the Star Wars franchise and BioWare games.

+

Defending and protecting Juhani's status as a lesbian is a stance I will make no compromise on. It is my firm belief that Juhani should remain a lesbian and her romance should remain exclusive to female characters. I strongly and utterly oppose any attempt to make Juhani a romance option for male characters under any circumstances. In other words, I am completely against the idea of making Juhani straight or bisexual.

+

As a modder of the KotOR video game series, I also need to state that I will never make Juhani a romance option for male characters under any circumstances in any of my mods. I also do not support any mod that makes Juhani a romance option for male characters, including providing technical support or granting permission to make patches that try to make straight or bisexual Juhani mods compatible with my mods.

+

Some would ask me: why do you support and even make mods that make heterosexual characters gay, but against making gay characters heterosexual?

+

The answer is simple: Because I both want more LGBTQ+ representation and I believe the identities of officially confirmed LGBTQ+ characters should be respected and not be changed.

+

Unlike every other romance options in both KotOR games, Juhani is a canon gay character, which means she is officially confirmed to be attracted to the same gender exclusively, and she has always been intended to be a lesbian, a woman who is exclusively attracted to women. In fact, the first KotOR game has gone out of its way to ensure ONLY female player characters can romance Juhani.

+

As a lesbian myself, I utterly and firmly oppose the idea of making canon lesbian characters like Juhani being able to be romanced by men (or canon gay male — as in, men who are exclusively attracted to men — characters romanceable by women), because it is very disrespectful for gay representation, especially consider the fact that Juhani is literally the ONLY confirmed LGBTQ+ character in either KotOR game (minor female NPCs Belaya, Luxa and the Twin Suns are implied to be attracted to women, but their sexualities are never confirmed). Making canon lesbian characters like Juhani a romance option by men is also reminiscent of the real-life homophobic attitude that gay people's sexualities can be changed, which leads to “conversion therapy” (Link to a PDF file).

+

Lesbians specifically are often discriminated and prejudiced against due to both homophobia and misogyny. In fact, there is a word for describing the various forms of prejudice and negativity towards lesbians specifically: lesbophobia. We lesbians are often demonised as "not giving men a chance" for being women with an exclusive attraction to women and a lack of attraction to men. Yes, I do believe making confirmed lesbian characters like Juhani straight or bisexual is a form of lesbophobia. Juhani is a fictional character, but lesbians exist in the real world, and how you treat a fictional charcter with an identity that is marginalised in real life often reflects your attitude towards people with said marginalised identity in the real world.

+

Making Juhani a romance option for male characters cannot be compared to making heterosexual romance options like Bastila Shan and Carth Onasi gay or bisexual, because cisgender heterosexual people already get countless representations in media, including Star Wars and KotOR, because cishet people are considered the default and the norm. Keep in mind that LGBTQ+ people already have to see countless pieces of mainstream media filled with cisgender heterosexual characters without a single LGBTQ+ character even existing. Making heterosexual romance options like Bastila and Carth available for same-gender romance options is out of desire for more LGBTQ+ representation, while making Juhani a romance option for male characters, including making Juhani bisexual, is erasing her lesbian identity and disrespecting lesbian representation.

+

All my same-gender romance mods are about adding more same-gender romance options, and not inherently about removing every gender restriction in romances without any thought or consideration. Ultimately, My reasons and motives for opposing changing Juhani's lesbian orientation, and at the same time supporting making heterosexual romance options like Bastila and Carth gay or bisexual, are all about wanting more LGBTQ+ representation and respecting canon LGBTQ+ representation. Protecting Juhani's status as a canon lesbian character is not inherently about adhering to canon, but about respecting representation of marginalised groups like LGBTQ+ people.

+

Keeping canon gay chracters exclusive to same-gender romances, including keeping Juhani's romance exclusive to female chracters only, is a stance I am not going to change my mind on, so I would appreciate anyone not debating me on this.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/articles/partyswap-management-takeover/index.html b/shrines/starwarskotor/articles/partyswap-management-takeover/index.html new file mode 100644 index 00000000..19108120 --- /dev/null +++ b/shrines/starwarskotor/articles/partyswap-management-takeover/index.html @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + On Me Taking Over the Management and Development of DarthTyren's PartySwap Mod | Articles | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

On Me Taking Over the Management and Development of DarthTyren's PartySwap Mod

+ + + + +
+ + + + + + +
+

Starting from 11 July 2023, I, Leilukin, have officially taken over the management and development of DarthTyren's PartySwap mod for Star Wars: Knights of the Old Republic: The Sith Lords.

+

Screenshot of the PartySwap mod's download page, showing Leilukin as the owner

+

PartySwap is a mod that allows you to recruit both Handmaiden and Disciple as party members in a single playthrough regardless of the player character's gender. Since its release on May 21, 2015, PartySwap has been one of the most popular KotOR 2 mods, for very good reasons: it is an excellent mod from concept and execution on both story and technical standpoints. Even though PartySwap was not the first mod that allows a female player character to recruit Handmaiden as a party member, it was the first that actually makes both Handmaiden and Disciple join your party in the same playthrough, regardless of the player character's gender. It is a further testament to PartySwap's quality that it has been included in the KotOR Community Portal's mod builds, which are known for high-standards for mod quality, and described by the mod builds as a legendary mod.

+

Developing and maintaining a highly regarded mod like PartySwap is no small task, as it requires both time and skill. At the end of the day, video game modding is a hobby, and generally modders create mods out of passion for and interest in the source material, and not for profit. Interests can change, especially when it is caused by real-life factors. Therefore, it is understandable that on 2 May 2023, nearly 8 years after the initial release of PartySwap, DarthTyren announced his intention of stepping away from KotOR modding and transferring the management of PartySwap in the mod's thread on the Deadly Stream forums:

+
+

CONFESSION TIME: I've kinda taken a break from KotOR modding and Star Wars in general, as I have far greater pursuits to occupy myself with. I've been doing a lot of writing and playing other games that before I never would have given thought to, not to mention taking my faith far more seriously. Logically, that means certain things would have to fall to the side to make room, and Star Wars ended up being one of those things I lost interest in, something I never thought possible.

+

This puts the future of the mod in a bit of a pickle: I can't spend much time working on keeping it updated, because that would require sinking hours of productivity into playtesting that I can't commit to anymore. I apologize for my silence and my absence, but only now have I actually gained the courage to say as much. So, though it pains me greatly, and I'll probably regret it in the short-term, after much careful contemplation on the matter, I have to believe this is what's best:

+

PartySwap is up for adoption.

+

If you would be interested in taking over future development, send me a DM explaining why you're the right person for the role and what your plans for the mod would be going forward. Why such a fuss? It sounds lame, but this mod is the biggest contribution I've made to the world to date. I don't want to just hand it over and suddenly have it botched and butchered beyond recognition like Disney's Star Wars - so yes, there's a bit of pride here. I feel like I'm handing over my child.

+

Until next time.

+
+

After seeing DarthTyren's announcement, I contacted him via Deadly Stream's private message system to volunteer myself to take over future development of PartySwap, since I believed I am qualified for the task for a couple of reasons: I have used PartySwap in my own playthroughs, and as a KotOR modder with a fair amount of experience myself (I had started making mods for the KotOR games since 2016), I am very familiar with how the PartySwap works technical-wise, which is why I was able to make a compatibility patch for PartySwap and Extended Enclave. I am still involved in KotOR modding, and regularly participating in the KotOR Subreddit Discord server to provide support for KotOR modding.

+

In 11 July 2023, DarthTyren announced his decision to hand over the development and management of PartySwap to me:

+
+

Everyone give a nice, warm welcome to the new manager of PartySwap: @Leilukin!

+

I'm aware how long I took with this announcement. I sat on this decision for months, but with Leilukin's current activity level in the community and as a modder, as well as her familiarity with the mod and how it works and her vision for the future, there really was no one else this mod could be passed off to.

+

I want to thank everyone who supported me and PartySwap over the last several years, and even as I step away from modding and Star Wars entirely, I hope you'll join me in wishing Leilukin the best.

+

For the last time...

+

Darth Tyren has spoken!

+
+

It is a huge honour to be trusted with the task of managing one of the most popular mods for the KotOR games by the mod's author himself. I totally understand that Tyren did not make this decision lightly, and I fully intend to use my new role as the new manager of PartySwap responsibly.

+

In order to make future management of the mod file hosted on Deadly Stream smoother, Snigaroo, one of the administrators of Deadly Stream, has also transferred PartySwap's file ownership on the website to me upon DarthTyren's request. As a result, from now on, when you visit PartySwap's download page on Deadly Stream, you will see me as the file owner.

+

My plan for the future of PartySwap would be maintaining the mod and keeping the mod as bug-free as possible, and ensuring compatibility with the KotOR subreddit's mod builds. I might also add compatibility patches for other mods if such a need arises. Therefore, if you encounter any bug or issue with PartySwap, I am the person to report to.

+

I would like to thank DarthTyren for his effort in making and maintaining PartySwap throughout the years, and his trust in my capability in managing his mod.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/articles/tslrcm-first-kotor2-playthrough/index.html b/shrines/starwarskotor/articles/tslrcm-first-kotor2-playthrough/index.html new file mode 100644 index 00000000..113be83a --- /dev/null +++ b/shrines/starwarskotor/articles/tslrcm-first-kotor2-playthrough/index.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Should You Use The Sith Lords Restored Content Mod in Your First Star Wars: KotOR 2 Playthrough? | Articles | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

Should You Use The Sith Lords Restored Content Mod in Your First Star Wars: KotOR 2 Playthrough?

+ + + + +
+ + + + + + +
+

Regardless of how much you like Star Wars: Knights of the Old Republic II: The Sith Lords or not, there is no denying the fact that the game would be (even) better if Obsidian Entertainment was given more time to develop and polish the game to truly achieve their vision for the game, instead of being rushed to meet the release deadline which resulted in a lot of cut content.

+

The Sith Lords Restored Content Mod (TSLRCM) is the most successful attempt to restore the cut content of KotOR 2, as it not only restores cut content that can help to flesh out the game and give some plot lines more closure, but also fixes many bugs in the vanilla game. TSLRCM easily became the most iconic mod for either KotOR game, to the extent that the mod even has its own Wikipedia page.

+

It is widely agreed that TSLRCM is essential for the best experience with KotOR 2. There are players only started to like KotOR 2 after they replayed the game with TSLRCM, so some have argued that even first-time players should use TSLRCM in their very first playthrough of KotOR 2. I, however, do not believe the answer to the question "Should you use TSLRCM in your first KotOR 2 playthrough" is clear-cut. As a huge KotOR 2 fan who has played the game both with and without TSLRCM, my opinion is that it is up to the player to decide if they want to use TSLRCM in their first KotOR 2 playthrough based on their priorities.

+

TSLRCM changes the playing experience of KotOR 2 for the better, but it is still a mod that fundamentally changes the player's experience with the game. The primary purpose of video game modifications is to change things in a game, usually in ways that diverge from the original design of the game. This is why I typically do not encourage brand-new players to use mods in their first playthrough of any video game, with the only exception being pure bug fix mods, such as the first KotOR game's KOTOR 1 Community Patch. Instead, I would advise players to play a game first without mods, so they can make their own decision on what kind of mods would they want to make their experience with the game better when they replay it, and in turn, they would appreciate the changes made by the mods they use and the work modders put into the mods better. This philosophy of mine applies to both KotOR games, even after I became a KotOR modder myself.

+

Therefore, if you have never played KotOR 2 before, and you ask me if you should use TSLRCM in your first KotOR 2 playthrough, my answer is that it depends on what you want. You may use TSLRCM in your first KotOR 2 playthrough if you intend to play KotOR 2 only once, and you want to get the best experience with the game in the only time you will be playing the game, but otherwise I would encourage you to try KotOR 2 without TSLRCM first, in order to fully appreciate TSLRCM for what it accomplishes, for the changes it makes for the game and the praise it receives from players.

+

Another benefit from playing KotOR 2 without TSLRCM first is that you will have an easier time finding guides and walkthroughs of the game, because most of the KotOR 2 guides that you can easily find on the internet were written based on the vanilla version of the game, while TSLRCM-specific guides are more difficult to find by comparison.

+

Perhaps I am biased because I already loved KotOR 2 from the get go since my first playthrough of the game, even before I discovered TSLRCM's existence, and I am the type of autistic gamer who likes to replay games they like, but I do not believe that makes my opinion any less worthy to consider.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/guides/index.html b/shrines/starwarskotor/guides/index.html new file mode 100644 index 00000000..57ab48ee --- /dev/null +++ b/shrines/starwarskotor/guides/index.html @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Guides | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + +

Star Wars: Knights of the Old Republic Guides

+ + + +

List of guides for the Star Wars: Knights of the Old Republic series I have written or found useful. This page also includes lists of cheats.

+ + +
+ + + + + + + + + +
+
+

My KotOR Guides

+
+ +
+

KotOR 1 Guides by Others

+
+ +
+

KotOR 2: TSL Guides by Others

+
+ +
+

KotOR Cheats

+
+ + + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/guides/kotor-juhani-romance-guide/index.html b/shrines/starwarskotor/guides/kotor-juhani-romance-guide/index.html new file mode 100644 index 00000000..214d66f6 --- /dev/null +++ b/shrines/starwarskotor/guides/kotor-juhani-romance-guide/index.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Juhani Romance Guide | Guides | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

Juhani Romance Guide

+ + + + +
+ + + + + + + + + +
+

[This guide is also available on Google Docs]

+
+

Introduction

+
+

Since I could not find a solid and detailed guide for Juhani's romance anywhere, and many players (I used to be one of them as well) have troubles with triggering Juhani's final romance conversation, I have decided to write a guide myself. Even though there is very little content for Juhani's romance, if you want to experience the very first canon same-gender romance option in BioWare games first hand, this guide is for you.

+

For this guide, I have done a lot of research and investigation to find out the conditions required to trigger Juhani's conversations, including tons of web searching, using KotOR Tool to browse and examine the game files related to Juhani's conversations, as well as using KotOR SaveGame Editor (KSE) to compare my save files.

+

NOTE: Even if you use KotOR 1 Restoration (K1R) mod, the conditions to progress Juhani's romance remains the same as vanilla KotOR 1. However, I recommend using KOTOR 1 Community Patch (K1CP) instead of K1R due to the fact K1CP fixes more bugs than K1R does, including bugs related to Juhani.

+
+

Important Notes

+
+

First and foremost, since Juhani was written to be a lesbian, your player character must be female if you want to romance Juhani. The game activates Juhani's romance ONLY IF your player character is female.

+

As long as your player character is female, even if you romance Carth, Bastila (if you use mods that allow the female player character to romance Bastila, such as the Biromantic Bastila mod) or even both, you can still romance Juhani.

+

In order to advance your progress with Juhani's conversations, it is highly recommended to talk to Juhani and go through all her available conversations every time you level up. The progression with Juhani's conversations is tied in with the ability to level up, not just being at a certain level. Some Juhani's conversations will only be triggered after you gain 1 level after a previous conversation (see the Walkthrough section below for details). Given the limited level cap in KotOR 1 (the maximum level is 20), if you do not talk to Juhani often before you reach the level cap, it is very likely you will miss out on the chance to get her later conversations, including her final romance conversation.

+

You also need to complete Juhani's personal quest, "Threat From Xor", to make her final romance conversation available.

+

You need to be nice to Juhani during your conversations with her, because mean dialogue choices will set the global boolean T_JUHANIROM to 0, ending the romance, and apparently it is impossible to restart the romance afterwards.

+

Before you start a new KotOR playthrough, I highly recommend you to download and install the KOTOR 1 Community Patch, because the mod fixes many bugs with KotOR, including bugs that may block you from progressing Juhani's quest and conversations.

+

(WARNING: this guide contains spoilers for both Juhani's personal story and KotOR's main plot)

+
+

Walkthrough

+
+

There are two paths in Juhani's conversations: History and Personal. The History path explores Juhani's past and will lead to Juhani's personal quest "Threat from Xor", while the Personal path explores Juhani's relationship with the player character and will lead to Juhani's love confession if her romance is active.

+

You can check your progress with Juhani's conversations by using the KotOR SaveGame Editor (KSE). Once you launch KSE, and it successfully loads your KotOR save files, expand a save file, and look for Globals > Numerics, G_JUHANIH_STATE refers to the History path, while G_JUHANIP_STATE refers to the Personal path. The walkthrough below contains details on how to trigger all the conversations required to make the final romance conversation available, the global values in KSE, and links to YouTube videos for these conversations.

+

In addition, you can check if Juhani's romance is still active by using KSE: look for Globals > Booleans, and make sure T_JUHANIROM is set to 1.

+
+

History Conversation Path

+
+
+

History #1

+
+

This conversation is available once Juhani joins your party, which happens after you collect your first Star Map on Dantooine, and you're tasked by the Jedi Council to search for the Star Forge. You can ask Juhani how did she become a Jedi. After this conversation, the global value of G_JUHANIH_STATE will be set to 1.

+

View History #1 on YouTube

+
+
+

History #2

+
+

Available when you gain 1 level after History #1. Juhani talks about meeting the Jedi back in her homeworld. After this conversation, the global value of G_JUHANIH_STATE will be set to 2.

+

View History #2 on YouTube

+
+
+

History #3

+
+

Available when you gain 1 level after History #2. Juhani reveals that she was from Taris, and she expresses anger over the destruction of Taris. After this conversation, the global value of G_JUHANIH_STATE will be set to 3.

+

View History #3 on YouTube

+
+

BUG WARNING: There is a bug that may block you from progressing Juhani's Personal Conversation path after you complete History #3, and thus preventing you from triggering Juhani's final romance conversation. See the "Personal Conversation Path" section below for more details about this bug. This bug is fixed by the KOTOR 1 Community Patch, which is a major reason I highly recommend this mod.

+

If you are unable to install mods for some reason, I would suggest that once you complete History #3, stop leveling up your character. Once you get your second Star Map (the Dantooine Star Map counts as the first Star Map), complete Personal #3 AND Personal #4 at once. After all that is done, you can now level up to trigger History #4.

+
+
+

History #4

+
+

Available when you gain 1 level after History #3. Juhani apologizes for her outburst over Taris' destruction, and recalls her life on Taris. After this conversation, the global value of G_JUHANIH_STATE will be set to 4.

+

View History #4 on YouTube

+
+
+

History #5

+
+

Available when you gain 1 level after History #4. Juhani talks about how her parents and her ended up on Taris. After this conversation, the global value of G_JUHANIH_STATE will be set to 5.

+

View History #5 on YouTube

+
+
+

History #6

+
+

Available when you gain 1 level after History #5. Juhani talks about her being sold into slavery after her parents died. After this conversation, the global value of G_JUHANIH_STATE will be set to 6. This conversation will also make Juhani's personal quest, "Threat From Xor" available.

+

View History #6 on YouTube

+
+
+

"Threat From Xor" Quest

+
+

This quest will be available after you have completed History #6, where Juhani talks about her being sold into slavery. Have Juhani in your party and walk around the spaceport on Tatooine, Kashyyyk, Manaan or Korriban. A character named Xor will approach Juhani and reveal that he was the slaver who attempted to buy Juhani on Taris before the latter was freed by the Jedi. Xor leaves, but he threatens to come back later.

+

The second encounter with Xor happens when you come back just outside the Ebon Hawk by using the Rapid Transit system. Xor will ambush you and Juhani. Once you defeat Xor, you can either let him die or encourage Juhani to kill him.

+

After you have dealt with Xor, if you have completed Personal #6 (detailed below), the global value of G_JUHANIP_STATE will be set to 10.

+

View "Threat From Xor" 1uest on YouTube

+
+

BUG WARNING: There is an infamous bug with the Xor quest that once you trigger the quest, even after completing it, you will not be able to encounter any other messengers for your other party members' personal quests, and for Mika Dorin's premium shop on Korriban. The fix for this bug is included in the KOTOR 1 Community Patch and the KotOR 1 Restoration (K1R) mod.

+

If you are unable to use mods, you may want to wait until escaping the Leviathan and unlocking Mika Dorin's premium shop before encountering Xor. If you have activated the "Threat From Xor" quest and want to avoid meeting Xor, do not have Juhani in your party when you walk around the spaceport on Tatooine, Kashyyyk, Manaan or Korriban.

+
+
+

Personal Conversation Path

+
+
+

Personal #1

+
+

Available once Juhani joins your party. She apologizes again for attacking you back on Dantooine. Once you begin this conversation, if — and ONLY IF — your player character is female, the global boolean T_JUHANIROM will be set to 1, which means Juhani's romance will become active. After this conversation, the global value of G_JUHANIP_STATE will be set to 1.

+

View Personal #1 on YouTube

+
+
+

Personal #2

+
+

Available after completing Personal #1. Juhani talks about Quatra and her fall to the dark side. After this conversation, the global value of G_JUHANIP_STATE will be set to 2.

+

View Personal #2 on YouTube

+
+
+

Personal #3

+
+

Available after completing Personal #2 and getting 2 Star Maps (including the Dantooine one). Juhani expresses gratitude to you for accepting her throughout your journey. After this conversation, the global value of G_JUHANIP_STATE will be set to 3.

+

View Personal #3 on YouTube

+
+
+

Personal #4

+
+

Available once you complete History #3 and Personal #3. Juhani describes the life of being an alien on Taris is like hell. After this conversation, the global value of G_JUHANIP_STATE will be set to 4.

+

View Personal #4 on YouTube

+
+

BUG WARNING: Personal #4 is by far the trickiest to trigger of all Juhani's conversations. There is a bug that once you complete History #3, if you level up even just once, History #4 will override Personal #4, making Personal #4 unavailable, and you will be unable to get the later conversations in the Personal Conversation path (except Personal #7 below), including the final romance conversation. In fact, I found that missing out Personal #4 was the reason I was unable to get Juhani's final romance conversation in my old playthrough. This bug is fixed by the KOTOR 1 Community Patch, which is a major reason I highly recommend this mod.

+

If you are unable to install mods for some reason, I would suggest that once you complete History #3, stop leveling up your character. Once you get your second Star Map (the Dantooine Star Map counts as the first Star Map), complete Personal #3, then immediately talk to Juhani again to check if Personal #4 is available. After you successfully trigger Personal #4 and complete the conversation, you can now level up your character to proceed to History #4 and beyond.

+
+
+

Personal #5

+
+

Available when you gain 1 level after Personal #4. Juhani asks about your past. After this conversation, the global value of G_JUHANIP_STATE will be set to 6.

+

View Personal #5 on YouTube

+
+
+

Personal #6

+
+

Available after completing Personal #5 and getting 3 Star Maps (including the Dantooine one). Juhani comments on your alignment (light side, dark side or neutral). After this conversation, if you have completed the "Threat From Xor" quest, the global value of G_JUHANIP_STATE will be set to 10; if you have not, the global value of G_JUHANIP_STATE will be set to 7.

+

View Personal #6 on YouTube

+
+
+

Personal #7

+
+

Available after completing the Leviathan level. Juhani comments on the reveal that the player character is Revan. This conversation is not required to trigger Juhani's final romance conversation, but I include it here because not only it is classified as part of the Personal conversation path by the game files, but also it is a very important element in Juhani and Revan's relationship.

+

View Personal #7 on YouTube

+
+
+

Personal #8

+
+

The final conversation, which is also Juhani's love confession, in order to make this final romance conversation available, you must meet ALL the following conditions:

+
    +
  1. You have completed Personal #6 and the "Threat From Xor" quest. If you use KotOR SaveGame Editor to check your progress, the global value of G_JUHANIP_STATE must be 10.
  2. +
  3. During the confrontation with Bastila at the Rakatan temple summit on the Unknown World, you must reject Bastila's suggestion to reclaim the title of Dark Lord of the Sith and rule the galaxy, which gives you the light side ending of the game. If you choose to agree with Bastila's suggestion, you will be forced to kill Juhani (and Jolee), which ends the romance, and you will get the dark side ending of the game.
  4. +
+

Provided the above conditions have been met, the final romance conversation occurs after Bastila leaves the Rakatan temple summit. When you talk to Juhani, she will confess her feelings to you. If you have installed Kexikus' Juhani Romance Enhancement mod (see the Mod Recommendation section below for details), the conversation will be triggered automatically when you are leaving the temple summit, so you do not need to initiate the conversation yourself.

+

View the vanilla version on YouTube

+

YouTube video for vanilla version:

+
+

View the Juhani Romance Enhancement mod version version on YouTube

+
+
+

Mod Recommendations

+
+

These mods are not required to complete Juhani's romance, but they add or enhance Juhani's content.

+
    +
  • Juhani Romance Enhancement by Kexikus: Improves the final romance conversation with Juhani, including triggering the conversation automatically when you are about to leave the temple summit, instead of having to talk to Juhani yourself to initiate the conversation, provided you have met the conditions to make this conversation available (detailed in the Walkthrough section above), as well as adding a kiss between Juhani and the female player character.
  • +
  • KOTOR 1 Community Patch: Even though this bug fix mod is not specifically about Juhani, it fixes many bugs and issues related to Juhani's content, including: +
      +
    • Juhani wouldn't spawn in the post-Leviathan scene on the Ebon Hawk
    • +
    • If doing certain Juhani's conversations in the wrong order, it was possible to block any further progress in Juhani's Personal Conversation path, and prevent you from accessing Juhani's final romance conversation
    • +
    • No other messengers could appear once the "Threat From Xor" quest is started
    • +
    • The second Xor encounter was impossible to start if you first meet him and his goons without Juhani in your party
    • +
    • The second Xor encounter is unavailable on Tatooine
    • +
    • Xor is a Twi'lek, despite him being a human in the Xbox version of KotOR, and him openly making anti-alien comments (NOTE: This fix was originally done by my Human Xor Restoration mod. I have given permission to include my mod in this Community Patch)
    • +
    • Asking Juhani about the planet you were currently on was impossible due to a faulty global setting
    • +
    +
  • +
  • Juhani Dialogue Restoration by Leilukin: My mod. Restores Juhani's conversations with the player that are unused or easy to miss in vanilla KotOR, including: +
      +
    • Asking Juhani about the planet you are on
    • +
    • Asking Juhani about why she is hostile towards Canderous
    • +
    • Juhani talking about the evils on Korriban
    • +
    +
  • +
  • Human Xor Unique Look by Leilukin: My mod. Changes Xor's species from a Twi'lek to a human to fit his anti-alien nature and dialogue, with a unique appearance different from other human NPCs. This mod is listed on this guide because Xor is tied to Juhani's personal quest.
  • +
  • Party on the Leviathan! by Fair Strides: Restores Juhani's conversation, including romance conversation with a female player character, on the Leviathan, by spawning the rest of the Ebon Hawk crew on the Leviathan after you are rescued.
  • +
+

NOTE: I DO NOT support any mods that make Juhani a romance option for male characters under any circumstances. Read my article on why I firmly believe Juhani's romance should remain exclusive to female characters. In addition, I DO NOT endorse any mods that make Juhani look like a human.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/guides/kotor-redeeming-bastila-guide/index.html b/shrines/starwarskotor/guides/kotor-redeeming-bastila-guide/index.html new file mode 100644 index 00000000..55c880dd --- /dev/null +++ b/shrines/starwarskotor/guides/kotor-redeeming-bastila-guide/index.html @@ -0,0 +1,633 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Redeeming Bastila Guide | Guides | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

Redeeming Bastila Guide

+ + + + +
+ + + + + + + + + +
+

[This guide is also available on Google Docs]

+
+

Introduction

+
+

In Star Wars: Knights of the Old Republic, towards the end of the game you will be provided the opportunity to determine which ending you will get, and there will be consequences of your choice there.

+

Specifically, on the Rakatan temple summit at the Unknown World, you will meet Basila, who at that point has fallen to the dark side. After some dialogue and you fought Bastila, Bastila will suggest you to reclaim the title of the Dark Lord of the Sith and rule the galaxy. If you choose to agree with Bastila's suggestion, you will get the dark side ending, with a lot of dark side points. However, if you choose to reject Bastila's suggestion, you will get the light side ending, with a lot of light side points.

+

If you choose the light side ending, you will face the fallen Bastila again in the Star Forge. Depending on your dialogue choices, you will either successfully convince Bastila to return to the light side, or you kill her if you fail to do so.

+

This guide will provide in-depth details on how the mechanics of redeeming Bastila on the Star Forge works, and which dialogue options will give you a better chance in successfully redeeming Bastila.

+

For this guide, I have used KotOR Tool, DLGEditor and DeNCS to investigate the relevant dialogue file and scripts.

+
+

The Mechanics of Redeeming Bastila

+
+

The game uses a point system to determine if you will succeed in redeeming Bastila based on the amount of points you earn throughout the conversations when you face Bastila on the Star Forge. Some dialogue options will earn you points to increase your chance in redeeming Bastila.

+

In general, to successfully convince Bastila to return to the light side, you need to choose dialogue options that say you believe that Bastila still has the light side in her, that she can be saved, tell her about the dangers of the dark side or remind her about the Jedi's teaching, and choose these options as much as possible.

+

In the final part of Bastila's dialogue, when Bastila says she is beyond saving, do not agree with her because it will make you kill her.

+

There will be [Persuade] options in the final part of Bastila's dialogue. While it is possible to save Bastila without choosing the [Persuade] options as long as you choose the right dialogue options, if you invest skill points in Persuade and pass the Persuade check, it would also be easier to save Bastila. If you want to learn more about the Persuade mechanic in KotOR, you can check out StretegyWiki's page about Skills in KotOR.

+

An active romance with Bastila will make it easier to save Bastila. Although in vanilla KotOR, only a male player character can romance Bastila, this mechanic also works for a female PC who romances Bastila with mods like JC's Romance Enhancement: Biromantic Bastila. That said, it is still possible to redeem Bastila even if you do not romance her.

+
+

Dialogue Walkthrough

+
+

There are 4 phases in your conversation with Bastila in the Star Forge, as each phase will end with you and Bastila fight, and Bastila will initiate new dialogue each time you defeat her. There are dialogue options in each phase that will increase your points in your chance to save Bastila.

+

Below is a full walkthrough of the dialogue options that will maximize your points to successfully redeem Bastila.

+
+

Phase 1

+
+

Once you find Bastila in the Star Forge, Bastila will start the conversation by saying, "Revan - I knew you'd come for me." When you are provided with dialogue options:

+
    +
  • Choose the "I'll never give up on you, Bastila. I know you can still be saved." option to gain 2 points.
  • +
+

Regardless of your dialogue choice here, you and Bastila will fight.

+
+

Phase 2

+
+

After you defeat Bastila for the first time, Bastila will initiate conversation again by saying, "I see now why Malak followed you...". After Bastila says, "You were a fool to give it all up and follow the light side.":

+
    +
  • Choose either "I am as strong in the light as I ever was following the dark side." or "You've been consumed by the dark side, Bastila. Can't you see it's destroying you?" to gain 1 point.
  • +
+

If you choose either of the above options, Bastila will argue. When she says "Eventually there will be no limit to what I can accomplish with the Force!":

+
    +
  • Choose "You will accomplish death and destruction with the dark side, nothing else." to gain 1 point. If you choose this option or "Malak will never let you become that powerful. He will kill you first." (Note: this option does not give you any points), Bastila will argue again, choose "You're dooming yourself to an endless cycle of death and betrayal." to gain 1 point.
  • +
+

You and Bastila will fight again.

+
+

Phase 3

+
+

After you defeat Bastila for the second time, Bastila will say, "You are growing weary, I can sense it!" After she says "... Soon this will all be over!":

+
    +
  • Choose "Your emotions get the better of you, Bastila. Remember the Jedi code." to gain 1 point.
  • +
  • Alternately, choose "Then strike me down, Bastila. I won't defend myself." to gain 2 points. Any of the dialogue options following this will gain another 2 points. Specifically: +
      +
    • "Remember what you once were, Bastila. A Jedi would never strike down a defenseless opponent."
    • +
    • "You are not evil, Bastila. You will not strike down a defenseless opponent."
    • +
    • If you romance Bastila, you have an additional option: "We meant something to each other, once. I don't believe you will strike me down."
    • +
    +
  • +
+

You and Bastila will fight again.

+
+

Phase 4

+
+

After you defeat Bastila for the last time, and Bastila questions, "Why can't I defeat you?":

+
    +
  • Choose "Now you see the dark side is not stronger than the light." to gain 1 point.
  • +
+

Later when Bastila says "End my life quickly. There is no other way.", choose "I could never kill you, Bastila." if you romance her, or "There's no need for me to kill you, Bastila." if you do not.

+

After Bastila says "You cannot let me live", choose "You can reject the dark side, Bastila. Return to the light." to gain 2 points.

+

When Bastila says, "I can no longer find peace in the Force":

+
    +
  • +

    Choose the [Persuade] option. The [Persuade] options are different depending on if you romance Bastila or not.

    +
      +
    • If romanced, choose "[Persuade] Use our bond, then. Take your strength from me." Succeeding in this persuasion option requires an Easy Persuade check. If you pass the check, you will gain 2 points. Later, choose "[Persuade] I love you, Bastila. I can't abandon you, ever." Again, succeeding in this persuasion option requires an Easy Persuade check. If you pass the check, you will gain 5 points.
    • +
    • If not romanced, choose "[Persuade] Turn to the Jedi code, Bastila. It can help you." This requires a Medium Persuade check. If you pass the check, you will gain 2 points. Later, choose "[Persuade] Look into your heart, Bastila, and you will find the light." Again, succeeding in this persuasion option requires a Medium Persuade check. If you pass the check, you will gain 3 points.
    • +
    +
  • +
  • +

    Alternately, if you are worried that you may fail the [Persuade] check, you can choose "I was redeemed, Bastila. You can be, too." to add 1 point. When Bastila responses with "I was supposed to protect you from the dark side", choose "You can't protect someone from the dark side. Each individual must choose their own path." to add 1 point, or if you romance her, choose "You did more than protect me, Bastila." to gain 1 point. Note that these dialogue options were also available after you choose the [Persuade] options, so if you want to gain the maximum amount of points, you may choose all these options.

    +
  • +
+

If you want to redeem Bastila, eventually you need to choose "Help us defeat the Sith, Bastila. This will atone for what you have done." and then "I trust you enough to leave myself open to your attack, Bastila.".

+

If you have gained at least 10 points in total, Bastila will respond with "You are brave... and some would say foolish. But you are also right. The dark side has not wholly consumed me. I cannot raise my blade against you." If Bastila says this to you, congratulations! You have saved her!

+

From this point, regardless of your dialogue option, Bastila will stay behind and use her Battle Meditation to help the Republic, while you go to face Darth Malak alone.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/guides/kotor-sandral-matale-feud-guide/index.html b/shrines/starwarskotor/guides/kotor-sandral-matale-feud-guide/index.html new file mode 100644 index 00000000..8cc3689e --- /dev/null +++ b/shrines/starwarskotor/guides/kotor-sandral-matale-feud-guide/index.html @@ -0,0 +1,596 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sandral-Matale Feud Ending Guide | Guides | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

Sandral-Matale Feud Ending Guide

+ + + + +
+ + + + + + + + + +
+

[This guide is also available on Google Docs]

+
+

Introduction

+
+

This guide is requested by Deadly Stream user Sith Holocron.

+

In Star Wars: Knights of the Old Republic, there is a side quest on Dantooine named "Sandral-Matale Feud", which you receive after you have dealt with Juhani at the grove and met the Jedi Council.

+

This quest line revolves around a family feud between the Sandrals and the Matales, mainly between their patriarchs, Nurik Sandral and Ahlan Matale. As you progress the quest line, you will discover that Nurik's daughter, Rahasia and Ahlan's son, Shen are romantically involved. The quest line will lead to a heated confrontation between Nurik and Ahlan, and there are multiple ways to resolve the quest line.

+

This guide will provide details on the different ways to resolve the Sandral-Matele feud, and how to achieve those endings.

+
+

Sandral-Matale Feud Resolution Walkthrough

+
+

After you rescue Shen and meet Rahasia outside the Sandral estate, you will be confronted by Ahlan Matale and Nurik Sandral, Shen and Rahasia's fathers respectively.

+

After Ahlan yells at Nurik, "I don't want to hear any of your excuses! Now I will get revenge for your transgressions!" Your following dialogue choices will determine the outcome of the "Sandral-Matale Feud" quest. I recommend saving the game before rescuing Shen and meeting Rahasia outside the Sandral estate, so you can reload the save if you do not get the ending you want.

+

The "Sandral-Matale Feud" quest could be resolved in four different ways:

+
+

1. Convincing Ahlan and Nurik to sort out their differences and allow their children to stay together as a couple.

+
+

If you want to do a Light Side playthrough, this would be the best outcome. However, you need to pass a Hard difficulty Persuasion check to get this ending. If you want to learn more about the Persuade mechanic in KotOR, you can check out StretegyWiki's page about Skills in KotOR. Since you will likely be at level 10 when you do this quest, you need at least 10 points in your Persuade skill to have a decent chance to pass the check.

+

As for the dialogue choices, after Ahlan rants about him getting revenge, you need to choose "You two just need to calm down."

+

When Nurik calls Ahlan "Matale dog";, choose either "Both of you need to calm down." or "You should try to sort this out together."

+

Now you will be given [Persuade] options. When presented the option, choose "[Persuade] Shen is capable of making decisions on his own." After you pass a Hard difficulty Persuasion check, choose another Persuade option "[Persuade] Children grow up and leave eventually." when you are given the opportunity. If you have successfully passed the previous Persuade check, you should have no problem passing this check.

+

Once you have succeeded in these [Persuade] options, congratulations! You manage to set the feud between the Sandrals and the Matales peacefully. Your dialogue choices immediately following this do not matter. You will be rewarded with Light Side points.

+
+

2. Shen and Rahasia run off together, while the feud between their fathers remains.

+
+

To get this second Light Side ending, after Ahlan rants about him getting revenge:

+
    +
  • Choose "You two just need to calm down." When Nurik calls Ahlan "Matale dog", choose "Why don't you try listening to your children?"
  • +
  • Alternately, choose "Don't make me intervene in this.". When Ahlan says, "This will be resolved very shortly", your dialogue choice here does not matter. Later, when Rahasia tells her father she wants to with Shen forever, choose "You two should stay together no matter what."
  • +
+

Shen and Rahasia will run off together, and you will find them in the Jedi Enclave, while Ahlan and Nurik will remain angry at each other. You will be rewarded with Light Side points.

+

You would also get this outcome if you fail the Persuade check when you choose the [Persuade] option.

+
+

3. Breaking up Shen and Rahasia.

+
+

To get this ending, after Ahlan rants about him getting revenge:

+
    +
  • Choose "Don't make me intervene in this." When Ahlan says, "This will be resolved very shortly." your dialogue choice here does not matter. Later, when Rahasia tells her father she wants to with Shen forever, choose either "I don't know if you can trust Rahasia, Shen." or "You may want to reconsider this." When Nurik yells "Get away from my daughter Matale!", choose "Turn away, Shen." Your dialogue choices following this do not matter.
  • +
  • Alternately, if you want to get Dark Side points from this outcome, choose "Why don't you just shoot each other and get it over with." When Ahlan says he wants Nurik "dead and rotting in the ground", choose "If you fight, you'll all be killed." and then choose "[Lie] Rahasia doesn't love you anyway." You need to pass a Medium difficulty Persuasion check for this [Lie] option to succeed.
  • +
+

Shen breaks up with Rahasia, and the two return to their own fathers.

+
+

4. Making the Sandrals and the Matales kill each other, result in the death of the fathers and the children.

+
+

To get this Dark Side ending, after Ahlan rants about him getting revenge, choose "Why don't you just shoot each other and get it over with." When Ahlan says he wants Nurik "dead and rotting in the ground", choose "The only way either of you will end this is with blood." When Ahlan yells about how can Shen disrespects his (Ahlan's) wishes, choose "[Lie] You know, Nurik, Ahlan actually did kill Casus." Interestingly, you do not need any Persuade skills to make this [Lie] option succeed.

+

After Nurik kills Shen, choose either "Are you going to let that one pass?" or "Wipe them all out." for more Dark Side points. After the fathers and their children are dead, you will fight the fathers' droids.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/index.html b/shrines/starwarskotor/index.html new file mode 100644 index 00000000..5fc12542 --- /dev/null +++ b/shrines/starwarskotor/index.html @@ -0,0 +1,546 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Star Wars: Knights of the Old Republic Shrine | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + +

Star Wars: Knights of the Old Republic Shrine

+ + + +

Leilukin's shrine for Star Wars: Knights of the Old Republic series.

+ + +
+ + + + + + + + + +
+
+

Welcome to My Star Wars: Knights of the Old Republic Shrine!

+
+

Cover art compilation of Star Wars: Knights of the Old Republic series

+

Star Wars: Knights of the Old Republic (KotOR) is a space opera role-playing video game series. The series takes place in the fictional universe of Star Wars, with the story taking place approximately 4,000 years before the rise of the Galactic Empire.

+

The first title was developed by BioWare while the second (Star Wars: Knights of the Old Republic II: The Sith Lords) was done by Obsidian Entertainmenr. Both games were published by LucasArts. The KotOR series also includes a subsequent new comic book series. Both comic series were published by Dark Horse Comics and act as prequels to the video games.

+

To learn more about the Star Wars: Knights of the Old Republic series, you can check out the KotOR Community Portal.

+
+

My History with the KotOR Series

+
+

I had been a Star Wars fan since I was 13 in 2005 after watching Revenge of the Sith in cinema. However, I was not aware of the existence of the Knights of the Old Republic video game series until around 2010, after seeing other Star Wars fans on Baidu Tieba talked about those games. I started playing the first KotOR game in early 2011, immediately followed by KotOR 2, and the series has been one of my special interests ever since.

+

I was hooked immediately to the KotOR series when I played them. The first KotOR game was the first Western RPG I had played. I was drawn to the games' story and characters and the games' focus on them, since the KotOR series was also the most story-heavy games I played at the time. KotOR was also the first video game I played where you can pursue a romance with a character, which was a concept that blew my young mind at the time, because before KotOR, I thought a romance between your player character and an NPC you like could only exist in imagination via shipping or fanfiction.

+

My investment in the KotOR series has evolved over time, leading to me learning to mod the games and become a modder.

+
+
+

My History with KotOR Modding

+
+

I began to use and get interested in KotOR mods since the mid-2010s, in no small part thanks to The Sith Lords Restored Content Mod (TSLRCM), which is widely regarded as an essential mod for the best experience with KotOR 2, as the game's rushed development led to many contents being cut from the game. This led me to discover more KotOR mods hosted on Deadly Stream, which include the developers of TSLRCM, and GameFront.

+

In the mid-2010s, the KotOR fan circle I was involved in on Tumblr also included modders, who inspired me to learn to create mods myself. I did not have any programming exprience when I started learning modding KotOR, so it took practice to learn and understand the modding tutorials on Deadly Stream and the now-defunct LucasForums (R.I.P.).

+

The very first KotOR mod I created was TSL Improved Party Outfits in 2015, though initially I only meant it for personal use, until I released it to the public on 4 February 2017. The first KotOR mod I released to the public was Visas Marr and Female Exile Romance on 15 December 2016.

+

Making same-gender romance mods for KotOR 2 was the primary motivation for me to make and release KotOR mods myself. I was immensely frustrated by the total lack of same-gender romance mods for any of the KotOR 2 characters, and every other LGBTQ+ KotOR fans I have interacted with on Tumblr share the same sentiment. Therefore, I decided to stop waiting for KotOR 2 same-gender romance mods to happen, and be the change myself. To my great satisfication, my same-gender romance mods have been well-received, with fellow LGBTQ+ players expressing gratitude for their existence. My Handmaiden and Female Exile - Disciple and Male Exile Romance mod would go on to win the Mod of the Year 2017 award on Deadly Stream.

+

I love modding the KotOR games, not only because the games are a special interest of mine, but also I love creating things for my interests. Modifying the games made me feel like I have the power to change the game to make them better and more enjoyable, and thus improve my experience with playing the games.

+

You can check out all the KotOR mods I have created, including KotOR 1 mods and KotOR 2 mods, on my main site's Projects pages.

+
+ + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/resources/index.html b/shrines/starwarskotor/resources/index.html new file mode 100644 index 00000000..4d1df5e1 --- /dev/null +++ b/shrines/starwarskotor/resources/index.html @@ -0,0 +1,568 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Resources | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + +

Star Wars: Knights of the Old Republic Resources

+ + + +

List of Star Wars: Knights of the Old Republic resources I have created or compiled myself..

+ + +
+ + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/resources/kotor-same-gender-romance-mods/index.html b/shrines/starwarskotor/resources/kotor-same-gender-romance-mods/index.html new file mode 100644 index 00000000..cfeb2abe --- /dev/null +++ b/shrines/starwarskotor/resources/kotor-same-gender-romance-mods/index.html @@ -0,0 +1,784 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of Same-Gender Romance Mods for Star Wars: Knights of the Old Republic Series | Resources | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

List of Same-Gender Romance Mods for Star Wars: Knights of the Old Republic Series

+ + + +

Throughout the years, modders have created same-gender romance mods for the Knights of the Old Republic series. Want to make your KotOR games more gay? This list is for you!

+ + +
+ + + + + + + + + +
+

[This list is also available on Google Docs]

+

The first Star Wars: Knights of the Old Republic video game introduced Juhani, the very first confirmed gay character in any Star Wars media, including Legends, the old Star Wars Expanded Universe, and the very first canon same-gender romance option in any BioWare game. However, the KotOR series at large has little LGBTQ+ content, and except for Juhani, none of the romance options in both KotOR games are available for same-gender romances.

+

Therefore, throughout the years, modders of the KotOR games have created various mods adding more same-gender romance options and content to the games to fill the void.

+

Below is a list of all the same-gender romance mods that had been created for the KotOR game series throughout KotOR's modding history, sorted by their Initial Releases in chronological order.

+

Wanting to make your KotOR games more gay? Then this list is for you! This list also serves as an archive to document the history of same-gender romance mods for the KotOR series. Happy gayming!

+

NOTE: Some listed mods below have overlapping concepts and thus are not compatible with each other. Mods that are hosted exclusively on Gamefront are very old mods that were made in the 2000s, and thus may have compatibility issues with newer mods (not just ones that listed here).

+

Warning: this list contains spoilers for both KotOR games.

+
+

For Knights of the Old Republic I

+
+
+

Bastila & Female Revan (Untold Love Story)

+
+
+
Mod Author
+
Master Kavar
+
Initial Release
+
25 November 2006
+
Download
+
Gamefront
+
Description
+
Allows female Revan to romance Bastila. In addition, this mod also allows female Revan to flirt with certain female NPCs, most notably Yuthura Ban.
+
+
+

The Romancing of Bastila

+
+
+
Mod Author
+
Darth Shan & Swfan28
+
Initial Release
+
10 March 2009
+
Download
+
Gamefront
+
Description
+
Compiles several Bastila content mods into one mod. Regarding Bastila’s romance, in addition to allowing female Revan to romance Bastila, this mod also includes bug fixes and a kissing scene between Bastila and female Revan.
+
Installation Note
+
If you want to use this mod with Bastila & Female Revan (Untold Love Story), you must install this mod AFTER Untold Love Story, and override the k_hbas_dialog.dlg file when prompted.
+
+
+

Party on the Leviathan!

+
+
+
Mod Author
+
Fair Strides
+
Initial Release
+
2 July 2015
+
Download
+
Deadly Stream
+
Description
+
Restores Juhani’s conversation, including romance conversation with a female player character, on the Leviathan, by spawning the rest of the Ebon Hawk crew on the Leviathan after you are rescued.
+
+
+

Bi Carth

+
+
+
Mod Author
+
forgetcanon
+
Initial Release
+
20 July 2015
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
Allows Male Revan to romance Carth and flirt with certain male NPCs.
+
+
+

Juhani Romance Enhancement

+
+
+
Mod Author
+
Kexikus
+
Initial Release
+
4 January 2016
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
Improves the final romance conversation with Juhani, including triggering the conversation automatically, provided the conditions for this conversation are met, as well as adding a kiss between Juhani and female Revan.
+
Note
+
For details on how to successfully complete Juhani’s romance, please check out my Juhani Romance Guide.
+
+
+

JC’s Romance Enhancement: Biromantic Bastila for K1

+
+
+
Mod Author
+
JCarter426
+
Initial Release
+
19 January 2020
+
Download
+
Deadly Stream
+
Description
+
Another mod that allows female Revan to romance Bastila, but what makes this mod different is that it also further edits Bastila’s dialogue so Bastila would not refer to female Revan as a man. This mod also fixes the bugs with Bastila’s romance during the endgame.
+
+
+

JC's Romance Enhancement: Pan-Galactic Flirting for K1

+
+
+
Mod Author
+
JCarter426
+
Initial Release
+
6 July 2022
+
Download
+
Deadly Stream
+
Description
+
Allows the player to flirt with several NPCs regardless of gender.
+
Note
+
This mod is essentially a modern and improved version of Bastila & Female Revan (Untold Love Story). What makes JCarter426’s mod better is the fact that this mod uses an installer tool (TSLPatcher) to patch relevant dialogue files to improve compatibility with other mods, compared to Untold Love Story's installation method of putting dialogue files into the Override folder, which increases the chance of causing conflict with other mods.
+
+
+

Carth Onasi and Male PC Romance

+
+
+
Mod Author
+
Leilukin (me)
+
Initial Release
+
6 August 2022
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
Inspired by the aforementioned Bi Carth mod, this is my version of a male Revan and Carth romance mod. The biggest differences between my version and forgetcanon’s are that my mod is installed by patching relevant dialogue files, instead of putting modified dialogue files in the Override folder, and I have also edited Carth’s dialogue and spliced audio files to prevent Carth from referring to male Revan as a woman.
+
+
+

For Knights of the Old Republic II: The Sith Lords

+
+
+

Worthy of Note

+
+

Stoffe’s Handmaiden Choice for Females mod (originally released on 23 April 2005), which was the first mod ever made that allowed female Exiles to recruit Handmaiden as a party member, could technically be considered a same-gender romance mod, due to the fact that with this mod, female Exiles would also be able to romance Handmaiden by having her as a party member.

+

In addition, since Handmaiden replaces Disciple’s place on the Ebon Hawk crew in this mod, this mod also allows female Exiles to get the Visas romance scene after the Rebuilt Jedi Enclave sequence.

+

That being said, these are all side effects of Handmaiden being exclusive to male Exiles in the vanilla game. Handmaiden Choice for Females was not intentionally made with same-gender romances in mind.

+

Hassat Hunter had remade the mod into Handmaiden 4 Females - Disciple for Males (originally released on 14 March 2014) to be compatible with The Sith Lords Restored Content Mod (TSLRCM). However, the mod is outdated and no longer supported.

+
+

Alternate Revan Romances

+
+
+
Mod Author
+
felixfelicitas
+
Initial Release
+
9 March 2015
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
Allows players to set Revan’s love interest(s), instead of letting the game assume male Revan is romantically involved with Bastila, while female Revan is romantically involved with Carth. Most notably, with this mod, Bastila can be chosen as female Revan’s love interest, and Carth can be chosen as male Revan’s love interest.
+
Required Mod
+
The Sith Lords Restored Content Mod (TSLRCM)
+
+

WARNING: This mod is outdated, and it has game-breaking bugs. Use my REDUX version of the mod below instead. I am listing the original mod here for historical record purpose.

+
+

Visas Marr and Female Exile Romance

+
+
+
Mod Author
+
Leilukin (me)
+
Initial Release
+
15 December 2016
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
Makes the Visas romance scene, which occurs near the endgame, available for the Exile regardless of gender.
+
+
+

Atton Rand and Male Exile Romance

+
+
+
Mod Author
+
Leilukin (me)
+
Initial Release
+
27 December 2016
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
Makes Atton flirt with and express romantic interest in a male Exile.
+
Required Mod
+
The Sith Lords Restored Content Mod (TSLRCM)
+
+
+

Handmaiden and Female Exile - Disciple and Male Exile Romance

+
+
+
Mod Author
+
Leilukin (me)
+
Initial Release
+
2 January 2017
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
In addition to allowing Handmaiden to join a female Exile’s party and allowing Disciple to join a male Exile’s party, this mod also makes Handmaiden a romance option for a female Exile, and Disciple for a male Exile. It is worth noting that by allowing Handmaiden to join a female Exile, this mod also enables romantic subtext between Atris and the female Exile.
+
Required Mod
+
The Sith Lords Restored Content Mod (TSLRCM)
+
+
+

Darth Sion and Male Exile Mod

+
+
+
Mod Author
+
Leilukin (me)
+
Initial Release
+
12 January 2017
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
Makes Darth Sion displays romantic attachment (in his own way) to a male Exile.
+
Required Mod
+
The Sith Lords Restored Content Mod (TSLRCM)
+
+
+

Alternate Revan Romances REDUX

+
+
+
Mod Author
+
Leilukin (me), original mod made by felixfelicitas
+
Initial Release
+
26 January 2017
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
My updated version of the Alternate Revan Romances mod, released with felixfelicitas’ permission. My mod fixes many bugs with the original version.
+
Required Mod
+
The Sith Lords Restored Content Mod (TSLRCM)
+
+
+

Dahnis Flirt Option for Female PC

+
+
+
Mod Author
+
Leilukin (me)
+
Initial Release
+
10 November 2018
+
Download
+
Deadly Stream and Nexus Mods
+
Description
+
Makes Dahnis, a minor NPC and one of the Pazaak players on Nar Shaddaa, flirt with the player.
+
+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/resources/kotor2-female-exile-recruit-handmaiden-mods/index.html b/shrines/starwarskotor/resources/kotor2-female-exile-recruit-handmaiden-mods/index.html new file mode 100644 index 00000000..6c4ea199 --- /dev/null +++ b/shrines/starwarskotor/resources/kotor2-female-exile-recruit-handmaiden-mods/index.html @@ -0,0 +1,568 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + List of Star Wars: Knights of the Old Republic II Mods that Allow Female Exiles to Recruit the Handmaiden as a Party Member | Resources | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

List of Star Wars: Knights of the Old Republic II Mods that Allow Female Exiles to Recruit the Handmaiden as a Party Member

+ + + +

Disappointed that female Jedi Exiles cannot recruit the Handmaiden as a party member? Good news! That is what these mods are for!

+ + +
+ + + + + + + + + +
+

One of the flaws of Star Wars: Knights of the Old Republic II: The Sith Lords (KotOR 2) I believe everyone, regardless of how much you like the game (or not), will agree on, is that the Handmaiden, real name Brianna, will only join your party if you play as a male Jedi Exile. The idea of a potential party member only joins you based on your player character's gender already makes little to no sense to begin with, and it does not help that Star Wars Legends, the old Star Wars Expanded Universe, established that both Brianna the Handmaiden and Mical the Disciple join the female Exile's crew.

+

However, the good news is, there are actually mods that allow female Exiles to recruit Brianna the Handmaiden as a party member. Unfortunately, despite the fact that such mods have already existed since the 2000s, there are still KotOR 2 fans who do not know the existence of such mods, which is why I am making this list. Brianna is an amazing character with an interesting story, so I highly recommend you to have at least one playthrough with Brianna as your companion regardless of your Exile’s gender.

+

These are the mods that allow female Exiles to recruit Brianna the Handmaiden as a party member:

+
+

Handmaiden Choice for Females by Stoffe

+
+

Released on 23 April 2005, Stoffe's Handmaiden Choice for Females was the very first mod that gives female Exiles the option to recruit the Handmaiden. However, it is not compatible with The Sith Lords Restored Content Mod (TSLRCM), as it was created and released years before TSLRCM. In addition, even with this mod, Handmaiden still refers to a female Exile with “he/him” pronouns, which some people (myself included) would find very immersion-breaking

+
+

Handmaiden 4 Females - Disciple 4 Males by Hassat Hunter

+
+

Released on 14 March 2014, Hassat Hunter made Handmaiden 4 Females - Disciple 4 Males based on Stoffe's Handmaiden Choice for Females, so the mod would be compatible with The Sith Lords Restored Content Mod (TSLRCM). However, this version retains the flaw of Handmaiden still referring to a female Exile with “he/him” pronouns. Additioally, the mod is outdated and no longer supported.

+
+

PartySwap by DarthTyren

+
+

Released on 21 May 2015, DarthTyren's PartySwap fixes any potential gender and pronouns mix-up by adding gender checks to dialogues that references the Exile’s gender.

+

This in turn, however, also prevents female Exiles from getting any dialogue that references any potential romantic feelings between the female Exile and the Handmaiden or Atris (similarly, if you play as a male Exile, you will not get any dialogue that references any potential romance between you and the Disciple). Therefore, if you also want to romance the Handmaiden as a female Exile (or romance the Disciple as a male Exile), I would recommend checking out the below mod as well.

+

(Note that tarting from 11 July 2023, I had taken over the development of PartySwap due to DarthTyren's departure from the KotOR modding scene)

+
+

Handmaiden and Female Exile - Disciple and Male Exile Romance by Leilukin

+
+

My mod, released on 2 January 2017 and can be downloaded form both Deadly Stream and Nexus Mods. As the mod name suggests, this mod allows you to recruit and romance the Handmaiden as a female Exile, ditto for the Disciple as a male Exile. My mod also requires The Sith Lords Restored Content Mod (TSLRCM) to work.

+

My mod fixes any potential gender/pronouns mix-up by editing dialogue and splicing audio, so users of my mod can fully enjoy the Handmaiden and the Disciple's romance content without worrying about their Exile getting misgendered.

+

The default installation option of my mod will make the Handmaiden automatically joins a female Exile, and the Disciple automatically joins a male Exile. That said, my mod also provides an installation option to make my mod compatible with DarthTyren's PartySwap mod.

+
+

Final Note

+
+

It is very important to note when it comes to installing mods for KotOR 2, I do NOT recommend using the Steam Workshop, including the Steam Workshop version of The Sith Lords Restored Contente Mod. because frankly, the Steam Workshop is a mod compatibility nightmare for games like KotOR 2. I recommend reading this post: Why NOT to Use the Steam Workshop.

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/resources/tslrcm-m478ep-modules-music/index.html b/shrines/starwarskotor/resources/tslrcm-m478ep-modules-music/index.html new file mode 100644 index 00000000..fe374629 --- /dev/null +++ b/shrines/starwarskotor/resources/tslrcm-m478ep-modules-music/index.html @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The Sith Lords Restored Content Mod + M4-78 Enhancement Project Modules, Warp Codes & Music Overview | Resources | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + + + +

The Sith Lords Restored Content Mod + M4-78 Enhancement Project Modules, Warp Codes & Music Overview

+ + + +

A list of all the modules and their music used by The Sith Lords Restored Content Mod and the M4-78 Enhancement Project, including codes for the warp cheat.

+ + +
+ + + + + + +
+

[Originally posted on Deadly Stream forums]

+

In 2017, modder Kexikus created a spreadsheet to list all of The first Star Wars: Knights of the Old Republic game's modules and their corresponding Day, Night and Battle music. Sith Holocron, who is also a modder, requested a Star Wars: Knights of the Old Republic II: The Sith Lords version of such list, though none of the sort has been made, so I decided to volunteer the task myself.

+

Here you go:

+

The Sith Lords Restored Content Mod (TSLRCM) + M4-78 Enhancement Project (M4-78EP) modules and music overview spreadsheet

+

This spreadsheet covers all the modules from both TSLRCM and M4-78EP. Like in KotOR 1, the module codes can be used for the warp cheat code (for example, warp 003EBO).

+

All music tracks are listed with their number corresponding to their row in ambientmusic.2da, their file name (the music files can be found in the StreamMusic folder) and their track title as identified with their TLK (dialog.tlk) StrRef. I have also included previews of the music by linking to YouTube in the spreadsheet.

+

Hope you will find this spreadsheet helpful. Enjoy!

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/shrines/starwarskotor/universes/index.html b/shrines/starwarskotor/universes/index.html new file mode 100644 index 00000000..1066ed0c --- /dev/null +++ b/shrines/starwarskotor/universes/index.html @@ -0,0 +1,576 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Universes | Star Wars: Knights of the Old Republic Shrine | Leilukin's Hub + + + + + +
+ +
+ + + + anner of Star Wars: Knights of the Old Republic Shrine + + +
+
+ + + + +
+
+ + +

Leilukin's Star Wars: Knights of the Old Republic Universes

+ + + +

My universes and headcanons for Star Wars: Knights of the Old Republic series.

+ + +
+ + + + + + + + + +
+
+

My KotOR Timeline

+
+

This is my timeline for the events of the KotOR series, including the age of the major characters.

+

View Leilukin's KotOR Timeline here

+
+

Main Universe

+
+

My main KotOR universe.

+
+

Revan

+
+

Screenshot of Jiaxuan Cheng, the Revan for my main KotOR universe

+
+
Name
+
Jiaxuan Cheng 程嘉萱
+
Class
+
Scout + Jedi Sentinel
+
Alignment
+
Light Side
+
Pronouns
+
She/Her or They/Them
+
Gender
+
Non-binary woman
+
Species
+
Human
+
Orientation
+
Lesbian
+
Romance
+
Juhani and Bastila (polyamorous triad)
+
+
+

Jedi Exile

+
+

Screenshot of Yunhua Yang, the Jedi Exile for my main KotOR universe

+
+
Name
+
Yunhua Yang 杨韵华
+
Class
+
Jedi Sentinel + Jedi Weapon Master
+
Alignment
+
Light Side
+
Pronouns
+
She/Her or They/Them
+
Gender
+
Non-binary woman
+
Species
+
Human
+
Orientation
+
Lesbian
+
Romance
+
Visas Marr
+
+ + + +
+ + + + +
+
+ + + + \ No newline at end of file diff --git a/sitemap/index.html b/sitemap/index.html new file mode 100644 index 00000000..e77a4311 --- /dev/null +++ b/sitemap/index.html @@ -0,0 +1,535 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Site Map | Leilukin's Hub + + + + +
+ +
+ + Banner of Leilukin's Hub + +
+
+ + + + +
+
+ + +

Site Map

+ + + +

Site map of Leilukin's Hub.

+ + +
+ + + + + + +
+ +

Navigation for browsing Leilukin's Hub.

+ +

Subsites

+ + +

Main Site

+ + + +
+ + + + +
+
+ + + + \ No newline at end of file