#import "utils.typ": *

= Highlights <highlights>
- There is now a distinction between @par[proper paragraphs] and just inline-level content. This is important for future work on accessibility and means that @par.first-line-indent[first line indent] can now be enabled for all paragraphs instead of just consecutive ones.
- The @outline has a better out-of-the-box look and is more customizable
- The new @curve function (that supersedes the `path` function) provides a simpler and more flexible interface for creating Bézier curves
- The `image` function now supports raw @image.format[pixel raster formats] for generating images from within Typst
- Functions that accept file paths now also accept raw @bytes[bytes], for full flexibility
- WebAssembly @plugin[plugins] are more flexible and automatically run multi-threaded
- Fixed a long-standing bug where single-letter strings in math (`[$"a"$]`) would be displayed in italics
- You can now specify which charset should be @text.font[covered] by which font family
- The @pdf.attach[`pdf.embed`] function lets you embed arbitrary files in the exported PDF
- HTML export is currently under active development. The feature is still _very_ incomplete, but already available for experimentation behind a feature flag.

= Model <model>
- There is now a distinction between @par[proper paragraphs] and just inline-level content *(Breaking change)*
  - All text at the root of a document is wrapped in paragraphs. Meanwhile, text in a container (like a block) is only wrapped in a paragraph if the container holds any block-level content. If all of the content is inline-level, no paragraph is created.
  - In the laid-out document, it's not immediately visible whether text became part of a paragraph. However, it is still important for accessibility, HTML export, and for properties like `first-line-indent`.
  - Show rules on `par` now only affect proper paragraphs
  - The `first-line-indent` and `hanging-indent` properties also only affect proper paragraphs
  - Creating a `{par[..]}` with body content that is not fully inline-level will result in a warning
  - The default show rules of various built-in elements like lists, quotes, etc. were adjusted to ensure they produce/don't produce paragraphs as appropriate
  - Removed support for booleans and content in @outline.indent
- The @outline function was fully reworked to improve its out-of-the-box behavior *(Breaking change)*
  - @outline.entry[Outline entries] are now @block[blocks] and are thus affected by block spacing
  - The `{auto}` indentation mode now aligns numberings and titles outline-wide for a grid-like look
  - Automatic indentation now also indents entries without a numbering
  - Titles wrapping over multiple lines now have hanging indent
  - The page number won't appear alone on its own line anymore
  - The link now spans the full entry instead of just the title and page number
  - The default spacing between outline leader dots was increased
  - The @outline.entry.fill[`fill`] parameter was moved from `outline` to `outline.entry` and can thus be configured through show-set rules
  - Removed `body` and `page` fields from outline entry
  - Added `indented`, `prefix`, `inner`, `body`, and `page` methods on outline entries to simplify writing of show rules
- Added configuration to @par.first-line-indent for indenting all paragraphs instead of just consecutive ones
- Added @ref.form[`form`] parameter to `ref` function. Setting the form to `{"page"}` will produce a page reference instead of a textual one.
- Added @document.description field, which results in corresponding PDF and HTML metadata
- Added @enum.reversed parameter
- Added support for Greek @numbering[numbering]
- When the @link function wraps around a container like a @block[block], it will now generate only one link for the whole block instead of individual links for all the visible leaf elements. This significantly reduces PDF file sizes when combining `link` and @repeat.
- The @link function will now only strip one prefix (like `mailto:` or `tel:`) instead of multiple
- The link function now suppresses hyphenation via a built-in show-set rule rather than through its default show rule
- Displaying the page counter without a specified numbering will now take the page numbering into account

= Visualization <visualization>
- Added new @curve function that supersedes the `path` function and provides a simpler and more flexible interface. The `path` function is now deprecated.
- The `image` function now supports raw @image.format[pixel raster formats]. This can be used to generate images from within Typst without the need for encoding in an image exchange format.
- Added @image.scaling parameter for configuring how an image is scaled by PNG export and PDF viewers (smooth or pixelated)
- Added @image.icc parameter for providing or overriding the ICC profile of an image
- Renamed `pattern` to @tiling. The name `pattern` remains as a deprecated alias.
- Added @gradient.center, @gradient.radius, @gradient.focal-center, and @gradient.focal-radius methods
- Fixed interaction of clipping and outset on @box and @block
- Fixed panic with `path` of infinite length
- Fixed non-solid (e.g. tiling) text fills in clipped blocks
- Fixed a crash for images with a DPI value of zero
- Fixed floating-point error in @gradient.repeat
- Auto-detection of image formats from a raw buffer now has support for SVGs

= Scripting <scripting>
- Functions that accept file paths now also accept raw @bytes[bytes]
  - @image, @cbor, @csv, @json, @toml, @xml, and @yaml now support a path string or bytes and their `.decode` variants are deprecated
  - @plugin, @bibliography, @bibliography.style, @cite.style, @raw.theme, and @raw.syntaxes now accept bytes in addition to path strings. These did not have `.decode` variants, so this adds new flexibility.
  - The `path` argument/field of @image and @bibliography was renamed to `source` and `sources`, respectively *(Minor breaking change)*
- Improved WebAssembly @plugin[plugins]
  - The `plugin` type is replaced by a @plugin[`plugin` function] that returns a @module[module] containing normal Typst functions. This module can be used with import syntax. *(Breaking change)*
  - Plugins now automatically run in multiple threads without any changes by plugin authors
  - A new @plugin.transition API is introduced which allows plugins to run impure initialization in a way that doesn't break Typst's purity guarantees
- The variable name bound by a bare import (no renaming, no import list) is now determined statically and dynamic imports without `{as}` renaming (e.g. `{import "ot" + "her.typ"}`) are a hard error *(Breaking change)*
- Values of the @arguments type can now be added with `+` and @reference:scripting:blocks[joined] in curly-braced code blocks
- Functions in an element function's scope can now be called with method syntax, bringing elements and types closer (in anticipation of a future full unification of the two). Currently, this is only useful for @outline.entry as no other element function defines methods.
- Added @calc.norm function
- Added support for 32-bit floats in @float.from-bytes and @float.to-bytes
- The @decimal constructor now also accepts decimal values
- Improved `repr` of @symbol[symbols], @arguments[arguments], and @type[types]
- Duplicate @symbol[symbol] variants and modifiers are now a hard error *(Breaking change)*

= Math <math>
- Fixed a bug where single letter strings in math (`[$"a"$]`) would be displayed in italics
- Math function calls can now have hyphenated named arguments and support @arguments:spreading[argument spreading]
- Better looking accents thanks to support for the `flac` (Flattened Accent Forms) and `dtls` (Dotless Forms) OpenType features
- Added `lcm` @math.op[text operator]
- The @math.bold[`bold`] function now works with ϝ and Ϝ
- The @math.italic[`italic`] function now works with ħ
- Fixed a bug where the extent of a math equation was wrongly affected by internal metadata
- Fixed interaction of @math.lr[`lr`] and @reference:context[context] expressions
- Fixed weak spacing being unconditionally ignored in @math.lr[`lr`]
- Fixed sub/superscripts sometimes being in the wrong position with @math.lr[`lr`]
- Fixed multi-line annotations (e.g. overbrace) changing the math baseline
- Fixed merging of attachments when the base is a nested equation
- Fixed resolving of contextual (em-based) text sizes within math
- Fixed spacing around up tacks (⊥)

= Bibliography <bibliography>
- Prose and author-only citations now use editor names if the author names are unavailable
- Some non-standard but widely used BibLaTeX `editortype`s like `producer`, `writer`, `scriptwriter`, and `none` (defined by widespread style `biblatex-chicago` to mean performers within `music` and `video` entries) are now recognized
- CSL styles can now render affixes around the bibliography
- For BibTeX entries with `eprinttype = {pubmed}`, the PubMed ID will now be correctly processed
- Whitespace handling for strings delimiting initialized names has been improved
- Uppercase spelling after apostrophes used as quotation marks is now possible
- Fixed bugs around the handling of CSL delimiting characters
- Fixed a problem with parsing multibyte characters in page ranges that could prevent Hayagriva from parsing some BibTeX page ranges
- Updated CSL APA style
- Updated CSL locales for Finnish, Swiss German, Austrian German, German, and Arabic

= Text <text>
- Added support for specifying which charset should be @text.font[covered] by which font family
- Added @smallcaps.all[`all`] parameter to `smallcaps` function that also enables small capitals on uppercase letters
- Added basic i18n for Basque and Bulgarian
- @par.justify[Justification] does not affect @raw[raw] blocks anymore
- @text.cjk-latin-spacing[CJK-Latin-spacing] does not affect @raw[raw] text anymore
- Fixed wrong language codes being used for Greek and Ukrainian
- Fixed default quotes for Croatian and Bulgarian
- Fixed crash in RTL text handling
- Added support for @raw syntax highlighting for a few new languages: CFML, NSIS, and WGSL
- New font metadata exception for New Computer Modern Sans Math
- Updated bundled New Computer Modern fonts to version 7.0.1

= Layout <layout>
- Fixed various bugs with footnotes
  - Fixed footnotes getting lost when multiple footnotes were nested within another footnote
  - Fixed endless loops with empty and overlarge footnotes
  - Fixed crash with overlarge footnotes within a floating placement
- Fixed sizing of quadratic shapes (@square and @circle)
- Fixed @block.sticky not working properly at the top of a container
- Fixed crash due to consecutive weak spacing
- Fixed crash when a @block[block] or text have negative sizes
- Fixed unnecessary hyphenations occurring in rare scenarios due to a bad interaction between padding and paragraph optimization
- Fixed lone @cite[citations] in @align not becoming their own paragraph

= Syntax <syntax>
- Top-level closing square brackets that do not have a matching opening square bracket are now a hard error *(Minor breaking change)*
- Adding a space between the identifier and the parentheses in a set rule is not allowed anymore *(Minor breaking change)*
- Numbers with a unit cannot have a base prefix anymore, e.g. `0b100000pt` is not allowed anymore. Previously, it was syntactically allowed but always resolved to a value of zero. *(Minor breaking change)*
- Using `is` as an identifier will now warn as it might become a keyword in the future
- Fixed minor whitespace handling bugs
  - in math mode argument lists
  - at the end of headings
  - between a term list's term and description
- Fixed parsing of empty single line raw blocks with 3+ backticks and a language tag
- Fixed minor bug with parentheses parsing in math
- Markup that can only appear at the start of the line (headings, lists) can now also appear at the start of a list item
- A shebang `#!` at the very start of a file is now ignored

= PDF export <pdf-export>
- Added @pdf.attach[`pdf.embed`] function for embedding arbitrary files in the exported PDF
- Added support for PDF/A-3b export
- The PDF timestamp will now contain the timezone by default

= HTML export <html-export>
*Note:* HTML export is currently under active development. The feature is still _very_ incomplete, but already available for experimentation behind a feature flag.

- Added HTML output support for some (but not all) of the built-in elements
- Added @html.elem function for outputting an arbitrary HTML element
- Added @html.frame function for integrating content that requires layout into HTML (by embedding an SVG)
- Added @target function which returns either `{"paged"}` or `{"html"}` depending on the export target

= Tooling and Diagnostics <tooling-and-diagnostics>
- Autocompletion improvements
  - Added autocompletion for file paths
  - Smarter autocompletion of variables: Completing `{rect(fill: |)}` will now only show variables which contain a valid fill (either directly or nested, e.g. a dictionary containing a valid fill)
  - Different functions will now autocomplete with different brackets (round vs square) depending on which kind is more useful
  - Positional parameters which are already provided aren't autocompleted again anymore
  - Fixed variable autocompletion not considering parameters
  - Added autocompletion snippets for common figure usages
  - Fixed autocompletion after half-completed import item
  - Fixed autocompletion for `cite` function
- Added warning when an unconditional return in a code block discards joined content
- Fixed error message when accessing non-existent label
- Fixed handling of nested imports in IDE functionality

= Command Line Interface <command-line-interface>
- Added `--features` argument and `TYPST_FEATURES` environment variable for opting into experimental features. The only feature so far is `html`.
- Added a live reloading HTTP server to `typst watch` when targeting HTML
- Fixed self-update not being aware about certain target architectures
- Fixed crash when piping `typst fonts` output to another command
- Fixed handling of relative paths in `--make-deps` output
- Fixed handling of multipage SVG and PNG export in `--make-deps` output
- Colons in filenames are now correctly escaped in `--make-deps` output

= Symbols <symbols>
- New
  - `inter`, `inter.and`, `inter.big`, `inter.dot`, `inter.double`, `inter.sq`, `inter.sq.big`, `inter.sq.double`, `integral.inter`
  - `asymp`, `asymp.not`
  - `mapsto`, `mapsto.long`
  - `divides.not.rev`, `divides.struck`
  - `interleave`, `interleave.big`, `interleave.struck`
  - `eq.triple.not`, `eq.dots`, `eq.dots.down`, `eq.dots.up`
  - `smt`, `smt.eq`, `lat`, `lat.eq`
  - `colon.tri`, `colon.tri.op`
  - `dagger.triple`, `dagger.l`, `dagger.r`, `dagger.inv`
  - `hourglass.stroked`, `hourglass.filled`
  - `die.six`, `die.five`, `die.four`, `die.three`, `die.two`, `die.one`
  - `errorbar.square.stroked`, `errorbar.square.filled`, `errorbar.diamond.stroked`, `errorbar.diamond.filled`, `errorbar.circle.stroked`, `errorbar.circle.filled`
  - `numero`
- Renamed *(Breaking change)*
  - `ohm.inv` to `Omega.inv`
- Changed codepoint *(Breaking change)*
  - `angle.l.double` from `《` to `⟪`
  - `angle.r.double` from `》` to `⟫`
  - `angstrom` from U+212B (`Å`) to U+00C5 (`Å`)
- Deprecated
  - `sect` and all its variants in favor of `inter`
  - `integral.sect` in favor of `integral.inter`
- Removed *(Breaking change)*
  - `degree.c` in favor of `°C` (`[$upright(°C)$]` or `[$upright(degree C)$]` in math)
  - `degree.f` in favor of `°F` (`[$upright(°F)$]` or `[$upright(degree F)$]` in math)
  - `kelvin` in favor of just K (`[$upright(K)$]` in math)
  - `ohm` in favor of `Omega`

= Deprecations <deprecations>
- The `path` function in favor of the @curve function
- The name `pattern` for tiling patterns in favor of the new name @tiling
- `image.decode`, `cbor.decode`, `csv.decode`, `json.decode`, `toml.decode`, `xml.decode`, `yaml.decode` in favor of the top-level functions directly accepting both paths and bytes
- The `sect` and its variants in favor of `inter`, and `integral.sect` in favor of `integral.inter`
- The compatibility behavior of type/str comparisons (e.g. `{int == "integer"}`) which was temporarily introduced in Typst 0.8 now emits warnings. It will be removed in Typst 0.14.

= Removals <removals>
- Removed `style` function and `styles` argument of @measure, use a @reference:context[context] expression instead *(Breaking change)*
- Removed `state.display` function, use @state.get instead *(Breaking change)*
- Removed `location` argument of @state.at, @counter.at, and @query *(Breaking change)*
- Removed compatibility behavior where @counter.display worked without @reference:context[context] *(Breaking change)*
- Removed compatibility behavior of @locate *(Breaking change)*

= Development <development>
- The `typst::compile` function is now generic and can return either a `PagedDocument` or an `HtmlDocument`
- `typst-timing` now supports WebAssembly targets via `web-sys` when the `wasm` feature is enabled
- Increased minimum supported Rust version to 1.80
- Fixed linux/arm64 Docker image
