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:
		
							parent
							
								
									a53772bbd1
								
							
						
					
					
						commit
						314a88d5c6
					
				| @ -27,7 +27,7 @@ The following sections will go into detail for what methods can be implemented f | ||||
|   - `cfg`: The full Quartz [[configuration]] | ||||
|   - `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 | ||||
|   - `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. | ||||
| 
 | ||||
| ## Transformers | ||||
| @ -85,8 +85,10 @@ export const Latex: QuartzTransformerPlugin<Options> = (opts?: Options) => { | ||||
|       if (engine === "katex") { | ||||
|         return { | ||||
|           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: [ | ||||
|             { | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| import { i18n } from "../i18n" | ||||
| import { FullSlug, joinSegments, pathToRoot } from "../util/path" | ||||
| import { JSResourceToScriptElement } from "../util/resources" | ||||
| import { CSSResourceToStyleElement, JSResourceToScriptElement } from "../util/resources" | ||||
| import { googleFontHref } from "../util/theme" | ||||
| import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" | ||||
| 
 | ||||
| @ -40,9 +40,7 @@ export default (() => { | ||||
|         <link rel="icon" href={iconPath} /> | ||||
|         <meta name="description" content={description} /> | ||||
|         <meta name="generator" content="Quartz" /> | ||||
|         {css.map((href) => ( | ||||
|           <link key={href} href={href} rel="stylesheet" type="text/css" spa-preserve /> | ||||
|         ))} | ||||
|         {css.map((resource) => CSSResourceToStyleElement(resource, true))} | ||||
|         {js | ||||
|           .filter((resource) => resource.loadTime === "beforeDOMReady") | ||||
|           .map((res) => JSResourceToScriptElement(res, true))} | ||||
|  | ||||
| @ -29,7 +29,12 @@ export function pageResources( | ||||
|   const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())` | ||||
| 
 | ||||
|   return { | ||||
|     css: [joinSegments(baseDir, "index.css"), ...staticResources.css], | ||||
|     css: [ | ||||
|       { | ||||
|         content: joinSegments(baseDir, "index.css"), | ||||
|       }, | ||||
|       ...staticResources.css, | ||||
|     ], | ||||
|     js: [ | ||||
|       { | ||||
|         src: joinSegments(baseDir, "prescript.js"), | ||||
|  | ||||
| @ -31,8 +31,10 @@ export const Latex: QuartzTransformerPlugin<Partial<Options>> = (opts) => { | ||||
|       if (engine === "katex") { | ||||
|         return { | ||||
|           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: [ | ||||
|             { | ||||
|  | ||||
| @ -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 { | ||||
|   const scriptType = resource.moduleType ?? "application/javascript" | ||||
|   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 { | ||||
|   css: string[] | ||||
|   css: CSSResource[] | ||||
|   js: JSResource[] | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user