Changelog
All notable changes to Eunomia are documented here. The format follows
1.1.0
2026-10-31
Changed
- icon: icons now ship in the package's JavaScript and load with any bundler, nothing to copy into your public folder
- The package is ~10 MB lighter
Deprecated
- icon:
setIconBaseUrlno longer does anything
Removed
- icon: the raw
.svgfiles are no longer shipped
Fixed
- The library now builds on Windows
1.0.0
2026-10-30
Added
- toolbar: added
layout="between",adaptive-theme-attributeand theburger-iconslot - toolbar: added CSS variables for the burger colors, the bar's blur, columns and top background, the skip links and the transitions
- grid: added the
eun-grid--quarters-1-3,eun-grid--quarters-3-1,eun-grid--fifths-2-3andeun-grid--fifths-3-2grids,--eun-grid-templateand its breakpoint variants, and--eun-grid-track-min - ssr: added
divider-ssr.css,stepper-ssr.cssandscheduler-ssr.css, andfield-ssr.cssnow draws the counter, date picker, time picker and color picker - animate: added
laptop-animationandlaptop-delay - collapse: added
--collapse-background-focus,--collapse-color-focus,--collapse-heading-font-weightand thetriggerandpanelparts - link, toggle, toggle group, dropdown button, carousel, image carousel, sidebar, calendar, scheduler, toolbar: added focus ring color variables
- jsx: kebab-case attribute names, and attributes such as
stepsas a string, are now typed - image carousel: the thumbnail strip fades on the edges that still hide thumbnails, and follows the active image
- angular: added
@eunomia/elements/angular, binding every form field tongModel,formControlandformControlName - table: added
--table-header-colorcss var - theme: added
pageBackgroundColortobuildThemeCss - nav menu: added the
eun-nav-menucomponent, a navigation entry that reveals a group of links - scheduler event editor: added
guest-error-label,range-error-label,requestCancel(),euneventcancelandeuneditorstatechange - calendar: added
next(),previous()andtoday() - calendar, scheduler: added
visibleRange, andeunperiodchangenow carriesdisplayedDate - scheduler:
addPeriodandgetVisibleRangeare now exported - react: added
@eunomia/elements/reactandeunProps, setting properties and event listeners from a ref
Changed
- theme:
--eun-text-secondaryis now greyer,grey-600in light mode and#d2d5dein dark mode, wherebuildThemeCsssets it to--eun-text-on-dark-secondary - Boolean attributes are now off by default,
"false"no longer turns one off - toolbar:
adaptive-themenow follows the page's sections on its own,refreshAdaptiveTheme()is no longer needed after a client-side navigation - toolbar:
eunchangenow carries the changed property and the current state in itsvalue - toolbar: the burger now takes the bar's text color
- link:
--link-color-focusnow sets the text color on focus, the focus ring uses--link-focus-outline-color - calendar, scheduler: the year view shows mini-month grids on a wide calendar
- calendar, scheduler:
eunperiodchangeno longer fires on the first render - scheduler, scheduler event editor: deleting from the event popover or the editor now asks for confirmation, set through
delete-confirm-label - scheduler, scheduler event editor: saving an unchanged event no longer fires
euneventupdate, Save and Apply stay disabled until something changes - scheduler event editor: timed events now have an end date, and an end before the start is refused instead of moved to the next day
- scheduler event editor: events are now saved with a hex color, and a preset name selects its swatch and is kept while unchanged
- scheduler event:
colornow accepts the color picker's formats, a preset's hex renders like its name, and an invalid value falls back to blue with a warning
Fixed
- toolbar:
eunchangenow fires once per opening or closing, and no longer on the scroll caused by the panel's scroll lock - drawer, modal, toolbar: the new page now stays at the top on close after a client-side navigation from inside them, and removing one while it closes releases the page scroll
- tab group:
hide-indicatornow works as an HTML attribute - tab panel: a hidden panel now stays hidden when the page sets its
display - grid: a nested grid no longer takes its parent's columns or template
- image carousel: the thumbnail strip no longer widens the carousel past a narrow container
- toolbar: the height cap on slotted content now follows the bar while it collapses
- input, textarea, counter: native constraint messages now follow the library's locale
- forms: a failed submit now focuses the first invalid field, without the browser's bubble over the inline error
- checkbox, switch, radio, check card, radio card: a link in the label now navigates instead of toggling
- radio list, checkbox list: a list connected before its children, as Angular renders it, now follows their changes
- checkbox list: setting
valuetonullnow unchecks every child instead of throwing - checkbox, switch, radio:
controllednow keepscheckedon a native form reset - checkbox, check card, switch, radio, radio card: a checked field without
valuenow submits"on", like a native checkbox - table: the row checkboxes now stay visible on mobile and tablet
- table, divider: a page-wide
* { margin: 0; padding: 0 }reset no longer overlaps the caption or removes the divider's spacing - carousel:
--carousel-nav-icon-sizeand--carousel-responsive-breakpointnow acceptrem,emand spacing tokens - i18n: dates, times, country names, the discard confirmation, the counter step error, the date picker time bounds and the stepper substeps now follow
setDefaultLocale() - scheduler event editor: fixed the guest email error and the French title error
- scheduler event:
focus()on the host now focuses the chip - scheduler: the popover's color bar now follows hex colors
- calendar, scheduler: the month view is no longer cut at its last week by default
- calendar, scheduler: the all-day row now stays pinned under the day header
- calendar, scheduler: switching views now scrolls to the current time or month
- calendar, scheduler: the mobile week no longer repeats the selected day above the grid
- calendar, scheduler: a timed event ending at midnight no longer covers its end day
- calendar, scheduler: multi-day bars in month view no longer show a start time
- scheduler: the event popover now shows the times of a multi-day timed event, "All day" follows the locale, and its buttons are larger
- scheduler: a new event now lasts
slot-durationinstead of one hour - date picker, time picker: clicking a filled segment now selects it, so typing replaces it
- date picker: with
with-time, the year now moves on to the hour, and a first date waits for its time instead of committing at midnight - date picker: no longer logs a Lit update warning on load
- time picker, date picker: the time panel now greys out the times outside
min-time/max-time - date picker: a value outside
min-date/max-dateor rejected byis-date-disablednow reports as invalid - color picker: an invalid hex is now kept in the field and reported as invalid, and no longer logs a browser warning
- stepper:
active-substeppast the last substep now counts as the last one - link, button:
links-ssr.cssnow draws the new tab arrow ofhref, spaced right at every button size and whatever the theme - fab: an inline fab no longer shifts its line when it upgrades
1.0.0-beta.9
2026-10-26
Added
- calendar, scheduler: added
hide-now-lineand--scheduler-now-line-color, to hide or recolor the current time line - action bar: added
collapsible, to shrink the count and select-all button to their number and icon when space runs out - table: added
collapsible-action-bar - tab group: added
fill, to make the active panel fill the group's height - action bar: added
viewport-centered-belowand--table-action-bar-viewport-centered-below, to center the bar on the screen below a breakpoint or a width - table: added
action-bar-viewport-centered-below - button: added
--button-width, also read byeun-dropdown-button - dropdown button: added
fullattribute - dropdown button: added
multiple, to check several options at once - table: added
row-numbers, to show each row's position - dropdown button: added
selectable,valueandclearable, for a single choice such as a quick sort or filter - table: added the
emptyslot, shown while the body has no row - action bar: added
--table-action-bar-center - table: added
density,compactorcomfortable - table: added
hide-action-bar, for selection controls of your own - table: added header, cell, row, frame, checkbox, row action and loading row sizing custom properties
- action bar: added size, spacing, action and count color custom properties
- fields:
hide-erroron a<fieldset>now applies to every field inside - skeleton: added
--skeleton-widthand--skeleton-height, read byskeleton-ssr.cssin every browser - table: added a shadow on each edge with more columns to scroll to
- table: a scrolling table can now be focused and scrolled from the keyboard
- form fields: added
hide-label, to hide the label but keep it as the accessible name - form fields: added
euneditcancel, fired when areadonly-availableedit is cancelled - input file:
valueaccepts the URL of a file already stored - input file: exported the
EunomiaInputFileItemtype - input file: a stored file can be given as
{ url, name }, to display a name other than the end of its URL - input: Enter confirms a
readonly-availableedit - pagination: added
align, to place the page controls at the start, center or end of the row - pagination: added
page-size-placementandpage-size-hide-below - pagination: added
--pagination-page-size-widthand--pagination-page-size-hide-below, a breakpoint name or a number of pixels
Changed
- icon: now uses Material Symbols
- rating:
empty-iconnow defaults tostar_outline - pagination: the row no longer wraps, and drops controls instead when space runs out
- pagination: the page-size selector now sits at the end of the row by default
- toast: now shown above modals and drawers, and stays clickable while they are open
- calendar, scheduler: today, the selected day and the focus ring now follow the theme's primary color, set through
--scheduler-accent-colorand--scheduler-accent-text-color - action bar: the center region now scrolls horizontally instead of wrapping
- table: below 600px, now keeps the action bar's room free under the table
- fields:
appearance="outline"now sits on--eun-surface-colorinstead of a transparent background - action bar: now centered under its table instead of the viewport
Removed
- icon: removed the Material Icons names renamed in Material Symbols (e.g.
expand_moreis nowkeyboard_arrow_down) - button: removed
--button-full, replaced by--button-width
Fixed
- table: an
infinitetable scrolled by the page or an ancestor no longer loads every page at once - select, search, input phone, color picker: options no longer inherit a centered text alignment
- input file: the file count is translated
- input file: the dropzone fills the height given to the field
- input file: without
multiple, the clear action reads "Remove" instead of "Remove all" - toast: removed the 1px border on the right of the default appearance
- table: a row end action wrapped in a tooltip hides outside hover, and the row stays active while its action menu is open
- skeleton: a fixed
widthsizes the element itself instead of filling its row - tooltip: no longer shows over the open menu of its anchor, and a click on the anchor hides it
- tooltip: only a touch or pen tap on the anchor pins it open, no longer a mouse click or keyboard activation
- select: the field and readonly display show the selected label once options are added or changed after the first render
- search: Ctrl+K no longer opens hidden instances
- dropdown-button: menu labels stay left aligned when the button sits in a right aligned container
- scheduler: the event detail popover now follows its event when the grid scrolls
- calendar, scheduler: dropping a dragged event no longer opens the editor
- textarea: the field and the
readonly-availabledisplay now fill a stretched host - textarea: in
readonly-availableedit mode, the character counter now sits on the Save/Cancel row - drawer, modal:
Escapein an open select, date picker or dropdown now only closes that panel - table:
Escapein an open select, date picker or dropdown no longer clears the selection - select: the dropdown no longer opens when focus is given back by script, such as a closing dialog
- button:
formis now accepted by the JSX typings - pagination: the
hiddenattribute now hides the component - i18n: the default labels of pagination, select, input file, search, input phone, date picker, time picker, color picker, textarea, modal, drawer, button, fab, loader, toolbar, breadcrumb, stepper, carousel, calendar, scheduler and event editor now follow the locale
- date picker: the time columns are now named in the current locale
- date picker:
dayPlaceholdernow defaults to "dd" in English - table: the room kept under the table for the action bar is no longer canceled by a page reset such as
* { margin: 0 } - table: the loading rows and bars drawn by
table-ssr.cssno longer change size on upgrade - table:
table-ssr.cssnow draws the select-all checkbox before upgrade - table: the scroll region now takes its name from an
aria-labeloraria-labelledbyoneun-table - action bar: now keeps the same margin on both sides below 600px
- dropdown button: a width set on the element now stretches the trigger
- dropdown button: the chosen items are now marked when they upgrade after the button
- dropdown button:
labelnow shows when the items are written on their own lines - action bar: now centered under its table instead of the viewport
- table: the loading rows now have the height of the real rows
- table:
table-ssr.cssnow reserves the selection column, the loading rows and the max height before upgrade - search:
field-ssr.cssnow draws the field before upgrade - SSR: a page's own class now overrides the size, display and position the
*-ssr.csssheets give a component before upgrade - search: the search icon drawn before upgrade now has the size and place of the real one
- table: before upgrade,
table-ssr.cssnow reserves a real selection column, uses the component's font, and draws the loading rows cell by cell - table: the loading rows no longer replay their entrance once drawn before upgrade
- table: the row end action placeholder is now visible and aligned to the end while loading
- table: setting
selectedKeysno longer fireseuntableselectionchange, which now only reports the user's changes
1.0.0-beta.8
2026-10-18
Added
- drawer, modal: added
initial-focus="first-field", to focus the first field when opened from the keyboard - drawer: added
--drawer-header-padding-bottom - sidebar: added
theme="dark" - sidebar: added
--sidebar-toggle-colorand--sidebar-toggle-background-hover - sidebar: added
--sidebar-resize-handle-delay, the resize handle now shows after a short hover - sidebar: added
hide-below, to hide the sidebar below a breakpoint - link: added
block, for a full-width navigation item with a truncated label - link: added
--link-background-hover - toolbar: added
mobile-hide, to hide bar slots on mobile - toolbar: added
--toolbar-panel-offset - search: added
eunselect, fired with the picked suggestion'svalue - search: added
filter,filter="none"shows server results as they are - search: added the
triggerslot, to replace the panel trigger - search: added the
triggerpart on the panel trigger - input, search, select, input phone, date picker, time picker, color picker: added
size, at the height of a button of the same size - fields: added
--field-line-height - toggle group: added
size, at the height of a button of the same size - input, search, select, input phone, date picker, time picker, color picker, counter, toggle group: added
rounded, for a pill shape - select, search, input phone, color picker: added
--field-listbox-border-radius - theme: added
borderColoranddarkBorderColortobuildThemeCss - modal: added
--modal-close-offset - dropdown item: added
value, usable from React and Vue,keystays as an alias
Changed
- button, dropdown button:
appearance="default"is renamedsoft - dropdown button: the documented default
appearanceis nowfill - toggle group: the
landxloptions keep a horizontal padding in proportion to their height - modal: the default padding is now
--eun-space-mon all four sides, and the close button sits on it - theme: the dark
--eun-border-coloris now more discreet and follows the surface color - tooltip: the panel now sizes to its content
- sidebar: with
collapse-mode="mini", dragging the border no longer hides the panel entirely - sidebar: a collapse by drag or keyboard now returns to
--sidebar-widthon expand - fields: the default height now matches a medium button
- toggle group: the default height now matches a medium button
- select, search, input phone, color picker: the dropdown no longer follows
--field-border-radius
Fixed
- collapse:
collapse-ssr.cssnow draws a plain element slotted intagas the default tag - button, dropdown button, fab: Enter and Space now emit a bubbling, composed
click - drawer: the header now has a bottom padding
- search: the suggestions panel now closes when focus leaves the field
- tooltip: the description is now linked to the anchor's focusable element
- sidebar:
collapsible="false"andresizable="false"now turn them off - sidebar: the inline toggle's focus ring is no longer clipped
- sidebar:
sidebar-ssr.cssnow paints the surface before upgrade - sidebar:
sidebar-ssr.cssnow places the content at its upgraded offset - sidebar: keyboard resizing no longer hides the panel with
collapse-mode="hidden" - link: a slotted anchor no longer flashes a gray outline when its icon appears
- SSR:
links-ssr.cssnow gives a link its padding, icon gap and color before upgrade - toolbar: the burger now stays on the bar with
panel-direction="left"or"bottom"and a partialpanel-size - toolbar: the mobile panel content no longer starts under the burger
- search:
eunchangenow carries the value when a suggestion is picked - search: the suggestions now follow changes to the
optionchildren - button:
size="s"keeps its padding without the theme stylesheet - button, dropdown button: the
iconnow follows the button size, so the button keeps its height when the root font size isn't 16px - modal, drawer, toast, search, toolbar, carousel, image carousel, chip, animate: a boolean that defaults to
truenow turns off with the attribute set to"false" - SSR:
chip-ssr.css,carousel-ssr.cssandimage-carousel-ssr.cssnow follow those attributes set to"false"
1.0.0-beta.7
2026-10-15
Added
- rating: added the
eun-ratingcomponent - SSR: added SSR sheets for carousel, image carousel, tabs, skeleton, collapse, breadcrumb, alert, icon, pagination, toggle groups, checkbox, inputs, textatea, selectes, chip and badge
- icon: added
--icon-border-widthand--icon-border-color, and documented thewrapperpart - password strength: the caption, the default level names and their punctuation now follow the locale
- components: the default close, cancel, confirm, save, navigation and field button labels now follow the locale
- form fields: added
invalid, to show a field as invalid without any message
Changed
- components: renamed every
aria-label-*attribute to*-label, and everyariaLabel*property to*Label - components: properties left at their default value are no longer written as attributes on the host
- fields:
aria-readonlyis now removed instead of set to"false" - color picker: the presets are now a listbox with a single tab stop, and the panel a dialog
Fixed
- SSR:
card-ssr.cssnow stacks several title or description elements of an image card - SSR:
links-ssr.cssnow keeps a link in one piece when it wraps, as once upgraded - SSR:
carousel-ssr.cssnow gives the title the carousel's full width when--carousel-slide-widthis set - SSR:
sidebar-ssr.cssnow reserves the sidebar border, so a hidden sidebar no longer shifts by 1px on upgrade - SSR:
links-ssr.cssnow gives a button's new tab arrow the same room as its icon - form fields: typing no longer shows an error before focus leaves the field
- form fields: pressing Enter in the field now submits its form, as a native input field does
- alert: a focused alert now draws a focus outline, colored by
--alert-focus-outline-color - password strength: the label row keeps its space while the value is empty, so typing no longer shifts the layout
- form fields: the host no longer adds an empty tab stop before or after the field
- form fields: in
readonly-available, an invalid confirm focuses the field, and confirming or cancelling focuses the static display - toolbar:
toolbar-ssr.cssnow paints the bar's background, text color and border before the upgrade - input: the password toggle is now reachable with Tab
- input phone: the phone field is now named by its label
- checkbox list, radio list: the group is now named by its label and described by its instructions and hint
- checkbox list, radio list: a child disabled or readonly on its own is no longer re-enabled by the list
- checkbox, radio, switch: the hint and error are no longer read as part of the name, and the description follows the error
- checkbox: a disabled checked box now shows its check mark, and
aria-checkedstays"mixed"while indeterminate - radio list: the tab stop goes to the first enabled radio, and
aria-activedescendantis no longer set - date picker: the segment and range labels now follow the locale
- date picker, time picker: the hint and error are now linked to the segments
- textarea: the color pickers now take the focus on open, move with the arrow keys and return it to their trigger on Escape
- select: Space now opens the list and picks the highlighted option when not searchable
- select, search: the options of each
optgroupare now grouped under its label for assistive technology - textarea: the formatting toolbar is now a single tab stop, moved through with the arrow keys
- search: the suggestions field now sets
aria-autocomplete="list" - carousel: on right to left mode, the page count, dots, arrow keys, chevrons and button positions are now correct
1.0.0-beta.6
2026-10-10
Added
- tabs: added
--tab-font-size,--tab-font-weight,--tab-focus-outline-widthand--tab-focus-background-color - tabs: added
--tab-panel-font-sizeand the--tab-panel-focus-outline*variables - image carousel: added
--image-carousel-border-color,--image-carousel-border-width,--image-carousel-thumbnail-border-color,--image-carousel-thumbnail-active-border-colorand--image-carousel-divider-color - description list: added
eun-description-listcomponent anddescription-list-ssr.css - forms: added
errorto every field, for an error computed by the form or the server - forms: added
showErrorandvalidationRequested - forms: added
--field-font-size,--field-label-font-sizeand--field-message-font-size - collapse: added
--collapse-heading-font-size,--collapse-subheading-font-size,--collapse-divider-widthand--collapse-divider-color - collapse: added
--collapse-panel-paddingand its-blockand-inlinecounterparts - carousel: added
--carousel-header-margin,--carousel-track-padding-top,--carousel-track-padding-bottomand--carousel-slide-width - carousel: added
--carousel-track-padding-inlineto let the track bleed past the container - carousel: added
--carousel-nav-border-widthand the--carousel-nav-hover-*variables - button: added
--button-font-size,--button-font-weightand--button-line-height - breakpoints: added the
@eunomia/elements/styles/breakpointsSass entry point - breakpoints: added
mediaBelow,mediaFromand the@eunomia/elements/breakpoints.jssubpath - link: added
--link-icon-sizeand--link-transition-duration - grid: added
--eun-grid-columnsand its-mobile,-tablet,-laptopand-desktopvariants - image card: an anchor slotted into
titlenow links the whole card, as witheun-card - image card: added
part="footer",--image-card-image-aspect-ratioand the title and description-weightand-colorvariables - card: added
--card-hover-shadowfor every appearance and--card-overflow - padding: every
--*-paddingvariable now has a-blockand an-inlinecounterpart - tag: added
--tag-padding-block,--tag-padding-inline,--tag-font-sizeand--tag-font-weight - tokens: added
--eun-backdrop-color - theme: added
textColoranddarkTextColortobuildThemeCss - animate: added
tablet-delay,mobile-delayand--animate-duration - SSR: added
button-ssr.cssfor button, dropdown button and fab - SSR: added
tag-ssr.cssfor tags - SSR: added
card-ssr.cssfor card, image card and sliding card - tokens: added
--eun-duration-*and--eun-easing-*, used by every component - tokens: added
--eun-surface-inverse,--eun-text-on-inverseand their-on-inversevariants - theme: added
inverseSurfaceColor,darkInverseSurfaceColoranddarkSecondaryColortobuildThemeCss - infinite list: added
--infinite-list-columns,part="feed"anditem-tab-stop - search, select: added
--field-loader-color - breadcrumb: links are underlined by default, added
--breadcrumb-link-text-decoration,--breadcrumb-link-text-decoration-hoverand--breadcrumb-font-size - table: added
sticky-footer,table-ssr.cssand thedata-table-actionrow end action cell - tokens: added
--eun-color-<state>-text, the state colors at a 4.5:1 contrast ratio - table, table action bar: added
locale, every default text is translated - table: rows reorder with
createDragReorderand get--table-row-dragging-backgroundwhile dragged
Changed
- tabs: the focused tab now gets a translucent primary background
- tabs:
eun-tab-panelnow draws its own focus ring - image carousel: the previous, next, expand, lightbox and gallery labels are now translated
- image carousel: the lightbox is now vertically centered
- toggle: labels are no longer capitalized
- forms: errors now appear once a field is touched, dirty or checked by its form, instead of on first render
- forms:
hide-errornow keeps the hint visible - forms: the built-in validation messages are translated, and the English required message now reads "This field is required"
- forms:
checkValidity()no longer firesinvalid - carousel: the previous and next labels are now translated
- button: the
outlineborder is now 1px by default - breakpoints: every media and container query now uses the range syntax (
width < 768px,width >= 768px) - breakpoints:
eunomia-lte-*,eunomia-gte-*,eunomia-mobileandeunomia-desktopare replaced byeunomia-below-*andeunomia-from-* - breakpoints: the Sass scale is generated from
EUNOMIA_BREAKPOINTS, and lint fails on any hardcoded width - link: with an icon, the focus ring surrounds the text only
- grid: the grid classes have no specificity anymore and are emitted once instead of per theme
- image card: the footer fills the card height and isn't rendered when
titleanddescriptionare empty - image card: the title and description typography is now inherited instead of forced on the slotted element
- card:
#cardnow isolates its stacking context, so decorations atz-index: -1stay above its background - tokens:
-bg-hover,-bg-active,-transparent*and the state-30/-50/-90are replaced by-alpha-5/10/20/30/40for every color - modal, drawer: the backdrop now uses
--eun-backdrop-color - animate: default
durationis now 1000ms - toolbar, link:
theme="dark"now uses the inverse surface tokens - modal, date-picker, table action bar: 180ms transitions now use
--eun-duration-m(200ms) - infinite list:
virtualizeis now off by default - infinite list: the list only scrolls internally once
--infinite-list-heightis set - infinite list: the loader label and the loaded items announcement are now translated
- infinite list: inactive items no longer get
tabindex="-1" - breadcrumb: steps are now the
<a>links slotted directly, one per child - breadcrumb:
eun-breadcrumb-item,itemsandeunnavigateare removed - toolbar:
logo-src,logo-alt,logo-href,--toolbar-logo-height,--toolbar-logo-filter-darkandeunnavigateare removed, the logo is a link slotted intostart - table:
eun-tablenow wraps a native<table>,eun-table-header,eun-table-column,eun-table-item,eun-table-cellandeun-table-skeleton-roware removed - table: the grid role and arrow key navigation are removed, a table with no option is read-only
- table:
native-table.cssis replaced bytable-ssr.css - table: a row click follows the row's
data-table-row-linklink, rows are no longer focusable withclickable - table: the action bar is inserted right after the table as a popover, the select-all checkbox stays in a sticky header
- table: row checkboxes are named after the row header
Fixed
- tabs: a global
:focus-visibleoutline no longer adds a second ring oneun-tab - toggle group: the focus ring is no longer clipped in the
outlineandflatappearances - animate, calendar, table action bar, image carousel: their breakpoints no longer include the breakpoint width itself
- link:
white-space: nowrapon the host now reaches a slotted anchor - breakpoints: the TypeScript examples now use the
- 1convention - image card: the external link badge no longer jumps on hover
- toolbar:
theme="dark"is no longer reset tolighton first render - toolbar: skip links now follow the dark theme
- button, fab: the hand-off from
button-ssr.cssno longer animates - button:
raisedfallback shadows were invalid - SSR:
links-ssr.cssno longer overrides page styles on slotted anchors - button: content is now centered when the width is set from outside
- SSR:
animate-ssr.cssnow hides an animate withoutanimationattribute - animate: no transition left with
animation="none" - infinite list: every page no longer loads at once when the page scrolls the list
- infinite list: virtualization now follows the page scroll when the list doesn't scroll internally
- alert: the
defaultappearance no longer shows a 1px accent line on its right edge - table:
infinitenow resumes loading onceloadingclears - table: unchecked checkboxes now meet the 3:1 contrast ratio and show on touch screens
- table:
aria-busywhileloading,aria-rowcount/aria-rowindexwithvirtualize, and loaded rows announced withinfinite - tag, chip:
success,warningandinfoseverities now reach a 4.5:1 text contrast ratio - drag and drop: auto-scroll now finds a scroll container inside a shadow root, such as
eun-table's - table: an
eun-iconplaced in a cell stays on the same line as its text
1.0.0-beta.5
2026-09-30
Added
- theming: added a
./theme.jssubpath exportingbuildThemeCss,buildPalette,buildTintsandinitializeThemewithout registering any component. - icon: added
--icon-transition - toggle group: added
--toggle-group-box-shadow, a box shadow on the track itself - link, button, card: a native anchor slotted as a direct child, with
hrefunset, now acts as the link, so it stays in the server-rendered HTML for SEO. In link, that anchor covers the whole padded box, icon included, and the focus ring surrounds that box as inhrefmode - collapse: added a
headingslot, so the question stays in the server-rendered HTML for SEO - collapse: added a
subheadingslot, so the subtitle stays in the server-rendered HTML for SEO - SSR: added
links-ssr.css, styling slotted anchors in link, button and card before the element upgrades - SSR: added
rich-text.css, therich-textattribute's typography for slotted content through theeun-rich-textclass - link, button, card: a warning in the console when
aria-label,target,relordownloadstays on the host of a slotted anchor - link, button, fab, card: "(opens in a new tab)" translated, through
locale - link, button, card: new tab icon and announcement for a slotted
anchor too, and the
eun-new-tab-hintclass inlinks-ssr.css
Changed
- toolbar:
toolbar-ssr.cssnow also hidesskip-links,menu-iconandclose-icon, and lays outstart/center/endalong the bar's row before the element upgrades - toolbar:
toolbar-ssr.cssnow mirrorsposition, and centerscenterexactly whenstartandendhold one element each, every rule staying at the specificity ofeun-toolbar:not(:defined) > [slot]so a site rule loaded after it still wins - collapse: plain elements slotted into
tagnow keep the default tag style, a custom element still replaces it entirely - icon: icons sharing a URL now share a single request, and later renders read the SVG from memory
- toggle group: the initial selection no longer transitions in on load, choices and their icons only animate later changes
- SSR: components no longer write default-valued host attributes or inline styles, avoiding hydration mismatches
- action components, badge, modal:
variantrenamed tocolor - form fields, scheduler:
variantrenamed toappearance, and the fields'filltoflat - table: row action
variantrenamed tocolor
Fixed
- button:
--button-paddingand--button-border-radiusnow apply at everysize, and--button-border-radiusoverrounded - animate:
animate-ssr.cssno longer hides content when JavaScript is disabled - link, button, card: a page's global
*:focus-visibleoutline no longer draws a second focus ring on a slotted anchor - icon: an inherited
white-space: pre-lineno longer pushes the icon below its box
Documentation
- guides: added a Server-side rendering guide
- link, button, card: documented SEO-friendly links
- collapse: documented SEO-friendly content
- guides: documented hydration in the Server-side rendering guide
- guides: Variants renamed to Shared vocabulary
- icon: documented preloading icons shown on first paint
- animate: documented excluding animate from a global transition blocker
1.0.0-beta.4
2026-09-29
Added
- form fields: added a
controlledproperty. When set,formResetCallbackleavesvalue/checkeduntouched on a native reset, for a field whose value is already driven as a controlled prop, so a strayform.reset()can no longer wipe it - tokens: added generic alpha primitives,
--eun-surface-transparent-*and--eun-text-transparent-*, plus--eun-text-on-dark-secondary - theming: added
buildThemeCss(), the pure counterpart ofinitializeTheme()returning a custom brand's light and dark tokens as a stylesheet, so SSR apps no longer flash the base theme on first load - rich text utils: added a
./rich-text.jssubpath export, plustoPlainText()andtoHtml() - link: added a
currentprop and--link-color-current - link: exposed keyboard focus as the
:state(focus-visible)custom state - link: added
--link-line-height - tag, chip, tooltip, button, fab, dropdown button: added a
fixed-colorattribute, pinninglight/darkto white/black in every theme - tag, chip: added
--tag-border-width/--chip-border-width - toggle group: added a
fullattribute, stretching the group to 100% of its parent and sharing the width between choices - toggle group: added overflow arrows and touch dragging when the container is too narrow, plus
--toggle-group-arrows-color - tabs: added a
fullattribute, stretching the tab header to 100% and sharing the width between tabs - carousel: added
--carousel-visible-slides,--carousel-scroll-stepand--carousel-responsive-breakpoint, overriding their matching properties so media and container queries can drive them - carousel: added
--carousel-fade-display, hiding the edge fades through CSS regardless ofedgeFade - tokens: added
--eun-surface-sunken,--eun-surface-sunken-hover,--eun-surface-sunken-pressedand--eun-surface-sunken-strong, a translucent wash of--eun-text-colorfor tracks and wells that stays visible on any background
Changed
- tokens: renamed
--eun-borderRadius-*,--eun-fontSize-*,--eun-fontWeight-*, and--eun-borderWidth-*to kebab-case, matching every other token family. - tag, chip, button, fab, tooltip, alert, toast:
light/darkare now absolute white/black colors in every appearance, and every--*-*custom property now wins over any color/appearance combination - toggle group, toggle, switch, checkbox, slider, progress bar,
password strength, loader: the resting track (and the switch and
checkbox hover and pressed states) now default to the
--eun-surface-sunkentokens instead of a fixed grey step, so it no longer blends into a grey page, a filled card or a collapse. Every existing--*-backgroundoverride still wins - tokens:
--eun-content-hoveris now the same translucent wash (#9696961a) in light mode for every brand.
Fixed
- tabs: the overflow arrows now fade to
--eun-surface-colorinstead ofgrey-0, so they match a custom surface color - toolbar: fixed the mobile burger button not being vertically centered on the bar
- toggle group: fixed the sliding indicator misplaced, and the selected option left out of view, in single selection once the row overflows
- toggle group: fixed option labels wrapping onto a second line
- toggle group: fixed the group stretching to a grid/flex parent's default size
- jsx: fixed
EunomiaElementPropsmissingid,style,slot,aria-*,class, andkey, built on React'sDOMAttributesinstead ofHTMLAttributes - form fields: fixed
validators/hintmissing from every published.d.ts, real runtime properties but absent from the public TypeScript type on every form component - card, image card: fixed the hover border color
- package: fixed a plain top-level
import { X } from "@eunomia/elements"silently dropping most components' registration under a bundler that respectssideEffects(Turbopack, webpack), by addingdist/index.jsto that list - breadcrumb, breadcrumb item: fixed a data-driven or slotted link
never dispatching
eunnavigate - link: fixed
visited-style="off"flashing the visited color on first paint under React/Next.js server rendering - tag: fixed
roundedmissingreflect: true - tag: fixed the icon disappearing when
icon-onlywas set - button: fixed
flat/defaultnot resolving--button-textindependently of--button-background - button: fixed a slotted SVG's own
fill="none"being overridden - button: fixed the button stretching to a grid/flex parent's
default size unless
fullis set - card, chip, tag, alert, toast, toggle, toggle group: fixed several border/background custom properties being ignored on some appearances
Documentation
- Reorganized every component's CSS custom property docs into one reference table
- Documented
:state(focus-visible)and SPA routing on the breadcrumb page - Documented
toPlainText/toHtmland the./rich-text.jssubpath - Documented that
:state(focus-visible)needs a runtime stylesheet under Turbopack, whose lightningcss parser doesn't recognize it yet - Added an SPA navigation guide with a router bridge for each framework,
now linked from every component that dispatches
eunnavigate - divider: documented decorative dividers and
role="presentation" - Documented the sunken surface tokens on the Neutral tokens page
- Added a Token reference page listing every color token a theme defines, where it comes from and how to change it
- theme builder: added a Copy full theme export with every
color token for light and dark, and the brand export now includes
the translucent
-bg-hover/-transparenttokens it was missing
1.0.0-beta.3
2026-09-23
Added
- events:
eunchangenow also carries its new value directly asevent.value, for every form field, Toggle, and Toggle group, no more narrowingevent.targetneeded in a delegated listener - animate: added
tablet-animation/mobile-animationprops to overrideanimationat narrower viewports, pure CSS, no JS, no duplicated DOM - form fields: added
dirty/pristine/touched/untouchedinteraction-state tracking to every field, documented in the forms guide - toolbar: added
menu-icon/close-iconslots to override the burger button's icons - select: added an
actionsslot, rendered as a footer row below the options for controls unrelated to picking a value
Fixed
- overlay/disclosure components: fixed a flash of hidden/collapsed content on first paint in SSR apps (toolbar, sidebar, collapse, drawer, modal, dropdown button, tooltip), via new SSR stylesheets
- button, tag, chip, tooltip: reviewed the light/medium/dark neutral colors for proper contrast and a lighter
- toolbar: fixed a missing fallback for the skip-links focus background color
- carousel: fixed the header's default alignment
- card: fixed the sliding card's host carrying a redundant background
- button: added
--button-fullsofullcan be driven by container queries - toolbar: fixed unequal spacing around the skip links separators,
added
--toolbar-skip-links-gap - toggle: fixed a second focus ring on the item host when the page
sets a global
:focus-visibleoutline - icon: fixed icons resolving to the wrong SVG under Turbopack,
added
setIconBaseUrl() - form fields: fixed
aria-invalidignoringhide-erroron every field but Input, painting a red border before the user has done anything - animate, table: fixed
animate-ssr.cssandnative-table.cssnot being importable by package name, missing fromexports - card: fixed
--card-hover-border-coloronly applying to the default appearance
Documentation
- Documented a fix for React 19's
<form action={fn}>wiping every field on submit, in the forms guide and on Input, Textarea, Select, and Checkbox
1.0.0-beta.2
2026-09-18
Fixed
- button: fixed icon size, inconsistent across button sizes
- button: fixed insufficient padding on size l buttons
- button: added neutral
light,medium, anddarkvariants - button: added the
fullattribute, stretching a button to its parent's size - toolbar: fixed a duplicated close button in the mobile panel, replaced by a single burger button that stays visible above the open panel
- toolbar: fixed the rest of the page not being made inert while the mobile panel is open
- toolbar: fixed unreliable scroll locking on mobile Safari
- toolbar: fixed the dark theme ignoring
--toolbar-background - toolbar: fixed the logo overflowing past the bar's height
- toolbar: fixed slotted content in the start, center, and end slots overflowing past the bar's height
- toolbar: fixed link styling and added a separator between skip links
- table: fixed accessibility issues across the dropdown button, checkbox, columns, cells, and headers
- table: fixed spacing issues across table components
- card: fixed the sliding card's inset
- card: fixed the layout of locked and complex cards
- carousel: fixed control issues
- collapse: fixed issues introduced by
until-foundsupport - collapse: added customization tokens for rich-text content
- icon: fixed icons rendering incorrectly
- color picker: fixed the border in the error state
- animate: fixed animation in an SSR context
- themes: fixed text contrast and removed the onyr theme
- themes: reviewed the prebuilt themes
- typography: fixed font management across components
- build: fixed type exports
Documentation
- Fixed general documentation issues
- Fixed mobile display
- Added the 16px reference
1.0.0-beta.1
2026-09-13
Added
- button: added the
eun-buttoncomponent - link: added the
eun-linkcomponent - fab: added the
eun-fabcomponent - dropdown button: added the
eun-dropdown-buttoncomponent - toggle: added the
eun-toggle,eun-toggle-group, andeun-toggle-itemcomponents, with a buttons display variant - alert: added the
eun-alertcomponent - modal: added the
eun-modalcomponent - drawer: added the
eun-drawercomponent - toast: added the
eun-toastcomponent - badge: added the
eun-badgecomponent - card: added the
eun-card,eun-check-card,eun-radio-card,eun-image-card, andeun-sliding-cardcomponents - chip: added the
eun-chipcomponent - tag: added the
eun-tagcomponent - collapse: added the
eun-collapsecomponent, withuntil-foundsupport - tooltip: added the
eun-tooltipcomponent, with a rich-text variant - progress bar: added the
eun-progress-barcomponent - password strength: added the
eun-password-strengthcomponent - image carousel: added the
eun-image-carouselcomponent - input: added the
eun-inputcomponent - input file: added the
eun-input-filecomponent - input phone: added the
eun-input-phonecomponent - select: added the
eun-selectcomponent, with multiple selection - checkbox: added the
eun-checkboxandeun-checkbox-listcomponents - radio: added the
eun-radioandeun-radio-listcomponents - switch: added the
eun-switchcomponent - textarea: added the
eun-textareacomponent - search: added the
eun-searchcomponent - counter: added the
eun-countercomponent - slider: added the
eun-slidercomponent - color picker: added the
eun-color-pickercomponent - date picker: added the
eun-date-pickercomponent - time picker: added the
eun-time-pickercomponent, with a list variant - label: added the
eun-labelcomponent - animate: added the
eun-animatecomponent - divider: added the
eun-dividercomponent - infinite list: added the
eun-infinite-listcomponent - loader: added the
eun-loadercomponent, with a bar variant - skeleton: added the
eun-skeletoncomponent - tabs: added the
eun-tab-group,eun-tab, andeun-tab-panelcomponents - breadcrumb: added the
eun-breadcrumbcomponent - sidebar: added the
eun-sidebarcomponent - toolbar: added the
eun-toolbarcomponent - carousel: added the
eun-carouselcomponent - pagination: added the
eun-paginationcomponent - stepper: added the
eun-stepperandeun-stepcomponents - scheduler: added the
eun-schedulercomponent - scheduler event: added the
eun-scheduler-eventcomponent - scheduler event editor: added the
eun-scheduler-event-editorcomponent - calendar: added the
eun-calendarcomponent - table: added the
eun-tablecomponent - table header: added the
eun-table-headercomponent - table item: added the
eun-table-itemcomponent - table cell: added the
eun-table-cellcomponent - table column: added the
eun-table-columncomponent - table action bar: added the
eun-table-action-barcomponent - managed table: added the
eun-table-managedcomponent - table skeleton row: added the
eun-table-skeleton-rowcomponent
Changed
- Internationalization (i18n) support across components
- Breakpoints management, exposed as CSS custom media/exports
- Invoker Commands API support
- Drag-and-drop support (carousels, reorderable lists)
- Swipe gesture support for tab navigation
- An icon slot is now available on every icon-bearing element
- API uniformization pass across the whole component set
0.1.0
Initial release.
Added
- Theming system ported from Eunomia Components: 8 prebuilt themes, light/dark mode, and a custom-theme generator
- First real component:
eunomia-button