Eunomia v1.1.0
AllAngularReactNext.jsJavaScriptVue
EunomiaSalmonForestVioletOceanGoldFireCustom…
🇬🇧 English🇫🇷 Français

Changelog

All notable changes to Eunomia are documented here. The format follows Keep a Changelog, and the project adheres to Semantic Versioning.

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: setIconBaseUrl no longer does anything

Removed

  • icon: the raw .svg files are no longer shipped

Fixed

  • The library now builds on Windows

1.0.0

2026-10-30


Added

  • toolbar: added layout="between", adaptive-theme-attribute and the burger-icon slot
  • 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-3 and eun-grid--fifths-3-2 grids, --eun-grid-template and its breakpoint variants, and --eun-grid-track-min
  • ssr: added divider-ssr.css, stepper-ssr.css and scheduler-ssr.css, and field-ssr.css now draws the counter, date picker, time picker and color picker
  • animate: added laptop-animation and laptop-delay
  • collapse: added --collapse-background-focus, --collapse-color-focus, --collapse-heading-font-weight and the trigger and panel parts
  • 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 steps as 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 to ngModel, formControl and formControlName
  • table: added --table-header-color css var
  • theme: added pageBackgroundColor to buildThemeCss
  • nav menu: added the eun-nav-menu component, a navigation entry that reveals a group of links
  • scheduler event editor: added guest-error-label, range-error-label, requestCancel(), euneventcancel and euneditorstatechange
  • calendar: added next(), previous() and today()
  • calendar, scheduler: added visibleRange, and eunperiodchange now carries displayedDate
  • scheduler: addPeriod and getVisibleRange are now exported
  • react: added @eunomia/elements/react and eunProps, setting properties and event listeners from a ref

Changed

  • theme: --eun-text-secondary is now greyer, grey-600 in light mode and #d2d5de in dark mode, where buildThemeCss sets it to --eun-text-on-dark-secondary
  • Boolean attributes are now off by default, "false" no longer turns one off
  • toolbar: adaptive-theme now follows the page's sections on its own, refreshAdaptiveTheme() is no longer needed after a client-side navigation
  • toolbar: eunchange now carries the changed property and the current state in its value
  • toolbar: the burger now takes the bar's text color
  • link: --link-color-focus now 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: eunperiodchange no 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: color now 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: eunchange now 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-indicator now 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 value to null now unchecks every child instead of throwing
  • checkbox, switch, radio: controlled now keeps checked on a native form reset
  • checkbox, check card, switch, radio, radio card: a checked field without value now 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-size and --carousel-responsive-breakpoint now accept rem, em and 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-duration instead 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-date or rejected by is-date-disabled now 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-substep past the last substep now counts as the last one
  • link, button: links-ssr.css now draws the new tab arrow of href, 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-line and --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-below and --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 by eun-dropdown-button
  • dropdown button: added full attribute
  • dropdown button: added multiple, to check several options at once
  • table: added row-numbers, to show each row's position
  • dropdown button: added selectable, value and clearable, for a single choice such as a quick sort or filter
  • table: added the empty slot, shown while the body has no row
  • action bar: added --table-action-bar-center
  • table: added density, compact or comfortable
  • 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-error on a <fieldset> now applies to every field inside
  • skeleton: added --skeleton-width and --skeleton-height, read by skeleton-ssr.css in 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 a readonly-available edit is cancelled
  • input file: value accepts the URL of a file already stored
  • input file: exported the EunomiaInputFileItem type
  • 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-available edit
  • pagination: added align, to place the page controls at the start, center or end of the row
  • pagination: added page-size-placement and page-size-hide-below
  • pagination: added --pagination-page-size-width and --pagination-page-size-hide-below, a breakpoint name or a number of pixels

Changed

  • icon: now uses Material Symbols
  • rating: empty-icon now defaults to star_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-color and --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-color instead 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_more is now keyboard_arrow_down)
  • button: removed --button-full, replaced by --button-width

Fixed

  • table: an infinite table 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 width sizes 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-available display now fill a stretched host
  • textarea: in readonly-available edit mode, the character counter now sits on the Save/Cancel row
  • drawer, modal: Escape in an open select, date picker or dropdown now only closes that panel
  • table: Escape in 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: form is now accepted by the JSX typings
  • pagination: the hidden attribute 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: dayPlaceholder now 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.css no longer change size on upgrade
  • table: table-ssr.css now draws the select-all checkbox before upgrade
  • table: the scroll region now takes its name from an aria-label or aria-labelledby on eun-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: label now 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.css now reserves the selection column, the loading rows and the max height before upgrade
  • search: field-ssr.css now draws the field before upgrade
  • SSR: a page's own class now overrides the size, display and position the *-ssr.css sheets 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.css now 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 selectedKeys no longer fires euntableselectionchange, 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-color and --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's value
  • search: added filter, filter="none" shows server results as they are
  • search: added the trigger slot, to replace the panel trigger
  • search: added the trigger part 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 borderColor and darkBorderColor to buildThemeCss
  • modal: added --modal-close-offset
  • dropdown item: added value, usable from React and Vue, key stays as an alias

Changed

  • button, dropdown button: appearance="default" is renamed soft
  • dropdown button: the documented default appearance is now fill
  • toggle group: the l and xl options keep a horizontal padding in proportion to their height
  • modal: the default padding is now --eun-space-m on all four sides, and the close button sits on it
  • theme: the dark --eun-border-color is 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-width on 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.css now draws a plain element slotted in tag as 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" and resizable="false" now turn them off
  • sidebar: the inline toggle's focus ring is no longer clipped
  • sidebar: sidebar-ssr.css now paints the surface before upgrade
  • sidebar: sidebar-ssr.css now 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.css now 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 partial panel-size
  • toolbar: the mobile panel content no longer starts under the burger
  • search: eunchange now carries the value when a suggestion is picked
  • search: the suggestions now follow changes to the option children
  • button: size="s" keeps its padding without the theme stylesheet
  • button, dropdown button: the icon now 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 true now turns off with the attribute set to "false"
  • SSR: chip-ssr.css, carousel-ssr.css and image-carousel-ssr.css now follow those attributes set to "false"

1.0.0-beta.7

2026-10-15


Added

  • rating: added the eun-rating component
  • 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-width and --icon-border-color, and documented the wrapper part
  • 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 every ariaLabel* property to *Label
  • components: properties left at their default value are no longer written as attributes on the host
  • fields: aria-readonly is 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.css now stacks several title or description elements of an image card
  • SSR: links-ssr.css now keeps a link in one piece when it wraps, as once upgraded
  • SSR: carousel-ssr.css now gives the title the carousel's full width when --carousel-slide-width is set
  • SSR: sidebar-ssr.css now reserves the sidebar border, so a hidden sidebar no longer shifts by 1px on upgrade
  • SSR: links-ssr.css now 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.css now 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-checked stays "mixed" while indeterminate
  • radio list: the tab stop goes to the first enabled radio, and aria-activedescendant is 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 optgroup are 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-width and --tab-focus-background-color
  • tabs: added --tab-panel-font-size and 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-color and --image-carousel-divider-color
  • description list: added eun-description-list component and description-list-ssr.css
  • forms: added error to every field, for an error computed by the form or the server
  • forms: added showError and validationRequested
  • forms: added --field-font-size, --field-label-font-size and --field-message-font-size
  • collapse: added --collapse-heading-font-size, --collapse-subheading-font-size, --collapse-divider-width and --collapse-divider-color
  • collapse: added --collapse-panel-padding and its -block and -inline counterparts
  • carousel: added --carousel-header-margin, --carousel-track-padding-top, --carousel-track-padding-bottom and --carousel-slide-width
  • carousel: added --carousel-track-padding-inline to let the track bleed past the container
  • carousel: added --carousel-nav-border-width and the --carousel-nav-hover-* variables
  • button: added --button-font-size, --button-font-weight and --button-line-height
  • breakpoints: added the @eunomia/elements/styles/breakpoints Sass entry point
  • breakpoints: added mediaBelow, mediaFrom and the @eunomia/elements/breakpoints.js subpath
  • link: added --link-icon-size and --link-transition-duration
  • grid: added --eun-grid-columns and its -mobile, -tablet, -laptop and -desktop variants
  • image card: an anchor slotted into title now links the whole card, as with eun-card
  • image card: added part="footer", --image-card-image-aspect-ratio and the title and description -weight and -color variables
  • card: added --card-hover-shadow for every appearance and --card-overflow
  • padding: every --*-padding variable now has a -block and an -inline counterpart
  • tag: added --tag-padding-block, --tag-padding-inline, --tag-font-size and --tag-font-weight
  • tokens: added --eun-backdrop-color
  • theme: added textColor and darkTextColor to buildThemeCss
  • animate: added tablet-delay, mobile-delay and --animate-duration
  • SSR: added button-ssr.css for button, dropdown button and fab
  • SSR: added tag-ssr.css for tags
  • SSR: added card-ssr.css for 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-inverse and their -on-inverse variants
  • theme: added inverseSurfaceColor, darkInverseSurfaceColor and darkSecondaryColor to buildThemeCss
  • infinite list: added --infinite-list-columns, part="feed" and item-tab-stop
  • search, select: added --field-loader-color
  • breadcrumb: links are underlined by default, added --breadcrumb-link-text-decoration, --breadcrumb-link-text-decoration-hover and --breadcrumb-font-size
  • table: added sticky-footer, table-ssr.css and the data-table-action row 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 createDragReorder and get --table-row-dragging-background while dragged

Changed

  • tabs: the focused tab now gets a translucent primary background
  • tabs: eun-tab-panel now 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-error now 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 fires invalid
  • carousel: the previous and next labels are now translated
  • button: the outline border 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-mobile and eunomia-desktop are replaced by eunomia-below-* and eunomia-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 title and description are empty
  • image card: the title and description typography is now inherited instead of forced on the slotted element
  • card: #card now isolates its stacking context, so decorations at z-index: -1 stay above its background
  • tokens: -bg-hover, -bg-active, -transparent* and the state -30/-50/-90 are replaced by -alpha-5/10/20/30/40 for every color
  • modal, drawer: the backdrop now uses --eun-backdrop-color
  • animate: default duration is 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: virtualize is now off by default
  • infinite list: the list only scrolls internally once --infinite-list-height is 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, items and eunnavigate are removed
  • toolbar: logo-src, logo-alt, logo-href, --toolbar-logo-height, --toolbar-logo-filter-dark and eunnavigate are removed, the logo is a link slotted into start
  • table: eun-table now wraps a native <table>, eun-table-header, eun-table-column, eun-table-item, eun-table-cell and eun-table-skeleton-row are removed
  • table: the grid role and arrow key navigation are removed, a table with no option is read-only
  • table: native-table.css is replaced by table-ssr.css
  • table: a row click follows the row's data-table-row-link link, rows are no longer focusable with clickable
  • 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-visible outline no longer adds a second ring on eun-tab
  • toggle group: the focus ring is no longer clipped in the outline and flat appearances
  • animate, calendar, table action bar, image carousel: their breakpoints no longer include the breakpoint width itself
  • link: white-space: nowrap on the host now reaches a slotted anchor
  • breakpoints: the TypeScript examples now use the - 1 convention
  • image card: the external link badge no longer jumps on hover
  • toolbar: theme="dark" is no longer reset to light on first render
  • toolbar: skip links now follow the dark theme
  • button, fab: the hand-off from button-ssr.css no longer animates
  • button: raised fallback shadows were invalid
  • SSR: links-ssr.css no longer overrides page styles on slotted anchors
  • button: content is now centered when the width is set from outside
  • SSR: animate-ssr.css now hides an animate without animation attribute
  • 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 default appearance no longer shows a 1px accent line on its right edge
  • table: infinite now resumes loading once loading clears
  • table: unchecked checkboxes now meet the 3:1 contrast ratio and show on touch screens
  • table: aria-busy while loading, aria-rowcount/aria-rowindex with virtualize, and loaded rows announced with infinite
  • tag, chip: success, warning and info severities 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-icon placed in a cell stays on the same line as its text

1.0.0-beta.5

2026-09-30


Added

  • theming: added a ./theme.js subpath exporting buildThemeCss, buildPalette, buildTints and initializeTheme without 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 href unset, 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 in href mode
  • collapse: added a heading slot, so the question stays in the server-rendered HTML for SEO
  • collapse: added a subheading slot, 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, the rich-text attribute's typography for slotted content through the eun-rich-text class
  • link, button, card: a warning in the console when aria-label, target, rel or download stays 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-hint class in links-ssr.css

Changed

  • toolbar: toolbar-ssr.css now also hides skip-links, menu-icon and close-icon, and lays out start/center/end along the bar's row before the element upgrades
  • toolbar: toolbar-ssr.css now mirrors position, and centers center exactly when start and end hold one element each, every rule staying at the specificity of eun-toolbar:not(:defined) > [slot] so a site rule loaded after it still wins
  • collapse: plain elements slotted into tag now 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: variant renamed to color
  • form fields, scheduler: variant renamed to appearance, and the fields' fill to flat
  • table: row action variant renamed to color

Fixed

  • button: --button-padding and --button-border-radius now apply at every size, and --button-border-radius over rounded
  • animate: animate-ssr.css no longer hides content when JavaScript is disabled
  • link, button, card: a page's global *:focus-visible outline no longer draws a second focus ring on a slotted anchor
  • icon: an inherited white-space: pre-line no 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 controlled property. When set, formResetCallback leaves value/checked untouched on a native reset, for a field whose value is already driven as a controlled prop, so a stray form.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 of initializeTheme() 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.js subpath export, plus toPlainText() and toHtml()
  • link: added a current prop 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-color attribute, pinning light/dark to white/black in every theme
  • tag, chip: added --tag-border-width/--chip-border-width
  • toggle group: added a full attribute, 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 full attribute, stretching the tab header to 100% and sharing the width between tabs
  • carousel: added --carousel-visible-slides, --carousel-scroll-step and --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 of edgeFade
  • tokens: added --eun-surface-sunken, --eun-surface-sunken-hover, --eun-surface-sunken-pressed and --eun-surface-sunken-strong, a translucent wash of --eun-text-color for 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/dark are 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-sunken tokens instead of a fixed grey step, so it no longer blends into a grey page, a filled card or a collapse. Every existing --*-background override still wins
  • tokens: --eun-content-hover is now the same translucent wash (#9696961a) in light mode for every brand.

Fixed

  • tabs: the overflow arrows now fade to --eun-surface-color instead of grey-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 EunomiaElementProps missing id, style, slot, aria-*, class, and key, built on React's DOMAttributes instead of HTMLAttributes
  • form fields: fixed validators/hint missing 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 respects sideEffects (Turbopack, webpack), by adding dist/index.js to 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 rounded missing reflect: true
  • tag: fixed the icon disappearing when icon-only was set
  • button: fixed flat/default not resolving --button-text independently 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 full is 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/toHtml and the ./rich-text.js subpath
  • 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/-transparent tokens it was missing

1.0.0-beta.3

2026-09-23


Added

  • events: eunchange now also carries its new value directly as event.value, for every form field, Toggle, and Toggle group, no more narrowing event.target needed in a delegated listener
  • animate: added tablet-animation/mobile-animation props to override animation at narrower viewports, pure CSS, no JS, no duplicated DOM
  • form fields: added dirty/pristine/touched/untouched interaction-state tracking to every field, documented in the forms guide
  • toolbar: added menu-icon/close-icon slots to override the burger button's icons
  • select: added an actions slot, 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-full so full can 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-visible outline
  • icon: fixed icons resolving to the wrong SVG under Turbopack, added setIconBaseUrl()
  • form fields: fixed aria-invalid ignoring hide-error on every field but Input, painting a red border before the user has done anything
  • animate, table: fixed animate-ssr.css and native-table.css not being importable by package name, missing from exports
  • card: fixed --card-hover-border-color only 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, and dark variants
  • button: added the full attribute, 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-found support
  • 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-button component
  • link: added the eun-link component
  • fab: added the eun-fab component
  • dropdown button: added the eun-dropdown-button component
  • toggle: added the eun-toggle, eun-toggle-group, and eun-toggle-item components, with a buttons display variant
  • alert: added the eun-alert component
  • modal: added the eun-modal component
  • drawer: added the eun-drawer component
  • toast: added the eun-toast component
  • badge: added the eun-badge component
  • card: added the eun-card, eun-check-card, eun-radio-card, eun-image-card, and eun-sliding-card components
  • chip: added the eun-chip component
  • tag: added the eun-tag component
  • collapse: added the eun-collapse component, with until-found support
  • tooltip: added the eun-tooltip component, with a rich-text variant
  • progress bar: added the eun-progress-bar component
  • password strength: added the eun-password-strength component
  • image carousel: added the eun-image-carousel component
  • input: added the eun-input component
  • input file: added the eun-input-file component
  • input phone: added the eun-input-phone component
  • select: added the eun-select component, with multiple selection
  • checkbox: added the eun-checkbox and eun-checkbox-list components
  • radio: added the eun-radio and eun-radio-list components
  • switch: added the eun-switch component
  • textarea: added the eun-textarea component
  • search: added the eun-search component
  • counter: added the eun-counter component
  • slider: added the eun-slider component
  • color picker: added the eun-color-picker component
  • date picker: added the eun-date-picker component
  • time picker: added the eun-time-picker component, with a list variant
  • label: added the eun-label component
  • animate: added the eun-animate component
  • divider: added the eun-divider component
  • infinite list: added the eun-infinite-list component
  • loader: added the eun-loader component, with a bar variant
  • skeleton: added the eun-skeleton component
  • tabs: added the eun-tab-group, eun-tab, and eun-tab-panel components
  • breadcrumb: added the eun-breadcrumb component
  • sidebar: added the eun-sidebar component
  • toolbar: added the eun-toolbar component
  • carousel: added the eun-carousel component
  • pagination: added the eun-pagination component
  • stepper: added the eun-stepper and eun-step components
  • scheduler: added the eun-scheduler component
  • scheduler event: added the eun-scheduler-event component
  • scheduler event editor: added the eun-scheduler-event-editor component
  • calendar: added the eun-calendar component
  • table: added the eun-table component
  • table header: added the eun-table-header component
  • table item: added the eun-table-item component
  • table cell: added the eun-table-cell component
  • table column: added the eun-table-column component
  • table action bar: added the eun-table-action-bar component
  • managed table: added the eun-table-managed component
  • table skeleton row: added the eun-table-skeleton-row component

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