h

hypraw

@preview

A lightweight package for creating headless code blocks optimized for HTML export.

v0.1.0
MIT

Package Information

Last Updated
Minimum Typst Version
0.14.0
Categories
componentslayout

1. Get the package

Download the package using the TPIX CLI:

tpix get @preview/hypraw:0.1.0

2. Import in your Typst file

Add this to your .typ file:

#import "@preview/hypraw:0.1.0": *

Version History

0.1.00.14.0
66864f5d010b...

Hypraw

Universe

GitHub

A lightweight package for creating headless code blocks optimized for HTML export. Inspired by zebraw.

Important: This package does NOT and will NOT support non-HTML targets. In this case, it just takes no effect.

Features

  • Generates clean, semantic HTML structure
  • CSS class deduplication for smaller output
  • Line numbers — expressive-code styled gutter with proper accessibility
  • Line highlight — expressive-code styled line highlight, customized with your CSS
  • Copy button support — headless, accessible, and customizable

Installation

  • From Typst Universe
  • typship package manager
  • Manual installation to local packages directory
  • Git submodule in your project

Usage

Import from @preview/hypraw and enable it with #show: hypraw.

#import "@preview/hypraw:0.1.0": *
#show: hypraw

Then write your code blocks as usual, and insert additional CSS styles if needed.

Here's inline code: `println!("Hello!")`

```rust
fn main() {
    println!("Hello, world!");
}
```

#hypraw-styles(read("styles.css"))

See examples/ directory for complete styling implementation.

We do not provide any official CSS styles to maintain a minimal package size. You can copy our example styles from examples/ and adapt them to your needs.

Important: hypraw is stateless and should only be used once per document. It applies globally to all code blocks in the document. Multiple #show: hypraw calls are unnecessary and should be avoided.

API

hypraw(..)

Enables enhanced HTML code block rendering.

// Enable hypraw for entire document (use only once)
#show: hypraw

// Enable line numbers (expressive-code style)
#show: hypraw.with(line-numbers: true)

// To disable copy button for entire document
#show: hypraw.with(copy-button: false)

// Custom settings for entire document
#show: hypraw.with(dedup-styles: false, attach-styles: false)

hypraw-set(line-numbers: auto, highlight: auto, copy-button: auto)

Override settings for the next code block only (auto denotes default). Resets after use.

// Disable line numbers for this block (when globally enabled)
#hypraw-set(line-numbers: none)

// Start from line 2
#hypraw-set(line-numbers: 2)

// Custom labels per line (e.g., for diff display)
#hypraw-set(line-numbers: ("+", "-"))

// Highlight specific lines (1-based index)
#hypraw-set(highlight: (1, 3))          // Lines 1 and 3
#hypraw-set(highlight: (1, (3, 5)))     // Line 1 and lines 3-5

// Use specific highlight classes (ins/del/mark)
// You need to set styles for these classes in the css
#hypraw-set(highlight: (ins: (1, 3), del: (4,)))

additional-styles()

Returns additional style strings when deduplication is enabled. Call this when you set attach-styles to false.

html-style(style)

Adds custom CSS styles for HTML output. Accepts a CSS string or file content.

#html-style(".hypraw { background: #f5f5f5; }")
// Or read from file
#html-style(read("styles.css"))

html-script(script)

Similar to html-style, it creates a <script> element.

HTML Output

Generates headless HTML structure that you can style with your own CSS:

<div class="hypraw">
  <button class="hypraw-copy-btn" aria-label="Copy code" data-copy="..." />
  <pre><code data-lang="rust">
    <span class="c0">fn</span> <span class="c1">main</span>...
  </code></pre>
</div>

The copy button feature provides a data-copy attribute with the raw code content. You need to inject your scripts to output. You can refer to the example implementation in copy-button.css.

With Line Numbers

When line-numbers: true is enabled, the structure includes a gutter:

<div class="hypraw has-line-numbers" style="--ln-width:3ch">
  <pre><code data-lang="rust"><div class="ec-line"><div class="gutter"><div class="ln"><span aria-hidden="true">1</span></div></div><div class="code"><span class="c0">fn</span> <span class="c1">main</span>() {</div></div><!-- More lines... --></code></pre>
</div>

Why Another Package

zebraw is a GREAT versatile package for code blocks. However, it tends to produce heavy output, which compromises load time and is hard to tweak from the outside. Therefore, I developed hypraw, a lightweight package where you can custom almost everything with CSS.

License

MIT License — see LICENSE for details.