v0.7.14
Astryx 0.7.14 — all @astryxdesign/* packages ship at this version.
OLD_VERSION=0.7.13 # replace with the Core version your project uses today
npm install @astryxdesign/core@0.7.14 @astryxdesign/cli@0.7.14 # plus every other @astryxdesign/* package you use, at 0.7.14
npx @astryxdesign/cli upgrade --from "$OLD_VERSION" --apply --path .
-
ComplexSelector:
disabledMessageexplains why a disabled selector is disabled. WithisDisabled, a tooltip shows the reason on hover and keyboard focus, and the reason describes the trigger througharia-describedby. The disabled trigger keeps its tab stop, and pointer, keyboard and the imperative handle still cannot open the popup. WithrenderTrigger, the caller owns the control, anddisabledMessageworks with it too: the tooltip and the description go to that control. Drop the control's own tooltip while the selector is disabled, for exampletooltip={isDisabled ? undefined : 'Filter'}, so it never shows two. Separately, a caller's ownaria-disablednow reaches an enabled built-in trigger. (#5984) -
An anchored layer's entrance now slides from, and scales about, the side the layer lands on. Before, a layer that flipped because its requested side had no room still slid from that requested side, onto its trigger. The entrance also scales about the point where the layer meets its trigger, not the center of its box. A Selector list that opens over its selected item scales about the trigger's center and does not slide. This applies to Popover, DropdownMenu and its submenus, ContextMenu, Selector, ComplexSelector, Tooltip, HoverCard, Breadcrumbs and PowerSearch menus, and any layer that uses the shared entrance. Built-in layers have no option that keeps the old entrance. The public
layerAnimationsstyles now also settransform-origin; a caller's owntransformOriginlisted after them still wins. (#10771) -
useMenuPresswith nolongPressDelayMsnow follows DropdownMenu's finger rules on every device: a finger or a pen opens the menu as it presses (inside a scroll view, once the 150 ms content-touch delay has passed), and the finger that opened it picks a row only after moving 10 px. To keep the previous behavior, a 500 ms hold and a pick at the opening finger's lift, passlongPressDelayMs: 500. (#8078) -
Under a finger or a pen, on every device, the trigger of an anchored DropdownMenu or MoreMenu now opens its menu as it is pressed, instead of after a 500 ms hold. Inside a scroll view it opens once the 150 ms content-touch delay has passed with no scroll, so a scroll that starts on it still scrolls. To keep the previous behavior, a tap that opens at the lift and a 500 ms hold, pass
presentation="popover". A menu shown as a bottom sheet, and a mouse, are unchanged. (#8078) -
SegmentedControl: a drag that drifts off the control keeps choosing by its horizontal position, clamped to the end segments, and the lift commits that segment. A mouse or a pen drags the same way. Escape or a browser cancel takes the press back, and the highlight returns at once. (#10978)
-
Tokenizer is now an InputGroup-compatible control (#3520). Inside an
InputGroupit consumesInputGroupContextinstead of rendering its ownField, so the group owns the single label, description, and status chrome — no more duplicated label or nested field wrapper. The typeahead input is named by the group label plus the Tokenizer's own label (composed withgetInputARIA, soaria-describedbymerges the group's description/status with the input-local disabled reason rather than replacing it), and the control adopts the sharedgroupStyles.inGroupborder/radius treatment so it joins the group's seam. The group also owns size, the disabled state, and validation: a disabled group disables its Tokenizer, a grouped Tokenizer takes the group'ssize(an explicit largersizeno longer escapes the row), and its localdescription/statusare neither referenced fromaria-describedbynor painted beside the group's status. Because the group is a fixed-height single-line surface, a grouped Tokenizer keeps its tokens on one scrolling row instead of wrapping past the shared border — cap selections withmaxEntriesor summarize them withtokenOverflowBehavior. Its end controls (the clear button,endContent, and the busy indicator) hold the end of that row: tokens scroll beside them, never underneath. The row hides its native scrollbar and fades whichever edge hides tokens instead; forced colors bring back a thin native scrollbar. Keyboard users reach hidden tokens through their remove buttons (Shift+Tab from the input), and a disabled Tokenizer's row becomes its own Tab stop while it overflows, named by the Tokenizer's label, so the arrow keys can scroll it. (#4405) -
TimeInput, DateTimeInput: under a finger, the bottom sheet's minute wheel loops, as UIDatePicker's does: past 59 comes 00, and the hour stays, as on iOS. A drag, a fling, a tap or an arrow key passes the seam. Home, End and a click on a minute never pass it. The hour wheel does not loop yet. Each minute is still listed once for assistive technology. (#10953)
-
When a page mounts both the package's AppShell and a swizzled AppShell as outermost shells, only the first now keeps the fixed main-region id; the other takes a generated id, as two package shells already did. Before, each copy kept its own claim list, so both shells used
astryx-app-shell-mainand the page had a duplicate id. No API changes. (#11208) -
BottomSheet: a finger's pull down on the sheet's content is handled by the sheet's touch listeners alone, and it releases at the speed of the whole pull. Before, the content's pointer handlers, which serve a mouse or a pen, began the same drag first and took pointer capture, and the capture change cancelled that drag one move later. The touch listeners then began the drag again, or, in Chromium, the content's own pan could start under it. The release speed counted only the moves after the drag began, so a fast flick on the content that the page received as two or three moves read as no speed and sprang back, where the same flick on the grab handle closed the sheet. A flick on the content now closes the sheet as a flick on the grab handle does. This also applies to the sheets that Tokenizer and PowerSearch open. A mouse or pen pull from the content also releases at the speed of the whole pull. No release threshold changes. (#11145)
-
BottomSheet: a move of a touch drag no longer restyles the sheet's content. Each move writes the scrim's opacity on the dialog as a custom property, and the property inherited into the sheet, so the browser restyled every element in the sheet on every move: 51 elements a move in a Tall sheet with a short list, 84 in PowerSearch's Filters sheet with three filters, and more with more content. The sheet's panel now ends that inheritance, and a move restyles the dialog, its backdrop, the panel and the edge tint. The scrim follows the drag as before. This applies to the sheet that owns the scrim: a single BottomSheet, or the first sheet of a stack, such as PowerSearch's Filters sheet and Tokenizer's sheet. (#11154)
-
BottomSheet: in Safari, and in every browser on iPhone and iPad, a swipe on the sheet's content that starts slowly now moves the sheet, so a slow swipe down can close it. Before, on content that fits, when the finger's first move was 8 px or less, in either direction, the sheet stopped answering that swipe: it stayed open, or moved a few pixels and fell back. Fast swipes and swipes on the grab bar already worked, and Chromium browsers were not affected. The fix applies wherever the touched content has nothing to scroll: a sheet whose content fits, and the fixed header or footer around a list. That includes the PowerSearch and Tokenizer sheets. At the top of a list that scrolls, a pull down now also moves the sheet when the finger first wobbles up by less than 5 px; a move up of 5 px or more still scrolls the list. In every browser, the sheet now decides who owns a touch on its content once, at the first move past 8 px. A mostly vertical pull at a scroll edge is the sheet's. A mostly sideways move, such as a swipe along a row of chips, is not the sheet's for the rest of that touch. Before, at the top of a list, a sideways swipe that drifted more than 8 px down, or a pull that began more sideways than down, also moved the sheet. (#11140)
-
Button: a disabled or loading submit or reset Button, including one in a disabled ButtonGroup or InputGroup, no longer submits or resets its form when clicked in server-rendered HTML before the page hydrates or when JavaScript fails to load. It renders as a plain button until hydration, then takes its own type again, with no change to what people see or hear. (#11107)
-
A Carousel's scroll buttons no longer cover the scroller's keyboard focus ring. Each button now sits just inside the ring instead of straddling the carousel's edge, so the whole ring stays visible while the scroller has focus (#10722). (#10726)
-
A transient copy that carries an animation still waiting for its first frame now runs it in step with the original. On a busy page, the SideNav rail's leaving copy could start the toggle's press fade a frame or more after the toggle's own. (#10983)
-
CommandPalette: refresh results when itssearchSourcechanges while it is open. (#9679) -
createISOTimeString answers null unless the trimmed string is H:M or H:M:S with one or two digits per field (a seconds fraction is still accepted and dropped), instead of reading "2:30 PM" as 02:30 (12 hours off) and "14:30abc" as 14:30 (#11023)
-
FileInput's dropzone shows its status message below the drop area by default, so it no longer covers the drop area; an explicit
statusVariant="attached"still renders as before. (#11195) -
A pan over the page that the browser doesn't take as a scroll no longer closes an open popover or selector list, and no longer taps the page element under the finger. (#11038)
-
A swizzled overlay and the package's components now share one set of focus regions and one mobile keyboard model: nested focus regions from the package and a copy no longer both answer the same Tab, and package and copied fields agree on the keyboard's height, its layout guide and which elements ride it. No API changes. (#10831)
-
On a phone, a press on a control at rest no longer measures the page, so a scroll that starts there does not wait. Hit areas no longer measure while the page scrolls or while a parent's animation moves them, such as a screen that slides in. A press on a control that a parent moves still measures the page. When a parent starts to move after the last measurement, the browser's own hit test decides the tap. No API changes. (#11083)
-
The arrow-key hint that Toolbar, TabList and SegmentedControl show on first keyboard focus now stays until you press an arrow key or Escape, or move focus out of the group (WCAG 2.2 SC 1.4.13 Content on Hover or Focus). It used to disappear after 3 seconds, sometimes before it could be read, and Escape did not close it. Escape now closes only the hint, through the shared layer dismissal stack, and keeps focus where it is.
useKeyboardHint'sdismissAfterMsno longer defaults to 3000; leave it unset. (#10564) -
Closing a Lightbox stops a video that was playing. The viewer stays mounted, so the picture and its sound would otherwise continue after Close, Escape, or a tap outside. A viewer that is already closed does not start playback either. Opening it again plays the current video when
hasAutoPlayis set. A video inside the caption stays stopped. (#10692) -
A swizzled ListItem inside the package's List (or a package ListItem inside a swizzled List) now leaves the way a package row does: it keeps what it showed on screen, such as a swipe's travel, for its exit. Before, the List and the ListItem kept separate records of the rows the List reported and of the presentation a leaving row kept, so the row's exit lost that presentation. No API changes. (#11214)
-
Make onClick-only TopNav items keyboard accessible (#9334) Previously, onClick-only TopNav actions could be skipped by Tab or could not be activated from the keyboard. TopNavItem now provides button semantics and Enter/Space activation while preserving its anchor ref/event types and custom link rendering. Desktop TopNavMegaMenuItem actions and drawer TopNavMenu actions now use non-submitting native buttons.
This restores keyboard operation and action semantics for WCAG 2.2 A criteria 2.1.1 and 4.1.2. Disabled TopNavItem actions remain focusable but cannot activate; href navigation and the existing desktop menu keyboard model are unchanged.
-
A fence plugin made with the package's
createMarkdownFenceTransformnow renders its node in a swizzled Markdown, and the reverse. Before, the copy described the plugin to its transform under its own keys, so the package's fence transform refused to run and the fence fell back to a plain code block. No new props, exports or defaults. (#11167) -
Under right-to-left, plain text in
InputGroupText, aBadgelabel and aTokenlabel keeps the character order it was written in. Text with no right-to-left letter, such as a URL scheme (https://), a domain suffix (.com), a count (+3),C++, a handle (@alice) or a tag (#design), used to show reordered (//:https,com.,3+); it now lays out left to right. Text that contains a right-to-left letter keeps the page's direction, isolated from its neighbours, soiPhone جديدstill reads right to left. A rich (non-string) label or child is isolated but keeps the page's direction: mark mixed directions on your own content. PlainInputGroupTexttext with no right-to-left letter sits in an innerspan. Left-to-right pages are unchanged. (#10114) -
A swizzled component that carries its own copy of Core's layout motion, spinner rotor or gesture sync now shares the package's: a layout change in one copy starts at the frame the other copy's change started in, so their glides land together; spinners from both copies are pinned to the timeline in one batch, so rings mounted together cost one style recalculation instead of one per copy; and a gesture sync running in one copy holds the other copy's gesture callbacks too. No API changes. (#11027)
-
Popover: initial focus takes the first content control in document order everywhere. This changes the focused control only where
querySelectorAlldoes not return document order, as in jsdom; browsers focus the same control as before. (#11177) -
Icons registered with
registerIcons()now reach swizzledIcon,CodeBlock,TableandTimestampcopies on the same React. Themes registered by name are now shared by every Core bundle loaded on one React. Each registry is one per React, so a second React on the page never renders the first one's elements. No API changes. (#11096) -
A swizzled ResizeHandle or LayoutPanel now finds the package's panel or handle beside it, and the reverse. When the region collapses, focus inside the panel moves to the handle and the panel goes inert. Before, each copy kept its own records of lent panels and handles, so the panel resized, but focus could drop to the page as it collapsed. No API changes. (#11131)
-
The package root and the component barrels no longer carry
'use client'. Inside a React Server Component,import {Card, Stack, Badge, Code} from '@astryxdesign/core'now renders the components that need no client code on the server, as their own modules intend; components that need the client stay client references. A Server Component that imports from the package root now builds with Next.js webpack. Client code renders the same as before. No API changes. To pass one of these components itself as a prop to a Client Component (for examplecomponents={{inlineCode: Code}}onMarkdown), pass it from a'use client'module. (#11106)In a Next.js app that uses
next build --webpack, importing the package root from a Server Component page or layout now builds; v0.7.13 failed with “export * in a client boundary.” The root import includes every client component on that route. Addexperimental: {optimizePackageImports: ['@astryxdesign/core']}tonext.config, or import component subpaths such as@astryxdesign/core/Button. In a measured Button-only server page, this reduced first-load gzip from 846 kB to 224 kB. Turbopack (the Next.js default), Vite, and Client Component imports are not affected. -
In iOS Safari, a tap that wobbles less than 5 px on content under a scroll-edge pan keeps its click. The pan now holds the finger only once it has moved 5 px along its axis. In Lab, in iOS Safari, a tap on a pushed NavigationStack screen that drifts less than 5 px toward the back swipe now runs; one that drifts 5 px or more toward it still loses its click. (#10829)
-
A component built on useScrollableArea, such as ScrollableArea or BottomSheet, no longer renders again when focus moves between two descendants of a fitting viewport just after the component's own update. (#11135)
-
Toast ids are now one sequence across the package and a swizzled copy of
useToast. Before, each copy counted from 1, so a toast from a swizzled Toast and a toast from the package could share an id in the same queue, and dismissing one removed the other. No API changes. (#11092) -
A windowed Table keeps windowing when a text-size, zoom or theme change makes every row taller than
rowHeight. It windows at the height the rows measure, instead of rendering every row, and warns in development. Rows of unequal height still render every row. (#11000) -
Without a
LayerProvider, toasts from a swizzleduseToastand from the package now show in one fallback stack. Before, each copy mounted its own fallback container, so the page showed two toast stacks that overlapped. No API changes. (#11161) -
Tokenizer: with
hasEntriesOnFocus, picking a choice from the list shown on focus keeps the input focused and the list open, with the next choice active, so you can pick several in a row. The list closes when no choice remains, atmaxEntries, or when you press elsewhere, Tab away or press Escape. A pick from typed search results still closes the list. (#11031) -
Typeahead and Tokenizer keep a dismissed menu closed when a search or focus bootstrap that was still running answers afterwards. Closing the menu with Escape, an outside click, Tab, or moving focus away also clears the busy indicator and drops a search still waiting on its debounce. A late answer for the same text is kept and shown the next time the menu opens, without searching again (reopening while that search still runs waits for its answer); an answer for text the person has since changed is dropped. Previously the late answer reopened the menu after it had been dismissed. (#8778)
-
AppShell's guidance on naming its navigation landmarks now says to pass
labelto TopNav andaria-labelto SideNav. SideNav has nolabelprop; it has a translated default name, andaria-labelrenames it. (#11151)Also released in
@astryxdesign/cli. -
Add hook documentation and interactive table cell truncation example block for
useTruncation, demonstrating responsive string truncation and accessibility tooltips. (#10555)Also released in
@astryxdesign/cli. -
InternationalizationProvider shows its examples in reading order: load a shipped locale, mirror the layout for right-to-left text (a new code example), override one string, then the calendar examples. Each live example is titled after its code example, so the two lists match. (#11094)
Also released in
@astryxdesign/cli. -
LinkProviderdocs say whatcomponentreceives, including thetoprop that router components read, that a link's ownasor a nearer provider wins over it, and that a disabled Link does not use it. (#11065)
-
Internal: Core's internal finger-scroll reader accepts a ref that names the document, so Lab's ChatVirtualizer can watch the page's own scroll when it attaches to
document.scrollingElement. Apps import nothing new. (#10883) -
Internal: MobileNav keeps its dialog rendered from the open until its delayed close has run through the layer runtime's presentation hold (Layer/presentationHold.ts). No behavior change. (#8590)
-
Internal:
useChatStreamScroll's page-scroller rules move to one owner module: whether a container scrolls the page, where its visible area starts, and where its scroll events fire. The hook behaves as before, and the undocumented@astryxdesign/core/internal/page-scrollerentry gives the same rules to Lab's ChatVirtualizer. Internal entries are outside the public API and its compatibility promise. (#11160) -
Internal: Core's reorder controller finds a collection's rows through an internal rows reader, so a later change can reorder plain elements. List behaves as before, and apps import nothing new. (#11199)
-
astryx discoverlistsWeightedSVGIconamong@astryxdesign/lab's components: an experimental SVG icon whose drawing follows the surrounding font-weight. (#7918) -
astryx experimental theme editor howanswers a question that names the background ("a yellow background") for the background, with its tokens first, instead of as a color question. The preview's Overview page shows its open popover and tooltip first, below their anchors in space kept free for them, so they no longer cover the table. (#11159) -
astryx experimental theme editor: colors are generated the way the official themes are. (#11209)- An exact color you give stays exactly as given. In light it never moves: when no text reads on it, the text changes, and a pale fill that does not stand out from the page is reported. In dark it is kept too when text on it reads at 4.5:1 and it stands out from the dark page at 3:1, so the dark shades around it follow it; otherwise dark mode starts at shade 70, as the official themes do, and the result says why. A dark side never uses a light shade.
set <theme> neutral <color>: your exact color sits at its own shade in light and dark, and the shades around it follow it.- Text on accent and status fills comes from the neutral color's white or near-black (near-black first on warning), or pure black or white without a neutral color. Status tints are see-through in dark, and their text is measured over the surface; the accent tint is dark shade 30, or the nearest darker shade that citation text reads on; a tint is never the fill's own shade.
- An exact
--color-accent(or another main color token) wins over the color it would replace: the text on it is picked to read on your color, the focus ring keeps following it, a pale one is reported, and the result says so. - Text, icons and the focus ring take the nearest shade that reads, lighter or darker, so bases with dark light-mode surfaces get readable colors too.
- Hand edits to
palette.config.jsonare kept: your own anchors, names,kind,neutralProfile, vibrancy written by hand, and colors of your own. One-mode themes generate one mode. A stop layout maps by its own shades, half stops included; one without black and white, with too few shades or with a wide gap is refused. Fields the generator does not read are named. What the editor replaced is named when a color change touches the config. - A hand-edited generated color file is never overwritten, receipt or not; formatting is not an edit. Only color changes wait, and the refusal says how to keep or discard the edit; other changes go ahead. A file from another generator version is generated again. No unresolved color ever reaches the built CSS.
- The theme imports only the shades it uses, from
tokens/<theme>.palette-refs.ts. - Colors are read as browsers read them: negative hues, out-of-range saturation and chroma,
color(srgb …)andcolor(display-p3 …). Malformed functions, system colors and see-through colors are refused with the reason and a command that works, such as the color with its#, without quotes, opaque, or the nearest color name. A dial named another way (gray,brand,error,saturation,Accent) suggests the dial; a color dial with--onsuggests what the part really reads. vibrancy moreat 100 andlessat 0 are refused, a number out of range suggests the nearest one, undoing the last color removes vibrancy too, a vibrancy edited by hand into something invalid can be fixed withundoorset, and a replaced color shows what it was. A wide-gamut color says it is used as its nearest sRGB color.
-
astryx experimental theme editor: colors without palette commands. Colors come only fromeditor set <theme> accent|neutral|success|warning|danger|info <color>, which generates the light and dark shades and points the color tokens at them, as before. The newvibrancy <0-100>setting (more/lessstep by 10) sets how saturated the generated colors are; it needs a color and applies to the whole theme.editor new <theme>now takes any setting as a flag (--accent "#7c3aed" --font inter --corners round --vibrancy 60), checked the same way assetand applied in one build. The experimental copyexperimental theme palette generateis gone;theme palette generateis unchanged, andeditor setlists it as the command it replaces. Help, results and errors say "colors" and "shades" instead of palette, family and stop;showlists each color with its seed and the shade each token uses, with the generated files last (colors,colorNotes,vibrancyandcolorFilesreplacepalette). Component families are now groups:how --list groups, and thegroupfield insetandhowresults.how colors(orhow palette) explains how colors are made, and plain-words color questions ("brand color", "make it more colorful", "dark mode colors", "error red", "see all shades", "exact color for one token") answer with the commands.preview addwith no description adds a Colors page when the theme sets a color: every shade in light and dark with its number, hex and the tokens that use it, kept in step with each change. (#11149) -
astryx experimental theme: make and change a theme one checked change at a time (editor), and preview it on real pages in your app (preview). Only the new experimental command group changes;astryx themeand its output stay as they were. (#11101)- Checked changes.
editor set <theme> <thing> <value>takes a dial (corners, spacing, accent, neutral, success, warning, danger, info, font, headings, surfaces, buttons, type, text-size, base, mode), a design token, or a CSS property on a part, with--on <part|family>,--when <prop>:<value>,--state,--mode light|darkand--only. Each change is checked against what the installed Core's parts really read and against the token's type. A change that cannot take effect is refused (exit 1, anERR_THEME_*code, nothing written), and the error leads with the command that works. - What parts read. It is derived from the installed Core itself, version for version: a catalog of every component renders on the server with the project's own React, joined to Core's stylesheet. The result is cached under
node_modules/.cache/astryx-theme/. No new dependency. - An ordinary local theme.
<theme>.settings.jsonholds the settings;<theme>.settings.tsis generated from it;<theme>.theme.tsextends it, is written once, and keeps your own edits; the CSS and JS are built by the same build asastryx theme build. A plain part setting that a more specific base-theme rule would beat is repeated on those variant keys, and the result says so. - Families, modes, contrast. Styling one input or check styles its whole family unless
--only;--on containersand--on menusstyle every member. Only colors and shadows take--mode. Text this theme makes unreadable (below 4.5:1, and not that low in the base theme) is reported. - Editor commands.
editor new,editor set,editor undo(one step back; with a thing, removes that one setting so it goes back to the base theme's value),editor show(every setting, key values, contrast problems, and two self-contained HTML pages: the sample app page and every component; PNG pictures only with--png, using a Playwright or Chrome found on the machine), andeditor how(what a part reads, a family, a setting or aspect, a question in plain words answered with exact commands, a PNG picture's colors, or--list dials|tokens|parts|families|properties). - Preview in your app.
preview addwrites one route into the app's routes folder (theme-preview/inapp/orsrc/app/, or--path): a normal page that keeps your layout and providers, in an app shell with a nav item per page and, when it wears a theme made byeditor, a light, dark and system switch. With no description it adds the sample app page and every component; with a description it adds the page templates thebuildranking picks for it (--top);--templateadds one.preview listandpreview removemanage the pages; only files the preview wrote are replaced or deleted, only inside its folder, and every check runs before the first write. A template page that needs a package the app lacks is skipped, with the install command. With no app,preview app <dir>writes a starter Next.js app with the preview in it (--themecopies a theme in for the pages to wear) and prints the install and dev commands. - Experimental copies of
astryx theme.compile(the copy oftheme build),list,add,remove,use,eject,template,targetsandpalette generaterun the same functions with the same flags and JSON. Each experimental command doc names the stable command it will replace in a newreplacesfield, shown in its help as "Will replace: astryx theme build".
- Checked changes.
-
astryx experimental theme editor how: questions read the way people write them. (#11209)- Negation and "too" read the right way round: "shouldn't", "turn off", "never", "stop", "unbold", "too sharp" (rounder) and "too heavy" (lighter). "Everything except X", "but not in X" and "all but X" keep X as it is now. "Without" is read in the shipped languages, and "sans" means a typeface only before serif or font.
- A typed value always wins. A hex beats a color word. A hex with the wrong number of digits is refused by name and never replaced with a sample. The sign, multi-value padding,
%opacity,emtracking, numeric weights, written-out shadows and "40px tall" are kept. No color is picked when the question gives none. - "In dark mode" carries
--mode darkto every color command, parts included. A change that is the same in both modes, or a dark-mode ask on a light-only theme, says so instead of changing light. - Better parts and properties: side nav items, focus rings as outlines, tab underlines, icons, border colors (darker, subtler, contrast), the overlay, transparent backgrounds, progress bar thickness, smaller headings, underlines, line height and body weight. A question about what something is ("what does --color-accent do") gets the lookup.
- Typos with swapped letters and short forms (
bttn,brdr) are corrected. Portuguese, Italian and Korean words for buttons and rounded are read. - Sequences drop repeated and overwritten steps and stop at 12. Two asks that contradict each other are offered as choices, not run in turn. Changes come before lookups.
- Text output prints each command on its own line and never wraps one. A sequence prints as one line.
--theme ""and a repeated--themeare refused, for every subject. The default theme is the one an editor command changed last, not the newest settings file, andthemeChosenBysays how it was picked.- Pictures: every pixel is read up to 4 million, so 1-pixel lines count. tRNS is honored for gray and RGB pictures. A 0x0 picture names its size. 16-bit pictures are capped at 20 million pixels.
- Parallel lookups in an app with no themes leave no empty
themes/folder. A refusal's commands start the same way as the answer's.
-
astryx experimental theme editor how: answers that are safe, bounded and right. (#11209)- Every command
howsuggests names your theme (the only one, the one changed last, or--theme <name>; with no theme,my-theme, made first), has a real value instead of a<placeholder>, carries no shell comment, and is checked assetchecks it: a command thatsetwould refuse, or that changes nothing, is left out, and the answer says why. - Plain-words questions read negations and more or less ("remove shadows from cards" gives
box-shadow none, "less rounded cards" givescorners less), the values you type (hex, rgb(), lengths, dashed), states (hover, focus, checked, selected, disabled, pressed, invalid), dark or light mode, several changes in one question, a few words in other languages, and small typos. A question with no answer says so in JSON too, with the next commands to try. how <part>writes each condition as the--whenand--stateflagssettakes, or says why no flag reaches it; lists every statesetaccepts; and says when a part has no recorded reads, with commands that still apply.how <token>says when no part in the part data reads a token but Core's stylesheet does.- Lookups take any case, plurals and token names without dashes;
--listtakes the kind anywhere, singular or plural,--list=tokensand a filter that starts with--, and refuses--listgiven twice. - Pictures: a header bigger than 40 million pixels or pixel data shorter than the header says is refused at once; damaged files are refused; see-through pixels are skipped;
--atgives each point's alpha and refuses points it cannot read exactly or that fall outside the picture; any file name works, and other formats are refused by their bytes. setrefuses a value that holds a<placeholder>or a#comment.- A damaged part-data cache is built again, the cache is written whole, and a lookup in an app with no themes leaves no
themes/folder. - Text and JSON start commands the same way, and text output escapes control characters in what you typed.
- Every command
-
astryx experimental theme: data safety and value checks. (#11180)- A refused change puts back only the files that command wrote in that run, each whole, and only while they still hold what it wrote; a file changed by someone else meanwhile, or one it cannot restore, is left and named. The settings and undo history are written inside that rollback, and a refused
newleaves no trace. A link anywhere inthemes/or the theme folder is refused, and never followed or removed. A palette.config.json the editor did not write is kept.showfinds a build that does not match the settings (a command stopped mid-build, a hand edit) and builds it again, saying so. Temp files have their own editor names and are removed by the write that made them; nothing else is ever removed. Run from a subfolder, a command acts on the Astryx project above it, found asupgradefinds it: the search stops at a repository root and never takes the home folder. A package without Astryx inside that project is refused with the folder to run from, a package.json that does not parse is never walked past, and reply paths are absolute when the project is above the current folder. Yarn Plug'n'Play and a package.json without Core get their own messages. A full or read-only disk isERR_WRITE_FAILED. - Commands on one theme run one after the other, so no change is lost. The lock lives in the project's
node_modules/.cache(a folder that cannot be written is refused withERR_WRITE_FAILED); a lock left by a stopped command, or by one on another computer that stopped, is taken over. A command that waits more than 30 seconds is refused with the new codeERR_THEME_BUSY, naming the lock. - Every name the name check accepts builds (
brand-2). Names are at most 64 characters.newrefuses a link or a file where the theme goes, a stray word, a flag given two values, and an empty--like;--headingstakes a weight and a tracking; a refused flag suggests anewcommand. - Settings edited by hand are checked on load, and so is the step
undogoes back to. A saved value the editor no longer accepts names theundo <theme> <thing>that removes it, and that command works; a stepundogoes back to that holds one is passed with that value left out, and the result says so. A damaged undo step drops only itself and the steps before it. A quoted string or a data URL may hold a semicolon. - Token values are checked by their type: time, easing, font, shadow and outline style too, and heading weights as numbers. A value that would break the CSS, read itself, or name a placeholder such as
<color>is refused. Only colors take--mode; a shadow per mode would remove it in both. - Code highlighting, display text sizes and colored icon tokens can be set.
- An exact font family applies on phones too; phones keep their own reading sizes.
- A text size or type scale keeps the base theme's ratio and the theme's heading weights (an exact weight token still feeds them), on phones too.
text-sizetakes 10 to 32 pixels.fontrefuses values that would not build.vibrancyis refused when every color is a gray.undo <theme> <token>names the dial that still writes the token.- Reading a built theme writes no copy into the theme folder.
- A refused change puts back only the files that command wrote in that run, each whole, and only while they still hold what it wrote; a file changed by someone else meanwhile, or one it cannot restore, is left and named. The settings and undo history are written inside that rollback, and a refused
-
astryx experimental theme editor: settings that do what they say. (#11222)-
An exact token or part property always wins over a dial, whatever the order. A changed setting moves last, so it wins over what came before it. A shorthand set after its longhands says it replaces them. A setting for both modes replaces the one-mode settings it would sit under.
-
One mode on a part whose variants each have their own value is refused, with the command that names the variant. A setting saved for a mode a one-mode theme does not have can still be removed. A base theme package that is gone no longer blocks moving off it.
-
--whenmust be one property and value, and on a group it must belong to a member, as--statemust. An empty or repeated--on,--when,--stateor--modeis refused, and so are extra words afterundoandshow. -
undo <theme> <thing> <value>removes the setting only when that is its value. Scope flags without a thing are refused.undo <theme> baseandundo <theme> modeset them back to their defaults. A stored setting this Core does not know can still be removed. -
showbuilds the theme again when its settings were edited by hand or built by another CLI;--sectionwritessheet-<section>.html, not over the full sheet, and takes any case. A setting listed twice is refused. -
spacingscales the base theme's spacing; a corners step starts from the base theme's radius or the whole-theme setting;corners pillkeeps checkboxes square;headingsrefuses--mode;fontrefuses--whenand--stateand takes a preset in any case. -
A change that shows nothing says so. A switch of base or mode lists the parts it restyles and the color notes. A misspelled token in
var()and a typed path or capital letter for a theme get a did-you-mean. Text contrast that is not measured (one variant or state, the soft or outline button) is listed as not checked. The colors inshowgive each mode its own exact value. -
The copied
themecommands nameexperimental themecommands in their refusals.editor newandeditor howno longer claim to replace stable commands their copies replace. A package.json without Core gets the install command. -
A whole-theme token that no rendered part was seen reading is set with a note saying so, not refused. A part that reads the token the user named takes it for whatever property it feeds. A token named for another variant value (
--color-error-mutedwith--when status:erroron a banner,--color-icon-pinkon an icon) is taken. A part name such asconstructoris an unknown part, not a crash. -
A font for one role keeps its font after a whole-theme font, whatever the order.
-
Easings, font family lists,
light-dark()andcolor-mix()colors, shadows and times are checked the way the browser reads them. A shadow may use a token color, any length unit or a stacked shadow token.var()with a fallback, relative colors and system colors are taken. A time is at most 60 seconds. A font name may hold an apostrophe.var( --x )with spaces is checked for cycles. -
Saved exact tokens are checked on every command; one the rules no longer take names the
undothat removes it. -
A size change says that phones keep the base theme's reading sizes, and names scale steps outside 9 to 200 pixels. A refusal that suggests setting a property directly names the property that takes the value. Every suggestion
set,undoandshowgive names the theme and a value it takes, never a placeholder. -
The theme lock lives beside the Core the command reads, and a command outside a project takes none. When
showbuilds again, it says why: a file missing, another CLI version, settings changed after the build, or a build that did not finish.
-
-
astryx experimental theme editor: theme colors now come from the palette generator.set <theme> accent <color>(and the newneutral,success,warning,dangerandinfodials) writes the color as a family inthemes/<theme>/palette.config.json, in the shapetheme palette generatereads, and runs the same generator to writetokens/<theme>.palette.tsand its receipt. The theme's color tokens point at stops of that palette, light and dark from one color, following the stops the official themes use. A token moves to a nearer stop of the same family when it must read (text at 4.5:1, the focus ring at 3:1); the editor no longer mixes colors of its own.showreports the palette, which stop feeds each token, and the contrast behind each choice;how paletteexplains it;undo <theme> accentremoves the family and its tokens. An exact token (set <theme> --color-accent <color>) still wins over the palette. Color dials apply to the whole theme:--onand--modeare refused, with the exact-token command to use instead. (#11134) -
experimental theme preview addchecks the theme before it writes any page, and skips a StyleX template page in an app with no StyleX compiler (the result says why).experimental theme preview appchecks the folder before it builds a--theme, so a refusal writes nothing. (#11134) -
astryx experimental theme preview: the preview pages work in a production build. Leaving the Components page no longer crashes the route: a typeahead part (Tokenizer, CommandPalette) gets a small sample search source. On the Components page, a part renders inside the parent its playground names (Step in a Stepper, a SegmentedControlItem in a SegmentedControl, a RadioListItem in a RadioList), a part that only works deeper inside its parent is left out, a status variant is passed as{type}, ButtonGroup shows three buttons, and layers that stay closed are left out. A component that still throws shows a short note instead of a blank cell. The Overview page is the sample page's content, without a second app shell. Font:editor set <theme> font <name>andeditor showsay near the top when the font's package is not installed, with the exact install line; once it is installed, the nextsetorshowmakes the preview route import its stylesheet. (#11134) -
astryx experimental theme preview: safer refusals and recovery. (#11209)- No refusal suggests deleting or moving files: a damaged theme-preview.json, a page changed by hand, or a file in the way gets plain instructions instead.
--pathat the project root, insrc/or at the routes folder itself is refused: those folders hold the app. An older preview found there is named, with the remove that clears it.- A whole
removestops, deleting nothing, whenpage.tsxwas changed by hand, since it imports the pages. - A formatter run no longer counts as a change by hand.
editor setandshowname the preview files they left as they were (previewStale). - A recorded page whose file is gone is written again, or left out of the nav, so the route always builds. Moved pages get a hash. A failed write leaves no temp file or empty folder, and says which step failed. A read-only file keeps its mode.
preview app --themewaits for other commands changing that theme, and its retry suggestion keeps--theme.
-
astryx experimental theme preview: safer adds, removes and starter apps. (#11209)- Preview pages go in
_pages/, a folder Next never routes, so a preview at the project root or insrc/no longer turns on the Pages Router. A preview an older release wrote intopages/is moved on the next add or remove. - A refusal deletes nothing:
remove <page>loads the theme before it deletes a file, and names the whole-preview remove when the theme does not load. A theme that is gone is replaced by the app's own theme, with a note. - Only files the preview wrote are replaced or deleted, and never one changed by hand since (theme-preview.json records a hash of each).
removenames the files it kept, the ones already gone, and the ones it wrote again. - Files are staged and renamed into place together; a failed write puts every file back and is refused with
ERR_WRITE_FAILED. - A damaged theme-preview.json is refused with
ERR_THEME_INVALID, naming the file and the way out, in add, list and remove. --pathis refused when it is a file, inthemes/,node_modules/or a Pages Router folder, in a folder Next does not route, or written with Windows separators,~or white space at either end. The open line drops route groups and encodes each folder name.- Without
--path, list and remove find a preview recorded for a theme. add: an empty--templateis refused; a block passed to--templatesays it is not a page and suggests page templates as commands;--topis taken as typed and only with a description; a description may be several words without quotes, and only its first 40 different words are ranked; a package that is named but not installed counts as missing; a changed theme writes the default pages again; a page file an interrupted run left behind with the same text is taken over.- Suggested commands are shell-safe, and a wrong
--themenames the closest editor theme. list,removeandpreview apprefuse extra arguments.preview app: the app is written into a temp folder and moved into place, so a failure leaves nothing; folders inside the routes,themes/ornode_modules/, files, dangling links and odd names are refused; a folder with only.gitcounts as empty; every open font the theme names is added with a pinned range; the Colors page is included; a one-mode theme starts in its mode; a stale theme build is rebuilt first; the home page links to the preview, the.gitignorecoversnode_modules, and the open line is quoted.
- Preview pages go in
-
astryx experimental theme editor how --listis now a switch, as--listis everywhere else in the CLI: the first word says what to list and any words after it filter the list (how --list tokens accent), and--listalone lists the kinds. Reading a built theme no longer writes a temporary file intothemes/<theme>/; it uses the project's cache folder. (#11173) -
astryx experimental theme: fixes from a third theming round.preview add "<description>"adds the closest page when no page is exactly the one described, andmatchedsays which words of the description it covers; only a description no page relates to is refused, and its suggestions repeat--themeand--path. A page the app cannot show is skipped and the next match is taken, from the ranking and then the template search. A page's nav label is its template's name, however it was added. The accent and status fills keep your exact color in dark mode too when text on them reads at 4.5:1; otherwise dark mode uses the nearest shade that reads, and the result says why. Settingvibrancynames the status colors the theme does not set, which keep the base theme's colors (and so do info-tinted surfaces such as colored cards), with the commands that bring them in.newlists the mode it applied with the other settings.showprints your exact value where an exact token setting wins, and sizes, numbers and fonts once instead of per mode. Notes name a part inside the part a token is set on ("button inside toast"). A token no part reads says it changes nothing you see now.hownames the resting border (border … --when variant:secondary), answers a part's fill and text together ("light gray button with dark text"), and answers a status background ("the error background") with the status color. The Overview page's tabs and other controlled samples no longer throw when clicked, and its open popover and tooltip keep clear of each other at narrow widths too. (#11163) -
astryx experimental theme: fixes from a fourth theming round.preview add "<description>"adds an app page when the description names one (an issue tracker, a board, a dashboard, an app screenshot) instead of a hero, takes the side hero for a left-aligned or split hero, says that no page has a top nav of its own, and always says why it picked a page. A basepreview addsays which pages were there already and are written again (refreshed).howgives each token a value of its own type (--color-border "<color>",--border-width 1px; only theborderproperty takes a whole border), keeps the fill for a named tint ("light blue tint with blue text"), and no longer reads "border color" as a fill.undo <theme> <thing>names the setting it removed (removed) instead of printing it as the value in effect. A light-only or dark-only theme lists only its own mode's shades and notes.showlists corners or spacing set on a part or group, with what its parts get beside the whole-theme value (partValues).neutralnames the base theme's page background and the command for a white page.typesays what it still sets whenheadingssets weight or tracking;typeandtext-sizekeep each other's part of the scale in any order. A token no part reads says which tokens are built from it instead of claiming it changes nothing. An installed font says it is installed. A color's text switching between white and near-black says why. (#11165) -
astryx experimental theme: an accent or status fill keeps your exact color in dark mode only when it also stands out from the dark page (3:1) besides text reading on it; otherwise dark mode uses the nearest shade that does both, and the result says why. The preview's Colors page marks such a fill under the shade it really uses, for dark mode too. Suggestions frompreview addquote the options they repeat, such as a--pathwith a space. (#11165) -
astryx experimental theme:preview add "<description>"picks an app page only when the description names the app in a phrase (an issue tracker, an issue detail, a kanban board), so a page with a "buy tickets" button or a landing page for an AI tool no longer gets an app page; a detail view comes before its list, and the ranked page stays first when it already is that app.howkeeps the fill when a color word belongs to it ("a dark card with a thin border", "colored buttons with a border").shownames the radius token each part's corners really read. Theneutralnote offers a white page only in a theme with a light mode. When your exact accent or status color cannot be the dark fill, dark mode uses the shade nearest your color where text reads at 4.5:1 and the fill stands out from the dark page at 3:1.undo <theme> <thing>printssettingandremovedas its JSON does. (#11168) -
astryx experimental theme: fixes from a full review. (#11173)preview app --themecopies the whole theme folder, generated colors included, byte for byte, so the new app type-checks.preview app <dir>writes only into a new or empty folder (its--overwriteoption is gone): a folder that is not empty is refused, with a free folder name to use.- Translucent text and backgrounds are measured as drawn: each is laid over what is under it before contrast is checked.
- Two commands can run at once: each render uses a folder of its own.
- A change that is saved but cannot be checked says "saved, not checked" and exits 0.
- A light-only or dark-only theme applies only its own mode's settings and names the others, writes one value for the colors it sets, and its in-app preview starts in that mode with no switch.
- A damaged undo history no longer breaks
set(a new history starts, with a note), andundosays how to fix it. - Colors are picked against the theme's own exact page and surface colors.
- A change that changes nothing builds nothing and adds no undo step.
undo <theme> <thing>says what applies now (now).shownames the radius token each part reads, or says it is unknown.howanswers border-only questions without a fill.- The preview picker matches app and article pages by phrase: a news story or blog post gets an article page, never a record page; a description no page relates to (no phrase, and fewer than three words or two fifths of them matched) is refused.
- A preview outside the routes folder says the app does not serve it.
- More than eight contrast problems end with "and N more".
-
astryx experimental theme editor show: the text output prints the palette paths and contrast notes whole instead of one character per line, and keeps one line for each token a palette family feeds. (#11149) -
astryx experimental theme: fixes from a real theming round.headingsnow keeps heading weight and letter spacing whatever order it andtypeare set in;typesays what it no longer sets, andshowmarks a setting another one partly hides. A steeptypescale (editorial, display) keeps text below the base size at its standard sizes, so small text stays readable.showlists every setting with its whole scope (--on,--when,--state,--mode). A gray color (accent #171717) makes gray shades in light and dark instead of inventing a hue.neutralno longer tints the page background (--color-background-bodystays the base theme's).setaccepts every token a color,type,headings,corners,spacingortext-sizewrites, so a dial's notes never name a tokensetrefuses. When the components cannot be rendered (two copies of React, say),new,setandundosave the change and say "saved, not checked" with the cause and the codeERR_THEME_NOT_CHECKED, instead of failing after writing;howsays what it could not check instead of listing no readers. A font that is not installed names the closest font that needs no install.howanswers each aspect once, turns sizes in the question into--when size:…, takes each color from the word it belongs to, says when text takes the page's text color, andhow --listwith no kind lists the kinds.preview add "<description>"says what it matched and why, leaves app frames out, refuses with the closest pages to name when no page really matches, and takes the next match when a page cannot be shown here. The preview fills the whole window with the theme, shell and edges included; the Overview page now shows what themes most often break, and each cell of the Components page names the command that changes it most.show --groupis nowshow --section: it picks a section of the theme-building sheet, so "group" only means a group of parts (--on inputs). (#11149) -
Icon sets: authoring a set is easier. An author sees which icon meanings the bundled templates use that the set does not map yet, such as
documentandshare; a copied template shows a placeholder for each. Only the experimental icon commands, the icon-set lists inintegration checkand Doctor, two icon definitions' search words, and the icon-set guide change. (#11090)- Authoring receipts.
experimental icon new-set,add, andmapend with one line when the set leaves template meanings unmapped: how many there are, the most used first with their template counts, and themapcommand to run. The JSON addstemplateMeanings: {unmapped: [{definition, templates}]}. A dry run adds nothing. experimental icon --definitions. Each definition shows how many bundled templates use it (templates) and whether the set maps it (mapped). The set is the one--setnames, else the project's main set, else the only set of the icon-set package you run it in.--setis now accepted with--definitions.integration check. Each set'siconSetsentry addstemplateMeanings, printed under "Template icon meanings not mapped". It is never counted and never fails a check, even with--strict.new-set --adapter ./<path>#<export>. Declares the adapter a library of icon data objects or SVG strings needs, so the set wraps it with no hand edit to the data file.- Clearer receipts. The first
new-set --frominto a set with no icons says the set was created, not refreshed.add --variant <look> --allnames the first ten icons the module lacks and how many more; the JSON still lists every one. The command that adds unlisted sets as backups (fromicon useand Doctor) names every set the same way: by its name, or as<package>/<set>when two packages ship that name. - Better suggestions. A suggested icon whose id only starts with the definition's name and adds another thing (
delete-left, a backspace key) comes after the icons the definition's words name (trash), and a word two definitions share (store) comes after the words only one has.saveadds the word "floppy disk", andbankreads "building library" instead of "library".
- Authoring receipts.
-
Icon sets: copied templates draw the right icons in more sets, once a set maps the five new icon definitions. Only the experimental icon-set rewrite of
astryx template, five new icon definitions, the bundled templates'iconsdeclarations, and the icon-set guide change. (#11142)- Distinct icons keep distinct meanings. Some bundled templates gave two different icons one meaning, so both drew the same icon in every set. The Settings Dialog's "Keyboard shortcuts" and "Developer" rows, and its paintbrush and swatch, now draw different icons, and so do the icon pairs in Table Filter, Theme Showcase, and the Button Group showcase block. New icon definitions:
keyboard,paintBrush,documentSearch,bookmarkAdd, andwallet. No set released before this change maps them, so with such a set the Settings Dialog's "Keyboard shortcuts", "Color theme" and "Verbose logging" rows, Table Filter's save-view button, and Theme Showcase's wallet draw the placeholder. A set draws these icons once it maps the new definitions (astryx experimental icon map <definition> <icon> --set <main>); until then each draws the placeholder, unless a set in your list wraps the template's library. - An icon from a set's own library stays. When a set in your list wraps the library a template imports an icon from, the icon is one your project chose. With the main set's own library, the icon keeps its import as written. With a backup set's library, an icon that no set maps keeps its import instead of becoming a placeholder. The report lists each one under
keptwith the reason.
- Distinct icons keep distinct meanings. Some bundled templates gave two different icons one meaning, so both drew the same icon in every set. The Settings Dialog's "Keyboard shortcuts" and "Developer" rows, and its paintbrush and swatch, now draw different icons, and so do the icon pairs in Table Filter, Theme Showcase, and the Button Group showcase block. New icon definitions:
- Open a sign-in dialog from the theme showcase's Sign in button, which was an inert link, so a theme's dialog header, close control, fields and footer buttons can be reviewed together. (#11130)
-
astryx component <ExampleName>, given an example block, still fails withERR_UNKNOWN_COMPONENTand the same name suggestions, but its message now says the name is an example block, thatastryx template <ExampleName>prints its source, and whichastryx component <Parent> --blockslists it. (#11153) -
astryx searchno longer counts a component or hook keyword that is another entry's name as a match for that entry, sospinnerlists Spinner without NumberInput beside it. A keyword still counts when the entry's own description uses the word, or when it names the entry's own family member or its hook.buildreads keywords as before. (#11162) -
astryx templateandastryx buildread a template's needs from its real imports only. Words in comments, strings and JSX text no longer count as packages, so templates such asform-wizard,form-wizard-verticalandtable-treeno longer ask you to installNext,Distributionorcanvas-editor. A path alias such as~/libor#internal, or a name npm does not accept, is not reported as a package to install. (#11224) -
Template placeholder images follow dark mode. The placeholder a copied template page shows in place of its demo pictures is now a soft gray at low opacity that takes its tone from the surface behind it, so it no longer shows as a bright light-gray block in a dark theme. The gallery-hero, side-gallery and lightbox gallery examples no longer warn about duplicate keys when every picture is the placeholder. (#11150)
-
Theme commands no longer replace files they do not own, and they report the right errors.
theme template --overwritereplaces only an earlier copy of the template or a theme source file, and refuses folders, blank paths and paths that are not.ts.theme eject --overwritenever writes into another theme's folder or a theme the theme editor made, and the result names the packages the fork needs (missingPackages,installCommand).theme build --out <folder>writes<name>.cssinto the folder; a build never replaces its source, or a file at a path--outnames that it did not write, and two themes with one name in one run are refused (a header-less output of a CLI before 0.6.7 at the default paths, family outputs included, is still replaced). When--outnames a file that a CLI before 0.6.7 wrote, the build says so: delete that file and run the same build again. Twotheme add,useorremovecommands at once keep both changes. A theme whose local folder or package is gone no longer blocksuse,addorremoveof other themes; it is left out with a note; one broken local theme folder no longer hides every other theme fromlistandadd.addsays which owner it chose when a local theme shadows a package theme. An option without its value isERR_MISSING_ARGUMENTwith the command's usage, andastryx help <group> <command>prints that command's help. (#11210) -
The theme showcase's Sign in dialog opens empty each time, not with what was typed before a Cancel. (#11139)
-
The CLI turns on Node's compile cache, so a run skips most of compiling the CLI's modules again. The cache sits in the user's own folder in the system temp folder (
node-compile-cache-<uid>), used only once it exists (the first run on a machine just makes the folder, so a one-off run pays nothing for it) and only while it is a real folder the user owns and no one else can reach. Where the system has no user ids (Windows), that cannot be checked, so the cache stays off.NODE_DISABLE_COMPILE_CACHE=1turns it off. A cache that cannot be read or written is skipped without a word, and every command prints the same output. (#11217) -
astryx --help,-handhelpprint the root help from a command list stored in the package when it is published, instead of loading every command first. The list holds the terms and descriptions the fully loaded CLI prints, so while every command loads the help reads the same. A command whose module fails to load is listed in the published root help under its normal description, instead of being marked as failed; running that command still reports the failure. (#11194) -
Commands that read the docs Astryx ships (
search,build,docs,template) read each shipped doc that holds only plain data from a copy of its exports stored in the package when it is published, instead of importing the file. The copy is keyed by the file's text, so an edited doc, a doc that imports or calls anything as it loads, and every integration's docs are imported as before. Every command prints the same output. (#11191) -
searchandbuildread the components of a template Astryx ships from a list stored in the package when it is published, instead of parsing the template's source on every call;templatedoes too when it leaves a template's demo content unchanged. The list holds exactly what parsing returns, keyed by the source text, so a changed source or an integration's template is parsed as before. Every command prints the same output. (#11190) -
A process that calls
themeTargets()more than once scans Core's component docs once. It reuses that scan while every folder and doc it read is unchanged, as the docs and search catalogs do. A Core reached through a symlink, as a project's node_modules reaches it, shares the scan of its real path. A one-shotastryx theme targetsand the theme build's target check still scan once. Every command reports the same targets. (#10981)
-
The calendars guide names every calendar by its CLDR name, such as Minguo, Dangi, Hijri, and Ethiopic, with its identifier beside it. (#11102)
-
The token tables in
astryx docssay that their values are Core's defaults, which a theme replaces: the columns read "Core default", "Core default (light)" and "Core default (dark)". The Color topic also says that each theme defines its own values and thatastryx theme listshows the themes that are available. (#11089)
- Internal: the module loader imports a user module through the same small module the doc importers use, which the CLI's own test project loads natively, so a theme build's doc reads no longer time out its tests on a busy machine. No change to any command's output. (#11119)
Thanks to everyone who contributed to this release:
@AKnassa @bstcoc @cixzhang @fullstackhacker @humbertovirtudes @hurrymaplelad @imdreamrunner @josephfarina @korkt-kim @nynexman4464 @SebTardif @utkarshpatwa393-sys @vjeux @whispering3
Full Changelog: https://github.com/meta/astryx/compare/v0.7.13...v0.7.14
slate-react@0.147.6
- #6364
6f00413Thanks @dannelundqvist! - Copy and cut now use the selection the user just made. Selection changes reacheditor.selectiona little later than they happen, and copy and cut wrote the clipboard fromeditor.selection, so a copy straight after selecting, such as Ctrl+A followed at once by Ctrl+C, could copy the previous selection or nothing at all. Copy and cut now process any pending selection change first, before anonCopyoronCuthandler runs.
v5.3.9
- Guard placeholder glow/wave animations behind prefers-reduced-motion by @julien-deramond in https://github.com/twbs/bootstrap/pull/42769
- Add
.modal-xxlsize to modals by @julien-deramond in https://github.com/twbs/bootstrap/pull/43291 - Rename datetime edit minute pseudo-element by @kataokatsuki in https://github.com/twbs/bootstrap/pull/42935
- fix(util): correct typo in isVisible comment (falsie → falsely) by @fauzan171 in https://github.com/twbs/bootstrap/pull/42478
- Fix carousel touch handling without Pointer Events by @Kevinjohn in https://github.com/twbs/bootstrap/pull/42714
- Improve JSDoc of
parseSelector,reflowandgetNextActiveElementinjs/src/util/index.jsby @fauzan171 in https://github.com/twbs/bootstrap/pull/42479 - Use
Element[]forgetNextActiveElement'slistparam in JSDoc by @julien-deramond in https://github.com/twbs/bootstrap/pull/42978 - Carousel: don't throw when no indicator is active by @njarrar in https://github.com/twbs/bootstrap/pull/42974
- Fix ScrollSpy smooth scroll from nested link content by @ShiroKSH in https://github.com/twbs/bootstrap/pull/42673
- v5: Preserve literal tooltip and popover text from data attributes by @mdo in https://github.com/twbs/bootstrap/pull/43319
- #41690: [docs] Tables doc - Variants code examples miss table class by @stefan-korn in https://github.com/twbs/bootstrap/pull/41691
- Update a link in introduction.mdx by @Shakil-Shahadat in https://github.com/twbs/bootstrap/pull/41861
- Add incident response plan documentation by @mdo in https://github.com/twbs/bootstrap/pull/41905
- Remove link to translation associated with supply chain attack by @bardiharborow in https://github.com/twbs/bootstrap/pull/41973
- Add astro-broken-links-checker to detect and fix broken internal links by @julien-deramond in https://github.com/twbs/bootstrap/pull/42178
- Bump year to 2026 by @julien-deramond in https://github.com/twbs/bootstrap/pull/42208
- Fix link in CONTRIBUTING.md to GitHub blog by @coliff in https://github.com/twbs/bootstrap/pull/42207
- Use
.ncurc.jsoninstead of args in command line and enforce decisions in Dependabot by @julien-deramond in https://github.com/twbs/bootstrap/pull/42315 - Add cooldown configuration for Dependabot by @coliff in https://github.com/twbs/bootstrap/pull/42370
- docs(floating-labels): capitalize JavaScript by @stafferin in https://github.com/twbs/bootstrap/pull/42364
- Docs: enable
prettier-plugin-astroplugin by @julien-deramond in https://github.com/twbs/bootstrap/pull/42390 - docs: Heroes example Replace unstyled checkbox with form-check by @coliff in https://github.com/twbs/bootstrap/pull/42406
- docs: Remove iOS Navbar Dropdowns section (no longer relevant) by @coliff in https://github.com/twbs/bootstrap/pull/42424
- docs: fix wording in toasts 'show' doc by @coliff in https://github.com/twbs/bootstrap/pull/42428
- v5: examples: Replace deprecated classes by @coliff in https://github.com/twbs/bootstrap/pull/42423
- Replace actions-cool/issues-helper by actions/stale by @julien-deramond in https://github.com/twbs/bootstrap/pull/42433
- Replace actions-cool/issues-helper by actions/github-script by @julien-deramond in https://github.com/twbs/bootstrap/pull/42435
- Use
node-version-filein GitHub workflows by @Rishikesh183 in https://github.com/twbs/bootstrap/pull/42416 - docs: fix incident response security link by @ifer47 in https://github.com/twbs/bootstrap/pull/42468
- fix(util): correct typo in isVisible comment (falsie → falsely) by @fauzan171 in https://github.com/twbs/bootstrap/pull/42478
- Docs: add missing
role='button'to<a>dropdowns by @julien-deramond in https://github.com/twbs/bootstrap/pull/42482 - Improve Security Policy score by @julien-deramond in https://github.com/twbs/bootstrap/pull/42481
- Examples: remove unused
.text-smallby @julien-deramond in https://github.com/twbs/bootstrap/pull/42565 - Update navs-tabs.mdx: Typo by @ThomasLandauer in https://github.com/twbs/bootstrap/pull/42678
- Expand cSpell coverage to more file types by @julien-deramond in https://github.com/twbs/bootstrap/pull/42760
- Guard placeholder glow/wave animations behind prefers-reduced-motion by @julien-deramond in https://github.com/twbs/bootstrap/pull/42769
- Docs: replace https://popper.js.org references by archived GitHub Markdown content by @julien-deramond in https://github.com/twbs/bootstrap/pull/42870
- docs: update bootstrap-vue-next non-alpha by @VividLemon in https://github.com/twbs/bootstrap/pull/42848
- docs: fix modal JS examples, list numbering, and typos by @minirang in https://github.com/twbs/bootstrap/pull/42879
- docs: fix tooltip wording by @Rawal27 in https://github.com/twbs/bootstrap/pull/42941
- Fix carousel touch handling without Pointer Events by @Kevinjohn in https://github.com/twbs/bootstrap/pull/42714
- Improve JSDoc of
parseSelector,reflowandgetNextActiveElementinjs/src/util/index.jsby @fauzan171 in https://github.com/twbs/bootstrap/pull/42479 - Use
Element[]forgetNextActiveElement'slistparam in JSDoc by @julien-deramond in https://github.com/twbs/bootstrap/pull/42978 - Document the labels and use their new names in release notes and Dependabot by @julien-deramond in https://github.com/twbs/bootstrap/pull/43011
- Document the html label in the contributing guidelines by @julien-deramond in https://github.com/twbs/bootstrap/pull/43013
- Docs: Correct pseudo-class terminology by @Rawal27 in https://github.com/twbs/bootstrap/pull/42948
- Docs: add href to active pagination sizing links by @Kevinjohn in https://github.com/twbs/bootstrap/pull/42709
- Docs: move
aria-currentto the active link in the cheatsheet pagination (#43040) by @julien-deramond in https://github.com/twbs/bootstrap/pull/43041 - Docs: Remove outdated card dependency reference from accordion/collapse parent option by @Rawal27 in https://github.com/twbs/bootstrap/pull/42949
- docs: use https for browserhacks link by @pavan-sh in https://github.com/twbs/bootstrap/pull/42111
- Examples: restore sidebar dropdown focus outline by @Kevinjohn in https://github.com/twbs/bootstrap/pull/42710
- Docs: explain how to fill the
...placeholders for accessible names by @julien-deramond in https://github.com/twbs/bootstrap/pull/43078 - Docs: fix popover option types by @Kevinjohn in https://github.com/twbs/bootstrap/pull/42707
- Docs: fix dark offcanvas dismiss attribute by @Kevinjohn in https://github.com/twbs/bootstrap/pull/42706
- Docs: point the SRI Hash Generator link to srihash.org (v5) by @julien-deramond in https://github.com/twbs/bootstrap/pull/43259
- Add
.modal-xxlsize to modals by @julien-deramond in https://github.com/twbs/bootstrap/pull/43291 - v5: Replace Algolia DocSearch with Pagefind by @mdo in https://github.com/twbs/bootstrap/pull/43314
- v5 docs: Keep the Bootstrap logo link in v5 by @mdo in https://github.com/twbs/bootstrap/pull/43315
- Carousel: don't throw when no indicator is active by @njarrar in https://github.com/twbs/bootstrap/pull/42974
- Fix ScrollSpy smooth scroll from nested link content by @ShiroKSH in https://github.com/twbs/bootstrap/pull/42673
- Rename datetime edit minute pseudo-element by @kataokatsuki in https://github.com/twbs/bootstrap/pull/42935
- v5: Preserve literal tooltip and popover text from data attributes by @mdo in https://github.com/twbs/bootstrap/pull/43319
- docs(grid): document .col-auto in variable-width content by @RohithPariki in https://github.com/twbs/bootstrap/pull/42880
- Docs: explain tables in rounded containers by @nrps9909 in https://github.com/twbs/bootstrap/pull/42823
- docs(collapse): add nested collapse example by @pavan-sh in https://github.com/twbs/bootstrap/pull/42125
- Docs: explain column breaks in rows with vertical gutters by @johnkhigginson in https://github.com/twbs/bootstrap/pull/43303
- Add astro-broken-links-checker to detect and fix broken internal links by @julien-deramond in https://github.com/twbs/bootstrap/pull/42178
- Bump year to 2026 by @julien-deramond in https://github.com/twbs/bootstrap/pull/42208
- Use
.ncurc.jsoninstead of args in command line and enforce decisions in Dependabot by @julien-deramond in https://github.com/twbs/bootstrap/pull/42315 - Add cooldown configuration for Dependabot by @coliff in https://github.com/twbs/bootstrap/pull/42370
- Docs: enable
prettier-plugin-astroplugin by @julien-deramond in https://github.com/twbs/bootstrap/pull/42390 - Replace actions-cool/issues-helper by actions/stale by @julien-deramond in https://github.com/twbs/bootstrap/pull/42433
- Replace actions-cool/issues-helper by actions/github-script by @julien-deramond in https://github.com/twbs/bootstrap/pull/42435
- Use
node-version-filein GitHub workflows by @Rishikesh183 in https://github.com/twbs/bootstrap/pull/42416 - Expand cSpell coverage to more file types by @julien-deramond in https://github.com/twbs/bootstrap/pull/42760
- Stage npm releases for maintainer approval on v5-dev by @mdo in https://github.com/twbs/bootstrap/pull/43335
- Port manual docs deployment to v5-dev by @mdo in https://github.com/twbs/bootstrap/pull/43334
- Release v5.3.9 by @mdo in https://github.com/twbs/bootstrap/pull/43331
- Docs: explain column breaks in rows with vertical gutters by @johnkhigginson in https://github.com/twbs/bootstrap/pull/43303
Dependency updates (119 pull requests)
- Build(deps): Bump actions/checkout from 4.2.2 to 5.0.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41680
- Build(deps): Bump github/codeql-action from 3.29.10 to 3.29.11 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41678
- Build(deps): Bump calibreapp/image-actions from 1.1.0 to 1.3.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41679
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41696
- Build(deps-dev): Bump dependencies by @julien-deramond in https://github.com/twbs/bootstrap/pull/41717
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41721
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41730
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41744
- Build(deps-dev): Bump dependencies by @julien-deramond in https://github.com/twbs/bootstrap/pull/41780
- Build(deps): Bump github/codeql-action from 3.30.3 to 3.30.5 in the github-actions group by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41782
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41798
- Build(deps): Bump the github-actions group across 1 directory with 5 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41840
- Build(deps): Bump the github-actions group with 3 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41848
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41865
- Build(deps): Bump the github-actions group with 3 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41878
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41886
- Build(deps): Bump the github-actions group across 1 directory with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41912
- Build(deps): Bump the github-actions group across 1 directory with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/41961
- Build(deps): Bump the github-actions group across 1 directory with 9 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42190
- Bump htmlparser2 from 10.0.0 to 10.1.0 by @julien-deramond in https://github.com/twbs/bootstrap/pull/42201
- Bump zod from 4.1.12 to 4.3.6 (#42217) by @julien-deramond in https://github.com/twbs/bootstrap/pull/42218
- Bump jasmine to 6.1.0 and karma-jasmine-html-reporter to 2.2.0 (#42234) by @julien-deramond in https://github.com/twbs/bootstrap/pull/42235
- Build(deps): Bump the github-actions group across 1 directory with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42257
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42291
- Build(deps): Bump the github-actions group with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42306
- Build(deps): Bump devalue from 5.6.1 to 5.7.1 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42299
- Bump astro to latest version 5 with compatible @astrojs dependencies by @julien-deramond in https://github.com/twbs/bootstrap/pull/42310
- Build(deps): Bump vite from 6.4.1 to 6.4.2 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42290
- Build(deps): Override axios to 1.15.0 by @julien-deramond in https://github.com/twbs/bootstrap/pull/42311
- Build(deps): Bump github/codeql-action from 4.35.1 to 4.35.2 in the github-actions group by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42319
- Bump JavaScript build toolchain dependencies by @julien-deramond in https://github.com/twbs/bootstrap/pull/42324
- Build(deps): Bump follow-redirects from 1.15.11 to 1.16.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42309
- Build(deps-dev): Bump preact from 10.28.0 to 10.29.1 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42273
- Build(deps): Bump picomatch by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42244
- Build(deps-dev): Bump flatted from 3.3.3 to 3.4.2 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42213
- Build(deps): Bump immutable from 4.3.7 to 4.3.8 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42122
- Build(deps): Bump svgo from 4.0.0 to 4.0.1 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42115
- Build(deps-dev): Bump minimatch from 3.1.2 to 3.1.5 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42102
- Build(deps): Bump qs from 6.14.0 to 6.14.2 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42079
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42335
- Build(deps): Bump lodash from 4.17.21 to 4.18.1 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42348
- Build(deps-dev): Bump @astrojs/markdown-remark from 7.1.0 to 7.1.1 in the development-dependencies group across 1 directory by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42374
- Build(deps-dev): Bump the development-dependencies group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42395
- Build(deps-dev): Bump axios from 1.15.0 to 1.16.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42396
- Build(deps): Bump fast-uri from 3.1.0 to 3.1.2 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42403
- Build(deps-dev): Bump @babel/plugin-transform-modules-systemjs from 7.29.0 to 7.29.4 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42404
- Build(deps): Bump the github-actions group across 1 directory with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42409
- Build(deps-dev): Bump the development-dependencies group across 1 directory with 9 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42438
- Build(deps): Bump calibreapp/image-actions from 1.4.1 to 1.5.0 in the github-actions group across 1 directory by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42442
- Build(deps-dev): Bump npm-run-all2 from 8.0.4 to 9.0.0 in the development-dependencies group across 1 directory by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42441
- Build(deps): Bump tmp from 0.2.5 to 0.2.7 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42446
- Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42464
- Build(deps-dev): Bump the development-dependencies group across 1 directory with 11 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42474
- Bump Node in
.nvmrcfrom 22.22.3 to 24.16.0 by @julien-deramond in https://github.com/twbs/bootstrap/pull/42477 - Build(deps): Bump the github-actions group with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42492
- Build(deps-dev): Bump the development-dependencies group across 1 directory with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42491
- Build(deps-dev): Bump shell-quote from 1.8.3 to 1.8.4 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42493
- Build(deps): Bump github/codeql-action from 4.36.1 to 4.36.2 in the github-actions group by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42515
- Build(deps-dev): Bump the development-dependencies group across 1 directory with 3 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42517
- Build(deps-dev): Bump form-data from 4.0.5 to 4.0.6 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42516
- Build(deps): Bump release-drafter/release-drafter from 7.3.1 to 7.4.0 in the github-actions group by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42542
- Bump js-yaml from 4.2.0 to 5.1.0 by @julien-deramond in https://github.com/twbs/bootstrap/pull/42555
- Bump rollup from 4.61.1 to 4.62.0 by @julien-deramond in https://github.com/twbs/bootstrap/pull/42558
- Pin
@babel/*dependencies to 7.29.7 by @julien-deramond in https://github.com/twbs/bootstrap/pull/42560 - Bump actions/checkout from 6.0.3 to 7.0.0 in the github-actions group by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42561
- Bump js-yaml from 5.1.0 to 5.2.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42603
- Bump the development-dependencies group across 1 directory with 2 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42606
- Bump release-drafter/release-drafter from 7.4.0 to 7.5.1 in the github-actions group by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42627
- Bump the development-dependencies group across 1 directory with 3 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42626
- Bump the github-actions group with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42666
- Bump the development-dependencies group across 1 directory with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42665
- Bump the github-actions group with 6 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42718
- Bump the development-dependencies group across 1 directory with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42722
- Bump immutable from 4.3.8 to 4.3.9 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42720
- Bump shell-quote from 1.8.4 to 1.10.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42721
- Bump engine.io from 6.6.4 to 6.6.9 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42719
- Bump fast-uri from 3.1.2 to 3.1.4 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42733
- Bump svgo from 4.0.1 to 4.0.2 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42751
- Bump js-yaml from 5.2.1 to 5.2.2 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42750
- Bump the github-actions group with 6 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42762
- Bump the development-dependencies group across 1 directory with 5 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42761
- Bump the github-actions group across 1 directory with 9 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42822
- Bump dependencies with 9 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42865
- Bump socket.io-parser from 4.2.4 to 4.2.7 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42785
- Bump the github-actions group across 1 directory with 5 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42867
- Bump js-yaml from 5.3.0 to 5.4.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42787
- Bump fast-uri from 3.1.4 to 3.1.6 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42803
- Bump brace-expansion from 1.1.12 to 1.1.18 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42786
- Bump the github-actions group with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42884
- Bump the development-dependencies group across 1 directory with 6 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42883
- Bump js-yaml from 5.4.0 to 5.4.1 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42888
- Bump postcss-selector-parser by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42887
- Bump the github-actions group with 5 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42914
- Bump the development-dependencies group across 1 directory with 7 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42913
- Bump vite from 6.4.2 to 6.4.3 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42916
- Bump svgo from 4.0.2 to 4.1.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42917
- Bump axios from 1.16.0 to 1.20.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42918
- Bump streetsidesoftware/cspell-action from 9.0.1 to 9.1.0 in the github-actions group by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42934
- Bump the development-dependencies group across 1 directory with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42933
- Bump the github-actions group with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42943
- Bump the development-dependencies group across 1 directory with 8 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42942
- Bump the github-actions group with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42964
- Bump the development-dependencies group across 1 directory with 3 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42963
- Bump fast-uri from 3.1.6 to 3.1.8 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42959
- Bump brace-expansion from 1.1.18 to 1.1.21 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42972
- Bump the github-actions group with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42982
- Bump the development-dependencies group across 1 directory with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42981
- Bump js-yaml by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42985
- Bump source-map-js from 1.2.1 to 1.2.2 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42986
- Bump smol-toml from 1.8.0 to 1.9.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42987
- Bump devalue from 5.7.1 to 5.9.4 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42988
- Bump shell-quote from 1.10.0 to 1.12.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42989
- Bump http-cache-semantics from 4.2.0 to 4.3.0 by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/42990
- Update dev dependencies in the lockfile to fix security advisories by @julien-deramond in https://github.com/twbs/bootstrap/pull/43023
- Chore(deps): Bump the v5-github-actions group with 9 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/43161
- Chore(deps-dev): Bump the v5-development-dependencies group with 11 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/43159
- Chore(deps-dev): Bump the v5-development-dependencies group with 3 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/43203
- Chore(deps-dev): Bump the v5-development-dependencies group with 6 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/43265
- Chore(deps): Bump the v5-github-actions group with 4 updates by @dependabot[bot] in https://github.com/twbs/bootstrap/pull/43266
- @stefan-korn made their first contribution in https://github.com/twbs/bootstrap/pull/41691
- @Shakil-Shahadat made their first contribution in https://github.com/twbs/bootstrap/pull/41861
- @stafferin made their first contribution in https://github.com/twbs/bootstrap/pull/42364
- @Rishikesh183 made their first contribution in https://github.com/twbs/bootstrap/pull/42416
- @ifer47 made their first contribution in https://github.com/twbs/bootstrap/pull/42468
- @fauzan171 made their first contribution in https://github.com/twbs/bootstrap/pull/42478
- @minirang made their first contribution in https://github.com/twbs/bootstrap/pull/42879
- @Rawal27 made their first contribution in https://github.com/twbs/bootstrap/pull/42941
- @Kevinjohn made their first contribution in https://github.com/twbs/bootstrap/pull/42714
- @pavan-sh made their first contribution in https://github.com/twbs/bootstrap/pull/42111
- @njarrar made their first contribution in https://github.com/twbs/bootstrap/pull/42974
- @ShiroKSH made their first contribution in https://github.com/twbs/bootstrap/pull/42673
- @kataokatsuki made their first contribution in https://github.com/twbs/bootstrap/pull/42935
- @RohithPariki made their first contribution in https://github.com/twbs/bootstrap/pull/42880
- @nrps9909 made their first contribution in https://github.com/twbs/bootstrap/pull/42823
- @johnkhigginson made their first contribution in https://github.com/twbs/bootstrap/pull/43303
Full Changelog: https://github.com/twbs/bootstrap/compare/v5.3.8...v5.3.9
@astrojs/vue-renderer@0.1.1
- Updated dependencies [
e9916e1]:- @astrojs/runtime@0.1.1
astro@7.4.11
-
#18641
08e2ceeThanks @astro-factory! - Validates the protocol, host and port fromX-Forwarded-Proto,X-Forwarded-HostandX-Forwarded-Porttogether against eachsecurity.allowedDomainsentry, instead of one at a time:- A forwarded protocol is only applied when an entry allows it for the host in use.
- A forwarded port is only applied when the entry for that host lists it.
- A forwarded host without a forwarded protocol is validated with the protocol of the server.
- An entry with
port: '443'(or'80'forhttp) now matches a host that doesn't include a port.
-
#18651
93a9057Thanks @umeraamir69! - Returns 400 Bad Request for malformed percent-encoded paths in the dev server and static preview instead of bubbling into a 500 -
#18672
e901468Thanks @astro-factory! - Fixesastro checkreporting@astrojs/checkas missing when the package is installed but throws while loading. The original error is now shown instead of an install prompt. -
#18641
08e2ceeThanks @astro-factory! - Fixessecurity.allowedDomainsaccepting non-HTTP(S)X-Forwarded-Protovalues (such asftporws) when the list mixes patterns with and without aprotocol -
#18686
62bb716Thanks @astro-factory! - Fixesastro builddeleting the license file generated by Vite'sbuild.licenseoption. Astro now removes only its own Vite manifest from the.vite/output folder. -
#18629
e9916e1Thanks @decrek! - Fixes spreading an object onto an element with scoped styles changing that object. When the same object was spread on every render, for example a constant imported from another module, itsclassgrew with every request. -
#18641
08e2ceeThanks @astro-factory! - Tightens howsecurity.allowedDomainsvalidates theHostandX-Forwarded-Hostheaders. Only a plain hostname with an optional port is accepted, and the validated host is applied toAstro.urlexactly as it was matched. -
Updated dependencies [
d13beeb,e9916e1]:- @astrojs/markdown-satteri@0.4.9
- @astrojs/runtime@0.1.1
- @astrojs/vite-plugin-astro@0.1.2
@astrojs/vite-plugin-astro@0.1.2
- Updated dependencies [
e9916e1]:- @astrojs/runtime@0.1.1