Skip to content

v0.7.13

Choose a tag to compare

@cixzhang cixzhang released this 10 Nov 21:27
· 441 commits to main since this release
7a298e6

Astryx 0.7.13 — all @astryxdesign/* packages ship at this version.

OLD_VERSION=0.7.12  # replace with the Core version your project uses today
npm install @astryxdesign/core@0.7.13 @astryxdesign/cli@0.7.13  # plus every other @astryxdesign/* package you use, at 0.7.13
npx @astryxdesign/cli upgrade --from "$OLD_VERSION" --apply --path .

@astryxdesign/core

New Features

  • Tokenizer forwards BaseTypeahead's menu and onOpenChange in its inline presentation, and its handle gains open() and close(). A token whose own button calls open() with a dialog-role menu opens the dialog, and Escape returns focus to that token: focus that a press puts on a token's control, and the menu's focus return, stay there instead of moving to the input. The sheet presentation keeps its own sheet. (#10624)

  • Typeahead: Backspace or Delete on the selected Token clears the value, as the clear button does, when the clear button shows: it calls onChange(null), announces the cleared value, and moves focus to the empty input. Without hasClear, the keys start editing, as a click does. (#10847)

Fixes

  • A swizzled component and the package's components now announce through one pair of live regions: messages from both join the same frame, and a copy no longer mounts a second pair that screen readers would read twice or skip. The modal announcement route is shared the same way. No API changes. (#10996)

  • BottomSheet: a finger's pull on the sheet's content at a scroll edge cancels the content's native pan as soon as the pull reaches a tap's wobble (5 px), before the sheet's own drag begins at 8 px. In iOS Safari the first touchmove a page keeps committed the touch to the content's scroll, so a slow-starting swipe down rubber-banded the content under the finger while the sheet moved beside it. A tap that wobbles less than 5 px keeps its click, while a tap that wobbles 5 to 8 px toward the edge now loses it. A real scroll is never cancelled. A mostly sideways swipe on a horizontal row is not cancelled before the sheet's drag begins; a first move past 8 px starts the drag in any direction, as before. (#10033)

  • A swizzled overlay that carries its own copy of the layer runtime now shares the package's: one layer stack, one modal outlet order, one gesture counter, and one record of outside dismissals, popover show and hide operations, layer surfaces and press claims per page. Before, such a copy kept its own, so Escape over a swizzled HoverCard inside a package Dialog could close the Dialog too, and the two copies could race each other's popover operations or miss each other's outside presses. No API changes. (#10998)

  • A disabled Link stays announced as disabled, with its own role, when the caller also passes aria-disabled or role. Before, those caller props replaced Link's own, so aria-disabled={false} announced a disabled link as enabled, and role="button" announced a button that does nothing. (#11030)

  • Markdown's public parser drops every data: link and image URL, and <Markdown> renders data: links and images as source text. (#11020)

  • Carousel snap paging: in Safari, a held row's stops and span stay on each item's start edge when the settle moves between an item's rect read and its translate read. (#10992)

Documentation

  • Add hook documentation and interactive sparkline example block for useDirection, detailing render-time direction handling and CSS logical properties best practices. (#10547)

    Also released in @astryxdesign/cli.

  • InternationalizationProvider has a calendar example: the provider's calendar prop shows a Calendar and a DateInput in the Japanese or Buddhist calendar, and the value stays a Gregorian ISO date. Both calendars work without Temporal. (#10135)

    Also released in @astryxdesign/cli.

Other Changes

  • Internal: Table's row virtualization now runs on one shared list-windowing module inside Core, which later long lists will reuse. The undocumented @astryxdesign/core/internal/virtualization entry gives Lab the same module. Table's behavior and public API do not change. Internal entries are outside the public API and its compatibility promise. (#10810)

@astryxdesign/cli

Experimental APIs

  • astryx discover lists the experimental TabBarMoreList component from @astryxdesign/lab. (#10619)

  • Icon sets: a project picks one main icon set and backup sets in order, and an icon no set has becomes a placeholder in the copied file. Only the experimental icon commands, projects that set experimental.iconSet, templates that declare icons, and the icon-set guide change. (#10959)

    • Main set and backups. astryx experimental icon use <main> --backup <set> (repeatable, order kept) writes experimental.iconSet as a list, the main set first; with no --backup it writes the plain string as before. The receipt adds backups, the installed sets the list leaves out (unlisted), and the command that adds them (next). experimental icon --list shows the order and each set's role and rank, and, when two or more sets are installed and none is the main set, the command to run. A CLI before 0.7.12 refuses the list form, and use warns when the project's CLI range admits one.
    • Copied templates follow the list. astryx template takes each icon from the first set in the list that has its meaning, never mixing sets within one icon, and reports the set used, a missing look (variant: {asked, used}), and each set used with its license (icons.sets).
    • No stray library imports. An icon no set in the list loses the template's original import. The copied file declares a small MissingIcon component once (a dashed square, 1em, in the current text color, hidden from screen readers unless a use gives it a label), and each place the icon was renders it, with a comment naming the meaning. It needs no new package. The output prints a note naming the meaning and both fixes (map it in the main set, or add a backup set), and the JSON lists it in icons.placeholder.
    • Doctor. With the opt-in, the icon-sets check fails when the list names a set that is not installed, withdrawn, or shipped by two packages, and when more than one set is installed and the list leaves one out. A new icon-placeholders check warns while copied code still uses the placeholder, naming each file and meaning; a commented-out or quoted copy does not count. Projects that have not opted in see no change.
    • Labeled template icons. Every icon a bundled template uses now declares its meaning, with 30 new icon definitions. integration check notes an icon a template imports but does not declare (template_icon_undeclared), in a package whose templates declare icons: an import from a module the package declares icons from, which the template renders as an element with no children or passes as a value. Any other import from that module, such as a type, a function it calls, or a provider with children, is listed as not checked. The note fails --strict --next and leaves --strict as it was. A generic renderer (a bare Icon, or one every use gives an icon prop) and an import that matches an icon by its name only are listed as not checked instead.

New Features

  • The CLI adds a BaseTypeaheadMenu block: a BaseTypeahead whose listbox menu shows information around the result list, and whose pick or filter button opens a dialog-role menu on the same layer. (#10625)

Themes (@astryxdesign/theme-*)

Fixes

  • dependency floors move to current releases: the build package needs autoprefixer 10.6.2, browserslist 4.29.5 and lightningcss 1.33.0; the CLI needs ignore 7.0.14, jscodeshift 17.4.0, linkedom 0.18.15, zod 4.6.7 and @stylexjs/babel-plugin 0.19.1; each theme needs lucide-react 1.66.0. Peer ranges do not change. (#10709)

    Also released in @astryxdesign/cli (templates).

Contributors

Thanks to everyone who contributed to this release:

@cixzhang @humbertovirtudes @imdreamrunner @josephfarina @nynexman4464 @utkarshpatwa393-sys @vjeux

Full Changelog: v0.7.12...v0.7.13