/** * The seals, and which one belongs to each page family (Ornament kit, "Edge * seal by page"). Imported as URLs so they load as images: their internal * ids never clash, and they never block text. */ import astrolabe from "../assets/motifs/astrolabe.svg?url"; import craftDice from "../assets/motifs/craft-seal-dice.svg?url"; import craftLeather from "../assets/motifs/craft-seal-leather.svg?url"; import craftPrint from "../assets/motifs/craft-seal-print.svg?url"; import filamentBanner from "../assets/motifs/filament-banner.svg?url"; import filamentTransmutation from "../assets/motifs/filament-transmutation.svg?url"; import keplerNest from "../assets/motifs/kepler-nest-seal.svg?url"; import layered from "../assets/motifs/layered-seal.svg?url"; import miniAstrolabe from "../assets/motifs/mini-astrolabe.svg?url"; import miniLayered from "../assets/motifs/mini-layered.svg?url"; import miniTome from "../assets/motifs/mini-tome.svg?url"; import miniTransmutation from "../assets/motifs/mini-transmutation.svg?url"; import sevenMetals from "../assets/motifs/seven-metals-dipper.svg?url"; import squaredCircle from "../assets/motifs/squared-circle-seal.svg?url"; import transmutationStarPaths from "../assets/motifs/transmutation-seal-star-paths.svg?url"; import transmutation from "../assets/motifs/transmutation-seal.svg?url"; import triaPrima from "../assets/motifs/tria-prima-array-seal.svg?url"; import zodiac from "../assets/motifs/zodiac-seal.svg?url"; export const seals = { astrolabe, "craft-dice": craftDice, "craft-leather": craftLeather, "craft-print": craftPrint, "filament-transmutation": filamentTransmutation, "kepler-nest": keplerNest, layered, "mini-astrolabe": miniAstrolabe, "mini-layered": miniLayered, "mini-tome": miniTome, "mini-transmutation": miniTransmutation, "seven-metals": sevenMetals, "squared-circle": squaredCircle, "transmutation-star-paths": transmutationStarPaths, transmutation, "tria-prima": triaPrima, zodiac, } as const; export type SealName = keyof typeof seals; export { filamentBanner }; // Light mode and foil versions, written by scripts/light-motifs.mjs. const byFile = (m: Record) => Object.fromEntries(Object.entries(m).map(([p, u]) => [p.slice(p.lastIndexOf("/") + 1), u])); const darkFiles = byFile(import.meta.glob("../assets/motifs/*.svg", { query: "?url", import: "default", eager: true })); const lightFiles = byFile(import.meta.glob("../assets/motifs/light/*.svg", { query: "?url", import: "default", eager: true })); const foilFiles = byFile(import.meta.glob("../assets/motifs/foil/*.svg", { query: "?url", import: "default", eager: true })); const foilLightFiles = byFile(import.meta.glob("../assets/motifs/foil-light/*.svg", { query: "?url", import: "default", eager: true })); const fileOf = Object.fromEntries(Object.entries(darkFiles).map(([f, u]) => [u, f])); /** * A motif's image for each mode. Foil is only for a seal standing alone at * 120px or more and half opacity or more; smaller or fainter seals stay flat. */ export function motifSources(url: string, { foil = false } = {}): { dark: string; light: string } { const f = fileOf[url]; if (!f) return { dark: url, light: url }; return { dark: (foil && foilFiles[f]) || url, light: (foil && foilLightFiles[f]) || lightFiles[f] || url, }; } /** Each page family's edge seal. A craft page uses its own craft seal. */ export const pageSeals = { landing: "transmutation-star-paths", resume: "kepler-nest", work: "squared-circle", inquiries: "filament-transmutation", about: "astrolabe", library: "zodiac", shelf: "tria-prima", workshop: "craft-print", tabletop: "astrolabe", now: "zodiac", blog: "seven-metals", post: "filament-transmutation", store: "craft-dice", notFound: "zodiac", } as const satisfies Record; export type PageFamily = keyof typeof pageSeals;