Astryx 0.6.3 — all @astryxdesign/* packages ship at this version.
npx astryx upgrade --apply@astryxdesign/core
New Features
-
Show each shared InputClearButton's contextual action label in a tooltip, giving sighted users the same specific action name already available to assistive technology. (#6354)
-
Add a
collapsedSummarycomposition slot to ChatComposerDrawer that replaces the complete collapsed-summary anatomy when provided; omitting it preserves the existing Badge and label. (#5399) -
Add
endContentEdgeCompensationto DialogHeader so callers can select which axes receive fixed compensation while preserving automatic close-action compensation by default. (#6465) -
Add a Canvas Editor page template with a layered artboard, resizable layer and property panels, live text/image controls, zoom, document tabs, and a themed fixed-size canvas. (#6237)
-
Markdown: add native typed frontmatter metadata (#6381)
UsecreateMarkdownFrontmatter()from@astryxdesign/core/Markdown/pluginsto decode a document-start key/value block into typed metadata, keep unfinished streaming metadata hidden, and remove completed metadata syntax from rendered Markdown. -
Markdown: add the core plugin protocol (#6340)
UsecreateMarkdownPlugin()and Markdown'spluginsprop to compose bounded source syntax, immutable typed AST transforms, and extension renderers. ImportparseMarkdownAst()orparseInlineAst()from@astryxdesign/core/Markdown/parserwhen server code needs the canonical tree. The same ordered plugins work with parser entry points and Markdown-derived Outline items, while omitted or empty plugin lists preserve existing behavior. -
Markdown: add a limited Remark compatibility adapter (#6345)
ImportcreateMarkdownRemarkTransform()from@astryxdesign/core/Markdown/remarkto run one synchronous transform-only Remark plugin over the documented MDAST subset. Every invocation gets a fresh mutable tree and an isolated file, and each plugin's compatibility is proven by fixtures rather than assumed: async work, parser or compiler plugins, processor state, raw HTML, unsupported nodes, forged positions, and metadata Astryx cannot represent keep the last valid readable document and report one diagnostic. The adapter is a separate entry point, so it stays out of every bundle that does not import it. -
Markdown: add a semantic code-fence transform helper (#6343)
UsecreateMarkdownFenceTransform()to annotate declared fenced-code languages with typed extension data while standard pluginrenderersown presentation and text projection.components.coderetains precedence, and declined, missing, or failed proposals preserve Markdown's accessible, copyableCodeBlockfallback. -
Markdown: add an immutable source-decoration helper (#6344)
UsecreateMarkdownSourceDecoration()to attach non-visual metadata to every block a validated UTF-16 source range touches, andgetMarkdownSourceDecorations()to read it back in a later plugin. It works through<Markdown>and Outline with no extra parser options, resolves independently of the order earlier transforms left blocks in, and appears on the settled document rather than on partial streaming chunks, so a decoration never appears and then vanishes. Metadata lives in one versioned Astryx-owned envelope that never merges foreign node data. Rendered output, copyable text, accessible names, heading ids, focus order, navigation, and source provenance are unchanged.Markdown transforms also got faster, and a plugin now always observes a fully immutable tree — including blocks a Core helper carried over untouched. Core-authored helpers now validate the nodes a caller's callback produced and run on a trusted path that skips the whole-tree validation and freezing applied to plugin-authored output, freezing walks only what a transform changed, a plugin list that contributes no inline syntax no longer costs anything per source character, and the helpers' per-match allocations and rebuilds are gone. The representative three-helper set now adds about 20 percent over an empty pipeline, inside its 25 percent budget, down from roughly 3.3x.
-
Markdown: add an immutable text-transform helper (#6342)
UsecreateMarkdownTextTransform()to replace matching prose with typed Markdown nodes while preserving links, images, code, math, citations, and existing extension syntax as protected contexts. -
Add pressed feedback to CheckboxInput, Collapsible, Link, Slider, Switch, TabList, RadioList, and unselected SegmentedControl items. Enabled controls paint
--color-overlay-pressedon their interaction surface during pointer hold or drag; disabled controls and selected SegmentedControl items keep their existing surfaces. (#6380) -
Let a TreeList item carry row styles (#6238)
TreeListItemDatagainsxstyle,className, andstyle, applied to the item's row element, so row-scoped primitives such asuseContainerRevealcan isolate each row's hover and focus state.
Fixes
-
Make overflowing BottomSheet text keyboard reachable with a named scroll-body tab stop. Add shared focus-time keyboard delegation to
useScrollableArea: forward Tab may enter the first native link/button directly, while inputs, composite widgets, and nested scroll owners retain the viewport stop. Reverse traversal skips the delegated viewport; pointer/programmatic focus and content changes never trigger delegation. Sheet scroll containment now applies only while content overflows and uses the sharedcontainpolicy, which permits native edge feedback. (#6301) -
Keep ChatComposer's public composition contracts aligned: custom inputs now submit the value they supply, disabled default editors expose their state to assistive technology, and an explicitly shown Stop action remains pointer-operable while editing is disabled. (#6398)
-
Keep collapsed
ChatComposerDrawercontent out of keyboard and assistive-technology navigation, and show the shared focus indicator on its disclosure control. (#6416) -
Keep programmatic ChatComposerInput edits observable, deliver dropped files through
onFiles, and letonPasteintercept text before default token conversion. (#6419) -
Export
ChatComposerTokenElementPropsand forward supported span props and refs fromChatComposerTokenElement(#6443). -
Keep the chat dictation control disabled when speech recognition is unavailable, and preserve theme control over its clipping feedback (#6444).
-
Clip the resizable SideNav handle within the sidebar bounds (#6196)
-
scope the 16px text-control font-size floor to iOS with
@supports (-webkit-touch-callout: none)inside the coarse-pointer query, so Android and touch-screen laptops keep the theme's type scale instead of an inflated 16px (#6085; fixes #6015) -
Kbd: render the
escandreturnaliases with the same glyphs and accessible names asescapeandenter(#5657)
This partial fix for #5403 normalizes the two unambiguous aliases already accepted byuseHotkeys. Kbd now rendersescasEscwith the accessible nameEscape, andreturnas↵with the accessible nameEnter. Its lookup tables now also avoid prototype-chain collisions when rendering arbitrary key names. The platform-specific rendering contract formetaand display choice forspaceremain unresolved in #5403 pending separate API and design decisions. -
LayoutFooter: add playground wrapper and default children for docsite preview (#6341)
Prevents the properties-tab preview on the docsite from rendering an empty stage by wrapping LayoutFooter inside a Layout scaffold with representative footer content in the footer slot. -
PowerSearch: switching the field or operator while the value menu is open now shows the new field's options instead of the old ones. (#6357)
-
Move focusable ProgressBar target marks outside the
progressbarsubtree (#6248) -
Selector: collapse an option's mark column when its resolved selection indicator renders nothing. Unselected rows using the default check indicator no longer lose label width to an empty wrapper. (#5619)
-
Paint Slider marks inside the filled region with the accent fill color while leaving unfilled-side marks unchanged. (#6455)
-
Use the Slider track token for unfilled tick marks so marks and rails stay aligned across themes. (#6461)
-
Apply the theme body font to the theme scope root so components using inherited typography no longer fall back to browser serif. (#6450)
-
Keep ToggleButton callbacks synchronous while routing pressed Actions through Button's
clickActionpathway, preserving cancellation and optimistic pending feedback. (#6463) -
Spinner: animate the arc's dash offset instead of rotating the ring, fixing residual wobble on iOS Safari (#6311; fixes #6253)
The earlier fix for #3617 addedwillChange: 'transform'to the rotating<svg>, which smooths the rotation's motion but does nothing about how WebKit rasterizes a rotating stroked shape's rounded cap on each frame. Rotating the whole ring still visibly wobbled on iOS Safari.Animates
stroke-dashoffseton the stationary arc<circle>instead of rotating the<svg>, so the shape never rotates and WebKit never re-rasterizes the cap at an intermediate angle. Confirmed against a real iOS Safari device by the issue reporter. -
Table: contain overscroll only while its inner viewport can scroll, so a fitting table no longer creates a dead scroll zone in its parent. (#6410)
-
Keep a ToggleButton's own
isDisabledwhen its ToggleButtonGroup does not disable anything. The group always supplies anisDisabledboolean, so the previous??fallback never ran and an enabled group re-enabled a member that had disabled itself — the member selected on click, and a member carrying atooltipstayed operable while looking unavailable. A disabled group still disables every member; it just cannot re-enable one. (#6356)
Contributors
Thanks to everyone who contributed to this release:
@aldentan @athz @cixzhang @ernestt @harjothkhara @HelloOjasMutreja @jiunshinn @kentonquatman @korkt-kim @ManoharPaturi @nynexman4464 @rupesh-kumar-sah @vjeux
Full Changelog: v0.6.2...v0.6.3