Themes move from Vite-built frontend assets to pagerite/themes/{name}/
folders holding theme.css and/or banner.css (+ banner.svg), served by the
backend at /_themes/{name}/... and re-read from disk per request (etag by
mtime), so on-disk edits show on the next page load even in prod and new
themes need no build or config. The theme and banner-design selectors
enumerate these folders via GET /_api/settings.
Banner designs: Node.banner_design picks a design per page (None inherits
from ancestors, then the front page, then the active theme's own design;
"" = none). The design's banner.css is linked in <head> (id
pagerite-banner, between theme and custom CSS) and its banner.svg inlined
into #page-banner first (marked svg[data-design]); the page's own
Node.banner HTML renders after it, so author code always wins. #page-banner
is now a stacking grid so artwork and author code overlay.
Dev/prod hot loading unified: the backend renders the theme/design links
in both modes; in dev pagerite.js only re-appends them (and the custom
CSS) after the Vite-injected base styles. Theme switches just swap the
link href. The pagerite:theme meta and Vite theme build entries are gone.
49 lines
1.9 KiB
JavaScript
49 lines
1.9 KiB
JavaScript
import { fileURLToPath, URL } from 'node:url'
|
|
import fastapiVue from './vite-plugin-fastapi.js'
|
|
|
|
import { defineConfig } from 'vite'
|
|
import vue from '@vitejs/plugin-vue'
|
|
import vueDevTools from 'vite-plugin-vue-devtools'
|
|
|
|
const backendUrl = process.env.PAGERITE_BACKEND_URL || 'http://localhost:3200'
|
|
|
|
// Proxy content pages (/slug, /path/to/slug) to the FastAPI backend in dev.
|
|
// Excludes Vite internals (/@..., /src, /node_modules, /__...) and the
|
|
// backend's /_ prefix. /_api and /_f are handled by the fastapi-vue plugin.
|
|
const CONTENT_PROXY = '^\\/(?!_|@|src|node_modules|__)(?:[^./?]+(?:\\/[^./?]+)*)?(?:\\?.*)?$'
|
|
|
|
// https://vite.dev/config/
|
|
export default defineConfig({
|
|
plugins: [
|
|
fastapiVue({ paths: ["/_api", "/_f"] }),
|
|
vue(),
|
|
vueDevTools(),
|
|
],
|
|
server: {
|
|
proxy: {
|
|
[CONTENT_PROXY]: { target: backendUrl, changeOrigin: false },
|
|
},
|
|
},
|
|
appType: 'mpa', // no SPA fallback; every HTML page is served by FastAPI
|
|
build: {
|
|
// Mirror the URL space in the build output: hashed files land under
|
|
// frontend-build/_assets/ and the Frontend serves the build directory
|
|
// at the site root (frontend/public/favicon.ico -> /favicon.ico).
|
|
manifest: true,
|
|
assetsDir: '_assets',
|
|
rollupOptions: {
|
|
// main.js is dynamic-imported by the public page (pagerite.js) for
|
|
// its openEditor/closeEditor exports — keep them in the bundle
|
|
// (app builds strip unused entry exports by default).
|
|
preserveEntrySignatures: 'exports-only',
|
|
input: {
|
|
main: fileURLToPath(new URL('./src/main.js', import.meta.url)),
|
|
pagerite: fileURLToPath(new URL('./src/pagerite.js', import.meta.url)),
|
|
// Only the base CSS is built; theme/banner-design stylesheets live
|
|
// in pagerite/themes/{name}/ and are served by the backend as-is.
|
|
pagerite_base: fileURLToPath(new URL('./src/assets/pagerite.css', import.meta.url)),
|
|
},
|
|
},
|
|
},
|
|
})
|