AsheeUI 1.0.0
The first release: what shipped, and why it shipped that shape.
An upgrade guide from 0.7.0, the previous published version.
What this release is
1.0.0 freezes the public API. From here on, a breaking change follows the
deprecation policy: an API is deprecated for at least one minor
release before it is removed, and removal happens only in a major release.
What a 0.7.0 consumer is upgrading across
0.8.0 was versioned internally but never published, and the 0.9.x release
stage the plan described was folded into 1.0.0. The registry goes from 0.7.0
straight to 1.0.0, so everything recorded for 0.8.0 and 1.0.0 is new to you.
| Package | From | To |
|---|---|---|
asheeui |
0.7.0 |
1.0.0 |
@asheeui/cli |
0.6.7 |
0.6.9 |
Requirements
| Requirement | Version |
|---|---|
| React | 18.2 or newer, or 19 |
| React DOM | the same major as React |
| Tailwind CSS | 4.0 or newer |
Nothing else changed: no bundler plugin, no build-time configuration file, and the CLI remains optional.
Upgrading
pnpm add asheeui@1.0.0
Then apply the changes below, run your test suite, and if the stylesheet import,
the provider or the configuration keys are involved, check the setup with
npx asheeui doctor.
Changes that break a build
Three kinds of change produce a compile error, and each is mechanical.
Renamed components
Select is now Dropmenu, DatePicker is now Calendar, and TextArea is now
Textarea. The old names are gone and there is no alias.
| Before | After | Also rename |
|---|---|---|
Select, SelectProps |
Dropmenu, DropmenuProps |
components.select becomes components.dropmenu |
DatePicker, DatePickerProps |
Calendar, CalendarProps |
components.datePicker becomes components.calendar, and its datePicker sub-keys become calendar |
TextArea, TextAreaProps |
Textarea, TextareaProps |
components.textarea is unchanged |
One substitution API instead of a name per component
Link, Image and Form take the same two props: component names the
component that replaces the native element, and componentProps carries the props
that component needs.
| Before | After |
|---|---|
Link: linkComponent, linkProps |
component, componentProps |
Image: props |
componentProps (component unchanged) |
Avatar: imageProps |
componentProps (component unchanged) |
Breadcrumb step: linkComponent, linkProps |
component, componentProps |
Card image and link configuration: props |
componentProps (component unchanged) |
Form is new, so it ships with component and componentProps from the start
rather than renaming anything.
Internal helpers no longer exported
These were never documented as public API, and every other component keeps its equivalent private. Import them from their module path in this repository if you truly need them, or stop importing them.
Removed from asheeui |
|---|
FieldShell and the field helper exports |
MenuOption |
getInitials (avatar) |
getPaginationRange, PaginationRangeItem (pagination) |
RadioContext, RadioContextValue, useRadioGroupContext |
Behaviour changes to expect
These need no code change, but they change what a consumer sees. Two of them can surface a latent configuration mistake, so read those first.
Configuration is now validated
A value the framework cannot resolve throws while the provider renders, naming the key and the value, instead of silently falling back. An unknown key warns in development and is silent in production. If your configuration contains a typo or a value that stopped being valid, this release is where you find out.
The built-in defaults changed
The default radius is xs and the default variant is faded, where they used to
be md and solid. Pass the old values in your configuration to keep the
previous look:
<AsheeUIProvider config={{ defaultRadius: "md", defaultVariant: "solid" }}>
A stored theme the configuration does not define is ignored
If localStorage holds a theme name your configuration does not define, the
framework now falls back to your default instead of applying a theme class with
no CSS behind it.
Dialogs render in a portal and manage focus
Modal and Drawer render into a portal rather than inside your subtree, move
focus in when they open, keep it inside, and return it when they close. Body
scroll is locked while one is open.
Consequences to check in your own code: a CSS selector or a query that assumed the
dialog lived inside a particular parent no longer matches, the backdrop is
decoration rather than a focusable control, and the dialog takes its accessible
name from the aria-label or aria-labelledby you pass.
The selection family is a listbox with full keyboard support
Dropmenu, MultiSelect and Autocomplete expose their list as a listbox of
options with selection and disabled state, and they are operable from the
keyboard: arrow keys open and move, Home and End jump to the edges, Enter
selects, Escape dismisses, typing matches an option, and focus returns to the
trigger. An uncontrolled MultiSelect accumulates its own selection, and the
trigger reports that it accepts more than one.
The calendar is a grid of labelled days
Calendar exposes a grid with labelled cells, the selected day, today and the
day the keyboard is on. Arrow keys move by day and week, PageUp and PageDown move
by month, and Escape closes the popover.
Structure and motion
| Component | Change |
|---|---|
Accordion |
A collapsed panel is inert and hidden from assistive technology, so its content is no longer focusable or announced |
Sidebar |
The active item carries aria-current, and an uncontrolled sidebar follows its own collapsed state |
Switch |
Its description is linked to the control |
Radio group |
The group is named by its label, links its description and message, and selects an uncontrolled defaultValue |
Marquee, Carousel |
Automatic motion stops when the operating system asks for reduced motion |
Toast |
A notification carries a status role, so it is announced when it appears |
Button |
A busy control keeps its label in its accessible name |
Theming
The theme CSS variables are now applied on a client-only render as well, so a client-rendered application gets themed colours before the first paint instead of rendering them unresolved. A server-rendered application is unchanged.
The structural scrollbar configuration also takes effect now.
components.scrollbar (width, radius, trackRadius, thumbBorder,
gutter) was previously ignored, because the stylesheet read variables that
nothing emitted.
New components and the typography system
Seven components and the typography system are new since 0.7.0, which brings the
public surface to 34 components. Deferred to after 1.0: Progress, Popover,
Separator and Alert Dialog.
| Added | What it is |
|---|---|
Typography |
Text with a semantic role, plus shared typography tokens |
Alert |
Inline message or validation summary, with an announcement role per intent |
Badge |
Compact status or label |
Skeleton |
Loading placeholder |
Avatar |
Person or entity, with an initials fallback |
Breadcrumb |
Hierarchical navigation trail |
Pagination |
Page navigation |
Form |
Native form element with framework styling and a submit control |
Every addition renders on the server and hydrates without a mismatch, which a test per component proves.
The CLI
@asheeui/cli moved from 0.6.7 to 0.6.9 and is not required by anything
above. Two things changed:
asheeui listderives the inventory from the package's public export surface, so an internal helper can no longer appear in it;- the generated
asheeui.config.*file is valid in both languages and exports the configuration object as the module's default export, which is what the provider wiring it writes imports.doctorno longer reports a missing configuration file as a failure, because the file is optional.
doctor and fix exit with code 1 while something is still broken, so either
can gate a script or a CI job.
After upgrading
- Apply the rename, substitution and export changes above.
- Run your test suite.
- Run
npx asheeui doctorto confirm the stylesheet import, the provider and the dependencies. - Check anything that asserted on dialog markup, because dialogs moved into a portal.
- If your theme comes from
localStoragewith custom theme names, confirm the names are the ones your configuration defines.
Further reading
| Document | Covers |
|---|---|
| Migration | The deprecation policy and every breaking change with its migration |
| Installation | Requirements, the stylesheet import, wrapping the root |
| Configuration | The cascade, the theme system, validation |
| Components | The component set, the prop axes, the substitution API |
| Accessibility | The conformance target and the keyboard behaviour |
| CLI | The optional commands |