This commit is contained in:
ari melody 2026-02-25 16:58:36 +00:00
parent 92edec869f
commit 47130ed6c2
Signed by: ari
GPG key ID: CF99829C92678188
12 changed files with 188 additions and 17 deletions

View file

@ -1,6 +1,7 @@
{
"version": "5",
"specifiers": {
"npm:@inlang/paraglide-js@^2.12.0": "2.12.0",
"npm:@lucide/svelte@0.575": "0.575.0_svelte@5.53.0__acorn@8.16.0",
"npm:@sveltejs/adapter-static@^3.0.10": "3.0.10_@sveltejs+kit@2.53.0__@sveltejs+vite-plugin-svelte@6.2.4___svelte@5.53.0____acorn@8.16.0___vite@7.3.1____picomatch@4.0.3__svelte@5.53.0___acorn@8.16.0__typescript@5.9.3__vite@7.3.1___picomatch@4.0.3__acorn@8.16.0_@sveltejs+vite-plugin-svelte@6.2.4__svelte@5.53.0___acorn@8.16.0__vite@7.3.1___picomatch@4.0.3_svelte@5.53.0__acorn@8.16.0_typescript@5.9.3_vite@7.3.1__picomatch@4.0.3",
"npm:@sveltejs/kit@^2.50.2": "2.53.0_@sveltejs+vite-plugin-svelte@6.2.4__svelte@5.53.0___acorn@8.16.0__vite@7.3.1___picomatch@4.0.3_svelte@5.53.0__acorn@8.16.0_typescript@5.9.3_vite@7.3.1__picomatch@4.0.3_acorn@8.16.0",
@ -141,6 +142,35 @@
"os": ["win32"],
"cpu": ["x64"]
},
"@inlang/paraglide-js@2.12.0": {
"integrity": "sha512-wnqTeSLcMMS2usL8zjS8bDGs9r16X00aeoGk2wVAnPfAgCChYalKdG20pS2XtJVMM1H6nBBBLKt3ZQMnKrusKQ==",
"dependencies": [
"@inlang/recommend-sherlock",
"@inlang/sdk",
"commander",
"consola",
"json5",
"unplugin",
"urlpattern-polyfill"
],
"bin": true
},
"@inlang/recommend-sherlock@0.2.1": {
"integrity": "sha512-ckv8HvHy/iTqaVAEKrr+gnl+p3XFNwe5D2+6w6wJk2ORV2XkcRkKOJ/XsTUJbPSiyi4PI+p+T3bqbmNx/rDUlg==",
"dependencies": [
"comment-json"
]
},
"@inlang/sdk@2.7.0_kysely@0.27.6": {
"integrity": "sha512-yJNBD0o8i29TTJqWX5uDRHxnalDGcsUDctxepzFXsUfkzqGWfiFBxODdxvReqvM2CuKAAOo/kib/F1UcgdYFNQ==",
"dependencies": [
"@lix-js/sdk",
"@sinclair/typebox",
"kysely",
"sqlite-wasm-kysely",
"uuid@13.0.0"
]
},
"@jridgewell/gen-mapping@0.3.13": {
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dependencies": [
@ -168,6 +198,21 @@
"@jridgewell/sourcemap-codec"
]
},
"@lix-js/sdk@0.4.7_kysely@0.27.6": {
"integrity": "sha512-pRbW+joG12L0ULfMiWYosIW0plmW4AsUdiPCp+Z8rAsElJ+wJ6in58zhD3UwUcd4BNcpldEGjg6PdA7e0RgsDQ==",
"dependencies": [
"@lix-js/server-protocol-schema",
"dedent",
"human-id",
"js-sha256",
"kysely",
"sqlite-wasm-kysely",
"uuid@10.0.0"
]
},
"@lix-js/server-protocol-schema@0.1.1": {
"integrity": "sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ=="
},
"@lucide/svelte@0.575.0_svelte@5.53.0__acorn@8.16.0": {
"integrity": "sha512-FEFp/0McZwsjBqh1Dn8H+UBm1yHFQYk+utuVMFDw57155+wz2XMoc1pw027ylCPzs+bi14UEXYKbekFhuJKtnw==",
"dependencies": [
@ -302,6 +347,13 @@
"os": ["win32"],
"cpu": ["x64"]
},
"@sinclair/typebox@0.31.28": {
"integrity": "sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ=="
},
"@sqlite.org/sqlite-wasm@3.48.0-build4": {
"integrity": "sha512-hI6twvUkzOmyGZhQMza1gpfqErZxXRw6JEsiVjUbo7tFanVD+8Oil0Ih3l2nGzHdxPI41zFmfUQG7GHqhciKZQ==",
"bin": true
},
"@standard-schema/spec@1.1.0": {
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="
},
@ -379,6 +431,9 @@
"aria-query@5.3.2": {
"integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="
},
"array-timsort@1.0.3": {
"integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ=="
},
"axobject-query@4.1.0": {
"integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="
},
@ -391,9 +446,29 @@
"clsx@2.1.1": {
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="
},
"commander@11.1.0": {
"integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="
},
"comment-json@4.5.1": {
"integrity": "sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==",
"dependencies": [
"array-timsort",
"core-util-is",
"esprima"
]
},
"consola@3.4.0": {
"integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA=="
},
"cookie@0.6.0": {
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
},
"core-util-is@1.0.3": {
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"dedent@1.5.1": {
"integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg=="
},
"deepmerge@4.3.1": {
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
},
@ -436,6 +511,10 @@
"esm-env@1.2.2": {
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="
},
"esprima@4.0.1": {
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"bin": true
},
"esrap@2.2.3": {
"integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==",
"dependencies": [
@ -456,15 +535,29 @@
"os": ["darwin"],
"scripts": true
},
"human-id@4.1.3": {
"integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==",
"bin": true
},
"is-reference@3.0.3": {
"integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
"dependencies": [
"@types/estree"
]
},
"js-sha256@0.11.1": {
"integrity": "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg=="
},
"json5@2.2.3": {
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"bin": true
},
"kleur@4.1.5": {
"integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="
},
"kysely@0.27.6": {
"integrity": "sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ=="
},
"locate-character@3.0.0": {
"integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="
},
@ -559,6 +652,13 @@
"source-map-js@1.2.1": {
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
},
"sqlite-wasm-kysely@0.3.0_kysely@0.27.6": {
"integrity": "sha512-TzjBNv7KwRw6E3pdKdlRyZiTmUIE0UttT/Sl56MVwVARl/u5gp978KepazCJZewFUnlWHz9i3NQd4kOtP/Afdg==",
"dependencies": [
"@sqlite.org/sqlite-wasm",
"kysely"
]
},
"svelte-check@4.4.3_svelte@5.53.0__acorn@8.16.0_typescript@5.9.3": {
"integrity": "sha512-4HtdEv2hOoLCEsSXI+RDELk9okP/4sImWa7X02OjMFFOWeSdFF3NFy3vqpw0z+eH9C88J9vxZfUXz/Uv2A1ANw==",
"dependencies": [
@ -607,6 +707,26 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"bin": true
},
"unplugin@2.3.11": {
"integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
"dependencies": [
"@jridgewell/remapping",
"acorn",
"picomatch",
"webpack-virtual-modules"
]
},
"urlpattern-polyfill@10.1.0": {
"integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw=="
},
"uuid@10.0.0": {
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
"bin": true
},
"uuid@13.0.0": {
"integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
"bin": true
},
"vite@7.3.1_picomatch@4.0.3": {
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
"dependencies": [
@ -631,6 +751,9 @@
"vite"
]
},
"webpack-virtual-modules@0.6.2": {
"integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="
},
"zimmerframe@1.1.4": {
"integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="
}
@ -638,6 +761,7 @@
"workspace": {
"packageJson": {
"dependencies": [
"npm:@inlang/paraglide-js@^2.12.0",
"npm:@lucide/svelte@0.575",
"npm:@sveltejs/adapter-static@^3.0.10",
"npm:@sveltejs/kit@^2.50.2",

View file

@ -0,0 +1,17 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"app_name": "Jupiter Mail",
"section_dashboard": "Dashboard",
"section_accounts": "Accounts",
"section_accounts_instructions": "Click an account below to configure:",
"section_accounts_add": "Add Account",
"section_settings": "Settings",
"section_settings_mda": "Mail Delivery Settings",
"section_settings_mta": "Mail Transfer Settings",
"section_settings_version": "Running:",
"dashboard_n_accounts_active": "Active: {count}"
}

View file

@ -19,6 +19,7 @@
"svelte": "^5.51.0",
"svelte-check": "^4.3.6",
"typescript": "^5.9.3",
"vite": "^7.3.1"
"vite": "^7.3.1",
"@inlang/paraglide-js": "^2.12.0"
}
}

View file

@ -0,0 +1,14 @@
{
"$schema": "https://inlang.com/schema/project-settings",
"baseLocale": "en",
"locales": [
"en"
],
"modules": [
"https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js",
"https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js"
],
"plugin.inlang.messageFormat": {
"pathPattern": "./messages/{locale}.json"
}
}

View file

@ -1,5 +1,5 @@
<!doctype html>
<html lang="en">
<html lang="%lang%">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />

View file

@ -1,5 +1,6 @@
<script lang="ts">
import { Plus } from '@lucide/svelte';
import { m } from '@jupiter/paraglide/messages';
let { onclick, onkeydown } = $props();
</script>
@ -7,7 +8,7 @@
<div class="add-account" onclick={onclick} onkeydown={onkeydown} role="button" tabindex="0">
<div class="icon-container"><Plus /></div>
<hr>
<div class="info-container"><h2>Add Account</h2></div>
<div class="info-container"><h2>{m.section_accounts_add()}</h2></div>
</div>
<style>

View file

@ -4,6 +4,7 @@
import { LayoutDashboard, Mail, Settings, User } from '@lucide/svelte';
import ToastOverlay from '@jupiter/components/ui/ToastOverlay.svelte';
import Button from '@jupiter/components/ui/Button.svelte';
import { m } from '@jupiter/paraglide/messages';
let { children } = $props();
</script>
@ -14,10 +15,10 @@
<div class="app">
<header class="sidebar">
<h1><Mail /> Jupiter Mail</h1>
<Button href="/"><LayoutDashboard /> Dashboard</Button>
<Button href="/accounts"><User /> Accounts</Button>
<Button href="/settings"><Settings /> Settings</Button>
<h1><Mail /> {m.app_name()}</h1>
<Button href="/"><LayoutDashboard /> {m.section_dashboard()}</Button>
<Button href="/accounts"><User /> {m.section_accounts()}</Button>
<Button href="/settings"><Settings /> {m.section_settings()}</Button>
</header>
<main>
{@render children()}

View file

@ -0,0 +1 @@
export const prerender = true;

View file

@ -2,6 +2,7 @@
import { LayoutDashboard } from '@lucide/svelte';
import Card from '@jupiter/components/ui/Card.svelte';
import Header from '@jupiter/components/ui/Header.svelte';
import { m } from '@jupiter/paraglide/messages';
let { data } = $props();
</script>
@ -14,8 +15,10 @@
<main>
<Card>
<h2><a href="/accounts">Accounts</a></h2>
<p class="active-accounts">Active: {data.dashboard.num_accounts}</p>
<h2><a href="/accounts">{m.section_accounts()}</a></h2>
<p class="active-accounts">
{m.dashboard_n_accounts_active({count: data.dashboard.num_accounts})}
</p>
</Card>
</main>
</div>

View file

@ -4,6 +4,7 @@
import AccountListItem from '@jupiter/components/ui/AccountListItem.svelte';
import AccountAddButton from '@jupiter/components/ui/AccountAddButton.svelte';
import { goto } from '$app/navigation';
import { m } from '@jupiter/paraglide/messages.js';
let { data } = $props();
const accounts = (() => data.accounts)();
@ -16,11 +17,11 @@
<div class="page-container">
<Header>
<User />
<h1>Accounts</h1>
<h1>{m.section_accounts()}</h1>
</Header>
<main>
<p>Click an account below to configure:</p>
<p>{m.section_accounts_instructions()}</p>
<hr>
<div class="account-list">
{#if accounts}

View file

@ -2,6 +2,7 @@
import { Settings } from '@lucide/svelte';
import Header from '@jupiter/components/ui/Header.svelte';
import Card from '@jupiter/components/ui/Card.svelte';
import { m } from '@jupiter/paraglide/messages.js';
let { data } = $props();
@ -11,18 +12,18 @@
<div class="page-container">
<Header>
<Settings />
<h1>Settings</h1>
<h1>{m.section_settings()}</h1>
</Header>
<main>
<Card>
<h2>Mail Delivery Settings</h2>
<p>Running: <code>{settings.mail_delivery.version}</code></p>
<h2>{m.section_settings_mda()}</h2>
<p>{m.section_settings_version()} <code>{settings.mail_delivery.version}</code></p>
</Card>
<Card>
<h2>Mail Transfer Settings</h2>
<p>Running: <code>{settings.mail_transfer.version}</code></p>
<h2>{m.section_settings_mta()}</h2>
<p>{m.section_settings_version()} <code>{settings.mail_transfer.version}</code></p>
</Card>
</main>
</div>

View file

@ -1,6 +1,13 @@
import { paraglideVitePlugin } from '@inlang/paraglide-js'
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [sveltekit()]
plugins: [
sveltekit(),
paraglideVitePlugin({
project: './project.inlang',
outdir: './src/paraglide',
}),
]
});