Migrate to sveltekit #26
18 changed files with 129 additions and 159 deletions
|
@ -1,34 +0,0 @@
|
||||||
export { matchers } from './matchers.js';
|
|
||||||
|
|
||||||
export const nodes = [
|
|
||||||
() => import('./nodes/0'),
|
|
||||||
() => import('./nodes/1'),
|
|
||||||
() => import('./nodes/2'),
|
|
||||||
() => import('./nodes/3'),
|
|
||||||
() => import('./nodes/4'),
|
|
||||||
() => import('./nodes/5')
|
|
||||||
];
|
|
||||||
|
|
||||||
export const server_loads = [0];
|
|
||||||
|
|
||||||
export const dictionary = {
|
|
||||||
"/": [2],
|
|
||||||
"/about": [3],
|
|
||||||
"/donate": [4],
|
|
||||||
"/viewer": [5]
|
|
||||||
};
|
|
||||||
|
|
||||||
export const hooks = {
|
|
||||||
handleError: (({ error }) => { console.error(error) }),
|
|
||||||
|
|
||||||
reroute: (() => {}),
|
|
||||||
transport: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const decoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.decode]));
|
|
||||||
|
|
||||||
export const hash = false;
|
|
||||||
|
|
||||||
export const decode = (type, value) => decoders[type](value);
|
|
||||||
|
|
||||||
export { default as root } from '../root.js';
|
|
|
@ -1 +0,0 @@
|
||||||
export const matchers = {};
|
|
|
@ -1 +0,0 @@
|
||||||
export { default as component } from "../../../../src/routes/+layout.svelte";
|
|
|
@ -1 +0,0 @@
|
||||||
export { default as component } from "../../../../node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte";
|
|
|
@ -1 +0,0 @@
|
||||||
export { default as component } from "../../../../src/routes/+page.svelte";
|
|
|
@ -1 +0,0 @@
|
||||||
export { default as component } from "../../../../src/routes/about/+page.svelte";
|
|
|
@ -1 +0,0 @@
|
||||||
export { default as component } from "../../../../src/routes/donate/+page.svelte";
|
|
|
@ -1 +0,0 @@
|
||||||
export { default as component } from "../../../../src/routes/viewer/+page.svelte";
|
|
|
@ -1,3 +0,0 @@
|
||||||
import { asClassComponent } from 'svelte/legacy';
|
|
||||||
import Root from './root.svelte';
|
|
||||||
export default asClassComponent(Root);
|
|
|
@ -1,66 +0,0 @@
|
||||||
<!-- This file is generated by @sveltejs/kit — do not edit it! -->
|
|
||||||
<svelte:options runes={true} />
|
|
||||||
<script>
|
|
||||||
import { setContext, onMount, tick } from 'svelte';
|
|
||||||
import { browser } from '$app/environment';
|
|
||||||
|
|
||||||
// stores
|
|
||||||
let { stores, page, constructors, components = [], form, data_0 = null, data_1 = null } = $props();
|
|
||||||
|
|
||||||
if (!browser) {
|
|
||||||
setContext('__svelte__', stores);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (browser) {
|
|
||||||
$effect.pre(() => stores.page.set(page));
|
|
||||||
} else {
|
|
||||||
stores.page.set(page);
|
|
||||||
}
|
|
||||||
$effect(() => {
|
|
||||||
stores;page;constructors;components;form;data_0;data_1;
|
|
||||||
stores.page.notify();
|
|
||||||
});
|
|
||||||
|
|
||||||
let mounted = $state(false);
|
|
||||||
let navigated = $state(false);
|
|
||||||
let title = $state(null);
|
|
||||||
|
|
||||||
onMount(() => {
|
|
||||||
const unsubscribe = stores.page.subscribe(() => {
|
|
||||||
if (mounted) {
|
|
||||||
navigated = true;
|
|
||||||
tick().then(() => {
|
|
||||||
title = document.title || 'untitled page';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
mounted = true;
|
|
||||||
return unsubscribe;
|
|
||||||
});
|
|
||||||
|
|
||||||
const Pyramid_1=$derived(constructors[1])
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{#if constructors[1]}
|
|
||||||
{@const Pyramid_0 = constructors[0]}
|
|
||||||
<!-- svelte-ignore binding_property_non_reactive -->
|
|
||||||
<Pyramid_0 bind:this={components[0]} data={data_0} {form}>
|
|
||||||
<!-- svelte-ignore binding_property_non_reactive -->
|
|
||||||
<Pyramid_1 bind:this={components[1]} data={data_1} {form} />
|
|
||||||
</Pyramid_0>
|
|
||||||
|
|
||||||
{:else}
|
|
||||||
{@const Pyramid_0 = constructors[0]}
|
|
||||||
<!-- svelte-ignore binding_property_non_reactive -->
|
|
||||||
<Pyramid_0 bind:this={components[0]} data={data_0} {form} />
|
|
||||||
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{#if mounted}
|
|
||||||
<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px">
|
|
||||||
{#if navigated}
|
|
||||||
{title}
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
|
@ -1,48 +0,0 @@
|
||||||
|
|
||||||
import root from '../root.js';
|
|
||||||
import { set_building, set_prerendering } from '__sveltekit/environment';
|
|
||||||
import { set_assets } from '__sveltekit/paths';
|
|
||||||
import { set_manifest, set_read_implementation } from '__sveltekit/server';
|
|
||||||
import { set_private_env, set_public_env, set_safe_public_env } from '../../../node_modules/@sveltejs/kit/src/runtime/shared-server.js';
|
|
||||||
|
|
||||||
export const options = {
|
|
||||||
app_template_contains_nonce: false,
|
|
||||||
csp: {"mode":"auto","directives":{"upgrade-insecure-requests":false,"block-all-mixed-content":false},"reportOnly":{"upgrade-insecure-requests":false,"block-all-mixed-content":false}},
|
|
||||||
csrf_check_origin: true,
|
|
||||||
embedded: false,
|
|
||||||
env_public_prefix: 'PUBLIC_',
|
|
||||||
env_private_prefix: '',
|
|
||||||
hash_routing: false,
|
|
||||||
hooks: null, // added lazily, via `get_hooks`
|
|
||||||
preload_strategy: "modulepreload",
|
|
||||||
root,
|
|
||||||
service_worker: false,
|
|
||||||
templates: {
|
|
||||||
app: ({ head, body, assets, nonce, env }) => "<!doctype html>\n<html lang=\"en\">\n <head>\n <style>\n :root {\n font-family: Inter, Avenir, Helvetica, Arial, sans-serif;\n font-size: 16px;\n line-height: 24px;\n font-weight: 400;\n font-synthesis: none;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-text-size-adjust: 100%;\n }\n\n * {\n box-sizing: border-box;\n }\n\n body {\n display: flex;\n justify-content: center;\n flex-direction: column;\n margin: 0;\n width: 100%;\n height: 100%;\n }\n\n #app {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n background-color: #f2f6f5;\n z-index: 10;\n }\n\n input[type='submit'] {\n width: 100%;\n font-size: 20px;\n margin-top: 20px;\n background-color: #05345f;\n font-weight: 700;\n color: white;\n padding: 10px;\n -webkit-appearance: none;\n border-radius: 0;\n }\n\n input[type='submit']:hover {\n cursor: pointer;\n background-color: black;\n color: white;\n }\n\n body a {\n text-decoration: none;\n color: #06345f;\n border-bottom: 3px solid #06345f;\n }\n\n body a:hover {\n background-color: #06345f;\n color: #ffffff;\n }\n\n :is(h1, h2, h3, h4, h5, h6) {\n color: #06345f;\n }\n\n strong {\n color: #06345f;\n }\n\n ul li::marker {\n color: #06345f;\n }\n </style>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" href=\"" + assets + "/favicon.png\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n " + head + "\n </head>\n <body data-sveltekit-preload-data=\"hover\">\n <div style=\"display: contents\">" + body + "</div>\n </body>\n</html>\n",
|
|
||||||
error: ({ status, message }) => "<!doctype html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>" + message + "</title>\n\n\t\t<style>\n\t\t\tbody {\n\t\t\t\t--bg: white;\n\t\t\t\t--fg: #222;\n\t\t\t\t--divider: #ccc;\n\t\t\t\tbackground: var(--bg);\n\t\t\t\tcolor: var(--fg);\n\t\t\t\tfont-family:\n\t\t\t\t\tsystem-ui,\n\t\t\t\t\t-apple-system,\n\t\t\t\t\tBlinkMacSystemFont,\n\t\t\t\t\t'Segoe UI',\n\t\t\t\t\tRoboto,\n\t\t\t\t\tOxygen,\n\t\t\t\t\tUbuntu,\n\t\t\t\t\tCantarell,\n\t\t\t\t\t'Open Sans',\n\t\t\t\t\t'Helvetica Neue',\n\t\t\t\t\tsans-serif;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmax-width: 32rem;\n\t\t\t\tmargin: 0 1rem;\n\t\t\t}\n\n\t\t\t.status {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: -0.05rem;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tborder-left: 1px solid var(--divider);\n\t\t\t\tpadding: 0 0 0 1rem;\n\t\t\t\tmargin: 0 0 0 1rem;\n\t\t\t\tmin-height: 2.5rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.message h1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\tbody {\n\t\t\t\t\t--bg: #222;\n\t\t\t\t\t--fg: #ddd;\n\t\t\t\t\t--divider: #666;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"error\">\n\t\t\t<span class=\"status\">" + status + "</span>\n\t\t\t<div class=\"message\">\n\t\t\t\t<h1>" + message + "</h1>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
|
|
||||||
},
|
|
||||||
version_hash: "1wnc9w8"
|
|
||||||
};
|
|
||||||
|
|
||||||
export async function get_hooks() {
|
|
||||||
let handle;
|
|
||||||
let handleFetch;
|
|
||||||
let handleError;
|
|
||||||
let init;
|
|
||||||
|
|
||||||
|
|
||||||
let reroute;
|
|
||||||
let transport;
|
|
||||||
|
|
||||||
|
|
||||||
return {
|
|
||||||
handle,
|
|
||||||
handleFetch,
|
|
||||||
handleError,
|
|
||||||
init,
|
|
||||||
reroute,
|
|
||||||
transport
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export { set_assets, set_building, set_manifest, set_prerendering, set_private_env, set_public_env, set_read_implementation, set_safe_public_env };
|
|
95
src/lib/components/Footer.svelte
Normal file
95
src/lib/components/Footer.svelte
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
<script>
|
||||||
|
import { t } from '$lib/translations';
|
||||||
|
import { appVersion } from '$lib/utils/env';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<div class="footer-content">
|
||||||
|
<div class="footer-info">
|
||||||
|
<p>
|
||||||
|
{@html $t(
|
||||||
|
'footer.copyright',
|
||||||
|
/** @type {any} */ ({
|
||||||
|
year: new Date().getFullYear(),
|
||||||
|
website: 'https://leomurca.xyz',
|
||||||
|
}),
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
{@html $t(
|
||||||
|
'footer.version',
|
||||||
|
/** @type {any} */ ({ version: appVersion() }),
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<nav class="footer-nav">
|
||||||
|
<a href="/privacy-policy'">{$t('footer.privacy.policy')}</a>
|
||||||
|
<a href="/terms-of-service'">{$t('footer.terms.of.service')}</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
footer {
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
padding: 20px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-content {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
max-width: 960px;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-info {
|
||||||
|
flex: 1 1 100%;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-info p {
|
||||||
|
margin: 4px 0;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-info p:first-child {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-nav {
|
||||||
|
flex: 1 1 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-nav a {
|
||||||
|
margin: 0 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 600px) {
|
||||||
|
.footer-content {
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-info,
|
||||||
|
.footer-nav {
|
||||||
|
flex: 1 1 50%;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-info {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-nav {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
6
src/lib/translations/en-US/footer.json
Normal file
6
src/lib/translations/en-US/footer.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"privacy.policy": "🔐 Privacy Policy",
|
||||||
|
"terms.of.service": "📝 Terms of Service",
|
||||||
|
"copyright": "Copyright © {{year}} <a href=\"{{website}}\" target=\"_blank\" rel=\"noreferrer\">Leonardo Murça</a>. <br/> All rights reserved.",
|
||||||
|
"version": "🧵 Version: {{version}}"
|
||||||
|
}
|
|
@ -24,11 +24,21 @@ const config = {
|
||||||
key: 'header',
|
key: 'header',
|
||||||
loader: async () => (await import('./en-US/header.json')).default,
|
loader: async () => (await import('./en-US/header.json')).default,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
locale: SUPPORTED_LOCALES.EN_US,
|
||||||
|
key: 'footer',
|
||||||
|
loader: async () => (await import('./en-US/footer.json')).default,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
locale: SUPPORTED_LOCALES.PT_BR,
|
locale: SUPPORTED_LOCALES.PT_BR,
|
||||||
key: 'header',
|
key: 'header',
|
||||||
loader: async () => (await import('./pt-BR/header.json')).default,
|
loader: async () => (await import('./pt-BR/header.json')).default,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
locale: SUPPORTED_LOCALES.PT_BR,
|
||||||
|
key: 'footer',
|
||||||
|
loader: async () => (await import('./pt-BR/footer.json')).default,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
6
src/lib/translations/pt-BR/footer.json
Normal file
6
src/lib/translations/pt-BR/footer.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"privacy.policy": "🔐 Política de Privacidade",
|
||||||
|
"terms.of.service": "📝 Termos de Serviço",
|
||||||
|
"copyright": "Copyright © {{year}} <a href=\"{{website}}/pt-br\" target=\"_blank\" rel=\"noreferrer\">Leonardo Murça</a>. <br/> Todos os direitos reservados.",
|
||||||
|
"version": "🧵 Versão: {{version}}"
|
||||||
|
}
|
6
src/lib/utils/env.js
Normal file
6
src/lib/utils/env.js
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
// @ts-nocheck
|
||||||
|
function appVersion() {
|
||||||
|
return APP_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { appVersion };
|
|
@ -2,6 +2,7 @@
|
||||||
import { locale, loading } from '$lib/translations';
|
import { locale, loading } from '$lib/translations';
|
||||||
import Header from '$lib/components/Header.svelte';
|
import Header from '$lib/components/Header.svelte';
|
||||||
import LoadingTranslations from '$lib/components/LoadingTranslations.svelte';
|
import LoadingTranslations from '$lib/components/LoadingTranslations.svelte';
|
||||||
|
import Footer from '$lib/components/Footer.svelte';
|
||||||
export let data;
|
export let data;
|
||||||
|
|
||||||
$: locale.set(data.language);
|
$: locale.set(data.language);
|
||||||
|
@ -10,6 +11,7 @@
|
||||||
{#if !$loading && $locale !== undefined}
|
{#if !$loading && $locale !== undefined}
|
||||||
<Header />
|
<Header />
|
||||||
<slot />
|
<slot />
|
||||||
|
<Footer />
|
||||||
{:else}
|
{:else}
|
||||||
<LoadingTranslations />
|
<LoadingTranslations />
|
||||||
{/if}
|
{/if}
|
||||||
|
|
|
@ -2,5 +2,8 @@ import { sveltekit } from '@sveltejs/kit/vite';
|
||||||
import { defineConfig } from 'vite';
|
import { defineConfig } from 'vite';
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [sveltekit()]
|
plugins: [sveltekit()],
|
||||||
|
define: {
|
||||||
|
APP_VERSION: JSON.stringify(process.env.npm_package_version),
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue