#import "utils.typ": *

= Tables <tables>
- Tables are now _much_ more flexible, read the new @guides:tables[Table Guide] to get started
- Added @table.cell element for per-cell configuration
- Cells can now span multiple @table.cell.colspan[columns] or @table.cell.rowspan[rows]
- The @table.cell.stroke[stroke] of individual cells can now be customized
- The @table.align[`align`] and @table.inset[`inset`] arguments of the table function now also take `{(x, y) => ..}` functions
- Added @table.hline and @table.vline for convenient line customization
- Added @table.header element for table headers that repeat on every page
- Added @table.footer element for table footers that repeat on every page
- All the new table functionality is also available for @grid[grids]
- Fixed gutter-related bugs

_Thanks to #gh("PgBiel") for his work on tables!_

= Templates <templates>
- You can now use template packages to get started with new projects. Click _Start from template_ on the web app's dashboard and choose your preferred template or run the `typst init <template>` command in the CLI. You can #link("https://typst.app/universe/search/?kind=templates")[browse the available templates here].
- Switching templates after the fact has become easier. You can just import a styling function from a different template package.
- Package authors can now submit their own templates to the #link("https://github.com/typst/packages")[package repository]. Share a template for a paper, your institution, or an original work to help the community get a head start on their projects.
- Templates and packages are now organized by category and discipline. Filter packages by either taxonomy in the _Start from template_ wizard. If you are a package author, take a look at the new documentation for #link("https://github.com/typst/packages/blob/main/docs/CATEGORIES.md")[categories] and #link("https://github.com/typst/packages/blob/main/docs/DISCIPLINES.md")[disciplines].

= Context <context>
- Added _context expressions:_ Read the chapter on @reference:context[context] to get started
- With context, you can access settable properties, e.g. `{context text.lang}` to access the language set via `{set text(lang: "..")}`
- The following existing functions have been made contextual: @query, @locate, @measure, @counter.display, @counter.at, @counter.final, @state.at, and @state.final
- Added contextual methods @counter.get and @state.get to retrieve the value of a counter or state in the current context
- Added contextual function @here to retrieve the @location[location] of the current context
- The @locate function now returns the location of a selector's unique match. Its old behavior has been replaced by context expressions and only remains temporarily available for compatibility.
- The @counter.at and @state.at methods are now more flexible: They directly accept any kind of @location:locatable[locatable] selector with a unique match (e.g. a label) instead of just locations
- When context is available, @counter.display now directly returns the result of applying the numbering instead of yielding opaque content. It should not be used anymore without context. (Deprecation planned)
- The `state.display` function should not be used anymore, use @state.get instead (Deprecation planned)
- The `location` argument of @query, @counter.final, and @state.final should not be used anymore (Deprecation planned)
- The `styles` argument of the `measure` function should not be used anymore (Deprecation planned)
- The `style` function should not be used anymore, use context instead (Deprecation planned)
- The correct context is now also provided in various other places where it is available, e.g. in show rules, layout callbacks, and numbering functions in the outline

= Styling <styling>
- Fixed priority of multiple @reference:styling:show-rules[show-set rules]: They now apply in the same order as normal set rules would
- Show-set rules on the same element (e.g. `{show heading.where(level: 1): set heading(numbering: "1.")}`) now work properly
- Setting properties on an element within a transformational show rule (e.g. `{show heading: it => { set heading(..); it }}`) is *not* supported anymore (previously it also only worked sometimes); use show-set rules instead *(Breaking change)*
- Text show rules that match their own output now work properly (e.g. ``` {show "cmd": `cmd`}```)
- The elements passed to show rules and returned by queries now contain all fields of their respective element functions rather than just specific ones
- All settable properties can now be used in @function.where[where] selectors
- @selector.and[And] and @selector.or[or] selectors can now be used with show rules
- Errors within show rules and context expressions are now ignored in all but the last introspection iteration, in line with the behavior of the old @locate
- Fixed a bug where document set rules were allowed after content

= Layout <layout>
- Added `reflow` argument to @rotate and @scale which lets them affect the layout
- Fixed a bug where @place.float[floating placement] or @figure.placement[floating figures] could end up out of order
- Fixed overlap of text and figure for full-page floating figures
- Fixed various cases where the @hide function didn't hide its contents properly
- Fixed usage of @h and @v in @stack[stacks]
- Invisible content like a counter update will no longer force a visible block for just itself
- Fixed a bug with horizontal spacing followed by invisible content (like a counter update) directly at the start of a paragraph

= Text <text>
- Added @text.stroke[`stroke`] property for text
- Added basic i18n for Serbian and Catalan
- Added support for contemporary Japanese @numbering[numbering] method
- Added patches for various wrong metadata in specific fonts
- The @text.dir[text direction] can now be overridden within a paragraph
- Fixed Danish @smartquote[smart quotes]
- Fixed font fallback next to a line break
- Fixed width adjustment of JIS-style Japanese punctuation
- Fixed Finnish translation of "Listing"
- Fixed Z-ordering of multiple text decorations (underlines, etc.)
- Fixed a bug due to which text @text.features[features] could not be overridden in consecutive set rules

= Model <model>
- Added @heading.depth[`depth`] and @heading.offset[`offset`] arguments to heading to increase or decrease the heading level for a bunch of content; the heading syntax now sets `depth` rather than `level` *(Breaking change)*
- List @list.marker[markers] now cycle by default
- The @quote function now more robustly selects the correct quotes based on language and nesting
- Fixed indent bugs related to the default show rule of @terms[terms]

= Math <math>
- Inline equations now automatically linebreak at appropriate places
- Added @math.equation.number-align[`number-align`] argument to equations
- Added support for adjusting the @math.accent.size[`size`] of accents relative to their base
- Improved positioning of accents
- @math.primes[Primes] are now always attached as @math.scripts[scripts] by default
- Exposed @math.primes element which backs the `[$f'$]` syntax in math
- Math mode is not affected by @strong and @emph anymore
- Fixed @math.attach[`attach`] under @math.frac[fractions]
- Fixed that @math.class did not affect smart limit placement
- Fixed weak spacing in @math.lr[`lr`] groups
- Fixed layout of large operators for Cambria Math font
- Fixed math styling of Hebrew symbol codepoints

= Symbols <symbols>
- Added `gradient` as an alias for `nabla`
- Added `partial` as an alias for `diff`, `diff` will be deprecated in the future
- Added `colon.double`, `gt.approx`, `gt.napprox`, `lt.approx`, and `lt.napprox`
- Added `arrow.r.tilde` and `arrow.l.tilde`
- Added `tilde.dot`
- Added `forces` and `forces.not`
- Added `space.nobreak.narrow`
- Added `lrm` (Left-to-Right Mark) and `rlm` (Right-to-Left Mark)
- Fixed `star.stroked` symbol (which previously had the wrong codepoint)

= Scripting <scripting>
- Arrays can now be compared lexicographically
- Added contextual method @length.to-absolute[`to-absolute`] to lengths
- Added @calc.root
- Added @int.signum and @float.signum methods
- Added @float.is-nan and @float.is-infinite methods
- Added @int.bit-not, @int.bit-and, @int.bit-or, @int.bit-xor, @int.bit-lshift, and @int.bit-rshift methods
- Added @array.chunks method
- A module can now be converted to a dictionary with the @dictionary.constructor[dictionary constructor] to access its contents dynamically
- Added @csv.row-type[`row-type`] argument to `csv` function to configure how rows will be represented
- @xml[XML parsing] now allows DTDs (document type definitions)
- Improved formatting of negative numbers with @str and @repr
- For loops can now iterate over @bytes[bytes]
- Fixed a bug with pattern matching in for loops
- Fixed a bug with labels not being part of @content.fields[`{.fields()}`] dictionaries
- Fixed a bug where unnamed argument sinks wouldn't capture excess arguments
- Fixed typo in `repr` output of strokes

= Syntax <syntax>
- Added support for nested @reference:scripting:bindings[destructuring patterns]
- Special spaces (like thin or non-breaking spaces) are now parsed literally instead of being collapsed into normal spaces *(Breaking change)*
- Korean text can now use emphasis syntax without adding spaces *(Breaking change)*
- The token @reference:context[`context`] is now a keyword and cannot be used as an identifier anymore *(Breaking change)*
- Nested line comments aren't allowed anymore in block comments *(Breaking change)*
- Fixed a bug where `x.)` would be treated as a field access
- Text elements can now span across curly braces in markup
- Fixed silently wrong parsing when function name is parenthesized
- Fixed various bugs with parsing of destructuring patterns, arrays, and dictionaries

= Tooling & Diagnostics <tooling-diagnostics>
- Click-to-jump now works properly within @raw text
- Added suggestion for accessing a field if a method doesn't exist
- Improved hint for calling a function stored in a dictionary
- Improved errors for mutable accessor functions on arrays and dictionaries
- Fixed error message when calling constructor of type that doesn't have one
- Fixed confusing error message with nested dictionaries for strokes on different sides
- Fixed autocompletion for multiple packages with the same name from different namespaces

= Visualization <visualization>
- The @image function doesn't upscale images beyond their natural size anymore
- The @image function now respects rotation stored in EXIF metadata
- Added support for SVG filters
- Added alpha component to @color.luma[`luma`] colors
- Added @color.transparentize and @color.opacify methods
- Improved @color.negate function
- Added @highlight.stroke[`stroke`] and @highlight.radius[`radius`] arguments to `highlight` function
- Changed default @highlight color to be transparent
- CMYK to RGB conversion is now color-managed
- Fixed crash with gradients in Oklch color space
- Fixed color-mixing for hue-based spaces
- Fixed bugs with color conversion
- SVG sizes are not rounded anymore, preventing slightly wrong aspect ratios
- Fixed a few other SVG-related bugs
- @color.components doesn't round anything anymore

= Export <export>
- PDFs now contain named destinations for headings derived from their labels
- The internal PDF structure was changed to make it easier for external tools to extract or modify individual pages, avoiding a bug with Typst PDFs in Apple Preview
- PDFs produced by Typst should now be byte-by-byte reproducible when `{set document(date: none)}` is set
- Added missing flag to PDF annotation
- Fixed multiple bugs with gradients in PDF export
- Fixed a bug with patterns in PDF export
- Fixed a bug with embedding of grayscale images in PDF export
- Fixed a bug with To-Unicode mapping of CFF fonts in PDF export
- Fixed a bug with the generation of the PDF outline
- Fixed a sorting bug in PDF export leading to non-reproducible output
- Fixed a bug with transparent text in PNG export
- Exported SVG files now include units in their top-level `width` and `height`

= Command line interface <command-line-interface>
- Added support for passing @sys[inputs] via a CLI flag
- When passing the filename `-`, Typst will now read input from stdin
- Now uses the system-native TLS implementation for network fetching which should be generally more robust
- Watch mode will now properly detect when a previously missing file is created
- Added `--color` flag to configure whether to print colored output
- Fixed user agent with which packages are downloaded
- Updated bundled fonts to the newest versions

= Development <development>
- Added `--vendor-openssl` to CLI to configure whether to link OpenSSL statically instead of dynamically (not applicable to Windows and Apple platforms)
- Removed old tracing (and its verbosity) flag from the CLI
- Added new `--timings` flag which supersedes the old flamegraph profiling in the CLI
- Added minimal CLI to `typst-docs` crate for extracting the language and standard library documentation as JSON
- The `typst_pdf::export` function's `ident` argument switched from `Option` to `Smart`. It should only be set to `Smart::Custom` if you can provide a stable identifier (like the web app can). The CLI sets `Smart::Auto`.
