font loading options, optimize css
This commit is contained in:
@ -11,6 +11,7 @@ import { intro, isCancel, outro, select, text } from "@clack/prompts"
|
||||
import { rimraf } from "rimraf"
|
||||
import prettyBytes from "pretty-bytes"
|
||||
import { spawnSync } from "child_process"
|
||||
import { transform } from "lightningcss"
|
||||
|
||||
const UPSTREAM_NAME = "upstream"
|
||||
const QUARTZ_SOURCE_BRANCH = "v4-alpha"
|
||||
@ -302,6 +303,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
|
||||
plugins: [
|
||||
sassPlugin({
|
||||
type: "css-text",
|
||||
cssImports: true,
|
||||
}),
|
||||
{
|
||||
name: "inline-script-loader",
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { FilePath, ServerSlug } from "../../path"
|
||||
import { PluginTypes, QuartzEmitterPlugin } from "../types"
|
||||
import { QuartzEmitterPlugin } from "../types"
|
||||
|
||||
// @ts-ignore
|
||||
import spaRouterScript from "../../components/scripts/spa.inline"
|
||||
@ -13,6 +13,7 @@ import { BuildCtx } from "../../ctx"
|
||||
import { StaticResources } from "../../resources"
|
||||
import { QuartzComponent } from "../../components/types"
|
||||
import { googleFontHref, joinStyles } from "../../theme"
|
||||
import { transform } from "lightningcss"
|
||||
|
||||
type ComponentResources = {
|
||||
css: string[]
|
||||
@ -67,7 +68,6 @@ function addGlobalPageResources(
|
||||
) {
|
||||
const cfg = ctx.cfg.configuration
|
||||
const reloadScript = ctx.argv.serve
|
||||
staticResources.css.push(googleFontHref(cfg.theme))
|
||||
|
||||
// popovers
|
||||
if (cfg.enablePopovers) {
|
||||
@ -120,35 +120,61 @@ function addGlobalPageResources(
|
||||
}
|
||||
}
|
||||
|
||||
export const ComponentResources: QuartzEmitterPlugin = () => ({
|
||||
name: "ComponentResources",
|
||||
getQuartzComponents() {
|
||||
return []
|
||||
},
|
||||
async emit(ctx, _content, resources, emit): Promise<FilePath[]> {
|
||||
// component specific scripts and styles
|
||||
const componentResources = getComponentResources(ctx)
|
||||
// important that this goes *after* component scripts
|
||||
// as the "nav" event gets triggered here and we should make sure
|
||||
// that everyone else had the chance to register a listener for it
|
||||
addGlobalPageResources(ctx, resources, componentResources)
|
||||
const fps = await Promise.all([
|
||||
emit({
|
||||
slug: "index" as ServerSlug,
|
||||
ext: ".css",
|
||||
content: joinStyles(ctx.cfg.configuration.theme, styles, ...componentResources.css),
|
||||
}),
|
||||
emit({
|
||||
slug: "prescript" as ServerSlug,
|
||||
ext: ".js",
|
||||
content: joinScripts(componentResources.beforeDOMLoaded),
|
||||
}),
|
||||
emit({
|
||||
slug: "postscript" as ServerSlug,
|
||||
ext: ".js",
|
||||
content: joinScripts(componentResources.afterDOMLoaded),
|
||||
}),
|
||||
])
|
||||
return fps
|
||||
},
|
||||
})
|
||||
interface Options {
|
||||
fontOrigin: "googleFonts" | "local"
|
||||
}
|
||||
|
||||
const defaultOptions: Options = {
|
||||
fontOrigin: "googleFonts",
|
||||
}
|
||||
|
||||
export const ComponentResources: QuartzEmitterPlugin<Options> = (opts?: Partial<Options>) => {
|
||||
const { fontOrigin } = { ...defaultOptions, ...opts }
|
||||
return {
|
||||
name: "ComponentResources",
|
||||
getQuartzComponents() {
|
||||
return []
|
||||
},
|
||||
async emit(ctx, _content, resources, emit): Promise<FilePath[]> {
|
||||
// component specific scripts and styles
|
||||
const componentResources = getComponentResources(ctx)
|
||||
// important that this goes *after* component scripts
|
||||
// as the "nav" event gets triggered here and we should make sure
|
||||
// that everyone else had the chance to register a listener for it
|
||||
|
||||
if (fontOrigin === "googleFonts") {
|
||||
resources.css.push(googleFontHref(ctx.cfg.configuration.theme))
|
||||
} else if (fontOrigin === "local") {
|
||||
// let the user do it themselves in css
|
||||
}
|
||||
|
||||
addGlobalPageResources(ctx, resources, componentResources)
|
||||
|
||||
const stylesheet = joinStyles(ctx.cfg.configuration.theme, styles, ...componentResources.css)
|
||||
const prescript = joinScripts(componentResources.beforeDOMLoaded)
|
||||
const postscript = joinScripts(componentResources.afterDOMLoaded)
|
||||
const fps = await Promise.all([
|
||||
emit({
|
||||
slug: "index" as ServerSlug,
|
||||
ext: ".css",
|
||||
content: transform({
|
||||
filename: "index.css",
|
||||
code: Buffer.from(stylesheet),
|
||||
minify: true
|
||||
}).code.toString(),
|
||||
}),
|
||||
emit({
|
||||
slug: "prescript" as ServerSlug,
|
||||
ext: ".js",
|
||||
content: prescript,
|
||||
}),
|
||||
emit({
|
||||
slug: "postscript" as ServerSlug,
|
||||
ext: ".js",
|
||||
content: postscript,
|
||||
}),
|
||||
])
|
||||
return fps
|
||||
},
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
@use "./custom.scss";
|
||||
@use "./syntax.scss";
|
||||
@use "./callouts.scss";
|
||||
@use "./custom.scss";
|
||||
@use "./variables.scss" as *;
|
||||
|
||||
html {
|
||||
|
@ -24,13 +24,17 @@ export interface Theme {
|
||||
const DEFAULT_SANS_SERIF =
|
||||
'-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif'
|
||||
const DEFAULT_MONO = "ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace"
|
||||
|
||||
export function googleFontHref(theme: Theme) {
|
||||
const { code, header, body } = theme.typography
|
||||
return `https://fonts.googleapis.com/css2?family=${code}&family=${header}:wght@400;700&family=${body}:ital,wght@0,400;0,600;1,400;1,600&display=swap`
|
||||
}
|
||||
|
||||
export function joinStyles(theme: Theme, ...stylesheet: string[]) {
|
||||
return `:root {
|
||||
return `
|
||||
${stylesheet.join("\n\n")}
|
||||
|
||||
:root {
|
||||
--light: ${theme.colors.lightMode.light};
|
||||
--lightgray: ${theme.colors.lightMode.lightgray};
|
||||
--gray: ${theme.colors.lightMode.gray};
|
||||
@ -55,6 +59,6 @@ export function joinStyles(theme: Theme, ...stylesheet: string[]) {
|
||||
--tertiary: ${theme.colors.darkMode.tertiary};
|
||||
--highlight: ${theme.colors.darkMode.highlight};
|
||||
}
|
||||
`
|
||||
|
||||
${stylesheet.join("\n\n")}`
|
||||
}
|
||||
|
Reference in New Issue
Block a user