Author:
    Creation:2025-02-07Last update:2026-05-19

    Markdown / рд░рд┐рдЪ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА

    Intlayer Markdown рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░рд┐рдЪ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдмреНрд▓реЙрдЧ, рд▓реЗрдЦ рдЖрджрд┐ рдЬреИрд╕реА рд╕рдореГрджреНрдз-рд╕реНрд╡рд░реВрдкрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

    Markdown рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рд┐рдд рдХрд░рдирд╛

    рдЖрдк md рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ (рдпрджрд┐ рдЗрд╕рдореЗрдВ Markdown рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ) Markdown рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

    рд╕рдВрд╕реНрдХрд░рдг 8.10.0 рд╕реЗ, рдЖрдк рд╕реАрдзреЗ .content.md рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ Markdown рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Intlayer рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ Markdown рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛ред

    markdown-file.en.content.md
    ---
    key: my-markdown-content
    description: рдореЗрд░реА рд╕рд╛рдордЧреНрд░реА
    locale: en
    ---
    
    # рдореЗрд░реА рд╕рд╛рдордЧреНрд░реА
    
    рдпрд╣рд╛рдБ рдПрдХ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╕рд╛рдордЧреНрд░реА рдЙрджрд╛рд╣рд░рдг рд╣реИ
    

    locale рдлреНрд░рдВрдЯ-рдореИрдЯрд░ рдлрд╝реАрд▓реНрдб рд╡рд╣ рдлрд╝реАрд▓реНрдб рд╣реИ рдЬреЛ рд╕рд╛рдордЧреНрд░реА рд╕реНрдерд╛рдиреАрдп (locale) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрджрд┐ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Intlayer рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд╛рдиреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд╛рдиреАрдп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреБрд╡рд╛рдж рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдлрд╝реЙрд▓рдмреИрдХ рд╕реНрдерд╛рдиреАрдп рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдЙрджрд╛рд╣рд░рдг:

    text
    content
    тФЬтФАтФА markdown-file.en.content.md
    тФЬтФАтФА markdown-file.fr.content.md
    тФФтФАтФА markdown-file.es.content.md
    

    рдЖрдк рдлреНрд░рдВрдЯ-рдореИрдЯрд░ рдореЗрдВ рдбрд┐рдХреНрд╢рдирд░реА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛрдИ рднреА рдЧреБрдг рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ

    Markdown рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП md рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ Markdown рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдП, рднрд▓реЗ рд╣реА рдЙрд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рди рд╣реЛред

    markdownDictionary.content.ts
    import { md, type Dictionary } from "intlayer";
    
    const markdownDictionary = {
    key: "app",
    content: {
      myMarkdownContent: md("## рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ \n\nLorem Ipsum"),
    },
    } satisfies Dictionary;
    
    export default markdownDictionary;
    

    file рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ .md рдлрд╝рд╛рдЗрд▓реЗрдВ рдЖрдпрд╛рдд рдХрд░реЗрдВред

    markdownDictionary.content.ts
    import { md, file, t } from "intlayer";
    
    export default {
    key: "app",
    content: {
      content: t({
        en: md(file("./myMarkdown.en.md")),
        hi: md(file("./myMarkdown.hi.md")),
      }),
    },
    };
    

    рдпрджрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп Markdown рд╕рдВрдХреЗрддрдХ (рдЬреИрд╕реЗ рд╣реЗрдбрд┐рдВрдЧ, рд▓рд┐рд╕реНрдЯ, рд▓рд┐рдВрдХ рдЖрджрд┐) рд╣реИрдВ, рддреЛ Intlayer рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛ред

    markdownDictionary.content.ts
    export default {
    key: "app",
    contentAutoTransformation: true, // Markdown рд╕рд╛рдордЧреНрд░реА рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд╣рдЪрд╛рди рд╕рдХреНрд╖рдо рдХрд░реЗрдВ - intlayer.config.ts рдореЗрдВ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
    content: {
      myMarkdownContent: "## рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ \n\nLorem Ipsum",
    },
    };
    

    Markdown рд░реЗрдВрдбрд░рд┐рдВрдЧ

    Intlayer Markdown рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

    1. useIntlayer рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ тАФ Intlayer рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ md рдиреЛрдб рдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдореВрд▓ рдЖрдЙрдЯрдкреБрдЯ (JSX, VNode, HTML рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

      • рдлреНрд░рдВрдЯрдореИрдЯрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ .metadata рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рджреЛ рд╕реНрддрд░реЛрдВ рдкрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ тАФ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ MarkdownProvider (рдпрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдорддреБрд▓реНрдп) рдХреЗ рд╕рд╛рде рдФрд░ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдкреНрд░рддрд┐ рдиреЛрдб .use() рдХреЗ рд╕рд╛рдеред рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; .use(), MarkdownProvider рдкрд░ рдкреВрд░реНрд╡рддрд╛ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд░ рдкреВрд░реНрд╡рддрд╛ рд▓реЗрддрд╛ рд╣реИред
    2. рд╣реЗрд▓реНрдкрд░ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ тАФ <MarkdownRenderer />, useMarkdownRenderer(), рдФрд░ renderMarkdown() рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдЯреВрд▓ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдХрдЪреНрдЪреЗ Markdown рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ useIntlayer рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдЬрд╛рдП рдЧрдП рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

    Markdown рд░реЗрдВрдбрд░рд┐рдВрдЧ MDX рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ тАФ рдЕрдкрдиреЗ Markdown рдХреЗ рдЕрдВрджрд░ рд╕реАрдзреЗ рдирд╛рдо рд╕реЗ рдХрд┐рд╕реА рднреА JSX/рдлреНрд░реЗрдорд╡рд░реНрдХ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

    1. рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реЗрдВрдбрд░рд┐рдВрдЧ (useIntlayer рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)

    Markdown рдиреЛрдбреНрд╕ рдХреЛ рд╕реАрдзреЗ JSX рдХреЗ рд░реВрдк рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

    App.tsx
    import { useIntlayer } from "react-intlayer";
    import { MarkdownProvider } from "react-intlayer/markdown";
    
    const AppContent = () => {
    const { myMarkdownContent } = useIntlayer("app");
    
    return <div>{myMarkdownContent}</div>;
    };
    
    const App = () => (
    <MarkdownProvider
      components={{
        h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
        MyButton: (props) => <button {...props} />, // MDX рдШрдЯрдХ
      }}
    >
      <AppContent />
    </MarkdownProvider>
    );
    
    рдпрджрд┐ MarkdownProvider рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ Intlayer рдбрд┐рдлрд╝реЙрд▓реНрдЯ Markdown рд╕реЗ JSX рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ред

    рдЖрдк .use() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдУрд╡рд░рд░рд╛рдЗрдб рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.use({
    h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
    })}
    

    рдЖрдк Markdown рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.value}
    {String(myMarkdownContent)}
    {myMarkdownContent.toString()}
    

    рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.metadata}
    {myMarkdownContent.metadata.title}
    

    Markdown рдиреЛрдбреНрд╕ рдХреЛ рд╕реАрдзреЗ JSX рдХреЗ рд░реВрдк рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

    App.tsx
    import { useIntlayer } from "next-intlayer";
    import { MarkdownProvider } from "next-intlayer/markdown";
    
    const AppContent = () => {
    const { myMarkdownContent } = useIntlayer("app");
    
    return <div>{myMarkdownContent}</div>;
    };
    
    const App = () => (
    <MarkdownProvider
      components={{
        h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
        MyButton: (props) => <button {...props} />, // MDX рдШрдЯрдХ
      }}
    >
      <AppContent />
    </MarkdownProvider>
    );
    
    рдпрджрд┐ MarkdownProvider рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ Intlayer рдбрд┐рдлрд╝реЙрд▓реНрдЯ Markdown рд╕реЗ JSX рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ред

    рдЖрдк .use() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдУрд╡рд░рд░рд╛рдЗрдб рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.use({
    h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
    })}
    

    рдЖрдк Markdown рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.value}
    {String(myMarkdownContent)}
    {myMarkdownContent.toString()}
    

    рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.metadata}
    {myMarkdownContent.metadata.title}
    

    Vue рдореЗрдВ, Markdown рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд component рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рд╕реАрдзреЗ рдПрдХ рдиреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

    App.vue
    <script setup>
    import { useIntlayer } from "vue-intlayer";
    const { myMarkdownContent } = useIntlayer("app");
    </script>
    
    <template>
    <component :is="myMarkdownContent" />
    </template>
    

    intlayerMarkdown рдкреНрд▓рдЧрдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ (MDX рдХрд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ):

    main.ts
    import { intlayerMarkdown } from "vue-intlayer/markdown";
    
    app.use(intlayerMarkdown, {
    components: {
      h1: (props) => h('h1', { style: { color: 'green' } }, props.children),
      MyButton: (props) => h('button', props), // MDX рдШрдЯрдХ
    },
    });
    
    рдпрджрд┐ intlayerMarkdown рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ Intlayer рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ред

    рдЖрдк .use() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдУрд╡рд░рд░рд╛рдЗрдб рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    vue
    <component :is="myMarkdownContent.use({
    h1: (props) => h('h1', { style: { color: 'red' } }, props.children),
    })" />
    

    рдЖрдк Markdown рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    vue
    {{ myMarkdownContent.value }}
    {{ String(myMarkdownContent) }}
    {{ myMarkdownContent.toString() }}
    

    рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

    vue
    <component :is="myMarkdownContent.metadata" />
    <component :is="myMarkdownContent.metadata.title" />
    

    Svelte рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Markdown рдХреЛ рдПрдХ HTML рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП {@html} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

    App.svelte
    <script lang="ts">
    import { useIntlayer } from "svelte-intlayer";
    import { MarkdownProvider } from "svelte-intlayer/markdown";
    import MyHeading from "./MyHeading.svelte";
    
    const content = useIntlayer("app");
    </script>
    
    <MarkdownProvider components={{ h1: MyHeading }}>
    {@html $content.myMarkdownContent}
    </MarkdownProvider>
    
    рдпрджрд┐ MarkdownProvider рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ Intlayer рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ред

    рдЖрдк .use() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдУрд╡рд░рд░рд╛рдЗрдб рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    svelte
    {@html $content.myMarkdownContent.use({ ... })}
    

    рдЖрдк Markdown рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    svelte
    {$content.myMarkdownContent.value}
    {String($content.myMarkdownContent)}
    {$content.myMarkdownContent.toString()}
    

    рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

    svelte
    {$content.myMarkdownContent.metadata}
    {$content.myMarkdownContent.metadata.title}
    

    Preact, JSX рдореЗрдВ рд╕реАрдзреЗ Markdown рдиреЛрдбреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

    App.tsx
    import { useIntlayer } from "preact-intlayer";
    import { MarkdownProvider } from "preact-intlayer/markdown";
    
    const AppContent = () => {
    const { myMarkdownContent } = useIntlayer("app");
    return <div>{myMarkdownContent}</div>;
    };
    
    const App = () => (
    <MarkdownProvider
      components={{
        h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
        MyButton: (props) => <button {...props} />, // MDX рдШрдЯрдХ
      }}
    >
      <AppContent />
    </MarkdownProvider>
    );
    
    рдпрджрд┐ MarkdownProvider рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ Intlayer рдбрд┐рдлрд╝реЙрд▓реНрдЯ Markdown рд╕реЗ JSX рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ред

    рдЖрдк .use() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдУрд╡рд░рд░рд╛рдЗрдб рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.use({
    h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
    })}
    

    рдЖрдк Markdown рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.value}
    {String(myMarkdownContent)}
    {myMarkdownContent.toString()}
    

    рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.metadata}
    {myMarkdownContent.metadata.title}
    

    Solid, JSX рдореЗрдВ рд╕реАрдзреЗ Markdown рдиреЛрдбреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

    App.tsx
    import { useIntlayer } from "solid-intlayer";
    import { MarkdownProvider } from "solid-intlayer/markdown";
    
    const AppContent = () => {
    const { myMarkdownContent } = useIntlayer("app");
    return <div>{myMarkdownContent}</div>;
    };
    
    const App = () => (
    <MarkdownProvider
      components={{
        h1: (props) => <h1 style={{ color: "red" }}>{props.children}</h1>,
        MyButton: (props) => <button {...props} />, // MDX рдШрдЯрдХ
      }}
    >
      <AppContent />
    </MarkdownProvider>
    );
    
    рдпрджрд┐ MarkdownProvider рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ Intlayer рдбрд┐рдлрд╝реЙрд▓реНрдЯ Markdown рд╕реЗ JSX рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ред

    рдЖрдк .use() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдУрд╡рд░рд░рд╛рдЗрдб рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.use({
    h1: (props) => <h1 style={{ color: "red" }}>{props.children}</h1>,
    })}
    

    рдЖрдк Markdown рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.value}
    {String(myMarkdownContent)}
    {myMarkdownContent.toString()}
    

    рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

    tsx
    {myMarkdownContent.metadata}
    {myMarkdownContent.metadata.title}
    

    Angular, Markdown рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [innerHTML] рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

    app.component.ts
    import { Component } from "@angular/core";
    import { useIntlayer } from "angular-intlayer";
    
    @Component({
    selector: "app-root",
    template: `<div [innerHTML]="content().myMarkdownContent"></div>`,
    })
    export class AppComponent {
    content = useIntlayer("app");
    }
    
    рдпрджрд┐ IntlayerMarkdown рдкреНрд░рджрд╛рддрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ Intlayer рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдВрдбрд░ рдХрд░реЗрдЧрд╛ред

    рдЖрдк .use() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдУрд╡рд░рд░рд╛рдЗрдб рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    typescript
    content().myMarkdownContent.use({
    h1: { class: "text-3xl font-bold" },
    })
    

    рдЖрдк Markdown рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    typescript
    content().myMarkdownContent.value
    String(content().myMarkdownContent)
    content().myMarkdownContent.toString()
    

    рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

    typescript
    content().myMarkdownContent.metadata
    content().myMarkdownContent.metadata.title
    

    2. рд╣реЗрд▓реНрдкрд░ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ (рдХреЗрд╡рд▓ Markdown рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕)

    рдпреЗ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ рдХреЗрд╡рд▓ рдХрдЪреНрдЪреЗ Markdown рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддреА рд╣реИрдВ рдФрд░ useIntlayer рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред рдЬрдм рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбрд┐рдХреНрд╢рдирд░реА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ Markdown рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рддреЛ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

    <MarkdownRenderer /> рдШрдЯрдХ

    рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ Markdown рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИред

    tsx
    import { MarkdownRenderer } from "react-intlayer/markdown";
    
    <MarkdownRenderer forceBlock={true} tagfilter={true}>
    {"# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ"}
    </MarkdownRenderer>
    

    useMarkdownRenderer() рд╣реБрдХ

    рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд░реЗрдВрдбрд░рд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

    tsx
    import { useMarkdownRenderer } from "react-intlayer/markdown";
    
    const renderMarkdown = useMarkdownRenderer({
    forceBlock: true,
    components: { h1: (props) => <h1 {...props} className="custom" /> }
    });
    
    return renderMarkdown("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ");
    

    renderMarkdown() рдЙрдкрдпреЛрдЧрд┐рддрд╛

    рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд╣рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ред

    tsx
    import { renderMarkdown } from "react-intlayer/markdown";
    
    const jsx = renderMarkdown("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ", { forceBlock: true });
    

    <MarkdownRenderer /> рдШрдЯрдХ

    рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ Markdown рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИред

    tsx
    import { MarkdownRenderer } from "next-intlayer/markdown";
    
    <MarkdownRenderer forceBlock={true} tagfilter={true}>
    {"# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ"}
    </MarkdownRenderer>
    

    useMarkdownRenderer() рд╣реБрдХ

    рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд░реЗрдВрдбрд░рд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

    tsx
    import { useMarkdownRenderer } from "next-intlayer/markdown";
    
    const renderMarkdown = useMarkdownRenderer({
    forceBlock: true,
    components: { h1: (props) => <h1 {...props} className="custom" /> }
    });
    
    return renderMarkdown("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ");
    

    renderMarkdown() рдЙрдкрдпреЛрдЧрд┐рддрд╛

    рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд╣рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ред

    tsx
    import { renderMarkdown } from "next-intlayer/markdown";
    
    const jsx = renderMarkdown("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ", { forceBlock: true });
    

    <MarkdownRenderer /> рдШрдЯрдХ

    vue
    <script setup>
    import { MarkdownRenderer } from "vue-intlayer/markdown";
    </script>
    
    <template>
    <MarkdownRenderer :forceBlock="true" content="# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ" />
    </template>
    

    <MarkdownRenderer /> рдШрдЯрдХ

    svelte
    <script lang="ts">
    import { MarkdownRenderer } from "svelte-intlayer/markdown";
    </script>
    
    <MarkdownRenderer forceBlock={true} value="# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ" />
    

    useMarkdownRenderer() рд╣реБрдХ

    svelte
    <script lang="ts">
    import { useMarkdownRenderer } from "svelte-intlayer/markdown";
    const render = useMarkdownRenderer();
    </script>
    
    {@html render("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ")}
    

    renderMarkdown() рдЙрдкрдпреЛрдЧрд┐рддрд╛

    svelte
    <script lang="ts">
    import { renderMarkdown } from "svelte-intlayer/markdown";
    </script>
    
    {@html renderMarkdown("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ")}
    

    <MarkdownRenderer /> рдШрдЯрдХ

    tsx
    import { MarkdownRenderer } from "preact-intlayer/markdown";
    
    <MarkdownRenderer forceBlock={true}>
    {"# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ"}
    </MarkdownRenderer>
    

    useMarkdownRenderer() рд╣реБрдХ

    tsx
    import { useMarkdownRenderer } from "preact-intlayer/markdown";
    
    const render = useMarkdownRenderer();
    
    return <div>{render("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ")}</div>;
    

    renderMarkdown() рдЙрдкрдпреЛрдЧрд┐рддрд╛

    tsx
    import { renderMarkdown } from "preact-intlayer/markdown";
    
    return <div>{renderMarkdown("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ")}</div>;
    

    <MarkdownRenderer /> рдШрдЯрдХ

    tsx
    import { MarkdownRenderer } from "solid-intlayer/markdown";
    
    <MarkdownRenderer forceBlock={true}>
    {"# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ"}
    </MarkdownRenderer>
    

    useMarkdownRenderer() рд╣реБрдХ

    tsx
    import { useMarkdownRenderer } from "solid-intlayer/markdown";
    
    const render = useMarkdownRenderer();
    
    return <div>{render("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ")}</div>;
    

    renderMarkdown() рдЙрдкрдпреЛрдЧрд┐рддрд╛

    tsx
    import { renderMarkdown } from "solid-intlayer/markdown";
    
    return <div>{renderMarkdown("# рдореЗрд░рд╛ рд╢реАрд░реНрд╖рдХ")}</div>;
    

    IntlayerMarkdownService рд╕реЗрд╡рд╛

    рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ Markdown рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИред

    typescript
    import { IntlayerMarkdownService } from "angular-intlayer/markdown";
    
    export class MyComponent {
    constructor(private markdownService: IntlayerMarkdownService) {}
    
    renderMarkdown(markdown: string) {
      return this.markdownService.renderMarkdown(markdown);
    }
    }
    

    MarkdownProvider рдХреЗ рд╕рд╛рде рдЧреНрд▓реЛрдмрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди

    MarkdownProvider (рдпрд╛ рдЗрд╕рдХреЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдорддреБрд▓реНрдп) рдЖрдкрдХреЗ рд╕рдВрдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП Markdown рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд useIntlayer рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рд╣реЗрд▓реНрдкрд░ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ рджреЛрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВ тАФ .use() рдЙрдиреНрд╣реЗрдВ рдиреЛрдб рд╕реНрддрд░ рдкрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред

    AppProvider.tsx
    import { MarkdownProvider } from "react-intlayer/markdown";
    
    export const AppProvider = ({ children }) => (
    <MarkdownProvider
      components={{
        h1: (props) => <h1 style={{color: 'green'}} {...props} />,
        a: ({ href, ...props }) => <a style={{color: 'red'}} {...props} />,
        MyCustomJSXComponent: (props) => <span style={{color: 'red'}} {...props} />,
      }}
    >
      {children}
    </MarkdownProvider>
    );
    
    MDX рд╕рдорд░реНрдерд┐рдд рд╣реИ тАФ рдЖрдкрдХреЗ Markdown рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдирд╛рдо (рдЙрджрд╛. <MyCustomJSXComponent />) рдХреЛ components рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд░реЗрдВрдбрд░рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    AppProvider.tsx
    import { MarkdownProvider } from "react-intlayer/markdown";
    
    export const AppProvider = ({ children }) => (
    <MarkdownProvider
      renderMarkdown={async (md) => {
        // Use dynamic import to reduce the bundle size of your application
        const { renderMarkdown } = await import('react-intlayer/markdown');
        return renderMarkdown(md);
      }}
    >
      {children}
    </MarkdownProvider>
    );
    
    рдЕрдкрдиреЗ Markdown рд░реЗрдВрдбрд░рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред
    AppProvider.tsx
    import { MarkdownProvider } from "next-intlayer/markdown";
    
    export const AppProvider = ({ children }) => (
    <MarkdownProvider
      components={{
        h1: (props) => <h1 style={{color: 'green'}} {...props} />,
        a: ({ href, ...props }) => <a style={{color: 'red'}} {...props} />,
        MyCustomJSXComponent: (props) => <span style={{color: 'red'}} {...props} />,
      }}
    >
      {children}
    </MarkdownProvider>
    );
    
    MDX рд╕рдорд░реНрдерд┐рдд рд╣реИ тАФ рдЖрдкрдХреЗ Markdown рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдирд╛рдо (рдЙрджрд╛. <MyCustomJSXComponent />) рдХреЛ components рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд░реЗрдВрдбрд░рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    AppProvider.tsx
    import { MarkdownProvider } from "next-intlayer/markdown";
    
    export const AppProvider = ({ children }) => (
    <MarkdownProvider
      renderMarkdown={async (md) => {
        // Use dynamic import to reduce the bundle size of your application
        const { renderMarkdown } = await import('next-intlayer/markdown');
        return renderMarkdown(md);
      }}
    >
      {children}
    </MarkdownProvider>
    );
    
    рдЕрдкрдиреЗ Markdown рд░реЗрдВрдбрд░рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред
    main.ts
    import { createApp } from "vue";
    import { intlayer } from "vue-intlayer";
    import { intlayerMarkdown } from "vue-intlayer/markdown";
    import App from "./App.vue";
    
    const app = createApp(App);
    
    app.use(intlayer);
    app.use(intlayerMarkdown, {
    components: {
      h1: (props) =>
      h('h1', { style: { color: 'orange' }, ...props }, props.children),
      ComponentDemo: () => h('div', { style: { background: 'grey' } }, 'DEMO'),
      bold: (props) => h('strong', props),
      code: (props) => h('code', props),
    },
    });
    
    app.mount("#app");
    
    MDX рд╕рдорд░реНрдерд┐рдд рд╣реИ тАФ рдЖрдкрдХреЗ Markdown рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдирд╛рдо (рдЙрджрд╛. <MyCustomJSXComponent />) рдХреЛ components рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд░реЗрдВрдбрд░рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    main.ts
    import { createApp } from "vue";
    import { intlayer } from "vue-intlayer";
    import { intlayerMarkdown } from "vue-intlayer/markdown";
    import App from "./App.vue";
    
    const app = createApp(App);
    
    app.use(intlayer);
    app.use(intlayerMarkdown, {
    renderMarkdown: async (md) => {
      const { renderMarkdown } = await import('vue-intlayer/markdown');
      return renderMarkdown(md);
    },
    });
    
    app.mount("#app");
    
    рдЕрдкрдиреЗ Markdown рд░реЗрдВрдбрд░рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред
    App.svelte
    <script lang="ts">
    import { MarkdownProvider } from "svelte-intlayer/markdown";
    import MyHeading from "./MyHeading.svelte";
    </script>
    
    <MarkdownProvider
    components={{
      h1: MyHeading,
    }}
    >
    <slot />
    </MarkdownProvider>
    
    MDX рд╕рдорд░реНрдерд┐рдд рд╣реИ тАФ рдЖрдкрдХреЗ Markdown рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдирд╛рдо (рдЙрджрд╛. <MyCustomJSXComponent />) рдХреЛ components рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд░реЗрдВрдбрд░рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    App.svelte
    <script lang="ts">
    import { MarkdownProvider } from "svelte-intlayer/markdown";
    </script>
    
    <MarkdownProvider
    renderMarkdown={async (md) => {
      const { renderMarkdown } = await import('svelte-intlayer/markdown');
      return renderMarkdown(md);
    }}
    >
    <slot />
    </MarkdownProvider>
    
    рдЕрдкрдиреЗ Markdown рд░реЗрдВрдбрд░рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред
    AppProvider.tsx
    import { MarkdownProvider } from "preact-intlayer/markdown";
    
    export const AppProvider = ({ children }) => (
    <MarkdownProvider
      components={{
        h1: ({ children }) => <h1 className="text-2xl font-bold">{children}</h1>,
      }}
    >
      {children}
    </MarkdownProvider>
    );
    
    MDX рд╕рдорд░реНрдерд┐рдд рд╣реИ тАФ рдЖрдкрдХреЗ Markdown рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдирд╛рдо (рдЙрджрд╛. <MyCustomJSXComponent />) рдХреЛ components рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд░реЗрдВрдбрд░рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    AppProvider.tsx
    import { MarkdownProvider } from "preact-intlayer/markdown";
    
    export const AppProvider = ({ children }) => (
    <MarkdownProvider
      renderMarkdown={async (md) => {
        const { renderMarkdown } = await import('preact-intlayer/markdown');
        return renderMarkdown(md);
      }}
    >
      {children}
    </MarkdownProvider>
    );
    
    рдЕрдкрдиреЗ Markdown рд░реЗрдВрдбрд░рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред
    AppProvider.tsx
    import { MarkdownProvider } from "solid-intlayer/markdown";
    
    export const AppProvider = (props) => (
    <MarkdownProvider
      components={{
        h1: (props) => <h1 className="text-2xl font-bold">{props.children}</h1>,
      }}
    >
      {props.children}
    </MarkdownProvider>
    );
    
    MDX рд╕рдорд░реНрдерд┐рдд рд╣реИ тАФ рдЖрдкрдХреЗ Markdown рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдирд╛рдо (рдЙрджрд╛. <MyCustomJSXComponent />) рдХреЛ components рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд░реЗрдВрдбрд░рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    AppProvider.tsx
    import { MarkdownProvider } from "solid-intlayer/markdown";
    
    export const AppProvider = (props) => (
    <MarkdownProvider
      renderMarkdown={async (md) => {
        const { renderMarkdown } = await import('solid-intlayer/markdown');
        return renderMarkdown(md);
      }}
    >
      {props.children}
    </MarkdownProvider>
    );
    
    рдЕрдкрдиреЗ Markdown рд░реЗрдВрдбрд░рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред
    app.config.ts
    import { createIntlayerMarkdownProvider } from "angular-intlayer/markdown";
    
    export const appConfig: ApplicationConfig = {
    providers: [
      createIntlayerMarkdownProvider({
        components: {
          h1: { class: "text-2xl font-bold" },
        },
      }),
    ],
    };
    
    MDX рд╕рдорд░реНрдерд┐рдд рд╣реИ тАФ рдЖрдкрдХреЗ Markdown рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдирд╛рдо (рдЙрджрд╛. <MyCustomJSXComponent />) рдХреЛ components рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд░реЗрдВрдбрд░рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    app.config.ts
    import { createIntlayerMarkdownProvider } from "angular-intlayer/markdown";
    
    export const appConfig: ApplicationConfig = {
    providers: [
      createIntlayerMarkdownProvider({
        renderMarkdown: async (md) => {
          const { renderMarkdown } = await import('angular-intlayer/markdown');
          return renderMarkdown(md);
        },
      }),
    ],
    };
    
    рдЕрдкрдиреЗ Markdown рд░реЗрдВрдбрд░рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред

    рд╕рд╕реНрдкреЗрдВрд╕ (Suspense)

    Intlayer Markdown рд░реЗрдВрдбрд░рд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд╛рд░реНрд╕рд░ рдЪрдВрдХ рд▓рдЧрднрдЧ 55kb рд╣реИред рдЗрд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреГрд╖реНрда рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореЗрдВ рджреЗрд░реА рд╣реЛрддреА рд╣реИ рдФрд░ First Contentful Paint (FCP) рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

    UI рдХреЛ рдмреНрд▓реЙрдХ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, Intlayer React рдХреЗ Suspense API рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рджреМрд░рд╛рди рдПрдХ Promise рдереНрд░реЛ рдХрд░рддрд╛ рд╣реИред

    Intlayer Markdown рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдХреЛ <Suspense> рдмрд╛рдЙрдВрдбреНрд░реА рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред рдпрд╣ рдЪрдВрдХ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдлрд╝реЙрд▓рдмреИрдХ рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЗ рд╢реЗрд╖ DOM рдХреЛ рддреБрд░рдВрдд рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

    рдЪреЗрддрд╛рд╡рдиреА: рдпрджрд┐ рдЖрдк <Suspense> рдмрд╛рдЙрдВрдбреНрд░реА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ 55kb рдЪрдВрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ React рд░реВрдЯ рд╕реНрддрд░ рдкрд░ рдирд┐рд▓рдВрдмрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдкреВрд░реЗ рдШрдЯрдХ рдЯреНрд░реА рдХреЛ рд░реЗрдВрдбрд░ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХ рджреЗрдЧрд╛ред

    Next.js рдРрдк рд░рд╛рдЙрдЯрд░ рдореЗрдВ, рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП React Suspense рдпрд╛ рд╕рд░реНрд╡рд░ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП loading.tsx рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

    рдХреНрд▓рд╛рдЗрдВрдЯ рдШрдЯрдХ:

    components/MyComponent.tsx
    "use client";
    import { useIntlayer } from "next-intlayer";
    import { Suspense } from "react";
    
    const MyComponent = () => {
      const markdownContent = useIntlayer("my-markdown");
    
      return (
        <Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
      );
    };
    

    loading.tsx рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдШрдЯрдХ:

    app/loading.tsx
    export default function Loading() {
      return <div>Loading...</div>;
    }
    
    app/page.tsx
    import { useIntlayer } from "next-intlayer/server";
    
    const MyPage = () => {
      const markdownContent = useIntlayer("my-markdown");
      return <div>{markdownContent}</div>;
    };
    
    export default MyPage;
    
    tsx
    import { useIntlayer } from "react-intlayer";
    import { Suspense } from "react";
    
    const MyComponent = () => {
      const markdownContent = useIntlayer("my-markdown");
    
      return (
        <Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
      );
    };
    

    Vue рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд <Suspense> рдШрдЯрдХ рд╣реИред Markdown рд╕рд╛рдордЧреНрд░реА рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЛ <Suspense> рдмрд╛рдЙрдВрдбреНрд░реА рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред

    MyComponent.vue
    <script setup>
    import { useIntlayer } from "vue-intlayer";
    
    const { markdownContent } = useIntlayer("my-markdown");
    </script>
    
    <template>
      <Suspense>
        <component :is="markdownContent" />
        <template #fallback>
          <div>Loading...</div>
        </template>
      </Suspense>
    </template>
    

    Svelte рдореЗрдВ Suspense API рдХреЗ рд╕рдордХрдХреНрд╖ рдирд╣реАрдВ рд╣реИред Markdown рд╕рд╛рдордЧреНрд░реА рдХреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП {#await} рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

    MyComponent.svelte
    <script lang="ts">
    import { useIntlayer } from "svelte-intlayer";
    
    const content = useIntlayer("my-markdown");
    </script>
    
    {#await $content.markdownContent}
      <div>Loading...</div>
    {:then rendered}
      {@html rendered}
    {/await}
    

    Preact preact/compat рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ React рдХреЗ Suspense API рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

    MyComponent.tsx
    import { useIntlayer } from "preact-intlayer";
    import { Suspense } from "preact/compat";
    
    const MyComponent = () => {
      const markdownContent = useIntlayer("my-markdown");
    
      return (
        <Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
      );
    };
    

    Solid рдХрд╛ рдЕрдкрдирд╛ <Suspense> рдШрдЯрдХ solid-js рд╕реЗ рд╣реИред

    MyComponent.tsx
    import { useIntlayer } from "solid-intlayer";
    import { Suspense } from "solid-js";
    
    const MyComponent = () => {
      const { markdownContent } = useIntlayer("my-markdown");
    
      return (
        <Suspense fallback={<div>Loading...</div>}>{markdownContent}</Suspense>
      );
    };
    

    Angular рдореЗрдВ Suspense API рдирд╣реАрдВ рд╣реИред рд▓реЗрдЬрд╝реА-рд▓реЛрдбреЗрдб Markdown рд╕рд╛рдордЧреНрд░реА (Angular 17+ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП Angular рдХреЗ рдЖрд╕реНрдердЧрд┐рдд рджреГрд╢реНрдп (@defer) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

    my.component.ts
    import { Component } from "@angular/core";
    import { useIntlayer } from "angular-intlayer";
    
    @Component({
      selector: "app-my",
      template: `
        @defer {
          <div [innerHTML]="content().markdownContent"></div>
        } @loading {
          <div>Loading...</div>
        }
      `,
    })
    export class MyComponent {
      content = useIntlayer("my-markdown");
    }
    

    рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ (SSR) рдФрд░ рд╣рд╛рдЗрдбреНрд░реЗрд╢рди

    рдЕрдиреНрдп рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкрд╛рд░реНрд╕рд░ рдЬреИрд╕реЗ remark / rehype рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, Intlayer Markdown рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛-рдореБрдХреНрдд рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рддрдерд╛ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рд╕рд╛рдЗрдб рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

    рд▓реЗрдХрд┐рди Intlayer рдиреЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ (SSR) рдлреНрд░реЗрдорд╡рд░реНрдХ (рдЬреИрд╕реЗ Next.js App Router, React Router, Nuxt, SvelteKit, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

    рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд░реЙ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рднреЗрдЬрдиреЗ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рдЬрд┐рд╕рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИ), Intlayer рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╣реА рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА (AST) рдореЗрдВ рдкреНрд░реА-рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

    рдЖрдк рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдЕрдкрдиреЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ Intlayer рдкреИрдХреЗрдЬ рд╕реЗ parseMarkdown рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрдмрд▓ AST (ParsedMarkdown рдСрдмреНрдЬреЗрдХреНрдЯ) рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдкрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА Intlayer рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ (рдЬреИрд╕реЗ <MarkdownRenderer>, useMarkdownRenderer, рдЖрджрд┐) рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ AST рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрд╛рдзрд╛ рдХреЗ рд░реЗрдВрдбрд░ рдХрд░рддреА рд╣реИрдВред

    рд╕рд░реНрд╡рд░/рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг

    server.ts
    import { parseMarkdown } from "react-intlayer/markdown";
    
    // 1. рд╕рд░реНрд╡рд░ рдкрд░: рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рдПрдХ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрдмрд▓ AST рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
    export const loader = async () => {
    const markdownString = "## My title \n\nLorem Ipsum";
    const ast = parseMarkdown(markdownString);
    
    // AST рдХреЛ JSON рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ
    return Response.json({ content: ast });
    };
    
    client.tsx
    import { useLoaderData } from "react-router";
    import { MarkdownRenderer } from "react-intlayer/markdown";
    
    // 2. рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░: рдмрд┐рдирд╛ рд░реА-рдкрд╛рд░реНрд╕ рдХрд┐рдП рд╕реАрдзреЗ AST рд░реЗрдВрдбрд░ рдХрд░реЗрдВ
    export default function Page() {
    const { content } = useLoaderData();
    
    // рд░реЗрдВрдбрд░рд░ рд░реЙ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП AST рджреЛрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ
    return <MarkdownRenderer content={content} />;
    }
    
    app/page.tsx
    import { parseMarkdown } from "next-intlayer/markdown";
    import { MarkdownRenderer } from "next-intlayer/markdown";
    
    export default async function Page() {
    // 1. рд╕рд░реНрд╡рд░ рдкрд░ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрдмрд▓ AST рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
    const markdownString = "## My title \n\nLorem Ipsum";
    const ast = parseMarkdown(markdownString);
    
    // 2. рд╕реАрдзреЗ AST рдХреЛ рд░реЗрдВрдбрд░ рдХрд░реЗрдВ
    // рд╕рд░реНрд╡рд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ, рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ
    // рддреЛ рд╕реАрдзреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдореЗрдВ AST рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
    return <MarkdownRenderer content={ast} />;
    }
    
    pages/index.vue
    <script setup lang="ts">
    import { parseMarkdown } from "vue-intlayer/markdown";
    import { MarkdownRenderer } from "vue-intlayer/markdown";
    
    // 1. рд╕рд░реНрд╡рд░ рдкрд░ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ AST рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
    const { data: ast } = await useAsyncData('markdown', () => {
    const markdownString = "## My title \n\nLorem Ipsum";
    return parseMarkdown(markdownString);
    });
    </script>
    
    <template>
    <!-- 2. рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░: рдмрд┐рдирд╛ рд░реА-рдкрд╛рд░реНрд╕ рдХрд┐рдП рд╕реАрдзреЗ AST рд░реЗрдВрдбрд░ рдХрд░реЗрдВ -->
    <MarkdownRenderer :content="ast" />
    </template>
    
    +page.server.ts
    import { parseMarkdown } from "svelte-intlayer/markdown";
    
    // 1. рд╕рд░реНрд╡рд░ рдкрд░: рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рдПрдХ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрдмрд▓ AST рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
    export const load = async () => {
    const markdownString = "## My title \n\nLorem Ipsum";
    const ast = parseMarkdown(markdownString);
    
    // AST рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓реМрдЯрд╛рдПрдВ
    return { content: ast };
    };
    
    +page.svelte
    <script lang="ts">
    import { MarkdownRenderer } from "svelte-intlayer/markdown";
    export let data;
    </script>
    
    <!-- 2. рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░: рдмрд┐рдирд╛ рд░реА-рдкрд╛рд░реНрд╕ рдХрд┐рдП рд╕реАрдзреЗ AST рд░реЗрдВрдбрд░ рдХрд░реЗрдВ -->
    <MarkdownRenderer value={data.content} />
    

    Angular SSR рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдб рдХреЗ рджреМрд░рд╛рди рд╕рд░реНрд╡рд░ рдкрд░ рдбреЗрдЯрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╣рд╛рдЗрдбреНрд░реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЖрдк AST рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

    app.resolver.ts
    import { Injectable } from "@angular/core";
    import { Resolve } from "@angular/router";
    import { parseMarkdown, type ParsedMarkdown } from "angular-intlayer/markdown";
    
    @Injectable({ providedIn: "root" })
    export class MarkdownResolver implements Resolve<ParsedMarkdown> {
    resolve(): ParsedMarkdown {
      const markdownString = "## My title \n\nLorem Ipsum";
      // 1. рд╕рд░реНрд╡рд░ рдкрд░: рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЛ рдПрдХ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрдмрд▓ AST рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
      return parseMarkdown(markdownString);
    }
    }
    
    app.component.ts
    import { Component } from "@angular/core";
    import { ActivatedRoute } from "@angular/router";
    import { IntlayerMarkdownService, type ParsedMarkdown } from "angular-intlayer/markdown";
    
    @Component({
    selector: "app-root",
    template: `<div [innerHTML]="renderedMarkdown"></div>`,
    })
    export class AppComponent {
    renderedMarkdown: string = "";
    
    constructor(
      private route: ActivatedRoute,
      private markdownService: IntlayerMarkdownService
    ) {
      // 2. рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░: рдмрд┐рдирд╛ рд░реА-рдкрд╛рд░реНрд╕ рдХрд┐рдП рд╕реАрдзреЗ AST рд░реЗрдВрдбрд░ рдХрд░реЗрдВ
      this.route.data.subscribe((data) => {
        this.renderedMarkdown = this.markdownService.renderMarkdown(
          data.markdownAst
        ) as string;
      });
    }
    }
    

    рдпрд╣ рдкреИрдЯрд░реНрди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛рдлреА рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣рд╛рдЗрдбреНрд░реЗрд╢рди рдЧрддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

    рд╡рд┐рдХрд▓реНрдк рд╕рдВрджрд░реНрдн

    рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ MarkdownProvider, MarkdownRenderer, useMarkdownRenderer рдФрд░ renderMarkdown рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

    Option Type Default рд╡рд┐рд╡рд░рдг
    forceBlock boolean false рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдмреНрд▓реЙрдХ-рд╕реНрддрд░реАрдп рддрддреНрд╡ (рдЙрджрд╛., <div>) рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред
    forceInline boolean false рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЗрдирд▓рд╛рдЗрди рддрддреНрд╡ (рдЙрджрд╛., <span>) рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред
    tagfilter boolean true рдЦрддрд░рдирд╛рдХ HTML рдЯреИрдЧ рдХреЛ рд╣рдЯрд╛рдХрд░ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП GitHub рдЯреИрдЧ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред
    preserveFrontmatter boolean false рдпрджрд┐ true рд╣реИ, рддреЛ Markdown рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдлреНрд░рдВрдЯрдореИрдЯрд░ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
    components Overrides {} рдХрд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП HTML рдЯреИрдЧ рдХрд╛ рдорд╛рдирдЪрд┐рддреНрд░ (рдЙрджрд╛., { h1: MyHeading })ред
    wrapper Component null рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП Markdown рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдШрдЯрдХред
    renderMarkdown Function null рдбрд┐рдлрд╝реЙрд▓реНрдЯ Markdown рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд░реЗрдВрдбрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдиред