diff --git a/doc/docs/components/show/code/basic-usage.tsx b/doc/docs/components/show/code/basic-usage.tsx
index 5842e49..1ecccc9 100644
--- a/doc/docs/components/show/code/basic-usage.tsx
+++ b/doc/docs/components/show/code/basic-usage.tsx
@@ -2,10 +2,11 @@ import React from 'react';
import {Code, CodeFile} from '@qwqui/core';
export default function App(){
+ const codes = Array.from({length:100}).fill('console.log("aaa");').join('\n');
return (
-
-
+
+
)
}
\ No newline at end of file
diff --git a/packages/components/code/package.json b/packages/components/code/package.json
index 5006ebc..d517086 100644
--- a/packages/components/code/package.json
+++ b/packages/components/code/package.json
@@ -28,5 +28,8 @@
},
"devDependencies": {
"@qwqui/tools": "workspace:^"
+ },
+ "dependencies": {
+ "shiki": "^1.22.0"
}
}
\ No newline at end of file
diff --git a/packages/components/code/src/code-body.tsx b/packages/components/code/src/code-body.tsx
new file mode 100644
index 0000000..c01d191
--- /dev/null
+++ b/packages/components/code/src/code-body.tsx
@@ -0,0 +1,40 @@
+import { useContext, useEffect, useMemo, useState } from "react"
+import { createHighlighter } from 'shiki';
+import { CodeContext, CodeContextType } from "./code-context"
+import style from './styles/code-body.module.scss';
+import './styles/hack.css';
+import {darkTheme} from './dark-theme'
+
+export const CodeBody = () => {
+ const {activeCode,codeFiles, cache} = useContext(CodeContext);
+ const [code, setCode] = useState('');
+ const [codeLanguage, setCodeLanguage] = useState('');
+ useEffect(()=>{
+ const [codeFile] = codeFiles.filter((file) => file.name === activeCode);
+ if (!codeFile){
+ return;
+ }
+ setCode(codeFile.code);
+ setCodeLanguage(codeFile.language);
+ }, [activeCode, codeFiles]);
+ const [html, setHTML] = useState('');
+ useMemo(async ()=>{
+ if (cache.has(code)) {
+ return cache.get(code);
+ }
+ const highLighter = await createHighlighter({
+ langs: [codeLanguage],
+ themes: []
+ });
+ await highLighter.loadTheme(darkTheme as unknown as Record);
+ const html = highLighter.codeToHtml(code, {
+ lang: codeLanguage,
+ theme: 'dark-theme'
+ })
+ setHTML(html);
+ cache.set(code, html);
+ }, [code, codeLanguage, cache]);
+ return (
+
+ )
+}
diff --git a/packages/components/code/src/code-context.ts b/packages/components/code/src/code-context.ts
index 07b5a5a..3282e29 100644
--- a/packages/components/code/src/code-context.ts
+++ b/packages/components/code/src/code-context.ts
@@ -14,5 +14,6 @@ export type CodeContextType = {
prevX: number;
setPrevX: React.Dispatch>;
prevWidth: number;
- setPrevWidth: React.Dispatch>
+ setPrevWidth: React.Dispatch>;
+ cache: Map;
}
\ No newline at end of file
diff --git a/packages/components/code/src/code-file.tsx b/packages/components/code/src/code-file.tsx
index 7f4c542..655919c 100644
--- a/packages/components/code/src/code-file.tsx
+++ b/packages/components/code/src/code-file.tsx
@@ -11,15 +11,15 @@ const hasCode = (name: string, code: string, codeFiles: CodeFileProps[]) => {
export const CodeFile = factory((props) => {
const {codeFiles, setCodeFiles} = useContext(CodeContext);
- const {name, code} = props;
+ const {name, code, language} = props;
useEffect(()=>{
if (!hasCode(name, code, codeFiles)){
setCodeFiles([
...codeFiles,
- {name, code}
+ {name, code, language}
])
}
- }, [name, code, codeFiles, setCodeFiles])
+ }, [name, code, codeFiles, language, setCodeFiles])
return (
<>>
)
diff --git a/packages/components/code/src/code.tsx b/packages/components/code/src/code.tsx
index 880686d..6427eae 100644
--- a/packages/components/code/src/code.tsx
+++ b/packages/components/code/src/code.tsx
@@ -4,6 +4,7 @@ import { CodeFileProps, CodeWrapper } from './code.types';
import { CodeHeader } from './code-header';
import { useEffect, useState } from 'react';
import style from './styles/code-wrapper.module.scss';
+import { CodeBody } from './code-body';
export const Code = factory((props)=>{
const [codeFiles, setCodeFiles] = useState([]);
@@ -12,6 +13,7 @@ export const Code = factory((props)=>{
const [width, setWidth] = useState(72);
const [prevX,setPrevX] = useState();
const [prevWidth, setPrevWidth] = useState();
+ const cache = new Map();
useEffect(()=>{
if (codeFiles[0]){
setActiveCode(codeFiles[0].name);
@@ -30,10 +32,12 @@ export const Code = factory((props)=>{
prevX,
setPrevX,
prevWidth,
- setPrevWidth
+ setPrevWidth,
+ cache
}}>
+
{props.children}
diff --git a/packages/components/code/src/code.types.ts b/packages/components/code/src/code.types.ts
index 01b63fe..aca9472 100644
--- a/packages/components/code/src/code.types.ts
+++ b/packages/components/code/src/code.types.ts
@@ -21,13 +21,14 @@ export interface CodeWrapper {
showTrafficLight: boolean;
logo: React.ReactNode;
isColored: boolean;
- children?: React.ReactDOM
+ children?: React.ReactNode
}
export interface CodeFileProps {
name: string;
code: string;
icon?: React.ReactNode;
+ language: string;
}
export interface CodeHeaderProps {
diff --git a/packages/components/code/src/dark-theme.ts b/packages/components/code/src/dark-theme.ts
new file mode 100644
index 0000000..7e14de5
--- /dev/null
+++ b/packages/components/code/src/dark-theme.ts
@@ -0,0 +1,584 @@
+export const darkTheme = {
+ "colors": {
+ "actionBar.toggledBackground": "#383a49",
+ "activityBarBadge.background": "#007ACC",
+ "checkbox.border": "#6B6B6B",
+ "editor.background": "#191919",
+ "editor.foreground": "#D4D4D4",
+ "editor.inactiveSelectionBackground": "#3A3D41",
+ "editor.selectionHighlightBackground": "#ADD6FF26",
+ "editorIndentGuide.activeBackground": "#707070",
+ "editorIndentGuide.background": "#404040",
+ "input.placeholderForeground": "#A6A6A6",
+ "list.activeSelectionIconForeground": "#FFF",
+ "list.dropBackground": "#383B3D",
+ "menu.background": "#252526",
+ "menu.border": "#454545",
+ "menu.foreground": "#CCCCCC",
+ "menu.separatorBackground": "#454545",
+ "ports.iconRunningProcessForeground": "#369432",
+ "sideBarSectionHeader.background": "#0000",
+ "sideBarSectionHeader.border": "#ccc3",
+ "sideBarTitle.foreground": "#BBBBBB",
+ "statusBarItem.remoteBackground": "#16825D",
+ "statusBarItem.remoteForeground": "#FFF",
+ "tab.lastPinnedBorder": "#ccc3",
+ "terminal.inactiveSelectionBackground": "#3A3D41",
+ "widget.border": "#303031"
+ },
+ "displayName": "Dark Plus",
+ "name": "dark-theme",
+ "semanticHighlighting": true,
+ "semanticTokenColors": {
+ "customLiteral": "#DCDCAA",
+ "newOperator": "#C586C0",
+ "numberLiteral": "#b5cea8",
+ "stringLiteral": "#ce9178"
+ },
+ "tokenColors": [
+ {
+ "scope": [
+ "meta.embedded",
+ "source.groovy.embedded",
+ "string meta.image.inline.markdown",
+ "variable.legacy.builtin.python"
+ ],
+ "settings": {
+ "foreground": "#D4D4D4"
+ }
+ },
+ {
+ "scope": "emphasis",
+ "settings": {
+ "fontStyle": "italic"
+ }
+ },
+ {
+ "scope": "strong",
+ "settings": {
+ "fontStyle": "bold"
+ }
+ },
+ {
+ "scope": "header",
+ "settings": {
+ "foreground": "#000080"
+ }
+ },
+ {
+ "scope": "comment",
+ "settings": {
+ "foreground": "#6A9955"
+ }
+ },
+ {
+ "scope": "constant.language",
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": [
+ "constant.numeric",
+ "variable.other.enummember",
+ "keyword.operator.plus.exponent",
+ "keyword.operator.minus.exponent"
+ ],
+ "settings": {
+ "foreground": "#b5cea8"
+ }
+ },
+ {
+ "scope": "constant.regexp",
+ "settings": {
+ "foreground": "#646695"
+ }
+ },
+ {
+ "scope": "entity.name.tag",
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "entity.name.tag.css",
+ "settings": {
+ "foreground": "#d7ba7d"
+ }
+ },
+ {
+ "scope": "entity.other.attribute-name",
+ "settings": {
+ "foreground": "#9cdcfe"
+ }
+ },
+ {
+ "scope": [
+ "entity.other.attribute-name.class.css",
+ "entity.other.attribute-name.class.mixin.css",
+ "entity.other.attribute-name.id.css",
+ "entity.other.attribute-name.parent-selector.css",
+ "entity.other.attribute-name.pseudo-class.css",
+ "entity.other.attribute-name.pseudo-element.css",
+ "source.css.less entity.other.attribute-name.id",
+ "entity.other.attribute-name.scss"
+ ],
+ "settings": {
+ "foreground": "#d7ba7d"
+ }
+ },
+ {
+ "scope": "invalid",
+ "settings": {
+ "foreground": "#f44747"
+ }
+ },
+ {
+ "scope": "markup.underline",
+ "settings": {
+ "fontStyle": "underline"
+ }
+ },
+ {
+ "scope": "markup.bold",
+ "settings": {
+ "fontStyle": "bold",
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "markup.heading",
+ "settings": {
+ "fontStyle": "bold",
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "markup.italic",
+ "settings": {
+ "fontStyle": "italic"
+ }
+ },
+ {
+ "scope": "markup.strikethrough",
+ "settings": {
+ "fontStyle": "strikethrough"
+ }
+ },
+ {
+ "scope": "markup.inserted",
+ "settings": {
+ "foreground": "#b5cea8"
+ }
+ },
+ {
+ "scope": "markup.deleted",
+ "settings": {
+ "foreground": "#ce9178"
+ }
+ },
+ {
+ "scope": "markup.changed",
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "punctuation.definition.quote.begin.markdown",
+ "settings": {
+ "foreground": "#6A9955"
+ }
+ },
+ {
+ "scope": "punctuation.definition.list.begin.markdown",
+ "settings": {
+ "foreground": "#6796e6"
+ }
+ },
+ {
+ "scope": "markup.inline.raw",
+ "settings": {
+ "foreground": "#ce9178"
+ }
+ },
+ {
+ "scope": "punctuation.definition.tag",
+ "settings": {
+ "foreground": "#808080"
+ }
+ },
+ {
+ "scope": [
+ "meta.preprocessor",
+ "entity.name.function.preprocessor"
+ ],
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "meta.preprocessor.string",
+ "settings": {
+ "foreground": "#ce9178"
+ }
+ },
+ {
+ "scope": "meta.preprocessor.numeric",
+ "settings": {
+ "foreground": "#b5cea8"
+ }
+ },
+ {
+ "scope": "meta.structure.dictionary.key.python",
+ "settings": {
+ "foreground": "#9cdcfe"
+ }
+ },
+ {
+ "scope": "meta.diff.header",
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "storage",
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "storage.type",
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": [
+ "storage.modifier",
+ "keyword.operator.noexcept"
+ ],
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": [
+ "string",
+ "meta.embedded.assembly"
+ ],
+ "settings": {
+ "foreground": "#ce9178"
+ }
+ },
+ {
+ "scope": "string.tag",
+ "settings": {
+ "foreground": "#ce9178"
+ }
+ },
+ {
+ "scope": "string.value",
+ "settings": {
+ "foreground": "#ce9178"
+ }
+ },
+ {
+ "scope": "string.regexp",
+ "settings": {
+ "foreground": "#d16969"
+ }
+ },
+ {
+ "scope": [
+ "punctuation.definition.template-expression.begin",
+ "punctuation.definition.template-expression.end",
+ "punctuation.section.embedded"
+ ],
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": [
+ "meta.template.expression"
+ ],
+ "settings": {
+ "foreground": "#d4d4d4"
+ }
+ },
+ {
+ "scope": [
+ "support.type.vendored.property-name",
+ "support.type.property-name",
+ "variable.css",
+ "variable.scss",
+ "variable.other.less",
+ "source.coffee.embedded"
+ ],
+ "settings": {
+ "foreground": "#9cdcfe"
+ }
+ },
+ {
+ "scope": "keyword",
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "keyword.control",
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "keyword.operator",
+ "settings": {
+ "foreground": "#d4d4d4"
+ }
+ },
+ {
+ "scope": [
+ "keyword.operator.new",
+ "keyword.operator.expression",
+ "keyword.operator.cast",
+ "keyword.operator.sizeof",
+ "keyword.operator.alignof",
+ "keyword.operator.typeid",
+ "keyword.operator.alignas",
+ "keyword.operator.instanceof",
+ "keyword.operator.logical.python",
+ "keyword.operator.wordlike"
+ ],
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "keyword.other.unit",
+ "settings": {
+ "foreground": "#b5cea8"
+ }
+ },
+ {
+ "scope": [
+ "punctuation.section.embedded.begin.php",
+ "punctuation.section.embedded.end.php"
+ ],
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "support.function.git-rebase",
+ "settings": {
+ "foreground": "#9cdcfe"
+ }
+ },
+ {
+ "scope": "constant.sha.git-rebase",
+ "settings": {
+ "foreground": "#b5cea8"
+ }
+ },
+ {
+ "scope": [
+ "storage.modifier.import.java",
+ "variable.language.wildcard.java",
+ "storage.modifier.package.java"
+ ],
+ "settings": {
+ "foreground": "#d4d4d4"
+ }
+ },
+ {
+ "scope": "variable.language",
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": [
+ "entity.name.function",
+ "support.function",
+ "support.constant.handlebars",
+ "source.powershell variable.other.member",
+ "entity.name.operator.custom-literal"
+ ],
+ "settings": {
+ "foreground": "#DCDCAA"
+ }
+ },
+ {
+ "scope": [
+ "support.class",
+ "support.type",
+ "entity.name.type",
+ "entity.name.namespace",
+ "entity.other.attribute",
+ "entity.name.scope-resolution",
+ "entity.name.class",
+ "storage.type.numeric.go",
+ "storage.type.byte.go",
+ "storage.type.boolean.go",
+ "storage.type.string.go",
+ "storage.type.uintptr.go",
+ "storage.type.error.go",
+ "storage.type.rune.go",
+ "storage.type.cs",
+ "storage.type.generic.cs",
+ "storage.type.modifier.cs",
+ "storage.type.variable.cs",
+ "storage.type.annotation.java",
+ "storage.type.generic.java",
+ "storage.type.java",
+ "storage.type.object.array.java",
+ "storage.type.primitive.array.java",
+ "storage.type.primitive.java",
+ "storage.type.token.java",
+ "storage.type.groovy",
+ "storage.type.annotation.groovy",
+ "storage.type.parameters.groovy",
+ "storage.type.generic.groovy",
+ "storage.type.object.array.groovy",
+ "storage.type.primitive.array.groovy",
+ "storage.type.primitive.groovy"
+ ],
+ "settings": {
+ "foreground": "#4EC9B0"
+ }
+ },
+ {
+ "scope": [
+ "meta.type.cast.expr",
+ "meta.type.new.expr",
+ "support.constant.math",
+ "support.constant.dom",
+ "support.constant.json",
+ "entity.other.inherited-class"
+ ],
+ "settings": {
+ "foreground": "#4EC9B0"
+ }
+ },
+ {
+ "scope": [
+ "keyword.control",
+ "source.cpp keyword.operator.new",
+ "keyword.operator.delete",
+ "keyword.other.using",
+ "keyword.other.directive.using",
+ "keyword.other.operator",
+ "entity.name.operator"
+ ],
+ "settings": {
+ "foreground": "#C586C0"
+ }
+ },
+ {
+ "scope": [
+ "variable",
+ "meta.definition.variable.name",
+ "support.variable",
+ "entity.name.variable",
+ "constant.other.placeholder"
+ ],
+ "settings": {
+ "foreground": "#9CDCFE"
+ }
+ },
+ {
+ "scope": [
+ "variable.other.constant",
+ "variable.other.enummember"
+ ],
+ "settings": {
+ "foreground": "#4FC1FF"
+ }
+ },
+ {
+ "scope": [
+ "meta.object-literal.key"
+ ],
+ "settings": {
+ "foreground": "#9CDCFE"
+ }
+ },
+ {
+ "scope": [
+ "support.constant.property-value",
+ "support.constant.font-name",
+ "support.constant.media-type",
+ "support.constant.media",
+ "constant.other.color.rgb-value",
+ "constant.other.rgb-value",
+ "support.constant.color"
+ ],
+ "settings": {
+ "foreground": "#CE9178"
+ }
+ },
+ {
+ "scope": [
+ "punctuation.definition.group.regexp",
+ "punctuation.definition.group.assertion.regexp",
+ "punctuation.definition.character-class.regexp",
+ "punctuation.character.set.begin.regexp",
+ "punctuation.character.set.end.regexp",
+ "keyword.operator.negation.regexp",
+ "support.other.parenthesis.regexp"
+ ],
+ "settings": {
+ "foreground": "#CE9178"
+ }
+ },
+ {
+ "scope": [
+ "constant.character.character-class.regexp",
+ "constant.other.character-class.set.regexp",
+ "constant.other.character-class.regexp",
+ "constant.character.set.regexp"
+ ],
+ "settings": {
+ "foreground": "#d16969"
+ }
+ },
+ {
+ "scope": [
+ "keyword.operator.or.regexp",
+ "keyword.control.anchor.regexp"
+ ],
+ "settings": {
+ "foreground": "#DCDCAA"
+ }
+ },
+ {
+ "scope": "keyword.operator.quantifier.regexp",
+ "settings": {
+ "foreground": "#d7ba7d"
+ }
+ },
+ {
+ "scope": [
+ "constant.character",
+ "constant.other.option"
+ ],
+ "settings": {
+ "foreground": "#569cd6"
+ }
+ },
+ {
+ "scope": "constant.character.escape",
+ "settings": {
+ "foreground": "#d7ba7d"
+ }
+ },
+ {
+ "scope": "entity.name.label",
+ "settings": {
+ "foreground": "#C8C8C8"
+ }
+ }
+ ],
+ "type": "dark"
+};
\ No newline at end of file
diff --git a/packages/components/code/src/styles/code-body.module.scss b/packages/components/code/src/styles/code-body.module.scss
new file mode 100644
index 0000000..38f7220
--- /dev/null
+++ b/packages/components/code/src/styles/code-body.module.scss
@@ -0,0 +1,6 @@
+.root {
+ width: 100%;
+ padding: 11px 12px;
+ font-family: 'Inter';
+ font-weight: regular;
+}
\ No newline at end of file
diff --git a/packages/components/code/src/styles/hack.css b/packages/components/code/src/styles/hack.css
new file mode 100644
index 0000000..cde281c
--- /dev/null
+++ b/packages/components/code/src/styles/hack.css
@@ -0,0 +1,14 @@
+code {
+ counter-reset: step;
+ counter-increment: step 0;
+}
+
+.line::before {
+ content: counter(step);
+ counter-increment: step;
+ display: inline-block;
+ color: #fff;
+ margin-right: 8px;
+ text-align: right;
+ min-width: 1.5rem;
+}
\ No newline at end of file
diff --git a/packages/components/index.ts b/packages/components/index.ts
index 0591f49..7932d64 100644
--- a/packages/components/index.ts
+++ b/packages/components/index.ts
@@ -4,6 +4,7 @@ import './flex/src/flex.module.scss'
import './group/src/group.module.scss'
import './ripple/src/ripple.module.scss'
import './stack/src/stack.module.scss'
+import './code/src/styles/code-body.module.scss'
import './code/src/styles/code-wrapper.module.scss'
import './code/src/styles/header.module.scss'
export * from './button/index.ts'
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 391f950..0245e6c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -194,6 +194,13 @@ importers:
version: 18.3.1
packages/components/code:
+ dependencies:
+ react:
+ specifier: 18.3.1
+ version: 18.3.1
+ shiki:
+ specifier: ^1.22.0
+ version: 1.22.0
devDependencies:
'@qwqui/tools':
specifier: workspace:^
@@ -1304,6 +1311,21 @@ packages:
'@selderee/plugin-htmlparser2@0.11.0':
resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==}
+ '@shikijs/core@1.22.0':
+ resolution: {integrity: sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==}
+
+ '@shikijs/engine-javascript@1.22.0':
+ resolution: {integrity: sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==}
+
+ '@shikijs/engine-oniguruma@1.22.0':
+ resolution: {integrity: sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==}
+
+ '@shikijs/types@1.22.0':
+ resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==}
+
+ '@shikijs/vscode-textmate@9.3.0':
+ resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==}
+
'@sinclair/typebox@0.27.8':
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
@@ -1499,6 +1521,9 @@ packages:
'@types/mdast@3.0.15':
resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
'@types/mdx@2.0.13':
resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
@@ -1610,6 +1635,9 @@ packages:
resolution: {integrity: sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@ungap/structured-clone@1.2.0':
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+
'@webassemblyjs/ast@1.12.1':
resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==}
@@ -2750,12 +2778,18 @@ packages:
hast-util-to-html@8.0.4:
resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==}
+ hast-util-to-html@9.0.3:
+ resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==}
+
hast-util-to-parse5@7.1.0:
resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==}
hast-util-whitespace@2.0.1:
resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
hastscript@6.0.0:
resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
@@ -2799,6 +2833,9 @@ packages:
html-void-elements@2.0.1:
resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
htmlparser2@6.1.0:
resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
@@ -3496,6 +3533,9 @@ packages:
mdast-util-to-hast@12.3.0:
resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==}
+ mdast-util-to-hast@13.2.0:
+ resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
+
mdast-util-to-markdown@1.5.0:
resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==}
@@ -3572,6 +3612,9 @@ packages:
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==}
@@ -3590,6 +3633,9 @@ packages:
micromark-util-encode@1.1.0:
resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
+ micromark-util-encode@2.0.0:
+ resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+
micromark-util-events-to-acorn@1.2.3:
resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==}
@@ -3605,15 +3651,24 @@ packages:
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-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==}
@@ -3760,6 +3815,9 @@ packages:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
+ oniguruma-to-js@0.4.3:
+ resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==}
+
optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
@@ -4062,6 +4120,9 @@ packages:
regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+ regex@4.3.3:
+ resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==}
+
regexp.prototype.flags@1.5.2:
resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
engines: {node: '>= 0.4'}
@@ -4430,6 +4491,9 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
+ shiki@1.22.0:
+ resolution: {integrity: sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==}
+
side-channel@1.0.6:
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
engines: {node: '>= 0.4'}
@@ -4819,12 +4883,18 @@ packages:
unist-util-is@5.2.1:
resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==}
+ unist-util-is@6.0.0:
+ resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+
unist-util-position-from-estree@1.1.2:
resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==}
unist-util-position@4.0.4:
resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
unist-util-remove-position@4.0.2:
resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==}
@@ -4840,9 +4910,15 @@ packages:
unist-util-visit-parents@5.1.3:
resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==}
+ unist-util-visit-parents@6.0.1:
+ resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
unist-util-visit@4.1.2:
resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==}
+ unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
universalify@0.1.2:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
@@ -6527,6 +6603,33 @@ snapshots:
domhandler: 5.0.3
selderee: 0.11.0
+ '@shikijs/core@1.22.0':
+ dependencies:
+ '@shikijs/engine-javascript': 1.22.0
+ '@shikijs/engine-oniguruma': 1.22.0
+ '@shikijs/types': 1.22.0
+ '@shikijs/vscode-textmate': 9.3.0
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.3
+
+ '@shikijs/engine-javascript@1.22.0':
+ dependencies:
+ '@shikijs/types': 1.22.0
+ '@shikijs/vscode-textmate': 9.3.0
+ oniguruma-to-js: 0.4.3
+
+ '@shikijs/engine-oniguruma@1.22.0':
+ dependencies:
+ '@shikijs/types': 1.22.0
+ '@shikijs/vscode-textmate': 9.3.0
+
+ '@shikijs/types@1.22.0':
+ dependencies:
+ '@shikijs/vscode-textmate': 9.3.0
+ '@types/hast': 3.0.4
+
+ '@shikijs/vscode-textmate@9.3.0': {}
+
'@sinclair/typebox@0.27.8': {}
'@sinonjs/commons@3.0.1':
@@ -6729,6 +6832,10 @@ snapshots:
dependencies:
'@types/unist': 2.0.11
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
'@types/mdx@2.0.13': {}
'@types/ms@0.7.34': {}
@@ -6857,6 +6964,8 @@ snapshots:
'@typescript-eslint/types': 8.8.0
eslint-visitor-keys: 3.4.3
+ '@ungap/structured-clone@1.2.0': {}
+
'@webassemblyjs/ast@1.12.1':
dependencies:
'@webassemblyjs/helper-numbers': 1.11.6
@@ -8257,6 +8366,20 @@ snapshots:
stringify-entities: 4.0.4
zwitch: 2.0.4
+ hast-util-to-html@9.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
hast-util-to-parse5@7.1.0:
dependencies:
'@types/hast': 2.3.10
@@ -8268,6 +8391,10 @@ snapshots:
hast-util-whitespace@2.0.1: {}
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
hastscript@6.0.0:
dependencies:
'@types/hast': 2.3.10
@@ -8324,6 +8451,8 @@ snapshots:
html-void-elements@2.0.1: {}
+ html-void-elements@3.0.0: {}
+
htmlparser2@6.1.0:
dependencies:
domelementtype: 2.3.0
@@ -9331,6 +9460,18 @@ snapshots:
unist-util-position: 4.0.4
unist-util-visit: 4.1.2
+ mdast-util-to-hast@13.2.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.2.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.0
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+
mdast-util-to-markdown@1.5.0:
dependencies:
'@types/mdast': 3.0.15
@@ -9528,6 +9669,11 @@ snapshots:
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
@@ -9556,6 +9702,8 @@ snapshots:
micromark-util-encode@1.1.0: {}
+ micromark-util-encode@2.0.0: {}
+
micromark-util-events-to-acorn@1.2.3:
dependencies:
'@types/acorn': 4.0.6
@@ -9583,6 +9731,12 @@ snapshots:
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
@@ -9592,8 +9746,12 @@ snapshots:
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
@@ -9739,6 +9897,10 @@ snapshots:
dependencies:
mimic-fn: 2.1.0
+ oniguruma-to-js@0.4.3:
+ dependencies:
+ regex: 4.3.3
+
optionator@0.9.4:
dependencies:
deep-is: 0.1.4
@@ -10038,6 +10200,8 @@ snapshots:
regenerator-runtime@0.14.1: {}
+ regex@4.3.3: {}
+
regexp.prototype.flags@1.5.2:
dependencies:
call-bind: 1.0.7
@@ -10418,6 +10582,15 @@ snapshots:
shebang-regex@3.0.0: {}
+ shiki@1.22.0:
+ dependencies:
+ '@shikijs/core': 1.22.0
+ '@shikijs/engine-javascript': 1.22.0
+ '@shikijs/engine-oniguruma': 1.22.0
+ '@shikijs/types': 1.22.0
+ '@shikijs/vscode-textmate': 9.3.0
+ '@types/hast': 3.0.4
+
side-channel@1.0.6:
dependencies:
call-bind: 1.0.7
@@ -10839,6 +11012,10 @@ snapshots:
dependencies:
'@types/unist': 2.0.11
+ unist-util-is@6.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
unist-util-position-from-estree@1.1.2:
dependencies:
'@types/unist': 2.0.11
@@ -10847,6 +11024,10 @@ snapshots:
dependencies:
'@types/unist': 2.0.11
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
unist-util-remove-position@4.0.2:
dependencies:
'@types/unist': 2.0.11
@@ -10869,12 +11050,23 @@ snapshots:
'@types/unist': 2.0.11
unist-util-is: 5.2.1
+ unist-util-visit-parents@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
unist-util-visit@4.1.2:
dependencies:
'@types/unist': 2.0.11
unist-util-is: 5.2.1
unist-util-visit-parents: 5.1.3
+ unist-util-visit@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
universalify@0.1.2: {}
universalify@0.2.0: {}
diff --git a/tsconfig.json b/tsconfig.json
index 4658ec5..067a63f 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -18,7 +18,8 @@
"skipDefaultLibCheck": true,
"allowImportingTsExtensions": true,
"noEmit": true,
- "emitDeclarationOnly": false
+ "emitDeclarationOnly": false,
+ "lib": ["ES2015.Promise", "ES2015", "DOM"]
},
"exclude": [
"node_modules",