From f1977924f8149112f64286f69b574342cd546fe2 Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Tue, 30 Jul 2024 18:30:15 +0100 Subject: [PATCH] Add callouts support Adds a colour palette Adds homemade remark-callouts package Adds tabler icons dependency --- packages/remark-callouts/.gitignore | 2 + packages/remark-callouts/package.json | 42 ++ packages/remark-callouts/rollup.config.js | 20 + packages/remark-callouts/src/index.ts | 326 ++++++++++++++ .../remark-callouts/src/tokeniseCallout.ts | 245 +++++++++++ packages/remark-callouts/tsconfig.json | 14 + packages/website/mdsvex.config.js | 4 +- packages/website/package.json | 2 + packages/website/src/lib/Callout.svelte | 27 ++ .../website/src/lib/mdlayouts/default.svelte | 3 +- packages/website/src/lib/style/callout.css | 194 +++++++++ packages/website/src/lib/styles.css | 21 +- pnpm-lock.yaml | 411 +++++++++++++++++- 13 files changed, 1307 insertions(+), 4 deletions(-) create mode 100644 packages/remark-callouts/.gitignore create mode 100644 packages/remark-callouts/package.json create mode 100644 packages/remark-callouts/rollup.config.js create mode 100644 packages/remark-callouts/src/index.ts create mode 100644 packages/remark-callouts/src/tokeniseCallout.ts create mode 100644 packages/remark-callouts/tsconfig.json create mode 100644 packages/website/src/lib/Callout.svelte create mode 100644 packages/website/src/lib/style/callout.css diff --git a/packages/remark-callouts/.gitignore b/packages/remark-callouts/.gitignore new file mode 100644 index 00000000..db4c6d9b --- /dev/null +++ b/packages/remark-callouts/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules \ No newline at end of file diff --git a/packages/remark-callouts/package.json b/packages/remark-callouts/package.json new file mode 100644 index 00000000..e6d85f1c --- /dev/null +++ b/packages/remark-callouts/package.json @@ -0,0 +1,42 @@ +{ + "name": "remark-callouts", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "dist/index.esm.js", + "exports": { + "import": "./dist/index.esm.js", + "require": "./dist/index.cjs.js", + "types": "./dist/index.d.ts" + }, + "types": "dist/index.d.ts", + "scripts": { + "build": "rollup -c", + "dev": "rollup -c -w", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@rollup/plugin-typescript": "^11.1.6", + "@types/mdast": "^4.0.4", + "@types/node": "^20.14.2", + "@types/svg-parser": "^2.0.6", + "@types/trim": "^0.1.3", + "@types/unist": "^3.0.2", + "mdast": "^3.0.0", + "rollup": "^4.18.0", + "rollup-plugin-dts": "^6.1.1", + "unified": "^6.2.0" + }, + "files": [ + "dist" + ], + "dependencies": { + "mdast-util-from-markdown": "^1.3.1", + "svg-parser": "^2.0.4", + "trim": "^0.0.1", + "unist-util-visit": "^4.1.2" + } +} diff --git a/packages/remark-callouts/rollup.config.js b/packages/remark-callouts/rollup.config.js new file mode 100644 index 00000000..e4fda77c --- /dev/null +++ b/packages/remark-callouts/rollup.config.js @@ -0,0 +1,20 @@ +// rollup.config.js +import typescript from '@rollup/plugin-typescript'; +import { dts } from "rollup-plugin-dts"; +import pkg from './package.json' with { type: "json" }; + +export default [ + { + input: 'src/index.ts', + output: [ + { file: pkg.exports.require, format: 'cjs' }, + { file: pkg.exports.import, format: 'es' } + ], + plugins: [typescript()] + }, + { + input: 'src/index.ts', + output: [{ file: pkg.exports.types, format: 'es' }], + plugins: [dts()], + } +]; \ No newline at end of file diff --git a/packages/remark-callouts/src/index.ts b/packages/remark-callouts/src/index.ts new file mode 100644 index 00000000..87c8d1a9 --- /dev/null +++ b/packages/remark-callouts/src/index.ts @@ -0,0 +1,326 @@ +import { visit } from "unist-util-visit"; +import { fromMarkdown } from "mdast-util-from-markdown"; +// @ts-ignore +import type { Plugin } from "unified"; +import type { Node, Data, Parent } from "unist"; +import type { Blockquote, Heading, Text, BlockContent } from "mdast"; +import { parse } from "svg-parser"; +// import { calloutTypes } from "./calloutTypes"; + +// escape regex special characters +function escapeRegExp(s: string) { + return s.replace(new RegExp(`[-[\\]{}()*+?.\\\\^$|/]`, "g"), "\\$&"); +} + +import tok from "./tokeniseCallout" + +function trim(str: string){ + return str.replace(/^\s*|\s*$/g, ''); +} + +export interface Config { + // classNameMaps: { + // block: ClassNameMap; + // title: ClassNameMap; + // }; + // dataMaps: { + // block: (data: Data) => Data; + // title: (data: Data) => Data; + // }; + // types: { [index: string]: string | object }; + } + + export const defaultConfig: Config = { + // classNameMaps: { + // block: "callout", + // title: "callout-title", + // }, + // dataMaps: { + // block: (data) => data, + // title: (data) => data, + // }, + // types: { ...calloutTypes }, + }; + + type ClassNames = string | string[]; + type ClassNameMap = ClassNames | ((title: string) => ClassNames); + function formatClassNameMap(gen: ClassNameMap) { + return (title: string) => { + const classNames = typeof gen == "function" ? gen(title) : gen; + return typeof classNames == "object" ? classNames.join(" ") : classNames; + }; + } + +export const callouts: Plugin = function (providedConfig?: Partial) { + const config: Config = { ...defaultConfig, ...providedConfig }; +// const defaultKeywords: string = Object.keys(config.types) +// .map(escapeRegExp) +// .join("|"); + // @ts-ignore + const Parser = this.Parser + console.log(Parser) + + const blockTokenizers = Parser.prototype.blockTokenizers + const blockMethods = Parser.prototype.blockMethods + console.log(blockMethods, blockTokenizers) + + + blockTokenizers.callout = tok +// console.log(blockTokenizers.blockquote.toString()) + var insertPoint = blockMethods.indexOf('fencedCode') + 1 + blockMethods.splice(insertPoint, 0, 'callout') + + // @ts-ignore + const Compiler = this.Compiler + + if (Compiler != null) { + const visitors = Compiler.prototype.visitors + if (visitors) { + visitors.callout = function (node: { keyword: string; title: string; }) { + var values = this.block(node).split('\n'); + var result = []; + var length = values.length; + var index = -1; + var value; + + while (++index < length) { + value = values[index]; + result[index] = (value ? ' ' : '') + value; + } + + return '> [!'+node.keyword+'] ' + node.title + '\n' + result.join('\n>'); + } + } + } +// return function (tree) { +// visit(tree, (node: Node, index, parent: Parent) => { +// // Filter required elems +// if (node.type !== "blockquote") return; + +// /** add breaks to text without needing spaces or escapes (turns enters into
) +// * code taken directly from remark-breaks, +// * see https://github.com/remarkjs/remark-breaks for more info on what this does. +// */ +// // visit(node, "text", (node: Text, index: number, parent: Parent) => { +// // const result = []; +// // let start = 0; + +// // find.lastIndex = 0; + +// // let match = find.exec(node.value); + +// // while (match) { +// // const position = match.index; + +// // if (start !== position) { +// // result.push({ +// // type: "text", +// // value: node.value.slice(start, position), +// // }); +// // } + +// // result.push({ type: "break" }); +// // start = position + match[0].length; +// // match = find.exec(node.value); +// // } + +// // if (result.length > 0 && parent && typeof index === "number") { +// // if (start < node.value.length) { +// // result.push({ type: "text", value: node.value.slice(start) }); +// // } + +// // parent.children.splice(index, 1, ...result); +// // return index + result.length; +// // } +// // }); + +// /** add classnames to headings within blockquotes, +// * mainly to identify when using other plugins that +// * might interfere. for eg, rehype-auto-link-headings. +// */ +// visit(node, "heading", (node) => { +// const heading = node as Heading; +// heading.data = { +// hProperties: { +// className: "blockquote-heading", +// }, +// }; +// }); + +// // wrap blockquote in a div +// const wrapper = { +// ...node, +// type: "element", +// tagName: "div", +// data: { +// hProperties: {}, +// }, +// children: [node], +// }; + +// parent.children.splice(Number(index), 1, wrapper); + +// const blockquote = wrapper.children[0] as Blockquote; + +// blockquote.data = { +// hProperties: { +// className: "blockquote", +// }, +// }; +// console.log(blockquote) + +// // check for callout syntax starts here +// if ( +// blockquote.children.length <= 0 || +// blockquote.children[0].type !== "paragraph" +// ) +// return; +// const paragraph = blockquote.children[0]; +// console.log(paragraph) + +// if ( +// paragraph.children.length <= 0 || +// paragraph.children[0].type !== "text" +// ) +// return; + +// const [t, ...rest] = paragraph.children; + +// const regex = new RegExp( +// `^\\[!(?(.*?))\\][\t\f ]?(?.*?)$`, +// "gi" +// ); +// const m = regex.exec(t.value); + +// // if no callout syntax, forget about it. +// if (!m) return; + +// const [key, title] = [m.groups?.keyword, m.groups?.title]; + +// // if there's nothing inside the brackets, is it really a callout ? +// if (!key) return; + +// const keyword = key.toLowerCase(); +// // const isOneOfKeywords: boolean = new RegExp(defaultKeywords).test( +// // keyword +// // ); + +// if (title) { +// const mdast = fromMarkdown(title.trim()).children[0]; +// if (mdast.type === "heading") { +// mdast.data = { +// ...mdast.data, +// hProperties: { +// className: "blockquote-heading", +// }, +// }; +// } +// blockquote.children.unshift(mdast as BlockContent); +// } else { +// t.value = +// typeof keyword.charAt(0) === "string" +// ? keyword.charAt(0).toUpperCase() + keyword.slice(1) +// : keyword; +// } + +// const entry: { [index: string]: string } = {}; + +// // if (isOneOfKeywords) { +// // if (typeof config?.types[keyword] === "string") { +// // const e = String(config?.types[keyword]); +// // Object.assign(entry, config?.types[e]); +// // } else { +// // Object.assign(entry, config?.types[keyword]); +// // } +// // } else { +// // Object.assign(entry, config?.types["note"]); +// // } + +// let parsedSvg; + +// if (entry && entry.svg) { +// parsedSvg = parse(entry.svg); +// } + +// // create icon and title node wrapped in div +// const titleNode: object = { +// type: "element", +// children: [ +// { +// type: "element", +// tagName: "span", +// data: { +// hName: "span", +// hProperties: { +// style: `color:${entry?.color}`, +// className: "callout-icon", +// }, +// hChildren: parsedSvg?.children ? parsedSvg.children : [], +// }, +// }, +// { +// type: "element", +// children: title ? [blockquote.children[0]] : [t], +// data: { +// hName: "strong", +// }, +// }, +// ], +// data: { +// ...blockquote.children[0]?.data, +// hProperties: { +// className: `${formatClassNameMap(config.classNameMaps.title)( +// keyword +// )} ${"note"}`, +// style: `background-color: ${entry?.color}1a;`, +// }, +// }, +// }; + +// // remove the callout paragraph from the content body +// if (title) { +// blockquote.children.shift(); +// } + +// if (rest.length > 0) { +// rest.shift(); +// paragraph.children = rest; +// } else { +// blockquote.children.shift(); +// } + +// // wrap blockquote content in div +// const contentNode: object = { +// type: "element", +// children: blockquote.children, +// data: { +// hProperties: { +// className: "callout-content", +// style: +// parent.type !== "root" +// ? `border-right:1px solid ${entry?.color}33; +// border-bottom:1px solid ${entry?.color}33;` +// : "", +// }, +// }, +// }; + +// if (blockquote.children.length > 0) +// blockquote.children = [contentNode] as BlockContent[]; +// blockquote.children.unshift(titleNode as BlockContent); + +// // Add classes for the callout block +// blockquote.data = config.dataMaps.block({ +// ...blockquote.data, +// hProperties: { +// className: formatClassNameMap(config.classNameMaps.block)( +// keyword.toLowerCase() +// ), +// style: `border-left-color:${entry?.color};`, +// }, +// }); +// }); +// }; +}; + +export default callouts; \ No newline at end of file diff --git a/packages/remark-callouts/src/tokeniseCallout.ts b/packages/remark-callouts/src/tokeniseCallout.ts new file mode 100644 index 00000000..92086c3f --- /dev/null +++ b/packages/remark-callouts/src/tokeniseCallout.ts @@ -0,0 +1,245 @@ +'use strict'; + +import trim from "trim"; + + +export default blockquote; + +var C_NEWLINE = '\n'; +var C_TAB = '\t'; +var C_SPACE = ' '; +var C_GT = '>'; +// TODO: +// - Grow/shrink support +// - Customise AST output + +/* Tokenise a blockquote. */ +function blockquote(eat: { (arg0: string): any; (arg0: string): any; now: any; }, value: string, silent: boolean) { + var self = this; + var offsets = self.offset; + var tokenizers = self.blockTokenizers; + var interruptors = [ + ['indentedCode', { commonmark: true }], + ['fencedCode', { commonmark: true }], + ['atxHeading', { commonmark: true }], + ['setextHeading', { commonmark: true }], + ['thematicBreak', { commonmark: true }], + ['html', { commonmark: true }], + ['list', { commonmark: true }], + ['definition', { commonmark: false }], + ['footnote', { commonmark: false }] + ]; + var now = eat.now(); + var currentLine = now.line; + var length = value.length; + var values = []; + var contents = []; + var indents = []; + var add; + var index = 0; + var character; + var rest; + var nextIndex; + var content; + var line; + var startIndex; + var prefixed; + var exit; + + while (index < length) { + character = value.charAt(index); + + if (character !== C_SPACE && character !== C_TAB) { + break; + } + + index++; + } + + if (value.charAt(index) !== C_GT) { + return; + } + + const regex = /^>\s*\[!(?<keyword>(.*?))\][\t\f ]?(?<title>.*?)$/i; + nextIndex = value.indexOf(C_NEWLINE, index); + content = value.slice(index, nextIndex); + const m = regex.exec(content); // value.slice(index) + if (!m) { + return; + } + if (!m.groups?.keyword) return; + + if (silent) { + return true; + } + + index = 0; + let titleLine = true + while (index < length) { + nextIndex = value.indexOf(C_NEWLINE, index); + startIndex = index; + prefixed = false; + + if (nextIndex === -1) { + nextIndex = length; + } + + while (index < length) { + character = value.charAt(index); + + if (character !== C_SPACE && character !== C_TAB) { + break; + } + + index++; + } + + if (value.charAt(index) === C_GT) { + index++; + prefixed = true; + + if (value.charAt(index) === C_SPACE) { + index++; + } + } else { + index = startIndex; + } + + // regex.lastIndex = index + + content = value.slice(index, nextIndex); + + if (!prefixed && !trim(content)) { + index = startIndex; + break; + } + + if (!prefixed) { + rest = value.slice(index); + + /* Check if the following code contains a possible + * block. */ + if (interrupt(interruptors, tokenizers, self, [eat, rest, true])) { + break; + } + } + + line = startIndex === index ? content : value.slice(startIndex, nextIndex); + + indents.push(index - startIndex); + values.push(line); + if (titleLine) { + titleLine = false + } else { + contents.push(content); + } + + index = nextIndex + 1; + } + + index = -1; + length = indents.length; + add = eat(values.join(C_NEWLINE)); + + while (++index < length) { + offsets[currentLine] = (offsets[currentLine] || 0) + indents[index]; + currentLine++; + } + + exit = self.enterBlock(); + const title = self.tokenizeInline(m.groups?.title, now); + contents = self.tokenizeBlock(contents.join(C_NEWLINE), now); + exit(); + console.log(title,) + return add({ + type: 'callout', + children: [{ + type: "heading", + children: title, + data: { hName: 'svelte:fragment', + hProperties: { + slot: "title" + } } + }, { + type: "block", + children: contents, + data: { hName: 'svelte:fragment', + hProperties: { + slot: "body" + } } + }], + keyword: m.groups?.keyword, + data: { + hName: 'Components.Callout', + hProperties: { + "calloutType": m.groups?.keyword + }, + } + }); + // return add({ + // type: 'callout', + // children: [{ + // type: "heading", + // children: title, + // data: { hName: 'div', + // hProperties: { + // className: "callout-title" + // } } + // }, { + // type: "block", + // children: contents, + // data: { hName: 'div', + // hProperties: { + // className: "callout-content" + // } } + // }], + // keyword: m.groups?.keyword, + // data: { + // hName: 'div', + // hProperties: { + // className: "callout", + // "data-callout": m.groups?.keyword + // }, + // } + // }); +} + +function interrupt(interruptors, tokenizers, ctx, params) { + var bools = ['pedantic', 'commonmark']; + var count = bools.length; + var length = interruptors.length; + var index = -1; + var interruptor; + var config; + var fn; + var offset; + var bool; + var ignore; + + while (++index < length) { + interruptor = interruptors[index]; + config = interruptor[1] || {}; + fn = interruptor[0]; + offset = -1; + ignore = false; + + while (++offset < count) { + bool = bools[offset]; + + if (config[bool] !== undefined && config[bool] !== ctx.options[bool]) { + ignore = true; + break; + } + } + + if (ignore) { + continue; + } + + if (tokenizers[fn].apply(ctx, params)) { + return true; + } + } + + return false; +} diff --git a/packages/remark-callouts/tsconfig.json b/packages/remark-callouts/tsconfig.json new file mode 100644 index 00000000..f6a4a048 --- /dev/null +++ b/packages/remark-callouts/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "esnext", + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "skipLibCheck": true, + "noImplicitAny": true, + "allowJs": true, + "noEmit": true, + "resolveJsonModule": true + } +} \ No newline at end of file diff --git a/packages/website/mdsvex.config.js b/packages/website/mdsvex.config.js index d1551fc9..dfa8731f 100644 --- a/packages/website/mdsvex.config.js +++ b/packages/website/mdsvex.config.js @@ -10,6 +10,7 @@ import remarkMath from "remark-math" // @ts-ignore import remarkAbbr from "remark-abbr" import remarkFootnotes from 'remark-footnotes' +import remarkCallouts from "remark-callouts"; import rehypeKatexSvelte from 'rehype-katex-svelte'; // import github from "remark-github"; @@ -343,6 +344,8 @@ const config = { remarkMath, remarkAbbr, [remarkFootnotes, { inlineNotes: true }], + remarkGfm, + [remarkCallouts, {}], [remarkWikiLink, { // @ts-ignore aliasDivider: "|", @@ -353,7 +356,6 @@ const config = { // wikiLinkClassName, // newClassName, }], - remarkGfm, // [citePlugin, { // syntax: { // // see micromark-extension-cite diff --git a/packages/website/package.json b/packages/website/package.json index abdf9ffc..ccea8ecf 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -33,6 +33,7 @@ "rehype-katex-svelte": "1.2", "rehype-slug": "^6.0.0", "remark-abbr": "^1.4.2", + "remark-callouts": "workspace:^", "remark-footnotes": "2", "remark-frontmatter": "^5.0.0", "remark-gfm": "^4.0.0", @@ -74,6 +75,7 @@ "@octokit/types": "^13.5.0", "@resvg/resvg-js": "^2.6.2", "@steeze-ui/svelte-icon": "^1.5.0", + "@tabler/icons-svelte": "^3.11.0", "@tusbar/cache-control": "^1.0.2", "@uiw/codemirror-theme-github": "^4.22.2", "Notes": "file:Notes-1.0.0.tgz", diff --git a/packages/website/src/lib/Callout.svelte b/packages/website/src/lib/Callout.svelte new file mode 100644 index 00000000..dcc51739 --- /dev/null +++ b/packages/website/src/lib/Callout.svelte @@ -0,0 +1,27 @@ +<script lang="ts"> + export let calloutType: string; + import { IconExclamationCircle } from "@tabler/icons-svelte"; +</script> + +<div class="callout" data-callout={calloutType}> + <div class="callout-title"> + {#if $$slots.icon} + <div class="callout-icon"><slot name="icon" /></div> + {:else} + <div class="callout-icon"><IconExclamationCircle /></div> + {/if} + <div class="callout-title-inner"> + <slot name="title" + >{calloutType.replace(/\w\S*/g, function (txt) { + return ( + txt.charAt(0).toUpperCase() + + txt.substring(1).toLowerCase() + ); + })}</slot + > + </div> + </div> + {#if $$slots.body} + <div class="callout-body"><slot name="body" /></div> + {/if} +</div> diff --git a/packages/website/src/lib/mdlayouts/default.svelte b/packages/website/src/lib/mdlayouts/default.svelte index 5e3b1ffd..22a0254e 100644 --- a/packages/website/src/lib/mdlayouts/default.svelte +++ b/packages/website/src/lib/mdlayouts/default.svelte @@ -1,6 +1,7 @@ <script context="module"> import img from "$lib/htmlComponents/img.svelte"; - export { img }; + import Callout from "$lib/Callout.svelte"; + export { img, Callout }; </script> <slot /> diff --git a/packages/website/src/lib/style/callout.css b/packages/website/src/lib/style/callout.css new file mode 100644 index 00000000..6d240e77 --- /dev/null +++ b/packages/website/src/lib/style/callout.css @@ -0,0 +1,194 @@ +:root { + --callout-bug: var(--color-red); + --callout-default: var(--color-blue); + --callout-error: var(--color-red); + --callout-example: var(--color-purple); + --callout-fail: var(--color-red); + --callout-important: var(--color-cyan); + --callout-info: var(--color-blue); + --callout-question: var(--color-orange); + --callout-success: var(--color-green); + --callout-summary: var(--color-cyan); + --callout-tip: var(--color-cyan); + --callout-todo: var(--color-blue); + --callout-warning: var(--color-orange); + --callout-quote: rgb(158, 158, 158); + + --callout-title-weight: bold; + + --callout-radius: var(--border-radius); + + --callout-border-opacity: 25%; + --callout-background-opacity: 10%; + --callout-content-padding: 0; + --callout-content-background: transparent; +} +.callout { + --callout-color: var(--callout-default); + /* --callout-icon: lucide-pencil; */ +} + +.callout[data-callout="abstract"], +.callout[data-callout="summary"], +.callout[data-callout="tldr"] { + --callout-color: var(--callout-summary); + /* --callout-icon: lucide-clipboard-list; */ +} + +.callout[data-callout="info"] { + --callout-color: var(--callout-info); + /* --callout-icon: lucide-info; */ +} + +.callout[data-callout="todo"] { + --callout-color: var(--callout-todo); + /* --callout-icon: lucide-check-circle-2; */ +} + +.callout[data-callout="important"] { + --callout-color: var(--callout-important); + /* --callout-icon: lucide-flame; */ +} + +.callout[data-callout="tip"], +.callout[data-callout="hint"] { + --callout-color: var(--callout-tip); + /* --callout-icon: lucide-flame; */ +} + +.callout[data-callout="success"], +.callout[data-callout="check"], +.callout[data-callout="done"] { + --callout-color: var(--callout-success); + /* --callout-icon: lucide-check; */ +} + +.callout[data-callout="question"], +.callout[data-callout="help"], +.callout[data-callout="faq"] { + --callout-color: var(--callout-question); + /* --callout-icon: help-circle; */ +} + +.callout[data-callout="warning"], +.callout[data-callout="caution"], +.callout[data-callout="attention"] { + --callout-color: var(--callout-warning); + /* --callout-icon: lucide-alert-triangle; */ +} + +.callout[data-callout="failure"], +.callout[data-callout="fail"], +.callout[data-callout="missing"] { + --callout-color: var(--callout-fail); + /* --callout-icon: lucide-x; */ +} + +.callout[data-callout="danger"], +.callout[data-callout="error"] { + --callout-color: var(--callout-error); + /* --callout-icon: lucide-zap; */ +} + +.callout[data-callout="bug"] { + --callout-color: var(--callout-bug); + /* --callout-icon: lucide-bug; */ +} + +.callout[data-callout="example"] { + --callout-color: var(--callout-example); + /* --callout-icon: lucide-list; */ +} + +.callout[data-callout="quote"], +.callout[data-callout="cite"] { + --callout-color: var(--callout-quote); + /* --callout-icon: quote-glyph; */ +} + +.callout { + overflow: hidden; + border-style: solid; + + border-color: color-mix(in srgb, var(--callout-color) var(--callout-border-opacity), transparent); + border-width: var(--callout-border-width); + border-radius: var(--callout-radius); + margin-block: 1em; + margin-inline: 0; + mix-blend-mode: var(--callout-blend-mode); + background-color: color-mix(in srgb, var(--callout-color) var(--callout-background-opacity), transparent); + padding: 0.75em; + padding-inline-start: 1.5em; + --callout-title-color: var(--callout-color); +} + +.callout.is-collapsible .callout-title { + cursor: var(--cursor); +} + +.callout-title { + padding: var(--callout-title-padding); + display: flex; + gap: calc(var(--spacing)/4); + font-size: var(--callout-title-size); + color: rgb(var(--callout-color)); + line-height: var(--line-height-tight); + align-items: flex-start; +} + +.callout-title-inner { + --font-weight: var(--callout-title-weight); + font-weight: var(--font-weight); + color: var(--callout-title-color); +} +/* .callout-title { + --font-weight: var(--callout-title-weight); + font-weight: var(--font-weight); + color: var(--callout-title-color); + padding: var(--callout-title-padding); + font-size: var(--callout-title-size); + line-height: var(--line-height-tight); +} */ + + +.callout-content { + overflow-block: auto; + padding: var(--callout-content-padding); + background-color: var(--callout-content-background); +} + +.callout-content .callout { + margin-block-start: 20px; +} + +.callout-icon { + flex: 0 0 auto; + display: flex; + align-items: center; +} + +.callout-icon .tabler-icon { + color: var(--callout-color); +} + +.callout-icon::after { + content: "\200B"; +} + +/* .callout-fold { + display: flex; + align-items: center; + padding-inline-end: var(--size-4-2); +} + +.callout-fold::after { + content: "\200B"; +} + +.callout-fold .svg-icon { + transition: transform 100ms ease-in-out; +} + +.callout-fold.is-collapsed .svg-icon { + transform: rotate(calc(var(--direction) * -1 * 90deg)); +} */ \ No newline at end of file diff --git a/packages/website/src/lib/styles.css b/packages/website/src/lib/styles.css index e84355f7..736a5f15 100644 --- a/packages/website/src/lib/styles.css +++ b/packages/website/src/lib/styles.css @@ -1,4 +1,5 @@ @import "./style/code.css"; +@import "./style/callout.css"; @import "./style/footnote.css"; :root { @@ -32,6 +33,15 @@ --code-background-color: #0d1117; --code-color: #fff; + --color-red: #e93147; + --color-orange: #ec7500; + --color-yellow: #e0ac00; + --color-green: #08b94e; + --color-cyan: #00bfbc; + --color-blue: #086ddd; + --color-purple: #7852ee; + --color-pink: #d53984; + scroll-behavior: smooth; } @@ -49,7 +59,16 @@ --input-color: #d8d8d8; --font-color: rgba(255, 255, 255, .87); --font-color-contrast: rgba(0, 0, 0, .87); - --font-color-secondary: rgba(255, 255, 255, .6) + --font-color-secondary: rgba(255, 255, 255, .6); + + --color-red: #fb464c; + --color-orange: #e9973f; + --color-yellow: #e0de71; + --color-green: #44cf6e; + --color-cyan: #53dfdd; + --color-blue: #027aff; + --color-purple: #a882ff; + --color-pink: #fa99cd; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 093d2a95..91bd8b71 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,6 +13,52 @@ importers: .: {} + packages/remark-callouts: + dependencies: + mdast-util-from-markdown: + specifier: ^1.3.1 + version: 1.3.1 + svg-parser: + specifier: ^2.0.4 + version: 2.0.4 + trim: + specifier: ^0.0.1 + version: 0.0.1 + unist-util-visit: + specifier: ^4.1.2 + version: 4.1.2 + devDependencies: + '@rollup/plugin-typescript': + specifier: ^11.1.6 + version: 11.1.6(rollup@4.18.0)(tslib@2.6.3)(typescript@5.4.5) + '@types/mdast': + specifier: ^4.0.4 + version: 4.0.4 + '@types/node': + specifier: ^20.14.2 + version: 20.14.2 + '@types/svg-parser': + specifier: ^2.0.6 + version: 2.0.6 + '@types/trim': + specifier: ^0.1.3 + version: 0.1.3 + '@types/unist': + specifier: ^3.0.2 + version: 3.0.2 + mdast: + specifier: ^3.0.0 + version: 3.0.0 + rollup: + specifier: ^4.18.0 + version: 4.18.0 + rollup-plugin-dts: + specifier: ^6.1.1 + version: 6.1.1(rollup@4.18.0)(typescript@5.4.5) + unified: + specifier: ^6.2.0 + version: 6.2.0 + packages/vite-plugin-thumbhash-svg: dependencies: '@napi-rs/canvas': @@ -79,6 +125,9 @@ importers: '@steeze-ui/svelte-icon': specifier: ^1.5.0 version: 1.5.0(svelte@4.2.18) + '@tabler/icons-svelte': + specifier: ^3.11.0 + version: 3.11.0(svelte@4.2.18) '@tusbar/cache-control': specifier: ^1.0.2 version: 1.0.2 @@ -194,6 +243,9 @@ importers: remark-abbr: specifier: ^1.4.2 version: 1.4.2 + remark-callouts: + specifier: workspace:^ + version: link:../remark-callouts remark-footnotes: specifier: '2' version: 2.0.0 @@ -1104,6 +1156,14 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 + '@tabler/icons-svelte@3.11.0': + resolution: {integrity: sha512-OPARGvWENXC/NHRlpMeCSadAb/yl0N4nCVz7VW/P/YWHXbP4ioCzBwkhl0Brl6OX8qzXMdHmW0+o8jbUJZeonA==} + peerDependencies: + svelte: '>=3 <6' + + '@tabler/icons@3.11.0': + resolution: {integrity: sha512-/vZinJNvCYhdAB+RUsyCpanSPuOEKHHIZi4Uu0Bw7ilewHnQhCWUPrT704uHCRli2ROl7spADPmWzAqOganA5A==} + '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -1156,6 +1216,9 @@ packages: '@types/jsonwebtoken@9.0.6': resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1192,6 +1255,12 @@ packages: '@types/sharedworker@0.0.115': resolution: {integrity: sha512-istxrCv9mbZQt7kXMVMsc4U+dbxG5y+ae5N+9f6pM9VOJmclF7FBWtTog9SMT16s1pZUTjga7ewaMVgqhDpTOg==} + '@types/svg-parser@2.0.6': + resolution: {integrity: sha512-xrXwOltwMcLrKy79rv4MoalnD82oYLyXAVeeSyrkvR7XdCH4i7YqLNQWxyZ8KPpawtQShiKOse+pmtLeSLtCfQ==} + + '@types/trim@0.1.3': + resolution: {integrity: sha512-rGfsELO03kkq7iFLktHIUjHGQ7JnyJqZ3ANeXTKCHrmYuF3Ie9EEMSqFL4AnsBxHlueBEXdWp6pzszxB+2sZxg==} + '@types/trouter@3.1.4': resolution: {integrity: sha512-4YIL/2AvvZqKBWenjvEpxpblT2KGO6793ipr5QS7/6DpQ3O3SwZGgNGWezxf3pzeYZc24a2pJIrR/+Jxh/wYNQ==} @@ -1212,7 +1281,7 @@ packages: '@codemirror/view': '>=6.0.0' Notes@file:packages/website/Notes-1.0.0.tgz: - resolution: {integrity: sha512-RsQlBhuuhSNo4O1g+6s8MnY6qIBzZXyee5c9rfLrj44boh6p4j19XosongeCs6YJ8j3boaza5BWUQY0+NrtGEA==, tarball: file:packages/website/Notes-1.0.0.tgz} + resolution: {integrity: sha512-8nqX3dpZX1ubD4HjFPkuBYV2afAhstbPnxB8g+cs1P3OLGfHzK/70vDwaC1AU4KwpRpJtC/V32RbrwW2V0C4kw==, tarball: file:packages/website/Notes-1.0.0.tgz} version: 1.0.0 acorn@8.12.0: @@ -1269,6 +1338,9 @@ packages: axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1511,6 +1583,10 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + direction@2.0.1: resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} hasBin: true @@ -1758,6 +1834,9 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} @@ -1793,6 +1872,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -1906,6 +1989,9 @@ packages: mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-from-markdown@2.0.1: resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} @@ -1936,9 +2022,16 @@ packages: mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast@3.0.0: + resolution: {integrity: sha512-xySmf8g4fPKMeC07jXGz971EkLbWAJ83s4US2Tj9lEdnZ142UP5grN73H1Xd3HzrdbU5o9GYYP/y8F9ZSwLE9g==} + deprecated: '`mdast` was renamed to `remark`' + mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} @@ -1954,6 +2047,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-core-commonmark@2.0.1: resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} @@ -1981,63 +2077,123 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-factory-destination@2.0.0: resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + micromark-factory-label@2.0.0: resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-space@2.0.0: resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-title@2.0.0: resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + micromark-factory-whitespace@2.0.0: resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-character@2.1.0: resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + micromark-util-chunked@2.0.0: resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-classify-character@2.0.0: resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + micromark-util-combine-extensions@2.0.0: resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + micromark-util-decode-numeric-character-reference@2.0.1: resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-decode-string@2.0.0: resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + micromark-util-encode@2.0.0: resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + micromark-util-html-tag-name@2.0.0: resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@2.0.0: resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@2.0.0: resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@2.0.0: resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + micromark-util-subtokenize@2.0.1: resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + micromark-util-symbol@2.0.0: resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + micromark-util-types@2.0.0: resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} @@ -2248,6 +2404,10 @@ packages: remark-wiki-link@0.0.4: resolution: {integrity: sha512-Mmd5TspUWTnt+gafIdUtczHsjZY21XYEI9BeR6HMLKv/pUiNa5tDSWSjiPMvx07DlD4OmSM+tIhhk7SQXV3LrA==} + replace-ext@1.0.0: + resolution: {integrity: sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==} + engines: {node: '>= 0.10'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -2493,6 +2653,9 @@ packages: peerDependencies: '@sveltejs/kit': '>=1.5.0 <3.0.0' + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + svgo@3.3.2: resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} engines: {node: '>=14.0.0'} @@ -2609,6 +2772,13 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + trim@0.0.1: + resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} + deprecated: Use String.prototype.trim() instead + + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -2649,6 +2819,9 @@ packages: unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@6.2.0: + resolution: {integrity: sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==} + unist-util-is@4.1.0: resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} @@ -2661,6 +2834,9 @@ packages: unist-util-map@1.0.5: resolution: {integrity: sha512-dFil/AN6vqhnQWNCZk0GF/G3+Q5YwsB+PqjnzvpO2wzdRtUJ1E8PN+XRE/PRr/G3FzKjRTJU0haqE0Ekl+O3Ag==} + unist-util-stringify-position@1.1.2: + resolution: {integrity: sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==} + unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} @@ -2703,9 +2879,17 @@ packages: universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + vfile-location@4.1.0: resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + vfile-message@1.1.1: + resolution: {integrity: sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==} + vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} @@ -2715,6 +2899,9 @@ packages: vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile@2.3.0: + resolution: {integrity: sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==} + vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} @@ -2803,6 +2990,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + x-is-string@0.1.0: + resolution: {integrity: sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==} + xmlbuilder2@3.1.1: resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} engines: {node: '>=12.0'} @@ -3579,6 +3769,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@tabler/icons-svelte@3.11.0(svelte@4.2.18)': + dependencies: + '@tabler/icons': 3.11.0 + svelte: 4.2.18 + + '@tabler/icons@3.11.0': {} + '@trysound/sax@0.2.0': {} '@tusbar/cache-control@1.0.2': {} @@ -3636,6 +3833,10 @@ snapshots: dependencies: '@types/node': 20.14.2 + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.10 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.2 @@ -3676,6 +3877,10 @@ snapshots: '@types/sharedworker@0.0.115': {} + '@types/svg-parser@2.0.6': {} + + '@types/trim@0.1.3': {} + '@types/trouter@3.1.4': {} '@types/unist@2.0.10': {} @@ -3742,6 +3947,8 @@ snapshots: dependencies: dequal: 2.0.3 + bail@1.0.5: {} + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -3972,6 +4179,8 @@ snapshots: dependencies: dequal: 2.0.3 + diff@5.2.0: {} + direction@2.0.1: {} directory-tree@3.5.1: @@ -4257,6 +4466,8 @@ snapshots: dependencies: binary-extensions: 2.3.0 + is-buffer@1.1.6: {} + is-buffer@2.0.5: {} is-builtin-module@3.2.1: @@ -4281,6 +4492,8 @@ snapshots: is-number@7.0.0: {} + is-plain-obj@1.1.0: {} + is-plain-obj@3.0.0: {} is-plain-obj@4.1.0: {} @@ -4395,6 +4608,23 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + mdast-util-from-markdown@2.0.1: dependencies: '@types/mdast': 4.0.4 @@ -4496,10 +4726,16 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 + mdast@3.0.0: {} + mdn-data@2.0.28: {} mdn-data@2.0.30: {} @@ -4514,6 +4750,25 @@ snapshots: merge2@1.4.1: {} + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-core-commonmark@2.0.1: dependencies: decode-named-character-reference: 1.0.2 @@ -4598,12 +4853,25 @@ snapshots: micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-destination@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-factory-label@2.0.0: dependencies: devlop: 1.1.0 @@ -4611,11 +4879,23 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + micromark-factory-space@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-types: 2.0.0 + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-title@2.0.0: dependencies: micromark-factory-space: 2.0.0 @@ -4623,6 +4903,13 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-whitespace@2.0.0: dependencies: micromark-factory-space: 2.0.0 @@ -4630,30 +4917,61 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-character@2.1.0: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-chunked@2.0.0: dependencies: micromark-util-symbol: 2.0.0 + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-classify-character@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-combine-extensions@2.0.0: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-decode-numeric-character-reference@2.0.1: dependencies: micromark-util-symbol: 2.0.0 + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-decode-string@2.0.0: dependencies: decode-named-character-reference: 1.0.2 @@ -4661,24 +4979,49 @@ snapshots: micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 + micromark-util-encode@1.1.0: {} + micromark-util-encode@2.0.0: {} + micromark-util-html-tag-name@1.2.0: {} + micromark-util-html-tag-name@2.0.0: {} + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-normalize-identifier@2.0.0: dependencies: micromark-util-symbol: 2.0.0 + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + micromark-util-resolve-all@2.0.0: dependencies: micromark-util-types: 2.0.0 + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-sanitize-uri@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-util-subtokenize@2.0.1: dependencies: devlop: 1.1.0 @@ -4686,10 +5029,36 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-symbol@1.1.0: {} + micromark-util-symbol@2.0.0: {} + micromark-util-types@1.1.0: {} + micromark-util-types@2.0.0: {} + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.5 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + micromark@4.0.0: dependencies: '@types/debug': 4.1.12 @@ -4951,6 +5320,8 @@ snapshots: '@babel/runtime': 7.24.7 unist-util-map: 1.0.5 + replace-ext@1.0.0: {} + require-directory@2.1.1: {} resolve-from@4.0.0: {} @@ -5238,6 +5609,8 @@ snapshots: '@sveltejs/kit': 2.5.16(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.1(@types/node@20.14.2)(terser@5.31.1)))(svelte@4.2.18)(vite@5.3.1(@types/node@20.14.2)(terser@5.31.1)) html-minifier-terser: 7.2.0 + svg-parser@2.0.4: {} + svgo@3.3.2: dependencies: '@trysound/sax': 0.2.0 @@ -5336,6 +5709,10 @@ snapshots: totalist@3.0.1: {} + trim@0.0.1: {} + + trough@1.0.5: {} + trough@2.2.0: {} ts-json-schema-generator@1.5.1: @@ -5385,6 +5762,16 @@ snapshots: trough: 2.2.0 vfile: 6.0.1 + unified@6.2.0: + dependencies: + '@types/unist': 2.0.10 + bail: 1.0.5 + extend: 3.0.2 + is-plain-obj: 1.1.0 + trough: 1.0.5 + vfile: 2.3.0 + x-is-string: 0.1.0 + unist-util-is@4.1.0: {} unist-util-is@5.2.1: @@ -5399,6 +5786,8 @@ snapshots: dependencies: object-assign: 4.1.1 + unist-util-stringify-position@1.1.2: {} + unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.10 @@ -5468,11 +5857,22 @@ snapshots: universal-user-agent@6.0.1: {} + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + vfile-location@4.1.0: dependencies: '@types/unist': 2.0.10 vfile: 5.3.7 + vfile-message@1.1.1: + dependencies: + unist-util-stringify-position: 1.1.2 + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.10 @@ -5488,6 +5888,13 @@ snapshots: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 + vfile@2.3.0: + dependencies: + is-buffer: 1.1.6 + replace-ext: 1.0.0 + unist-util-stringify-position: 1.1.2 + vfile-message: 1.1.1 + vfile@5.3.7: dependencies: '@types/unist': 2.0.10 @@ -5568,6 +5975,8 @@ snapshots: wrappy@1.0.2: {} + x-is-string@0.1.0: {} + xmlbuilder2@3.1.1: dependencies: '@oozcitak/dom': 1.15.10