big updats

This commit is contained in:
Daniel Ledda
2025-12-20 00:10:42 +01:00
parent a93ffff00d
commit 51e44db779
25 changed files with 570 additions and 203 deletions

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 = {
@@ -122,7 +122,7 @@ export default defineComponent({
{...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> </div>
</>; </>;
}, },

View File

@@ -1,23 +1,23 @@
export type DJAPIEndpoint = "/rp-articles"; export type DjAPIEndpoint = "/rp-articles";
type RPArticle = { type RPArticle = {
title: string, title: string,
slug: string; slug: string;
titleDe: string, titleDe: string,
titleEn: string, titleEn: string,
author: string, author: string,
tags?: string[], tags?: string[],
}; };
export interface DJAPIResultMap extends Record<DJAPIEndpoint, unknown> { export interface DjAPIResultMap extends Record<DjAPIEndpoint, unknown> {
"/rp-articles": RPArticle[]; "/rp-articles": RPArticle[];
} }
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();
} }

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

@@ -0,0 +1,39 @@
import { defineComponent, ref } from "vue";
import useHead from "@/useHead.ts";
import DjTooltip, { setupTooltip } from "@/DjTooltip.tsx";
import { addCSS, css } from "@/util.ts";
const styles = css`
.supercontainer {
width: 100vw;
display: flex;
flex-direction: column;
align-items: center;
}
.container {
width: 800px;
}
`;
export default defineComponent({
name: "app-root",
setup() {
addCSS('dj-blog-root', styles);
useHead({ title: "djblog Home" });
const tooltipCarrier = ref<HTMLDivElement | null>(null);
setupTooltip({ carrier: tooltipCarrier });
return () => <>
<div ref={tooltipCarrier} class="tooltip-carrier" />
<div class="supercontainer">
<div class="container">
<DjTooltip tooltip="come in and find out...">
<h1>dj blog</h1>
</DjTooltip>
</div>
</div>
</>;
},
});

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

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

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

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

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,15 +34,12 @@ 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 ?? '',
metatags: () => articleMetadata.value ? [ metatags: () => articleMetadata.value ? [
{ name: 'title', content: articleMetadata.value.title }, { name: 'title', content: articleMetadata.value.title },
{ name: 'author', content: articleMetadata.value.author }, { name: 'author', content: articleMetadata.value.author },
@@ -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.all([ 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="Ray's original website with articles and bookstore"> <DjTooltip tooltip="Ray's original website with articles and bookstore">
<a href="https://raypeat.com">raypeat.com</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.net</a> {new Date().getFullYear()} - <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,7 +1,7 @@
import { defineComponent, computed, ref, type Ref } from "vue"; import { defineComponent, computed, ref, type Ref } from "vue";
import useHead from "@/useHead.ts"; import useHead from "@/useHead.ts";
import DJTooltip, { setupTooltip } from "@/DJTooltip.tsx"; import DjTooltip, { setupTooltip } from "@/DjTooltip.tsx";
import DJEmail from "@/DJEmail.tsx"; import DjEmail from "@/DjEmail.tsx";
export default defineComponent({ export default defineComponent({
name: "app-root", name: "app-root",
@@ -33,64 +33,64 @@ export default defineComponent({
<div class="supercontainer"> <div class="supercontainer">
<div class={{ shakeable: true, shakeMe: shaking.value }}> <div class={{ shakeable: true, shakeMe: shaking.value }}>
<div class="title_name"> <div class="title_name">
<DJTooltip tooltip="I wonder what he's listening to?"> <DjTooltip tooltip="I wonder what he's listening to?">
<img src="/home/img/dj.gif" alt="dj legt krasse Mucke auf" <img src="/home/img/dj.gif" alt="dj legt krasse Mucke auf"
class={{ dude: true, spinMe: dude1Spinning.value }} class={{ dude: true, spinMe: dude1Spinning.value }}
onClick={ (e) => toggleDude(e, dude1Spinning)} /> onClick={ (e) => toggleDude(e, dude1Spinning)} />
</DJTooltip> </DjTooltip>
<DJTooltip tooltip="Easily the coolest guy out there."> <DjTooltip tooltip="Easily the coolest guy out there.">
<span>DJ Ledda</span> <span>DJ Ledda</span>
</DJTooltip> </DjTooltip>
<DJTooltip tooltip="I once heard this guy played at revs."> <DjTooltip tooltip="I once heard this guy played at revs.">
<img src="/home/img/dj.gif" alt="dj laying down some sick beats" <img src="/home/img/dj.gif" alt="dj laying down some sick beats"
class={{ dude: true, spinMe: dude2Spinning.value }} class={{ dude: true, spinMe: dude2Spinning.value }}
onClick={ (e) => toggleDude(e, dude2Spinning) } /> onClick={ (e) => toggleDude(e, dude2Spinning) } />
</DJTooltip> </DjTooltip>
</div> </div>
<div class="main"> <div class="main">
<div class="subject"> <div class="subject">
<div class="resourcelist"> <div class="resourcelist">
<a href="https://drum-slayer.com"> <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."> <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 Drum Slayer
</DJTooltip> </DjTooltip>
</a> </a>
<a href="/somaesque/index.html"> <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."> <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 Somaesque
</DJTooltip> </DjTooltip>
</a> </a>
<a href="/generative-energy"> <a href="/generative-energy">
<DJTooltip class="resource" tooltip="Thyroid calculator, German translations, and more..."> <DjTooltip class="resource" tooltip="Thyroid calculator, German translations, and more...">
Generative Energy - Ray Peat Resources Generative Energy - Ray Peat Resources
</DJTooltip> </DjTooltip>
</a> </a>
<a href="/home/muenchen-auf-englisch.html"> <a href="/home/muenchen-auf-englisch.html">
<DJTooltip class="resource" tooltip=" <DjTooltip class="resource" tooltip="
Authentic historically accurate translations of all of Munich's S-Bahn and U-Bahn 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 stations, as well as the main municipalities, into English. You live in Allach? It's
Axleigh now. Giesing? Nope! Kyesing! This is a WIP. Axleigh now. Giesing? Nope! Kyesing! This is a WIP.
"> ">
M&uuml;nchen auf Englisch - Munich in English M&uuml;nchen auf Englisch - Munich in English
</DJTooltip> </DjTooltip>
</a> </a>
<a href="/kadi/"> <a href="/kadi/">
<DJTooltip class="resource" tooltip="Make an account and start saving paper and tracking your Yatzy stats with your <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 friends! Make your own rulesets, and more. Built with React, express.js, and
MongoDB. Currently inactive."> MongoDB. Currently inactive.">
K A D I: Online Yatzy Scoresheets K A D I: Online Yatzy Scoresheets
</DJTooltip> </DjTooltip>
</a> </a>
<a href="https://git.djledda.net/Ledda"> <a href="https://git.djledda.net/Ledda">
<DJTooltip class="resource" tooltip="Check out what I'm coding!"> <DjTooltip class="resource" tooltip="Check out what I'm coding!">
My git projects My git projects
</DJTooltip> </DjTooltip>
</a> </a>
<DJEmail> <DjEmail>
<DJTooltip class="resource" tooltip="You'll see my address when you click here."> <DjTooltip class="resource" tooltip="You'll see my address when you click here.">
Click here to get in touch Click here to get in touch
</DJTooltip> </DjTooltip>
</DJEmail> </DjEmail>
</div> </div>
</div> </div>
</div> </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");

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.5.26",
"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",

408
deno.lock generated
View File

@@ -1,36 +1,60 @@
{ {
"version": "4", "version": "5",
"specifiers": { "specifiers": {
"jsr:@b-fuze/deno-dom@*": "0.1.48", "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.24": "1.0.24",
"jsr:@std/cli@^1.0.6": "1.0.6", "jsr:@std/cli@^1.0.6": "1.0.6",
"jsr:@std/encoding@1": "1.0.10",
"jsr:@std/encoding@^1.0.10": "1.0.10",
"jsr:@std/encoding@^1.0.5": "1.0.5", "jsr:@std/encoding@^1.0.5": "1.0.5",
"jsr:@std/fmt@0.223": "0.223.0", "jsr:@std/fmt@0.223": "0.223.0",
"jsr:@std/fmt@1": "1.0.8",
"jsr:@std/fmt@^1.0.3": "1.0.3", "jsr:@std/fmt@^1.0.3": "1.0.3",
"jsr:@std/fmt@^1.0.8": "1.0.8",
"jsr:@std/fs@*": "0.223.0", "jsr:@std/fs@*": "0.223.0",
"jsr:@std/fs@0.223": "0.223.0", "jsr:@std/fs@0.223": "0.223.0",
"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.9", "jsr:@std/http@*": "1.0.9",
"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.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.4": "1.0.4",
"jsr:@std/net@^1.0.6": "1.0.6",
"jsr:@std/path@*": "1.0.7", "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": "1.1.3",
"jsr:@std/path@^1.0.7": "1.0.7", "jsr:@std/path@^1.0.7": "1.0.7",
"jsr:@std/path@^1.1.3": "1.1.3",
"jsr:@std/streams@^1.0.14": "1.0.14",
"jsr:@std/streams@^1.0.7": "1.0.7", "jsr:@std/streams@^1.0.7": "1.0.7",
"npm:@types/node@*": "22.5.4", "npm:@types/node@*": "22.5.4",
"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.12",
"npm:vue@*": "3.5.12", "npm:vue@*": "3.5.26",
"npm:vue@^3.5.12": "3.5.12" "npm:vue@^3.5.26": "3.5.26"
}, },
"jsr": { "jsr": {
"@b-fuze/deno-dom@0.1.48": { "@b-fuze/deno-dom@0.1.48": {
"integrity": "bf5b591aef2e9e9c59adfcbb93a9ecd45bab5b7c8263625beafa5c8f1662e7da" "integrity": "bf5b591aef2e9e9c59adfcbb93a9ecd45bab5b7c8263625beafa5c8f1662e7da"
}, },
"@b-fuze/deno-dom@0.1.56": {
"integrity": "8030e2dc1d8750f1682b53462ab893d9c3470f2287feecbe22f44a88c54ab148",
"dependencies": [
"jsr:@denosaurs/plug"
]
},
"@deno/cache-dir@0.13.2": { "@deno/cache-dir@0.13.2": {
"integrity": "c22419dfe27ab85f345bee487aaaadba498b005cce3644e9d2528db035c5454d", "integrity": "c22419dfe27ab85f345bee487aaaadba498b005cce3644e9d2528db035c5454d",
"dependencies": [ "dependencies": [
@@ -51,6 +75,15 @@
"@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"
}, },
@@ -60,15 +93,24 @@
"@std/cli@1.0.6": { "@std/cli@1.0.6": {
"integrity": "d22d8b38c66c666d7ad1f2a66c5b122da1704f985d3c47f01129f05abb6c5d3d" "integrity": "d22d8b38c66c666d7ad1f2a66c5b122da1704f985d3c47f01129f05abb6c5d3d"
}, },
"@std/cli@1.0.24": {
"integrity": "b655a5beb26aa94f98add6bc8889f5fb9bc3ee2cc3fc954e151201f4c4200a5e"
},
"@std/encoding@1.0.5": { "@std/encoding@1.0.5": {
"integrity": "ecf363d4fc25bd85bd915ff6733a7e79b67e0e7806334af15f4645c569fefc04" "integrity": "ecf363d4fc25bd85bd915ff6733a7e79b67e0e7806334af15f4645c569fefc04"
}, },
"@std/encoding@1.0.10": {
"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.3": {
"integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f" "integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f"
}, },
"@std/fmt@1.0.8": {
"integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7"
},
"@std/fs@0.223.0": { "@std/fs@0.223.0": {
"integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c", "integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c",
"dependencies": [ "dependencies": [
@@ -76,18 +118,45 @@
"jsr:@std/path@0.223" "jsr:@std/path@0.223"
] ]
}, },
"@std/fs@1.0.20": {
"integrity": "e953206aae48d46ee65e8783ded459f23bec7dd1f3879512911c35e5484ea187",
"dependencies": [
"jsr:@std/internal",
"jsr:@std/path@^1.1.3"
]
},
"@std/html@1.0.5": {
"integrity": "4e2d693f474cae8c16a920fa5e15a3b72267b94b84667f11a50c6dd1cb18d35e"
},
"@std/http@1.0.9": { "@std/http@1.0.9": {
"integrity": "d409fc319a5e8d4a154e576c758752e9700282d74f31357a12fec6420f9ecb6c", "integrity": "d409fc319a5e8d4a154e576c758752e9700282d74f31357a12fec6420f9ecb6c",
"dependencies": [ "dependencies": [
"jsr:@std/cli", "jsr:@std/cli@^1.0.6",
"jsr:@std/encoding", "jsr:@std/encoding@^1.0.5",
"jsr:@std/fmt@^1.0.3", "jsr:@std/fmt@^1.0.3",
"jsr:@std/media-types", "jsr:@std/media-types@^1.0.3",
"jsr:@std/net", "jsr:@std/net@^1.0.4",
"jsr:@std/path@^1.0.7", "jsr:@std/path@^1.0.7",
"jsr:@std/streams" "jsr:@std/streams@^1.0.7"
] ]
}, },
"@std/http@1.0.22": {
"integrity": "53f0bb70e23a2eec3e17c4240a85bb23d185b2e20635adb37ce0f03cc4ca012a",
"dependencies": [
"jsr:@std/cli@^1.0.24",
"jsr:@std/encoding@^1.0.10",
"jsr:@std/fmt@^1.0.8",
"jsr:@std/fs@^1.0.20",
"jsr:@std/html",
"jsr:@std/media-types@^1.1.0",
"jsr:@std/net@^1.0.6",
"jsr:@std/path@^1.1.3",
"jsr:@std/streams@^1.0.14"
]
},
"@std/internal@1.0.12": {
"integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027"
},
"@std/io@0.223.0": { "@std/io@0.223.0": {
"integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1",
"dependencies": [ "dependencies": [
@@ -98,9 +167,15 @@
"@std/media-types@1.0.3": { "@std/media-types@1.0.3": {
"integrity": "b12d30a7852f7578f4d210622df713bbfd1cbdd9b4ec2eaf5c1845ab70bab159" "integrity": "b12d30a7852f7578f4d210622df713bbfd1cbdd9b4ec2eaf5c1845ab70bab159"
}, },
"@std/media-types@1.1.0": {
"integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4"
},
"@std/net@1.0.4": { "@std/net@1.0.4": {
"integrity": "2f403b455ebbccf83d8a027d29c5a9e3a2452fea39bb2da7f2c04af09c8bc852" "integrity": "2f403b455ebbccf83d8a027d29c5a9e3a2452fea39bb2da7f2c04af09c8bc852"
}, },
"@std/net@1.0.6": {
"integrity": "110735f93e95bb9feb95790a8b1d1bf69ec0dc74f3f97a00a76ea5efea25500c"
},
"@std/path@0.223.0": { "@std/path@0.223.0": {
"integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989",
"dependencies": [ "dependencies": [
@@ -110,172 +185,363 @@
"@std/path@1.0.7": { "@std/path@1.0.7": {
"integrity": "76a689e07f0e15dcc6002ec39d0866797e7156629212b28f27179b8a5c3b33a1" "integrity": "76a689e07f0e15dcc6002ec39d0866797e7156629212b28f27179b8a5c3b33a1"
}, },
"@std/path@1.1.3": {
"integrity": "b015962d82a5e6daea980c32b82d2c40142149639968549c649031a230b1afb3",
"dependencies": [
"jsr:@std/internal"
]
},
"@std/streams@1.0.7": { "@std/streams@1.0.7": {
"integrity": "1a93917ca0c58c01b2bfb93647189229b1702677f169b6fb61ad6241cd2e499b" "integrity": "1a93917ca0c58c01b2bfb93647189229b1702677f169b6fb61ad6241cd2e499b"
},
"@std/streams@1.0.14": {
"integrity": "c0df6cdd73bd4bbcbe4baa89e323b88418c90ceb2d926f95aa99bdcdbfca2411"
} }
}, },
"npm": { "npm": {
"@babel/helper-string-parser@7.25.9": { "@babel/helper-string-parser@7.25.9": {
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@babel%2fhelper-string-parser/-/helper-string-parser-7.25.9.tgz"
},
"@babel/helper-string-parser@7.27.1": {
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@babel%2fhelper-string-parser/-/helper-string-parser-7.27.1.tgz"
}, },
"@babel/helper-validator-identifier@7.25.9": { "@babel/helper-validator-identifier@7.25.9": {
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@babel%2fhelper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz"
},
"@babel/helper-validator-identifier@7.28.5": {
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@babel%2fhelper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"
}, },
"@babel/parser@7.26.2": { "@babel/parser@7.26.2": {
"integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
"dependencies": [ "dependencies": [
"@babel/types" "@babel/types@7.26.0"
] ],
"bin": true,
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@babel%2fparser/-/parser-7.26.2.tgz"
},
"@babel/parser@7.28.5": {
"integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
"dependencies": [
"@babel/types@7.28.5"
],
"bin": true,
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@babel%2fparser/-/parser-7.28.5.tgz"
}, },
"@babel/types@7.26.0": { "@babel/types@7.26.0": {
"integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
"dependencies": [ "dependencies": [
"@babel/helper-string-parser", "@babel/helper-string-parser@7.25.9",
"@babel/helper-validator-identifier" "@babel/helper-validator-identifier@7.25.9"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@babel%2ftypes/-/types-7.26.0.tgz"
},
"@babel/types@7.28.5": {
"integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
"dependencies": [
"@babel/helper-string-parser@7.27.1",
"@babel/helper-validator-identifier@7.28.5"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@babel%2ftypes/-/types-7.28.5.tgz"
}, },
"@jridgewell/sourcemap-codec@1.5.0": { "@jridgewell/sourcemap-codec@1.5.0": {
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@jridgewell%2fsourcemap-codec/-/sourcemap-codec-1.5.0.tgz"
},
"@jridgewell/sourcemap-codec@1.5.5": {
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@jridgewell%2fsourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
}, },
"@types/node@22.5.4": { "@types/node@22.5.4": {
"integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==",
"dependencies": [ "dependencies": [
"undici-types" "undici-types"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@types%2fnode/-/node-22.5.4.tgz"
}, },
"@vue/compiler-core@3.5.12": { "@vue/compiler-core@3.5.12": {
"integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
"dependencies": [ "dependencies": [
"@babel/parser", "@babel/parser@7.26.2",
"@vue/shared", "@vue/shared@3.5.12",
"entities", "entities@4.5.0",
"estree-walker", "estree-walker",
"source-map-js" "source-map-js"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fcompiler-core/-/compiler-core-3.5.12.tgz"
},
"@vue/compiler-core@3.5.26": {
"integrity": "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==",
"dependencies": [
"@babel/parser@7.28.5",
"@vue/shared@3.5.26",
"entities@7.0.0",
"estree-walker",
"source-map-js"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fcompiler-core/-/compiler-core-3.5.26.tgz"
}, },
"@vue/compiler-dom@3.5.12": { "@vue/compiler-dom@3.5.12": {
"integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==",
"dependencies": [ "dependencies": [
"@vue/compiler-core", "@vue/compiler-core@3.5.12",
"@vue/shared" "@vue/shared@3.5.12"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fcompiler-dom/-/compiler-dom-3.5.12.tgz"
},
"@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"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fcompiler-dom/-/compiler-dom-3.5.26.tgz"
}, },
"@vue/compiler-sfc@3.5.12": { "@vue/compiler-sfc@3.5.12": {
"integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
"dependencies": [ "dependencies": [
"@babel/parser", "@babel/parser@7.26.2",
"@vue/compiler-core", "@vue/compiler-core@3.5.12",
"@vue/compiler-dom", "@vue/compiler-dom@3.5.12",
"@vue/compiler-ssr", "@vue/compiler-ssr@3.5.12",
"@vue/shared", "@vue/shared@3.5.12",
"estree-walker", "estree-walker",
"magic-string", "magic-string@0.30.12",
"postcss", "postcss@8.4.47",
"source-map-js" "source-map-js"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fcompiler-sfc/-/compiler-sfc-3.5.12.tgz"
},
"@vue/compiler-sfc@3.5.26": {
"integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==",
"dependencies": [
"@babel/parser@7.28.5",
"@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",
"magic-string@0.30.21",
"postcss@8.5.6",
"source-map-js"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fcompiler-sfc/-/compiler-sfc-3.5.26.tgz"
}, },
"@vue/compiler-ssr@3.5.12": { "@vue/compiler-ssr@3.5.12": {
"integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==",
"dependencies": [ "dependencies": [
"@vue/compiler-dom", "@vue/compiler-dom@3.5.12",
"@vue/shared" "@vue/shared@3.5.12"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fcompiler-ssr/-/compiler-ssr-3.5.12.tgz"
},
"@vue/compiler-ssr@3.5.26": {
"integrity": "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==",
"dependencies": [
"@vue/compiler-dom@3.5.26",
"@vue/shared@3.5.26"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fcompiler-ssr/-/compiler-ssr-3.5.26.tgz"
}, },
"@vue/devtools-api@6.6.4": { "@vue/devtools-api@6.6.4": {
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fdevtools-api/-/devtools-api-6.6.4.tgz"
}, },
"@vue/reactivity@3.5.12": { "@vue/reactivity@3.5.12": {
"integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==",
"dependencies": [ "dependencies": [
"@vue/shared" "@vue/shared@3.5.12"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2freactivity/-/reactivity-3.5.12.tgz"
},
"@vue/reactivity@3.5.26": {
"integrity": "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==",
"dependencies": [
"@vue/shared@3.5.26"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2freactivity/-/reactivity-3.5.26.tgz"
}, },
"@vue/runtime-core@3.5.12": { "@vue/runtime-core@3.5.12": {
"integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==",
"dependencies": [ "dependencies": [
"@vue/reactivity", "@vue/reactivity@3.5.12",
"@vue/shared" "@vue/shared@3.5.12"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fruntime-core/-/runtime-core-3.5.12.tgz"
},
"@vue/runtime-core@3.5.26": {
"integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==",
"dependencies": [
"@vue/reactivity@3.5.26",
"@vue/shared@3.5.26"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fruntime-core/-/runtime-core-3.5.26.tgz"
}, },
"@vue/runtime-dom@3.5.12": { "@vue/runtime-dom@3.5.12": {
"integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==",
"dependencies": [ "dependencies": [
"@vue/reactivity", "@vue/reactivity@3.5.12",
"@vue/runtime-core", "@vue/runtime-core@3.5.12",
"@vue/shared", "@vue/shared@3.5.12",
"csstype" "csstype@3.1.3"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fruntime-dom/-/runtime-dom-3.5.12.tgz"
},
"@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@3.2.3"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fruntime-dom/-/runtime-dom-3.5.26.tgz"
}, },
"@vue/server-renderer@3.5.12_vue@3.5.12": { "@vue/server-renderer@3.5.12_vue@3.5.12": {
"integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==",
"dependencies": [ "dependencies": [
"@vue/compiler-ssr", "@vue/compiler-ssr@3.5.12",
"@vue/shared", "@vue/shared@3.5.12",
"vue" "vue@3.5.12"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fserver-renderer/-/server-renderer-3.5.12.tgz"
},
"@vue/server-renderer@3.5.26_vue@3.5.26": {
"integrity": "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==",
"dependencies": [
"@vue/compiler-ssr@3.5.26",
"@vue/shared@3.5.26",
"vue@3.5.26"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fserver-renderer/-/server-renderer-3.5.26.tgz"
}, },
"@vue/shared@3.5.12": { "@vue/shared@3.5.12": {
"integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==" "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fshared/-/shared-3.5.12.tgz"
},
"@vue/shared@3.5.26": {
"integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/@vue%2fshared/-/shared-3.5.26.tgz"
}, },
"csstype@3.1.3": { "csstype@3.1.3": {
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/csstype/-/csstype-3.1.3.tgz"
},
"csstype@3.2.3": {
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/csstype/-/csstype-3.2.3.tgz"
}, },
"entities@4.5.0": { "entities@4.5.0": {
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/entities/-/entities-4.5.0.tgz"
},
"entities@7.0.0": {
"integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/entities/-/entities-7.0.0.tgz"
}, },
"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==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/estree-walker/-/estree-walker-2.0.2.tgz"
}, },
"magic-string@0.30.12": { "magic-string@0.30.12": {
"integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
"dependencies": [ "dependencies": [
"@jridgewell/sourcemap-codec" "@jridgewell/sourcemap-codec@1.5.0"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/magic-string/-/magic-string-0.30.12.tgz"
},
"magic-string@0.30.21": {
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dependencies": [
"@jridgewell/sourcemap-codec@1.5.5"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/magic-string/-/magic-string-0.30.21.tgz"
},
"nanoid@3.3.11": {
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"bin": true,
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/nanoid/-/nanoid-3.3.11.tgz"
}, },
"nanoid@3.3.7": { "nanoid@3.3.7": {
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"bin": true,
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/nanoid/-/nanoid-3.3.7.tgz"
}, },
"picocolors@1.1.1": { "picocolors@1.1.1": {
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/picocolors/-/picocolors-1.1.1.tgz"
}, },
"postcss@8.4.47": { "postcss@8.4.47": {
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
"dependencies": [ "dependencies": [
"nanoid", "nanoid@3.3.7",
"picocolors", "picocolors",
"source-map-js" "source-map-js"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/postcss/-/postcss-8.4.47.tgz"
},
"postcss@8.5.6": {
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"dependencies": [
"nanoid@3.3.11",
"picocolors",
"source-map-js"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/postcss/-/postcss-8.5.6.tgz"
}, },
"source-map-js@1.2.1": { "source-map-js@1.2.1": {
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/source-map-js/-/source-map-js-1.2.1.tgz"
}, },
"undici-types@6.19.8": { "undici-types@6.19.8": {
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/undici-types/-/undici-types-6.19.8.tgz"
}, },
"vue-router@4.4.5_vue@3.5.12": { "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.12"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/vue-router/-/vue-router-4.4.5.tgz"
}, },
"vue@3.5.12": { "vue@3.5.12": {
"integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==",
"dependencies": [ "dependencies": [
"@vue/compiler-dom", "@vue/compiler-dom@3.5.12",
"@vue/compiler-sfc", "@vue/compiler-sfc@3.5.12",
"@vue/runtime-dom", "@vue/runtime-dom@3.5.12",
"@vue/server-renderer", "@vue/server-renderer@3.5.12_vue@3.5.12",
"@vue/shared" "@vue/shared@3.5.12"
] ],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/vue/-/vue-3.5.12.tgz"
},
"vue@3.5.26": {
"integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
"dependencies": [
"@vue/compiler-dom@3.5.26",
"@vue/compiler-sfc@3.5.26",
"@vue/runtime-dom@3.5.26",
"@vue/server-renderer@3.5.26_vue@3.5.26",
"@vue/shared@3.5.26"
],
"tarball": "http://npm.srv.dc1.boerse-go.de:4873/vue/-/vue-3.5.26.tgz"
} }
}, },
"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.5.26"
] ]
} }
} }

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";

22
main.ts
View File

@@ -1,20 +1,20 @@
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 parser = new DOMParser(); const parser = new DOMParser();
function appHeaderScript(params: { ssrContext: DJSSRContext, entryPath: string }) { 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') }
@@ -55,7 +55,7 @@ for await (const path of publicFiles) {
} }
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 +76,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');
@@ -197,7 +197,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,51 @@
<title>Poof, and it's gone</title>
<article>
<p>
Since reading Ray Peat's work and drastically improving my wellbeing, something that had been declining for years, I've
been thinking more and more often about the phenomenon of learned helpless and its relevance to my life. Sometimes,
looking back to past times is useful to help reorient yourself in the present and aim towards a more desirable future.
Sometimes, a new perspective or experience might instantly obliterate previous behaviour without any sort of concerted
mental or physical grunt 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 practically immediately lose them not long afterwards. These kinds of experiences remind me of those
hypnosis advertisements that claim to have you give up smoking after just a few sessions; sometimes it's even after just one visit. There's no short
supply of stories of miracle cures or sudden, permanent breaks of 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. Those six weeks were spent
living with a new family along with my exchange student, who had lived six weeks with me and my family just prior to my
arrival in Germany. Six 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 was mine for the duration of the stay. 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 friends who had taken a similar trip certainly did. I'm not manyt of them
learnt or used much German beyond <i>Wo ist McDonalds?</i>. But I had been gradually becoming more fascinated with the
structure of German before arriving. Once there, especially at that age I presume, the Deutsch on the blackboard in
biology class looked more like a sophisticated puzzle game than a complete drag of a memorisation task. Each day was a
new game of deductive guesswork, and better still, I got to play with new ideas about how the language works every day
in the schoolyard with new friends I was making. New ways to describe how things are situated and move in relation to
one another, mysterious new prefixes and other linguistic building blocks, and the insane backwards word order of German
provided unlimited entertainment to see if I was up to the challenge.
</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 independece these kids were allowed to exercise at sixteen or seventeen was
nothing short of amazing to my adolescent self. 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 that still to
this day I find kind of insane. 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 class on, as long as you were back in time. And we
did. School uniforms simply weren't part of the culture either. For everyone else perhaps stressful and another target
of the 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 they actually seemed cool, like people I would like to hang out and befriend. They were
</article>

View File

@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/blog/styles.css">
<link
href="https://fonts.googleapis.com/css2?family=Roboto&amp;family=Roboto+Slab:wght@600&amp;display=swap"
rel="stylesheet">
<!-- <link rel="icon" href="/generative-energy/favicon.ico" sizes="any" /> -->
<meta name="description" content="Generative Energy - A page dedicated to Dr. Raymond Peat">
<meta property="og:image" content="icecream.png">
<!-- SSR HEAD OUTLET -->
</head>
<body>
<div id="app-root"><!-- SSR OUTLET --></ div>
</body>
</html>