v0.1.7
- Table plugin render-prop interfaces (
TableRenderProps,HeaderRowRenderProps,HeaderCellRenderProps,BodyRowRenderProps,BodyCellRenderProps,ScrollWrapperRenderProps) and thescrollWrappercomponent contract rename their StyleX array fieldstyles→xstyle, matching the prop name sub-components receive it under. Custom plugin authors: renameprops.stylesreads andstyles:writes in transform functions (#3679) Codemod:npx astryx upgrade --codemod rename-table-renderprops-styles-to-xstyle
- Export the authoring factories from
@astryxdesign/core:createConfigat@astryxdesign/core/configandcreateIntegration/createPageTemplate/createBlockTemplate/createComponentDoc/createFunctionDoc/createDocat@astryxdesign/core/authoring. Authoring a config or integration no longer requires depending on the CLI. Existing@astryxdesign/cli/*imports keep working via re-export. - Button: new
widthprop following the input field width convention (SizeValue: numbers are pixels, strings are used as-is).width="100%"removes the need for awidth: '100%'xstyle override or a stretch layout wrapper for full-width CTAs in auth forms, dialogs, and mobile layouts (#2600). - Astryx components are now translatable. Wrap your app in
<InternationalizationProvider locale="...">and pass one or more locale catalogs to render astryx UI in the language of your choice; calluseTranslator()inside your own components to translate consumer strings against the active locale. Astryx ships an English catalog with BCP 47 regional fallback (e.g.pt-BR→pt→en), so consumers who never render a provider see today's English strings unchanged. - Translation coverage now spans the full component set — PowerSearch (UI chrome, value-editor labels/placeholders, the 21 built-in operator labels, and ICU-pluralized result counts), plus AlertDialog, AppShell, Banner, Breadcrumbs, Calendar, Chat, CommandPalette, ContextMenu, date/time inputs, Dialog, DropdownMenu, Lightbox, Link, Markdown, mobile/side/top nav, Outline, Popover, Resizable, Selector/MultiSelector, Table (and its filter/selection/sort plugins), Toast, Tokenizer, Typeahead, and related interactive affordances. Placeholder strings that used
...are normalized to…(U+2026) in the English catalog; consumers who snapshot-test the exact three-dot form will see a diff, and consumers passing an explicitplaceholderare unaffected. - Two i18n-related type refinements (source-compatible for existing usage):
PowerSearchOperatoris now a discriminated union —{key, value, label}(raw text) or{key, value, i18nKey}(astryx-translated); passinglabelcompiles and behaves unchanged, while a bare{key, value}(neitherlabelnori18nKey) becomes a compile-time error.Markdown.renderBlockgains at: TranslatorFnparameter threaded from the top-levelMarkdown; directrenderBlockconsumers pass a translator. - New ESLint rules in
@astryx/eslint-plugin-astryx(astryx.configs.strict/recommended):@astryx/i18n-key-formatenforces camelCase path segments for@astryx.*catalog keys, and@astryx/no-hardcoded-i18n-stringflags hardcoded English string literals on user-facing props — now also inside ternaries, logical expressions, and template literals (e.g.aria-label={isOpen ? 'Close' : 'Open'}). Both are filesystem-agnostic; downstream packages can enable them with the standardfiles/ignorespattern and will see additional violations flagged after upgrading.
- Fix Banner chevron transition to honor
prefers-reduced-motion: reduce. - Round the trailing corner of the last ButtonGroup member, even when it renders a layer (#2508) ButtonGroup keyed its trailing border-radius off
:last-child. But several members render an invisible layer element after their button — aButtonwith atooltipreturnsbutton + tooltip layer, andDropdownMenureturnstrigger + popover, both rendered inline byuseLayerrather than portaled. The layer took the:last-childslot, so the real trailing button silently kept square outer corners and the group ended in a flat-edged stub. - Calendar: month navigation now announces the newly visible month (e.g. "March 2026") to screen readers via a polite live region. Previously the grid changed silently. (#3724)
- Chat: opening a conversation that already has content (history, replay, session switching) no longer spring-scrolls from the top — the first fill positions instantly, whether the content is present at mount or arrives asynchronously. Subsequent growth (streaming) springs as before.
useChatStreamScroll'sscrollToBottomaccepts{behavior: 'instant'}for one-frame programmatic jumps, mirroring the DOM'sscrollTo({behavior}). Exports theChatScrollToBottomOptionstype. (#3795) - CheckboxInput/Switch: descriptions stay linked via aria-describedby when the label is visually hidden, instead of being orphaned in the DOM.
- CodeBlock keeps line numbers aligned with wrapped lines when
isWrappedis enabled - Forward rest props in Dialog and DialogHeader. DialogHeader now passes through data-testid, aria-*, and other attributes. Dialog's inline path forwards all rest props. Standard path spreads rest before contract props so onClick, onCancel, aria-modal, and role cannot be clobbered.
- Anchor --dense / --zh doc overlays to their base sections (#2182) The compressed and translated reference docs were merged into the base doc by array position, so an overlay whose sections were ordered differently — or which omitted one — grafted every title onto the wrong body.
- FileInput: don't drop the drag-over highlight when dragging over dropzone children Dragging a file across the dropzone's own icon/text fired a dragleave on the container and cleared the drag-over state, so the "Drop files here" highlight flickered mid-drag. A dragleave whose relatedTarget is still inside the dropzone is now ignored; only actually exiting the dropzone ends the drag-over state.
- Fix consumer rest props clobbering component contract props in ButtonGroup, Calendar, and Carousel Components that set
role,aria-roledescription, oronKeyDownon their root element now spread{...rest}before those props so a consumer cannot accidentally override the component's semantic contract.onKeyDownis composed viacomposeEventHandlersso both the consumer's and the component's handlers fire. - Kbd: pass-through props no longer clobber the computed role and spoken accessible name (rest-spread precedence corrected, mirroring Avatar).
- Layer: centered layers near a viewport edge no longer render clipped (#3671). Flip fallbacks are a no-op for center alignment, so centered placements now append span-based
position-try-fallbacksthat slide the layer along its alignment axis. - Link: disabled links no longer carry a live href/onClick — programmatic focus or AT activation can no longer trigger navigation.
- Selector: searching within the options popover now announces the number of matching results ("3 results" / "No results found") to screen readers, mirroring Typeahead. Previously filtering happened silently. (#3725)
- Table now honors the standard root styling props:
className,style,xstyle,id,aria-*,data-*, and other HTML attributes reach the root<table>element instead of being silently dropped.tablePropsis deprecated (still works, loses conflicts to direct props); the computed column min-width still wins over a consumerstyle.minWidth, but no longer clobbers it when columns compute none (#3679) - Timestamp: the absolute-time tooltip is now reachable by keyboard — the timestamp is focusable while a tooltip is attached, per WCAG content-on-hover requirements.
- TopNav: the
<nav>landmark now defaults its accessible name to "Top navigation" when thelabelprop is omitted, matching SideNav ("Side navigation"), Breadcrumbs, and Pagination. Previously an omittedlabelshipped an unnamed navigation landmark, leaving screen-reader users with multiple indistinguishable "navigation" landmarks on pages that compose SideNav + TopNav + Breadcrumbs. An explicitlabelstill wins.
- Point AI agents to the CLI from the core README.
@astryxdesign/core's README now leads with a callout telling AI agents to runnpx astryx initfirst, which installs the CLI's component index intoAGENTS.md/CLAUDE.md. In an isolated cold-start test, this took agents from 0/5 to 4/5 on discovering and using the CLI (matching the AGENTS.md ceiling); a first-run nudge alone did 0/5. - Surface literal values for union types in component docs (#1645) Prop docs named their union types without ever showing the values behind them —
gap: SpacingStep,align: GridAlignment,sort: TableSortState<TSortKey>,status: InputStatus. Readers without an IDE (agents especially) had to guess, and guessed wrong:gap={16}(pixels, not a scale step),direction: 'desc'(the type says'descending').
- Migrate the duplicated charts/lab color parsers onto the shared
@astryxdesign/core/utils/colormodule: addstoGLFloats(rgba)for RGBA→GL float conversion with a neutral non-NaN fallback, replacing the fourhexToGLcopies, and rebuildslerpHex/hexAlphaonparseHex/formatHex/parseColor/formatColor(#3739)
- Export the authoring factories from
@astryxdesign/core:createConfigat@astryxdesign/core/configandcreateIntegration/createPageTemplate/createBlockTemplate/createComponentDoc/createFunctionDoc/createDocat@astryxdesign/core/authoring. Authoring a config or integration no longer requires depending on the CLI. Existing@astryxdesign/cli/*imports keep working via re-export. - Add the finalized doc-authoring API to
@astryxdesign/cli/doc:createComponentDoc,createFunctionDoc(any function, including hooks), andcreateDoc(generic reference/topic docs). Each factory stamps atypediscriminant and is validated at the load boundary against a matching per-kind schema. The legacy looseexport const docs = {...}format keeps loading unchanged, and.ts-authored hook/function sources now derive their import path to a tree-shakeable subpath instead of the bare package root. - New codemod for the Table
tablePropsdeprecation: lifts object-literaltablePropskeys into direct props on<Table>, keeps colliding or dynamic values in place with a TODO note. Codemod:npx astryx upgrade --codemod migrate-table-tableprops-to-direct-props(#3679) - New docs topic
internationalizationcovering how to localize astryx components, provide translation catalogs, override default strings, coexist with existing i18n libraries (react-intl, i18next, next-intl), swap languages at runtime, and validate coverage with the shipped pseudo locale. Runnpx astryx docs internationalizationor read it at https://astryx.atmeta.com/docs/internationalization. - template: accept
.template.{ts,mjs,js}as the canonical suffix for template-spec files, alongside the legacy.doc.*suffix. Template specs exportcreateBlockTemplate/createPageTemplate— a scaffoldable template, not documentation — so they now get a descriptive name. Core, external-package, and integration discovery (findShowcase,--blocks,astryx template <id>scaffolding) all treatFoo.template.tsidentically to a legacyFoo.doc.mjs; same-stem.tsxsource resolves for either suffix, and.template.tsauthoring is loaded via jiti. Additive only — no existing files are renamed.
- Translated component docs no longer drop props A
docsZh/docsDenseblock that carried its ownpropsarray replaced the English component doc wholesale rather than overlaying it, so any prop the translation had not caught up with simply ceased to exist.astryx component Button --zhsilently omittedisInterruptibleandisIconOnly; ten components were affected, includingMobileNav,PopoverandStackthrough the multi-componentcomponents[]shape. - Anchor --dense / --zh doc overlays to their base sections (#2182) The compressed and translated reference docs were merged into the base doc by array position, so an overlay whose sections were ordered differently — or which omitted one — grafted every title onto the wrong body.
- template: inline full demo-image URLs in the Avatar blocks and theme-showcase page so scaffolding strips them to a clean placeholder. Templates that stored only the CDN base in a
constand appended the filename via interpolation (`${CDN}/File.png`) previously scaffolded a malformedsrc— the placeholder data URI with the filename glued onto the end — plus a deadconst CDN = 'data:…'. (#4027)
- Document the minimal
package.json#exportsrecipe an integration needs so its block templates are importable by a bundler-resolution consumer and type-check undermoduleResolution: bundler:"./templates/*.tsx": "./templates/*.tsx"plus an extensionfulimport('@acme/widgets/templates/…/…Showcase.tsx'). Addspackages/cli/docs/integration-authoring.mdand a fixture test proving the recipe against the repo's owntscandesbuild.
Thanks to everyone who contributed to this release:
- @AKnassa
- @arham766
- @bhamodi
- @cixzhang
- @ejhammond
- @imdreamrunner
- @jiunshinn
- @joeyfarina
- @nynexman4464
- @yyq1025
- @zeroryu
Full Changelog: https://github.com/facebook/astryx/compare/v0.1.6...v0.1.7
v2.8.32
- Added
createBlobTempStream, a ready-madecreateTempStreamfactory that spills the data of buffered entries into aBlobinstead of keeping it in memory. Memory is bounded in Chromium browsers; in other engines and non-browser runtimes theBlobis held in memory, socreateOPFSTempStreamor a file-backed implementation is preferable there. - Added
createSyncAccessHandleTempStream, an OPFS-backedcreateTempStreamfactory built onFileSystemSyncAccessHandle. It offers the same options and bounded-memory profile ascreateOPFSTempStreambut writes roughly 2.5× faster in Chromium and Firefox and reads back several times faster in Firefox and Safari, making disk-backed staging nearly as fast as the in-memory default (worker-only variant).
- Codec worker now copies chunks that do not own their underlying buffer before transferring them, preventing data corruption when a chunk's
ArrayBufferis shared or externally owned.
- Updated the JavaScript zlib streams module.
v16.3.0-canary.91
- [turbopack] Skip redundant top-level root updates: #95903
- [turbopack] Drop unused exports from a CJS module: #95716
- Turbopack: Simplify parent directory creation retry loop logic: #95835
- Run Rust doctests in CI: #95911
- docs: add 'Set up your editor' to the installation guide: #95928
- fix(cms-contentful): await draftMode() and use Promise<> params type: #95631
- Move outputHashSalt out of experimental: #95840
- Move immutable static assets config option out of experimental: #95351
- [instant] Let dev-server requests bypass the fetch lock: #95761
Huge thanks to @marcoshernanz, @sampoder, @bgw, @aurorascharff, @manoraj, @mischnic, and @eps1lon for helping!
electron v44.0.0-alpha.5
Note: This is an alpha release. Please file new issues for any bugs you find in it.
This release is published to npm under the alpha tag and can be installed via npm install electron@alpha, or npm install electron@44.0.0-alpha.5.
- Fixed
app.disableHardwareAcceleration()not fully disabling GPU hardware usage on Windows starting from Electron 38. #52370 (Also in 41, 42, 43) - Fixed a window being marked hidden and background-throttled on macOS when covered by a transparent or click-through window. #52391 (Also in 43)
- Fixed webContents.print() returning "Invalid printer settings" when print options are provided. #52382 (Also in 43)
astro@7.1.3
- #17427
630b382Thanks @astrobot-houston! - Fixes image optimization duringastro buildusing too many parallel processes in CPU-limited containers. Builds now respect the container's CPU limit, reducing peak memory usage and avoiding out-of-memory crashes.
💎 Version 6.4.0
A feature release centered on heatmaps and a new bar chart race. Heatmaps gain a continuous numeric and datetime x-axis (cells positioned by real value, not by column index), optional canvas rendering for large grids, and a tooltip that now points at the cell it describes. The bar chart race animates bars and their labels as they re-rank. Two fixes round it out. Existing configs mostly render unchanged; three heatmap defaults change (tooltip placement, zoom, and label thinning), each noted below with how to restore the previous behavior.
On a numeric or datetime heatmap, cells are now placed at their real x value instead of being tiled one per column by index. Irregular spacing and gaps therefore render as real empty space: a missing hour is a gap in the grid, not a column squeezed away, and the axis shows sparse proportional date and time ticks rather than one label per cell. Rows stay categorical (one series per row).
This is what makes irregular-time and calendar-style heatmaps expressible with plain data shaping. Two new demos are built entirely on it: a server-CPU timeline where a metrics outage shows as a real gap, and a contribution-style calendar with ragged first and last weeks.
Evenly spaced heatmaps are unaffected: their layout is unchanged.
With chart.renderer: 'canvas' (or 'auto' past the render threshold) and the tree-shakable canvas feature imported, heatmap cells now paint to a single canvas instead of one <rect> per cell. The DOM node count stays flat regardless of cell count, and paints are roughly 2.8 to 3.5 times faster at high densities. Hover still resolves the exact cell under the cursor and shows its tooltip. Cells that use a fill the canvas cannot reproduce (gradient, pattern, image) fall back to SVG automatically.
| Heatmap cells | SVG | canvas |
|---|---|---|
| 10,000 | 95 ms | 27 ms |
| 50,000 | 519 ms | 170 ms |
| 100,000 | 1,083 ms | 388 ms |
import ApexCharts from 'apexcharts'
import 'apexcharts/features/renderer-canvas'
const options = {
chart: {
type: 'heatmap',
renderer: 'canvas', // or 'auto' to switch above rendererThreshold
},
// ...series
}
A reorder update now animates into a bar chart race. When you re-sort the data and update the chart, the bars slide to their new ranks and their category labels ride along automatically (whenever dynamicAnimation is on). Two opt-in flags complete the effect: dataLabels.animate rides each value label to its bar's new position, and dataLabels.countUp tweens the number from its previous value.
const options = {
chart: {
type: 'bar',
animations: { dynamicAnimation: { speed: 800 } },
},
plotOptions: { bar: { horizontal: true } },
dataLabels: {
enabled: true,
animate: { enabled: true }, // value labels ride to the new rank
countUp: { enabled: true }, // and count up or down from the last value
},
}
// On each frame, re-sort your data and call updateOptions with the new series
// and categories. Bars, category labels, and value labels animate to the new
// order together.
Both label flags are off by default and apply to bar and column charts. Rotated axis labels ride correctly too.
The heatmap tooltip now sits centered above the hovered cell with a downward arrow pointing at it, flipping below when the cell is against the top edge. This matches the horizontal-bar tooltip and makes it unambiguous which cell the tooltip describes; previously it trailed the cursor. Opt back into the old behavior with tooltip.followCursor: true. Custom heatmap tooltips keep the arrow as well.
A heatmap is a fixed grid, so wheel, drag, and pinch zoom only distorted it, and on a datetime axis it collapsed the month labels into repeats. Zoom is now disabled by default, mirroring treemap. Re-enable it with chart.zoom.enabled: true.
When a heatmap has more rows than can fit as readable labels and no custom y-axis formatter is set, it now shows every Nth label, evenly spaced, instead of an unreadable overlap. The ticks and the plot are unchanged, and setting your own yaxis.labels.formatter opts out.
- Light series no longer wash to white on hover. The lighten hover filter pushed already-bright fills all the way to white, so light-colored series lost their hue when hovered. The filter now preserves the color.
dataReducerno longer mutates your data. With zoom-aware downsampling active, the reduced (windowed) view was written back into the originalseriesarray, which is shared by reference, so later re-renders started already downsampled and could never recover the full-resolution points. The reducer now operates on a detached copy, leaving your input intact.- Custom tooltips keep their arrow. A
tooltip.customfunction replaced the tooltip's inner HTML, which discarded the arrow element. The arrow is now preserved across custom content, for every chart type.
dataLabels.animate and dataLabels.countUp (bar chart race) are typed on ApexDataLabels.
- No breaking API changes, and no renamed or removed options.
- Evenly spaced heatmaps render as before; continuous-x only repositions cells when the x values are irregular or gapped.
- Three heatmap defaults change (tooltip placement, zoom off, y-label thinning), each with a documented opt-out above.
- New regression tests cover the canvas rect batching and cell hit-testing, the above-cell tooltip placement, and the bar chart race label ride and count-up, alongside the existing unit, interaction, and end-to-end suites. Heatmap end-to-end snapshots are expected to update where continuous-x repositions cells and where y-labels are thinned.
v3.0.0-alpha.0
https://github.com/pmndrs/jotai/blob/v3/docs/guides/migrating-to-v3.mdx
- [v3] drop old TS by @dai-shi in https://github.com/pmndrs/jotai/pull/3336
- [v3] drop UMD and SystemJS builds by @dai-shi in https://github.com/pmndrs/jotai/pull/3338
- [v3] drop old node by @dai-shi in https://github.com/pmndrs/jotai/pull/3339
- [v3] module-first package by @dai-shi in https://github.com/pmndrs/jotai/pull/3340
- [v3] drop CJS by @dai-shi in https://github.com/pmndrs/jotai/pull/3341
- [v3] use NODE_ENV directly by @dai-shi in https://github.com/pmndrs/jotai/pull/3342
- [v3] drop rollup by @dai-shi in https://github.com/pmndrs/jotai/pull/3344
- [v3] drop old React by @dai-shi in https://github.com/pmndrs/jotai/pull/3345
- [v3] es2020 target by @dai-shi in https://github.com/pmndrs/jotai/pull/3346
- [v3] drop atomFamily by @dai-shi in https://github.com/pmndrs/jotai/pull/3347
- [v3] drop loadable by @dai-shi in https://github.com/pmndrs/jotai/pull/3348
- [v3] drop jotai/babel by @dai-shi in https://github.com/pmndrs/jotai/pull/3349
- [v3] drop setSelf by @dai-shi in https://github.com/pmndrs/jotai/pull/3350
- [v3] useAtomValueRaw & useAtomValueRawSync by @dai-shi in https://github.com/pmndrs/jotai/pull/3351
- [v3] redesign buildingBlocks by @dai-shi in https://github.com/pmndrs/jotai/pull/3358
- [v3] migration guide by @dai-shi in https://github.com/pmndrs/jotai/pull/3359
Full Changelog: https://github.com/pmndrs/jotai/compare/v2.20.2...v3.0.0-alpha.0
Release 2026-07-20 12:05
Release 2026-07-20 12:05
- special case arrays in partialMatchKey (#11084) (7e3c822a1) by @43081j
- @tanstack/angular-query-experimental@5.101.3
- @tanstack/eslint-plugin-query@5.101.3
- @tanstack/lit-query@0.2.10
- @tanstack/preact-query@5.101.3
- @tanstack/preact-query-devtools@5.101.3
- @tanstack/preact-query-persist-client@5.101.3
- @tanstack/query-async-storage-persister@5.101.3
- @tanstack/query-broadcast-client-experimental@5.101.3
- @tanstack/query-core@5.101.3
- @tanstack/query-devtools@5.101.3
- @tanstack/query-persist-client-core@5.101.3
- @tanstack/query-sync-storage-persister@5.101.3
- @tanstack/react-query@5.101.3
- @tanstack/react-query-devtools@5.101.3
- @tanstack/react-query-next-experimental@5.101.3
- @tanstack/react-query-persist-client@5.101.3
- @tanstack/solid-query@5.101.3
- @tanstack/solid-query-devtools@5.101.3
- @tanstack/solid-query-persist-client@5.101.3
- @tanstack/svelte-query@6.1.37
- @tanstack/svelte-query-devtools@6.1.37
- @tanstack/svelte-query-persist-client@6.1.37
- @tanstack/vue-query@5.101.3
- @tanstack/vue-query-devtools@6.1.37