From da82c858105cf8640deb307e7999ad9eb9fdcd62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nu=C5=A1a=20Puk=C5=A1i=C4=8D?= Date: Wed, 27 Aug 2025 21:29:19 +0200 Subject: [PATCH] Clean up --- scripts/a-ui.manifest.json | 52 ----------------- scripts/scaffold.ts | 84 --------------------------- src/lib/theme/build-tokens.ts | 32 ---------- src/lib/theme/generated/themes.css | 93 ------------------------------ src/lib/theme/theme-store.ts | 6 -- src/lib/theme/themes/dark.yaml | 15 ----- src/lib/theme/themes/light.yaml | 15 ----- src/lib/theme/themes/sepia.yaml | 15 ----- 8 files changed, 312 deletions(-) delete mode 100644 scripts/a-ui.manifest.json delete mode 100644 scripts/scaffold.ts delete mode 100644 src/lib/theme/build-tokens.ts delete mode 100644 src/lib/theme/generated/themes.css delete mode 100644 src/lib/theme/theme-store.ts delete mode 100644 src/lib/theme/themes/dark.yaml delete mode 100644 src/lib/theme/themes/light.yaml delete mode 100644 src/lib/theme/themes/sepia.yaml diff --git a/scripts/a-ui.manifest.json b/scripts/a-ui.manifest.json deleted file mode 100644 index 5c12e1f..0000000 --- a/scripts/a-ui.manifest.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "files": [ - { - "path": "src/lib/theme/build-tokens.ts", - "content": "#!/usr/bin/env -S deno run --allow-read --allow-write\nimport { join } from \"https://deno.land/std@0.224.0/path/mod.ts\";\nimport { parse as parseYaml } from \"https://deno.land/std@0.224.0/yaml/mod.ts\";\nconst themesDir = \"src/lib/theme/themes\";\nconst outCss = \"src/lib/theme/generated/themes.css\";\nfunction toRgb(hex: string) {\n const h = hex.replace(\"#\", \"\").trim();\n const n = (s: string) => parseInt(s, 16);\n if (h.length === 3) return `${n(h[0]+h[0])} ${n(h[1]+h[1])} ${n(h[2]+h[2])}`;\n return `${n(h.slice(0,2))} ${n(h.slice(2,4))} ${n(h.slice(4,6))}`;\n}\nconst entries: string[] = [];\nfor await (const ent of Deno.readDir(themesDir)) if (ent.isFile && ent.name.endsWith(\".yaml\")) entries.push(ent.name);\nentries.sort();\nlet css = \"\";\nfor (const file of entries) {\n const t = parseYaml(await Deno.readTextFile(join(themesDir, file))) as any;\n const sel = t.name === \"light\" ? ':root,[data-theme=\"light\"]' : `[data-theme=\"${t.name}\"]`;\n css += `${sel}{\\n`;\n for (const [k, v] of Object.entries(t.colors ?? {})) css += `--color-${k}: ${toRgb(String(v))};\\n`;\n for (const [k, v] of Object.entries(t.radii ?? {})) css += `--radius-${k}: ${v};\\n`;\n for (const [k, v] of Object.entries(t.spacing ?? {})) css += `--space-${k}: ${v};\\n`;\n const ty = t.typography ?? {};\n if (ty[\"font-reading\"]) css += `--font-reading: ${ty[\"font-reading\"]};\\n`;\n if (ty[\"font-ui\"]) css += `--font-ui: ${ty[\"font-ui\"]};\\n`;\n if (ty[\"leading-reading\"]) css += `--leading-reading: ${ty[\"leading-reading\"]};\\n`;\n if (ty[\"measure-ch\"]) css += `--measure-ch: ${ty[\"measure-ch\"]};\\n`;\n css += `}\\n\\n`;\n}\nawait Deno.mkdir(join(\"src/lib/theme/generated\"), { recursive: true });\nawait Deno.writeTextFile(outCss, css);\nconsole.log(\"Wrote\", outCss);\n" - }, - { - "path": "deno.json", - "content": "{\n \"tasks\": {\n \"tokens\": \"deno run --allow-read --allow-write src/lib/theme/build-tokens.ts\",\n \"scaffold\": \"deno run --allow-read --allow-write scripts/scaffold.ts scripts/a-ui.v5.manifest.json\"\n }\n}\n" - }, - { - "path": "src/lib/a/primitives/AButton.svelte", - "content": "\n\n\n \n\n" - }, - { - "path": "src/lib/a/primitives/AInput.svelte", - "content": "\n\n" - }, - { - "path": "src/lib/a/primitives/ACard.svelte", - "content": "\n
\n \n
\n \n
\n" - }, - { - "path": "src/lib/a/primitives/ASwitch.svelte", - "content": "\n\n" - }, - { - "path": "src/lib/a/primitives/ADetails.svelte", - "content": "\n
\n \n \n {summary}\n {#if tech}Technical{/if}\n {open ? 'Hide':'Show'}\n \n {#if !(tech && !$showTech && forceHide)}
{/if}\n
\n" - }, - { - "path": "src/lib/a/reader/AReaderTOC.svelte", - "content": "\n\n" - }, - { - "path": "src/lib/a/reader/TocNode.svelte", - "content": "\n
  • \n
    \n {#if collapsible && hasChildren}\n \n {:else}\n \n {/if}\n onNavigate(item.href ?? `#${item.id}`)}>\n {item.title}\n \n
    \n {#if hasChildren}\n
      \n {#each item.children as child (child.id)}\n \n {/each}\n
    \n {/if}\n
  • \n" - }, - { - "path": "src/lib/a/nav/ANavbar.svelte", - "content": "\n
    \n
    \n
    \n \n {#if logo}{/if}{brand}\n \n
    \n \n \n
    \n
    \n
    \n \n
    \n" - }, - { - "path": "src/lib/a/nav/UserDropdown.svelte", - "content": "\n
    \n \n {#if open}\n
    \n {#if user}\n
    \n
    {user.name}
    \n {#if user.email}
    {user.email}
    {/if}\n
    \n \n {/if}\n
    \n" - }, - { - "path": "src/lib/a/nav/MobileNav.svelte", - "content": "\n{#if open}\n
    \n
    \n \n
    \n{/if}\n" - } - ] -} diff --git a/scripts/scaffold.ts b/scripts/scaffold.ts deleted file mode 100644 index 97b9a94..0000000 --- a/scripts/scaffold.ts +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env -S deno run --allow-read --allow-write -import { dirname, resolve } from "jsr:@std/path"; - -/** Read and parse JSON */ -async function readJson(p: string) { - try { - const txt = await Deno.readTextFile(p); - return JSON.parse(txt); - } catch (e) { - console.error(`Failed to read JSON: ${p}\n${e.message}`); - Deno.exit(1); - } -} - -/** Ensure parent directory exists */ -async function ensureDir(filePath: string) { - await Deno.mkdir(dirname(filePath), { recursive: true }); -} - -/** File exists? */ -async function exists(p: string) { - try { - await Deno.lstat(p); - return true; - } catch (e) { - if (e instanceof Deno.errors.NotFound) return false; - throw e; - } -} - -/** Write file if changed; return action marker */ -async function writeFile(p: string, content: string) { - await ensureDir(p); - const had = await exists(p); - if (had) { - const current = await Deno.readTextFile(p); - if (current === content) return "skip" as const; - } - await Deno.writeTextFile(p, content); - return had ? ("update" as const) : ("create" as const); -} - -/** Shallow-merge package.json fields */ -function mergePackage(pkg: any, merge: any) { - const next = { ...pkg }; - for (const key of ["scripts", "dependencies", "devDependencies"]) { - if (merge?.[key]) next[key] = { ...(pkg[key] || {}), ...merge[key] }; - } - return next; -} - -async function main() { - const manifestPath = Deno.args[0]; - if (!manifestPath) { - console.error("Usage: deno run --allow-read --allow-write scripts/scaffold.ts "); - Deno.exit(1); - } - - const manifest = await readJson(manifestPath); - - // Optional: merge package.json if present - const pkgPath = resolve(Deno.cwd(), "package.json"); - if (manifest.package?.merge && (await exists(pkgPath))) { - const pkg = await readJson(pkgPath); - const merged = mergePackage(pkg, manifest.package.merge); - await Deno.writeTextFile(pkgPath, JSON.stringify(merged, null, 2) + "\n"); - console.log("✓ package.json merged"); - } else if (manifest.package?.merge) { - console.log("• package.json not found — skipping merge"); - } - - // Write files from manifest - const files = manifest.files ?? []; - for (const f of files) { - const out = resolve(Deno.cwd(), String(f.path)); - const action = await writeFile(out, String(f.content ?? "")); - const marker = action === "skip" ? "•" : action === "update" ? "↻" : "✓"; - console.log(`${marker} ${f.path}`); - } - - console.log("\nDone."); -} - -if (import.meta.main) main(); diff --git a/src/lib/theme/build-tokens.ts b/src/lib/theme/build-tokens.ts deleted file mode 100644 index 733478e..0000000 --- a/src/lib/theme/build-tokens.ts +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env -S deno run --allow-read --allow-write -import { join } from "https://deno.land/std@0.224.0/path/mod.ts"; -import { parse as parseYaml } from "https://deno.land/std@0.224.0/yaml/mod.ts"; -const themesDir = "src/lib/theme/themes"; -const outCss = "src/lib/theme/generated/themes.css"; -function toRgb(hex: string) { - const h = hex.replace("#", "").trim(); - const n = (s: string) => parseInt(s, 16); - if (h.length === 3) return `${n(h[0]+h[0])} ${n(h[1]+h[1])} ${n(h[2]+h[2])}`; - return `${n(h.slice(0,2))} ${n(h.slice(2,4))} ${n(h.slice(4,6))}`; -} -const entries: string[] = []; -for await (const ent of Deno.readDir(themesDir)) if (ent.isFile && ent.name.endsWith(".yaml")) entries.push(ent.name); -entries.sort(); -let css = ""; -for (const file of entries) { - const t = parseYaml(await Deno.readTextFile(join(themesDir, file))) as any; - const sel = t.name === "light" ? ':root,[data-theme="light"]' : `[data-theme="${t.name}"]`; - css += `${sel}{\n`; - for (const [k, v] of Object.entries(t.colors ?? {})) css += `--color-${k}: ${toRgb(String(v))};\n`; - for (const [k, v] of Object.entries(t.radii ?? {})) css += `--radius-${k}: ${v};\n`; - for (const [k, v] of Object.entries(t.spacing ?? {})) css += `--space-${k}: ${v};\n`; - const ty = t.typography ?? {}; - if (ty["font-reading"]) css += `--font-reading: ${ty["font-reading"]};\n`; - if (ty["font-ui"]) css += `--font-ui: ${ty["font-ui"]};\n`; - if (ty["leading-reading"]) css += `--leading-reading: ${ty["leading-reading"]};\n`; - if (ty["measure-ch"]) css += `--measure-ch: ${ty["measure-ch"]};\n`; - css += `}\n\n`; -} -await Deno.mkdir(join("src/lib/theme/generated"), { recursive: true }); -await Deno.writeTextFile(outCss, css); -console.log("Wrote", outCss); diff --git a/src/lib/theme/generated/themes.css b/src/lib/theme/generated/themes.css deleted file mode 100644 index 7cbcb82..0000000 --- a/src/lib/theme/generated/themes.css +++ /dev/null @@ -1,93 +0,0 @@ -[data-theme="dark"]{ ---color-bg: 11 16 32; ---color-surface: 15 20 38; ---color-text: 229 231 235; ---color-muted: 148 163 184; ---color-primary: 96 165 250; ---color-primary-50: #fff5f2; ---color-primary-100: #fff1ee; ---color-primary-200: #ffe4de; ---color-primary-300: #ffd5cc; ---color-primary-400: #ffbcad; ---color-primary-500: #fe795d; ---color-primary-600: #ef562f; ---color-primary-700: #eb4f27; ---color-primary-800: #cc4522; ---color-primary-900: #a5371b; - ---color-secondary-50: #f0f9ff; ---color-secondary-100: #e0f2fe; ---color-secondary-200: #bae6fd; ---color-secondary-300: #7dd3fc; ---color-secondary-400: #38bdf8; ---color-secondary-500: #0ea5e9; ---color-secondary-600: #0284c7; ---color-secondary-700: #0369a1; ---color-secondary-800: #075985; ---color-secondary-900: #0c4a6e; ---color-primary-contrast: 11 16 32; ---radius-sm: 4px; ---radius-md: 8px; ---radius-lg: 14px; ---radius-full: 9999px; ---space-0: 0; ---space-1: 0.25rem; ---space-2: 0.5rem; ---space-3: 0.75rem; ---space-4: 1rem; ---space-6: 1.5rem; ---space-8: 2rem; ---font-reading: Literata, ui-serif, Georgia, serif; ---font-ui: Inter, ui-sans-serif, system-ui, sans-serif; ---leading-reading: 1.8; ---measure-ch: 68; -} - -:root,[data-theme="light"]{ ---color-bg: 255 255 255; ---color-surface: 250 250 250; ---color-text: 17 24 39; ---color-muted: 107 114 128; ---color-primary: 29 78 216; ---color-primary-contrast: 255 255 255; ---radius-sm: 4px; ---radius-md: 8px; ---radius-lg: 14px; ---radius-full: 9999px; ---space-0: 0; ---space-1: 0.25rem; ---space-2: 0.5rem; ---space-3: 0.75rem; ---space-4: 1rem; ---space-6: 1.5rem; ---space-8: 2rem; ---font-reading: Literata, ui-serif, Georgia, serif; ---font-ui: Inter, ui-sans-serif, system-ui, sans-serif; ---leading-reading: 1.7; ---measure-ch: 70; -} - -[data-theme="sepia"]{ ---color-bg: 245 236 217; ---color-surface: 249 243 231; ---color-text: 58 47 30; ---color-muted: 109 92 70; ---color-primary: 138 90 68; ---color-primary-contrast: 255 255 255; ---radius-sm: 4px; ---radius-md: 8px; ---radius-lg: 14px; ---radius-full: 9999px; ---space-0: 0; ---space-1: 0.25rem; ---space-2: 0.5rem; ---space-3: 0.75rem; ---space-4: 1rem; ---space-6: 1.5rem; ---space-8: 2rem; ---font-reading: Literata, ui-serif, Georgia, serif; ---font-ui: Inter, ui-sans-serif, system-ui, sans-serif; ---leading-reading: 1.7; ---measure-ch: 70; -} - diff --git a/src/lib/theme/theme-store.ts b/src/lib/theme/theme-store.ts deleted file mode 100644 index cc480d4..0000000 --- a/src/lib/theme/theme-store.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { writable } from 'svelte/store'; -const KEY='theme'; -const initial = (typeof localStorage!=='undefined' && localStorage.getItem(KEY)) || 'light'; -export const theme = writable(initial); -theme.subscribe(v=>{ if(typeof document!=='undefined'){ document.documentElement.dataset.theme=String(v); localStorage.setItem(KEY,String(v)); } }); -export const setTheme = (t:string)=>theme.set(t); diff --git a/src/lib/theme/themes/dark.yaml b/src/lib/theme/themes/dark.yaml deleted file mode 100644 index 262c47d..0000000 --- a/src/lib/theme/themes/dark.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: dark -colors: - bg: '#0B1020' - surface: '#0F1426' - text: '#E5E7EB' - muted: '#94A3B8' - primary: '#60A5FA' - primary-contrast: '#0B1020' -radii: { sm: 4px, md: 8px, lg: 14px, full: 9999px } -spacing: { 0: 0, 1: 0.25rem, 2: 0.5rem, 3: 0.75rem, 4: 1rem, 6: 1.5rem, 8: 2rem } -typography: - font-reading: 'Literata, ui-serif, Georgia, serif' - font-ui: 'Inter, ui-sans-serif, system-ui, sans-serif' - leading-reading: 1.8 - measure-ch: 68 diff --git a/src/lib/theme/themes/light.yaml b/src/lib/theme/themes/light.yaml deleted file mode 100644 index e52373d..0000000 --- a/src/lib/theme/themes/light.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: light -colors: - bg: '#FFFFFF' - surface: '#FAFAFA' - text: '#111827' - muted: '#6B7280' - primary: '#1D4ED8' - primary-contrast: '#FFFFFF' -radii: { sm: 4px, md: 8px, lg: 14px, full: 9999px } -spacing: { 0: 0, 1: 0.25rem, 2: 0.5rem, 3: 0.75rem, 4: 1rem, 6: 1.5rem, 8: 2rem } -typography: - font-reading: 'Literata, ui-serif, Georgia, serif' - font-ui: 'Inter, ui-sans-serif, system-ui, sans-serif' - leading-reading: 1.7 - measure-ch: 70 diff --git a/src/lib/theme/themes/sepia.yaml b/src/lib/theme/themes/sepia.yaml deleted file mode 100644 index e1cafed..0000000 --- a/src/lib/theme/themes/sepia.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: sepia -colors: - bg: '#F5ECD9' - surface: '#F9F3E7' - text: '#3A2F1E' - muted: '#6D5C46' - primary: '#8A5A44' - primary-contrast: '#FFFFFF' -radii: { sm: 4px, md: 8px, lg: 14px, full: 9999px } -spacing: { 0: 0, 1: 0.25rem, 2: 0.5rem, 3: 0.75rem, 4: 1rem, 6: 1.5rem, 8: 2rem } -typography: - font-reading: 'Literata, ui-serif, Georgia, serif' - font-ui: 'Inter, ui-sans-serif, system-ui, sans-serif' - leading-reading: 1.7 - measure-ch: 70