vanilla-intlayer 8.8.0 → 8.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/cjs/client/index.cjs +24 -1
- package/dist/cjs/client/installIntlayer.cjs +98 -1
- package/dist/cjs/client/installIntlayer.cjs.map +1 -0
- package/dist/cjs/client/useDictionary.cjs +59 -1
- package/dist/cjs/client/useDictionary.cjs.map +1 -0
- package/dist/cjs/client/useDictionaryDynamic.cjs +93 -1
- package/dist/cjs/client/useDictionaryDynamic.cjs.map +1 -0
- package/dist/cjs/client/useIntlayer.cjs +65 -1
- package/dist/cjs/client/useIntlayer.cjs.map +1 -0
- package/dist/cjs/client/useLocale.cjs +58 -1
- package/dist/cjs/client/useLocale.cjs.map +1 -0
- package/dist/cjs/client/useLocaleStorage.cjs +51 -1
- package/dist/cjs/client/useLocaleStorage.cjs.map +1 -0
- package/dist/cjs/client/useRewriteURL.cjs +46 -1
- package/dist/cjs/client/useRewriteURL.cjs.map +1 -0
- package/dist/cjs/editor/useEditor.cjs +49 -1
- package/dist/cjs/editor/useEditor.cjs.map +1 -0
- package/dist/cjs/format/index.cjs +20 -1
- package/dist/cjs/format/useCompact.cjs +17 -1
- package/dist/cjs/format/useCompact.cjs.map +1 -0
- package/dist/cjs/format/useCurrency.cjs +17 -1
- package/dist/cjs/format/useCurrency.cjs.map +1 -0
- package/dist/cjs/format/useDate.cjs +26 -1
- package/dist/cjs/format/useDate.cjs.map +1 -0
- package/dist/cjs/format/useIntl.cjs +44 -1
- package/dist/cjs/format/useIntl.cjs.map +1 -0
- package/dist/cjs/format/useList.cjs +17 -1
- package/dist/cjs/format/useList.cjs.map +1 -0
- package/dist/cjs/format/useNumber.cjs +20 -1
- package/dist/cjs/format/useNumber.cjs.map +1 -0
- package/dist/cjs/format/usePercentage.cjs +17 -1
- package/dist/cjs/format/usePercentage.cjs.map +1 -0
- package/dist/cjs/format/useRelativeTime.cjs +17 -1
- package/dist/cjs/format/useRelativeTime.cjs.map +1 -0
- package/dist/cjs/format/useUnit.cjs +17 -1
- package/dist/cjs/format/useUnit.cjs.map +1 -0
- package/dist/cjs/getDictionary.cjs +11 -1
- package/dist/cjs/getDictionary.cjs.map +1 -0
- package/dist/cjs/getIntlayer.cjs +11 -1
- package/dist/cjs/getIntlayer.cjs.map +1 -0
- package/dist/cjs/html/HTMLRenderer.cjs +22 -1
- package/dist/cjs/html/HTMLRenderer.cjs.map +1 -0
- package/dist/cjs/html/index.cjs +9 -1
- package/dist/cjs/html/installIntlayerHTML.cjs +91 -1
- package/dist/cjs/html/installIntlayerHTML.cjs.map +1 -0
- package/dist/cjs/html/types.cjs +0 -1
- package/dist/cjs/index.cjs +37 -1
- package/dist/cjs/markdown/MarkdownRenderer.cjs +41 -1
- package/dist/cjs/markdown/MarkdownRenderer.cjs.map +1 -0
- package/dist/cjs/markdown/compiler.cjs +37 -1
- package/dist/cjs/markdown/compiler.cjs.map +1 -0
- package/dist/cjs/markdown/index.cjs +11 -1
- package/dist/cjs/markdown/installIntlayerMarkdown.cjs +98 -1
- package/dist/cjs/markdown/installIntlayerMarkdown.cjs.map +1 -0
- package/dist/cjs/markdown/runtime.cjs +87 -1
- package/dist/cjs/markdown/runtime.cjs.map +1 -0
- package/dist/cjs/plugins.cjs +240 -1
- package/dist/cjs/plugins.cjs.map +1 -0
- package/dist/cjs/renderIntlayerNode.cjs +44 -1
- package/dist/cjs/renderIntlayerNode.cjs.map +1 -0
- package/dist/esm/client/index.mjs +9 -8
- package/dist/esm/client/installIntlayer.mjs +93 -2
- package/dist/esm/client/installIntlayer.mjs.map +1 -0
- package/dist/esm/client/useDictionary.mjs +55 -8
- package/dist/esm/client/useDictionary.mjs.map +1 -0
- package/dist/esm/client/useDictionaryDynamic.mjs +82 -28
- package/dist/esm/client/useDictionaryDynamic.mjs.map +1 -0
- package/dist/esm/client/useIntlayer.mjs +61 -8
- package/dist/esm/client/useIntlayer.mjs.map +1 -0
- package/dist/esm/client/useLocale.mjs +51 -17
- package/dist/esm/client/useLocale.mjs.map +1 -0
- package/dist/esm/client/useLocaleStorage.mjs +39 -13
- package/dist/esm/client/useLocaleStorage.mjs.map +1 -0
- package/dist/esm/client/useRewriteURL.mjs +40 -12
- package/dist/esm/client/useRewriteURL.mjs.map +1 -0
- package/dist/esm/editor/useEditor.mjs +47 -2
- package/dist/esm/editor/useEditor.mjs.map +1 -0
- package/dist/esm/format/index.mjs +11 -10
- package/dist/esm/format/useCompact.mjs +11 -8
- package/dist/esm/format/useCompact.mjs.map +1 -0
- package/dist/esm/format/useCurrency.mjs +11 -8
- package/dist/esm/format/useCurrency.mjs.map +1 -0
- package/dist/esm/format/useDate.mjs +18 -12
- package/dist/esm/format/useDate.mjs.map +1 -0
- package/dist/esm/format/useIntl.mjs +36 -8
- package/dist/esm/format/useIntl.mjs.map +1 -0
- package/dist/esm/format/useList.mjs +11 -8
- package/dist/esm/format/useList.mjs.map +1 -0
- package/dist/esm/format/useNumber.mjs +14 -8
- package/dist/esm/format/useNumber.mjs.map +1 -0
- package/dist/esm/format/usePercentage.mjs +11 -8
- package/dist/esm/format/usePercentage.mjs.map +1 -0
- package/dist/esm/format/useRelativeTime.mjs +11 -8
- package/dist/esm/format/useRelativeTime.mjs.map +1 -0
- package/dist/esm/format/useUnit.mjs +11 -8
- package/dist/esm/format/useUnit.mjs.map +1 -0
- package/dist/esm/getDictionary.mjs +7 -4
- package/dist/esm/getDictionary.mjs.map +1 -0
- package/dist/esm/getIntlayer.mjs +7 -4
- package/dist/esm/getIntlayer.mjs.map +1 -0
- package/dist/esm/html/HTMLRenderer.mjs +17 -5
- package/dist/esm/html/HTMLRenderer.mjs.map +1 -0
- package/dist/esm/html/index.mjs +4 -3
- package/dist/esm/html/installIntlayerHTML.mjs +81 -13
- package/dist/esm/html/installIntlayerHTML.mjs.map +1 -0
- package/dist/esm/index.mjs +13 -12
- package/dist/esm/markdown/MarkdownRenderer.mjs +36 -16
- package/dist/esm/markdown/MarkdownRenderer.mjs.map +1 -0
- package/dist/esm/markdown/compiler.mjs +28 -4
- package/dist/esm/markdown/compiler.mjs.map +1 -0
- package/dist/esm/markdown/index.mjs +5 -4
- package/dist/esm/markdown/installIntlayerMarkdown.mjs +86 -23
- package/dist/esm/markdown/installIntlayerMarkdown.mjs.map +1 -0
- package/dist/esm/markdown/runtime.mjs +60 -28
- package/dist/esm/markdown/runtime.mjs.map +1 -0
- package/dist/esm/plugins.mjs +187 -134
- package/dist/esm/plugins.mjs.map +1 -0
- package/dist/esm/renderIntlayerNode.mjs +32 -15
- package/dist/esm/renderIntlayerNode.mjs.map +1 -0
- package/dist/types/client/index.d.ts +8 -0
- package/dist/{client → types/client}/installIntlayer.d.ts +27 -20
- package/dist/types/client/installIntlayer.d.ts.map +1 -0
- package/dist/{client → types/client}/useDictionary.d.ts +22 -17
- package/dist/types/client/useDictionary.d.ts.map +1 -0
- package/dist/{client → types/client}/useDictionaryDynamic.d.ts +10 -5
- package/dist/types/client/useDictionaryDynamic.d.ts.map +1 -0
- package/dist/{client → types/client}/useIntlayer.d.ts +9 -4
- package/dist/types/client/useIntlayer.d.ts.map +1 -0
- package/dist/{client → types/client}/useLocale.d.ts +14 -10
- package/dist/types/client/useLocale.d.ts.map +1 -0
- package/dist/types/client/useLocaleStorage.d.ts +37 -0
- package/dist/types/client/useLocaleStorage.d.ts.map +1 -0
- package/dist/{client → types/client}/useRewriteURL.d.ts +5 -1
- package/dist/types/client/useRewriteURL.d.ts.map +1 -0
- package/dist/{editor → types/editor}/useEditor.d.ts +5 -1
- package/dist/types/editor/useEditor.d.ts.map +1 -0
- package/dist/types/format/index.d.ts +10 -0
- package/dist/types/format/useCompact.d.ts +7 -0
- package/dist/types/format/useCompact.d.ts.map +1 -0
- package/dist/types/format/useCurrency.d.ts +7 -0
- package/dist/types/format/useCurrency.d.ts.map +1 -0
- package/dist/types/format/useDate.d.ts +10 -0
- package/dist/types/format/useDate.d.ts.map +1 -0
- package/dist/{format → types/format}/useIntl.d.ts +10 -5
- package/dist/types/format/useIntl.d.ts.map +1 -0
- package/dist/types/format/useList.d.ts +7 -0
- package/dist/types/format/useList.d.ts.map +1 -0
- package/dist/types/format/useNumber.d.ts +10 -0
- package/dist/types/format/useNumber.d.ts.map +1 -0
- package/dist/types/format/usePercentage.d.ts +7 -0
- package/dist/types/format/usePercentage.d.ts.map +1 -0
- package/dist/types/format/useRelativeTime.d.ts +7 -0
- package/dist/types/format/useRelativeTime.d.ts.map +1 -0
- package/dist/types/format/useUnit.d.ts +7 -0
- package/dist/types/format/useUnit.d.ts.map +1 -0
- package/dist/types/getDictionary.d.ts +9 -0
- package/dist/types/getDictionary.d.ts.map +1 -0
- package/dist/types/getIntlayer.d.ts +8 -0
- package/dist/types/getIntlayer.d.ts.map +1 -0
- package/dist/types/html/HTMLRenderer.d.ts +21 -0
- package/dist/types/html/HTMLRenderer.d.ts.map +1 -0
- package/dist/types/html/index.d.ts +4 -0
- package/dist/{html → types/html}/installIntlayerHTML.d.ts +18 -13
- package/dist/types/html/installIntlayerHTML.d.ts.map +1 -0
- package/dist/{html → types/html}/types.d.ts +12 -14
- package/dist/types/html/types.d.ts.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/markdown/MarkdownRenderer.d.ts +32 -0
- package/dist/types/markdown/MarkdownRenderer.d.ts.map +1 -0
- package/dist/types/markdown/compiler.d.ts +23 -0
- package/dist/types/markdown/compiler.d.ts.map +1 -0
- package/dist/types/markdown/index.d.ts +4 -0
- package/dist/types/markdown/installIntlayerMarkdown.d.ts +71 -0
- package/dist/types/markdown/installIntlayerMarkdown.d.ts.map +1 -0
- package/dist/types/markdown/runtime.d.ts +16 -0
- package/dist/types/markdown/runtime.d.ts.map +1 -0
- package/dist/types/plugins.d.ts +80 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/types/renderIntlayerNode.d.ts +31 -0
- package/dist/types/renderIntlayerNode.d.ts.map +1 -0
- package/package.json +10 -13
- package/dist/client/index.d.ts +0 -7
- package/dist/client/useLocaleStorage.d.ts +0 -31
- package/dist/format/index.d.ts +0 -9
- package/dist/format/useCompact.d.ts +0 -2
- package/dist/format/useCurrency.d.ts +0 -2
- package/dist/format/useDate.d.ts +0 -5
- package/dist/format/useList.d.ts +0 -2
- package/dist/format/useNumber.d.ts +0 -5
- package/dist/format/usePercentage.d.ts +0 -2
- package/dist/format/useRelativeTime.d.ts +0 -2
- package/dist/format/useUnit.d.ts +0 -2
- package/dist/getDictionary.d.ts +0 -4
- package/dist/getIntlayer.d.ts +0 -3
- package/dist/html/HTMLRenderer.d.ts +0 -14
- package/dist/html/index.d.ts +0 -3
- package/dist/index.d.ts +0 -11
- package/dist/installIntlayer-C99qMzFH.mjs +0 -47
- package/dist/installIntlayer-_1cC62gP.js +0 -1
- package/dist/markdown/MarkdownRenderer.d.ts +0 -22
- package/dist/markdown/compiler.d.ts +0 -19
- package/dist/markdown/index.d.ts +0 -3
- package/dist/markdown/installIntlayerMarkdown.d.ts +0 -70
- package/dist/markdown/runtime.d.ts +0 -12
- package/dist/plugins-Cv8sSUPw.js +0 -1
- package/dist/plugins.d.ts +0 -78
- package/dist/renderIntlayerNode.d.ts +0 -22
|
@@ -1,19 +1,39 @@
|
|
|
1
|
-
import { compileMarkdown
|
|
2
|
-
import { useMarkdown
|
|
1
|
+
import { compileMarkdown } from "./compiler.mjs";
|
|
2
|
+
import { useMarkdown } from "./installIntlayerMarkdown.mjs";
|
|
3
|
+
|
|
3
4
|
//#region src/markdown/MarkdownRenderer.ts
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Renders markdown to an HTML string without using the global provider.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { renderMarkdown } from 'vanilla-intlayer/markdown';
|
|
11
|
+
*
|
|
12
|
+
* document.querySelector('#content').innerHTML = renderMarkdown('# Hello **World**');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
const renderMarkdown = (content, { forceBlock, forceInline, preserveFrontmatter, tagfilter } = {}) => {
|
|
16
|
+
return compileMarkdown(content, {
|
|
17
|
+
forceBlock,
|
|
18
|
+
forceInline,
|
|
19
|
+
preserveFrontmatter,
|
|
20
|
+
tagfilter
|
|
21
|
+
});
|
|
17
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* Returns a render function that uses the global provider's configuration
|
|
25
|
+
* (installed via `installIntlayerMarkdown`), falling back to `compileMarkdown`.
|
|
26
|
+
*/
|
|
27
|
+
const useMarkdownRenderer = (props = {}) => {
|
|
28
|
+
const provider = useMarkdown();
|
|
29
|
+
return (content) => provider.renderMarkdown(content, {
|
|
30
|
+
forceBlock: props.forceBlock,
|
|
31
|
+
forceInline: props.forceInline,
|
|
32
|
+
preserveFrontmatter: props.preserveFrontmatter,
|
|
33
|
+
tagfilter: props.tagfilter
|
|
34
|
+
}, props.components, props.wrapper);
|
|
35
|
+
};
|
|
36
|
+
|
|
18
37
|
//#endregion
|
|
19
|
-
export {
|
|
38
|
+
export { renderMarkdown, useMarkdownRenderer };
|
|
39
|
+
//# sourceMappingURL=MarkdownRenderer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownRenderer.mjs","names":[],"sources":["../../../src/markdown/MarkdownRenderer.ts"],"sourcesContent":["import type { HTMLComponents } from '../html/types';\nimport { compileMarkdown, type MarkdownCompilerOptions } from './compiler';\nimport {\n type MarkdownProviderOptions,\n type RenderMarkdownFunction,\n useMarkdown,\n} from './installIntlayerMarkdown';\n\nexport type RenderMarkdownProps = MarkdownProviderOptions & {\n components?: HTMLComponents<'permissive', {}>;\n wrapper?: string;\n};\n\n/**\n * Renders markdown to an HTML string without using the global provider.\n *\n * @example\n * ```ts\n * import { renderMarkdown } from 'vanilla-intlayer/markdown';\n *\n * document.querySelector('#content').innerHTML = renderMarkdown('# Hello **World**');\n * ```\n */\nexport const renderMarkdown = (\n content: string,\n {\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n }: RenderMarkdownProps = {}\n): string => {\n const options: MarkdownCompilerOptions = {\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n };\n return compileMarkdown(content, options);\n};\n\n/**\n * Returns a render function that uses the global provider's configuration\n * (installed via `installIntlayerMarkdown`), falling back to `compileMarkdown`.\n */\nexport const useMarkdownRenderer = (\n props: RenderMarkdownProps = {}\n): ((content: string) => string | Promise<string>) => {\n const provider = useMarkdown();\n\n return (content: string) =>\n provider.renderMarkdown(\n content,\n {\n forceBlock: props.forceBlock,\n forceInline: props.forceInline,\n preserveFrontmatter: props.preserveFrontmatter,\n tagfilter: props.tagfilter,\n },\n props.components,\n props.wrapper\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAuBA,MAAa,kBACX,SACA,EACE,YACA,aACA,qBACA,cACuB,EAAE,KAChB;AAOX,QAAO,gBAAgB,SAAS;EAL9B;EACA;EACA;EACA;EAEqC,CAAC;;;;;;AAO1C,MAAa,uBACX,QAA6B,EAAE,KACqB;CACpD,MAAM,WAAW,aAAa;AAE9B,SAAQ,YACN,SAAS,eACP,SACA;EACE,YAAY,MAAM;EAClB,aAAa,MAAM;EACnB,qBAAqB,MAAM;EAC3B,WAAW,MAAM;EAClB,EACD,MAAM,YACN,MAAM,QACP"}
|
|
@@ -1,6 +1,30 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { RuleType
|
|
1
|
+
import vanillaRuntime from "./runtime.mjs";
|
|
2
|
+
import { RuleType, compileWithOptions, sanitizer as defaultSanitizer, slugify as defaultSlugify } from "@intlayer/core/markdown";
|
|
3
|
+
|
|
3
4
|
//#region src/markdown/compiler.ts
|
|
4
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Vanilla JS adapter for the framework-agnostic markdown processor.
|
|
7
|
+
*
|
|
8
|
+
* Compiles markdown to an HTML string for use with `innerHTML` or the
|
|
9
|
+
* `renderMarkdown` utility.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Compile markdown to an HTML string.
|
|
13
|
+
*
|
|
14
|
+
* The resulting string can be inserted into the DOM via `element.innerHTML`
|
|
15
|
+
* or the `renderMarkdown` helper.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { compileMarkdown } from 'vanilla-intlayer/markdown';
|
|
20
|
+
*
|
|
21
|
+
* document.querySelector('#content').innerHTML = compileMarkdown('# Hello **World**');
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
const compileMarkdown = (markdown = "", options = {}) => compileWithOptions(markdown, vanillaRuntime, options);
|
|
25
|
+
const compiler = compileMarkdown;
|
|
26
|
+
const compile = compileMarkdown;
|
|
27
|
+
|
|
5
28
|
//#endregion
|
|
6
|
-
export {
|
|
29
|
+
export { RuleType, compile, compileMarkdown, compiler, defaultSanitizer as sanitizer, defaultSlugify as slugify };
|
|
30
|
+
//# sourceMappingURL=compiler.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.mjs","names":[],"sources":["../../../src/markdown/compiler.ts"],"sourcesContent":["/**\n * Vanilla JS adapter for the framework-agnostic markdown processor.\n *\n * Compiles markdown to an HTML string for use with `innerHTML` or the\n * `renderMarkdown` utility.\n */\n\nimport {\n type CompileOptions,\n compileWithOptions,\n sanitizer as defaultSanitizer,\n slugify as defaultSlugify,\n RuleType,\n} from '@intlayer/core/markdown';\nimport { vanillaRuntime } from './runtime';\n\n// Re-export utilities for compatibility\nexport { defaultSanitizer as sanitizer, defaultSlugify as slugify, RuleType };\n\nexport type MarkdownCompilerOptions = CompileOptions;\n\n/**\n * Compile markdown to an HTML string.\n *\n * The resulting string can be inserted into the DOM via `element.innerHTML`\n * or the `renderMarkdown` helper.\n *\n * @example\n * ```ts\n * import { compileMarkdown } from 'vanilla-intlayer/markdown';\n *\n * document.querySelector('#content').innerHTML = compileMarkdown('# Hello **World**');\n * ```\n */\nexport const compileMarkdown = (\n markdown = '',\n options: MarkdownCompilerOptions = {}\n): string => compileWithOptions(markdown, vanillaRuntime, options) as string;\n\n// Aliases for consistency with other adapters\nexport const compiler = compileMarkdown;\nexport const compile = compileMarkdown;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAa,mBACX,WAAW,IACX,UAAmC,EAAE,KAC1B,mBAAmB,UAAU,gBAAgB,QAAQ;AAGlE,MAAa,WAAW;AACxB,MAAa,UAAU"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { compileMarkdown
|
|
2
|
-
import { installIntlayerMarkdown
|
|
3
|
-
import { renderMarkdown
|
|
4
|
-
|
|
1
|
+
import { compileMarkdown } from "./compiler.mjs";
|
|
2
|
+
import { installIntlayerMarkdown, installIntlayerMarkdownDynamic, useMarkdown } from "./installIntlayerMarkdown.mjs";
|
|
3
|
+
import { renderMarkdown, useMarkdownRenderer } from "./MarkdownRenderer.mjs";
|
|
4
|
+
|
|
5
|
+
export { compileMarkdown, installIntlayerMarkdown, installIntlayerMarkdownDynamic, renderMarkdown, useMarkdown, useMarkdownRenderer };
|
|
@@ -1,31 +1,94 @@
|
|
|
1
|
-
import { compileMarkdown
|
|
1
|
+
import { compileMarkdown } from "./compiler.mjs";
|
|
2
|
+
|
|
2
3
|
//#region src/markdown/installIntlayerMarkdown.ts
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Singleton instance
|
|
6
|
+
*/
|
|
7
|
+
let instance = null;
|
|
8
|
+
/**
|
|
9
|
+
* Create and return a single IntlayerMarkdownProvider instance.
|
|
10
|
+
*/
|
|
11
|
+
const createIntlayerMarkdownClient = (renderMarkdown, components) => {
|
|
12
|
+
if (instance) return instance;
|
|
13
|
+
instance = {
|
|
14
|
+
components,
|
|
15
|
+
renderMarkdown
|
|
16
|
+
};
|
|
17
|
+
return instance;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Install the Intlayer Markdown provider for your vanilla JS application.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { installIntlayerMarkdown } from 'vanilla-intlayer/markdown';
|
|
25
|
+
*
|
|
26
|
+
* installIntlayerMarkdown({ forceBlock: true });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
const installIntlayerMarkdown = (pluginOptions) => {
|
|
30
|
+
let renderMarkdown;
|
|
31
|
+
let providerComponents;
|
|
32
|
+
if (typeof pluginOptions === "function") renderMarkdown = pluginOptions;
|
|
9
33
|
else {
|
|
10
|
-
|
|
11
|
-
|
|
34
|
+
const { components, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter, renderMarkdown: customRender } = pluginOptions ?? {};
|
|
35
|
+
providerComponents = components;
|
|
36
|
+
if (customRender) renderMarkdown = customRender;
|
|
12
37
|
else {
|
|
13
|
-
|
|
14
|
-
forceBlock
|
|
15
|
-
forceInline
|
|
16
|
-
preserveFrontmatter
|
|
17
|
-
tagfilter
|
|
38
|
+
const internalOptions = {
|
|
39
|
+
forceBlock,
|
|
40
|
+
forceInline,
|
|
41
|
+
preserveFrontmatter,
|
|
42
|
+
tagfilter
|
|
18
43
|
};
|
|
19
|
-
|
|
20
|
-
...
|
|
21
|
-
forceBlock:
|
|
22
|
-
forceInline:
|
|
23
|
-
preserveFrontmatter:
|
|
24
|
-
tagfilter:
|
|
44
|
+
renderMarkdown = (markdown, options, _componentsOverride, _wrapperOverride) => compileMarkdown(markdown, {
|
|
45
|
+
...internalOptions,
|
|
46
|
+
forceBlock: options?.forceBlock ?? internalOptions.forceBlock,
|
|
47
|
+
forceInline: options?.forceInline ?? internalOptions.forceInline,
|
|
48
|
+
preserveFrontmatter: options?.preserveFrontmatter ?? internalOptions.preserveFrontmatter,
|
|
49
|
+
tagfilter: options?.tagfilter ?? internalOptions.tagfilter
|
|
25
50
|
});
|
|
26
51
|
}
|
|
27
52
|
}
|
|
28
|
-
return
|
|
29
|
-
}
|
|
53
|
+
return createIntlayerMarkdownClient(renderMarkdown, providerComponents);
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Access the installed IntlayerMarkdownProvider.
|
|
57
|
+
* Returns a fallback renderer that compiles with default options if no
|
|
58
|
+
* provider has been installed.
|
|
59
|
+
*/
|
|
60
|
+
const useMarkdown = () => {
|
|
61
|
+
if (instance) return instance;
|
|
62
|
+
return { renderMarkdown: (markdown) => compileMarkdown(markdown) };
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Asynchronously install a markdown renderer whose implementation is loaded
|
|
66
|
+
* via a dynamic `import()`.
|
|
67
|
+
*
|
|
68
|
+
* Use this to keep the markdown compiler out of the initial bundle — the
|
|
69
|
+
* loader is only called the first time this function is executed.
|
|
70
|
+
*
|
|
71
|
+
* The returned promise resolves once the provider is ready. Any calls to
|
|
72
|
+
* `useMarkdown()` before the promise resolves will use the fallback
|
|
73
|
+
* (raw-string) renderer.
|
|
74
|
+
*
|
|
75
|
+
* @param loader - A zero-argument async function that resolves to either a
|
|
76
|
+
* `RenderMarkdownFunction` or an `IntlayerMarkdownPluginOptions` object.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* // Load a custom markdown renderer (e.g. marked) only when needed
|
|
81
|
+
* await installIntlayerMarkdownDynamic(async () => {
|
|
82
|
+
* const { marked } = await import('marked');
|
|
83
|
+
* return (markdown) => marked(markdown) as string;
|
|
84
|
+
* });
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
const installIntlayerMarkdownDynamic = async (loader) => {
|
|
88
|
+
if (instance) return instance;
|
|
89
|
+
return installIntlayerMarkdown(await loader());
|
|
90
|
+
};
|
|
91
|
+
|
|
30
92
|
//#endregion
|
|
31
|
-
export {
|
|
93
|
+
export { createIntlayerMarkdownClient, installIntlayerMarkdown, installIntlayerMarkdownDynamic, useMarkdown };
|
|
94
|
+
//# sourceMappingURL=installIntlayerMarkdown.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installIntlayerMarkdown.mjs","names":[],"sources":["../../../src/markdown/installIntlayerMarkdown.ts"],"sourcesContent":["import type { HTMLComponents } from '../html/types';\nimport { compileMarkdown, type MarkdownCompilerOptions } from './compiler';\n\nexport type MarkdownProviderOptions = {\n /** Forces the compiler to always output content with a block-level wrapper. */\n forceBlock?: boolean;\n /** Forces the compiler to always output content with an inline wrapper. */\n forceInline?: boolean;\n /** Whether to preserve frontmatter in the markdown content. */\n preserveFrontmatter?: boolean;\n /** Whether to use the GitHub Tag Filter. */\n tagfilter?: boolean;\n};\n\nexport type RenderMarkdownOptions = MarkdownProviderOptions & {\n components?: HTMLComponents<'permissive', {}>;\n wrapper?: string;\n};\n\nexport type RenderMarkdownFunction = (\n markdown: string,\n options?: MarkdownProviderOptions,\n components?: HTMLComponents<'permissive', {}>,\n wrapper?: string\n) => string | Promise<string>;\n\n/**\n * Singleton instance\n */\nlet instance: IntlayerMarkdownProvider | null = null;\n\nexport type IntlayerMarkdownProvider = {\n components?: HTMLComponents<'permissive', {}>;\n renderMarkdown: RenderMarkdownFunction;\n};\n\nexport type IntlayerMarkdownPluginOptions = MarkdownProviderOptions & {\n components?: HTMLComponents<'permissive', {}>;\n wrapper?: string;\n renderMarkdown?: RenderMarkdownFunction;\n};\n\n/**\n * Create and return a single IntlayerMarkdownProvider instance.\n */\nexport const createIntlayerMarkdownClient = (\n renderMarkdown: RenderMarkdownFunction,\n components?: HTMLComponents<'permissive', {}>\n): IntlayerMarkdownProvider => {\n if (instance) return instance;\n\n instance = { components, renderMarkdown };\n return instance;\n};\n\n/**\n * Install the Intlayer Markdown provider for your vanilla JS application.\n *\n * @example\n * ```ts\n * import { installIntlayerMarkdown } from 'vanilla-intlayer/markdown';\n *\n * installIntlayerMarkdown({ forceBlock: true });\n * ```\n */\nexport const installIntlayerMarkdown = (\n pluginOptions?: IntlayerMarkdownPluginOptions | RenderMarkdownFunction\n): IntlayerMarkdownProvider => {\n let renderMarkdown: RenderMarkdownFunction;\n let providerComponents: HTMLComponents<'permissive', {}> | undefined;\n\n if (typeof pluginOptions === 'function') {\n renderMarkdown = pluginOptions;\n } else {\n const {\n components,\n wrapper,\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n renderMarkdown: customRender,\n } = pluginOptions ?? {};\n\n providerComponents = components;\n\n if (customRender) {\n renderMarkdown = customRender;\n } else {\n const internalOptions: MarkdownCompilerOptions = {\n forceBlock,\n forceInline,\n preserveFrontmatter,\n tagfilter,\n };\n\n renderMarkdown = (\n markdown,\n options,\n _componentsOverride,\n _wrapperOverride\n ) =>\n compileMarkdown(markdown, {\n ...internalOptions,\n forceBlock: options?.forceBlock ?? internalOptions.forceBlock,\n forceInline: options?.forceInline ?? internalOptions.forceInline,\n preserveFrontmatter:\n options?.preserveFrontmatter ?? internalOptions.preserveFrontmatter,\n tagfilter: options?.tagfilter ?? internalOptions.tagfilter,\n });\n }\n }\n\n return createIntlayerMarkdownClient(renderMarkdown, providerComponents);\n};\n\n/**\n * Access the installed IntlayerMarkdownProvider.\n * Returns a fallback renderer that compiles with default options if no\n * provider has been installed.\n */\nexport const useMarkdown = (): IntlayerMarkdownProvider => {\n if (instance) return instance;\n\n return {\n renderMarkdown: (markdown) => compileMarkdown(markdown),\n };\n};\n\n/**\n * Asynchronously install a markdown renderer whose implementation is loaded\n * via a dynamic `import()`.\n *\n * Use this to keep the markdown compiler out of the initial bundle — the\n * loader is only called the first time this function is executed.\n *\n * The returned promise resolves once the provider is ready. Any calls to\n * `useMarkdown()` before the promise resolves will use the fallback\n * (raw-string) renderer.\n *\n * @param loader - A zero-argument async function that resolves to either a\n * `RenderMarkdownFunction` or an `IntlayerMarkdownPluginOptions` object.\n *\n * @example\n * ```ts\n * // Load a custom markdown renderer (e.g. marked) only when needed\n * await installIntlayerMarkdownDynamic(async () => {\n * const { marked } = await import('marked');\n * return (markdown) => marked(markdown) as string;\n * });\n * ```\n */\nexport const installIntlayerMarkdownDynamic = async (\n loader: () => Promise<IntlayerMarkdownPluginOptions | RenderMarkdownFunction>\n): Promise<IntlayerMarkdownProvider> => {\n if (instance) return instance;\n const pluginOptions = await loader();\n return installIntlayerMarkdown(pluginOptions);\n};\n"],"mappings":";;;;;;AA6BA,IAAI,WAA4C;;;;AAgBhD,MAAa,gCACX,gBACA,eAC6B;AAC7B,KAAI,SAAU,QAAO;AAErB,YAAW;EAAE;EAAY;EAAgB;AACzC,QAAO;;;;;;;;;;;;AAaT,MAAa,2BACX,kBAC6B;CAC7B,IAAI;CACJ,IAAI;AAEJ,KAAI,OAAO,kBAAkB,WAC3B,kBAAiB;MACZ;EACL,MAAM,EACJ,YACA,SACA,YACA,aACA,qBACA,WACA,gBAAgB,iBACd,iBAAiB,EAAE;AAEvB,uBAAqB;AAErB,MAAI,aACF,kBAAiB;OACZ;GACL,MAAM,kBAA2C;IAC/C;IACA;IACA;IACA;IACD;AAED,qBACE,UACA,SACA,qBACA,qBAEA,gBAAgB,UAAU;IACxB,GAAG;IACH,YAAY,SAAS,cAAc,gBAAgB;IACnD,aAAa,SAAS,eAAe,gBAAgB;IACrD,qBACE,SAAS,uBAAuB,gBAAgB;IAClD,WAAW,SAAS,aAAa,gBAAgB;IAClD,CAAC;;;AAIR,QAAO,6BAA6B,gBAAgB,mBAAmB;;;;;;;AAQzE,MAAa,oBAA8C;AACzD,KAAI,SAAU,QAAO;AAErB,QAAO,EACL,iBAAiB,aAAa,gBAAgB,SAAS,EACxD;;;;;;;;;;;;;;;;;;;;;;;;;AA0BH,MAAa,iCAAiC,OAC5C,WACsC;AACtC,KAAI,SAAU,QAAO;AAErB,QAAO,wBAAwB,MADH,QAAQ,CACS"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/markdown/runtime.ts
|
|
2
|
-
|
|
2
|
+
const SELF_CLOSING_TAGS = new Set([
|
|
3
3
|
"area",
|
|
4
4
|
"base",
|
|
5
5
|
"br",
|
|
@@ -14,38 +14,70 @@ var e = new Set([
|
|
|
14
14
|
"source",
|
|
15
15
|
"track",
|
|
16
16
|
"wbr"
|
|
17
|
-
])
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (typeof
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
]);
|
|
18
|
+
const buildPropsString = (props) => {
|
|
19
|
+
if (!props) return "";
|
|
20
|
+
return Object.entries(props).filter(([, v]) => v !== void 0 && v !== null).map(([k, v]) => {
|
|
21
|
+
if (typeof v === "boolean") return v ? k : "";
|
|
22
|
+
if (k === "_innerHTML") return "";
|
|
23
|
+
return `${k}="${String(v).replace(/&/g, "&").replace(/"/g, """)}"`;
|
|
24
|
+
}).filter(Boolean).join(" ");
|
|
25
|
+
};
|
|
26
|
+
const VANILLA_FRAGMENT = "__vanilla_fragment__";
|
|
27
|
+
/**
|
|
28
|
+
* Vanilla-specific MarkdownRuntime that produces HTML strings.
|
|
29
|
+
*/
|
|
30
|
+
const vanillaRuntime = {
|
|
31
|
+
createElement: (type, props, ...children) => {
|
|
32
|
+
const childStr = children.flat(Infinity).join("");
|
|
33
|
+
if (type === VANILLA_FRAGMENT) return childStr;
|
|
34
|
+
if (typeof type === "string") {
|
|
35
|
+
const propsStr = buildPropsString(props);
|
|
36
|
+
const propsWithSpace = propsStr ? ` ${propsStr}` : "";
|
|
37
|
+
const innerHTML = props?._innerHTML;
|
|
38
|
+
if (SELF_CLOSING_TAGS.has(type)) return `<${type}${propsWithSpace}>`;
|
|
39
|
+
if (innerHTML !== void 0) return `<${type}${propsWithSpace}>${innerHTML}</${type}>`;
|
|
40
|
+
return `<${type}${propsWithSpace}>${childStr}</${type}>`;
|
|
24
41
|
}
|
|
25
|
-
if (typeof
|
|
26
|
-
|
|
27
|
-
...
|
|
28
|
-
children:
|
|
42
|
+
if (typeof type === "function") try {
|
|
43
|
+
const result = type({
|
|
44
|
+
...props,
|
|
45
|
+
children: childStr
|
|
29
46
|
});
|
|
30
|
-
return typeof
|
|
47
|
+
return typeof result === "string" ? result : childStr;
|
|
31
48
|
} catch {
|
|
32
|
-
return
|
|
49
|
+
return childStr;
|
|
33
50
|
}
|
|
34
|
-
return
|
|
51
|
+
return childStr;
|
|
52
|
+
},
|
|
53
|
+
cloneElement: (element, _props, ..._children) => {
|
|
54
|
+
return typeof element === "string" ? element : String(element ?? "");
|
|
35
55
|
},
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
56
|
+
Fragment: VANILLA_FRAGMENT,
|
|
57
|
+
/**
|
|
58
|
+
* Normalize props to standard HTML attribute names.
|
|
59
|
+
*/
|
|
60
|
+
normalizeProps: (_tag, props) => {
|
|
61
|
+
const normalized = {};
|
|
62
|
+
for (const [key, value] of Object.entries(props)) if (key === "className") normalized.class = value;
|
|
63
|
+
else if (key === "htmlFor") normalized.for = value;
|
|
64
|
+
else if (key === "dangerouslySetInnerHTML" && value?.__html) normalized._innerHTML = value.__html;
|
|
65
|
+
else normalized[key] = value;
|
|
66
|
+
return normalized;
|
|
42
67
|
}
|
|
43
|
-
}, i = (e = {}) => {
|
|
44
|
-
let { onCreateElement: t } = e;
|
|
45
|
-
return t ? {
|
|
46
|
-
...r,
|
|
47
|
-
createElement: (e, n, ...r) => t(e, n, r)
|
|
48
|
-
} : r;
|
|
49
68
|
};
|
|
69
|
+
/**
|
|
70
|
+
* Creates a vanilla runtime with a custom createElement for advanced use cases.
|
|
71
|
+
*/
|
|
72
|
+
const createVanillaRuntime = (options = {}) => {
|
|
73
|
+
const { onCreateElement } = options;
|
|
74
|
+
if (onCreateElement) return {
|
|
75
|
+
...vanillaRuntime,
|
|
76
|
+
createElement: (type, props, ...children) => onCreateElement(type, props, children)
|
|
77
|
+
};
|
|
78
|
+
return vanillaRuntime;
|
|
79
|
+
};
|
|
80
|
+
|
|
50
81
|
//#endregion
|
|
51
|
-
export {
|
|
82
|
+
export { createVanillaRuntime, vanillaRuntime as default, vanillaRuntime };
|
|
83
|
+
//# sourceMappingURL=runtime.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.mjs","names":[],"sources":["../../../src/markdown/runtime.ts"],"sourcesContent":["/**\n * Vanilla JS adapter for the framework-agnostic markdown processor.\n *\n * Builds HTML strings which can be inserted into the DOM via `innerHTML`\n * or the `renderMarkdown` utility.\n */\n\nimport type { HTMLTag, MarkdownRuntime } from '@intlayer/core/markdown';\n\nconst SELF_CLOSING_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\nconst buildPropsString = (props: Record<string, any> | null): string => {\n if (!props) return '';\n\n return Object.entries(props)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([k, v]) => {\n if (typeof v === 'boolean') return v ? k : '';\n if (k === '_innerHTML') return ''; // handled separately\n return `${k}=\"${String(v).replace(/&/g, '&').replace(/\"/g, '"')}\"`;\n })\n .filter(Boolean)\n .join(' ');\n};\n\nconst VANILLA_FRAGMENT = '__vanilla_fragment__';\n\n/**\n * Vanilla-specific MarkdownRuntime that produces HTML strings.\n */\nexport const vanillaRuntime: MarkdownRuntime = {\n createElement: (\n type: any,\n props: Record<string, any> | null,\n ...children: any[]\n ): string => {\n const childStr = children.flat(Infinity).join('');\n\n if (type === VANILLA_FRAGMENT) return childStr;\n\n if (typeof type === 'string') {\n const propsStr = buildPropsString(props);\n const propsWithSpace = propsStr ? ` ${propsStr}` : '';\n const innerHTML = props?._innerHTML;\n\n if (SELF_CLOSING_TAGS.has(type)) {\n return `<${type}${propsWithSpace}>`;\n }\n\n if (innerHTML !== undefined) {\n return `<${type}${propsWithSpace}>${innerHTML}</${type}>`;\n }\n\n return `<${type}${propsWithSpace}>${childStr}</${type}>`;\n }\n\n // Function component override — returns a string\n if (typeof type === 'function') {\n try {\n const result = type({ ...props, children: childStr });\n return typeof result === 'string' ? result : childStr;\n } catch {\n return childStr;\n }\n }\n\n return childStr;\n },\n\n cloneElement: (\n element: unknown,\n _props: Record<string, any>,\n ..._children: any[]\n ): string => {\n return typeof element === 'string' ? element : String(element ?? '');\n },\n\n Fragment: VANILLA_FRAGMENT as any,\n\n /**\n * Normalize props to standard HTML attribute names.\n */\n normalizeProps: (\n _tag: HTMLTag,\n props: Record<string, any>\n ): Record<string, any> => {\n const normalized: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (key === 'className') {\n normalized.class = value;\n } else if (key === 'htmlFor') {\n normalized.for = value;\n } else if (key === 'dangerouslySetInnerHTML' && value?.__html) {\n normalized._innerHTML = value.__html;\n } else {\n normalized[key] = value;\n }\n }\n\n return normalized;\n },\n};\n\n/**\n * Creates a vanilla runtime with a custom createElement for advanced use cases.\n */\nexport const createVanillaRuntime = (\n options: {\n onCreateElement?: (\n type: any,\n props: Record<string, any> | null,\n children: any[]\n ) => string;\n } = {}\n): MarkdownRuntime => {\n const { onCreateElement } = options;\n\n if (onCreateElement) {\n return {\n ...vanillaRuntime,\n createElement: (\n type: any,\n props: Record<string, any> | null,\n ...children: any[]\n ): string => onCreateElement(type, props, children),\n };\n }\n\n return vanillaRuntime;\n};\n\nexport default vanillaRuntime;\n"],"mappings":";AASA,MAAM,oBAAoB,IAAI,IAAI;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,oBAAoB,UAA8C;AACtE,KAAI,CAAC,MAAO,QAAO;AAEnB,QAAO,OAAO,QAAQ,MAAM,CACzB,QAAQ,GAAG,OAAO,MAAM,UAAa,MAAM,KAAK,CAChD,KAAK,CAAC,GAAG,OAAO;AACf,MAAI,OAAO,MAAM,UAAW,QAAO,IAAI,IAAI;AAC3C,MAAI,MAAM,aAAc,QAAO;AAC/B,SAAO,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC,QAAQ,MAAM,QAAQ,CAAC,QAAQ,MAAM,SAAS,CAAC;GACzE,CACD,OAAO,QAAQ,CACf,KAAK,IAAI;;AAGd,MAAM,mBAAmB;;;;AAKzB,MAAa,iBAAkC;CAC7C,gBACE,MACA,OACA,GAAG,aACQ;EACX,MAAM,WAAW,SAAS,KAAK,SAAS,CAAC,KAAK,GAAG;AAEjD,MAAI,SAAS,iBAAkB,QAAO;AAEtC,MAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,WAAW,iBAAiB,MAAM;GACxC,MAAM,iBAAiB,WAAW,IAAI,aAAa;GACnD,MAAM,YAAY,OAAO;AAEzB,OAAI,kBAAkB,IAAI,KAAK,CAC7B,QAAO,IAAI,OAAO,eAAe;AAGnC,OAAI,cAAc,OAChB,QAAO,IAAI,OAAO,eAAe,GAAG,UAAU,IAAI,KAAK;AAGzD,UAAO,IAAI,OAAO,eAAe,GAAG,SAAS,IAAI,KAAK;;AAIxD,MAAI,OAAO,SAAS,WAClB,KAAI;GACF,MAAM,SAAS,KAAK;IAAE,GAAG;IAAO,UAAU;IAAU,CAAC;AACrD,UAAO,OAAO,WAAW,WAAW,SAAS;UACvC;AACN,UAAO;;AAIX,SAAO;;CAGT,eACE,SACA,QACA,GAAG,cACQ;AACX,SAAO,OAAO,YAAY,WAAW,UAAU,OAAO,WAAW,GAAG;;CAGtE,UAAU;;;;CAKV,iBACE,MACA,UACwB;EACxB,MAAM,aAAkC,EAAE;AAE1C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,KAAI,QAAQ,YACV,YAAW,QAAQ;WACV,QAAQ,UACjB,YAAW,MAAM;WACR,QAAQ,6BAA6B,OAAO,OACrD,YAAW,aAAa,MAAM;MAE9B,YAAW,OAAO;AAItB,SAAO;;CAEV;;;;AAKD,MAAa,wBACX,UAMI,EAAE,KACc;CACpB,MAAM,EAAE,oBAAoB;AAE5B,KAAI,gBACF,QAAO;EACL,GAAG;EACH,gBACE,MACA,OACA,GAAG,aACQ,gBAAgB,MAAM,OAAO,SAAS;EACpD;AAGH,QAAO"}
|