feat(transformer): allow inline CSS styling (#1551)
* feat(transformer): allow inline CSS styling * Updated docs * Default to inline: false * Removed redundant inline: false
This commit is contained in:
		@@ -27,7 +27,7 @@ The following sections will go into detail for what methods can be implemented f
 | 
				
			|||||||
  - `cfg`: The full Quartz [[configuration]]
 | 
					  - `cfg`: The full Quartz [[configuration]]
 | 
				
			||||||
  - `allSlugs`: a list of all the valid content slugs (see [[paths]] for more information on what a `ServerSlug` is)
 | 
					  - `allSlugs`: a list of all the valid content slugs (see [[paths]] for more information on what a `ServerSlug` is)
 | 
				
			||||||
- `StaticResources` is defined in `quartz/resources.tsx`. It consists of
 | 
					- `StaticResources` is defined in `quartz/resources.tsx`. It consists of
 | 
				
			||||||
  - `css`: a list of URLs for stylesheets that should be loaded
 | 
					  - `css`: a list of CSS style definitions that should be loaded. A CSS style is described with the `CSSResource` type which is also defined in `quartz/resources.tsx`. It accepts either a source URL or the inline content of the stylesheet.
 | 
				
			||||||
  - `js`: a list of scripts that should be loaded. A script is described with the `JSResource` type which is also defined in `quartz/resources.tsx`. It allows you to define a load time (either before or after the DOM has been loaded), whether it should be a module, and either the source URL or the inline content of the script.
 | 
					  - `js`: a list of scripts that should be loaded. A script is described with the `JSResource` type which is also defined in `quartz/resources.tsx`. It allows you to define a load time (either before or after the DOM has been loaded), whether it should be a module, and either the source URL or the inline content of the script.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Transformers
 | 
					## Transformers
 | 
				
			||||||
@@ -85,8 +85,10 @@ export const Latex: QuartzTransformerPlugin<Options> = (opts?: Options) => {
 | 
				
			|||||||
      if (engine === "katex") {
 | 
					      if (engine === "katex") {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
          css: [
 | 
					          css: [
 | 
				
			||||||
            // base css
 | 
					            {
 | 
				
			||||||
            "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css",
 | 
					              // base css
 | 
				
			||||||
 | 
					              content: "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          js: [
 | 
					          js: [
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
import { i18n } from "../i18n"
 | 
					import { i18n } from "../i18n"
 | 
				
			||||||
import { FullSlug, joinSegments, pathToRoot } from "../util/path"
 | 
					import { FullSlug, joinSegments, pathToRoot } from "../util/path"
 | 
				
			||||||
import { JSResourceToScriptElement } from "../util/resources"
 | 
					import { CSSResourceToStyleElement, JSResourceToScriptElement } from "../util/resources"
 | 
				
			||||||
import { googleFontHref } from "../util/theme"
 | 
					import { googleFontHref } from "../util/theme"
 | 
				
			||||||
import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types"
 | 
					import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -40,9 +40,7 @@ export default (() => {
 | 
				
			|||||||
        <link rel="icon" href={iconPath} />
 | 
					        <link rel="icon" href={iconPath} />
 | 
				
			||||||
        <meta name="description" content={description} />
 | 
					        <meta name="description" content={description} />
 | 
				
			||||||
        <meta name="generator" content="Quartz" />
 | 
					        <meta name="generator" content="Quartz" />
 | 
				
			||||||
        {css.map((href) => (
 | 
					        {css.map((resource) => CSSResourceToStyleElement(resource, true))}
 | 
				
			||||||
          <link key={href} href={href} rel="stylesheet" type="text/css" spa-preserve />
 | 
					 | 
				
			||||||
        ))}
 | 
					 | 
				
			||||||
        {js
 | 
					        {js
 | 
				
			||||||
          .filter((resource) => resource.loadTime === "beforeDOMReady")
 | 
					          .filter((resource) => resource.loadTime === "beforeDOMReady")
 | 
				
			||||||
          .map((res) => JSResourceToScriptElement(res, true))}
 | 
					          .map((res) => JSResourceToScriptElement(res, true))}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,12 @@ export function pageResources(
 | 
				
			|||||||
  const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())`
 | 
					  const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return {
 | 
					  return {
 | 
				
			||||||
    css: [joinSegments(baseDir, "index.css"), ...staticResources.css],
 | 
					    css: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        content: joinSegments(baseDir, "index.css"),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      ...staticResources.css,
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
    js: [
 | 
					    js: [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        src: joinSegments(baseDir, "prescript.js"),
 | 
					        src: joinSegments(baseDir, "prescript.js"),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,8 +31,10 @@ export const Latex: QuartzTransformerPlugin<Partial<Options>> = (opts) => {
 | 
				
			|||||||
      if (engine === "katex") {
 | 
					      if (engine === "katex") {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
          css: [
 | 
					          css: [
 | 
				
			||||||
            // base css
 | 
					            {
 | 
				
			||||||
            "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css",
 | 
					              // base css
 | 
				
			||||||
 | 
					              content: "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          js: [
 | 
					          js: [
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,12 @@ export type JSResource = {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type CSSResource = {
 | 
				
			||||||
 | 
					  content: string
 | 
				
			||||||
 | 
					  inline?: boolean
 | 
				
			||||||
 | 
					  spaPreserve?: boolean
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element {
 | 
					export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element {
 | 
				
			||||||
  const scriptType = resource.moduleType ?? "application/javascript"
 | 
					  const scriptType = resource.moduleType ?? "application/javascript"
 | 
				
			||||||
  const spaPreserve = preserve ?? resource.spaPreserve
 | 
					  const spaPreserve = preserve ?? resource.spaPreserve
 | 
				
			||||||
@@ -36,7 +42,24 @@ export function JSResourceToScriptElement(resource: JSResource, preserve?: boole
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function CSSResourceToStyleElement(resource: CSSResource, preserve?: boolean): JSX.Element {
 | 
				
			||||||
 | 
					  const spaPreserve = preserve ?? resource.spaPreserve
 | 
				
			||||||
 | 
					  if (resource.inline ?? false) {
 | 
				
			||||||
 | 
					    return <style>{resource.content}</style>
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <link
 | 
				
			||||||
 | 
					        key={resource.content}
 | 
				
			||||||
 | 
					        href={resource.content}
 | 
				
			||||||
 | 
					        rel="stylesheet"
 | 
				
			||||||
 | 
					        type="text/css"
 | 
				
			||||||
 | 
					        spa-preserve={spaPreserve}
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface StaticResources {
 | 
					export interface StaticResources {
 | 
				
			||||||
  css: string[]
 | 
					  css: CSSResource[]
 | 
				
			||||||
  js: JSResource[]
 | 
					  js: JSResource[]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user