-
+
-
+
+
+
\ No newline at end of file
diff --git a/template/content/about.md b/template/content/about.md
deleted file mode 100644
index a381b6f..0000000
--- a/template/content/about.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# About Content Version 3
-
-[Back home](/)
diff --git a/template/content/index.md b/template/content/index.md
index a844b7f..e4f5e57 100644
--- a/template/content/index.md
+++ b/template/content/index.md
@@ -1 +1,5 @@
-Hola que tal!
\ No newline at end of file
+# index
+
+Hola que tal! Hauria de funcionar
+
+Test
diff --git a/template/convert.js b/template/convert.js
index e2c8ebb..aee945f 100644
--- a/template/convert.js
+++ b/template/convert.js
@@ -8,7 +8,7 @@
* Transformations applied:
* 1. [[Wiki links]] → [Wiki links](/slug)
* 2. [[Wiki links|Alias]] → [Alias](/slug)
- * 3. ![[image.png]] →
![]()
/ NuxtImg tag
+ * 3. ![[image.png]] →
![]()
/
tag
* 4. ![[note]] → MDC ::include component
* 5. Callouts > [!TYPE] Title → MDC ::callout{type} blocks
* 6. Block IDs ^block-id → anchors
@@ -21,43 +21,61 @@
* node obsidian-to-nuxt.js --vault ./my-vault --out ./content --base-path /notes
*
* Options:
- * --vault Path to Obsidian vault root (default: ./vault)
- * --out Output directory for converted files (default: ./content)
- * --base-path URL prefix for all generated links (default: "")
- * --img-prefix URL prefix for embedded images (default: /images)
- * --nuxt-img Use instead of
(flag)
- * --dry-run Print conversions without writing files (flag)
+ * --vault Path to Obsidian vault root (default: ./vault)
+ * --out Output directory for converted files (default: ./content)
+ * --base-path URL prefix for all generated links (default: "")
+ * --img-prefix URL prefix for embedded images (default: /images)
+ * --nuxt-img Use instead of
(flag)
+ * --dry-run Print conversions without writing files (flag)
*/
-import fs from "fs";
+
+
+import fs from "fs";
import path from "path";
-import { parseArgs } from "util";
-// ─── CLI args ────────────────────────────────────────────────────────────────
+// ─── CLI args (manual parser, no dependencies) ───────────────────────────────
-const { values: args } = parseArgs({
- options: {
- vault: { type: "string", default: "./vault" },
- out: { type: "string", default: "./content" },
- "base-path":{ type: "string", default: "" },
- "img-prefix":{ type: "string", default: "/images" },
- "nuxt-img": { type: "boolean", default: false },
- "dry-run": { type: "boolean", default: false },
- },
-});
+function parseArgs() {
+ const argv = process.argv.slice(2);
+ const args = {
+ vault: "./vault",
+ out: "./content",
+ "base-path": "",
+ "img-prefix": "/images",
+ "nuxt-img": false,
+ "dry-run": false,
+ };
-const VAULT_DIR = path.resolve(args["vault"]);
-const OUT_DIR = path.resolve(args["out"]);
-const BASE_PATH = args["base-path"].replace(/\/$/, "");
-const IMG_PREFIX = args["img-prefix"].replace(/\/$/, "");
-const USE_NUXT_IMG = args["nuxt-img"];
-const DRY_RUN = args["dry-run"];
+ for (let i = 0; i < argv.length; i++) {
+ const key = argv[i].replace(/^--/, "");
+ if (argv[i].startsWith("--")) {
+ const next = argv[i + 1];
+ if (!next || next.startsWith("--")) {
+ // boolean flag
+ args[key] = true;
+ } else {
+ args[key] = next;
+ i++;
+ }
+ }
+ }
+ return args;
+}
+
+const args = parseArgs();
+
+const VAULT_DIR = path.resolve(args["vault"]);
+const OUT_DIR = path.resolve(args["out"]);
+const BASE_PATH = (args["base-path"] || "").replace(/\/$/, "");
+const IMG_PREFIX = (args["img-prefix"] || "/images").replace(/\/$/, "");
+const USE_NUXT_IMG = args["nuxt-img"] === true || args["nuxt-img"] === "true";
+const DRY_RUN = args["dry-run"] === true || args["dry-run"] === "true";
const IMAGE_EXTS = new Set([".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp", ".avif"]);
// ─── Utilities ───────────────────────────────────────────────────────────────
-/** Turn a note name / file stem into a URL-safe slug */
function slugify(name) {
return name
.toLowerCase()
@@ -66,7 +84,6 @@ function slugify(name) {
.replace(/--+/g, "-");
}
-/** Turn a heading string into a GitHub-style anchor slug */
function headingSlug(heading) {
return heading
.toLowerCase()
@@ -74,7 +91,6 @@ function headingSlug(heading) {
.replace(/[^\w\-]/g, "");
}
-/** Recursively collect all .md files in a directory */
function collectMarkdownFiles(dir) {
const results = [];
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
@@ -88,25 +104,50 @@ function collectMarkdownFiles(dir) {
return results;
}
-/**
- * Build a lookup map: note stem (lowercase) → relative URL path
- * Handles duplicate names by preferring the shortest path (vault-root wins).
- */
function buildNoteIndex(files) {
- const index = new Map();
- for (const file of files) {
- const stem = path.basename(file, ".md");
- const rel = path.relative(VAULT_DIR, file).replace(/\.md$/, "");
- const url = BASE_PATH + "/" + rel.split(path.sep).map(slugify).join("/");
- const key = stem.toLowerCase();
- if (!index.has(key) || rel.split(path.sep).length < index.get(key).depth) {
- index.set(key, { url, depth: rel.split(path.sep).length });
+ const candidates = new Map();
+
+ function addCandidate(key, url, depth) {
+ if (key && (!candidates.has(key) || depth < candidates.get(key).depth)) {
+ candidates.set(key, { url, depth });
}
}
- return new Map([...index.entries()].map(([k, v]) => [k, v.url]));
+
+ for (const file of files) {
+ const stem = path.basename(file, ".md");
+ const rel = path.relative(VAULT_DIR, file).replace(/\.md$/, "");
+ const url = BASE_PATH + "/" + rel.split(path.sep).map(slugify).join("/");
+ const depth = rel.split(path.sep).length;
+ const content = fs.readFileSync(file, "utf8");
+
+ // Key 1: exact lowercase filename stem e.g. "note2"
+ addCandidate(stem.toLowerCase(), url, depth);
+ // Key 2: slugified filename stem e.g. "note-two" from "Note Two.md"
+ addCandidate(slugify(stem), url, depth);
+
+ // Key 3: frontmatter title
+ const fmMatch = content.match(/^---[\s\S]*?^title:\s*(.+)/m);
+ if (fmMatch) {
+ const title = fmMatch[1].trim().replace(/^["']|["']$/g, "");
+ addCandidate(title.toLowerCase(), url, depth);
+ addCandidate(slugify(title), url, depth);
+ }
+
+ // Key 4: first H1 heading
+ const h1Match = content.match(/^#\s+(.+)/m);
+ if (h1Match) {
+ const h1 = h1Match[1].trim();
+ addCandidate(h1.toLowerCase(), url, depth);
+ addCandidate(slugify(h1), url, depth);
+ }
+ }
+
+ const result = new Map();
+ for (const [k, v] of candidates.entries()) result.set(k, v.url);
+ return result;
}
-// ─── Frontmatter helpers ─────────────────────────────────────────────────────
+// ─── Frontmatter ─────────────────────────────────────────────────────────────
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---/;
@@ -114,16 +155,15 @@ function parseFrontmatter(content) {
const match = content.match(FRONTMATTER_RE);
if (!match) return { frontmatter: {}, body: content };
- const raw = match[1];
+ const raw = match[1];
const body = content.slice(match[0].length);
-
- // Minimal YAML parser (handles string scalars and simple arrays)
- const fm = {};
+ const fm = {};
let currentKey = null;
+
for (const line of raw.split("\n")) {
const listItem = line.match(/^\s+-\s+(.+)/);
if (listItem && currentKey) {
- fm[currentKey] = Array.isArray(fm[currentKey]) ? fm[currentKey] : [];
+ if (!Array.isArray(fm[currentKey])) fm[currentKey] = [];
fm[currentKey].push(listItem[1].trim());
continue;
}
@@ -141,58 +181,45 @@ function serializeFrontmatter(fm) {
const lines = ["---"];
for (const [key, val] of Object.entries(fm)) {
if (Array.isArray(val)) {
- lines.push(`${key}:`);
- for (const v of val) lines.push(` - ${v}`);
+ lines.push(key + ":");
+ for (const v of val) lines.push(" - " + v);
} else {
- lines.push(`${key}: ${val}`);
+ lines.push(key + ": " + val);
}
}
lines.push("---");
return lines.join("\n");
}
-// ─── Inline-tag extractor ────────────────────────────────────────────────────
+// ─── Inline tags ─────────────────────────────────────────────────────────────
-/** Pull #tags from body text (skip # inside code fences or headings) */
function extractInlineTags(body) {
const tags = new Set();
- // Skip fenced code blocks
const stripped = body.replace(/```[\s\S]*?```/g, "");
const tagRe = /(? {
- return ` `;
+ return body.replace(/[ \t]+\^([a-zA-Z0-9-]+)\s*$/gm, function(_, id) {
+ return ' ';
});
}
// ─── Callouts ────────────────────────────────────────────────────────────────
-const CALLOUT_START_RE = /^> \[!([A-Z]+)\]([+-]?)\s*(.*)/i;
+const CALLOUT_START_RE = /^> \[!([A-Za-z]+)\][+-]?\s*(.*)/;
-/**
- * Convert Obsidian callout blocks to MDC (Nuxt Content) component syntax:
- *
- * > [!NOTE] Title ::callout{type="note" title="Title"}
- * > content content
- * ::
- */
function convertCallouts(body) {
const lines = body.split("\n");
const out = [];
@@ -200,122 +227,132 @@ function convertCallouts(body) {
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
-
if (!inCallout) {
const m = line.match(CALLOUT_START_RE);
if (m) {
const type = m[1].toLowerCase();
- const title = m[3].trim();
- const titleAttr = title ? ` title="${title}"` : "";
- out.push(`::callout{type="${type}"${titleAttr}}`);
+ const title = m[2].trim();
+ const titleAttr = title ? ' title="' + title + '"' : "";
+ out.push('::callout{type="' + type + '"' + titleAttr + "}");
inCallout = true;
- continue;
- }
- out.push(line);
- } else {
- // Continuation lines start with "> " or are blank (closing the block)
- if (line.startsWith("> ")) {
- out.push(line.slice(2)); // strip "> "
} else {
- out.push("::"); // close MDC block
+ out.push(line);
+ }
+ } else {
+ if (line.startsWith("> ")) {
+ out.push(line.slice(2));
+ } else {
+ out.push("::");
out.push(line);
inCallout = false;
}
}
}
-
if (inCallout) out.push("::");
return out.join("\n");
}
-// ─── Embedded content ![[...]] ──────────────────────────────────────────────
+// ─── Embeds ![[...]] ─────────────────────────────────────────────────────────
function convertEmbeds(body, noteIndex) {
- return body.replace(/!\[\[([^\]]+?)\]\]/g, (_, ref) => {
- const [rawName, size] = ref.split("|");
- const name = rawName.trim();
- const ext = path.extname(name).toLowerCase();
+ return body.replace(/!\[\[([^\]]+?)\]\]/g, function(_, ref) {
+ const parts = ref.split("|");
+ const name = parts[0].trim();
+ const size = parts[1] ? parts[1].trim() : null;
+ const ext = path.extname(name).toLowerCase();
if (IMAGE_EXTS.has(ext)) {
- // Image embed
- const src = `${IMG_PREFIX}/${name}`;
- const attrs = size ? ` width="${size.split("x")[0]}"` : "";
+ const src = IMG_PREFIX + "/" + name;
+ const altStr = path.basename(name, ext);
+ const wAttr = size ? ' width="' + size.split("x")[0] + '"' : "";
if (USE_NUXT_IMG) {
- return ``;
+ return '';
}
- return `
`;
+ return '
';
}
if (ext === ".mp4" || ext === ".webm") {
- const src = `${IMG_PREFIX}/${name}`;
- return ``;
+ return '';
}
- // Note embed → MDC include component
+ // Note embed
const stem = path.basename(name, ext || ".md");
- const slug = noteIndex.get(stem.toLowerCase()) ?? `${BASE_PATH}/${slugify(stem)}`;
- return `::include{path="${slug}"}`;
+ const slug = noteIndex.get(stem.toLowerCase()) || (BASE_PATH + "/" + slugify(stem));
+ return '::include{path="' + slug + '"}';
});
}
-// ─── Wiki links [[...]] ─────────────────────────────────────────────────────
+// ─── Wiki links [[...]] ──────────────────────────────────────────────────────
function convertWikiLinks(body, noteIndex) {
- return body.replace(/\[\[([^\]]+?)\]\]/g, (_, ref) => {
- // Split off alias: [[Note|Alias]]
- const [target, alias] = ref.split("|").map(s => s.trim());
+ return body.replace(/\[\[([^\]]+?)\]\]/g, function(_, ref) {
+ const pipeIdx = ref.indexOf("|");
+ let target, alias;
+ if (pipeIdx !== -1) {
+ target = ref.slice(0, pipeIdx).trim();
+ alias = ref.slice(pipeIdx + 1).trim();
+ } else {
+ target = ref.trim();
+ alias = null;
+ }
- // Split off heading or block ref: [[Note#Heading]] [[Note#^block]]
- const [notePart, anchor] = target.split("#").map(s => s.trim());
+ const hashIdx = target.indexOf("#");
+ let notePart, anchor;
+ if (hashIdx !== -1) {
+ notePart = target.slice(0, hashIdx).trim();
+ anchor = target.slice(hashIdx + 1).trim();
+ } else {
+ notePart = target;
+ anchor = null;
+ }
- const stem = path.basename(notePart, ".md");
- const baseUrl = noteIndex.get(stem.toLowerCase()) ?? `${BASE_PATH}/${slugify(stem)}`;
+ const stem = path.basename(notePart, ".md");
+ const resolved = noteIndex.get(stem.toLowerCase()) || noteIndex.get(slugify(stem));
+ const dead = !resolved;
+ const baseUrl = resolved || (BASE_PATH + "/" + slugify(stem));
let url = baseUrl;
if (anchor) {
- if (anchor.startsWith("^")) {
- // Block reference
- url += "#" + anchor.slice(1);
- } else {
- // Heading reference
- url += "#" + headingSlug(anchor);
- }
+ url += "#" + (anchor.startsWith("^") ? anchor.slice(1) : headingSlug(anchor));
}
- const label = alias || (anchor ? `${stem} › ${anchor}` : stem);
- return `[${label}](${url})`;
+ const label = alias || (anchor ? stem + " \u203a " + anchor : stem);
+
+ if (dead) {
+ return '' + label + '';
+ }
+ return "[" + label + "](" + url + ")";
});
}
-// ─── Main conversion ──────────────────────────────────────────────────────────
+// ─── Convert one file ────────────────────────────────────────────────────────
-function convertFile(content, noteIndex) {
+function convertFile(content, noteIndex, filename) {
let { frontmatter, body } = parseFrontmatter(content);
- // 1. Extract and merge inline tags into frontmatter
const inlineTags = extractInlineTags(body);
if (inlineTags.length) {
const existing = Array.isArray(frontmatter.tags)
? frontmatter.tags
- : frontmatter.tags
- ? [frontmatter.tags]
- : [];
- frontmatter.tags = [...new Set([...existing, ...inlineTags])];
+ : frontmatter.tags ? [frontmatter.tags] : [];
+ const merged = Array.from(new Set(existing.concat(inlineTags)));
+ frontmatter.tags = merged;
body = stripInlineTags(body);
}
- // 2. Callout blocks (before wiki-link pass so "> [[link]]" still works)
body = convertCallouts(body);
-
- // 3. Block IDs
body = convertBlockIds(body);
-
- // 4. Embedded files ![[...]]
body = convertEmbeds(body, noteIndex);
-
- // 5. Wiki links [[...]]
body = convertWikiLinks(body, noteIndex);
+ // Prepend a title if the body doesn't already start with an H1 heading
+ const trimmed = body.trimStart();
+ const hasTitle = /^#[^#]/.test(trimmed);
+ if (!hasTitle) {
+ const title = frontmatter.title || path.basename(filename, ".md");
+ body = "# " + title + "\n\n" + trimmed;
+ }
+
const fmString = Object.keys(frontmatter).length
? serializeFrontmatter(frontmatter) + "\n\n"
: "";
@@ -323,54 +360,55 @@ function convertFile(content, noteIndex) {
return fmString + body.trim() + "\n";
}
-// ─── Entry point ──────────────────────────────────────────────────────────────
+// ─── Main ────────────────────────────────────────────────────────────────────
function main() {
if (!fs.existsSync(VAULT_DIR)) {
- console.error(`Vault directory not found: ${VAULT_DIR}`);
+ console.error("Vault directory not found: " + VAULT_DIR);
process.exit(1);
}
- const files = collectMarkdownFiles(VAULT_DIR);
- const noteIndex = buildNoteIndex(files);
+ const files = collectMarkdownFiles(VAULT_DIR);
+ const noteIndex = buildNoteIndex(files);
- console.log(`Found ${files.length} markdown files in ${VAULT_DIR}`);
+ console.log("Found " + files.length + " markdown file(s) in " + VAULT_DIR);
- let converted = 0, skipped = 0;
+ let doneCount = 0, skipCount = 0;
for (const file of files) {
const rel = path.relative(VAULT_DIR, file);
const outPath = path.join(
OUT_DIR,
- rel
- .split(path.sep)
- .map((seg, i, arr) => i === arr.length - 1 ? seg : slugify(seg))
+ rel.split(path.sep)
+ .map(function(seg, i, arr) { return i === arr.length - 1 ? seg : slugify(seg); })
.join(path.sep)
);
- const content = fs.readFileSync(file, "utf8");
- let converted_content;
+ const content = fs.readFileSync(file, "utf8");
+ let result;
try {
- converted_content = convertFile(content, noteIndex);
+ result = convertFile(content, noteIndex, path.basename(file));
} catch (err) {
- console.warn(` ⚠ Skipping ${rel}: ${err.message}`);
- skipped++;
+ console.warn(" \u26A0 Skipping " + rel + ": " + err.message);
+ skipCount++;
continue;
}
if (DRY_RUN) {
- console.log(`\n${"─".repeat(60)}\n[DRY-RUN] ${rel} → ${path.relative(process.cwd(), outPath)}\n`);
- console.log(converted_content.slice(0, 500) + (converted_content.length > 500 ? "\n…" : ""));
+ console.log("\n" + "─".repeat(60));
+ console.log("[DRY-RUN] " + rel + " \u2192 " + path.relative(process.cwd(), outPath));
+ console.log("");
+ console.log(result.slice(0, 800) + (result.length > 800 ? "\n\u2026" : ""));
} else {
fs.mkdirSync(path.dirname(outPath), { recursive: true });
- fs.writeFileSync(outPath, converted_content, "utf8");
- console.log(` ✓ ${rel} → ${path.relative(process.cwd(), outPath)}`);
+ fs.writeFileSync(outPath, result, "utf8");
+ console.log(" \u2713 " + rel + " \u2192 " + path.relative(process.cwd(), outPath));
}
- converted++;
+ doneCount++;
}
- console.log(`\nDone. ${converted} file(s) converted, ${skipped} skipped.`);
+ console.log("\nDone. " + doneCount + " file(s) converted, " + skipCount + " skipped.");
}
main();
\ No newline at end of file
diff --git a/template/package-lock.json b/template/package-lock.json
index b13ae91..a1a1e4a 100644
--- a/template/package-lock.json
+++ b/template/package-lock.json
@@ -12,6 +12,9 @@
"nuxt": "^4.4.8",
"vue": "^3.5.35",
"vue-router": "^5.1.0"
+ },
+ "devDependencies": {
+ "sass-embedded": "^1.100.0"
}
},
"node_modules/@apidevtools/json-schema-ref-parser": {
@@ -454,6 +457,13 @@
}
}
},
+ "node_modules/@bufbuild/protobuf": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.12.1.tgz",
+ "integrity": "sha512-BvAMfS6LrgZiryOAZ4pBYucu4wG/Ei/9o9DZ9akbREnMLbPJiom2i8b9C8IsKErQoiKqVhrerzt3kOT/RrzLHg==",
+ "devOptional": true,
+ "license": "(Apache-2.0 AND BSD-3-Clause)"
+ },
"node_modules/@clack/core": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz",
@@ -6066,6 +6076,13 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
+ "node_modules/colorjs.io": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz",
+ "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
"node_modules/comma-separated-tokens": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@@ -6076,17 +6093,6 @@
"url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/commander": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
- "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
- "license": "MIT",
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
@@ -7516,6 +7522,16 @@
"uncrypto": "^0.1.3"
}
},
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/has-property-descriptors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
@@ -8014,6 +8030,13 @@
"integrity": "sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==",
"license": "MIT"
},
+ "node_modules/immutable": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
+ "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
"node_modules/impound": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/impound/-/impound-1.1.5.tgz",
@@ -12093,6 +12116,16 @@
"queue-microtask": "^1.2.2"
}
},
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -12113,6 +12146,381 @@
],
"license": "MIT"
},
+ "node_modules/sass": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz",
+ "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "chokidar": "^5.0.0",
+ "immutable": "^5.1.5",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/sass-embedded": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz",
+ "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bufbuild/protobuf": "^2.5.0",
+ "colorjs.io": "^0.5.0",
+ "immutable": "^5.1.5",
+ "rxjs": "^7.4.0",
+ "supports-color": "^8.1.1",
+ "sync-child-process": "^1.0.2",
+ "varint": "^6.0.0"
+ },
+ "bin": {
+ "sass": "dist/bin/sass.js"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "optionalDependencies": {
+ "sass-embedded-all-unknown": "1.100.0",
+ "sass-embedded-android-arm": "1.100.0",
+ "sass-embedded-android-arm64": "1.100.0",
+ "sass-embedded-android-riscv64": "1.100.0",
+ "sass-embedded-android-x64": "1.100.0",
+ "sass-embedded-darwin-arm64": "1.100.0",
+ "sass-embedded-darwin-x64": "1.100.0",
+ "sass-embedded-linux-arm": "1.100.0",
+ "sass-embedded-linux-arm64": "1.100.0",
+ "sass-embedded-linux-musl-arm": "1.100.0",
+ "sass-embedded-linux-musl-arm64": "1.100.0",
+ "sass-embedded-linux-musl-riscv64": "1.100.0",
+ "sass-embedded-linux-musl-x64": "1.100.0",
+ "sass-embedded-linux-riscv64": "1.100.0",
+ "sass-embedded-linux-x64": "1.100.0",
+ "sass-embedded-unknown-all": "1.100.0",
+ "sass-embedded-win32-arm64": "1.100.0",
+ "sass-embedded-win32-x64": "1.100.0"
+ }
+ },
+ "node_modules/sass-embedded-all-unknown": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz",
+ "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==",
+ "cpu": [
+ "!arm",
+ "!arm64",
+ "!riscv64",
+ "!x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "sass": "1.100.0"
+ }
+ },
+ "node_modules/sass-embedded-android-arm": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz",
+ "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-android-arm64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz",
+ "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-android-riscv64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz",
+ "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-android-x64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz",
+ "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-darwin-arm64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz",
+ "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-darwin-x64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz",
+ "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-arm": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz",
+ "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": "glibc",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-arm64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz",
+ "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": "glibc",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-arm": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz",
+ "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": "musl",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-arm64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz",
+ "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": "musl",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-riscv64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz",
+ "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": "musl",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-x64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz",
+ "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": "musl",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-riscv64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz",
+ "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": "glibc",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-x64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz",
+ "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": "glibc",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-unknown-all": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz",
+ "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "!android",
+ "!darwin",
+ "!linux",
+ "!win32"
+ ],
+ "dependencies": {
+ "sass": "1.100.0"
+ }
+ },
+ "node_modules/sass-embedded-win32-arm64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz",
+ "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-win32-x64": {
+ "version": "1.100.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz",
+ "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
"node_modules/sax": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
@@ -12845,6 +13253,29 @@
"node": ">=16"
}
},
+ "node_modules/sync-child-process": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz",
+ "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "sync-message-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/sync-message-port": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz",
+ "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
"node_modules/tagged-tag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
@@ -13137,8 +13568,8 @@
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD",
- "optional": true
+ "devOptional": true,
+ "license": "0BSD"
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
@@ -13805,6 +14236,13 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
+ "node_modules/varint": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+ "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
"node_modules/vfile": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
diff --git a/template/package.json b/template/package.json
index eb776a6..476571d 100644
--- a/template/package.json
+++ b/template/package.json
@@ -15,5 +15,8 @@
"nuxt": "^4.4.8",
"vue": "^3.5.35",
"vue-router": "^5.1.0"
+ },
+ "devDependencies": {
+ "sass-embedded": "^1.100.0"
}
}
diff --git a/template/public/fonts/Bookinsanity Bold Italic.otf b/template/public/fonts/Bookinsanity Bold Italic.otf
new file mode 100644
index 0000000..d5f722a
Binary files /dev/null and b/template/public/fonts/Bookinsanity Bold Italic.otf differ
diff --git a/template/public/fonts/Bookinsanity Bold.otf b/template/public/fonts/Bookinsanity Bold.otf
new file mode 100644
index 0000000..9559b9f
Binary files /dev/null and b/template/public/fonts/Bookinsanity Bold.otf differ
diff --git a/template/public/fonts/Bookinsanity Italic.otf b/template/public/fonts/Bookinsanity Italic.otf
new file mode 100644
index 0000000..d80a7ce
Binary files /dev/null and b/template/public/fonts/Bookinsanity Italic.otf differ
diff --git a/template/public/fonts/Bookinsanity.otf b/template/public/fonts/Bookinsanity.otf
new file mode 100644
index 0000000..2797402
Binary files /dev/null and b/template/public/fonts/Bookinsanity.otf differ
diff --git a/template/public/fonts/Mr Eaves Small Caps.otf b/template/public/fonts/Mr Eaves Small Caps.otf
new file mode 100644
index 0000000..267e34e
Binary files /dev/null and b/template/public/fonts/Mr Eaves Small Caps.otf differ
diff --git a/template/public/fonts/Nodesto Caps Condensed Bold Italic.otf b/template/public/fonts/Nodesto Caps Condensed Bold Italic.otf
new file mode 100644
index 0000000..5310f11
Binary files /dev/null and b/template/public/fonts/Nodesto Caps Condensed Bold Italic.otf differ
diff --git a/template/public/fonts/Nodesto Caps Condensed Bold.otf b/template/public/fonts/Nodesto Caps Condensed Bold.otf
new file mode 100644
index 0000000..84ceb42
Binary files /dev/null and b/template/public/fonts/Nodesto Caps Condensed Bold.otf differ
diff --git a/template/public/fonts/Nodesto Caps Condensed Italic.otf b/template/public/fonts/Nodesto Caps Condensed Italic.otf
new file mode 100644
index 0000000..a036876
Binary files /dev/null and b/template/public/fonts/Nodesto Caps Condensed Italic.otf differ
diff --git a/template/public/fonts/Nodesto Caps Condensed.otf b/template/public/fonts/Nodesto Caps Condensed.otf
new file mode 100644
index 0000000..2c4117d
Binary files /dev/null and b/template/public/fonts/Nodesto Caps Condensed.otf differ
diff --git a/template/public/fonts/Scaly Sans Bold Italic.otf b/template/public/fonts/Scaly Sans Bold Italic.otf
new file mode 100644
index 0000000..df40e2c
Binary files /dev/null and b/template/public/fonts/Scaly Sans Bold Italic.otf differ
diff --git a/template/public/fonts/Scaly Sans Bold.otf b/template/public/fonts/Scaly Sans Bold.otf
new file mode 100644
index 0000000..f46fcd6
Binary files /dev/null and b/template/public/fonts/Scaly Sans Bold.otf differ
diff --git a/template/public/fonts/Scaly Sans Caps Bold Italic.otf b/template/public/fonts/Scaly Sans Caps Bold Italic.otf
new file mode 100644
index 0000000..cc93078
Binary files /dev/null and b/template/public/fonts/Scaly Sans Caps Bold Italic.otf differ
diff --git a/template/public/fonts/Scaly Sans Caps Bold.otf b/template/public/fonts/Scaly Sans Caps Bold.otf
new file mode 100644
index 0000000..90588c2
Binary files /dev/null and b/template/public/fonts/Scaly Sans Caps Bold.otf differ
diff --git a/template/public/fonts/Scaly Sans Caps Italic.otf b/template/public/fonts/Scaly Sans Caps Italic.otf
new file mode 100644
index 0000000..a0e078b
Binary files /dev/null and b/template/public/fonts/Scaly Sans Caps Italic.otf differ
diff --git a/template/public/fonts/Scaly Sans Caps.otf b/template/public/fonts/Scaly Sans Caps.otf
new file mode 100644
index 0000000..c93bd2e
Binary files /dev/null and b/template/public/fonts/Scaly Sans Caps.otf differ
diff --git a/template/public/fonts/Scaly Sans Italic.otf b/template/public/fonts/Scaly Sans Italic.otf
new file mode 100644
index 0000000..908b75f
Binary files /dev/null and b/template/public/fonts/Scaly Sans Italic.otf differ
diff --git a/template/public/fonts/Scaly Sans.otf b/template/public/fonts/Scaly Sans.otf
new file mode 100644
index 0000000..44f7b72
Binary files /dev/null and b/template/public/fonts/Scaly Sans.otf differ
diff --git a/template/public/fonts/Solbera Imitation.otf b/template/public/fonts/Solbera Imitation.otf
new file mode 100644
index 0000000..858761e
Binary files /dev/null and b/template/public/fonts/Solbera Imitation.otf differ
diff --git a/template/public/fonts/Zatanna Misdirection Bold Italic.otf b/template/public/fonts/Zatanna Misdirection Bold Italic.otf
new file mode 100644
index 0000000..8912723
Binary files /dev/null and b/template/public/fonts/Zatanna Misdirection Bold Italic.otf differ
diff --git a/template/public/fonts/Zatanna Misdirection Bold.otf b/template/public/fonts/Zatanna Misdirection Bold.otf
new file mode 100644
index 0000000..b1ecd4d
Binary files /dev/null and b/template/public/fonts/Zatanna Misdirection Bold.otf differ
diff --git a/template/public/fonts/Zatanna Misdirection Italic.otf b/template/public/fonts/Zatanna Misdirection Italic.otf
new file mode 100644
index 0000000..4e2797a
Binary files /dev/null and b/template/public/fonts/Zatanna Misdirection Italic.otf differ
diff --git a/template/public/fonts/Zatanna Misdirection.otf b/template/public/fonts/Zatanna Misdirection.otf
new file mode 100644
index 0000000..801ca86
Binary files /dev/null and b/template/public/fonts/Zatanna Misdirection.otf differ