JSPM

svelte-highlight-copy

7.4.2
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 15
  • Score
    100M100P100Q42079F
  • License MIT

Syntax Highlighting for Svelte using highlight.js

Package Exports

    This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (svelte-highlight-copy) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

    Readme

    svelte-highlight

    NPM npm

    Syntax highlighting for Svelte using highlight.js.

    Try it in StackBlitz.

    Documentation

    Installation

    # Yarn
    yarn add -D svelte-highlight
    
    # npm
    npm i -D svelte-highlight
    
    # pnpm
    pnpm i -D svelte-highlight highlight.js

    Note that pnpm users must also install highlight.js.

    Basic Usage

    The Highlight component requires two props:

    • code: text to highlight
    • language: language grammar used to highlight the text

    Import languages from svelte-highlight/languages.

    See SUPPORTED_LANGUAGES.md for a list of supported languages.

    <script>
      import Highlight from "svelte-highlight";
      import typescript from "svelte-highlight/languages/typescript";
    
      const code = "const add = (a: number, b: number) => a + b;";
    </script>
    
    <Highlight language={typescript} {code} />

    Styling

    Import styles from svelte-highlight/styles. See SUPPORTED_STYLES.md for a list of supported styles.

    There are two ways to apply highlight.js styles.

    1. Injected styles through svelte:head
    2. CSS StyleSheets

    Injected Styles

    This component exports highlight.js themes in JavaScript. Import the theme from svelte-highlight/styles and inject it using the svelte:head API.

    <script>
      import Highlight from "svelte-highlight";
      import typescript from "svelte-highlight/languages/typescript";
      import github from "svelte-highlight/styles/github";
    
      const code = "const add = (a: number, b: number) => a + b;";
    </script>
    
    <svelte:head>
      {@html github}
    </svelte:head>
    
    <Highlight language={typescript} {code} />

    CSS StyleSheet

    Depending on your set-up, importing a CSS StyleSheet in Svelte may require a CSS file loader. SvelteKit/Vite automatically supports this. For Webpack, refer to examples/webpack.

    <script>
      import { Highlight } from "svelte-highlight";
      import typescript from "svelte-highlight/languages/typescript";
      import "svelte-highlight/styles/github.css";
    
      const code = "const add = (a: number, b: number) => a + b;";
    </script>
    
    <Highlight language={typescript} {code} />

    Linking from a CDN

    CSS StyleSheets can also be externally linked from a Content Delivery Network (CDN) like unpkg.com.

    Warning Using a CDN is best suited for prototyping and not recommended for production use.

    HTML

    <!doctype html>
    <html lang="en">
      <head>
        <link
          rel="stylesheet"
          href="https://unpkg.com/svelte-highlight/styles/github.css"
        />
      </head>
    </html>

    svelte:head

    <svelte:head>
      <link
        rel="stylesheet"
        href="https://unpkg.com/svelte-highlight/styles/github.css"
      />
    </svelte:head>

    Svelte Syntax Highlighting

    Use the HighlightSvelte component for Svelte syntax highlighting.

    <script>
      import { HighlightSvelte } from "svelte-highlight";
      import github from "svelte-highlight/styles/github";
    
      const code = `<button on:click={() => { console.log(0); }}>Increment {count}</button>`;
    </script>
    
    <svelte:head>
      {@html github}
    </svelte:head>
    
    <HighlightSvelte {code} />

    Auto-highlighting

    The HighlightAuto component uses highlightAuto API.

    Warning Auto-highlighting will result in a larger bundle size. Specify a language if possible.

    <script>
      import { HighlightAuto } from "svelte-highlight";
      import github from "svelte-highlight/styles/github";
    
      const code = `body {\n  padding: 0;\n  color: red;\n}`;
    </script>
    
    <svelte:head>
      {@html github}
    </svelte:head>
    
    <HighlightAuto {code} />

    Line Numbers

    Use the LineNumbers component to render the highlighted code with line numbers.

    <script>
      import Highlight, { LineNumbers } from "svelte-highlight";
      import typescript from "svelte-highlight/languages/typescript";
      import atomOneDark from "svelte-highlight/styles/atom-one-dark";
    
      const code = "const add = (a: number, b: number) => a + b";
    </script>
    
    <svelte:head>
      {@html atomOneDark}
    </svelte:head>
    
    <Highlight language={typescript} {code} let:highlighted>
      <LineNumbers {highlighted} />
    </Highlight>

    Hidden Border

    Set hideBorder to true to hide the border of the line numbers column.

    <Highlight language={typescript} {code} let:highlighted>
      <LineNumbers {highlighted} hideBorder />
    </Highlight>

    Wrapped Lines

    By default, overflowing horizontal content is contained by a scrollbar.

    Set wrapLines to true to hide the border of the line numbers column.

    <Highlight language={typescript} {code} let:highlighted>
      <LineNumbers {highlighted} wrapLines />
    </Highlight>

    Custom Starting Line Number

    The line number starts at 1. Customize this via the startingLineNumber prop.

    <Highlight language={typescript} {code} let:highlighted>
      <LineNumbers {highlighted} startingLineNumber={42} />
    </Highlight>

    Highlighted Lines

    Specify the lines to highlight using the highlightedLines prop. Indices start at zero.

    Use --highlighted-background to customize the background color of highlighted lines.

    <Highlight language={typescript} {code} let:highlighted>
      <LineNumbers
        {highlighted}
        highlightedLines={[0, 2, 3, 14]}
        --highlighted-background="#000"
      />
    </Highlight>

    Custom Styles

    Use --style-props to customize styles.

    Style prop Description Default value
    --line-number-color Text color of the line numbers currentColor
    --border-color Border color of the column of line numbers currentColor
    --padding-left Left padding for td elements 1em
    --padding-right Right padding for td elements 1em
    --highlighted-background Background color of highlighted lines rgba(254, 241, 96, 0.2)
    <Highlight language={typescript} {code} let:highlighted>
      <LineNumbers
        {highlighted}
        --line-number-color="pink"
        --border-color="rgba(255, 255, 255, 0.2)"
        --padding-left={0}
        --padding-right="3em"
        --highlighted-background="#000"
      />
    </Highlight>

    Language Targeting

    All Highlight components apply a data-language attribute on the codeblock containing the language name.

    See SUPPORTED_LANGUAGES.md for a list of supported languages.

    [data-language="css"] {
      /* custom style rules */
    }

    Language Tags

    Set langtag to true to display the language name in the top right corner of the code block.

    Customize the language tag background, color, and border-radius using style props.

    See the Languages page for a list of supported languages.

    Style prop Description Default value
    --langtag-background Background color of the langtag inherit
    --langtag-color Text color of the langtag inherit
    --langtag-border-radius Border radius of the langtag 0
    <script>
      import { HighlightAuto } from "svelte-highlight";
    
      $: code = `.body { padding: 0; margin: 0; }`;
    </script>
    
    <HighlightAuto {code} langtag />
    [data-language="css"] {
      --langtag-background: linear-gradient(135deg, #2996cf, 80%, white);
      --langtag-color: #fff;
      --langtag-border-radius: 8px;
    }

    Custom Language

    For custom language highlighting, pass a name and register function to the language prop.

    Refer to the highlight.js language definition guide for guidance.

    <script>
      import { Highlight } from "svelte-highlight";
      import hljs from "highlight.js";
    
      const language = {
        name: "custom-language",
        register: (hljs) => {
          return {
            /** custom language rules */
            contains: [],
          };
        },
      };
    </script>
    
    <Highlight {language} code="..." />

    Code-splitting

    You can use the await import syntax for code-splitting.

    In the example below, the HighlightAuto component and injected styles are dynamically loaded.

    <script>
      import { onMount } from "svelte";
    
      let component;
      let styles;
    
      onMount(async () => {
        component = (await import("svelte-highlight")).HighlightAuto;
        styles = (await import("svelte-highlight/styles/github")).default;
      });
    </script>
    
    <svelte:head>
      {#if styles}
        {@html styles}
      {/if}
    </svelte:head>
    
    <svelte:component
      this={component}
      langtag
      code={`body {\n  padding: 0;\n  color: red;\n}`}
    />

    Component API

    Highlight

    Props

    Name Type Default value
    code any N/A (required)
    language { name: string; register: hljs => object } N/A (required)
    langtag boolean false

    $$restProps are forwarded to the top-level pre element.

    Dispatched Events

    • on:highlight: fired after code is highlighted
    <Highlight
      language={typescript}
      {code}
      on:highlight={(e) => {
        /**
         * The highlighted HTML as a string.
         * @example "<span>...</span>"
         */
        console.log(e.detail.highlighted);
      }}
    />

    LineNumbers

    Props

    Name Type Default value
    highlighted string N/A (required)
    hideBorder boolean false
    wrapLines boolean false
    startingLineNumber number 1
    highlightedLines number[] []

    $$restProps are forwarded to the top-level div element.

    HighlightSvelte

    Props

    Name Type Default value
    code any N/A (required)
    langtag boolean false

    $$restProps are forwarded to the top-level pre element.

    Dispatched Events

    • on:highlight: fired after code is highlighted
    <HighlightSvelte
      {code}
      on:highlight={(e) => {
        /**
         * The highlighted HTML as a string.
         * @example "<span>...</span>"
         */
        console.log(e.detail.highlighted);
      }}
    />

    HighlightAuto

    Props

    Name Type Default value
    code any N/A (required)
    langtag boolean false

    $$restProps are forwarded to the top-level pre element.

    Dispatched Events

    • on:highlight: fired after code is highlighted
    <HighlightAuto
      {code}
      on:highlight={(e) => {
        /**
         * The highlighted HTML as a string.
         * @example "<span>...</span>"
         */
        console.log(e.detail.highlighted);
    
        /**
         * The inferred language name
         * @example "css"
         */
        console.log(e.detail.language);
      }}
    />

    Supported Languages

    Supported Styles

    Examples

    Changelog

    License

    MIT