vanilla-intlayer 8.8.0 → 8.9.1

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.
Files changed (209) hide show
  1. package/dist/cjs/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/cjs/client/index.cjs +24 -1
  3. package/dist/cjs/client/installIntlayer.cjs +98 -1
  4. package/dist/cjs/client/installIntlayer.cjs.map +1 -0
  5. package/dist/cjs/client/useDictionary.cjs +59 -1
  6. package/dist/cjs/client/useDictionary.cjs.map +1 -0
  7. package/dist/cjs/client/useDictionaryDynamic.cjs +93 -1
  8. package/dist/cjs/client/useDictionaryDynamic.cjs.map +1 -0
  9. package/dist/cjs/client/useIntlayer.cjs +65 -1
  10. package/dist/cjs/client/useIntlayer.cjs.map +1 -0
  11. package/dist/cjs/client/useLocale.cjs +58 -1
  12. package/dist/cjs/client/useLocale.cjs.map +1 -0
  13. package/dist/cjs/client/useLocaleStorage.cjs +51 -1
  14. package/dist/cjs/client/useLocaleStorage.cjs.map +1 -0
  15. package/dist/cjs/client/useRewriteURL.cjs +46 -1
  16. package/dist/cjs/client/useRewriteURL.cjs.map +1 -0
  17. package/dist/cjs/editor/useEditor.cjs +49 -1
  18. package/dist/cjs/editor/useEditor.cjs.map +1 -0
  19. package/dist/cjs/format/index.cjs +20 -1
  20. package/dist/cjs/format/useCompact.cjs +17 -1
  21. package/dist/cjs/format/useCompact.cjs.map +1 -0
  22. package/dist/cjs/format/useCurrency.cjs +17 -1
  23. package/dist/cjs/format/useCurrency.cjs.map +1 -0
  24. package/dist/cjs/format/useDate.cjs +26 -1
  25. package/dist/cjs/format/useDate.cjs.map +1 -0
  26. package/dist/cjs/format/useIntl.cjs +44 -1
  27. package/dist/cjs/format/useIntl.cjs.map +1 -0
  28. package/dist/cjs/format/useList.cjs +17 -1
  29. package/dist/cjs/format/useList.cjs.map +1 -0
  30. package/dist/cjs/format/useNumber.cjs +20 -1
  31. package/dist/cjs/format/useNumber.cjs.map +1 -0
  32. package/dist/cjs/format/usePercentage.cjs +17 -1
  33. package/dist/cjs/format/usePercentage.cjs.map +1 -0
  34. package/dist/cjs/format/useRelativeTime.cjs +17 -1
  35. package/dist/cjs/format/useRelativeTime.cjs.map +1 -0
  36. package/dist/cjs/format/useUnit.cjs +17 -1
  37. package/dist/cjs/format/useUnit.cjs.map +1 -0
  38. package/dist/cjs/getDictionary.cjs +11 -1
  39. package/dist/cjs/getDictionary.cjs.map +1 -0
  40. package/dist/cjs/getIntlayer.cjs +11 -1
  41. package/dist/cjs/getIntlayer.cjs.map +1 -0
  42. package/dist/cjs/html/HTMLRenderer.cjs +22 -1
  43. package/dist/cjs/html/HTMLRenderer.cjs.map +1 -0
  44. package/dist/cjs/html/index.cjs +9 -1
  45. package/dist/cjs/html/installIntlayerHTML.cjs +91 -1
  46. package/dist/cjs/html/installIntlayerHTML.cjs.map +1 -0
  47. package/dist/cjs/html/types.cjs +0 -1
  48. package/dist/cjs/index.cjs +37 -1
  49. package/dist/cjs/markdown/MarkdownRenderer.cjs +41 -1
  50. package/dist/cjs/markdown/MarkdownRenderer.cjs.map +1 -0
  51. package/dist/cjs/markdown/compiler.cjs +37 -1
  52. package/dist/cjs/markdown/compiler.cjs.map +1 -0
  53. package/dist/cjs/markdown/index.cjs +11 -1
  54. package/dist/cjs/markdown/installIntlayerMarkdown.cjs +98 -1
  55. package/dist/cjs/markdown/installIntlayerMarkdown.cjs.map +1 -0
  56. package/dist/cjs/markdown/runtime.cjs +87 -1
  57. package/dist/cjs/markdown/runtime.cjs.map +1 -0
  58. package/dist/cjs/plugins.cjs +240 -1
  59. package/dist/cjs/plugins.cjs.map +1 -0
  60. package/dist/cjs/renderIntlayerNode.cjs +44 -1
  61. package/dist/cjs/renderIntlayerNode.cjs.map +1 -0
  62. package/dist/esm/client/index.mjs +9 -8
  63. package/dist/esm/client/installIntlayer.mjs +93 -2
  64. package/dist/esm/client/installIntlayer.mjs.map +1 -0
  65. package/dist/esm/client/useDictionary.mjs +55 -8
  66. package/dist/esm/client/useDictionary.mjs.map +1 -0
  67. package/dist/esm/client/useDictionaryDynamic.mjs +82 -28
  68. package/dist/esm/client/useDictionaryDynamic.mjs.map +1 -0
  69. package/dist/esm/client/useIntlayer.mjs +61 -8
  70. package/dist/esm/client/useIntlayer.mjs.map +1 -0
  71. package/dist/esm/client/useLocale.mjs +51 -17
  72. package/dist/esm/client/useLocale.mjs.map +1 -0
  73. package/dist/esm/client/useLocaleStorage.mjs +39 -13
  74. package/dist/esm/client/useLocaleStorage.mjs.map +1 -0
  75. package/dist/esm/client/useRewriteURL.mjs +40 -12
  76. package/dist/esm/client/useRewriteURL.mjs.map +1 -0
  77. package/dist/esm/editor/useEditor.mjs +47 -2
  78. package/dist/esm/editor/useEditor.mjs.map +1 -0
  79. package/dist/esm/format/index.mjs +11 -10
  80. package/dist/esm/format/useCompact.mjs +11 -8
  81. package/dist/esm/format/useCompact.mjs.map +1 -0
  82. package/dist/esm/format/useCurrency.mjs +11 -8
  83. package/dist/esm/format/useCurrency.mjs.map +1 -0
  84. package/dist/esm/format/useDate.mjs +18 -12
  85. package/dist/esm/format/useDate.mjs.map +1 -0
  86. package/dist/esm/format/useIntl.mjs +36 -8
  87. package/dist/esm/format/useIntl.mjs.map +1 -0
  88. package/dist/esm/format/useList.mjs +11 -8
  89. package/dist/esm/format/useList.mjs.map +1 -0
  90. package/dist/esm/format/useNumber.mjs +14 -8
  91. package/dist/esm/format/useNumber.mjs.map +1 -0
  92. package/dist/esm/format/usePercentage.mjs +11 -8
  93. package/dist/esm/format/usePercentage.mjs.map +1 -0
  94. package/dist/esm/format/useRelativeTime.mjs +11 -8
  95. package/dist/esm/format/useRelativeTime.mjs.map +1 -0
  96. package/dist/esm/format/useUnit.mjs +11 -8
  97. package/dist/esm/format/useUnit.mjs.map +1 -0
  98. package/dist/esm/getDictionary.mjs +7 -4
  99. package/dist/esm/getDictionary.mjs.map +1 -0
  100. package/dist/esm/getIntlayer.mjs +7 -4
  101. package/dist/esm/getIntlayer.mjs.map +1 -0
  102. package/dist/esm/html/HTMLRenderer.mjs +17 -5
  103. package/dist/esm/html/HTMLRenderer.mjs.map +1 -0
  104. package/dist/esm/html/index.mjs +4 -3
  105. package/dist/esm/html/installIntlayerHTML.mjs +81 -13
  106. package/dist/esm/html/installIntlayerHTML.mjs.map +1 -0
  107. package/dist/esm/index.mjs +13 -12
  108. package/dist/esm/markdown/MarkdownRenderer.mjs +36 -16
  109. package/dist/esm/markdown/MarkdownRenderer.mjs.map +1 -0
  110. package/dist/esm/markdown/compiler.mjs +28 -4
  111. package/dist/esm/markdown/compiler.mjs.map +1 -0
  112. package/dist/esm/markdown/index.mjs +5 -4
  113. package/dist/esm/markdown/installIntlayerMarkdown.mjs +86 -23
  114. package/dist/esm/markdown/installIntlayerMarkdown.mjs.map +1 -0
  115. package/dist/esm/markdown/runtime.mjs +60 -28
  116. package/dist/esm/markdown/runtime.mjs.map +1 -0
  117. package/dist/esm/plugins.mjs +187 -134
  118. package/dist/esm/plugins.mjs.map +1 -0
  119. package/dist/esm/renderIntlayerNode.mjs +32 -15
  120. package/dist/esm/renderIntlayerNode.mjs.map +1 -0
  121. package/dist/types/client/index.d.ts +8 -0
  122. package/dist/{client → types/client}/installIntlayer.d.ts +27 -20
  123. package/dist/types/client/installIntlayer.d.ts.map +1 -0
  124. package/dist/{client → types/client}/useDictionary.d.ts +22 -17
  125. package/dist/types/client/useDictionary.d.ts.map +1 -0
  126. package/dist/{client → types/client}/useDictionaryDynamic.d.ts +10 -5
  127. package/dist/types/client/useDictionaryDynamic.d.ts.map +1 -0
  128. package/dist/{client → types/client}/useIntlayer.d.ts +9 -4
  129. package/dist/types/client/useIntlayer.d.ts.map +1 -0
  130. package/dist/{client → types/client}/useLocale.d.ts +14 -10
  131. package/dist/types/client/useLocale.d.ts.map +1 -0
  132. package/dist/types/client/useLocaleStorage.d.ts +37 -0
  133. package/dist/types/client/useLocaleStorage.d.ts.map +1 -0
  134. package/dist/{client → types/client}/useRewriteURL.d.ts +5 -1
  135. package/dist/types/client/useRewriteURL.d.ts.map +1 -0
  136. package/dist/{editor → types/editor}/useEditor.d.ts +5 -1
  137. package/dist/types/editor/useEditor.d.ts.map +1 -0
  138. package/dist/types/format/index.d.ts +10 -0
  139. package/dist/types/format/useCompact.d.ts +7 -0
  140. package/dist/types/format/useCompact.d.ts.map +1 -0
  141. package/dist/types/format/useCurrency.d.ts +7 -0
  142. package/dist/types/format/useCurrency.d.ts.map +1 -0
  143. package/dist/types/format/useDate.d.ts +10 -0
  144. package/dist/types/format/useDate.d.ts.map +1 -0
  145. package/dist/{format → types/format}/useIntl.d.ts +10 -5
  146. package/dist/types/format/useIntl.d.ts.map +1 -0
  147. package/dist/types/format/useList.d.ts +7 -0
  148. package/dist/types/format/useList.d.ts.map +1 -0
  149. package/dist/types/format/useNumber.d.ts +10 -0
  150. package/dist/types/format/useNumber.d.ts.map +1 -0
  151. package/dist/types/format/usePercentage.d.ts +7 -0
  152. package/dist/types/format/usePercentage.d.ts.map +1 -0
  153. package/dist/types/format/useRelativeTime.d.ts +7 -0
  154. package/dist/types/format/useRelativeTime.d.ts.map +1 -0
  155. package/dist/types/format/useUnit.d.ts +7 -0
  156. package/dist/types/format/useUnit.d.ts.map +1 -0
  157. package/dist/types/getDictionary.d.ts +9 -0
  158. package/dist/types/getDictionary.d.ts.map +1 -0
  159. package/dist/types/getIntlayer.d.ts +8 -0
  160. package/dist/types/getIntlayer.d.ts.map +1 -0
  161. package/dist/types/html/HTMLRenderer.d.ts +21 -0
  162. package/dist/types/html/HTMLRenderer.d.ts.map +1 -0
  163. package/dist/types/html/index.d.ts +4 -0
  164. package/dist/{html → types/html}/installIntlayerHTML.d.ts +18 -13
  165. package/dist/types/html/installIntlayerHTML.d.ts.map +1 -0
  166. package/dist/{html → types/html}/types.d.ts +12 -14
  167. package/dist/types/html/types.d.ts.map +1 -0
  168. package/dist/types/index.d.ts +20 -0
  169. package/dist/types/index.d.ts.map +1 -0
  170. package/dist/types/markdown/MarkdownRenderer.d.ts +32 -0
  171. package/dist/types/markdown/MarkdownRenderer.d.ts.map +1 -0
  172. package/dist/types/markdown/compiler.d.ts +23 -0
  173. package/dist/types/markdown/compiler.d.ts.map +1 -0
  174. package/dist/types/markdown/index.d.ts +4 -0
  175. package/dist/types/markdown/installIntlayerMarkdown.d.ts +71 -0
  176. package/dist/types/markdown/installIntlayerMarkdown.d.ts.map +1 -0
  177. package/dist/types/markdown/runtime.d.ts +16 -0
  178. package/dist/types/markdown/runtime.d.ts.map +1 -0
  179. package/dist/types/plugins.d.ts +80 -0
  180. package/dist/types/plugins.d.ts.map +1 -0
  181. package/dist/types/renderIntlayerNode.d.ts +31 -0
  182. package/dist/types/renderIntlayerNode.d.ts.map +1 -0
  183. package/package.json +10 -13
  184. package/dist/client/index.d.ts +0 -7
  185. package/dist/client/useLocaleStorage.d.ts +0 -31
  186. package/dist/format/index.d.ts +0 -9
  187. package/dist/format/useCompact.d.ts +0 -2
  188. package/dist/format/useCurrency.d.ts +0 -2
  189. package/dist/format/useDate.d.ts +0 -5
  190. package/dist/format/useList.d.ts +0 -2
  191. package/dist/format/useNumber.d.ts +0 -5
  192. package/dist/format/usePercentage.d.ts +0 -2
  193. package/dist/format/useRelativeTime.d.ts +0 -2
  194. package/dist/format/useUnit.d.ts +0 -2
  195. package/dist/getDictionary.d.ts +0 -4
  196. package/dist/getIntlayer.d.ts +0 -3
  197. package/dist/html/HTMLRenderer.d.ts +0 -14
  198. package/dist/html/index.d.ts +0 -3
  199. package/dist/index.d.ts +0 -11
  200. package/dist/installIntlayer-C99qMzFH.mjs +0 -47
  201. package/dist/installIntlayer-_1cC62gP.js +0 -1
  202. package/dist/markdown/MarkdownRenderer.d.ts +0 -22
  203. package/dist/markdown/compiler.d.ts +0 -19
  204. package/dist/markdown/index.d.ts +0 -3
  205. package/dist/markdown/installIntlayerMarkdown.d.ts +0 -70
  206. package/dist/markdown/runtime.d.ts +0 -12
  207. package/dist/plugins-Cv8sSUPw.js +0 -1
  208. package/dist/plugins.d.ts +0 -78
  209. package/dist/renderIntlayerNode.d.ts +0 -22
@@ -1,19 +1,39 @@
1
- import { compileMarkdown as e } from "./compiler.mjs";
2
- import { useMarkdown as t } from "./installIntlayerMarkdown.mjs";
1
+ import { compileMarkdown } from "./compiler.mjs";
2
+ import { useMarkdown } from "./installIntlayerMarkdown.mjs";
3
+
3
4
  //#region src/markdown/MarkdownRenderer.ts
4
- var n = (t, { forceBlock: n, forceInline: r, preserveFrontmatter: i, tagfilter: a } = {}) => e(t, {
5
- forceBlock: n,
6
- forceInline: r,
7
- preserveFrontmatter: i,
8
- tagfilter: a
9
- }), r = (e = {}) => {
10
- let n = t();
11
- return (t) => n.renderMarkdown(t, {
12
- forceBlock: e.forceBlock,
13
- forceInline: e.forceInline,
14
- preserveFrontmatter: e.preserveFrontmatter,
15
- tagfilter: e.tagfilter
16
- }, e.components, e.wrapper);
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 { n as renderMarkdown, r as useMarkdownRenderer };
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 e from "./runtime.mjs";
2
- import { RuleType as t, compileWithOptions as n, sanitizer as r, slugify as i } from "@intlayer/core/markdown";
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
- var a = (t = "", r = {}) => n(t, e, r), o = a, s = a;
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 { t as RuleType, s as compile, a as compileMarkdown, o as compiler, r as sanitizer, i as slugify };
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 as e } from "./compiler.mjs";
2
- import { installIntlayerMarkdown as t, installIntlayerMarkdownDynamic as n, useMarkdown as r } from "./installIntlayerMarkdown.mjs";
3
- import { renderMarkdown as i, useMarkdownRenderer as a } from "./MarkdownRenderer.mjs";
4
- export { e as compileMarkdown, t as installIntlayerMarkdown, n as installIntlayerMarkdownDynamic, i as renderMarkdown, r as useMarkdown, a as useMarkdownRenderer };
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 as e } from "./compiler.mjs";
1
+ import { compileMarkdown } from "./compiler.mjs";
2
+
2
3
  //#region src/markdown/installIntlayerMarkdown.ts
3
- var t = null, n = (e, n) => t || (t = {
4
- components: n,
5
- renderMarkdown: e
6
- }, t), r = (t) => {
7
- let r, i;
8
- if (typeof t == "function") r = t;
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
- let { components: n, wrapper: a, forceBlock: o, forceInline: s, preserveFrontmatter: c, tagfilter: l, renderMarkdown: u } = t ?? {};
11
- if (i = n, u) r = u;
34
+ const { components, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter, renderMarkdown: customRender } = pluginOptions ?? {};
35
+ providerComponents = components;
36
+ if (customRender) renderMarkdown = customRender;
12
37
  else {
13
- let t = {
14
- forceBlock: o,
15
- forceInline: s,
16
- preserveFrontmatter: c,
17
- tagfilter: l
38
+ const internalOptions = {
39
+ forceBlock,
40
+ forceInline,
41
+ preserveFrontmatter,
42
+ tagfilter
18
43
  };
19
- r = (n, r, i, a) => e(n, {
20
- ...t,
21
- forceBlock: r?.forceBlock ?? t.forceBlock,
22
- forceInline: r?.forceInline ?? t.forceInline,
23
- preserveFrontmatter: r?.preserveFrontmatter ?? t.preserveFrontmatter,
24
- tagfilter: r?.tagfilter ?? t.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 n(r, i);
29
- }, i = () => t || { renderMarkdown: (t) => e(t) }, a = async (e) => t || r(await e());
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 { n as createIntlayerMarkdownClient, r as installIntlayerMarkdown, a as installIntlayerMarkdownDynamic, i as useMarkdown };
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
- var e = new Set([
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
- ]), t = (e) => e ? Object.entries(e).filter(([, e]) => e != null).map(([e, t]) => typeof t == "boolean" ? t ? e : "" : e === "_innerHTML" ? "" : `${e}="${String(t).replace(/&/g, "&amp;").replace(/"/g, "&quot;")}"`).filter(Boolean).join(" ") : "", n = "__vanilla_fragment__", r = {
18
- createElement: (r, i, ...a) => {
19
- let o = a.flat(Infinity).join("");
20
- if (r === n) return o;
21
- if (typeof r == "string") {
22
- let n = t(i), a = n ? ` ${n}` : "", s = i?._innerHTML;
23
- return e.has(r) ? `<${r}${a}>` : s === void 0 ? `<${r}${a}>${o}</${r}>` : `<${r}${a}>${s}</${r}>`;
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, "&amp;").replace(/"/g, "&quot;")}"`;
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 r == "function") try {
26
- let e = r({
27
- ...i,
28
- children: o
42
+ if (typeof type === "function") try {
43
+ const result = type({
44
+ ...props,
45
+ children: childStr
29
46
  });
30
- return typeof e == "string" ? e : o;
47
+ return typeof result === "string" ? result : childStr;
31
48
  } catch {
32
- return o;
49
+ return childStr;
33
50
  }
34
- return o;
51
+ return childStr;
52
+ },
53
+ cloneElement: (element, _props, ..._children) => {
54
+ return typeof element === "string" ? element : String(element ?? "");
35
55
  },
36
- cloneElement: (e, t, ...n) => typeof e == "string" ? e : String(e ?? ""),
37
- Fragment: n,
38
- normalizeProps: (e, t) => {
39
- let n = {};
40
- for (let [e, r] of Object.entries(t)) e === "className" ? n.class = r : e === "htmlFor" ? n.for = r : e === "dangerouslySetInnerHTML" && r?.__html ? n._innerHTML = r.__html : n[e] = r;
41
- return n;
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 { i as createVanillaRuntime, r as default, r as vanillaRuntime };
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, '&amp;').replace(/\"/g, '&quot;')}\"`;\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"}