stuf
parent
43294614b5
commit
2aabdcae7a
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"tabWidth": 4,
|
||||||
|
"useTabs": false,
|
||||||
|
"plugins": ["./node_modules/prettier-plugin-astro"],
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": "*.astro",
|
||||||
|
"options": {
|
||||||
|
"parser": "astro"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"prettier.documentSelectors": ["**/*.astro"],
|
||||||
|
"[astro]": {
|
||||||
|
"editor.tabSize": 4,
|
||||||
|
"editor.insertSpaces": true,
|
||||||
|
"editor.detectIndentation": false,
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[json]": {
|
||||||
|
"editor.tabSize": 4,
|
||||||
|
"editor.insertSpaces": true,
|
||||||
|
"editor.detectIndentation": false,
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[typescript]": {
|
||||||
|
"editor.tabSize": 4,
|
||||||
|
"editor.insertSpaces": true,
|
||||||
|
"editor.detectIndentation": false,
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
},
|
||||||
|
"[javascript]": {
|
||||||
|
"editor.tabSize": 4,
|
||||||
|
"editor.insertSpaces": true,
|
||||||
|
"editor.detectIndentation": false,
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
No person should have to see this code. Turn away while you still can.\
|
No person should have to see this code. Turn away while you still can.\
|
||||||
\
|
\
|
||||||
\
|
\
|
||||||
https://www.ruthenic.com
|
https://www.ruthenic.com
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,20 +1,21 @@
|
|||||||
{
|
{
|
||||||
"name": "ruthenic.com",
|
"name": "ruthenic.com",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "astro dev",
|
"dev": "astro dev",
|
||||||
"build": "astro build",
|
"build": "astro build",
|
||||||
"preview": "astro preview"
|
"preview": "astro preview",
|
||||||
},
|
"format": "prettier -w --plugin-search-dir=. ."
|
||||||
"devDependencies": {
|
},
|
||||||
"@astrojs/rss": "^0.2.2",
|
"devDependencies": {
|
||||||
"@astrojs/sitemap": "^1.0.0",
|
"@astrojs/mdx": "^0.17.0",
|
||||||
"astro": "^1.6.1",
|
"@astrojs/rss": "^2.1.1",
|
||||||
"astro-robots-txt": "^0.3.10",
|
"@astrojs/sitemap": "^1.0.1",
|
||||||
"sass": "^1.55.0"
|
"astro": "^2.0.14",
|
||||||
},
|
"astro-robots-txt": "^0.4.0",
|
||||||
"dependencies": {
|
"prettier": "^2.8.4",
|
||||||
"@astrojs/mdx": "^0.11.5"
|
"prettier-plugin-astro": "^0.8.0",
|
||||||
}
|
"sass": "^1.58.3"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,12 +1,21 @@
|
|||||||
---
|
---
|
||||||
import Spoiler from "./Spoiler.astro"
|
import Spoiler from "./Spoiler.astro";
|
||||||
const { spoiler, img, alt, source } = Astro.props
|
|
||||||
|
const { spoiler, img, alt, source } = Astro.props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{
|
{
|
||||||
spoiler ? (<Spoiler {...Astro.props} ><img src={img} alt={alt} /></Spoiler>) : (
|
spoiler ? (
|
||||||
source ? (<a href={source}><img src={img} alt={alt} /></a>) : (<img src={img} alt={alt} />)
|
<Spoiler {...Astro.props}>
|
||||||
)
|
<img src={img} alt={alt} />
|
||||||
}
|
</Spoiler>
|
||||||
</div>
|
) : source ? (
|
||||||
|
<a href={source}>
|
||||||
|
<img src={img} alt={alt} />
|
||||||
|
</a>
|
||||||
|
) : (
|
||||||
|
<img src={img} alt={alt} />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
---
|
---
|
||||||
import "../css/spoiler.scss"
|
import "../css/spoiler.scss";
|
||||||
|
|
||||||
const warning = Astro.props.warning ?? "Click to show NSFW image"
|
const warning = Astro.props.warning ?? "Click to show NSFW image";
|
||||||
// waltuh
|
// waltuh
|
||||||
const trolley = "spoiler-check-" + Math.floor(Math.random() * 102105122122126).toString()
|
const trolley =
|
||||||
|
"spoiler-check-" + Math.floor(Math.random() * 102105122122126).toString();
|
||||||
---
|
---
|
||||||
|
|
||||||
<div class="spoiler" >
|
<div class="spoiler">
|
||||||
<input id={trolley} type="checkbox">
|
<input id={trolley} type="checkbox" />
|
||||||
<div class="spoiler-content">
|
<div class="spoiler-content">
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
<label for={trolley} class="spoiler-button">{warning}</label>
|
<label for={trolley} class="spoiler-button">{warning}</label>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,30 +1,31 @@
|
|||||||
---
|
---
|
||||||
const allPosts = await Astro.glob("../pages/blog/*.md*");
|
import { getCollection } from "astro:content";
|
||||||
const posts = allPosts
|
|
||||||
.map((item) => Object.assign({}, item.frontmatter, { url: item.url }))
|
const posts = (await getCollection("blog"))
|
||||||
//@ts-expect-error cease this bitch crying, what do you mean i shouldn't implicitly convert Dates to Numbers
|
.filter(
|
||||||
.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate));
|
(entry) => !entry.data.wip || process.env.NODE_ENV === "development"
|
||||||
|
)
|
||||||
|
.sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());
|
||||||
---
|
---
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{
|
{
|
||||||
posts.map((post) => {
|
posts.map((post) => {
|
||||||
if (!post.wip || process.env.NODE_ENV === "development") {
|
return (
|
||||||
return (
|
<a href={`blog/${post.slug}`}>
|
||||||
<a href={post.url}>
|
<div
|
||||||
<div
|
class="main-content"
|
||||||
class="main-content"
|
style="margin-bottom: 10px; font-size: 125%;"
|
||||||
style="margin-bottom: 10px; font-size: 125%;"
|
>
|
||||||
>
|
<div>
|
||||||
<div>
|
<b>{post.data.title}</b> -{" "}
|
||||||
<b>{post.title}</b> - {post.pubDate}
|
{post.data.pubDate.toDateString()}
|
||||||
<br />
|
<br />
|
||||||
</div>
|
|
||||||
<i>{post.description}</i>
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
<i>{post.data.description}</i>
|
||||||
);
|
</div>
|
||||||
}
|
</a>
|
||||||
|
);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,23 +1,34 @@
|
|||||||
---
|
---
|
||||||
import '../css/base.scss'
|
import "../css/base.scss";
|
||||||
import '../css/font.scss'
|
import "../css/font.scss";
|
||||||
import '../css/color.scss'
|
import "../css/color.scss";
|
||||||
---
|
---
|
||||||
|
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div class="white footer">
|
<div class="white footer">
|
||||||
<div class="footer-entries">
|
<div class="footer-entries">
|
||||||
{Object.keys(Astro.props.entries).map((key) => {
|
{
|
||||||
const val = Astro.props.entries[key]
|
Object.keys(Astro.props.entries).map((key) => {
|
||||||
return (
|
const val = Astro.props.entries[key];
|
||||||
<a href={val} class="grey">{key}</a>
|
return (
|
||||||
)
|
<a href={val} class="grey">
|
||||||
})}
|
{key}
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<div class="img-container">
|
||||||
|
<!--<img src="https://media.ruthenic.com/pentagram.png" alt="Spinning pentagram" style="animation: rotation 10s infinite linear;">-->
|
||||||
|
<img
|
||||||
|
src="https://media.ruthenic.com/lgbtq%20badge.png"
|
||||||
|
alt="LGBTQ+ rights!"
|
||||||
|
/>
|
||||||
|
<!-- sry idk what else to put there lmao -->
|
||||||
|
<img
|
||||||
|
src="https://media.ruthenic.com/god%20cant%20help%20you%20now%20badge.png"
|
||||||
|
alt="CAUTION: God can't help you now."
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="img-container">
|
</div>
|
||||||
<!--<img src="https://media.ruthenic.com/pentagram.png" alt="Spinning pentagram" style="animation: rotation 10s infinite linear;">-->
|
|
||||||
<img src="https://media.ruthenic.com/lgbtq%20badge.png" alt="LGBTQ+ rights!"> <!-- sry idk what else to put there lmao -->
|
|
||||||
<img src="https://media.ruthenic.com/god%20cant%20help%20you%20now%20badge.png" alt="CAUTION: God can't help you now.">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
<div>
|
<div>
|
||||||
{
|
{
|
||||||
// always adding rel=me to every entry *probably* doesn't break anything
|
// always adding rel=me to every entry *probably* doesn't break anything
|
||||||
Object.keys(Astro.props.entries).map(k => (
|
Object.keys(Astro.props.entries).map((k) => (
|
||||||
<a rel="me" href = {Astro.props.entries[k]}>{k}</a><br>
|
<>
|
||||||
|
<a rel="me" href={Astro.props.entries[k]}>
|
||||||
|
{k}
|
||||||
|
</a>
|
||||||
|
<br />
|
||||||
|
</>
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
import { z, defineCollection } from "astro:content";
|
||||||
|
|
||||||
|
const blog = defineCollection({
|
||||||
|
schema: z.object({
|
||||||
|
title: z.string(),
|
||||||
|
description: z.string(),
|
||||||
|
wip: z.boolean().optional().default(false),
|
||||||
|
pubDate: z.string().transform((dateStr) => new Date(dateStr)),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const fanfic = defineCollection({
|
||||||
|
schema: z.object({
|
||||||
|
title: z.string(),
|
||||||
|
// description and tags need to be optional because of chapters
|
||||||
|
description: z.string().optional(),
|
||||||
|
tags: z.array(z.string()).optional(),
|
||||||
|
oneshot: z.boolean().optional().default(false),
|
||||||
|
wip: z.boolean().optional().default(false),
|
||||||
|
|
||||||
|
// exclusive to chapters
|
||||||
|
parent: z.string().optional(),
|
||||||
|
pubDate: z
|
||||||
|
.string()
|
||||||
|
.transform((dateStr) => new Date(dateStr))
|
||||||
|
.optional(),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const collections = {
|
||||||
|
blog: blog,
|
||||||
|
fanfic: fanfic,
|
||||||
|
};
|
@ -1,113 +1,116 @@
|
|||||||
@keyframes rotation {
|
@keyframes rotation {
|
||||||
from {
|
from {
|
||||||
transform: rotate(0deg);
|
transform: rotate(0deg);
|
||||||
}
|
}
|
||||||
to {
|
to {
|
||||||
transform: rotate(359deg);
|
transform: rotate(359deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.main-content {
|
.main-content {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@media (max-width: 520px) {
|
@media (max-width: 520px) {
|
||||||
margin-bottom: 132px;
|
margin-bottom: 132px;
|
||||||
}
|
}
|
||||||
@media (min-width: 520px) {
|
@media (min-width: 520px) {
|
||||||
margin-bottom: 3.4375em;
|
margin-bottom: 3.4375em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.blog-content {
|
.blog-content {
|
||||||
img {
|
img {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer {
|
.footer {
|
||||||
text-align: left; //Why does text-align being center in .main-content affect the footer at all?!
|
text-align: left; //Why does text-align being center in .main-content affect the footer at all?!
|
||||||
position: fixed;
|
position: fixed;
|
||||||
display: flex;
|
|
||||||
flex-grow: 1;
|
|
||||||
@media (max-width: 520px) { //mobile
|
|
||||||
justify-content: flex-end;
|
|
||||||
align-items: center;
|
|
||||||
flex-direction: row;
|
|
||||||
}
|
|
||||||
@media (min-width: 520px) { //desktop
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
flex-direction: row;
|
|
||||||
height: 3.4375em;
|
|
||||||
}
|
|
||||||
bottom: 0;
|
|
||||||
left: 0px;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
.img-container {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-grow: 1;
|
||||||
@media (max-width: 520px) {
|
@media (max-width: 520px) {
|
||||||
flex-direction: column;
|
//mobile
|
||||||
|
justify-content: flex-end;
|
||||||
|
align-items: center;
|
||||||
|
flex-direction: row;
|
||||||
}
|
}
|
||||||
img {
|
@media (min-width: 520px) {
|
||||||
display: flex;
|
//desktop
|
||||||
height: 45px;
|
justify-content: center;
|
||||||
margin-right: 0.625em;
|
align-items: center;
|
||||||
@media (max-width: 520px) { //even smoler mobile
|
flex-direction: row;
|
||||||
height: 30px;
|
height: 3.4375em;
|
||||||
margin-top: 0.3125em;
|
}
|
||||||
margin-bottom: 0.3125em;
|
bottom: 0;
|
||||||
margin-right: 0.3152em;
|
left: 0px;
|
||||||
}
|
width: 100%;
|
||||||
|
|
||||||
|
.img-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
@media (max-width: 520px) {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
display: flex;
|
||||||
|
height: 45px;
|
||||||
|
margin-right: 0.625em;
|
||||||
|
@media (max-width: 520px) {
|
||||||
|
//even smoler mobile
|
||||||
|
height: 30px;
|
||||||
|
margin-top: 0.3125em;
|
||||||
|
margin-bottom: 0.3125em;
|
||||||
|
margin-right: 0.3152em;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.homepage-main {
|
.homepage-main {
|
||||||
img {
|
img {
|
||||||
width: 25%;
|
width: 25%;
|
||||||
height: 25%;
|
height: 25%;
|
||||||
}
|
}
|
||||||
display: absolute;
|
display: absolute;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
top: 0;
|
top: 0;
|
||||||
transform: translateY(25%);
|
transform: translateY(25%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer-entries {
|
.footer-entries {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin-left: 0.625em;
|
margin-left: 0.625em;
|
||||||
@media (max-width: 470px) {
|
@media (max-width: 470px) {
|
||||||
margin-left: 0.3152em;
|
margin-left: 0.3152em;
|
||||||
}
|
}
|
||||||
a:not(:last-child) {
|
a:not(:last-child) {
|
||||||
margin-right: 0.625em;
|
margin-right: 0.625em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.white {
|
.white {
|
||||||
background-color: #222222;
|
background-color: #222222;
|
||||||
}
|
}
|
||||||
|
|
||||||
.grey {
|
.grey {
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.padding {
|
.padding {
|
||||||
position: relative;
|
position: relative;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.padding-right {
|
.padding-right {
|
||||||
position: relative;
|
position: relative;
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
marquee {
|
marquee {
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
}
|
}
|
||||||
|
@ -1,30 +1,30 @@
|
|||||||
body {
|
body {
|
||||||
background-color:#333333;
|
background-color: #333333;
|
||||||
color: white;
|
color: white;
|
||||||
font-family: 'IBM Plex Sans', sans-serif;
|
font-family: "IBM Plex Sans", sans-serif;
|
||||||
}
|
}
|
||||||
pre {
|
pre {
|
||||||
background-color: #333333 !important;
|
background-color: #333333 !important;
|
||||||
max-width: 33%;
|
max-width: 33%;
|
||||||
font-family: 'IBM Plex Mono', monospace;
|
font-family: "IBM Plex Mono", monospace;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
p {
|
p {
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
a {
|
a {
|
||||||
color:#47FF58;
|
color: #47ff58;
|
||||||
text-decoration:none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
a:link {
|
a:link {
|
||||||
color:#47FF58;
|
color: #47ff58;
|
||||||
}
|
}
|
||||||
a:visited {
|
a:visited {
|
||||||
color:#47FF58;
|
color: #47ff58;
|
||||||
}
|
}
|
||||||
a:hover {
|
a:hover {
|
||||||
color:#47FF58;
|
color: #47ff58;
|
||||||
}
|
}
|
||||||
a:active {
|
a:active {
|
||||||
color:#47FF58;
|
color: #47ff58;
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'IBM Plex Mono';
|
font-family: "IBM Plex Mono";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: url('/fonts/mono.ttf') format('truetype');
|
src: url("/fonts/mono.ttf") format("truetype");
|
||||||
}
|
}
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'IBM Plex Sans';
|
font-family: "IBM Plex Sans";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: url('/fonts/sans.ttf') format('truetype');
|
src: url("/fonts/sans.ttf") format("truetype");
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
/// <reference path="../.astro/types.d.ts" />
|
||||||
|
/// <reference types="astro/client" />
|
@ -1,28 +1,30 @@
|
|||||||
---
|
---
|
||||||
import '../css/base.scss'
|
import "../css/base.scss";
|
||||||
import '../css/font.scss'
|
import "../css/font.scss";
|
||||||
import '../css/color.scss'
|
import "../css/color.scss";
|
||||||
|
|
||||||
import Footer from '../components/footer.astro';
|
import Footer from "../components/footer.astro";
|
||||||
|
|
||||||
const {title} = Astro.props;
|
const { title } = Astro.props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<!--TODO: set meta tags for discord embed-->
|
<!--TODO: set meta tags for discord embed-->
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width" />
|
<meta name="viewport" content="width=device-width" />
|
||||||
<title>{title}</title>
|
<title>{title}</title>
|
||||||
</head>
|
</head>
|
||||||
<body class="main-content">
|
<body class="main-content">
|
||||||
<slot />
|
<slot />
|
||||||
<Footer entries={{
|
<Footer
|
||||||
Homepage: "/",
|
entries={{
|
||||||
Blog: "/blog",
|
Homepage: "/",
|
||||||
Fanfic: "/fanfic",
|
Blog: "/blog",
|
||||||
"About Us": "/about"
|
Fanfic: "/fanfic",
|
||||||
}} />
|
"About Us": "/about",
|
||||||
</body>
|
}}
|
||||||
|
/>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,31 +1,34 @@
|
|||||||
---
|
---
|
||||||
import '../css/base.scss'
|
import "../css/base.scss";
|
||||||
import '../css/font.scss'
|
import "../css/font.scss";
|
||||||
import '../css/color.scss'
|
import "../css/color.scss";
|
||||||
|
|
||||||
import Footer from '../components/footer.astro';
|
import Footer from "../components/footer.astro";
|
||||||
|
|
||||||
|
const post = Astro.props.frontmatter;
|
||||||
|
|
||||||
const {content} = Astro.props;
|
|
||||||
const canonicalURL = new URL(Astro.url.pathname, Astro.site);
|
const canonicalURL = new URL(Astro.url.pathname, Astro.site);
|
||||||
---
|
---
|
||||||
|
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width" />
|
<meta name="viewport" content="width=device-width" />
|
||||||
<title>{content.title}</title>
|
<title>{post.title}</title>
|
||||||
<meta property="og:type" content="article">
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:title" content={content.title}/>
|
<meta property="og:title" content={post.title} />
|
||||||
<meta property="og:description" content={content.description}/>
|
<meta property="og:description" content={post.description} />
|
||||||
<meta property="og:url" content={canonicalURL}/>
|
<meta property="og:url" content={canonicalURL} />
|
||||||
</head>
|
</head>
|
||||||
<body class="blog-content">
|
<body class="blog-content">
|
||||||
<h2>{content.title}</h2>
|
<h2>{post.title}</h2>
|
||||||
<h3>{content.description}</h3>
|
<h3>{post.description}</h3>
|
||||||
<slot />
|
<slot />
|
||||||
<div style="position:relative;margin-bottom:105px;"></div>
|
<div style="position:relative;margin-bottom:105px;"></div>
|
||||||
<Footer entries={{
|
<Footer
|
||||||
"Back to Blog Home": "/blog"
|
entries={{
|
||||||
}} />
|
"Back to Blog Home": "/blog",
|
||||||
</body>
|
}}
|
||||||
</html>
|
/>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
---
|
---
|
||||||
import '../css/base.scss'
|
import "../css/base.scss";
|
||||||
import '../css/font.scss'
|
import "../css/font.scss";
|
||||||
import '../css/color.scss'
|
import "../css/color.scss";
|
||||||
const {title} = Astro.props;
|
const { title } = Astro.props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<!--TODO: set meta tags for discord embed-->
|
<!--TODO: set meta tags for discord embed-->
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width" />
|
<meta name="viewport" content="width=device-width" />
|
||||||
<title>{title}</title>
|
<title>{title}</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<slot />
|
<slot />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
---
|
---
|
||||||
import Base from '../layout/BaseHeaderless.astro'
|
import Base from "../layout/BaseHeaderless.astro";
|
||||||
---
|
---
|
||||||
|
|
||||||
<Base title="ruthenic.com: 404">
|
<Base title="ruthenic.com: 404">
|
||||||
<center><h1>404</h1>
|
<center
|
||||||
<h3>Sorry, the page you are looking for does not exist!</h3>
|
><h1>404</h1>
|
||||||
</center>
|
<h3>Sorry, the page you are looking for does not exist!</h3>
|
||||||
|
</center>
|
||||||
</Base>
|
</Base>
|
||||||
|
@ -1,27 +1,45 @@
|
|||||||
---
|
---
|
||||||
import Base from '../layout/Base.astro'
|
import Base from "../layout/Base.astro";
|
||||||
---
|
---
|
||||||
|
|
||||||
<Base title="ruthenic.com: About Us">
|
<Base title="ruthenic.com: About Us">
|
||||||
<style>
|
<style>
|
||||||
h2 {
|
h2 {
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<h2>Who are you?</h2>
|
<h2>Who are you?</h2>
|
||||||
<p>Either the most boring person you know or the most insane person you know</p>
|
<p>
|
||||||
<h2>You don't seem insane to me?</h2>
|
Either the most boring person you know or the most insane person you
|
||||||
<p>Have you not noticed the "Fanfic" section of this website yet?</p>
|
know
|
||||||
<h2>What is this website for?</h2>
|
</p>
|
||||||
<p>Posting random shit on my blog and/or serving as a platform for my "writing"</p>
|
<h2>You don't seem insane to me?</h2>
|
||||||
<h2>Why is writing in quotes?</h2>
|
<p>Have you not noticed the "Fanfic" section of this website yet?</p>
|
||||||
<p>Refer to my answer to question 2</p>
|
<h2>What is this website for?</h2>
|
||||||
<h2>Damn bro that's crazy, but have you considered getting some bitches?</h2>
|
<p>
|
||||||
<p>Only if they're fictional. You may notice that introduces a slight paradox which means that I will never get bitches until someone figures out multi-dimensional travel (never)</p>
|
Posting random shit on my blog and/or serving as a platform for my
|
||||||
<h2>Where are you from?</h2>
|
"writing"
|
||||||
<p>40.31514922688336, -83.06496911453435 (not really, I'm from South Carolina which is slightly more sane than Ohio)</p>
|
</p>
|
||||||
<h2>What is your least favorite organ?</h2>
|
<h2>Why is writing in quotes?</h2>
|
||||||
<p>Tough question, but the gallbladder is pointless and will probably prove to be quite painful in the future</p>
|
<p>Refer to my answer to question 2</p>
|
||||||
<h2>But the gallbladder doesn't sell for very much on the black market.</h2>
|
<h2>
|
||||||
<p>Wait are you trying to sell my organs- HELP</p>
|
Damn bro that's crazy, but have you considered getting some bitches?
|
||||||
|
</h2>
|
||||||
|
<p>
|
||||||
|
Only if they're fictional. You may notice that introduces a slight
|
||||||
|
paradox which means that I will never get bitches until someone figures
|
||||||
|
out multi-dimensional travel (never)
|
||||||
|
</p>
|
||||||
|
<h2>Where are you from?</h2>
|
||||||
|
<p>
|
||||||
|
40.31514922688336, -83.06496911453435 (not really, I'm from South
|
||||||
|
Carolina which is slightly more sane than Ohio)
|
||||||
|
</p>
|
||||||
|
<h2>What is your least favorite organ?</h2>
|
||||||
|
<p>
|
||||||
|
Tough question, but the gallbladder is pointless and will probably prove
|
||||||
|
to be quite painful in the future
|
||||||
|
</p>
|
||||||
|
<h2>But the gallbladder doesn't sell for very much on the black market.</h2>
|
||||||
|
<p>Wait are you trying to sell my organs- HELP</p>
|
||||||
</Base>
|
</Base>
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
import Base from '../layout/Base.astro'
|
|
||||||
import BlogList from '../components/blogList.astro'
|
|
||||||
---
|
|
||||||
|
|
||||||
<Base title="ruthenic.com: Blog">
|
|
||||||
<h1>Blog</h1>
|
|
||||||
<BlogList />
|
|
||||||
</Base>
|
|
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
|
||||||
|
export async function getStaticPaths() {
|
||||||
|
const posts = await getCollection("blog");
|
||||||
|
|
||||||
|
return posts
|
||||||
|
.filter(
|
||||||
|
(entry) => !entry.data.wip || process.env.NODE_ENV === "development"
|
||||||
|
)
|
||||||
|
.map((entry) => ({
|
||||||
|
params: { slug: entry.slug },
|
||||||
|
props: { entry },
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
const { entry } = Astro.props;
|
||||||
|
const { Content } = await entry.render();
|
||||||
|
---
|
||||||
|
|
||||||
|
<Content />
|
@ -1,38 +0,0 @@
|
|||||||
import rss from "@astrojs/rss";
|
|
||||||
/* function sortWithTransform(array, transform, sorter) {
|
|
||||||
console.log(array)
|
|
||||||
global.JANK_newArray = []
|
|
||||||
Promise.all(array.map(async (i) => { return await transform(i) })).then(
|
|
||||||
(res)=>{
|
|
||||||
res.forEach(i => {
|
|
||||||
global.JANK_newArray.push(i)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
console.log(global.JANK_newArray)
|
|
||||||
return array
|
|
||||||
}
|
|
||||||
|
|
||||||
/*const sortObject = obj => Object.keys(obj).sort(async (a,b)=> {
|
|
||||||
console.log(await obj[b]())
|
|
||||||
return (new Date((await obj[b]()).frontmatter.pubDate)) - (new Date((await obj[a]()).frontmatter.pubDate))
|
|
||||||
}).reduce((res, key) => (res[key] = obj[key], res), {}); * /
|
|
||||||
const sortObject = obj => sortWithTransform(Object.keys(obj), async (o) => {
|
|
||||||
return new Date((await obj[o]()).frontmatter.pubDate)
|
|
||||||
}, (a,b) => b-a).reduce((res, key) => (res[key] = obj[key], res), {}); */
|
|
||||||
|
|
||||||
let posts = import.meta.glob("./*.md*");
|
|
||||||
Object.keys(posts).forEach(async (k) => {
|
|
||||||
const res = await posts[k]();
|
|
||||||
if (res.frontmatter.wip) {
|
|
||||||
delete posts[k];
|
|
||||||
}
|
|
||||||
}) //remove WIP entries
|
|
||||||
|
|
||||||
export const get = () => rss({
|
|
||||||
title: "Ruthenic's blog",
|
|
||||||
description: "My blog, utilized for talking about random things.",
|
|
||||||
site: import.meta.env.SITE,
|
|
||||||
items: posts,
|
|
||||||
stylesheet: "/rssStyle.xsl"
|
|
||||||
})
|
|
@ -0,0 +1,23 @@
|
|||||||
|
import rss from "@astrojs/rss";
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
|
||||||
|
export async function get(context) {
|
||||||
|
const posts = (await getCollection("blog"))
|
||||||
|
.filter(
|
||||||
|
(entry) => !entry.data.wip || process.env.NODE_ENV === "development"
|
||||||
|
)
|
||||||
|
.map((post) => ({
|
||||||
|
title: post.data.title,
|
||||||
|
pubDate: post.data.pubDate,
|
||||||
|
description: post.data.description,
|
||||||
|
link: `/blog/${post.slug}/`,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return rss({
|
||||||
|
title: "Ruthenic's blog",
|
||||||
|
description: "My blog, utilized for talking about random things.",
|
||||||
|
site: context.site,
|
||||||
|
items: posts,
|
||||||
|
stylesheet: "/rssStyle.xsl",
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
import Base from "../../layout/Base.astro";
|
||||||
|
import BlogList from "../../components/blogList.astro";
|
||||||
|
---
|
||||||
|
|
||||||
|
<Base title="ruthenic.com: Blog">
|
||||||
|
<h1>Blog</h1>
|
||||||
|
<BlogList />
|
||||||
|
</Base>
|
@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
layout: ../../layout/BaseBlog.astro
|
|
||||||
title: template
|
|
||||||
description: description
|
|
||||||
wip: true
|
|
||||||
pubDate: WORDDAY, MONTH NUMDAY YEAR
|
|
||||||
---
|
|
||||||
|
|
||||||
Content here!
|
|
@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
layout: ../../layout/BaseBlog.astro
|
|
||||||
title: Why Tulpamancy isn't
|
|
||||||
description: description
|
|
||||||
wip: true
|
|
||||||
pubDate: WORDDAY, MONTH NUMDAY YEAR
|
|
||||||
---
|
|
||||||
|
|
||||||
Content here!
|
|
@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
import Base from "../layout/Base.astro";
|
|
||||||
const allFics = await Astro.glob("./fanfic/*.md*");
|
|
||||||
---
|
|
||||||
|
|
||||||
<Base title="ruthenic.com: Fanfics">
|
|
||||||
<h1>Fanfics</h1>
|
|
||||||
<div>
|
|
||||||
{
|
|
||||||
allFics
|
|
||||||
.sort((a, b) =>
|
|
||||||
a.frontmatter.title.localeCompare(b.frontmatter.title)
|
|
||||||
)
|
|
||||||
.map((fic) =>
|
|
||||||
(
|
|
||||||
<a href={fic.url}>
|
|
||||||
<div
|
|
||||||
class="main-content"
|
|
||||||
style="margin-bottom: 10px; font-size: 125%;"
|
|
||||||
>
|
|
||||||
<div style="display:flex;">
|
|
||||||
<b>{fic.frontmatter.title}</b>{fic.frontmatter.oneshot ? (<span> - (Oneshot)</span>) : undefined}
|
|
||||||
</div>
|
|
||||||
{fic.frontmatter.description ? (<br/><i>{fic.frontmatter.description}</i>) : undefined}
|
|
||||||
{fic.frontmatter.tags.toString().split(",").join(", ")}
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</Base>
|
|
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
|
||||||
|
export async function getStaticPaths() {
|
||||||
|
const fics = await getCollection("fanfic");
|
||||||
|
|
||||||
|
return fics
|
||||||
|
.filter(
|
||||||
|
(entry) => !entry.data.wip || process.env.NODE_ENV === "development"
|
||||||
|
)
|
||||||
|
.map((entry) => ({
|
||||||
|
params: { slug: entry.slug },
|
||||||
|
props: { entry },
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
const { entry } = Astro.props;
|
||||||
|
const { Content } = await entry.render();
|
||||||
|
---
|
||||||
|
|
||||||
|
<Content />
|
@ -0,0 +1,26 @@
|
|||||||
|
import rss from "@astrojs/rss";
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
|
||||||
|
export async function get(context) {
|
||||||
|
const fics = (await getCollection("fanfic"))
|
||||||
|
.filter(
|
||||||
|
(entry) =>
|
||||||
|
(!entry.data.wip || process.env.NODE_ENV === "development") &&
|
||||||
|
!entry.data.parent
|
||||||
|
)
|
||||||
|
.map((fic) => ({
|
||||||
|
title: fic.data.title,
|
||||||
|
// fics dont have a published date and it's required for some reason, literally 1984
|
||||||
|
pubDate: new Date(441763200000),
|
||||||
|
description: fic.data.description ?? "",
|
||||||
|
link: `/fanfic/${fic.slug}/`,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return rss({
|
||||||
|
title: "Ruthenic's fanfics",
|
||||||
|
description: "My fanfics.",
|
||||||
|
site: context.site,
|
||||||
|
items: fics,
|
||||||
|
stylesheet: "/rssStyle.xsl",
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
import { getCollection } from "astro:content";
|
||||||
|
|
||||||
|
import Base from "../../layout/Base.astro";
|
||||||
|
const fics = (await getCollection("fanfic"))
|
||||||
|
.filter(
|
||||||
|
(entry) =>
|
||||||
|
(!entry.data.wip || process.env.NODE_ENV === "development") &&
|
||||||
|
!entry.data.parent
|
||||||
|
)
|
||||||
|
.sort((a, b) => a.data.title.localeCompare(b.data.title));
|
||||||
|
---
|
||||||
|
|
||||||
|
<Base title="ruthenic.com: Fanfics">
|
||||||
|
<h1>Fanfics</h1>
|
||||||
|
<div>
|
||||||
|
{
|
||||||
|
fics.map((fic) => (
|
||||||
|
<a href={`fanfic/${fic.slug}`}>
|
||||||
|
<div
|
||||||
|
class="main-content"
|
||||||
|
style="margin-bottom: 10px; font-size: 125%;"
|
||||||
|
>
|
||||||
|
<div style="display:flex;">
|
||||||
|
<b>{fic.data.title}</b>
|
||||||
|
{fic.data.oneshot ? (
|
||||||
|
<span> - (Oneshot)</span>
|
||||||
|
) : undefined}
|
||||||
|
</div>
|
||||||
|
{fic.data.description ? (
|
||||||
|
<i>{fic.data.description}</i>
|
||||||
|
) : undefined}
|
||||||
|
{fic.data.tags?.join(", ")}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</Base>
|
@ -1,19 +1,26 @@
|
|||||||
---
|
---
|
||||||
import Base from '../layout/Base.astro'
|
import Base from "../layout/Base.astro";
|
||||||
import Linklist from '../components/linkList.astro'
|
import Linklist from "../components/linkList.astro";
|
||||||
---
|
---
|
||||||
|
|
||||||
<Base title="ruthenic.com: Homepage">
|
<Base title="ruthenic.com: Homepage">
|
||||||
<h1>Ruthenic's site</h1> <!--originally intended to be only written in CSS and HTML but f**k that-->
|
<h1>Ruthenic's site</h1>
|
||||||
<p>Welcome to my site. I hope you enjoy the experience.</p>
|
<!--originally intended to be only written in CSS and HTML but f**k that-->
|
||||||
<marquee behavior="scroll" direction="left"><a href = "https://github.com/Ruthenic">Checkout (haha) my Github!</a></marquee>
|
<p>Welcome to my site. I hope you enjoy the experience.</p>
|
||||||
|
<marquee behavior="scroll" direction="left"
|
||||||
|
><a href="https://github.com/Ruthenic">Checkout (haha) my Github!</a
|
||||||
|
></marquee
|
||||||
|
>
|
||||||
<p>Check me out on</p>
|
<p>Check me out on</p>
|
||||||
<Linklist entries={{
|
<Linklist
|
||||||
Gitea: "https://git.ruthenic.com/ruthenic",
|
entries={{
|
||||||
Github: "https://github.com/Ruthenic",
|
Gitea: "https://git.ruthenic.com/ruthenic",
|
||||||
"Last.fm": "https://www.last.fm/user/DustyAngel47",
|
Github: "https://github.com/Ruthenic",
|
||||||
Fediverse: "https://social.ruthenic.com/ruthenic",
|
"Last.fm": "https://www.last.fm/user/DustyAngel47",
|
||||||
Youtube: "https://www.youtube.com/channel/UC5BfTH4lP7rY5q3qSAvpvhA",
|
Fediverse: "https://social.ruthenic.com/ruthenic",
|
||||||
"Wattpad (for some reason)": "https://www.wattpad.com/user/DustyAngel47"
|
Youtube: "https://www.youtube.com/channel/UC5BfTH4lP7rY5q3qSAvpvhA",
|
||||||
}}/>
|
"Wattpad (for some reason)":
|
||||||
|
"https://www.wattpad.com/user/DustyAngel47",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</Base>
|
</Base>
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
---
|
---
|
||||||
import Base from '../layout/BaseHeaderless.astro'
|
import Base from "../layout/BaseHeaderless.astro";
|
||||||
import Newtab from '../components/linkList.astro'
|
import NewTab from "../components/linkList.astro";
|
||||||
---
|
---
|
||||||
|
|
||||||
<Base title="ruthenic.com: Example Page">
|
<Base title="ruthenic.com: New Tab">
|
||||||
<Newtab entries={{
|
<NewTab
|
||||||
Youtube: "https://youtube.com",
|
entries={{
|
||||||
Fediverse: "https://social.ruthenic.com",
|
Youtube: "https://youtube.com",
|
||||||
Gitea: "https://git.ruthenic.com",
|
Fediverse: "https://social.ruthenic.com",
|
||||||
"ruthenic.com": "https://ruthenic.com",
|
Gitea: "https://git.ruthenic.com",
|
||||||
CharacterAI: "https://beta.character.ai",
|
"ruthenic.com": "https://ruthenic.com",
|
||||||
AO3: "https://archiveofourown.org"
|
CharacterAI: "https://beta.character.ai",
|
||||||
}}/>
|
AO3: "https://archiveofourown.org",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</Base>
|
</Base>
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
import Base from '../layout/Base.astro'
|
|
||||||
---
|
|
||||||
|
|
||||||
<Base title="ruthenic.com: Example Page">
|
|
||||||
<h1>Hello, world!</h1>
|
|
||||||
</Base>
|
|
@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"extends": "astro/tsconfigs/base",
|
||||||
"moduleResolution": "node"
|
"compilerOptions": {
|
||||||
}
|
"strictNullChecks": true,
|
||||||
|
"allowJs": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in new issue