Compare commits

...

20 Commits

Author SHA1 Message Date
f7eda2e4ec update add drafts 2026-01-24 14:26:26 +01:00
28f657fb07 update 2026-01-18 22:33:52 +01:00
709053b27e fix rss 2026-01-18 22:27:08 +01:00
76573dc378 update 2026-01-18 22:25:19 +01:00
Daniel Ledda
ba9bcbaa08 update 2026-01-18 22:22:01 +01:00
d93e2f8928 update homepage 2026-01-18 22:17:50 +01:00
cc8b8b6d8b update new article 2026-01-18 22:15:07 +01:00
1255ce4f07 update 2025-12-28 18:39:58 +01:00
a261eb62c8 update vue 2025-12-26 14:16:16 +01:00
e55af45fa3 update 2025-12-26 14:15:20 +01:00
f40c02585f styling 2025-12-21 23:39:07 +01:00
Daniel Ledda
2829504b2b update 2025-12-20 21:43:50 +01:00
Daniel Ledda
808338f547 update font 2025-12-20 21:26:15 +01:00
Daniel Ledda
498cb37561 big style update 2025-12-20 21:16:00 +01:00
Daniel Ledda
51e44db779 big updats 2025-12-20 00:10:42 +01:00
Daniel Ledda
a93ffff00d update 2025-12-11 16:26:52 +01:00
Daniel Ledda
2702d7dc8f update 2025-12-11 16:24:36 +01:00
Daniel Ledda
f26ab99960 udpate 2025-12-11 16:23:12 +01:00
Daniel Ledda
aaa2fe85f7 update 2025-12-11 16:20:15 +01:00
Daniel Ledda
9762d463ed update 2025-12-11 16:19:20 +01:00
72 changed files with 10567 additions and 569 deletions

13
README.md Normal file
View File

@@ -0,0 +1,13 @@
This repo is for content hosted at djledda.net
The basic idea is that the `/app` folder contains shared files (in the root)
and separate Vue apps (each folder) whose code doesn't need to be built and can
be run in SSR mode or sent to the client directly, transpiled on the fly using
Deno's built in transpilation API.
# Structure
- `/app/` contains shared files and individual vue apps ('sites')
- `/app/<site>/client.ts` is the javascript entry point for the client
- `/app/<site>/server.ts` is the javascript entry point for the server
- `/public/` contains static files publicly available using the same folder structure over HTTP
- `/public/home` and `/app/home` will be remapped to root requests: a request to `/img/*` is retrieved from `/public/home/img/*`

View File

@@ -1,21 +0,0 @@
import { defineComponent } from "vue";
export default defineComponent({
name: "dj-email",
setup(_props, { slots }) {
function clickMail() {
const a = "gmail";
const b = "com";
const c = "danjledda";
let link = "ma" + "il" + "" + "to:" + c + a + b;
link = link.slice(0, 10) + "." + link.slice(10, 11) + "." + link.slice(11, 16) + "@" + link.slice(16, 21) +
"." + link.slice(21);
window.location.href = link;
}
return () => (
<a href="#" onClick={clickMail}>
{slots.default ? slots.default() : "dan.j.ledda [at] gmail [dot] com"}
</a>
);
},
});

19
app/DjEmail.tsx Normal file
View File

@@ -0,0 +1,19 @@
import { defineComponent } from "vue";
export default defineComponent({
name: "dj-email",
setup(_props, { slots }) {
function clickMail() {
const a = "dan";
const b = "djledda";
const c = "net";
let link = "mailto:" + a + "@" + b + "." + c;
window.location.href = link;
}
return () => (
<a href="#" onClick={clickMail}>
{slots.default ? slots.default() : "dan [at] djledda [dot] net"}
</a>
);
},
});

View File

@@ -1,4 +1,4 @@
import { nextTick, inject, provide, watch, type InjectionKey, onBeforeUnmount, watchEffect, onMounted, type Ref, type CSSProperties, defineComponent, ref } from "vue"; import { nextTick, inject, provide, watch, type InjectionKey, onBeforeUnmount, watchEffect, onMounted, type Ref, defineComponent, ref } from "vue";
import { addCSS, css, h as djh } from "@/util.ts"; import { addCSS, css, h as djh } from "@/util.ts";
type TooltipContext = { type TooltipContext = {
@@ -17,9 +17,10 @@ const tooltipStyles = css`
opacity: 0; opacity: 0;
display: block; display: block;
pointer-events: none; pointer-events: none;
background-color: black; background-color: var(--dj-bgpalette1);
border: white solid 1px; box-shadow: 0 0 12px 1px rgb(10 12 15 / 70%);
color: white; border: var(--dj-palette3) solid 1px;
color: var(--dj-palette3);
padding: 10px; padding: 10px;
position: absolute; position: absolute;
z-index: 1; z-index: 1;
@@ -118,12 +119,12 @@ export default defineComponent({
onBeforeUnmount(() => tooltip.hide()); onBeforeUnmount(() => tooltip.hide());
return () => <> return () => <>
<div class="tooltip-container" <span class="tooltip-container"
{...attrs} {...attrs}
onMouseenter={(e) => tooltip.show(props.tooltip, e.pageX, e.pageY)} onMouseenter={(e) => tooltip.show(props.tooltip, e.pageX, e.pageY)}
onMouseleave={() => tooltip.hide()}> onMouseleave={() => tooltip.hide()}>
{slots.default && <slots.default />} {slots.default?.()}
</div> </span>
</>; </>;
}, },
}); });

View File

@@ -1,4 +1,17 @@
export type DJAPIEndpoint = "/rp-articles"; export type DjAPIEndpoint =
| "/rp-articles"
| "/blog-entries"
;
type BlogEntry = {
title: string,
slug: string;
createdAt: string,
updatedAt: string,
tags?: string[],
guid: string,
teaser: string,
};
type RPArticle = { type RPArticle = {
title: string, title: string,
@@ -9,15 +22,16 @@ type RPArticle = {
tags?: string[], tags?: string[],
}; };
export interface DJAPIResultMap extends Record<DJAPIEndpoint, unknown> { export interface DjAPIResultMap extends Record<DjAPIEndpoint, unknown> {
"/rp-articles": RPArticle[]; "/rp-articles": RPArticle[];
"/blog-entries": BlogEntry[];
} }
export type DJAPIResult = DJAPIResultMap[DJAPIEndpoint]; export type DjAPIResult = DjAPIResultMap[DjAPIEndpoint];
export default async function getDJAPI<T extends DJAPIEndpoint>( export default async function getDjAPI<T extends DjAPIEndpoint>(
hostUrl: string, hostUrl: string,
endpoint: T, endpoint: T,
): Promise<DJAPIResultMap[typeof endpoint]> { ): Promise<DjAPIResultMap[typeof endpoint]> {
return await (await fetch(`${hostUrl}/api${endpoint}`)).json(); return await (await fetch(`${hostUrl}/api${endpoint}`)).json();
} }

98
app/blog/DjBlogEntry.tsx Normal file
View File

@@ -0,0 +1,98 @@
import { computed, createTextVNode, defineComponent, h, type VNode } from "vue";
import useHead from "@/useHead.ts";
import useAsyncState from "@/useAsyncState.ts";
import getDjAPI from "@/api.ts";
import getDomParser from "@/domParse.ts";
import { addCSS, css } from "../util.ts";
const style = css`
.byline {
font-style: italic;
color: gray;
}
h1 {
color: var(--dj-palette1);
}
p {
margin-bottom: 30px;
}
`;
export default defineComponent({
name: "DjBlogEntry",
props: {
slug: {
type: String,
required: true,
},
},
async setup(props) {
addCSS('DjBlogEntry', style);
const parseDom = getDomParser();
const blogpostContent = useAsyncState(
`dj-blog-article-content-${ props.slug }`,
async ({ hostUrl }) => {
const blogpostResponse = await fetch(`${hostUrl}/blog/content/${ props.slug }.html`);
const result = await blogpostResponse.text();
return result;
},
);
const blogpostsMetadata = useAsyncState('article-metadata', ({ hostUrl }) => getDjAPI(hostUrl, '/blog-entries'));
const blogpostMetadata = computed(() => blogpostsMetadata.result.value?.find(_ => _.slug === props.slug));
useHead({
title: () => blogpostMetadata.value?.title ?? '',
metatags: () => blogpostMetadata.value ? [
{ name: 'title', content: blogpostMetadata.value.title },
{ name: 'author', content: 'Daniel Ledda' },
] : [],
});
function transformPostNode(node: Node): VNode | string {
if (node.nodeType === node.ELEMENT_NODE) {
const el = node as Element;
const attrs: Record<string, string> = {};
const children = [...node.childNodes].map((_) => transformPostNode(_));
for (let i = 0; i < el.attributes.length; i++) {
const item = el.attributes.item(i);
if (item) {
attrs[item.name] = item.value;
}
}
return h((node as Element).tagName, attrs, children);
} else {
return createTextVNode(node.textContent ?? "");
}
}
function PostContentTransformed() {
if (blogpostContent.result.value) {
const dom = parseDom(blogpostContent.result.value);
return h("div", {}, [...dom.children].map((_) => transformPostNode(_)));
}
return <div>Blog post loading...</div>;
}
await Promise.allSettled([ blogpostContent.done, blogpostsMetadata.done ]);
return () => <>
{ blogpostMetadata.value
? <>
<h1>{ blogpostMetadata.value.title }</h1>
<div class="byline">by Daniel Ledda, first published { new Date(blogpostMetadata.value.createdAt).toLocaleDateString() }</div>
<PostContentTransformed />
</>
: "Sorry, this blog post doesn't seem to exist."
}
</>;
}
});

54
app/blog/DjBlogMain.tsx Normal file
View File

@@ -0,0 +1,54 @@
import { defineComponent } from "vue";
import useAsyncState from "@/useAsyncState.ts";
import getDjAPI from "@/api.ts";
import { RouterLink } from "vue-router";
import { addCSS, css } from "@/util.ts";
const style = css`
.dj-blog-main {
.entry {
display: flex;
flex-direction: row;
gap: 4px;
}
em {
color: gray;
}
h2 {
margin-top: 0;
}
}
`;
export default defineComponent({
name: "DjBlogMain",
async setup() {
addCSS('DjBlogMain', style);
const blogEntries = useAsyncState('blog-entries-meta', ({ hostUrl }) => getDjAPI(hostUrl, "/blog-entries"));
await blogEntries.done;
return () => <>
<main class="dj-blog-main">
<h2>Entries</h2>
<ul>
{blogEntries.result.value?.map(_ => (
<li key={_.slug}>
<div class="entry">
<RouterLink to={{ name: 'DjBlogEntry', params: { slug: _.slug }}}>{ _.title }</RouterLink>
</div>
<div>
<em>first published <time datetime={ _.createdAt }>{ new Date(_.createdAt).toLocaleDateString() }</time></em>
</div>
</li>
)) ?? <li>Blog posts loading...</li>}
</ul>
</main>
</>;
},
});

151
app/blog/DjBlogRoot.tsx Normal file
View File

@@ -0,0 +1,151 @@
import { defineComponent, ref, type VNode, Suspense } from "vue";
import { type RouteRecordRaw, RouterLink, RouterView } from "vue-router";
import DjTooltip, { setupTooltip } from "@/DjTooltip.tsx";
import DjBlogEntry from "@/blog/DjBlogEntry.tsx";
import DjBlogMain from "@/blog/DjBlogMain.tsx";
import DjEmail from "@/DjEmail.tsx";
import { addCSS, css } from "@/util.ts";
import useHead from "@/useHead.ts";
export const routes: RouteRecordRaw[] = [
{
path: "/",
name: "DjBlogMain",
component: DjBlogMain,
},
{
path: "/post/:slug",
name: "DjBlogEntry",
component: DjBlogEntry,
props: ({ params }) => {
if ("slug" in params) {
return { slug: params.slug };
} else {
return false;
}
},
},
];
const styles = css`
body {
height: 100svh;
}
.dj-blog-root {
display: flex;
flex-direction: column;
align-items: center;
margin: auto;
width: 800px;
.dot {
margin-left: 10px;
margin-right: 10px;
}
.container {
width: 100%;
}
footer {
width: 100%;
font-style: italic;
margin-left: 10px;
margin-bottom: 25px;
text-align: left;
}
a {
color: var(--dj-palette3);
text-decoration: solid line;
&:visited {
color: var(--dj-visited);
}
}
ul {
padding-left: 30px;
}
li {
list-style: disclosure-closed;
}
nav {
width: 100%;
font-size: 40px;
margin-top: 10px;
margin-bottom: 10px;
text-decoration: none;
text-align: right;
a, a:visited {
color: var(--dj-palette3);
}
}
@media only screen and (max-width: 1024px) {
width: calc(100% - 20px);
padding: 10px;
.dj-title {
margin-right: 30px;
}
footer {
margin-bottom: 0;
}
}
}
`;
export default defineComponent({
name: "DjBlogRoot",
setup() {
const carrier = ref<HTMLDivElement | null>(null);
setupTooltip({ carrier });
addCSS('dj-blog-root', styles);
useHead({ title: "djblog Home" });
return () => (
<>
<div ref={carrier} class="tooltip-carrier" />
<div class="dj-blog-root">
<nav>
<DjTooltip tooltip="flog, clog, bog, frog, cog, log, grog, fog, snog...">
<RouterLink to={{ name: 'DjBlogMain' }}>
dj blog
</RouterLink>
</DjTooltip>
</nav>
<div class="container">
<RouterView>
{{
default: ({ Component }: { Component: VNode }) => (Component &&
(
<Suspense>
{{
default: () => Component,
fallback: () => <div>Page loading...</div>,
}}
</Suspense>
)),
}}
</RouterView>
</div>
<hr />
<footer>
<div class="bottom">
<div>
<a href="/">djledda.net</a> {new Date().getFullYear()}<span class="dot">·</span><DjEmail>{() => "Contact"}</DjEmail><span class="dot">·</span><a href="/blog/djblog.rss">RSS Feed</a>
</div>
</div>
</footer>
</div>
</>
);
},
});

12
app/blog/client.ts Normal file
View File

@@ -0,0 +1,12 @@
import { createSSRApp } from "vue";
import { createRouter, createWebHistory } from "vue-router";
import DjBlogRoot, { routes } from "@/blog//DjBlogRoot.tsx";
import { cssRegistry } from "@/util.ts";
createSSRApp(DjBlogRoot)
.provide(cssRegistry, new Set())
.use(createRouter({
routes,
history: createWebHistory("/blog"),
}))
.mount("#app-root");

16
app/blog/index.html Normal file
View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/static/theme.css">
<meta name="description" content="dj blog - djledda's blog">
<!-- SSR HEAD OUTLET -->
</head>
<body>
<div id="app-root"><!-- SSR OUTLET --></ div>
</body>
</html>

12
app/blog/server.ts Normal file
View File

@@ -0,0 +1,12 @@
import { createSSRApp } from "vue";
import DjBlogRoot, { routes } from "@/blog/DjBlogRoot.tsx";
import { createMemoryHistory, createRouter } from "vue-router";
export default function createApp() {
const router = createRouter({
routes: routes,
history: createMemoryHistory("/blog"),
});
const app = createSSRApp(DjBlogRoot).use(router);
return { app, router };
}

8
app/domParse.ts Normal file
View File

@@ -0,0 +1,8 @@
import { inject } from "vue";
export default function getDomParser() {
return inject(
"dom-parse",
(innerHTML: string) => Object.assign(document.createElement("div"), { innerHTML }),
);
}

View File

@@ -1,22 +1,20 @@
import { defineComponent } from "vue"; import { defineComponent } from "vue";
import { RouterLink } from "vue-router"; import { RouterLink } from "vue-router";
import DJEmail from "@/DJEmail.tsx"; import DjEmail from "@/DjEmail.tsx";
import useHead from "@/useHead.ts"; import useHead from "@/useHead.ts";
import useAsyncState from "@/useAsyncState.ts"; import useAsyncState from "@/useAsyncState.ts";
import getDJAPI from "@/api.ts"; import getDjAPI from "@/api.ts";
import DJTooltip from "@/DJTooltip.tsx"; import DjTooltip from "@/DjTooltip.tsx";
export default defineComponent({ export default defineComponent({
name: "ge-deutsch", name: "ge-deutsch",
async setup() { async setup() {
useHead({ title: "Ray Peat Artikel auf Deutsch" }); useHead({ title: "Ray Peat Artikel auf Deutsch" });
const { const rpArticles = useAsyncState("rp-articles", ({ hostUrl }) => getDjAPI(hostUrl, "/rp-articles"));
result: rpArticles,
stateIsReady, await rpArticles.done;
} = useAsyncState("rp-articles", ({ hostUrl }) => getDJAPI(hostUrl, "/rp-articles"));
await stateIsReady;
return () => <> return () => <>
<header> <header>
<h1>Ray Peat Deutsche Übersetzungen</h1> <h1>Ray Peat Deutsche Übersetzungen</h1>
@@ -29,9 +27,9 @@ export default defineComponent({
<h2>Artikelliste</h2> <h2>Artikelliste</h2>
<div class="text-slab"> <div class="text-slab">
<ul id="article"> <ul id="article">
{rpArticles.value && rpArticles.value.map((_) => ( {rpArticles.result.value && rpArticles.result.value.map((_) => (
<li> <li>
<DJTooltip tooltip={`Englischer Titel: <em>»${ _.titleEn }«</em>`}> <DjTooltip tooltip={`Englischer Titel: <em>»${ _.titleEn }«</em>`}>
{_.tags?.includes('in-arbeit') {_.tags?.includes('in-arbeit')
? _.titleDe ? _.titleDe
: ( : (
@@ -40,7 +38,7 @@ export default defineComponent({
</RouterLink> </RouterLink>
)} )}
{_.tags?.map(tag => <span class="tag">{tag}</span>)} {_.tags?.map(tag => <span class="tag">{tag}</span>)}
</DJTooltip> </DjTooltip>
</li> </li>
))} ))}
</ul> </ul>
@@ -56,7 +54,7 @@ export default defineComponent({
<li><a href="http://raypeat.com/articles/articles/gelatin.shtml">Gelatin, stress, longevity</a></li> <li><a href="http://raypeat.com/articles/articles/gelatin.shtml">Gelatin, stress, longevity</a></li>
<li><a href="http://raypeat.com/articles/articles/unsaturatedfats.shtml">Unsaturated fatty acids: Nutritionally essential, or toxic?</a></li> <li><a href="http://raypeat.com/articles/articles/unsaturatedfats.shtml">Unsaturated fatty acids: Nutritionally essential, or toxic?</a></li>
</ul> </ul>
<DJEmail>Schick mir deine Vorschläge!</DJEmail> <DjEmail>Schick mir deine Vorschläge!</DjEmail>
</div> </div>
</section> </section>
<section> <section>
@@ -82,7 +80,7 @@ export default defineComponent({
<h3>Helfen</h3> <h3>Helfen</h3>
<p class="text-slab"> <p class="text-slab">
Falls was bei der Übersetzung auffällt oder besonders unidiomatisch klingt, bzw. der deutschen Falls was bei der Übersetzung auffällt oder besonders unidiomatisch klingt, bzw. der deutschen
Fachsprache der Medizin nicht gerecht sein sollte, kannst du mir unter <DJEmail />{" "} Fachsprache der Medizin nicht gerecht sein sollte, kannst du mir unter <DjEmail />{" "}
eine Mail senden. Meine Muttersprache ist schließlich Englisch und ich bin kein professioneller eine Mail senden. Meine Muttersprache ist schließlich Englisch und ich bin kein professioneller
Übersetzer! Übersetzer!
Falls jemand Hilfe leisten möchte, sag gerne Bescheid! Falls jemand Hilfe leisten möchte, sag gerne Bescheid!

View File

@@ -1,9 +1,9 @@
import { createTextVNode, computed, defineComponent, h, inject, onServerPrefetch, ref, type VNode, watchEffect } from "vue"; import { createTextVNode, computed, defineComponent, h, inject, ref, type VNode } from "vue";
import { RouterLink } from "vue-router"; import { RouterLink } from "vue-router";
import useAsyncState from "@/useAsyncState.ts"; import useAsyncState from "@/useAsyncState.ts";
import useHead from "@/useHead.ts"; import useHead from "@/useHead.ts";
import DJEmail from "@/DJEmail.tsx"; import DjEmail from "@/DjEmail.tsx";
import getDJAPI from "@/api.ts"; import getDjAPI from "@/api.ts";
export default defineComponent({ export default defineComponent({
name: "ge-deutsch-article", name: "ge-deutsch-article",
@@ -25,8 +25,8 @@ export default defineComponent({
(innerHTML: string) => Object.assign(document.createElement("div"), { innerHTML }), (innerHTML: string) => Object.assign(document.createElement("div"), { innerHTML }),
); );
const { result: articleContent, stateIsReady } = useAsyncState( const articleContent = useAsyncState(
"ge-deutsch-article-data", "ge-deutsch-article-content",
async ({ hostUrl }) => { async ({ hostUrl }) => {
const articleResponse = await fetch(`${hostUrl}/generative-energy/content/${props.articleName}.html`); const articleResponse = await fetch(`${hostUrl}/generative-energy/content/${props.articleName}.html`);
const result = await articleResponse.text(); const result = await articleResponse.text();
@@ -34,12 +34,9 @@ export default defineComponent({
}, },
); );
const { const articlesMetadata = useAsyncState('article-metadata', ({hostUrl}) => getDjAPI(hostUrl, '/rp-articles'));
result: articleData,
stateIsReady: articleDataReady,
} = useAsyncState('article-data', ({hostUrl}) => getDJAPI(hostUrl, '/rp-articles'));
const articleMetadata = computed(() => articleData.value?.find(_ => _.slug === props.articleName)); const articleMetadata = computed(() => articlesMetadata.result.value?.find(_ => _.slug === props.articleName));
useHead({ useHead({
title: () => articleMetadata.value?.title ?? '', title: () => articleMetadata.value?.title ?? '',
@@ -92,14 +89,14 @@ export default defineComponent({
} }
function ArticleContentTransformed() { function ArticleContentTransformed() {
if (articleContent.value) { if (articleContent.result.value) {
const dom = parseDom(articleContent.value); const dom = parseDom(articleContent.result.value);
return h("div", {}, [...dom.children].map((_) => transformArticleNode(_))); return h("div", {}, [...dom.children].map((_) => transformArticleNode(_)));
} }
return <div>Artikel lädt...</div>; return <div>Artikel lädt...</div>;
} }
await Promise.all([stateIsReady, articleDataReady]); await Promise.allSettled([ articleContent.done, articlesMetadata.done ]);
return () => ( return () => (
<div class="ge-article"> <div class="ge-article">
@@ -111,7 +108,7 @@ export default defineComponent({
</div> </div>
<p class="text-slab"> <p class="text-slab">
Bei dem untenstehenden Artikel handelt es sich um eine hobbymäßige, amateurhafte Übersetzung des Bei dem untenstehenden Artikel handelt es sich um eine hobbymäßige, amateurhafte Übersetzung des
Artikels { articleMetadata.value?.titleEn } von Ray Peat. Bei Ungenauigkeiten oder Fehlübersetzungen freue ich mich über <DJEmail>eine Mail</DJEmail>! Artikels { articleMetadata.value?.titleEn } von Ray Peat. Bei Ungenauigkeiten oder Fehlübersetzungen freue ich mich über <DjEmail>eine Mail</DjEmail>!
</p> </p>
{ articleMetadata.value?.tags?.includes('in-arbeit') && <h5 class="baustelle">🚧 Bitte beachte, dass diese Übersetzung noch in Arbeit ist! 🚧</h5> } { articleMetadata.value?.tags?.includes('in-arbeit') && <h5 class="baustelle">🚧 Bitte beachte, dass diese Übersetzung noch in Arbeit ist! 🚧</h5> }
<hr /> <hr />

View File

@@ -1,6 +1,6 @@
import { RouterLink } from "vue-router"; import { RouterLink } from "vue-router";
import useHead from "@/useHead.ts"; import useHead from "@/useHead.ts";
import DJTooltip from "@/DJTooltip.tsx"; import DjTooltip from "@/DjTooltip.tsx";
export default { export default {
name: "ge-main", name: "ge-main",
@@ -21,14 +21,14 @@ export default {
<div class="text-slab"> <div class="text-slab">
<ul> <ul>
<li> <li>
<DJTooltip tooltip="Convert to and from grains, set ratios, etc."> <DjTooltip tooltip="Convert to and from grains, set ratios, etc.">
<RouterLink to={{ name: "GECalculator" }}>Thyroid Calculator</RouterLink> <RouterLink to={{ name: "GECalculator" }}>Thyroid Calculator</RouterLink>
</DJTooltip> </DjTooltip>
</li> </li>
<li> <li>
<DJTooltip tooltip="A selection of articles by Ray that I have translated in my spare time into German."> <DjTooltip tooltip="A selection of articles by Ray that I have translated in my spare time into German.">
<RouterLink to={{ name: "GEDeutsch" }}>Ray Peat Articles in German</RouterLink> <RouterLink to={{ name: "GEDeutsch" }}>Ray Peat Articles in German</RouterLink>
</DJTooltip> </DjTooltip>
</li> </li>
</ul> </ul>
</div> </div>
@@ -36,14 +36,14 @@ export default {
<div class="text-slab"> <div class="text-slab">
<ul> <ul>
<li> <li>
<DJTooltip tooltip="Full text search of the majority of Ray's interviews. Extremely helpful and fun to use."> <DjTooltip tooltip="Full text search of the majority of Ray's interviews. Extremely helpful and fun to use.">
<a href="https://bioenergeic.life">bioenergetic.life - A Ray Peat Search Engine</a> <a href="https://bioenergeic.life">bioenergetic.life - A Ray Peat Search Engine</a>
</DJTooltip> </DjTooltip>
</li> </li>
<li> <li>
<DJTooltip tooltip="A mirror to Ray's website with many CSS issues fixed for improved readability. Also serves as a mirror should his site go down."> <DjTooltip tooltip="Ray's original website with articles and bookstore">
<a href="https://raypeat2.com">raypeat2.com - Mirror with Improved Readability</a> <a href="https://raypeat.com">raypeat.com</a>
</DJTooltip> </DjTooltip>
</li> </li>
</ul> </ul>
</div> </div>

View File

@@ -1,12 +1,12 @@
import { defineComponent, ref, Suspense, type VNode } from "vue"; import { defineComponent, ref, Suspense, type VNode } from "vue";
import { type RouteRecordRaw, RouterLink, RouterView, useRoute } from "vue-router"; import { type RouteRecordRaw, RouterLink, RouterView, useRoute } from "vue-router";
import GEMain from "@/generative-energy/GEMain.tsx"; import GEMain from "@/generative-energy/GEMain.tsx";
import DJEmail from "@/DJEmail.tsx"; import DjEmail from "@/DjEmail.tsx";
import GEDeutsch from "@/generative-energy/GEDeutsch.tsx"; import GEDeutsch from "@/generative-energy/GEDeutsch.tsx";
import GEDeutschArticle from "@/generative-energy/GEDeutschArticle.tsx"; import GEDeutschArticle from "@/generative-energy/GEDeutschArticle.tsx";
import GECalculator from "@/generative-energy/GECalculator.tsx"; import GECalculator from "@/generative-energy/GECalculator.tsx";
import DJDonate from "@/DJDonate.tsx"; import DjDonate from "@/DjDonate.tsx";
import { setupTooltip } from "@/DJTooltip.tsx"; import { setupTooltip } from "@/DjTooltip.tsx";
export const routes: RouteRecordRaw[] = [ export const routes: RouteRecordRaw[] = [
{ {
@@ -67,9 +67,9 @@ export default defineComponent({
<footer> <footer>
<div class="bottom"> <div class="bottom">
<div> <div>
<a href="/">djledda.de</a> 2024 - <DJEmail>{() => "Contact"}</DJEmail> <a href="/">djledda.net</a> {new Date().getFullYear()} - <DjEmail>{() => "Contact"}</DjEmail>
</div> </div>
<DJDonate /> <DjDonate />
</div> </div>
</footer> </footer>
</main> </main>

View File

@@ -1,102 +0,0 @@
import { defineComponent, computed, ref, type Ref } from "vue";
import useHead from "@/useHead.ts";
import DJTooltip, { setupTooltip } from "@/DJTooltip.tsx";
import DJEmail from "@/DJEmail.tsx";
export default defineComponent({
name: "app-root",
setup() {
useHead({ title: "DJ Ledda's Homepage" });
const tooltipCarrier = ref<HTMLDivElement | null>(null);
setupTooltip({ carrier: tooltipCarrier });
const dude1Spinning = ref(false);
const dude2Spinning = ref(false);
function toggleDude(event: MouseEvent, dudeRef: Ref<boolean>) {
const dude = event.target as HTMLImageElement;
if (dudeRef.value) {
dude.addEventListener("animationiteration", function listener() {
dudeRef.value = false;
dude.removeEventListener("animationiteration", listener as EventListenerOrEventListenerObject);
});
} else {
dudeRef.value = true;
}
}
const shaking = computed(() => dude1Spinning.value || dude2Spinning.value);
return () => <>
<div ref={tooltipCarrier} class="tooltip-carrier" />
<div class="supercontainer">
<div class={{ shakeable: true, shakeMe: shaking.value }}>
<div class="title_name">
<DJTooltip tooltip="I wonder what he's listening to?">
<img src="/home/img/dj.gif" alt="dj legt krasse Mucke auf"
class={{ dude: true, spinMe: dude1Spinning.value }}
onClick={ (e) => toggleDude(e, dude1Spinning)} />
</DJTooltip>
<DJTooltip tooltip="Easily the coolest guy out there.">
<span>DJ Ledda</span>
</DJTooltip>
<DJTooltip tooltip="I once heard this guy played at revs.">
<img src="/home/img/dj.gif" alt="dj laying down some sick beats"
class={{ dude: true, spinMe: dude2Spinning.value }}
onClick={ (e) => toggleDude(e, dude2Spinning) } />
</DJTooltip>
</div>
<div class="main">
<div class="subject">
<div class="resourcelist">
<a href="https://drum-slayer.com">
<DJTooltip class="resource" tooltip="Small app for designing multitrack looped rhythms with local save and multiple files. Originally built using just vanilla TypeScript and CSS, now with Vue.">
Drum Slayer
</DJTooltip>
</a>
<a href="/somaesque">
<DJTooltip class="resource" tooltip="Puzzle solver app for puzzle cubes resembling the original Soma Cube puzzle. Save and edit your own puzzles! Built with Svelte, THREE.js and AssemblyScript.">
Somaesque
</DJTooltip>
</a>
<a href="/generative-energy">
<DJTooltip class="resource" tooltip="Thyroid calculator, German translations, and more...">
Generative Energy - Ray Peat Resources
</DJTooltip>
</a>
<a href="/home/muenchen-auf-englisch.html">
<DJTooltip class="resource" tooltip="
Authentic historically accurate translations of all of Munich's S-Bahn and U-Bahn
stations, as well as the main municipalities, into English. You live in Allach? It's
Axleigh now. Giesing? Nope! Kyesing! This is a WIP.
">
M&uuml;nchen auf Englisch - Munich in English
</DJTooltip>
</a>
<a href="/kadi/">
<DJTooltip class="resource" tooltip="Make an account and start saving paper and tracking your Yatzy stats with your
friends! Make your own rulesets, and more. Built with React, express.js, and
MongoDB. Currently inactive.">
K A D I: Online Yatzy Scoresheets
</DJTooltip>
</a>
<a href="http://git.djledda.de/Ledda">
<DJTooltip class="resource" tooltip="Check out what I'm coding!">
My git projects
</DJTooltip>
</a>
<DJEmail>
<DJTooltip class="resource" tooltip="You'll see my address when you click here.">
Click here to get in touch
</DJTooltip>
</DJEmail>
</div>
</div>
</div>
<div id="tooltipCarrier"></div>
</div>
</div>
</>;
},
});

166
app/home/DjHomeRoot.tsx Normal file
View File

@@ -0,0 +1,166 @@
import { defineComponent, ref } from "vue";
import useHead from "@/useHead.ts";
import DjTooltip, { setupTooltip } from "@/DjTooltip.tsx";
import DjEmail from "@/DjEmail.tsx";
import { addCSS, css } from "@/util.ts";
const styles = css`
.dj-home-root {
margin: auto;
width: 500px;
display: flex;
flex-direction: column;
.resource {
margin-bottom: 10px;
}
.dj-title {
font-size: 48px;
margin: 20px auto;
color: var(--dj-palette3);
text-align: right;
white-space: nowrap;
display: flex;
flex-direction: row;
flex-flow: row-reverse;
overflow: hidden;
}
.underline {
text-decoration: underline solid var(--dj-palette3);
}
.pad {
color: var(--dj-bgpalette1);
}
.main {
margin: 20px auto;
text-align: left;
}
li {
list-style: disclosure-closed;
}
a {
color: var(--dj-palette3);
&:visited {
color: var(--dj-visited);
}
}
footer {
margin-left: 10px;
margin-bottom: 20px;
font-style: italic;
}
@media only screen and (max-width: 1024px) {
width: 100%;
.dj-title {
margin-right: 30px;
}
footer {
margin-bottom: 0;
}
}
}
`;
export default defineComponent({
name: "DjHomeRoot",
setup() {
addCSS('DjHomeRoot', styles);
useHead({ title: "djledda" });
const tooltipCarrier = ref<HTMLDivElement | null>(null);
setupTooltip({ carrier: tooltipCarrier });
return () => <>
<div ref={tooltipCarrier} class="tooltip-carrier" />
<div class="dj-home-root">
<div>
<div class="dj-title">
<DjTooltip tooltip="Easily the coolest guy out there.">
<div class="underline">
<span class="pad">_ _ _ _ _ _ _ __</span><span>dj ledda</span>
</div>
</DjTooltip>
</div>
<main class="main">
<ul class="resourcelist">
<li>
<a href="/blog">
<DjTooltip class="resource" tooltip="My musings, my losings, my winnings, my thoughts">
Blog
</DjTooltip>
</a>
</li>
<li>
<a href="/generative-energy">
<DjTooltip class="resource" tooltip="Thyroid calculator, German translations, and more...">
Generative Energy - Ray Peat Resources
</DjTooltip>
</a>
</li>
<li>
<a href="https://git.djledda.net/Ledda">
<DjTooltip class="resource" tooltip="Check out what I'm coding!">
My git projects
</DjTooltip>
</a>
</li>
<li>
<a href="/home/muenchen-auf-englisch.html">
<DjTooltip class="resource" tooltip="
Authentic historically accurate translations of all of Munich's S-Bahn and U-Bahn
stations, as well as the main municipalities, into English. You live in Allach? It's
Axleigh now. Giesing? Nope! Kyesing! This is a WIP.
">
M&uuml;nchen auf Englisch - Munich in English
</DjTooltip>
</a>
</li>
<li>
<a href="https://drum-slayer.com">
<DjTooltip class="resource" tooltip="Small app for designing multitrack looped rhythms with local save and multiple files. Originally built using just vanilla TypeScript and CSS, now with Vue.">
Drum Slayer
</DjTooltip>
</a>
</li>
<li>
<a href="/somaesque/index.html">
<DjTooltip class="resource" tooltip="Puzzle solver app for puzzle cubes resembling the original Soma Cube puzzle. Save and edit your own puzzles! Built with Svelte, THREE.js and AssemblyScript.">
Somaesque
</DjTooltip>
</a>
</li>
<li>
<a href="/kadi/">
<DjTooltip class="resource" tooltip="Make an account and start saving paper and tracking your Yatzy stats with your
friends! Make your own rulesets, and more. Built with React, express.js, and
MongoDB. Currently inactive.">
K A D I: Online Yatzy Scoresheets
</DjTooltip>
</a>
</li>
</ul>
</main>
</div>
<hr />
<footer>
<div class="bottom">
<div>
<a href="/">djledda.net</a> {new Date().getFullYear()} - <DjEmail>{() => "Contact"}</DjEmail>
</div>
</div>
</footer>
</div>
</>;
},
});

View File

@@ -1,7 +1,7 @@
import { createSSRApp } from "vue"; import { createSSRApp } from "vue";
import DJHomeRoot from "@/home/DJHomeRoot.tsx"; import DjHomeRoot from "@/home/DjHomeRoot.tsx";
import { cssRegistry } from "@/util.ts"; import { cssRegistry } from "@/util.ts";
createSSRApp(DJHomeRoot) createSSRApp(DjHomeRoot)
.provide(cssRegistry, new Set()) .provide(cssRegistry, new Set())
.mount("#app-root"); .mount("#app-root");

16
app/home/index.html Normal file
View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<link rel="icon" type="image/png" href="/favicon.png" sizes="256x256">
<link rel="icon" type="image/png" href="/favicon-small.png" sizes="32x32">
<link rel="stylesheet" href="/static/theme.css" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- SSR HEAD OUTLET -->
</head>
<body>
<div id="app-root"><!-- SSR OUTLET --></div>
</body>
</html>

View File

@@ -1,7 +1,7 @@
import { createSSRApp } from "vue"; import { createSSRApp } from "vue";
import DJHomeRoot from "@/home/DJHomeRoot.tsx"; import DjHomeRoot from "@/home/DjHomeRoot.tsx";
export default function createApp() { export default function createApp() {
const app = createSSRApp(DJHomeRoot); const app = createSSRApp(DjHomeRoot);
return { app, router: null }; return { app, router: null };
} }

View File

@@ -1,8 +1,7 @@
import { onMounted, onServerPrefetch, type ShallowRef, shallowRef } from "vue"; import { onMounted, onServerPrefetch, type ShallowRef, shallowRef } from "vue";
import useDJSSRContext from "@/useDJSSRContext.ts"; import useDjSSRContext from "@/useDjSSRContext.ts";
declare global { declare global {
// deno-lint-ignore no-var
var appstate: Partial<Record<string, unknown>>; var appstate: Partial<Record<string, unknown>>;
} }
@@ -10,8 +9,8 @@ export default function useAsyncState<T>(
key: string, key: string,
getter: (context: { hostUrl: string }) => Promise<T | null>, getter: (context: { hostUrl: string }) => Promise<T | null>,
options?: { suspensible: boolean }, options?: { suspensible: boolean },
): { result: ShallowRef<T | null>; stateIsReady: Promise<unknown> } { ): { result: ShallowRef<T | null>; done: Promise<void> } {
const ssrContext = useDJSSRContext(); const ssrContext = useDjSSRContext();
const isClient = typeof ssrContext === "undefined"; const isClient = typeof ssrContext === "undefined";
const registry = ssrContext?.registry ?? globalThis?.appstate; const registry = ssrContext?.registry ?? globalThis?.appstate;
@@ -51,5 +50,5 @@ export default function useAsyncState<T>(
} }
} }
return { result: state, stateIsReady: promise }; return { result: state, done: promise };
} }

View File

@@ -1,6 +1,6 @@
import { type MaybeRefOrGetter, useSSRContext } from "vue"; import { type MaybeRefOrGetter, useSSRContext } from "vue";
export type DJSSRContext = { export type DjSSRContext = {
head: { head: {
title: MaybeRefOrGetter<string>; title: MaybeRefOrGetter<string>;
metatags: MaybeRefOrGetter<Array<{ name: string, content: string }>>; metatags: MaybeRefOrGetter<Array<{ name: string, content: string }>>;
@@ -9,6 +9,6 @@ export type DJSSRContext = {
styles: Record<string, string>; styles: Record<string, string>;
}; };
export default function useDJSSRContext() { export default function useDjSSRContext() {
return useSSRContext<DJSSRContext>(); return useSSRContext<DjSSRContext>();
} }

View File

@@ -1,12 +1,12 @@
import { watch, toValue, type MaybeRefOrGetter } from 'vue'; import { watch, toValue, type MaybeRefOrGetter } from 'vue';
import useDJSSRContext from "@/useDJSSRContext.ts"; import useDjSSRContext from "@/useDjSSRContext.ts";
import { h } from "@/util.ts"; import { h } from "@/util.ts";
export default function useHead(params: { export default function useHead(params: {
title: MaybeRefOrGetter<string>, title: MaybeRefOrGetter<string>,
metatags?: MaybeRefOrGetter<Array<{ name: string, content: string }>> metatags?: MaybeRefOrGetter<Array<{ name: string, content: string }>>
}) { }) {
const context = useDJSSRContext(); const context = useDjSSRContext();
if (context) { if (context) {
context.head.title = params.title; context.head.title = params.title;

View File

@@ -1,5 +1,5 @@
import { type InjectionKey, inject } from 'vue'; import { type InjectionKey, inject } from 'vue';
import useDJSSRContext from "@/useDJSSRContext.ts"; import useDjSSRContext from "@/useDjSSRContext.ts";
export function gid(id: string, doc: (Document | ShadowRoot) | undefined) { export function gid(id: string, doc: (Document | ShadowRoot) | undefined) {
return ((doc ?? document).getElementById(id)); return ((doc ?? document).getElementById(id));
@@ -46,7 +46,7 @@ export function css(strs: TemplateStringsArray, ...vals: string[]) {
export const cssRegistry = Symbol('css-registry') as InjectionKey<Set<string>>; export const cssRegistry = Symbol('css-registry') as InjectionKey<Set<string>>;
export function addCSS(key: string, css: string) { export function addCSS(key: string, css: string) {
const context = useDJSSRContext(); const context = useDjSSRContext();
if (context && !context.styles[key]) { if (context && !context.styles[key]) {
context.styles[key] = css; context.styles[key] = css;
} else { } else {
@@ -58,21 +58,3 @@ export function addCSS(key: string, css: string) {
} }
} }
} }
/*
export class DJElement extends HTMLElement {
static styles: CSSStyleSheet;
static template: HTMLTemplateElement;
root: ShadowRoot;
constructor() {
super();
const statics = this.constructor as typeof DJElement;
this.root = this.attachShadow({ mode: "open" });
this.root.appendChild(statics.template.content.cloneNode(true));
this.root.adoptedStyleSheets = statics.styles ? [statics.styles] : [];
}
}
*/

View File

@@ -9,7 +9,12 @@
"indentWidth": 4 "indentWidth": 4
}, },
"imports": { "imports": {
"vue": "npm:vue@^3.5.12", "@b-fuze/deno-dom": "jsr:@b-fuze/deno-dom@^0.1.56",
"@deno/emit": "jsr:@deno/emit@^0.46.0",
"@std/fs": "jsr:@std/fs@^1.0.20",
"@std/http": "jsr:@std/http@^1.0.22",
"@std/path": "jsr:@std/path@^1.1.3",
"vue": "npm:vue@3.6.0-beta.1",
"vue-router": "npm:vue-router@4.4.5", "vue-router": "npm:vue-router@4.4.5",
"vue/jsx-runtime": "npm:vue/jsx-runtime", "vue/jsx-runtime": "npm:vue/jsx-runtime",
"@vue/devtools-api": "npm:@vue/devtools-api", "@vue/devtools-api": "npm:@vue/devtools-api",

369
deno.lock generated
View File

@@ -1,35 +1,44 @@
{ {
"version": "4", "version": "5",
"specifiers": { "specifiers": {
"jsr:@b-fuze/deno-dom@*": "0.1.48", "jsr:@b-fuze/deno-dom@~0.1.56": "0.1.56",
"jsr:@deno/cache-dir@0.13.2": "0.13.2", "jsr:@deno/cache-dir@0.13.2": "0.13.2",
"jsr:@deno/emit@*": "0.46.0", "jsr:@deno/emit@*": "0.46.0",
"jsr:@deno/emit@0.46": "0.46.0",
"jsr:@deno/graph@~0.73.1": "0.73.1", "jsr:@deno/graph@~0.73.1": "0.73.1",
"jsr:@denosaurs/plug@1.1.0": "1.1.0",
"jsr:@std/assert@0.223": "0.223.0", "jsr:@std/assert@0.223": "0.223.0",
"jsr:@std/bytes@0.223": "0.223.0", "jsr:@std/bytes@0.223": "0.223.0",
"jsr:@std/cli@^1.0.6": "1.0.6", "jsr:@std/cli@^1.0.24": "1.0.24",
"jsr:@std/encoding@^1.0.5": "1.0.5", "jsr:@std/encoding@1": "1.0.10",
"jsr:@std/encoding@^1.0.10": "1.0.10",
"jsr:@std/fmt@0.223": "0.223.0", "jsr:@std/fmt@0.223": "0.223.0",
"jsr:@std/fmt@^1.0.3": "1.0.3", "jsr:@std/fmt@1": "1.0.8",
"jsr:@std/fs@*": "0.223.0", "jsr:@std/fmt@^1.0.8": "1.0.8",
"jsr:@std/fs@0.223": "0.223.0", "jsr:@std/fs@0.223": "0.223.0",
"jsr:@std/http@*": "1.0.9", "jsr:@std/fs@1": "1.0.20",
"jsr:@std/fs@^1.0.20": "1.0.20",
"jsr:@std/html@^1.0.5": "1.0.5",
"jsr:@std/http@^1.0.22": "1.0.22",
"jsr:@std/internal@^1.0.12": "1.0.12",
"jsr:@std/io@0.223": "0.223.0", "jsr:@std/io@0.223": "0.223.0",
"jsr:@std/media-types@^1.0.3": "1.0.3", "jsr:@std/media-types@^1.1.0": "1.1.0",
"jsr:@std/net@^1.0.4": "1.0.4", "jsr:@std/net@^1.0.6": "1.0.6",
"jsr:@std/path@*": "1.0.7",
"jsr:@std/path@0.223": "0.223.0", "jsr:@std/path@0.223": "0.223.0",
"jsr:@std/path@^1.0.7": "1.0.7", "jsr:@std/path@1": "1.1.3",
"jsr:@std/streams@^1.0.7": "1.0.7", "jsr:@std/path@^1.1.3": "1.1.3",
"npm:@types/node@*": "22.5.4", "jsr:@std/streams@^1.0.14": "1.0.14",
"npm:@vue/devtools-api@*": "6.6.4", "npm:@vue/devtools-api@*": "6.6.4",
"npm:vue-router@4.4.5": "4.4.5_vue@3.5.12", "npm:vue-router@4.4.5": "4.4.5_vue@3.5.26",
"npm:vue@*": "3.5.12", "npm:vue@*": "3.5.26",
"npm:vue@^3.5.12": "3.5.12" "npm:vue@3.6.0-beta.1": "3.6.0-beta.1_@vue+runtime-dom@3.6.0-beta.1"
}, },
"jsr": { "jsr": {
"@b-fuze/deno-dom@0.1.48": { "@b-fuze/deno-dom@0.1.56": {
"integrity": "bf5b591aef2e9e9c59adfcbb93a9ecd45bab5b7c8263625beafa5c8f1662e7da" "integrity": "8030e2dc1d8750f1682b53462ab893d9c3470f2287feecbe22f44a88c54ab148",
"dependencies": [
"jsr:@denosaurs/plug"
]
}, },
"@deno/cache-dir@0.13.2": { "@deno/cache-dir@0.13.2": {
"integrity": "c22419dfe27ab85f345bee487aaaadba498b005cce3644e9d2528db035c5454d", "integrity": "c22419dfe27ab85f345bee487aaaadba498b005cce3644e9d2528db035c5454d",
@@ -51,43 +60,63 @@
"@deno/graph@0.73.1": { "@deno/graph@0.73.1": {
"integrity": "cd69639d2709d479037d5ce191a422eabe8d71bb68b0098344f6b07411c84d41" "integrity": "cd69639d2709d479037d5ce191a422eabe8d71bb68b0098344f6b07411c84d41"
}, },
"@denosaurs/plug@1.1.0": {
"integrity": "eb2f0b7546c7bca2000d8b0282c54d50d91cf6d75cb26a80df25a6de8c4bc044",
"dependencies": [
"jsr:@std/encoding@1",
"jsr:@std/fmt@1",
"jsr:@std/fs@1",
"jsr:@std/path@1"
]
},
"@std/assert@0.223.0": { "@std/assert@0.223.0": {
"integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24"
}, },
"@std/bytes@0.223.0": { "@std/bytes@0.223.0": {
"integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8"
}, },
"@std/cli@1.0.6": { "@std/cli@1.0.24": {
"integrity": "d22d8b38c66c666d7ad1f2a66c5b122da1704f985d3c47f01129f05abb6c5d3d" "integrity": "b655a5beb26aa94f98add6bc8889f5fb9bc3ee2cc3fc954e151201f4c4200a5e"
}, },
"@std/encoding@1.0.5": { "@std/encoding@1.0.10": {
"integrity": "ecf363d4fc25bd85bd915ff6733a7e79b67e0e7806334af15f4645c569fefc04" "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1"
}, },
"@std/fmt@0.223.0": { "@std/fmt@0.223.0": {
"integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208" "integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208"
}, },
"@std/fmt@1.0.3": { "@std/fmt@1.0.8": {
"integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f" "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7"
}, },
"@std/fs@0.223.0": { "@std/fs@0.223.0": {
"integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c", "integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c"
},
"@std/fs@1.0.20": {
"integrity": "e953206aae48d46ee65e8783ded459f23bec7dd1f3879512911c35e5484ea187",
"dependencies": [ "dependencies": [
"jsr:@std/assert", "jsr:@std/internal",
"jsr:@std/path@0.223" "jsr:@std/path@^1.1.3"
] ]
}, },
"@std/http@1.0.9": { "@std/html@1.0.5": {
"integrity": "d409fc319a5e8d4a154e576c758752e9700282d74f31357a12fec6420f9ecb6c", "integrity": "4e2d693f474cae8c16a920fa5e15a3b72267b94b84667f11a50c6dd1cb18d35e"
},
"@std/http@1.0.22": {
"integrity": "53f0bb70e23a2eec3e17c4240a85bb23d185b2e20635adb37ce0f03cc4ca012a",
"dependencies": [ "dependencies": [
"jsr:@std/cli", "jsr:@std/cli",
"jsr:@std/encoding", "jsr:@std/encoding@^1.0.10",
"jsr:@std/fmt@^1.0.3", "jsr:@std/fmt@^1.0.8",
"jsr:@std/fs@^1.0.20",
"jsr:@std/html",
"jsr:@std/media-types", "jsr:@std/media-types",
"jsr:@std/net", "jsr:@std/net",
"jsr:@std/path@^1.0.7", "jsr:@std/path@^1.1.3",
"jsr:@std/streams" "jsr:@std/streams"
] ]
}, },
"@std/internal@1.0.12": {
"integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027"
},
"@std/io@0.223.0": { "@std/io@0.223.0": {
"integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1",
"dependencies": [ "dependencies": [
@@ -95,11 +124,11 @@
"jsr:@std/bytes" "jsr:@std/bytes"
] ]
}, },
"@std/media-types@1.0.3": { "@std/media-types@1.1.0": {
"integrity": "b12d30a7852f7578f4d210622df713bbfd1cbdd9b4ec2eaf5c1845ab70bab159" "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4"
}, },
"@std/net@1.0.4": { "@std/net@1.0.6": {
"integrity": "2f403b455ebbccf83d8a027d29c5a9e3a2452fea39bb2da7f2c04af09c8bc852" "integrity": "110735f93e95bb9feb95790a8b1d1bf69ec0dc74f3f97a00a76ea5efea25500c"
}, },
"@std/path@0.223.0": { "@std/path@0.223.0": {
"integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989",
@@ -107,139 +136,228 @@
"jsr:@std/assert" "jsr:@std/assert"
] ]
}, },
"@std/path@1.0.7": { "@std/path@1.1.3": {
"integrity": "76a689e07f0e15dcc6002ec39d0866797e7156629212b28f27179b8a5c3b33a1" "integrity": "b015962d82a5e6daea980c32b82d2c40142149639968549c649031a230b1afb3",
"dependencies": [
"jsr:@std/internal"
]
}, },
"@std/streams@1.0.7": { "@std/streams@1.0.14": {
"integrity": "1a93917ca0c58c01b2bfb93647189229b1702677f169b6fb61ad6241cd2e499b" "integrity": "c0df6cdd73bd4bbcbe4baa89e323b88418c90ceb2d926f95aa99bdcdbfca2411"
} }
}, },
"npm": { "npm": {
"@babel/helper-string-parser@7.25.9": { "@babel/helper-string-parser@7.27.1": {
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="
}, },
"@babel/helper-validator-identifier@7.25.9": { "@babel/helper-validator-identifier@7.28.5": {
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="
}, },
"@babel/parser@7.26.2": { "@babel/parser@7.28.5": {
"integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
"dependencies": [ "dependencies": [
"@babel/types" "@babel/types"
] ],
"bin": true
}, },
"@babel/types@7.26.0": { "@babel/types@7.28.5": {
"integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
"dependencies": [ "dependencies": [
"@babel/helper-string-parser", "@babel/helper-string-parser",
"@babel/helper-validator-identifier" "@babel/helper-validator-identifier"
] ]
}, },
"@jridgewell/sourcemap-codec@1.5.0": { "@jridgewell/sourcemap-codec@1.5.5": {
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
}, },
"@types/node@22.5.4": { "@vue/compiler-core@3.5.26": {
"integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", "integrity": "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==",
"dependencies": [
"undici-types"
]
},
"@vue/compiler-core@3.5.12": {
"integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
"dependencies": [ "dependencies": [
"@babel/parser", "@babel/parser",
"@vue/shared", "@vue/shared@3.5.26",
"entities", "entities",
"estree-walker", "estree-walker",
"source-map-js" "source-map-js"
] ]
}, },
"@vue/compiler-dom@3.5.12": { "@vue/compiler-core@3.6.0-beta.1": {
"integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", "integrity": "sha512-Oiki36gKyoxc0pPnazo83coH6I4KTenCbhcMjALVo+vhz3cPVylo5Y5PyzX/u45IiMHc/25t492VB6CrFYKEgQ==",
"dependencies": [
"@vue/compiler-core",
"@vue/shared"
]
},
"@vue/compiler-sfc@3.5.12": {
"integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
"dependencies": [ "dependencies": [
"@babel/parser", "@babel/parser",
"@vue/compiler-core", "@vue/shared@3.6.0-beta.1",
"@vue/compiler-dom", "entities",
"@vue/compiler-ssr", "estree-walker",
"@vue/shared", "source-map-js"
]
},
"@vue/compiler-dom@3.5.26": {
"integrity": "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==",
"dependencies": [
"@vue/compiler-core@3.5.26",
"@vue/shared@3.5.26"
]
},
"@vue/compiler-dom@3.6.0-beta.1": {
"integrity": "sha512-6fbQSyjk6tdJO6UOvOtVl1BHw3CuzKSeNRU84LXvlyqm4K1LWJwKaceu5RZyi8+cFusuxtArpH6dwx9cPbejAg==",
"dependencies": [
"@vue/compiler-core@3.6.0-beta.1",
"@vue/shared@3.6.0-beta.1"
]
},
"@vue/compiler-sfc@3.5.26": {
"integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==",
"dependencies": [
"@babel/parser",
"@vue/compiler-core@3.5.26",
"@vue/compiler-dom@3.5.26",
"@vue/compiler-ssr@3.5.26",
"@vue/shared@3.5.26",
"estree-walker", "estree-walker",
"magic-string", "magic-string",
"postcss", "postcss",
"source-map-js" "source-map-js"
] ]
}, },
"@vue/compiler-ssr@3.5.12": { "@vue/compiler-sfc@3.6.0-beta.1": {
"integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", "integrity": "sha512-ntC1t5lbbbA5122ONOVQiQVXgDwJQ/xkB/KGUpP7e59An9m/I2CONRtAEB9wB6QQmMMP4ThoOuRH9+t2o6dqjQ==",
"dependencies": [ "dependencies": [
"@vue/compiler-dom", "@babel/parser",
"@vue/shared" "@vue/compiler-core@3.6.0-beta.1",
"@vue/compiler-dom@3.6.0-beta.1",
"@vue/compiler-ssr@3.6.0-beta.1",
"@vue/compiler-vapor",
"@vue/shared@3.6.0-beta.1",
"estree-walker",
"magic-string",
"postcss",
"source-map-js"
]
},
"@vue/compiler-ssr@3.5.26": {
"integrity": "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==",
"dependencies": [
"@vue/compiler-dom@3.5.26",
"@vue/shared@3.5.26"
]
},
"@vue/compiler-ssr@3.6.0-beta.1": {
"integrity": "sha512-8hvHjcNPcKYto87/vRCxFFCp6FEg9HAA/oQHQ6DZQe70xnJguCPvYhh+e59HuywN4E68RBOIPC9IYTXenTaIWA==",
"dependencies": [
"@vue/compiler-dom@3.6.0-beta.1",
"@vue/shared@3.6.0-beta.1"
]
},
"@vue/compiler-vapor@3.6.0-beta.1": {
"integrity": "sha512-NW1FMqjag5fPVf8uK199gw5qFzPBNc4OghchSffS7D2UOs5QMzIpC4XevGA5DeGEuxhpuG9ckisGN2r9BsnTzQ==",
"dependencies": [
"@babel/parser",
"@vue/compiler-dom@3.6.0-beta.1",
"@vue/shared@3.6.0-beta.1",
"estree-walker",
"source-map-js"
] ]
}, },
"@vue/devtools-api@6.6.4": { "@vue/devtools-api@6.6.4": {
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
}, },
"@vue/reactivity@3.5.12": { "@vue/reactivity@3.5.26": {
"integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", "integrity": "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==",
"dependencies": [ "dependencies": [
"@vue/shared" "@vue/shared@3.5.26"
] ]
}, },
"@vue/runtime-core@3.5.12": { "@vue/reactivity@3.6.0-beta.1": {
"integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", "integrity": "sha512-IbmZR0/UVlfRgDE8oVERx8pmYpG0CtE8CWfkdrnjnQckuCoImXCn7W9HiShzmmDNus371hGw6cXCctjQL7hkZw==",
"dependencies": [ "dependencies": [
"@vue/reactivity", "@vue/shared@3.6.0-beta.1"
"@vue/shared"
] ]
}, },
"@vue/runtime-dom@3.5.12": { "@vue/runtime-core@3.5.26": {
"integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", "integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==",
"dependencies": [ "dependencies": [
"@vue/reactivity", "@vue/reactivity@3.5.26",
"@vue/runtime-core", "@vue/shared@3.5.26"
"@vue/shared", ]
},
"@vue/runtime-core@3.6.0-beta.1": {
"integrity": "sha512-UtZCF+rPSPsKQUTOwB3EHd2y8mY9lD6nr78Gt/fqwnSdxaXY0ksbhc1Q9BjHZPaDMpn8NKzQKlMXf/h1w8VMkg==",
"dependencies": [
"@vue/reactivity@3.6.0-beta.1",
"@vue/shared@3.6.0-beta.1"
]
},
"@vue/runtime-dom@3.5.26": {
"integrity": "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==",
"dependencies": [
"@vue/reactivity@3.5.26",
"@vue/runtime-core@3.5.26",
"@vue/shared@3.5.26",
"csstype" "csstype"
] ]
}, },
"@vue/server-renderer@3.5.12_vue@3.5.12": { "@vue/runtime-dom@3.6.0-beta.1": {
"integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", "integrity": "sha512-+vv8WwxSFzXzjXWvZ92q1ec13fp+RBtAiOTu7M5dWRLqsDEHuVnuzmPB5O+gmiNU0YViLEXP5c/+gDCP3y5yUw==",
"dependencies": [ "dependencies": [
"@vue/compiler-ssr", "@vue/reactivity@3.6.0-beta.1",
"@vue/shared", "@vue/runtime-core@3.6.0-beta.1",
"vue" "@vue/shared@3.6.0-beta.1",
"csstype"
] ]
}, },
"@vue/shared@3.5.12": { "@vue/runtime-vapor@3.6.0-beta.1_@vue+runtime-dom@3.6.0-beta.1": {
"integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==" "integrity": "sha512-XVethfYDcowADbaq1XVEq6BAqnpKgc/75WL5xjy2ChwEB9slMa7B2PBpGSGwvEKKsNyAapYQoa/af5fyogaSlw==",
"dependencies": [
"@vue/reactivity@3.6.0-beta.1",
"@vue/runtime-dom@3.6.0-beta.1",
"@vue/shared@3.6.0-beta.1"
]
}, },
"csstype@3.1.3": { "@vue/server-renderer@3.5.26_vue@3.5.26": {
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" "integrity": "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==",
"dependencies": [
"@vue/compiler-ssr@3.5.26",
"@vue/shared@3.5.26",
"vue@3.5.26"
]
}, },
"entities@4.5.0": { "@vue/server-renderer@3.6.0-beta.1_vue@3.6.0-beta.1__@vue+runtime-dom@3.6.0-beta.1": {
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" "integrity": "sha512-MpjAiqP/4JTDMswoDSWyS1PCDzR9+ud2aRAOhvtlpnsuNFLwYbf8tNOiPd3x3gty8ghWYMyKCP4isQHNcPRmLA==",
"dependencies": [
"@vue/compiler-ssr@3.6.0-beta.1",
"@vue/shared@3.6.0-beta.1",
"vue@3.6.0-beta.1_@vue+runtime-dom@3.6.0-beta.1"
]
},
"@vue/shared@3.5.26": {
"integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A=="
},
"@vue/shared@3.6.0-beta.1": {
"integrity": "sha512-M+JCCPvuXgRGkgRYQ9LISH8eJXlQgz862OBtO2n7Ef2cyz+DgLQTGfZoNzf3WbVnNUP9/5x7/O0P1ED42IDCCw=="
},
"csstype@3.2.3": {
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="
},
"entities@7.0.0": {
"integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="
}, },
"estree-walker@2.0.2": { "estree-walker@2.0.2": {
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
}, },
"magic-string@0.30.12": { "magic-string@0.30.21": {
"integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dependencies": [ "dependencies": [
"@jridgewell/sourcemap-codec" "@jridgewell/sourcemap-codec"
] ]
}, },
"nanoid@3.3.7": { "nanoid@3.3.11": {
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"bin": true
}, },
"picocolors@1.1.1": { "picocolors@1.1.1": {
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
}, },
"postcss@8.4.47": { "postcss@8.5.6": {
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"dependencies": [ "dependencies": [
"nanoid", "nanoid",
"picocolors", "picocolors",
@@ -249,33 +367,46 @@
"source-map-js@1.2.1": { "source-map-js@1.2.1": {
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
}, },
"undici-types@6.19.8": { "vue-router@4.4.5_vue@3.5.26": {
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
},
"vue-router@4.4.5_vue@3.5.12": {
"integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==", "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==",
"dependencies": [ "dependencies": [
"@vue/devtools-api", "@vue/devtools-api",
"vue" "vue@3.5.26"
] ]
}, },
"vue@3.5.12": { "vue@3.5.26": {
"integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
"dependencies": [ "dependencies": [
"@vue/compiler-dom", "@vue/compiler-dom@3.5.26",
"@vue/compiler-sfc", "@vue/compiler-sfc@3.5.26",
"@vue/runtime-dom", "@vue/runtime-dom@3.5.26",
"@vue/server-renderer", "@vue/server-renderer@3.5.26_vue@3.5.26",
"@vue/shared" "@vue/shared@3.5.26"
]
},
"vue@3.6.0-beta.1_@vue+runtime-dom@3.6.0-beta.1": {
"integrity": "sha512-z2VKatkexJ9XZ/eYbUUQaitaYC1MpTtE+7zESy7bBvfcExlF5ubBmCB001I6GznEw4vRR1WMZbDqT482QJEJHw==",
"dependencies": [
"@vue/compiler-dom@3.6.0-beta.1",
"@vue/compiler-sfc@3.6.0-beta.1",
"@vue/runtime-dom@3.6.0-beta.1",
"@vue/runtime-vapor",
"@vue/server-renderer@3.6.0-beta.1_vue@3.6.0-beta.1__@vue+runtime-dom@3.6.0-beta.1",
"@vue/shared@3.6.0-beta.1"
] ]
} }
}, },
"workspace": { "workspace": {
"dependencies": [ "dependencies": [
"jsr:@b-fuze/deno-dom@~0.1.56",
"jsr:@deno/emit@0.46",
"jsr:@std/fs@^1.0.20",
"jsr:@std/http@^1.0.22",
"jsr:@std/path@^1.1.3",
"npm:@vue/devtools-api@*", "npm:@vue/devtools-api@*",
"npm:vue-router@4.4.5", "npm:vue-router@4.4.5",
"npm:vue@*", "npm:vue@*",
"npm:vue@^3.5.12" "npm:vue@3.6.0-beta.1"
] ]
} }
} }

View File

@@ -1,6 +0,0 @@
import "jsr:@deno/emit";
import "jsr:@std/http";
import "vue";
import "jsr:@b-fuze/deno-dom";
import "jsr:@std/fs";
import "jsr:@std/path";

59
font-shortlist.txt Normal file
View File

@@ -0,0 +1,59 @@
Abhaya Libre
Alegreya
Alice
Amethysta
Antic Didone
Bacasime Antique
Baskervville
Batang
Bellefair
Benne
Bodoni Moda
Bona Nova
Cactus Classical Serif
Caudex
Charmonman
Chiron Sung HK
Cormorant
> Cormorant Garamond
> Cormorant Infant
EB Garamond
Estonia
Flamenco
Fondamento
Forum
Gentium PLus
GFS Didot
Grandiflora One
Gulzar
Ibarra Real Nova
IM FELL Double Pica
> IM FELL DW Pica
Jacques Fancois
KoHo
KoPub Batang
Lancelot
Libertinus Serif Display
Linden Hill
Lora
Milonga
Namdhinggo
NanumMyeongjo
Newsreader
Parastoo
Platwrite ED Deco
> Playwrite ID
> Playwrite IT Moderna
> Playwrite PE
Prata
Rosarivo
Scheherazade New
Sedan
Shippori Mincho B1
Spectral
Srisakdi
Tai Heritage Pro
Unna
Ysabeau Infant
Yuji Syuku
Zen Old Mincho

4
font-shortlist2.txt Normal file
View File

@@ -0,0 +1,4 @@
Baskervville
\

132
main.ts
View File

@@ -1,20 +1,104 @@
import { serveFile } from "jsr:@std/http/file-server"; import { serveFile } from "@std/http/file-server";
import { STATUS_TEXT } from "jsr:@std/http/status"; import { STATUS_TEXT } from "@std/http/status";
import { type App, toValue } from "vue"; import { type App, toValue } from "vue";
import { type Router } from "vue-router"; import { type Router } from "vue-router";
import { renderToString } from "vue/server-renderer"; import { renderToString } from "vue/server-renderer";
import transpileResponse from "./transpile.ts"; import transpileResponse from "./transpile.ts";
import { DOMParser } from "jsr:@b-fuze/deno-dom"; import { DOMParser } from "@b-fuze/deno-dom";
import { join } from "jsr:@std/path/join"; import { join } from "@std/path/join";
import { exists } from "jsr:@std/fs"; import { exists } from "@std/fs";
import { type DJSSRContext } from "@/useDJSSRContext.ts"; import { type DjSSRContext } from "@/useDjSSRContext.ts";
import { type DJAPIResult, type DJAPIResultMap } from "@/api.ts"; import { type DjAPIResult, type DjAPIResultMap } from "@/api.ts";
const utf8Decoder = new TextDecoder("utf-8"); const utf8Decoder = new TextDecoder("utf-8");
const HOST = 'https://djledda.net';
const parser = new DOMParser(); const parser = new DOMParser();
function appHeaderScript(params: { ssrContext: DJSSRContext, entryPath: string }) { async function getBlogEntries() {
const paths: string[] = [];
const contentDir = './public/blog/content/';
for await (const dirEnt of Deno.readDir(contentDir)) {
if (dirEnt.isFile && dirEnt.name.endsWith('.html')) {
paths.push(`${contentDir}${dirEnt.name}`);
}
}
const result: DjAPIResultMap['/blog-entries'] = [];
for (const filePath of paths) {
const content = await Deno.readTextFile(filePath);
const dom = parser.parseFromString(content, 'text/html');
const metadata = {
slug: '',
tags: [] as string[],
guid: '',
title: '',
createdAt: '',
updatedAt: '',
teaser: `${ dom.querySelector('article')?.textContent.slice(0, 256).trimStart().trimEnd() }...`,
};
const metaTags = dom.querySelectorAll('meta') as unknown as NodeListOf<HTMLMetaElement>;
for (const metaTag of metaTags) {
const name = metaTag.attributes.getNamedItem('name')?.value ?? '';
const content = metaTag.attributes.getNamedItem('content')?.value ?? '';
if (name === 'title') {
metadata.title = content;
} else if (name === 'tags') {
metadata.tags = content ? content.split(",") : [];
} else if (name === 'guid') {
metadata.guid = content;
} else if (name === 'slug') {
metadata.slug = content;
} else if (name === 'updatedAt') {
metadata.createdAt = content;
} else if (name === 'createdAt') {
metadata.updatedAt = content;
}
}
result.push(metadata);
}
result.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
return result;
}
async function rss() {
const articles = await getBlogEntries();
return `<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>djledda's blog</title>
<description>djledda's personal blog</description>
<link>${ HOST }/blog</link>
<managingEditor>Daniel Ledda</managingEditor>
<image>
<title>djledda's blog</title>
<url>${ HOST }/favicon.png</url>
<link>${ HOST }/blog</link>
<description>djledda's personal blog</description>
</image>
<language>en-au</language>
<copyright>${ new Date().getFullYear() } djledda.net All rights reserved</copyright>
<lastBuildDate>${ new Date(articles.at(-1)!.updatedAt).toUTCString() }</lastBuildDate>
<pubDate>${ new Date(articles.at(-1)!.updatedAt).toUTCString() }</pubDate>
<ttl>1440</ttl>
${ articles.map(article => `<item>
<title>${ article.title }</title>
<link>${ HOST }/blog/post/${ article.slug }</link>
<pubDate>${ new Date(article.createdAt).toUTCString() }</pubDate>
<author>Daniel Ledda</author>
<description>${ article.teaser }</description>
<guid>${ article.guid }</guid>
</item>
`).join('')}
<atom:link href="${ HOST }/blog/djblog.rss" rel="self" type="application/rss+xml" />
</channel>
</rss>`;
}
function appHeaderScript(params: { ssrContext: DjSSRContext, entryPath: string }) {
return ` return `
<title>${ toValue(params.ssrContext.head.title) }</title> <title>${ toValue(params.ssrContext.head.title) }</title>
${ toValue(params.ssrContext.head.metatags).map(_ => `<meta name="${ _.name }" content="${ _.content }">`).join('\n\t') } ${ toValue(params.ssrContext.head.metatags).map(_ => `<meta name="${ _.name }" content="${ _.content }">`).join('\n\t') }
@@ -42,20 +126,19 @@ async function* siteEntries(path: string): AsyncGenerator<string> {
for await (const dirEnt of Deno.readDir(path)) { for await (const dirEnt of Deno.readDir(path)) {
if (dirEnt.isDirectory) { if (dirEnt.isDirectory) {
yield* siteEntries(join(path, dirEnt.name)); yield* siteEntries(join(path, dirEnt.name));
} else if (dirEnt.name === "index_template.html") { } else if (dirEnt.name === "index.html") {
yield path.split("/")[1] ?? ""; yield path.split("/")[1] ?? "";
} }
} }
} }
const publicFiles = siteEntries("public");
const sites: string[] = []; const sites: string[] = [];
for await (const path of publicFiles) { for await (const entry of siteEntries("app")) {
sites.push(path); sites.push(entry);
} }
async function getAPIResponse(apiReq: Request): Promise<Response> { async function getAPIResponse(apiReq: Request): Promise<Response> {
let jsonResponse: DJAPIResult | { error: string } | null = null; let jsonResponse: DjAPIResult | { error: string } | null = null;
let status = 200; let status = 200;
const pathname = URL.parse(apiReq.url)?.pathname; const pathname = URL.parse(apiReq.url)?.pathname;
@@ -76,7 +159,7 @@ async function getAPIResponse(apiReq: Request): Promise<Response> {
paths.push(`${contentDir}${dirEnt.name}`); paths.push(`${contentDir}${dirEnt.name}`);
} }
} }
const result: DJAPIResultMap['/rp-articles'] = []; const result: DjAPIResultMap['/rp-articles'] = [];
for (const filePath of paths) { for (const filePath of paths) {
const content = await Deno.readTextFile(filePath); const content = await Deno.readTextFile(filePath);
const dom = parser.parseFromString(content, 'text/html'); const dom = parser.parseFromString(content, 'text/html');
@@ -100,6 +183,8 @@ async function getAPIResponse(apiReq: Request): Promise<Response> {
} }
result.sort((a, b) => a.titleDe.localeCompare(b.titleDe)); result.sort((a, b) => a.titleDe.localeCompare(b.titleDe));
jsonResponse = result; jsonResponse = result;
} else if (apiPath === "/blog-entries") {
jsonResponse = await getBlogEntries();
} }
if (!jsonResponse) { if (!jsonResponse) {
@@ -155,6 +240,13 @@ Deno.serve({
response = await getAPIResponse(req); response = await getAPIResponse(req);
} }
// RSS
if (response === null) {
if (pathname === '/blog/djblog.rss') {
response = new Response(await rss(), { status: 200 });
}
}
// Public/static files // Public/static files
if (response === null) { if (response === null) {
let filepath = join(".", "public", pathname); let filepath = join(".", "public", pathname);
@@ -184,12 +276,12 @@ Deno.serve({
// SSR // SSR
if (response === null) { if (response === null) {
const baseDirectoryName = pathname.split("/")[1] ?? ""; let baseDirectoryName = pathname.split("/")[1] ?? "";
baseDirectoryName = baseDirectoryName === "" ? "home" : baseDirectoryName;
if (sites.includes(baseDirectoryName)) { if (sites.includes(baseDirectoryName)) {
const appLocation = baseDirectoryName === "" ? "home" : baseDirectoryName; const siteTemplate = join("app", baseDirectoryName, "index.html");
const siteTemplate = join("public", baseDirectoryName, "index_template.html"); const siteEntry = join("app", baseDirectoryName, "server.ts");
const siteEntry = join("app", appLocation, "server.ts"); const clientEntry = join("@", baseDirectoryName, "client.ts");
const clientEntry = join("@", appLocation, "client.ts");
const { app, router } = (await import("./" + siteEntry)).default() as { const { app, router } = (await import("./" + siteEntry)).default() as {
app: App; app: App;
router: Router | null; router: Router | null;
@@ -197,7 +289,7 @@ Deno.serve({
app.provide("dom-parse", (innerHTML: string) => { app.provide("dom-parse", (innerHTML: string) => {
return parser.parseFromString(innerHTML, "text/html").documentElement; return parser.parseFromString(innerHTML, "text/html").documentElement;
}); });
const ssrContext: DJSSRContext = { styles: {}, registry: {}, head: { title: "", metatags: [] } }; const ssrContext: DjSSRContext = { styles: {}, registry: {}, head: { title: "", metatags: [] } };
if (router) { if (router) {
await router.replace(pathname.split('/' + baseDirectoryName)[1]); await router.replace(pathname.split('/' + baseDirectoryName)[1]);
await router.isReady(); await router.isReady();

View File

@@ -0,0 +1,105 @@
<meta name="title" content="Poof, and it's gone">
<meta name="slug" content="poof-and-its-gone">
<meta name="createdAt" content="2025-12-20T17:54:05.000Z">
<meta name="updatedAt" content="2025-12-20T17:54:05.000Z">
<meta name="tags" content="">
<meta name="guid" content="4655d2b9-0c4b-4dd7-bf95-538d36166000">
<article>
<p>
Since reading Ray Peat's work and drastically improving my wellbeing&mdash;something that had been declining for years&mdash;I've
been thinking more and more often about the phenomenon of learned helplessness and its relevance in my own life. Sometimes,
looking back to past times can be useful to help reorient yourself in the present. In doing so, you can be better equipped to
aim towards a more desirable future. Sometimes, a new perspective or experience might instantly obliterate previous
behaviour without any concerted mental or physical gruntwork to eradicate it.
</p>
<p>
On the flipside, I have sometimes hopelessly tried to forcefully change my behaviour, employing all the en vogue
self-help tricks to form long-term habits, only to lose them just as quickly as they formed in the months that
followed. These kinds of experiences remind me of those hypnosis advertisements that claim they'll have you give up smoking
after just a few sessions; sometimes it's even after just one visit. There's no short supply of <i>miracle cure</i> stories
or reports of sudden, permanent breaks in addiction. Cold-turkey clean cuts that seem to arise with no obvious effort on
the part of the addict, no signs of worn willpower.
</p>
<p>
When I was sixteen I spent six weeks abroad in a small town called Marburg in Hesse, Germany. I spent that time
living with a new family along with my exchange student, Arne, who had been staying with my own family in Melbourne for
the same period of time just prior. Those were six exciting weeks of school, new acquaintances, a new language
(albeit one I had been "studying" in the Australian school system) and unfamiliar cultural quirks.
</p>
<p>
It was a barrage of stimulation, I came home every day from school and would collapse, totally exhausted, onto my
exchange student's bed, which had been graciously given to me to use for the duration of my stay. Even tough I was utterly <i>kaputt</i> it's not like I was actually expected to
<i>learn</i> anything or do any homework whilst I was at school here&mdash;I was basically on holidays and could really
have just treated it as such. Plenty of my own classmates who had also been on a very similar trip certainly did. I'm not sure many of them
learnt or used much German beyond <i>"Wo ist McDonalds?"</i> Thanks to a romantic summer fling,
I had been gradually becoming more fascinated with the structure of German before arriving. Once there, the Deutsch on the blackboard looked more like a sophisticated puzzle game than a
complete drag of a memorisation task, presumably aided by my younger, more language sensitive age at the time. Each day was a new game of detective guesswork, and better still, I got to play
with new ideas about how the language works each day in the schoolyard with the new friends I was making. New ways to
describe how things are situated in space, adverbs for how they move in relation to one another, mysterious new prefixes and other quaint linguistic
quirks, like the insane backwards word order of German&mdash;unlimited entertainment to see if I was up to
the challenge. I practically spent all my time in class ogling the immaculate chalk handwriting of the various teachers, I remember biology and German class in particular, and
trying to work out what on Earth was going on. For some strange reason, it was a kind of bliss.
</p>
<p>
On top of this, I was in the grade just above mine back home in Australia. Whilst that really shouldn't have made much
difference, the amount of responsibility and independence these kids were allowed to exercise at sixteen or seventeen was
nothing short of amazing to me at that age. I had never seen anything like it. Some of my classmates would stand out
the front of school during lunchtime and smoke a couple of cigarettes with their own teachers, something I find kind of insane
still to this day; it certainly would never have been acceptable back at home. Starting in the senior
school, you were allowed to just leave and go home if you didn't have anywhere to be, so long as you were back in time
for class. And we did. School uniforms simply weren't part of the culture either. For everyone else this perhaps just meant stressful decision making,
another way to play the oft cruel status games of teenagerhood, but for me it was like every day was casual dress day back
home. To top it all off, the legal drinking age in Germany is sixteen, at least for wine, beer, and other weaker drinks.
</p>
<p>
These classmates of mine were running their own meetings headed by the <i>Klassensprecher</i>, the class
representatives, and much unlike similar candidates back home, they actually seemed cool, they seemed like people I
might like to hang out with and befriend. Alongside decision making regarding general classroom organisation, they would
organise class bus trips: we saw a local band comprised of kids from the local schools, and for the first time in my life I drank
alcohol along with everybody else there, just hanging out and left to our own devices. It was a sense of freedom and self-responsibility
that wasn't afforded to me by the school system back home. Increasingly Australia, and especially Victoria, from which I
hail, is branded as a "nanny state", and my experiences in Germany reinforce that.
</p>
<p>
I really felt like I was in the midst of some sort of Hollywood production, an atmosphere that didn't quite seem tangible in
Australia. The intersection in the Venn diagram of taking on responsibility and having free reign was
vanishingly small amongst teenagers. Either you wagged class and maybe did drugs, or you obediently followed the rules. As the
years went by, the fine line between the two seemed to vanish further and further, at least that's how it looked from where I was standing.
</p>
<p>
Back in Australia, a routine had begun to solidify itself leading up to this trip. I would come home,
maybe do homework, and then browse Reddit and play hours of Team Fortress 2. I had racked up an impressive 2000
hours in-game. It seemed fairly inconsequential to me, and my high school friends, unlike primary school, were mostly
fragmented, and so on weeknights I didn't find myself hanging out with many people regularly. I did try to get Team Fortress
working on the old computer my host family had in Germany, just for fun, but to no avail. However, even whilst
attempting to get it set up, something about it began to seem like an entirely futile endeavour.
</p>
<p>
When I arrived back in Australia, it was as if a switch had been flipped. I all but stopped playing Team
Fortress, a regular staple of my free time. Practically overnight it seemed to have turned from being an incredibly
seductive way to pass the time to being a colossal <i>waste</i> of it. I just stopped playing cold turkey, and as far as I could tell, no
effort went in to the dissolution of that habit whatsoever.
</p>
<p>
I'm not exactly sure what facet of my overseas trip pushed me to change my behaviour so effortlessly, but I think it was
the culmination of all my experiences in that incredibly enriched environment. As I have looked back on those times over the past few years, especially since
discovering Ray, I can't help but think that I found myself in a "rat park" experiment during that time. Or I perhaps I was one of the rats
looking on, watching as others were freed from certain death by drowning. My habits in Australia suddenly seemed dull and useless, like I was stuck in
what the Germans call a <i>goldener Käfig</i> or <i>gilded cage</i>; basically inescapably trapped in an environment forged by
my own riches and good intentions. Participating in the foreign exchange program widened my horizons. I could see that what
I was missing out on indeed <i>was</i> possible, and I had the power to change my lifestyle.
</p>
<p>
It would be nice if I could now say that I've since enjoyed a deeply enriched life and it has been smooth sailing from there on out, that this turning point in my life catapulted me into nirvana. But alas
I wouldn't be a fan of Ray's if I never encountered a struggle or two along the way. But it seems to have profoundly changed the course of my
life for the better. Ever since then, I've found it extremely difficult to waste my days away without having a
sense of direction in my life. Although, this has been a source of anxiety, some time more than others. I certainly don't think I
would have found it so simple to move abroad and continue to learn German whilst living, studying, and working in Munich for
several years like I have been if I had never gone on that trip.
</p>
<p>
So I guess, in that respect, watching your fellow rats have a good time, in real life, might just get you to settle for
no less. One look at those old menial habits and&mdash;<i>poof</i>&mdash;they're gone. And for that I'm grateful.
</p>
</article>

View File

@@ -0,0 +1,291 @@
<meta name="title" content="The Straightjacket of Indecision">
<meta name="slug" content="straightjacket-of-indecision">
<meta name="createdAt" content="2026-01-18T20:00:00.000Z">
<meta name="updatedAt" content="2026-01-18T20:00:00.000Z">
<meta name="tags" content="">
<meta name="guid" content="5d3b68de-35fb-48da-8caf-8f6f1f6398f5">
<article>
<p>
Over the last six or seven years living abroad in the faraway place of
Munich, Germany, Ive often wondered when, or even whether, I might return
home to Melbourne, Australia. Even though I never spent much time
contemplating my distant future, my mother certainly didnt let me forget
that she wished to have me back at home sooner rather than later. I'd
listen to her talk in absolutes every return visit, “when youre back
next year…,” and so on. I shrugged it off as just motherly love. I'm
in Germany, Mum, and Im staying here for now!
</p>
<p>
Despite this, the thought in the back of my mind that this overseas
journey would in all likelihood be ephemeral proved to be a constant
burden. Wherever I went, whichever decision I made, the immense doubt
haunted me. Before the COVID pandemic, I had originally planned
to study my Masters, probably work a couple of years at a local
company “in the industry”, and then return home ideally feeling fulfilled and
satisfied. Like I had earnt some kind of imaginary certificate of
intercultural aptitude. Secretly however, I imagined falling in love
with a beautiful German girl and living in the idyllic Bavarian
countryside, happily ever after, even if I was unwilling to admit it
even to myself.
</p>
<p>
But given the retreat of pandemic-related restrictions and regulations was
so gradual, as were too the many changes in my life circumstances
in-between, it never seemed like quite the right time to draw a line in the
sand. It would seem I became the frog in boiling water.
</p>
<p>
Finally, maybe around late 2023, things seemed to have settled. I chose to
move into my own apartment, after my roommate moved in with his
girlfriend. It became clear to me that I would soon have to give serious
thought as to whether I wanted to return home, or if I wanted to seriously
commit to “being German.” The weight I was carrying was growing
heavier, and somehow I knew this was slowing me down. I just didn't
realise how much exactly.
</p>
<p>
In the first few years here, sure&mdash;it never made much sense to paint my
student dorm room or invest in expensive furniture, even once I began earning a
full-time salary&mdash;I figured I probably wouldnt be here much longer,
anyway. But as the years went by and the dorm rooms became my own rental
apartments, I could feel the desire to invest in long-term commitments grow
stronger within me. Actually bringing any of them to fruition, on the other
hand, seemed impossible. I could hardly bring myself to buy a
dishwasher for the longest time: moving countries could have always been
right around the corner, so I had better not waste the money and effort.
</p>
<p>
Never knowing when I was going to leave, I froze in the face of more
important decisions, even ones that might have promised to greatly improve
my quality of life, and that seemed frankly banal to outsiders. It plagued
the back of my mind when searching for the motivation to meet people or go
on dates. What if I eventually want to go home? Will she lose interest in me
because Im a flight risk?
</p>
<p>
Whenever I would meet someone in my daily life, they would inevitably
ask me whether I would like to stay in Germany forever or if I plan to
move home at some stage. Over the years, I learnt to come with
pre-prepared answers that suggested I was comfortable with my
open-ended life abroad. But I wasnt. I felt trapped, like I couldnt
go anywhere. Like I couldnt start any meaningful projects. I wanted to
take on so much more and feel resolute in each step. But I felt
suffocated by the idea that the rug would soon be pulled out from under
my feet.
</p>
<p>
I did however eventually start voicing the idea that, as long as I
dont meet anybody here that I come to love so much that I simply must
stay, it would be better for me to go home. That was the beginning of
the end, I suppose, but the thought was so limp in spirit that it
hardly made any difference in my life. Instead it was the perfect
excuse to remain undecided: at any moment, the love of my life could
waltz around the corner. Ironically, this straitjacket of indecision
all but prevented me from doing anything about my bachelorhood.
</p>
<p>
Things did improve; I grew adamant that I would break down old habits
that were once born of helplessness. I found it increasingly easier to
“just do things,” as the chronically online say, but there was an upper
limit to their magnitude. Such things as buying more expensive home
furnishings or making slightly more long-term commitments became easier
(think “one year” rather than “a couple of months”), but nonetheless I
stillfelt tremendously stuck.
</p>
<p>
In the summer of 2025, my parents visited and stayed with me for two
months, during which we went on many European trips alongside my daily
life in Munich. Afterwards, I joined them on the plane ride home and
visited Melbourne. This time, it was outside of the usual Christmas
holiday period so as to really get a sense of how life back home had
changed.
</p>
<p>
I stayed a month, bringing the total time spent with family and friends
to three months, which was a lot of time for me after having lived for
so long abroad. Alhoutgh I had visited for a month almost every year,
this time around felt a bit different. I felt like I was actually back
home, and not just peering through the window. Maybe it was the time of
year, maybe because of the high school reunion I attended, or maybe
even just due to how much time had passed since COVID. Whatever it was,
those three months made their mark. After saying our goodbyes at the
airport, I headed to stand in line at the first security checkpoint.
After turning the corner, I lost sight of my parents, and my heart
sank.
</p>
<p>
For the first time in seven years, something felt wrong. I didnt want
to leave any more. I realised that my time in Munich was over. After
two years of deliberating over the minutiae of my life and where I
lived, the epiphany seemed to come in an instant. It was emotional.
There was no logical breakthrough. No intellectual victory. I was just
homesick. After six years, no less.
</p>
<p>
Once I arrived back in Munich, everything about this charming place
became grossly annoying overnight. The northern winter annoyed me. The
people annoyed me. My job annoyed me. My entire surroundings were so
fastidious that I couldnt wait to get home. Even the German language
that has brought me so much joy to learn, to which I effortlessly
dedicated so much time and interest; even it became a nuisance. I
wanted my native tongue back. I wanted effortless freedom of expression
back. I was imprinted with a culture when I was younger and I just
wanted it back.
</p>
<p>
Paradoxically, though, I felt fully liberated all of a sudden. Free to
do whatever I wanted. Having made the decision to pack up and leave
filled me with such a profound sense of direction that everything else
was able to just slide into place, as if a circuit had been completed.
</p>
<p>
By forfeiting many potential futures for just one that I could count
on, the organisation of the rest of my life was able to spontaneously
emerge. I guess I always sensed this would happen, but I seriously
underestimated the ramifications. A cataclysmic domino effect resolved
a hierarchy of assumptions about who I was, where I was, and what I was
doing, running incredibly deep. Before, I was basically floundering.
Even though I could feel that I knew what feeling I wanted out of
life&mdash;and indeed I strove to work towards it&mash;I was
nonetheless totally directionless. And it was painful. Not so any more.
</p>
<p>
The irony of all this is that by making this decision, I suddenly feel
like <em>I know what Im doing here right now</em> and can arrange the
coming months accordingly. I feel freer that ever to date people in
Germany and with even more intention than I did before. I feel like I
have permission to take on any domestic projects I feel like. Isnt
that strange? I sure thought so. In all honesty I expected the opposite
outcome. But now theres a timeline: I can see how it all fits into the
grand plan.
</p>
<hr>
<p>
There are more reasons to move home, however, than just family and
friends, as important as they are to me. They were simply the more
obvious tip of the iceberg, as it were.
</p>
<p>
Trying to live in two cultures at once results in a kind of purgatory,
and I suppose I never quite committed to living in one or the other.
But over the last few years, especially upon contemplating the
physiological and psychological impact of learnt helplessness, it
became clear that there was a deep desire in me to self-actualise, and
that it should be given more serious attention. During my preteen and
early teen years, I was a prolific user of the Adobe suite, I loved to
draw, write stories, and produce music. I loved to make silly games and
build worlds with atmosphere. It was here where I was completely in my
element, and I sense deep within myself that I need to reprise these
pursuits. Alas, it would seem I can hardly find the time (or if I am
honest, the energy) to invest in them. I have mostly blamed this on my
day job, but it has become increasingly obvious that Im mostly
being stifled simply by <em>living alone in a foreign country</em>.
</p>
<p>
The purpose of a culture is apparently to obviate the need to think
about what to do as much as possible so as to free up energy for more
niche specialisation. Having to think about how to greet somebody, or
what is appropriate to do in public versus in private, or even what
amount and what type of conversation is appropriate, and with
whom&mdash;these are all things that are imparted simply by virtue of
growing up in a particular culture. They are acquired in similar
fashion to language (and some might say that these two are indeed
exactly the same thing). If it werent for these effortless
assumptions, it might become an exhausting moment-by-moment decision
making process, in perpetuity. The broader cultural context can take
care of much of this, both in the aforementioned sense of traditions
and customs as well as by making use of particular industrial
specialisations, such as manufacturing and the provision of services
and application of expertise. This way, you can focus on you, so you
can “relax into complexity”.
</p>
<p>
The imprinting of childhood seems especially important. It's possible,
and certainly proven in the case of language acquisition, that children
growing up with multiple cultural contexts in parallel find the
context-switching relatively painless and easy, if not equally as easy
as the monoculturally reared child. These additional cultures are like
an extra sub-context within a single culture. Being “German” is, for
example, another social language, with its own grammar, akin to
attending church versus going to a bar. And it, too, has multiple
manifestations.
</p>
<p>
But I am not a child of Germany. Neither is German my native tongue. I
may have long been a C2 speaker, and indeed, I live my life basically
incognito unless I explicitly mention my background&mdash;no one really
notices Im not from around here. Yet no matter how good my language
skills get, this mismatch still presents as an extra layer of
abstraction. For the programmers out there: I do not feel like Im
running on “bare metal” like I do back home. The extra latency becomes
cumulatively exhausting. Im running in an interpreter, playing life on
hard mode, when the opportunity to compile to machine code and switch
to normal mode (or even easy) is right at my fingertips.
</p>
<p>
I previously described my circumstances as a purgatory, and this is an
apt word to exemplify the cultural incongruencies. The word itself is
frequently used&mdash;but only in English speaking cultures&mdash;in a
looser sense to refer to a state of suffering that is almost always
temporary, before a type of finalising “decision” relieves oneself of
it. This is not so in other languages. Whilst the word and idea of a
purgatory do exist in German (<em>Fegefeuer</em>), they dont in this
metaphorical sense. Many other types of analogies, turns of phrases,
and cultural metaphors used in everyday life don't neatly map to one
another (even though some do, thanks to the more remotely shared
cultural and linguistic history).
</p>
<p>
Ive come to believe that you might have to fully relinquish one
cultural context for another in order to remove the extra cognitive
burden. That would entail essentially “giving up” Australia once and
for all to stay in Germany and focus on more specialised pursuits. Upon
reflection, I think I really did do this for a few years, whilst I was
still enthralled by the joy of learning a new language to proficiency,
but its novelty soon faded.
</p>
<p>
When I use my computer, I always have two keyboard layouts active,
depending on what Im doing. One for writing German prose and
messaging, and another with my “native” layout for everything else. I
originally figured this two-pronged approach would make things easier,
but really, it's constant chaos. Forever having one foot in each door
is the same kind of chaos.
</p>
<p>
As such, it now seems obvious to me that I have to return to a single
keyboard layout and go home. If I want to “relax into complexity,” then
I must free up as much energy as possible, and in making this decision
I can feel another entanglement of helplessness slowly unravel.
</p>
<p>
And this time, its a big one.
</p>
</article>

View File

@@ -0,0 +1,17 @@
<meta name="title" content="Milk in Context: Five Years of Ray PEat">
<meta name="slug" content="milk-in-context-five-years-ray-peat">
<meta name="createdAt" content="">
<meta name="updatedAt" content="">
<meta name="tags" content="">
<meta name="guid" content="ca23e27a-7c6d-40be-8b8d-9aba6711ad09">
<article>
<p>
Growing up with grandparents from rural Sardinia, I was sensitised at a
young age to the vast differences in lifestyle and worldview that came
with inheriting two cultures. Donkeys pulling carts, milking goats, and
festivals straight out of a fantasy novel featured regularly in the
stories that my Nonno and Nonna told me.
</p>
</article>

BIN
public/favicon-small.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View File

@@ -1,185 +0,0 @@
:root {
--subject-spacing: 40px;
}
html,
body {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
}
body {
background-color: #292929;
font-family: "Roboto", serif;
}
.title_name {
font-size: 50px;
color: floralwhite;
font-family: "Roboto Slab", "Times New Roman", Times, serif;
text-align: center;
}
.title_name img {
margin: 20px;
height: 100px;
width: auto;
vertical-align: middle;
}
.spinMe {
animation: spin 1s infinite linear;
}
.shakeMe {
animation: shake 0.2s infinite linear;
}
@keyframes shake {
0% {
transform: scale(1) translate(1px, 1px) rotate(0deg);
}
25% {
transform: scale(0.95) translate(-1px, -2px) rotate(-1deg);
}
50% {
transform: scale(0.9) translate(-3px, 0px) rotate(1deg);
}
75% {
transform: scale(0.95) translate(3px, 2px) rotate(0deg);
}
100% {
transform: scale(1) translate(-1px, 2px) rotate(-1deg);
}
}
@keyframes spin {
0% {
transform: rotate(0deg) scale(1);
filter: hue-rotate(0deg) saturate(5);
}
25% {
transform: rotate(90deg) scale(2);
}
50% {
transform: rotate(180deg) scale(1);
}
75% {
transform: rotate(270deg) scale(2);
}
100% {
transform: rotate(360deg) scale(1);
filter: hue-rotate(360deg) saturate(5);
}
}
.supercontainer {
padding-top: 3em;
margin: auto;
}
.main {
width: 50em;
margin: 20px auto;
text-align: center;
}
@media only screen and (max-width: 1024px) {
.main {
width: 35em;
padding: 20px;
}
:root {
--subject-spacing: 20px;
}
}
@media only screen and (max-width: 768px) {
.title_name img {
margin: 10px;
height: 60px;
width: auto;
}
.title_name {
font-size: 30px;
}
.main {
width: 20em;
padding: 20px;
}
}
span.subjecttitle {
height: 100%;
font-family: "Roboto Slab", "Times New Roman", Times, serif;
font-size: 20px;
padding-right: 5px;
}
.subject:first-child {
margin-top: 0;
}
.subject:last-child {
margin-bottom: 0;
}
.subject {
margin-top: var(--subject-spacing);
margin-bottom: var(--subject-spacing);
}
.resourcelist {
margin-top: 2px;
background-color: white;
border-style: solid;
border-color: #292929;
border-width: 1px;
border-radius: 5px;
a:first-of-type {
.resource {
padding: 15px 20px 10px 20px;
border-radius: 5px 5px 0 0;
}
}
a:last-of-type {
.resource {
padding: 10px 20px 15px 20px;
border-radius: 0 0 5px 5px;
}
}
a:only-of-type {
.resource {
border-radius: 5px;
}
}
}
.resource {
position: relative;
background-color: white;
padding: 10px 20px 10px 20px;
display: block;
color: #333333;
text-decorAtion: none;
transition: background-color 200ms;
}
.resource:hover {
background-color: #bde4ff;
}
.resource:active {
box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.50) inset;
}
a {
color: #000;
text-decoration: none;
cursor: pointer;
}

View File

@@ -1,17 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<link rel="icon" href="/home/icon.webp" />
<link rel="stylesheet" href="/home/main.css" />
<link rel="icon" href="/home/img/dj.gif" />
<link
href="https://fonts.googleapis.com/css2?family=Roboto&family=Roboto+Slab:wght@600&display=swap"
rel="stylesheet"
/>
<!-- SSR HEAD OUTLET -->
</head>
<body>
<div id="app-root"><!-- SSR OUTLET --></div>
</body>
</html>

0
public/manifest.json Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -0,0 +1,72 @@
html, body {
position: relative;
width: 100%;
height: 100%;
}
* {
box-sizing: border-box;
}
body {
color: #333;
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}
a {
color: rgb(0,100,200);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:visited {
color: rgb(0,80,160);
}
label {
display: block;
}
input, button, select, textarea {
font-family: inherit;
font-size: inherit;
-webkit-padding: 0.4em 0;
padding: 0.4em;
margin: 0 0 0.5em 0;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 2px;
}
input:disabled {
color: #ccc;
}
button {
color: #333;
background-color: #f4f4f4;
outline: none;
}
button:disabled {
color: #999;
}
button:not(:disabled):active {
background-color: #ddd;
}
button:focus {
border-color: #666;
}
::-webkit-scrollbar {
background-color: transparent;
}
::-webkit-scrollbar-thumb {
background-color: rgba(0,0,0,0.25);
}

View File

@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width,initial-scale=1'>
<title>Somaesque</title>
<link rel='icon' type='image/png' href='./favicon.png'>
<link rel='stylesheet' href='./global.css'>
<link rel='stylesheet' href='./build/bundle.css'>
<script defer src='./build/bundle.js'></script>
</head>
<script>
</script>
<body>
</body>
</html>

BIN
public/somaesque/main.wasm Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,674 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
o Cube_Cube.001
v 0.399961 0.500000 -0.399961
v 0.500000 0.399961 -0.399961
v 0.399961 0.399961 -0.500000
v 0.438244 0.492385 -0.399961
v 0.470699 0.470699 -0.399961
v 0.399961 0.492385 -0.438244
v 0.439203 0.483194 -0.439203
v 0.465612 0.465612 -0.437212
v 0.457718 0.457718 -0.457718
v 0.492385 0.399961 -0.438244
v 0.470699 0.399961 -0.470699
v 0.492385 0.438244 -0.399961
v 0.483194 0.439203 -0.439203
v 0.465612 0.437212 -0.465612
v 0.399961 0.438244 -0.492385
v 0.399961 0.470699 -0.470699
v 0.438244 0.399961 -0.492385
v 0.439203 0.439203 -0.483194
v 0.437212 0.465612 -0.465612
v 0.500000 -0.399961 -0.399961
v 0.399961 -0.500000 -0.399961
v 0.399961 -0.399961 -0.500000
v 0.492385 -0.438244 -0.399961
v 0.470699 -0.470699 -0.399961
v 0.492385 -0.399961 -0.438244
v 0.483194 -0.439203 -0.439203
v 0.465612 -0.465612 -0.437212
v 0.457718 -0.457718 -0.457718
v 0.399961 -0.492385 -0.438244
v 0.399961 -0.470699 -0.470699
v 0.438244 -0.492385 -0.399961
v 0.439203 -0.483194 -0.439203
v 0.437212 -0.465612 -0.465612
v 0.438244 -0.399961 -0.492385
v 0.470699 -0.399961 -0.470699
v 0.399961 -0.438244 -0.492385
v 0.439203 -0.439203 -0.483194
v 0.465612 -0.437212 -0.465612
v 0.500000 0.399961 0.399961
v 0.399961 0.500000 0.399961
v 0.399961 0.399961 0.500000
v 0.492385 0.438244 0.399961
v 0.470699 0.470699 0.399961
v 0.492385 0.399961 0.438244
v 0.483194 0.439203 0.439203
v 0.465612 0.465612 0.437212
v 0.457718 0.457718 0.457718
v 0.399961 0.492385 0.438244
v 0.399961 0.470699 0.470699
v 0.438244 0.492385 0.399961
v 0.439203 0.483194 0.439203
v 0.437212 0.465612 0.465612
v 0.438244 0.399961 0.492385
v 0.470699 0.399961 0.470699
v 0.399961 0.438244 0.492385
v 0.439203 0.439203 0.483194
v 0.465612 0.437212 0.465612
v 0.399961 -0.399961 0.500000
v 0.399961 -0.500000 0.399961
v 0.500000 -0.399961 0.399961
v 0.399961 -0.438244 0.492385
v 0.399961 -0.470699 0.470699
v 0.438244 -0.399961 0.492385
v 0.439203 -0.439203 0.483194
v 0.437212 -0.465612 0.465612
v 0.457718 -0.457718 0.457718
v 0.438244 -0.492385 0.399961
v 0.470699 -0.470699 0.399961
v 0.399961 -0.492385 0.438244
v 0.439203 -0.483194 0.439203
v 0.465612 -0.465612 0.437212
v 0.492385 -0.399961 0.438244
v 0.470699 -0.399961 0.470699
v 0.492385 -0.438244 0.399961
v 0.483194 -0.439203 0.439203
v 0.465612 -0.437212 0.465612
v -0.500000 0.399961 -0.399961
v -0.399961 0.500000 -0.399961
v -0.399961 0.399961 -0.500000
v -0.492385 0.438244 -0.399961
v -0.470699 0.470699 -0.399961
v -0.492385 0.399961 -0.438244
v -0.483194 0.439203 -0.439203
v -0.465612 0.465612 -0.437212
v -0.457718 0.457718 -0.457718
v -0.399961 0.492385 -0.438244
v -0.399961 0.470699 -0.470699
v -0.438244 0.492385 -0.399961
v -0.439203 0.483194 -0.439203
v -0.437212 0.465612 -0.465612
v -0.438244 0.399961 -0.492385
v -0.470699 0.399961 -0.470699
v -0.399961 0.438244 -0.492385
v -0.439203 0.439203 -0.483194
v -0.465612 0.437212 -0.465612
v -0.399961 -0.399961 -0.500000
v -0.399961 -0.500000 -0.399961
v -0.500000 -0.399961 -0.399961
v -0.399961 -0.438244 -0.492385
v -0.399961 -0.470699 -0.470699
v -0.438244 -0.399961 -0.492385
v -0.439203 -0.439203 -0.483194
v -0.437212 -0.465612 -0.465612
v -0.457718 -0.457718 -0.457718
v -0.438244 -0.492385 -0.399961
v -0.470699 -0.470699 -0.399961
v -0.399961 -0.492385 -0.438244
v -0.439203 -0.483194 -0.439203
v -0.465612 -0.465612 -0.437212
v -0.492385 -0.399961 -0.438244
v -0.470699 -0.399961 -0.470699
v -0.492385 -0.438244 -0.399961
v -0.483194 -0.439203 -0.439203
v -0.465612 -0.437212 -0.465612
v -0.500000 0.399961 0.399961
v -0.399961 0.399961 0.500000
v -0.399961 0.500000 0.399961
v -0.492385 0.399961 0.438244
v -0.470699 0.399961 0.470699
v -0.492385 0.438244 0.399961
v -0.483194 0.439203 0.439203
v -0.465612 0.437212 0.465612
v -0.457718 0.457718 0.457718
v -0.399961 0.438244 0.492385
v -0.399961 0.470699 0.470699
v -0.438244 0.399961 0.492385
v -0.439203 0.439203 0.483194
v -0.437212 0.465612 0.465612
v -0.438244 0.492385 0.399961
v -0.470699 0.470699 0.399961
v -0.399961 0.492385 0.438244
v -0.439203 0.483194 0.439203
v -0.465612 0.465612 0.437212
v -0.399961 -0.399961 0.500000
v -0.500000 -0.399961 0.399961
v -0.399961 -0.500000 0.399961
v -0.438244 -0.399961 0.492385
v -0.470699 -0.399961 0.470699
v -0.399961 -0.438244 0.492385
v -0.439203 -0.439203 0.483194
v -0.465612 -0.437212 0.465612
v -0.457718 -0.457718 0.457718
v -0.492385 -0.438244 0.399961
v -0.470699 -0.470699 0.399961
v -0.492385 -0.399961 0.438244
v -0.483194 -0.439203 0.439203
v -0.465612 -0.465612 0.437212
v -0.399961 -0.492385 0.438244
v -0.399961 -0.470699 0.470699
v -0.438244 -0.492385 0.399961
v -0.439203 -0.483194 0.439203
v -0.437212 -0.465612 0.465612
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.650010 0.525010
vt 0.849990 0.525010
vt 0.849990 0.724990
vt 0.650010 0.724990
vt 0.400010 0.275010
vt 0.599990 0.275010
vt 0.599990 0.474990
vt 0.400010 0.474990
vt 0.400010 0.775010
vt 0.599990 0.775010
vt 0.599990 0.974990
vt 0.400010 0.974990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.400010 0.525010
vt 0.390439 0.525010
vt 0.390199 0.515199
vt 0.400010 0.515439
vt 0.375000 0.525010
vt 0.375000 0.515697
vt 0.390697 0.500000
vt 0.400010 0.500000
vt 0.375000 0.510570
vt 0.599990 0.265439
vt 0.609801 0.265199
vt 0.609561 0.275010
vt 0.599990 0.250000
vt 0.609303 0.250000
vt 0.625000 0.265697
vt 0.625000 0.275010
vt 0.614430 0.250000
vt 0.859561 0.724990
vt 0.859801 0.734801
vt 0.849990 0.734561
vt 0.875000 0.724990
vt 0.875000 0.734303
vt 0.859303 0.750000
vt 0.849990 0.750000
vt 0.875000 0.739430
vt 0.390439 0.275010
vt 0.390199 0.265199
vt 0.400010 0.265439
vt 0.375000 0.275010
vt 0.375000 0.265697
vt 0.390697 0.250000
vt 0.400010 0.250000
vt 0.375000 0.260570
vt 0.599990 0.015439
vt 0.609801 0.015199
vt 0.609561 0.025010
vt 0.599990 0.000000
vt 0.609303 0.000000
vt 0.625000 0.015697
vt 0.625000 0.025010
vt 0.614430 0.000000
vt 0.650010 0.734561
vt 0.640199 0.734801
vt 0.640439 0.724990
vt 0.650010 0.750000
vt 0.640697 0.750000
vt 0.625000 0.734303
vt 0.625000 0.724990
vt 0.635570 0.750000
vt 0.609561 0.474990
vt 0.609801 0.484801
vt 0.599990 0.484561
vt 0.625000 0.474990
vt 0.625000 0.484303
vt 0.609303 0.500000
vt 0.599990 0.500000
vt 0.625000 0.489430
vt 0.400010 0.724990
vt 0.400010 0.734561
vt 0.390199 0.734801
vt 0.390439 0.724990
vt 0.400010 0.750000
vt 0.390697 0.750000
vt 0.375000 0.734303
vt 0.375000 0.724990
vt 0.385570 0.750000
vt 0.349990 0.515439
vt 0.359801 0.515199
vt 0.359561 0.525010
vt 0.349990 0.500000
vt 0.359303 0.500000
vt 0.375000 0.515697
vt 0.375000 0.525010
vt 0.364430 0.500000
vt 0.140439 0.525010
vt 0.140199 0.515199
vt 0.150010 0.515439
vt 0.125000 0.525010
vt 0.125000 0.515697
vt 0.140697 0.500000
vt 0.150010 0.500000
vt 0.125000 0.510570
vt 0.609561 0.224990
vt 0.609801 0.234801
vt 0.599990 0.234561
vt 0.625000 0.224990
vt 0.625000 0.234303
vt 0.609303 0.250000
vt 0.599990 0.250000
vt 0.625000 0.239430
vt 0.400010 0.484561
vt 0.390199 0.484801
vt 0.390439 0.474990
vt 0.400010 0.500000
vt 0.390697 0.500000
vt 0.375000 0.484303
vt 0.375000 0.474990
vt 0.385570 0.500000
vt 0.609561 0.974990
vt 0.609801 0.984801
vt 0.599990 0.984561
vt 0.625000 0.974990
vt 0.625000 0.984303
vt 0.609303 1.000000
vt 0.599990 1.000000
vt 0.625000 0.989430
vt 0.599990 0.525010
vt 0.599990 0.515439
vt 0.609801 0.515199
vt 0.609561 0.525010
vt 0.599990 0.500000
vt 0.609303 0.500000
vt 0.625000 0.515697
vt 0.625000 0.525010
vt 0.614430 0.500000
vt 0.849990 0.515439
vt 0.859801 0.515199
vt 0.859561 0.525010
vt 0.849990 0.500000
vt 0.859303 0.500000
vt 0.875000 0.515697
vt 0.875000 0.525010
vt 0.864430 0.500000
vt 0.640439 0.525010
vt 0.640199 0.515199
vt 0.650010 0.515439
vt 0.625000 0.525010
vt 0.625000 0.515697
vt 0.640697 0.500000
vt 0.650010 0.500000
vt 0.625000 0.510570
vt 0.390439 0.025010
vt 0.390199 0.015199
vt 0.400010 0.015439
vt 0.375000 0.025010
vt 0.375000 0.015697
vt 0.390697 0.000000
vt 0.400010 0.000000
vt 0.375000 0.010570
vt 0.400010 0.984561
vt 0.390199 0.984801
vt 0.390439 0.974990
vt 0.400010 1.000000
vt 0.390697 1.000000
vt 0.375000 0.984303
vt 0.375000 0.974990
vt 0.385570 1.000000
vt 0.599990 0.765439
vt 0.609801 0.765199
vt 0.609561 0.775010
vt 0.599990 0.750000
vt 0.609303 0.750000
vt 0.625000 0.765697
vt 0.625000 0.775010
vt 0.614430 0.750000
vt 0.359561 0.724990
vt 0.359801 0.734801
vt 0.349990 0.734561
vt 0.375000 0.724990
vt 0.375000 0.734303
vt 0.359303 0.750000
vt 0.349990 0.750000
vt 0.375000 0.739430
vt 0.599990 0.724990
vt 0.609561 0.724990
vt 0.609801 0.734801
vt 0.599990 0.734561
vt 0.625000 0.724990
vt 0.625000 0.734303
vt 0.609303 0.750000
vt 0.599990 0.750000
vt 0.625000 0.739430
vt 0.150010 0.734561
vt 0.140199 0.734801
vt 0.140439 0.724990
vt 0.150010 0.750000
vt 0.140697 0.750000
vt 0.125000 0.734303
vt 0.125000 0.724990
vt 0.135570 0.750000
vt 0.390439 0.775010
vt 0.390199 0.765199
vt 0.400010 0.765439
vt 0.375000 0.775010
vt 0.375000 0.765697
vt 0.390697 0.750000
vt 0.400010 0.750000
vt 0.375000 0.760570
vt 0.400010 0.234561
vt 0.390199 0.234801
vt 0.390439 0.224990
vt 0.400010 0.250000
vt 0.390697 0.250000
vt 0.375000 0.234303
vt 0.375000 0.224990
vt 0.385570 0.250000
vn 0.1004 -0.1004 0.9899
vn 0.1004 0.1004 0.9899
vn -0.1004 0.1004 0.9899
vn -0.1004 -0.1004 0.9899
vn -0.1004 -0.1004 -0.9899
vn -0.1004 0.1004 -0.9899
vn 0.1004 0.1004 -0.9899
vn 0.1004 -0.1004 -0.9899
vn 0.9899 -0.1004 -0.1004
vn 0.9899 0.1004 -0.1004
vn 0.9899 0.1004 0.1004
vn 0.9899 -0.1004 0.1004
vn -0.9899 -0.1004 0.1004
vn -0.9899 0.1004 0.1004
vn -0.9899 0.1004 -0.1004
vn -0.9899 -0.1004 -0.1004
vn -0.1004 -0.9899 -0.1004
vn 0.1004 -0.9899 -0.1004
vn 0.1004 -0.9899 0.1004
vn -0.1004 -0.9899 0.1004
vn 0.1004 0.9899 -0.1004
vn 0.3792 0.9201 -0.0981
vn 0.3673 0.8545 -0.3673
vn 0.0981 0.9201 -0.3792
vn 0.7041 0.7041 -0.0919
vn 0.6663 0.6663 -0.3347
vn 0.3347 0.6663 -0.6663
vn 0.0919 0.7041 -0.7041
vn 0.5774 0.5774 -0.5774
vn 0.9201 0.0981 -0.3792
vn 0.8545 0.3673 -0.3673
vn 0.9201 0.3792 -0.0981
vn 0.7041 0.0919 -0.7041
vn 0.6663 0.3347 -0.6663
vn 0.0981 0.3792 -0.9201
vn 0.3673 0.3673 -0.8545
vn 0.3792 0.0981 -0.9201
vn 0.9201 -0.3792 -0.0981
vn 0.8545 -0.3673 -0.3673
vn 0.9201 -0.0981 -0.3792
vn 0.7041 -0.7041 -0.0919
vn 0.6663 -0.6663 -0.3347
vn 0.6663 -0.3347 -0.6663
vn 0.7041 -0.0919 -0.7041
vn 0.5774 -0.5774 -0.5773
vn 0.0981 -0.9201 -0.3792
vn 0.3673 -0.8545 -0.3673
vn 0.3792 -0.9201 -0.0981
vn 0.0919 -0.7041 -0.7041
vn 0.3347 -0.6663 -0.6663
vn 0.3792 -0.0981 -0.9201
vn 0.3673 -0.3673 -0.8545
vn 0.0981 -0.3792 -0.9201
vn 0.9201 0.3792 0.0981
vn 0.8545 0.3673 0.3673
vn 0.9201 0.0981 0.3792
vn 0.7041 0.7041 0.0919
vn 0.6663 0.6663 0.3347
vn 0.6663 0.3347 0.6663
vn 0.7041 0.0919 0.7041
vn 0.5774 0.5774 0.5773
vn 0.1004 0.9899 0.1004
vn 0.0981 0.9201 0.3792
vn 0.3673 0.8545 0.3673
vn 0.3792 0.9201 0.0981
vn 0.0919 0.7041 0.7041
vn 0.3347 0.6663 0.6663
vn 0.3792 0.0981 0.9201
vn 0.3673 0.3673 0.8545
vn 0.0981 0.3792 0.9201
vn 0.0981 -0.3792 0.9201
vn 0.3673 -0.3673 0.8545
vn 0.3792 -0.0981 0.9201
vn 0.0919 -0.7041 0.7041
vn 0.3347 -0.6663 0.6663
vn 0.6663 -0.3347 0.6663
vn 0.7041 -0.0919 0.7041
vn 0.5773 -0.5774 0.5774
vn 0.3792 -0.9201 0.0981
vn 0.3673 -0.8545 0.3673
vn 0.0981 -0.9201 0.3792
vn 0.7041 -0.7041 0.0919
vn 0.6663 -0.6663 0.3347
vn 0.9201 -0.0981 0.3792
vn 0.8545 -0.3673 0.3673
vn 0.9201 -0.3792 0.0981
vn -0.9201 0.3792 -0.0981
vn -0.8545 0.3673 -0.3673
vn -0.9201 0.0981 -0.3792
vn -0.7041 0.7041 -0.0919
vn -0.6663 0.6663 -0.3347
vn -0.6663 0.3347 -0.6663
vn -0.7041 0.0919 -0.7041
vn -0.5774 0.5774 -0.5773
vn -0.1004 0.9899 -0.1004
vn -0.0981 0.9201 -0.3792
vn -0.3673 0.8545 -0.3673
vn -0.3792 0.9201 -0.0981
vn -0.0919 0.7041 -0.7041
vn -0.3347 0.6663 -0.6663
vn -0.3792 0.0981 -0.9201
vn -0.3673 0.3673 -0.8545
vn -0.0981 0.3792 -0.9201
vn -0.0981 -0.3792 -0.9201
vn -0.3673 -0.3673 -0.8545
vn -0.3792 -0.0981 -0.9201
vn -0.0919 -0.7041 -0.7041
vn -0.3347 -0.6663 -0.6663
vn -0.6663 -0.3347 -0.6663
vn -0.7041 -0.0919 -0.7041
vn -0.5773 -0.5774 -0.5774
vn -0.3792 -0.9201 -0.0981
vn -0.3673 -0.8545 -0.3673
vn -0.0981 -0.9201 -0.3792
vn -0.7041 -0.7041 -0.0919
vn -0.6663 -0.6663 -0.3347
vn -0.9201 -0.0981 -0.3792
vn -0.8545 -0.3673 -0.3673
vn -0.9201 -0.3792 -0.0981
vn -0.9201 0.0981 0.3792
vn -0.8545 0.3673 0.3673
vn -0.9201 0.3792 0.0981
vn -0.7041 0.0919 0.7041
vn -0.6663 0.3347 0.6663
vn -0.6663 0.6663 0.3347
vn -0.7041 0.7041 0.0919
vn -0.5774 0.5774 0.5773
vn -0.0981 0.3792 0.9201
vn -0.3673 0.3673 0.8545
vn -0.3792 0.0981 0.9201
vn -0.0919 0.7041 0.7041
vn -0.3347 0.6663 0.6663
vn -0.1004 0.9899 0.1004
vn -0.3792 0.9201 0.0981
vn -0.3673 0.8545 0.3673
vn -0.0981 0.9201 0.3792
vn -0.3792 -0.0981 0.9201
vn -0.3673 -0.3673 0.8545
vn -0.0981 -0.3792 0.9201
vn -0.7041 -0.0919 0.7041
vn -0.6663 -0.3347 0.6663
vn -0.3347 -0.6663 0.6663
vn -0.0919 -0.7041 0.7041
vn -0.5774 -0.5774 0.5773
vn -0.9201 -0.3792 0.0981
vn -0.8545 -0.3673 0.3673
vn -0.9201 -0.0981 0.3792
vn -0.7041 -0.7041 0.0919
vn -0.6663 -0.6663 0.3347
vn -0.0981 -0.9201 0.3792
vn -0.3673 -0.8545 0.3673
vn -0.3792 -0.9201 0.0981
s 1
f 58/1/1 41/2/2 116/3/3 134/4/4
f 96/5/5 79/6/6 3/7/7 22/8/8
f 20/9/9 2/10/10 39/11/11 60/12/12
f 135/13/13 115/14/14 77/15/15 98/16/16
f 97/17/17 21/18/18 59/19/19 136/20/20
f 1/21/21 4/22/22 7/23/23 6/24/24
f 4/22/22 5/25/25 8/26/26 7/23/23
f 6/24/24 7/23/23 19/27/27 16/28/28
f 7/23/23 8/26/26 9/29/29 19/27/27
f 2/10/10 10/30/30 13/31/31 12/32/32
f 10/30/30 11/33/33 14/34/34 13/31/31
f 12/32/32 13/31/31 8/35/26 5/36/25
f 13/31/31 14/34/34 9/37/29 8/35/26
f 3/7/7 15/38/35 18/39/36 17/40/37
f 15/38/35 16/41/28 19/42/27 18/39/36
f 17/40/37 18/39/36 14/43/34 11/44/33
f 18/39/36 19/42/27 9/45/29 14/43/34
f 20/9/9 23/46/38 26/47/39 25/48/40
f 23/46/38 24/49/41 27/50/42 26/47/39
f 25/48/40 26/47/39 38/51/43 35/52/44
f 26/47/39 27/50/42 28/53/45 38/51/43
f 21/18/18 29/54/46 32/55/47 31/56/48
f 29/54/46 30/57/49 33/58/50 32/55/47
f 31/56/48 32/55/47 27/59/42 24/60/41
f 32/55/47 33/58/50 28/61/45 27/59/42
f 22/8/8 34/62/51 37/63/52 36/64/53
f 34/62/51 35/65/44 38/66/43 37/63/52
f 36/64/53 37/63/52 33/67/50 30/68/49
f 37/63/52 38/66/43 28/69/45 33/67/50
f 39/11/11 42/70/54 45/71/55 44/72/56
f 42/70/54 43/73/57 46/74/58 45/71/55
f 44/72/56 45/71/55 57/75/59 54/76/60
f 45/71/55 46/74/58 47/77/61 57/75/59
f 40/78/62 48/79/63 51/80/64 50/81/65
f 48/79/63 49/82/66 52/83/67 51/80/64
f 50/81/65 51/80/64 46/84/58 43/85/57
f 51/80/64 52/83/67 47/86/61 46/84/58
f 41/2/2 53/87/68 56/88/69 55/89/70
f 53/87/68 54/90/60 57/91/59 56/88/69
f 55/89/70 56/88/69 52/92/67 49/93/66
f 56/88/69 57/91/59 47/94/61 52/92/67
f 58/1/1 61/95/71 64/96/72 63/97/73
f 61/95/71 62/98/74 65/99/75 64/96/72
f 63/97/73 64/96/72 76/100/76 73/101/77
f 64/96/72 65/99/75 66/102/78 76/100/76
f 59/19/19 67/103/79 70/104/80 69/105/81
f 67/103/79 68/106/82 71/107/83 70/104/80
f 69/105/81 70/104/80 65/108/75 62/109/74
f 70/104/80 71/107/83 66/110/78 65/108/75
f 60/12/12 72/111/84 75/112/85 74/113/86
f 72/111/84 73/114/77 76/115/76 75/112/85
f 74/113/86 75/112/85 71/116/83 68/117/82
f 75/112/85 76/115/76 66/118/78 71/116/83
f 77/15/15 80/119/87 83/120/88 82/121/89
f 80/119/87 81/122/90 84/123/91 83/120/88
f 82/121/89 83/120/88 95/124/92 92/125/93
f 83/120/88 84/123/91 85/126/94 95/124/92
f 78/127/95 86/128/96 89/129/97 88/130/98
f 86/128/96 87/131/99 90/132/100 89/129/97
f 88/130/98 89/129/97 84/133/91 81/134/90
f 89/129/97 90/132/100 85/135/94 84/133/91
f 79/6/6 91/136/101 94/137/102 93/138/103
f 91/136/101 92/139/93 95/140/92 94/137/102
f 93/138/103 94/137/102 90/141/100 87/142/99
f 94/137/102 95/140/92 85/143/94 90/141/100
f 96/5/5 99/144/104 102/145/105 101/146/106
f 99/144/104 100/147/107 103/148/108 102/145/105
f 101/146/106 102/145/105 114/149/109 111/150/110
f 102/145/105 103/148/108 104/151/111 114/149/109
f 97/17/17 105/152/112 108/153/113 107/154/114
f 105/152/112 106/155/115 109/156/116 108/153/113
f 107/154/114 108/153/113 103/157/108 100/158/107
f 108/153/113 109/156/116 104/159/111 103/157/108
f 98/16/16 110/160/117 113/161/118 112/162/119
f 110/160/117 111/163/110 114/164/109 113/161/118
f 112/162/119 113/161/118 109/165/116 106/166/115
f 113/161/118 114/164/109 104/167/111 109/165/116
f 115/14/14 118/168/120 121/169/121 120/170/122
f 118/168/120 119/171/123 122/172/124 121/169/121
f 120/170/122 121/169/121 133/173/125 130/174/126
f 121/169/121 122/172/124 123/175/127 133/173/125
f 116/3/3 124/176/128 127/177/129 126/178/130
f 124/176/128 125/179/131 128/180/132 127/177/129
f 126/178/130 127/177/129 122/181/124 119/182/123
f 127/177/129 128/180/132 123/183/127 122/181/124
f 117/184/133 129/185/134 132/186/135 131/187/136
f 129/185/134 130/188/126 133/189/125 132/186/135
f 131/187/136 132/186/135 128/190/132 125/191/131
f 132/186/135 133/189/125 123/192/127 128/190/132
f 134/4/4 137/193/137 140/194/138 139/195/139
f 137/193/137 138/196/140 141/197/141 140/194/138
f 139/195/139 140/194/138 152/198/142 149/199/143
f 140/194/138 141/197/141 142/200/144 152/198/142
f 135/13/13 143/201/145 146/202/146 145/203/147
f 143/201/145 144/204/148 147/205/149 146/202/146
f 145/203/147 146/202/146 141/206/141 138/207/140
f 146/202/146 147/205/149 142/208/144 141/206/141
f 136/20/20 148/209/150 151/210/151 150/211/152
f 148/209/150 149/212/143 152/213/142 151/210/151
f 150/211/152 151/210/151 147/214/149 144/215/148
f 151/210/151 152/213/142 142/216/144 147/214/149
f 136/20/20 59/19/19 69/105/81 148/209/150
f 148/209/150 69/105/81 62/109/74 149/212/143
f 149/199/143 62/98/74 61/95/71 139/195/139
f 139/195/139 61/95/71 58/1/1 134/4/4
f 59/19/19 21/18/18 31/56/48 67/103/79
f 67/103/79 31/56/48 24/60/41 68/106/82
f 68/117/82 24/49/41 23/46/38 74/113/86
f 74/113/86 23/46/38 20/9/9 60/12/12
f 1/21/21 40/78/62 50/81/65 4/22/22
f 4/22/22 50/81/65 43/85/57 5/25/25
f 5/36/25 43/73/57 42/70/54 12/32/32
f 12/32/32 42/70/54 39/11/11 2/10/10
f 21/18/18 97/17/17 107/154/114 29/54/46
f 29/54/46 107/154/114 100/158/107 30/57/49
f 30/68/49 100/147/107 99/144/104 36/64/53
f 36/64/53 99/144/104 96/5/5 22/8/8
f 117/184/133 78/127/95 88/130/98 129/185/134
f 129/185/134 88/130/98 81/134/90 130/188/126
f 130/174/126 81/122/90 80/119/87 120/170/122
f 120/170/122 80/119/87 77/15/15 115/14/14
f 97/17/17 136/20/20 150/211/152 105/152/112
f 105/152/112 150/211/152 144/215/148 106/155/115
f 106/166/115 144/204/148 143/201/145 112/162/119
f 112/162/119 143/201/145 135/13/13 98/16/16
f 40/78/62 117/184/133 131/187/136 48/79/63
f 48/79/63 131/187/136 125/191/131 49/82/66
f 49/93/66 125/179/131 124/176/128 55/89/70
f 55/89/70 124/176/128 116/3/3 41/2/2
f 41/2/2 58/1/1 63/97/73 53/87/68
f 53/87/68 63/97/73 73/101/77 54/90/60
f 54/76/60 73/114/77 72/111/84 44/72/56
f 44/72/56 72/111/84 60/12/12 39/11/11
f 2/10/10 20/9/9 25/48/40 10/30/30
f 10/30/30 25/48/40 35/52/44 11/33/33
f 11/44/33 35/65/44 34/62/51 17/40/37
f 17/40/37 34/62/51 22/8/8 3/7/7
f 134/4/4 116/3/3 126/178/130 137/193/137
f 137/193/137 126/178/130 119/182/123 138/196/140
f 138/207/140 119/171/123 118/168/120 145/203/147
f 145/203/147 118/168/120 115/14/14 135/13/13
f 78/127/95 1/21/21 6/24/24 86/128/96
f 86/128/96 6/24/24 16/28/28 87/131/99
f 87/142/99 16/41/28 15/38/35 93/138/103
f 93/138/103 15/38/35 3/7/7 79/6/6
f 79/6/6 96/5/5 101/146/106 91/136/101
f 91/136/101 101/146/106 111/150/110 92/139/93
f 92/125/93 111/163/110 110/160/117 82/121/89
f 82/121/89 110/160/117 98/16/16 77/15/15
f 1/21/21 78/127/95 117/184/133 40/78/62

View File

@@ -0,0 +1,455 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c000001.mtl
o Cube_Cube.002
v -0.399961 0.399961 0.500000
v -0.399961 -0.399961 0.500000
v 0.499961 -0.399961 0.500000
v 0.499961 0.399961 0.500000
v 0.499961 0.399961 -0.500000
v 0.499961 -0.399961 -0.500000
v -0.399961 -0.399961 -0.500000
v -0.399961 0.399961 -0.500000
v -0.500000 0.399961 -0.399961
v -0.500000 -0.399961 -0.399961
v -0.500000 -0.399961 0.399961
v -0.500000 0.399961 0.399961
v 0.499961 0.500000 -0.399961
v -0.399961 0.500000 -0.399961
v -0.399961 0.500000 0.399961
v 0.499961 0.500000 0.399961
v -0.399961 -0.500000 -0.399961
v -0.438244 -0.492385 -0.399961
v -0.439203 -0.483194 -0.439203
v -0.399961 -0.492385 -0.438244
v -0.470699 -0.470699 -0.399961
v -0.465612 -0.465612 -0.437212
v -0.437212 -0.465612 -0.465612
v -0.399961 -0.470699 -0.470699
v -0.457718 -0.457718 -0.457718
v -0.492385 -0.399961 -0.438244
v -0.483194 -0.439203 -0.439203
v -0.492385 -0.438244 -0.399961
v -0.470699 -0.399961 -0.470699
v -0.465612 -0.437212 -0.465612
v -0.399961 -0.438244 -0.492385
v -0.439203 -0.439203 -0.483194
v -0.438244 -0.399961 -0.492385
v -0.492385 0.438244 -0.399961
v -0.483194 0.439203 -0.439203
v -0.492385 0.399961 -0.438244
v -0.470699 0.470699 -0.399961
v -0.465612 0.465612 -0.437212
v -0.465612 0.437212 -0.465612
v -0.470699 0.399961 -0.470699
v -0.457718 0.457718 -0.457718
v -0.399961 0.492385 -0.438244
v -0.439203 0.483194 -0.439203
v -0.438244 0.492385 -0.399961
v -0.399961 0.470699 -0.470699
v -0.437212 0.465612 -0.465612
v -0.438244 0.399961 -0.492385
v -0.439203 0.439203 -0.483194
v -0.399961 0.438244 -0.492385
v -0.492385 -0.438244 0.399961
v -0.483194 -0.439203 0.439203
v -0.492385 -0.399961 0.438244
v -0.470699 -0.470699 0.399961
v -0.465612 -0.465612 0.437212
v -0.465612 -0.437212 0.465612
v -0.470699 -0.399961 0.470699
v -0.457718 -0.457718 0.457718
v -0.399961 -0.500000 0.399961
v -0.399961 -0.492385 0.438244
v -0.439203 -0.483194 0.439203
v -0.438244 -0.492385 0.399961
v -0.399961 -0.470699 0.470699
v -0.437212 -0.465612 0.465612
v -0.438244 -0.399961 0.492385
v -0.439203 -0.439203 0.483194
v -0.399961 -0.438244 0.492385
v -0.399961 0.438244 0.492385
v -0.439203 0.439203 0.483194
v -0.438244 0.399961 0.492385
v -0.399961 0.470699 0.470699
v -0.437212 0.465612 0.465612
v -0.465612 0.437212 0.465612
v -0.470699 0.399961 0.470699
v -0.457718 0.457718 0.457718
v -0.438244 0.492385 0.399961
v -0.439203 0.483194 0.439203
v -0.399961 0.492385 0.438244
v -0.470699 0.470699 0.399961
v -0.465612 0.465612 0.437212
v -0.492385 0.399961 0.438244
v -0.483194 0.439203 0.439203
v -0.492385 0.438244 0.399961
v 0.499961 -0.500000 -0.399961
v 0.499961 -0.492385 -0.438244
v 0.499961 -0.470699 -0.470699
v 0.499961 -0.438244 -0.492385
v 0.499961 0.438244 -0.492385
v 0.499961 0.470699 -0.470699
v 0.499961 0.492385 -0.438244
v 0.499961 -0.438244 0.492385
v 0.499961 -0.470699 0.470699
v 0.499961 -0.500000 0.399961
v 0.499961 -0.492385 0.438244
v 0.499961 0.438244 0.492385
v 0.499961 0.470699 0.470699
v 0.499961 0.492385 0.438244
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.650010 0.525010
vt 0.849990 0.525010
vt 0.849990 0.724990
vt 0.650010 0.724990
vt 0.400010 0.275010
vt 0.599990 0.275010
vt 0.599990 0.474990
vt 0.400010 0.474990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.400010 0.525010
vt 0.390439 0.525010
vt 0.390199 0.515199
vt 0.400010 0.515439
vt 0.375000 0.525010
vt 0.375000 0.515697
vt 0.390697 0.500000
vt 0.400010 0.500000
vt 0.375000 0.510570
vt 0.599990 0.265439
vt 0.609801 0.265199
vt 0.609561 0.275010
vt 0.599990 0.250000
vt 0.609303 0.250000
vt 0.625000 0.265697
vt 0.625000 0.275010
vt 0.614430 0.250000
vt 0.859561 0.724990
vt 0.859801 0.734801
vt 0.849990 0.734561
vt 0.875000 0.724990
vt 0.875000 0.734303
vt 0.859303 0.750000
vt 0.849990 0.750000
vt 0.875000 0.739430
vt 0.390439 0.275010
vt 0.390199 0.265199
vt 0.400010 0.265439
vt 0.375000 0.275010
vt 0.375000 0.265697
vt 0.390697 0.250000
vt 0.400010 0.250000
vt 0.375000 0.260570
vt 0.599990 0.015439
vt 0.609801 0.015199
vt 0.609561 0.025010
vt 0.599990 0.000000
vt 0.609303 0.000000
vt 0.625000 0.015697
vt 0.625000 0.025010
vt 0.614430 0.000000
vt 0.650010 0.734561
vt 0.640199 0.734801
vt 0.640439 0.724990
vt 0.650010 0.750000
vt 0.640697 0.750000
vt 0.625000 0.734303
vt 0.625000 0.724990
vt 0.635570 0.750000
vt 0.609561 0.474990
vt 0.609801 0.484801
vt 0.599990 0.484561
vt 0.625000 0.474990
vt 0.625000 0.484303
vt 0.609303 0.500000
vt 0.599990 0.500000
vt 0.625000 0.489430
vt 0.400010 0.724990
vt 0.400010 0.734561
vt 0.390199 0.734801
vt 0.390439 0.724990
vt 0.400010 0.750000
vt 0.390697 0.750000
vt 0.375000 0.734303
vt 0.375000 0.724990
vt 0.385570 0.750000
vt 0.349990 0.515439
vt 0.359801 0.515199
vt 0.359561 0.525010
vt 0.349990 0.500000
vt 0.359303 0.500000
vt 0.375000 0.515697
vt 0.375000 0.525010
vt 0.364430 0.500000
vt 0.140439 0.525010
vt 0.140199 0.515199
vt 0.150010 0.515439
vt 0.125000 0.525010
vt 0.125000 0.515697
vt 0.140697 0.500000
vt 0.150010 0.500000
vt 0.125000 0.510570
vt 0.609561 0.224990
vt 0.609801 0.234801
vt 0.599990 0.234561
vt 0.625000 0.224990
vt 0.625000 0.234303
vt 0.609303 0.250000
vt 0.599990 0.250000
vt 0.625000 0.239430
vt 0.400010 0.484561
vt 0.390199 0.484801
vt 0.390439 0.474990
vt 0.400010 0.500000
vt 0.390697 0.500000
vt 0.375000 0.484303
vt 0.375000 0.474990
vt 0.385570 0.500000
vt 0.400010 0.234561
vt 0.400010 0.250000
vt 0.125000 0.724990
vt 0.140439 0.724990
vt 0.400010 0.015439
vt 0.400010 0.000000
vt 0.625000 0.525010
vt 0.640439 0.525010
vt 0.599990 0.724990
vt 0.599990 0.734561
vt 0.599990 0.750000
vt 0.375000 0.724990
vt 0.359561 0.724990
vt 0.599990 0.525010
vt 0.599990 0.515439
vt 0.599990 0.500000
vt 0.875000 0.525010
vt 0.859561 0.525010
vn 1.0000 0.0000 0.0000
vn -0.1004 0.1004 0.9899
vn -0.1004 -0.1004 0.9899
vn 0.0000 -0.0980 0.9952
vn -0.0000 0.0980 0.9952
vn 0.0000 0.0980 -0.9952
vn 0.0000 -0.0980 -0.9952
vn -0.1004 -0.1004 -0.9899
vn -0.1004 0.1004 -0.9899
vn -0.9899 0.1004 -0.1004
vn -0.9899 -0.1004 -0.1004
vn -0.9899 -0.1004 0.1004
vn -0.9899 0.1004 0.1004
vn 0.0000 0.9952 -0.0980
vn -0.1004 0.9899 -0.1004
vn -0.1004 0.9899 0.1004
vn 0.0000 0.9952 0.0980
vn -0.1004 -0.9899 -0.1004
vn -0.3792 -0.9201 -0.0981
vn -0.3673 -0.8545 -0.3673
vn -0.0981 -0.9201 -0.3792
vn -0.7041 -0.7041 -0.0919
vn -0.6663 -0.6663 -0.3347
vn -0.3347 -0.6663 -0.6663
vn -0.0919 -0.7041 -0.7041
vn -0.5774 -0.5774 -0.5773
vn -0.9201 -0.0981 -0.3792
vn -0.8545 -0.3673 -0.3673
vn -0.9201 -0.3792 -0.0981
vn -0.7041 -0.0919 -0.7041
vn -0.6663 -0.3347 -0.6663
vn -0.0981 -0.3792 -0.9201
vn -0.3673 -0.3673 -0.8545
vn -0.3792 -0.0981 -0.9201
vn -0.9201 0.3792 -0.0981
vn -0.8545 0.3673 -0.3673
vn -0.9201 0.0981 -0.3792
vn -0.7041 0.7041 -0.0919
vn -0.6663 0.6663 -0.3347
vn -0.6663 0.3347 -0.6663
vn -0.7041 0.0919 -0.7041
vn -0.5774 0.5774 -0.5773
vn -0.0981 0.9201 -0.3792
vn -0.3673 0.8545 -0.3673
vn -0.3792 0.9201 -0.0981
vn -0.0919 0.7041 -0.7041
vn -0.3347 0.6663 -0.6663
vn -0.3792 0.0981 -0.9201
vn -0.3673 0.3673 -0.8545
vn -0.0981 0.3792 -0.9201
vn -0.9201 -0.3792 0.0981
vn -0.8545 -0.3673 0.3673
vn -0.9201 -0.0981 0.3792
vn -0.7041 -0.7041 0.0919
vn -0.6663 -0.6663 0.3347
vn -0.6663 -0.3347 0.6663
vn -0.7041 -0.0919 0.7041
vn -0.5774 -0.5774 0.5773
vn -0.1004 -0.9899 0.1004
vn -0.0981 -0.9201 0.3792
vn -0.3673 -0.8545 0.3673
vn -0.3792 -0.9201 0.0981
vn -0.0919 -0.7041 0.7041
vn -0.3347 -0.6663 0.6663
vn -0.3792 -0.0981 0.9201
vn -0.3673 -0.3673 0.8545
vn -0.0981 -0.3792 0.9201
vn -0.0981 0.3792 0.9201
vn -0.3673 0.3673 0.8545
vn -0.3792 0.0981 0.9201
vn -0.0919 0.7041 0.7041
vn -0.3347 0.6663 0.6663
vn -0.6663 0.3347 0.6663
vn -0.7041 0.0919 0.7041
vn -0.5774 0.5774 0.5773
vn -0.3792 0.9201 0.0981
vn -0.3673 0.8545 0.3673
vn -0.0981 0.9201 0.3792
vn -0.7041 0.7041 0.0919
vn -0.6663 0.6663 0.3347
vn -0.9201 0.0981 0.3792
vn -0.8545 0.3673 0.3673
vn -0.9201 0.3792 0.0981
vn 0.0000 0.9239 0.3827
vn 0.0000 0.7071 0.7071
vn 0.0000 0.3827 0.9239
vn 0.0000 0.9239 -0.3827
vn 0.0000 0.7071 -0.7071
vn 0.0000 0.3827 -0.9239
vn -0.0000 -0.9952 0.0980
vn -0.0000 -0.9239 0.3827
vn -0.0000 -0.7071 0.7071
vn -0.0000 -0.3827 0.9239
vn -0.0000 -0.9952 -0.0980
vn -0.0000 -0.9239 -0.3827
vn -0.0000 -0.7071 -0.7071
vn -0.0000 -0.3827 -0.9239
usemtl Default_OBJ
s off
f 93/1/1 92/2/1 91/3/1
f 4/4/1 16/5/1 95/6/1
f 6/7/1 83/8/1 85/9/1
f 13/10/1 5/11/1 88/12/1
f 3/13/1 16/5/1 4/4/1
f 16/5/1 96/14/1 95/6/1
f 3/13/1 90/15/1 91/3/1
f 5/11/1 13/10/1 92/2/1
f 16/5/1 3/13/1 13/10/1
f 83/8/1 5/11/1 92/2/1
f 5/11/1 87/16/1 88/12/1
f 95/6/1 94/17/1 4/4/1
f 92/2/1 3/13/1 91/3/1
f 5/11/1 83/8/1 6/7/1
f 3/13/1 92/2/1 13/10/1
f 85/9/1 86/18/1 6/7/1
f 89/19/1 13/10/1 88/12/1
f 83/8/1 84/20/1 85/9/1
s 1
f 1/21/2 2/22/3 3/23/4 4/24/5
f 5/25/6 6/26/7 7/27/8 8/28/9
f 9/29/10 10/30/11 11/31/12 12/32/13
f 13/33/14 14/34/15 15/35/16 16/36/17
f 17/37/18 18/38/19 19/39/20 20/40/21
f 18/38/19 21/41/22 22/42/23 19/39/20
f 20/40/21 19/39/20 23/43/24 24/44/25
f 19/39/20 22/42/23 25/45/26 23/43/24
f 10/30/11 26/46/27 27/47/28 28/48/29
f 26/46/27 29/49/30 30/50/31 27/47/28
f 28/48/29 27/47/28 22/51/23 21/52/22
f 27/47/28 30/50/31 25/53/26 22/51/23
f 7/27/8 31/54/32 32/55/33 33/56/34
f 31/54/32 24/57/25 23/58/24 32/55/33
f 33/56/34 32/55/33 30/59/31 29/60/30
f 32/55/33 23/58/24 25/61/26 30/59/31
f 9/29/10 34/62/35 35/63/36 36/64/37
f 34/62/35 37/65/38 38/66/39 35/63/36
f 36/64/37 35/63/36 39/67/40 40/68/41
f 35/63/36 38/66/39 41/69/42 39/67/40
f 14/34/15 42/70/43 43/71/44 44/72/45
f 42/70/43 45/73/46 46/74/47 43/71/44
f 44/72/45 43/71/44 38/75/39 37/76/38
f 43/71/44 46/74/47 41/77/42 38/75/39
f 8/28/9 47/78/48 48/79/49 49/80/50
f 47/78/48 40/81/41 39/82/40 48/79/49
f 49/80/50 48/79/49 46/83/47 45/84/46
f 48/79/49 39/82/40 41/85/42 46/83/47
f 11/31/12 50/86/51 51/87/52 52/88/53
f 50/86/51 53/89/54 54/90/55 51/87/52
f 52/88/53 51/87/52 55/91/56 56/92/57
f 51/87/52 54/90/55 57/93/58 55/91/56
f 58/94/59 59/95/60 60/96/61 61/97/62
f 59/95/60 62/98/63 63/99/64 60/96/61
f 61/97/62 60/96/61 54/100/55 53/101/54
f 60/96/61 63/99/64 57/102/58 54/100/55
f 2/22/3 64/103/65 65/104/66 66/105/67
f 64/103/65 56/106/57 55/107/56 65/104/66
f 66/105/67 65/104/66 63/108/64 62/109/63
f 65/104/66 55/107/56 57/110/58 63/108/64
f 1/21/2 67/111/68 68/112/69 69/113/70
f 67/111/68 70/114/71 71/115/72 68/112/69
f 69/113/70 68/112/69 72/116/73 73/117/74
f 68/112/69 71/115/72 74/118/75 72/116/73
f 15/35/16 75/119/76 76/120/77 77/121/78
f 75/119/76 78/122/79 79/123/80 76/120/77
f 77/121/78 76/120/77 71/124/72 70/125/71
f 76/120/77 79/123/80 74/126/75 71/124/72
f 12/32/13 80/127/81 81/128/82 82/129/83
f 80/127/81 73/130/74 72/131/73 81/128/82
f 82/129/83 81/128/82 79/132/80 78/133/79
f 81/128/82 72/131/73 74/134/75 79/132/80
f 16/36/17 15/35/16 77/121/78 96/135/84
f 96/135/84 77/121/78 70/125/71 95/136/85
f 95/137/85 70/114/71 67/111/68 94/138/86
f 94/138/86 67/111/68 1/21/2 4/24/5
f 15/35/16 14/34/15 44/72/45 75/119/76
f 75/119/76 44/72/45 37/76/38 78/122/79
f 78/133/79 37/65/38 34/62/35 82/129/83
f 82/129/83 34/62/35 9/29/10 12/32/13
f 17/37/18 58/94/59 61/97/62 18/38/19
f 18/38/19 61/97/62 53/101/54 21/41/22
f 21/52/22 53/89/54 50/86/51 28/48/29
f 28/48/29 50/86/51 11/31/12 10/30/11
f 14/34/15 13/33/14 89/139/87 42/70/43
f 42/70/43 89/139/87 88/140/88 45/73/46
f 45/84/46 88/141/88 87/142/89 49/80/50
f 49/80/50 87/142/89 5/25/6 8/28/9
f 58/94/59 92/143/90 93/144/91 59/95/60
f 59/95/60 93/144/91 91/145/92 62/98/63
f 62/109/63 91/146/92 90/147/93 66/105/67
f 66/105/67 90/147/93 3/23/4 2/22/3
f 2/22/3 1/21/2 69/113/70 64/103/65
f 64/103/65 69/113/70 73/117/74 56/106/57
f 56/92/57 73/130/74 80/127/81 52/88/53
f 52/88/53 80/127/81 12/32/13 11/31/12
f 10/30/11 9/29/10 36/64/37 26/46/27
f 26/46/27 36/64/37 40/68/41 29/49/30
f 29/60/30 40/81/41 47/78/48 33/56/34
f 33/56/34 47/78/48 8/28/9 7/27/8
f 83/148/94 17/37/18 20/40/21 84/149/95
f 84/149/95 20/40/21 24/44/25 85/150/96
f 85/151/96 24/57/25 31/54/32 86/152/97
f 86/152/97 31/54/32 7/27/8 6/26/7
f 17/37/18 83/148/94 92/143/90 58/94/59

View File

@@ -0,0 +1,301 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c000011.mtl
o Cube_Cube.003
v 0.495579 0.504344 -0.499961
v 0.495579 0.504344 0.399961
v 0.504305 -0.495618 0.399961
v 0.503432 -0.395583 0.500000
v 0.504049 -0.466318 0.470699
v 0.503766 -0.433864 0.492385
v 0.504239 -0.488003 0.438244
v 0.496118 0.442590 0.492385
v 0.496452 0.404309 0.500000
v 0.495834 0.475044 0.470699
v 0.495645 0.496729 0.438244
v 0.504305 -0.495618 -0.499961
v -0.395583 -0.503471 -0.499961
v -0.433931 -0.496191 -0.499961
v -0.466574 -0.474789 -0.499961
v -0.404309 0.496491 -0.499961
v -0.503471 0.395583 -0.499961
v -0.474789 0.466574 -0.499961
v -0.496491 -0.404309 -0.499961
v -0.488542 -0.442524 -0.499961
v -0.442524 0.488542 -0.499961
v -0.496190 0.433931 -0.499961
v -0.496491 -0.404309 0.399961
v -0.503471 0.395583 0.399961
v -0.403436 0.396456 0.500000
v -0.396456 -0.403436 0.500000
v -0.404309 0.496491 0.399961
v -0.434737 -0.403770 0.492385
v -0.435354 -0.443019 0.483194
v -0.396122 -0.441717 0.492385
v -0.467191 -0.404053 0.470699
v -0.461779 -0.441258 0.465612
v -0.433132 -0.469410 0.465612
v -0.395838 -0.474171 0.470699
v -0.453706 -0.461695 0.457718
v -0.488542 -0.442524 0.399961
v -0.479343 -0.443403 0.439203
v -0.488876 -0.404242 0.438244
v -0.466574 -0.474789 0.399961
v -0.461531 -0.469657 0.437212
v -0.395583 -0.503471 0.399961
v -0.395649 -0.495856 0.438244
v -0.434970 -0.487008 0.439203
v -0.433931 -0.496191 0.399961
v -0.495856 0.395649 0.438244
v -0.487008 0.434970 0.439203
v -0.496191 0.433931 0.399961
v -0.474171 0.395838 0.470699
v -0.469410 0.433132 0.465612
v -0.469657 0.461531 0.437212
v -0.474789 0.466574 0.399961
v -0.461695 0.453706 0.457718
v -0.403770 0.434737 0.492385
v -0.443019 0.435354 0.483194
v -0.441718 0.396122 0.492385
v -0.404053 0.467191 0.470699
v -0.441258 0.461779 0.465612
v -0.442524 0.488542 0.399961
v -0.443403 0.479343 0.439203
v -0.404243 0.488876 0.438244
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.400010 0.775010
vt 0.599990 0.775010
vt 0.599990 0.974990
vt 0.400010 0.974990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.765439
vt 0.609801 0.765199
vt 0.609561 0.775010
vt 0.599990 0.750000
vt 0.609303 0.750000
vt 0.625000 0.765697
vt 0.625000 0.775010
vt 0.614430 0.750000
vt 0.359561 0.724990
vt 0.359801 0.734801
vt 0.349990 0.734561
vt 0.375000 0.724990
vt 0.375000 0.734303
vt 0.359303 0.750000
vt 0.349990 0.750000
vt 0.375000 0.739430
vt 0.599990 0.724990
vt 0.609561 0.724990
vt 0.609801 0.734801
vt 0.599990 0.734561
vt 0.625000 0.724990
vt 0.625000 0.734303
vt 0.609303 0.750000
vt 0.599990 0.750000
vt 0.625000 0.739430
vt 0.150010 0.734561
vt 0.140199 0.734801
vt 0.140439 0.724990
vt 0.150010 0.750000
vt 0.140697 0.750000
vt 0.125000 0.734303
vt 0.125000 0.724990
vt 0.135570 0.750000
vt 0.390439 0.775010
vt 0.390199 0.765199
vt 0.400010 0.765439
vt 0.375000 0.775010
vt 0.375000 0.765697
vt 0.390697 0.750000
vt 0.400010 0.750000
vt 0.375000 0.760570
vt 0.400010 0.234561
vt 0.390199 0.234801
vt 0.390439 0.224990
vt 0.400010 0.250000
vt 0.390697 0.250000
vt 0.375000 0.234303
vt 0.375000 0.224990
vt 0.385570 0.250000
vt 0.599990 0.234561
vt 0.599990 0.250000
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.599990 0.525010
vt 0.609561 0.525010
vt 0.625000 0.525010
vt 0.625000 0.974990
vt 0.609561 0.974990
vt 0.390439 0.025010
vt 0.375000 0.025010
vt 0.375000 0.974990
vt 0.390439 0.974990
vt 0.400010 0.724990
vt 0.400010 0.734561
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.359561 0.525010
vt 0.400010 0.525010
vn 1.0000 0.0087 -0.0000
vn 1.0000 0.0088 -0.0000
vn 1.0000 0.0087 -0.0001
vn 0.0000 0.0000 -1.0000
vn -0.9960 0.0893 -0.0000
vn -0.9943 -0.1067 0.0000
vn -0.9890 -0.1090 0.1004
vn -0.9907 0.0917 0.1004
vn -0.1013 0.0995 0.9899
vn -0.0995 -0.1013 0.9899
vn 0.0009 -0.0980 0.9952
vn -0.0009 0.0980 0.9952
vn -0.0087 0.9951 0.0980
vn -0.0087 1.0000 -0.0000
vn -0.1067 0.9943 -0.0000
vn -0.1090 0.9890 0.1004
vn -0.3783 -0.1014 0.9201
vn -0.3641 -0.3705 0.8545
vn -0.0948 -0.3801 0.9201
vn -0.7033 -0.0981 0.7041
vn -0.6634 -0.3405 0.6663
vn -0.3289 -0.6692 0.6663
vn -0.0858 -0.7049 0.7041
vn -0.5723 -0.5824 0.5773
vn -0.9167 -0.3872 0.0981
vn -0.8512 -0.3748 0.3674
vn -0.9192 -0.1062 0.3792
vn -0.6979 -0.7102 0.0919
vn -0.6605 -0.6721 0.3347
vn -0.0917 -0.9907 0.1004
vn -0.0901 -0.9209 0.3792
vn -0.3599 -0.8576 0.3674
vn -0.3712 -0.9234 0.0982
vn -0.9209 0.0901 0.3792
vn -0.8576 0.3599 0.3674
vn -0.9234 0.3712 0.0982
vn -0.7049 0.0858 0.7041
vn -0.6692 0.3289 0.6663
vn -0.6721 0.6605 0.3347
vn -0.7102 0.6979 0.0919
vn -0.5824 0.5723 0.5773
vn -0.1014 0.3783 0.9201
vn -0.3705 0.3641 0.8545
vn -0.3801 0.0948 0.9201
vn -0.0981 0.7033 0.7041
vn -0.3405 0.6634 0.6663
vn -0.3872 0.9167 0.0981
vn -0.3748 0.8512 0.3674
vn -0.1062 0.9192 0.3792
vn -0.3907 0.9205 -0.0000
vn -0.7132 0.7009 -0.0000
vn -0.9272 0.3746 -0.0000
vn 0.0087 -0.9951 0.0980
vn 0.0081 -0.9238 0.3827
vn 0.0062 -0.7071 0.7071
vn 0.0033 -0.3827 0.9239
vn -0.0081 0.9238 0.3827
vn -0.0062 0.7071 0.7071
vn -0.0033 0.3827 0.9239
vn -0.0893 -0.9960 0.0000
vn -0.3746 -0.9272 0.0000
vn -0.7009 -0.7132 0.0000
vn -0.9205 -0.3907 0.0000
vn 0.0087 -1.0000 0.0000
usemtl Default_OBJ.003
s off
f 1/1/1 2/2/1 3/3/1
f 3/3/1 4/4/1 5/5/1
f 4/4/1 6/6/1 5/5/1
f 7/7/2 3/3/2 5/5/2
f 8/8/3 9/9/3 10/10/3
f 9/9/1 2/2/1 10/10/1
f 2/2/1 11/11/1 10/10/1
f 12/12/1 1/1/1 3/3/1
f 4/4/1 3/3/1 9/9/1
f 3/3/1 2/2/1 9/9/1
f 13/13/4 14/14/4 15/15/4
f 16/16/4 17/17/4 18/18/4
f 13/13/4 1/1/4 12/12/4
f 13/13/4 16/16/4 1/1/4
f 16/16/4 19/19/4 17/17/4
f 19/19/4 13/13/4 15/15/4
f 20/20/4 19/19/4 15/15/4
f 21/21/4 16/16/4 18/18/4
f 19/19/4 16/16/4 13/13/4
f 22/22/4 18/18/4 17/17/4
s 1
f 17/23/5 19/24/6 23/25/7 24/26/8
f 25/27/9 26/28/10 4/29/11 9/30/12
f 2/31/13 1/32/14 16/33/15 27/34/16
f 26/28/10 28/35/17 29/36/18 30/37/19
f 28/35/17 31/38/20 32/39/21 29/36/18
f 30/37/19 29/36/18 33/40/22 34/41/23
f 29/36/18 32/39/21 35/42/24 33/40/22
f 23/25/7 36/43/25 37/44/26 38/45/27
f 36/43/25 39/46/28 40/47/29 37/44/26
f 38/45/27 37/44/26 32/48/21 31/49/20
f 37/44/26 40/47/29 35/50/24 32/48/21
f 41/51/30 42/52/31 43/53/32 44/54/33
f 42/52/31 34/55/23 33/56/22 43/53/32
f 44/54/33 43/53/32 40/57/29 39/58/28
f 43/53/32 33/56/22 35/59/24 40/57/29
f 24/26/8 45/60/34 46/61/35 47/62/36
f 45/60/34 48/63/37 49/64/38 46/61/35
f 47/62/36 46/61/35 50/65/39 51/66/40
f 46/61/35 49/64/38 52/67/41 50/65/39
f 25/27/9 53/68/42 54/69/43 55/70/44
f 53/68/42 56/71/45 57/72/46 54/69/43
f 55/70/44 54/69/43 49/73/38 48/74/37
f 54/69/43 57/72/46 52/75/41 49/73/38
f 27/34/16 58/76/47 59/77/48 60/78/49
f 58/76/47 51/79/40 50/80/39 59/77/48
f 60/78/49 59/77/48 57/81/46 56/82/45
f 59/77/48 50/80/39 52/83/41 57/81/46
f 27/34/16 16/33/15 21/84/50 58/76/47
f 58/76/47 21/84/50 18/85/51 51/79/40
f 51/66/40 18/86/51 22/87/52 47/62/36
f 47/62/36 22/87/52 17/23/5 24/26/8
f 41/51/30 3/88/53 7/89/54 42/52/31
f 42/52/31 7/89/54 5/90/55 34/55/23
f 34/41/23 5/91/55 6/92/56 30/37/19
f 30/37/19 6/92/56 4/29/11 26/28/10
f 2/31/13 27/34/16 60/78/49 11/93/57
f 11/93/57 60/78/49 56/82/45 10/94/58
f 10/95/58 56/71/45 53/68/42 8/96/59
f 8/96/59 53/68/42 25/27/9 9/30/12
f 13/97/60 41/51/30 44/54/33 14/98/61
f 14/98/61 44/54/33 39/58/28 15/99/62
f 15/100/62 39/46/28 36/43/25 20/101/63
f 20/101/63 36/43/25 23/25/7 19/24/6
f 24/26/8 23/25/7 38/45/27 45/60/34
f 45/60/34 38/45/27 31/49/20 48/63/37
f 48/74/37 31/38/20 28/35/17 55/70/44
f 55/70/44 28/35/17 26/28/10 25/27/9
f 12/102/64 3/88/53 41/51/30 13/97/60

View File

@@ -0,0 +1,214 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c000111.mtl
o Cube_Cube.004
v 0.499961 -0.500000 0.399961
v 0.499961 -0.399961 0.500000
v 0.499961 -0.470699 0.470699
v 0.499961 -0.438244 0.492385
v 0.499961 -0.492385 0.438244
v 0.499961 0.499961 0.500000
v -0.399962 -0.500000 -0.499961
v -0.438245 -0.492385 -0.499961
v -0.470700 -0.470699 -0.499961
v -0.500000 -0.399961 -0.499961
v -0.492385 -0.438244 -0.499961
v -0.500000 0.499961 -0.499961
v -0.500000 -0.399961 0.399961
v -0.500000 0.499962 0.399961
v -0.399961 0.499962 0.500000
v -0.399961 -0.399961 0.500000
v -0.438244 -0.399961 0.492385
v -0.439203 -0.439203 0.483194
v -0.399962 -0.438243 0.492385
v -0.470699 -0.399961 0.470699
v -0.465612 -0.437211 0.465612
v -0.437212 -0.465612 0.465612
v -0.399961 -0.470699 0.470699
v -0.457718 -0.457718 0.457718
v -0.492385 -0.438244 0.399961
v -0.483194 -0.439203 0.439203
v -0.492385 -0.399960 0.438244
v -0.470699 -0.470699 0.399961
v -0.465612 -0.465612 0.437212
v -0.399961 -0.500000 0.399961
v -0.399961 -0.492384 0.438244
v -0.439203 -0.483194 0.439203
v -0.438244 -0.492385 0.399961
v 0.499961 0.500000 -0.499961
v 0.499961 -0.500000 -0.499961
v -0.492384 0.499961 0.438244
v -0.470699 0.499961 0.470699
v -0.438244 0.499962 0.492385
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.599990 0.775010
vt 0.400010 0.974990
vt 0.400010 0.775010
vt 0.599990 0.765439
vt 0.609561 0.775010
vt 0.599990 0.750000
vt 0.609801 0.765199
vt 0.625000 0.775010
vt 0.614430 0.750000
vt 0.625000 0.765697
vt 0.359561 0.724990
vt 0.349990 0.734561
vt 0.375000 0.724990
vt 0.359801 0.734801
vt 0.349990 0.750000
vt 0.375000 0.739430
vt 0.359303 0.750000
vt 0.609561 0.724990
vt 0.599990 0.734561
vt 0.599990 0.724990
vt 0.625000 0.724990
vt 0.609801 0.734801
vt 0.599990 0.750000
vt 0.625000 0.739430
vt 0.609303 0.750000
vt 0.000000 0.000000
vt 0.400010 0.525010
vt 0.599990 0.525010
vt 0.609561 0.525010
vt 0.609561 0.974990
vt 0.400010 0.724990
vt 0.400010 0.734561
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.359561 0.525010
vt 0.349990 0.525010
vt 0.150010 0.734561
vt 0.150010 0.750000
vt 0.400010 0.750000
vt 0.400010 0.765439
vt 0.599990 0.974990
vt 0.609303 0.750000
vt 0.375000 0.734303
vt 0.625000 0.734303
vt 0.625000 0.525010
vt 0.625000 0.974990
vn 0.8575 -0.5120 0.0504
vn 0.8321 -0.0544 0.5520
vn 0.8321 -0.3922 0.3922
vn 0.2425 -0.3713 0.8963
vn 0.3162 -0.8765 0.3630
vn 0.6933 0.5095 0.5096
vn -0.0588 -0.5971 -0.8000
vn -0.3423 -0.8263 -0.4472
vn -0.5657 -0.5657 -0.6000
vn -0.5971 -0.0588 -0.8000
vn -0.8264 -0.3423 -0.4472
vn -0.5774 0.5773 -0.5774
vn -0.9905 -0.0970 0.0970
vn -0.7244 0.6857 0.0714
vn -0.0970 -0.0970 0.9905
vn -0.0714 0.6857 0.7244
vn -0.3783 -0.0972 0.9206
vn -0.0972 -0.3783 0.9206
vn -0.7041 -0.0919 0.7041
vn -0.3703 -0.3703 0.8519
vn -0.0919 -0.7041 0.7041
vn -0.5774 -0.5773 0.5774
vn -0.3266 -0.6683 0.6683
vn -0.9206 -0.3783 0.0972
vn -0.9206 -0.0972 0.3783
vn -0.7041 -0.7041 0.0919
vn -0.8519 -0.3703 0.3703
vn -0.6683 -0.3266 0.6683
vn -0.0972 -0.9206 0.3783
vn -0.3783 -0.9206 0.0972
vn -0.0970 -0.9905 0.0970
vn -0.3703 -0.8519 0.3703
vn -0.6683 -0.6683 0.3266
vn 0.5773 0.5774 -0.5773
vn 0.5000 -0.7071 -0.5000
vn -0.6894 0.6657 0.2856
vn -0.5277 0.6657 0.5276
vn -0.2856 0.6657 0.6894
usemtl Default_OBJ.005
s 1
f 1/1/1 2/2/2 3/3/3
f 2/2/2 4/4/4 3/3/3
f 5/5/5 1/1/1 3/3/3
f 2/2/2 1/1/1 6/6/6
f 7/7/7 8/8/8 9/9/9
f 10/10/10 7/7/7 9/9/9
f 11/11/11 10/10/10 9/9/9
f 12/12/12 13/13/13 14/14/14
f 16/15/15 6/16/6 15/17/16
f 17/18/17 19/19/18 16/15/15
f 20/20/19 18/21/20 17/18/17
f 18/21/20 23/22/21 19/19/18
f 18/21/20 24/23/22 22/24/23
f 25/25/24 27/26/25 13/13/13
f 28/27/26 26/28/27 25/25/24
f 26/28/27 20/29/19 27/26/25
f 26/28/27 24/30/22 21/31/28
f 31/32/29 33/33/30 30/34/31
f 23/35/21 32/36/32 31/32/29
f 32/36/32 28/37/26 33/33/30
f 32/36/32 24/38/22 29/39/33
f 10/10/10 12/12/12 34/40/34
f 34/40/34 1/1/1 35/41/35
f 34/40/34 14/14/14 15/17/16
f 1/42/1 31/32/29 30/34/31
f 5/43/5 23/35/21 31/32/29
f 23/22/21 4/44/4 19/19/18
f 4/44/4 16/15/15 19/19/18
f 7/45/7 33/33/30 8/46/8
f 33/33/30 9/47/9 8/46/8
f 9/48/9 25/25/24 11/49/11
f 25/25/24 10/50/10 11/49/11
f 13/13/13 36/51/36 14/14/14
f 27/26/25 37/52/37 36/51/36
f 37/53/37 17/18/17 38/54/38
f 17/18/17 15/17/16 38/54/38
f 35/41/35 30/34/31 7/45/7
f 12/12/12 10/50/10 13/13/13
f 16/15/15 2/55/2 6/16/6
f 17/18/17 18/21/20 19/19/18
f 20/20/19 21/56/28 18/21/20
f 18/21/20 22/24/23 23/22/21
f 18/21/20 21/56/28 24/23/22
f 25/25/24 26/28/27 27/26/25
f 28/27/26 29/57/33 26/28/27
f 26/28/27 21/31/28 20/29/19
f 26/28/27 29/57/33 24/30/22
f 31/32/29 32/36/32 33/33/30
f 23/35/21 22/58/23 32/36/32
f 32/36/32 29/39/33 28/37/26
f 32/36/32 22/58/23 24/38/22
f 35/41/35 7/7/7 34/40/34
f 7/7/7 10/10/10 34/40/34
f 34/40/34 6/16/6 1/1/1
f 12/12/12 14/14/14 34/40/34
f 14/14/14 36/51/36 38/54/38
f 36/51/36 37/52/37 38/54/38
f 38/54/38 15/17/16 14/14/14
f 15/17/16 6/16/6 34/40/34
f 1/42/1 5/43/5 31/32/29
f 5/43/5 3/59/3 23/35/21
f 23/22/21 3/60/3 4/44/4
f 4/44/4 2/55/2 16/15/15
f 7/45/7 30/34/31 33/33/30
f 33/33/30 28/37/26 9/47/9
f 9/48/9 28/27/26 25/25/24
f 25/25/24 13/13/13 10/50/10
f 13/13/13 27/26/25 36/51/36
f 27/26/25 20/29/19 37/52/37
f 37/53/37 20/20/19 17/18/17
f 17/18/17 16/15/15 15/17/16
f 35/41/35 1/42/1 30/34/31

View File

@@ -0,0 +1,213 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c001001.mtl
o Cube_Cube.010
v -0.499961 0.500000 -0.399961
v -0.499961 0.399961 0.500000
v -0.499961 0.500000 0.399961
v -0.499961 0.470699 0.470699
v -0.499961 0.492385 0.438244
v -0.499961 0.492385 -0.438244
v -0.499961 0.470699 -0.470699
v -0.499961 0.438244 -0.492385
v -0.499961 0.399961 -0.500000
v -0.499961 -0.399961 -0.500000
v -0.499961 -0.438244 -0.492385
v -0.499961 -0.470699 -0.470699
v -0.499961 0.438244 0.492385
v -0.499961 -0.399961 0.500000
v -0.499961 -0.500000 0.399961
v -0.499961 -0.470699 0.470699
v 0.499961 0.500000 0.399961
v 0.499961 0.399961 -0.500000
v 0.499961 0.500000 -0.399961
v -0.499961 -0.438244 0.492385
v -0.499961 -0.500000 -0.399961
v -0.499961 -0.492385 0.438244
v -0.499961 -0.492385 -0.438244
v 0.499961 0.470699 -0.470699
v 0.499961 0.492385 -0.438244
v 0.499961 0.492385 0.438244
v 0.499961 0.470699 0.470699
v 0.499961 0.438244 0.492385
v 0.499961 0.399961 0.500000
v 0.499961 -0.399961 0.500000
v 0.499961 -0.438244 0.492385
v 0.499961 -0.470699 0.470699
v 0.499961 0.438244 -0.492385
v 0.499961 -0.399961 -0.500000
v 0.499961 -0.500000 -0.399961
v 0.499961 -0.470699 -0.470699
v 0.499961 -0.438244 -0.492385
v 0.499961 -0.500000 0.399961
v 0.499961 -0.492385 -0.438244
v 0.499961 -0.492385 0.438244
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.650010 0.525010
vt 0.849990 0.525010
vt 0.849990 0.724990
vt 0.650010 0.724990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.234561
vt 0.400010 0.234561
vt 0.599990 0.250000
vt 0.400010 0.250000
vt 0.125000 0.724990
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.140439 0.724990
vt 0.400010 0.015439
vt 0.599990 0.015439
vt 0.400010 0.000000
vt 0.599990 0.000000
vt 0.625000 0.724990
vt 0.625000 0.525010
vt 0.640439 0.525010
vt 0.640439 0.724990
vt 0.400010 0.724990
vt 0.599990 0.724990
vt 0.599990 0.734561
vt 0.400010 0.734561
vt 0.599990 0.750000
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.375000 0.724990
vt 0.359561 0.724990
vt 0.359561 0.525010
vt 0.599990 0.525010
vt 0.400010 0.525010
vt 0.400010 0.515439
vt 0.599990 0.515439
vt 0.400010 0.500000
vt 0.599990 0.500000
vt 0.875000 0.525010
vt 0.875000 0.724990
vt 0.859561 0.724990
vt 0.859561 0.525010
vn -1.0000 0.0000 -0.0000
vn 1.0000 -0.0000 0.0000
vn -0.0000 -0.9952 -0.0980
vn -0.0000 -0.9952 0.0980
vn 0.0000 0.9952 -0.0980
vn 0.0000 0.9952 0.0980
vn 0.0000 0.0980 -0.9952
vn 0.0000 -0.0980 -0.9952
vn 0.0000 -0.3827 -0.9239
vn 0.0000 -0.7071 -0.7071
vn -0.0000 -0.9239 -0.3827
vn 0.0000 0.3827 -0.9239
vn 0.0000 0.7071 -0.7071
vn 0.0000 0.9239 -0.3827
vn -0.0000 -0.0980 0.9952
vn -0.0000 -0.3827 0.9239
vn -0.0000 -0.7071 0.7071
vn -0.0000 -0.9239 0.3827
vn -0.0000 0.0980 0.9952
vn -0.0000 0.3827 0.9239
vn -0.0000 0.7071 0.7071
vn 0.0000 0.9239 0.3827
usemtl Default_OBJ.006
s off
f 1/1/1 2/2/1 3/3/1
f 4/4/1 5/5/1 3/3/1
f 1/1/1 6/6/1 7/7/1
f 8/8/1 9/9/1 7/7/1
f 10/10/1 11/11/1 12/12/1
f 2/2/1 13/13/1 4/4/1
f 14/14/1 15/15/1 16/16/1
f 15/15/1 14/14/1 9/9/1
f 2/2/1 1/1/1 14/14/1
f 10/10/1 15/15/1 9/9/1
f 17/17/2 18/18/2 19/19/2
f 3/3/1 2/2/1 4/4/1
f 9/9/1 1/1/1 7/7/1
f 1/1/1 9/9/1 14/14/1
f 20/20/1 14/14/1 16/16/1
f 21/21/1 10/10/1 12/12/1
f 15/15/1 22/22/1 16/16/1
f 15/15/1 10/10/1 21/21/1
f 12/12/1 23/23/1 21/21/1
f 24/24/2 25/25/2 19/19/2
f 17/17/2 26/26/2 27/27/2
f 28/28/2 29/29/2 27/27/2
f 30/30/2 31/31/2 32/32/2
f 18/18/2 33/33/2 24/24/2
f 34/34/2 35/35/2 36/36/2
f 35/35/2 34/34/2 29/29/2
f 18/18/2 17/17/2 34/34/2
f 30/30/2 35/35/2 29/29/2
f 19/19/2 18/18/2 24/24/2
f 29/29/2 17/17/2 27/27/2
f 17/17/2 29/29/2 34/34/2
f 37/37/2 34/34/2 36/36/2
f 38/38/2 30/30/2 32/32/2
f 35/35/2 39/39/2 36/36/2
f 35/35/2 30/30/2 38/38/2
f 32/32/2 40/40/2 38/38/2
s 1
f 35/41/3 38/42/4 15/43/4 21/44/3
f 1/45/5 3/46/6 17/47/6 19/48/5
f 9/49/7 18/50/7 34/51/8 10/52/8
f 10/52/8 34/51/8 37/53/9 11/54/9
f 11/54/9 37/53/9 36/55/10 12/56/10
f 12/57/10 36/58/10 39/59/11 23/60/11
f 23/60/11 39/59/11 35/41/3 21/44/3
f 18/50/7 9/49/7 8/61/12 33/62/12
f 33/62/12 8/61/12 7/63/13 24/64/13
f 24/65/13 7/66/13 6/67/14 25/68/14
f 25/68/14 6/67/14 1/45/5 19/48/5
f 30/69/15 14/70/15 20/71/16 31/72/16
f 31/72/16 20/71/16 16/73/17 32/74/17
f 32/75/17 16/76/17 22/77/18 40/78/18
f 40/78/18 22/77/18 15/43/4 38/42/4
f 2/79/19 29/80/19 28/81/20 13/82/20
f 13/82/20 28/81/20 27/83/21 4/84/21
f 4/85/21 27/86/21 26/87/22 5/88/22
f 5/88/22 26/87/22 17/47/6 3/46/6
f 29/80/19 2/79/19 14/70/15 30/69/15

View File

@@ -0,0 +1,131 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c001011.mtl
o Cube_Cube.011
v -0.499961 -0.500000 -0.499961
v -0.499961 -0.500000 0.499961
v -0.499961 0.500000 0.499961
v -0.499961 0.500000 -0.499961
v 0.399961 0.500000 -0.499961
v 0.438244 0.492385 -0.499961
v 0.470699 0.470699 -0.499961
v 0.399961 -0.500000 -0.499961
v 0.500000 -0.399961 -0.499961
v 0.470699 -0.470699 -0.499961
v 0.500000 0.399961 -0.499961
v 0.492385 0.438244 -0.499961
v 0.438244 -0.492385 -0.499961
v 0.492385 -0.438244 -0.499961
v 0.399961 0.500000 0.499961
v 0.399961 -0.500000 0.499961
v 0.500000 -0.399961 0.499961
v 0.500000 0.399961 0.499961
v 0.438244 -0.492385 0.499961
v 0.470699 -0.470699 0.499961
v 0.438244 0.492385 0.499961
v 0.470699 0.470699 0.499961
v 0.492385 0.438244 0.499961
v 0.492385 -0.438244 0.499961
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.234561
vt 0.400010 0.234561
vt 0.599990 0.250000
vt 0.400010 0.250000
vt 0.125000 0.724990
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.140439 0.724990
vt 0.400010 0.724990
vt 0.599990 0.724990
vt 0.599990 0.734561
vt 0.400010 0.734561
vt 0.599990 0.750000
vt 0.400010 0.750000
vt 0.375000 0.525010
vt 0.375000 0.724990
vt 0.359561 0.724990
vt 0.359561 0.525010
vt 0.400010 0.525010
vt 0.599990 0.525010
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 0.0000 0.0000 1.0000
vn 0.9952 -0.0980 0.0000
vn 0.9952 0.0980 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0980 -0.9952 0.0000
vn 0.3827 -0.9239 0.0000
vn 0.7071 -0.7071 0.0000
vn 0.9239 -0.3827 0.0000
vn 0.0980 0.9952 0.0000
vn 0.3827 0.9239 0.0000
vn 0.7071 0.7071 0.0000
vn 0.9239 0.3827 0.0000
vn 0.0000 1.0000 0.0000
usemtl Default_OBJ.007
s off
f 1/1/1 2/2/1 3/3/1
f 4/4/1 1/1/1 3/3/1
f 5/5/2 6/6/2 7/7/2
f 8/8/2 9/9/2 10/10/2
f 5/5/2 1/1/2 4/4/2
f 5/5/2 8/8/2 1/1/2
f 8/8/2 11/11/2 9/9/2
f 11/11/2 5/5/2 7/7/2
f 12/12/2 11/11/2 7/7/2
f 13/13/2 8/8/2 10/10/2
f 11/11/2 8/8/2 5/5/2
f 14/14/2 10/10/2 9/9/2
f 15/15/3 3/3/3 2/2/3
f 15/15/3 2/2/3 16/16/3
f 16/16/3 17/17/3 15/15/3
f 17/17/3 18/18/3 15/15/3
f 16/16/3 19/19/3 20/20/3
f 21/21/3 15/15/3 22/22/3
f 17/17/3 16/16/3 20/20/3
f 18/18/3 23/23/3 22/22/3
f 15/15/3 18/18/3 22/22/3
f 20/20/3 24/24/3 17/17/3
s 1
f 9/25/4 11/26/5 18/27/5 17/28/4
f 2/29/6 1/30/6 8/31/7 16/32/7
f 16/32/7 8/31/7 13/33/8 19/34/8
f 19/34/8 13/33/8 10/35/9 20/36/9
f 20/37/9 10/38/9 14/39/10 24/40/10
f 24/40/10 14/39/10 9/25/4 17/28/4
f 5/41/11 15/42/11 21/43/12 6/44/12
f 6/44/12 21/43/12 22/45/13 7/46/13
f 7/47/13 22/48/13 23/49/14 12/50/14
f 12/50/14 23/49/14 18/27/5 11/26/5
f 4/51/15 3/52/15 15/42/11 5/41/11

View File

@@ -0,0 +1,92 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
mtllib c001111.mtl
o Cube_Cube.011
v 0.505169 -0.500000 -0.494698
v -0.494698 -0.500000 -0.505169
v 0.495745 -0.500000 0.405174
v 0.494698 -0.399961 0.505208
v 0.495005 -0.470699 0.475909
v 0.494698 0.499961 0.505208
v 0.495344 -0.492385 0.443455
v 0.494777 -0.438244 0.497593
v -0.504122 -0.500000 0.394704
v -0.505169 -0.399961 0.494737
v -0.505169 0.499961 0.494737
v -0.504523 -0.492385 0.432985
v -0.504863 -0.470699 0.465438
v 0.505169 0.500000 -0.494698
v -0.494698 0.500000 -0.505169
v -0.505090 -0.438244 0.487123
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.150010 0.525010
vt 0.349990 0.525010
vt 0.349990 0.724990
vt 0.150010 0.724990
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.599990 0.234561
vt 0.400010 0.234561
vt 0.599990 0.250000
vt 0.400010 0.250000
vt 0.125000 0.724990
vt 0.125000 0.525010
vt 0.140439 0.525010
vt 0.140439 0.724990
vn 0.9280 -0.3696 0.0461
vn 0.8262 -0.0544 0.5607
vn 0.8279 -0.3922 0.4009
vn 0.8122 0.4082 0.4168
vn 0.4436 -0.8264 0.3469
vn 0.4385 -0.3423 0.8310
vn 0.5834 -0.5774 -0.5713
vn 0.5834 0.5774 -0.5713
vn -0.8990 -0.0438 0.4357
vn -0.9013 0.3015 -0.3110
vn -0.8948 -0.4451 0.0344
vn -0.3997 -0.4082 -0.8207
vn -0.4508 -0.8263 0.3376
vn -0.8361 -0.3922 0.3835
vn -0.4125 0.8165 0.4040
vn -0.4558 -0.3423 0.8216
usemtl Default_OBJ.007
s 1
f 3/1/1 4/2/2 5/3/3
f 3/1/1 6/4/4 4/2/2
f 7/5/5 3/1/1 5/3/3
f 8/6/6 5/3/3 4/2/2
f 1/7/7 14/8/8 3/1/1
f 10/9/9 15/10/10 9/11/11
f 14/8/8 2/12/12 15/10/10
f 9/11/11 12/13/13 13/14/14
f 11/15/15 14/8/8 15/10/10
f 10/9/9 9/11/11 13/14/14
f 11/15/15 6/4/4 14/8/8
f 14/8/8 1/7/7 2/12/12
f 13/14/14 16/16/16 10/9/9
f 4/17/2 6/18/4 11/19/15 10/20/9
f 2/21/12 1/22/7 3/23/1 9/24/11
f 9/24/11 3/23/1 7/25/5 12/26/13
f 12/26/13 7/25/5 5/27/3 13/28/14
f 13/29/14 5/30/3 8/31/6 16/32/16
f 16/32/16 8/31/6 4/17/2 10/20/9
f 14/8/8 6/4/4 3/1/1
f 15/10/10 2/12/12 9/11/11
f 11/15/15 15/10/10 10/9/9

View File

@@ -0,0 +1,45 @@
# Blender v2.82 (sub 7) OBJ File: ''
# www.blender.org
o Cube_Cube.001
v 0.499961 0.500000 -0.499961
v 0.499961 -0.500000 -0.499961
v 0.499961 0.500000 0.499961
v 0.499961 -0.500000 0.499961
v -0.499961 0.500000 -0.499961
v -0.499961 -0.500000 -0.499961
v -0.499961 0.500000 0.499961
v -0.499961 -0.500000 0.499961
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.000000 0.000000
vt 0.400010 0.025010
vt 0.599990 0.025010
vt 0.599990 0.224990
vt 0.400010 0.224990
vt 0.400010 0.525010
vt 0.599990 0.525010
vt 0.599990 0.724990
vt 0.400010 0.724990
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -0.0000 1.0000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 1.0000 0.0000
s off
f 2/1/1 6/2/1 5/3/1
f 1/4/1 2/1/1 5/3/1
f 3/5/2 2/1/2 1/4/2
f 3/5/2 4/6/2 2/1/2
f 7/7/3 5/3/3 6/2/3
f 7/7/3 6/2/3 8/8/3
f 4/6/4 7/7/4 8/8/4
f 4/6/4 3/5/4 7/7/4
s 1
f 6/9/5 2/10/5 4/11/5 8/12/5
f 1/13/6 5/14/6 7/15/6 3/16/6

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because it is too large Load Diff

525
public/somaesque/worker.js Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="600"
height="200"
viewBox="0 0 158.74999 52.916668"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
sodipodi:docname="leaf-hrule.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="0.7071068"
inkscape:cx="137.17871"
inkscape:cy="316.78383"
inkscape:window-width="1266"
inkscape:window-height="1393"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g5" /><defs
id="defs1" /><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"><g
id="g5"
style="fill:#000000;stroke:#000000;stroke-opacity:1;stroke-width:1.3;stroke-dasharray:none;fill-opacity:1"><path
id="path2-0"
style="baseline-shift:baseline;display:inline;overflow:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.929481;stroke-dasharray:none;stroke-opacity:1;enable-background:accumulate;stop-color:#000000"
d="M 103.36799,2.0313828 C 97.919154,6.8995967 91.471199,11.753746 84.827928,14.831058 c -4.362977,1.802096 -7.940465,3.040049 -11.394641,4.403503 -3.454176,1.363449 -6.340528,3.057676 -8.267644,6.14033 -5.22085,8.35138 -2.842185,15.068204 -2.842185,18.481449 0,1.724681 -0.525164,2.55968 -1.088384,3.071689 -0.281623,0.256023 -0.581502,0.429253 -0.853178,0.571351 -0.271683,0.142059 -0.508375,0.220652 -0.726356,0.438636 l -0.312575,0.312841 0.34742,0.273911 c 0,0 0.43272,0.34337 0.861888,0.72737 0.325042,0.274708 0.981643,0.921464 1.438104,1.018694 0.121413,-0.33841 0.149273,-0.378664 0.20343,-0.574424 0.08654,-0.303399 0.232353,-0.750599 0.467589,-1.236469 0.470475,-0.971733 1.282748,-2.076821 2.688155,-2.56133 1.994639,-0.687658 5.353958,-1.426431 8.946599,-2.343299 4.779239,-1.219641 10.22039,-3.069062 15.235023,-8.379103 3.958164,-4.191327 5.964278,-9.648825 8.06647,-14.648789 2.546547,-6.056845 4.690947,-13.8886065 5.770337,-18.4960119 z m -1.6799,2.6207028 C 99.213484,8.7236849 95.38472,13.701658 91.668482,16.58763 87.307543,19.974273 83.212921,21.794112 74.737857,30.305127 70.346392,34.715218 65.920596,41.07391 62.74313,46.05384 c 0.225405,-0.579954 0.367657,-1.301376 0.367657,-2.1975 0,-3.821879 -2.329429,-9.983672 2.722028,-18.064078 1.809189,-2.894025 4.502799,-4.488442 7.889987,-5.825454 3.387197,-1.337011 6.985264,-2.582493 11.406427,-4.408627 C 91.756327,12.8209 98.71462,7.200396 101.68809,4.6520856 Z m 0.41378,0.8876305 c -0.71109,2.8413561 -2.647102,8.5402999 -5.229556,14.6825349 -2.098514,4.991206 -4.085673,10.360534 -7.913256,14.413589 -4.882789,5.17043 -10.123643,6.948053 -14.857624,8.156201 -3.576477,0.912731 -6.922349,1.642756 -9.008606,2.362003 -0.373131,0.128561 -0.710252,0.293891 -1.014844,0.485256 3.110097,-4.803562 7.240508,-10.637834 11.291177,-14.705694 8.418826,-8.454539 12.395209,-10.186264 16.846328,-13.642933 3.719463,-2.888477 7.372902,-7.7041657 9.886381,-11.7509569 z"
sodipodi:nodetypes="csssssscccscssscsscccscssssccsssscsscs" /><path
id="path2-0-3"
style="baseline-shift:baseline;display:inline;overflow:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.929481;stroke-dasharray:none;stroke-opacity:1;enable-background:accumulate;stop-color:#000000"
d="M 52.941073,2.0313827 C 47.492246,6.8995966 41.044291,11.753746 34.40102,14.831058 c -4.362977,1.802096 -7.940465,3.040049 -11.394641,4.403503 -3.454176,1.363449 -6.340528,3.057676 -8.267644,6.14033 -5.22085,8.35138 -2.842185,15.068204 -2.842185,18.481449 0,1.724681 -0.525164,2.55968 -1.088384,3.071689 -0.281623,0.256023 -0.581502,0.429253 -0.853178,0.571351 -0.271683,0.142059 -0.508375,0.220652 -0.726356,0.438636 l -0.312575,0.312841 0.34742,0.273911 c 0,0 0.43272,0.34337 0.861888,0.72737 0.325042,0.274708 0.981643,0.921464 1.438104,1.018694 0.121413,-0.33841 0.149273,-0.378664 0.20343,-0.574424 0.08654,-0.303399 0.232353,-0.750599 0.467589,-1.236469 0.470475,-0.971733 1.282748,-2.076821 2.688155,-2.56133 1.994639,-0.687658 5.353958,-1.426431 8.946599,-2.343299 4.779239,-1.219641 10.22039,-3.069062 15.235023,-8.379103 3.958164,-4.191327 5.964278,-9.648825 8.06647,-14.648789 2.546551,-6.056845 4.690938,-13.8886066 5.770328,-18.496012 z m -1.6799,2.6207028 C 48.786576,8.7236848 44.957812,13.701658 41.241574,16.58763 36.880635,19.974273 32.786013,21.794112 24.310949,30.305127 19.919484,34.715218 15.493688,41.07391 12.316222,46.05384 c 0.225405,-0.579954 0.367657,-1.301376 0.367657,-2.1975 0,-3.821879 -2.329429,-9.983672 2.722028,-18.064078 1.809189,-2.894025 4.502799,-4.488442 7.889987,-5.825454 3.387197,-1.337011 6.985264,-2.582493 11.406427,-4.408627 C 41.329419,12.8209 48.287712,7.2003959 51.261173,4.6520855 Z m 0.41378,0.8876305 c -0.711087,2.8413561 -2.647093,8.5403 -5.229547,14.682535 -2.098514,4.991206 -4.085673,10.360534 -7.913256,14.413589 -4.882789,5.17043 -10.123643,6.948053 -14.857624,8.156201 -3.576477,0.912731 -6.922349,1.642756 -9.008606,2.362003 -0.373131,0.128561 -0.710252,0.293891 -1.014844,0.485256 3.110097,-4.803562 7.240508,-10.637834 11.291177,-14.705694 8.418826,-8.454539 12.395209,-10.186264 16.846328,-13.642933 3.719463,-2.888477 7.372902,-7.7041657 9.886372,-11.750957 z"
sodipodi:nodetypes="csssssscccscssscsscccscssssccsssscsscs" /><path
id="path2-0-0"
style="baseline-shift:baseline;display:inline;overflow:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.929481;stroke-dasharray:none;stroke-opacity:1;enable-background:accumulate;stop-color:#000000"
d="m 153.79494,2.0313831 c -5.44882,4.868213 -11.89678,9.7223629 -18.54005,12.7996749 -4.36298,1.802096 -7.94047,3.040049 -11.39464,4.403503 -3.45418,1.363449 -6.34053,3.057676 -8.26765,6.14033 -5.22084,8.35138 -2.84218,15.068204 -2.84218,18.481449 0,1.724681 -0.52516,2.55968 -1.08838,3.071689 -0.28163,0.256023 -0.58151,0.429253 -0.85318,0.571351 -0.27168,0.142059 -0.50838,0.220652 -0.72636,0.438636 l -0.31257,0.312841 0.34742,0.273911 c 0,0 0.43272,0.34337 0.86189,0.72737 0.32504,0.274708 0.98164,0.921464 1.4381,1.018694 0.12141,-0.33841 0.14927,-0.378664 0.20343,-0.574424 0.0865,-0.303399 0.23235,-0.750599 0.46759,-1.236469 0.47047,-0.971733 1.28275,-2.076821 2.68815,-2.56133 1.99464,-0.687658 5.35396,-1.426431 8.9466,-2.343299 4.77924,-1.219641 10.22039,-3.069062 15.23502,-8.379103 3.95817,-4.191327 5.96428,-9.648825 8.06647,-14.648789 2.54656,-6.056845 4.69094,-13.8886069 5.77033,-18.4960119 z m -1.6799,2.620702 c -2.47459,4.0716 -6.30336,9.0495729 -10.0196,11.9355449 -4.36093,3.386643 -8.45556,5.206482 -16.93062,13.717497 -4.39147,4.410091 -8.81726,10.768783 -11.99473,15.748713 0.22541,-0.579954 0.36766,-1.301376 0.36766,-2.1975 0,-3.821879 -2.32943,-9.983672 2.72203,-18.064078 1.80919,-2.894025 4.5028,-4.488442 7.88998,-5.825454 3.3872,-1.337011 6.98527,-2.582493 11.40643,-4.408627 6.6271,-2.737281 13.58539,-8.3577849 16.55885,-10.9060959 z m 0.41378,0.887631 c -0.71108,2.841356 -2.64709,8.5402999 -5.22954,14.6825349 -2.09852,4.991206 -4.08568,10.360534 -7.91326,14.413589 -4.88279,5.17043 -10.12364,6.948053 -14.85762,8.156201 -3.57648,0.912731 -6.92235,1.642756 -9.00861,2.362003 -0.37313,0.128561 -0.71025,0.293891 -1.01484,0.485256 3.11009,-4.803562 7.2405,-10.637834 11.29117,-14.705694 8.41883,-8.454539 12.39521,-10.186264 16.84633,-13.642933 3.71946,-2.888477 7.3729,-7.7041657 9.88637,-11.7509569 z"
sodipodi:nodetypes="csssssscccscssscsscccscssssccsssscsscs" /></g></g></svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Binary file not shown.

96
public/static/theme.css Normal file
View File

@@ -0,0 +1,96 @@
@font-face {
font-family: "Quattrocento";
font-style: regular;
src: local("Quattrocento"), url("assets/quattrocento-regular.ttf") format("truetype")
}
@font-face {
font-family: "Quattrocento";
font-style: bold;
src: local("Quattrocento"), url("assets/quattrocento-bold.ttf") format("truetype");
}
@font-face {
font-family: "Baskervville";
font-style: regular;
src: local("Baskervville"), url("assets/baskervville.ttf") format("truetype")
}
@font-face {
font-family: "Baskervville";
font-style: italic;
src: local("Baskervville"), url("assets/baskervville-italic.ttf") format("truetype");
}
:root {
--dj-palette1: #83a6bf;
--dj-palette2: #5e81ac;
--dj-palette3: #8fbcbb;
--dj-prose: #98aab7;
--dj-visited: #8d8bd5;
--dj-bgpalette1: #2e3440;
}
html, body {
box-sizing: border-box;
background-color: var(--dj-bgpalette1);
color: var(--dj-palette1);
margin: 0;
padding: 0;
font-family: "Quattrocento", serif;
font-optical-sizing: auto;
font-style: normal;
font-size: 16px;
}
hr {
border: 0;
height: 1px;
background-image: linear-gradient(to right, transparent, var(--dj-prose), transparent);
margin: 40px 0 40px 0;
width: 100%;
&::before, &::after {
content: ' ';
position: absolute;
display: block;
margin: auto;
left: 0;
right: 0;
transform: translateY(-50%);
}
&::before {
background-color: var(--dj-bgpalette1);
width: 74px;
height: 30px;
}
&::after {
width: 66px;
height: 22px;
background-color: var(--dj-prose);
background-size: cover;
mask-image: url('assets/leaf-hrule.svg');
mask-size: cover;
}
}
p {
color: var(--dj-prose);
}
h1, h2, h3, h4, h5, nav, .dj-title {
font-family: "Baskervville", serif;
font-optical-sizing: auto;
font-weight: 400;
font-style: normal;
}
.spectral-regular, body {
font-family: "Spectral", serif;
font-weight: 400;
font-style: normal;
font-size: 19px;
}