Changelog
What changed in each release of Xedonium.
1.26.2 - 2026-11-05
Fixed
- Keyboard focus is no longer clipped or missing:
Sidebarentries andAppBarlinks draw their focus outline inside the element (a scrolling parent cut it off), andTreeitems show a focus outline on the focused row (there was none). Tabsshow a clean inset focus ring around the focused tab when you use the keyboard, instead of the browser's default outline, which was clipped by the tab list.
1.26.1 - 2026-11-05
Added
AccordionandAccordionSectionhave aheadingLevelprop (2 to 6, default 3) so their headers can follow the heading above without skipping a level.
Fixed
- Accessibility fixes from an axe audit of every component:
VirtualListno longer putsaria-rowcounton its list role, andNestedTableonly setsaria-controlswhen the details row it points to exists.TransferListis a plain list of checkboxes, not a listbox of options that contain checkboxes; aSidebarsection caption is a plain list item; a horizontalTimelinecan be focused to scroll it with the keyboard.- Text contrast:
ButtonandChipsuccess / info (andChipdanger in dark mode) pass WCAG AA,CodeDisplayuses the customcolors.textfor its caption, Copy button and line numbers, andLogViewerno longer fades stack-trace lines. - Label in Name: calendar days are named with the weekday, day, month and year (for example "Sunday, November 1, 2026"),
PipelineGraphnodes put their visible text first (for example "build main 2m, success").
1.26.0 - 2026-11-05
Added
DataGridhas adensityprop:compacttightens the padding of the cells, header, selection column and loading skeletons (and lowers the defaultrowHeightto 32 whenvirtualized). The defaultcomfortableis unchanged (#114).Cardhas aheadingLevelprop (2 to 6, default 3) so its title can follow the heading above it without skipping a level (#116).
Fixed
Badgesuccessandinfouse darker backgrounds (emerald-700, sky-700) so the white text passes WCAG AA contrast (#117).- The
Copybutton ofCodeDisplayhas a hit area of at least 24 x 24 px (larger on touch screens) without changing how the caption looks (#115).
1.25.2 - 2026-11-03
Changed
- The project is now called
xedonium: package, site and AI catalog references toxedonium-uiwere updated.
1.25.1 - 2026-11-01
Fixed
Sidebarshows each entry's label in aTooltipwhencollapsed, instead of the browser's nativetitle; the entry keeps itsaria-label(#112).
1.25.0 - 2026-10-31
Added
Menu,ContextMenuandActionMenuitems acceptheading: a group label that is not a menu item for screen readers. The items after it are grouped under it (role="group"), and arrow keys skip it. It works in both looks. An item withitemsis also a group, with itslabelas the heading (#109).
1.24.0 - 2026-10-31
Added
MenuandContextMenuitems acceptdescription,badge,href(a real link, withtargetandexternal),tone: 'warning'andhasDialog, as inActionMenu;linkComponentandlinkPropswap in a router link for site paths. The newlook="actions"prop gives the menu the look ofActionMenu(uppercase labels, ruled rows, a fixed width), also in submenus; the default look is unchanged (#107).
1.23.0 - 2026-10-30
Added
ActionMenuitems accepthref, which renders a real link (<a role="menuitem">) so navigation items support middle-click and "copy link address" and are announced as links;onClickis now optional.linkComponentandlinkPropswap in a router link, as inBreadcrumb, andtarget(for example_blank, which also sets a saferel) opens a link elsewhere. Links to another site (target="_blank"or an absolute http(s) address) show an arrow, andexternalturns it on or off (#105).ActionMenuis keyboard friendly: opening it focuses the first item, Arrow Up / Down (wrapping), Home and End move between items, Space chooses a link item and Tab closes the menu (#105).
1.22.0 - 2026-10-29
Added
Calendarhas ajumpModeprop:dropdownturns the title into a month/year picker (months and years outsidemin/maxare disabled), andinputlets you type a DD / MM / YYYY date and jump to it. The defaultnonekeeps the plain title.Videohas anautoQualityprop (on by default): with more than one source it adds anAutoquality that picks the highest resolution fitting the player size, pixel ratio and connection, and steps down when playback stalls.defaultQualitystill wins when set.
Changed
Calendarprevious / next buttons use chevron icons instead of text characters.
1.21.0 - 2026-10-29
Added
Timelinehas anorientationprop:horizontalruns the events (and branches) left to right.Timelinecan draw a branched, git-graph style timeline: events take abranch, a branch splits off withforkFromand joins back withmergeFrom, and the newbranchesprop orders and labels the lanes.Drawercan open from thetoporbottom(side, withheightto size them) and has ananimatedoption that slides it in and out and fades the backdrop.ContextMenuopens aMenuat the pointer when its children are right-clicked (or the Menu key is pressed), with the same items, shortcuts, danger tone and submenus.Switchhas ashowStateprop that prints | (on) or 0 (off) inside the track.
1.20.0 - 2026-10-28
1.18.0 - 2026-10-28
Added
CodeDisplayandMarkdownfenced code now coloryaml/yml(keys, quoted scalars, comments, booleans, numbers and GitHub Actions${{ }}expressions). The built-inhighlightfunction is exported so a customhighlightercan fall back to the defaults.
1.16.0 - 2026-10-27
Added
TableacceptsrowProps(row)(extra attributes such asclassNameoraria-selectedfor a row) andisRowHidden(row), which hides a row with thehiddenattribute but keeps it mounted, so filtering does not reload images or reset inputs. The last visible row has no bottom border, and the empty message shows when no row is visible (#70).Sidebaracceptsdivider: trueitems (an unlabeledsectionrenders the same),textCase="none",iconSize,itemClassName,widthandborderRight(independent ofbordered); an item'slabelis optional for dividers.AppShellacceptssidebarFullHeight, which puts the header over the content column only (#77).MultiSelectacceptscreatable(withcreateLabelandonCreate): Enter or a comma adds the typed text as a value even if it is not inoptions, anAdd "text"row offers the same, and duplicates are never added (#79).Markdownacceptsinline, which renders only the inline subset into a fragment (or aspanwithclassName), for short strings inside a heading or paragraph (#80).ScrollProgressacceptsbarClassName, and the bar fill and the ring stroke (also onBackToTop) read the--xd-progressCSS variable (#83).- Primary colour tokens
--color-app-primary,--color-app-primary-hoverand--color-app-primary-text(and theapp-primary,app-primary-hoverandapp-primary-textcolours in the Tailwind preset andtailwind-v4.css): the defaultButton/ButtonLinkand the keyboard focus ring read them. They default to the previous colours, so nothing changes until you override them on:root(#84). ActionMenuitems accepttone: 'danger'(red text, icon, hover and focus background) next towarning(#75).ConfirmDialogacceptsmaxWidth(amax-w-*class),confirmDisabledandconfirmVariant(#76).Inputacceptsclearable(andclearLabel): a clear button shows while there is a value, Escape clears too, and focus returns to the input (#78).Badgeacceptsshape(square,roundedorpill; defaultsquare) (#81).StatCardacceptssize="compact", which puts the value beside the label in a shorter tile (#82).
Fixed
Field:requirednow defaults tofalse(it wastrue, so every field was announced as required) and, when set, also puts the nativerequiredattribute on the input, so browser validation and:invalidstyling work. Note: forms that relied on the old default should passrequiredexplicitly (#73).Image: the fallback is cleared whensrcchanges, and an image that failed before hydration now shows the fallback (#71).FileUpload: dropped files are filtered byacceptlike the picker (newonRejectreceives the rest), the input is reset so the same file can be chosen twice, andclearOnSelectforgets the selection afteronChange(#72).Tooltip: a display utility inclassName(flex,block, ...) replaces the wrapper's defaultinline-flex(#74).
1.15.0 - 2026-10-18
Added
DataGridacceptsvirtualized(withrowHeight, default 40, andheight, default 400): only the rows in view are rendered, between spacer rows, with a sticky header andaria-rowcount/aria-rowindex. All rows scroll in one list unlesspageSizeis set; sorting, search and selection cover every row. Row heights must be fixed (#67).- Brand logo icons:
WindowsIcon,AppleIcon,LinuxIcon,AndroidIcon,UbuntuIcon,DebianIcon,FedoraIcon,FreeBsdIconand database logosMysqlIcon(name and logo),MysqlNameIcon(name only),MysqlLogoIcon(dolphin only),PostgresqlIcon,MongodbIcon,SupabaseIcon,FirebaseIcon,MariadbIcon,SqliteIcon,RedisIcon(current "R" mark),OldRedisIcon(the classic layered logo),ElasticsearchIcon,CassandraIcon. They are filled one-colour marks (currentColor) from Simple Icons (CC0), except Windows, which is drawn here. Not included: Chrome OS, SQL Server and Oracle, which are not in a licensed icon set (#68). ThemeProvider/useAppThemeacceptdefaultTheme(light,darkorsystem, defaultsystem): the theme used until the user chooses one. The default is never stored; only a different choice is, andsystemis stored when it is not the default. NewgetThemeInitScript({ storageKey, defaultTheme })returns an inline script that setsdata-themebefore the first paint (#65).CarouselacceptspreviousLabel,nextLabelanddotLabel(index)to change the wording of the buttons and dots (aria-label and tooltip), for example "Previous order" or a translation (#66).
1.14.0 - 2026-10-15
Added
- Icons
ArrowUpDownIcon,ArrowLeftRightIcon,ChevronsUpDownIcon,CpuIcon,LaptopIcon,KeyboardIcon,MouseIcon,MemoryStickIconandTabletIcon(#62).
Fixed
Calendar(andDatePicker,DateTimePicker,DateRangePicker): the month buttons are disabled when the previous or next month has no day withinmin/max,PageUp/PageDownand the arrow keys no longer move outside the range or onto a disabled day, and with nothing selected it opens on the nearest allowed month. A time onmin/maxno longer disables its own day (#63).
1.13.0 - 2026-10-13
Added
PipelineGraph: a left-to-right job dependency graph (like the workflow view on GitHub Actions) with status icons, per-nodeicon,description,trailing,classNameanddisabled, elbow connectors, drag or touch to pan,onNodeClick/selectedIdandrenderNode. The grid layout is exported aslayoutPipeline.
1.12.0 - 2026-10-13
Added
CodeDisplayandMarkdownfenced code now colorhtml(alsoxml,svg),css(alsoscss),apache(alsohtaccess) andnginx, and take ahighlighterprop to plug in your own tokenizer for other languages. TheHighlightertype is exported.
Changed
- Tailwind v4 is supported: the
tailwindcsspeer range is now^3.4.0 || ^4.0.0, the README has a Tailwind v4 setup section andxedonium/tailwind-v4.cssprovides the dark variant,app-*colours and animations.
1.11.0 - 2026-10-10
Added
RichTextEditor(beta): a WYSIWYG editor with no dependencies (bold, italic, headings, lists, quotes, code, alignment, colors, links, images, tables, undo and redo). HTML is sanitized by an allowlist on the way in and out;format="markdown"edits Markdown. Images can be resized (corner handle, width presets) and table columns dragged by their borders. Also exportssanitizeHtml,markdownToHtmlandhtmlToMarkdown, and six icons (ListOrderedIcon,QuoteIcon,TableIcon,PaletteIcon,HighlighterIcon,RemoveFormattingIcon).
1.10.0 - 2026-10-10
Added
NestedTable(tree rows and master-detail rows with lazy loading, exclusive, row actions),LogViewer(level filter with counts, debounced search with highlights, follow-the-newest with "Jump to latest", full screen,parseLogFile),FileExplorer(grid, list and tree layouts, breadcrumbs, filter, lazy folders),PasswordStrengthInfowith custom rules (rules,extraRules,passwordRules,onResult) andNetworkConnection(detects online, offline and no internet; panel, badge and banner).BackToTop(appears after scrolling, smooth scroll to the top, optional progress ring) andScrollProgress(abaralong the top of the page, or abuttonwith a ring), with theuseScrollProgresshook.useDebouncedValue(withleadingandmaxWait),useNetworkStatus,useMediaQueryanduseUnsavedChanges(asks before leaving a form with unsaved changes: the browser prompt plus held-back link clicks) hooks.NotificationCenter: a "View all" footer (onViewAllorviewAllHref) andmaxItems.Modal:fullScreen,fullScreenToggle,defaultFullScreenandonFullScreenChange.
1.9.0 - 2026-10-08
Added
Markdowncomponent: GitHub-style Markdown (tables, task lists, nested lists, fenced code with highlighting, images, router-aware links) with no dependencies. HTML in the source stays text and unsafe URLs are not rendered as links or images.
1.8.0 - 2026-10-08
Added
ThemeProvider/useAppThemeacceptallowSystem: a thirdsystemmode that follows the device theme and is the default.useTheme()now also returnsthemeMode,setThemeModeandallowSystem;toggleThemeandThemeTogglecycle system, light, dark (a monitor icon shows while following the device). NewThemeModetype. Without the option nothing changes.- Switching the theme now crossfades the whole page (View Transitions API) instead of fading elements one by one; browsers without it, and users who prefer reduced motion, keep the plain colour transitions.
1.7.1 - 2026-10-07
Added
Modal,DraweranduseDialogFocusacceptinitialFocusRefto choose the element focused on open; thedata-autofocusattribute is now documented (#46).- Icons
BanIcon,ArrowUpRightIcon,DevicesIcon,LayoutGridIcon(same drawing asGridIcon),BookOpenIconandUserBadgeIcon(#48). DateTimePicker: a date and a time picker side by side with oneDatevalue, replacing<input type="datetime-local">(#47).Sidebaritems acceptsection: truefor a group caption (a divider when collapsed), and labels that are cut off by the width show a tooltip.TooltipgainsonlyIfTruncated(#33).Sidebaracceptsbordered(turn the separators off),density(dense|default|comfortable),headerClassNameandlistClassName(#32).ActionMenuitems accepticon, shown before the label (#44).CommandPaletteacceptsonQueryChange,loadingandfilterfor async results (with groupedcommands), andhighlightto mark matched text with<mark>(#43).StatCardacceptsicon,status/statusTone(a Chip),href(withlinkComponent/linkProp) oronClickto make the tile clickable,disabled, andloading(value placeholder witharia-busy) (#42).ModalacceptsfullScreenBelow('sm'|'md') to fill the screen on small viewports, and its props now includenoValidate,autoComplete,action,method,encType,targetandacceptCharsetforas="form"(#41).Draweracceptsbusy(ignores Escape, backdrop and close while an action is in flight, likeModal) andbusyOverlay(covers the body with a spinner) (#40).AccordionSection: a standalone single collapsible section (controlled withopen, ordefaultOpen), for pages that put other content between sections instead of oneAccordionper section (#39).Checkboxacceptsdescription, a muted line under the label that is linked to the input witharia-describedby(#38).Chipacceptstone(default|success|warning|danger|info) andfilled, so it works as a coloured status pill (#35).AppBaracceptsembedded, which drops its own sticky<header>frame so it can sit insideAppShell'sheaderwithout a double border or nested banners (#28).AppShellacceptsmenuButtonVariantandmenuButtonProps(className,aria-label, ...) to customise the mobile menu button (#27).AppShellsidebarCollapsedBelow="lg"shows the inline sidebar as an icon rail betweenmdandlg, and asidebarrender function now receives(close, { inDrawer, collapsed }). NewuseMediaQueryhook (#29).DataGridloadingshows skeleton rows in place of the data, setsaria-busyon the table and announces "Loading…" in the footer (#24).DataGridcolumns acceptclassName,headerClassName,width,minWidthandhideBelow: 'sm' | 'md' | 'lg'(hides the column on smaller screens) (#25).DataGridhideFooterWhenSinglePagehides the footer (row count, page size select, pager) when every row fits on one page (#26).Field,Select,TextAreaandPasswordInputaccepthelperText, shown under the field while there is noerrorand linked to the control witharia-describedby(#30).InputacceptsstartAdornmentandendAdornment(an icon or a clear button) and pads the text to clear them (#31).
Fixed
- Docs: the Badge page points to
Chip(withtone) for status labels, and the Chip page says when to useBadgeinstead (#36). - Docs:
PageLayoutneeds a full-height flex column as its parent (min-h-screen flex flex-col); the README, the Getting Started page and the component docs now say so and show it (#45). Cardheader wraps on narrow screens, soactionsdrop below a long title / subtitle instead of squeezing the text into a narrow column (#37).Button/ButtonLinklay out asinline-flexwith a gap, so an icon next to a label sits beside it instead of stacking above it (#23).Paginationbuttons are 38px tall, matching the per-pageSelect, and Prev / Next share one minimum width (#34).
1.7.0 - 2026-10-07
Added
yarn typecheck(also run in CI, on pre-push and before publishing) and compile-time type tests.
Changed
- The library source is now TypeScript (
.ts/.tsx). The published.d.tsfiles describe every prop precisely: fixed choices are literal unions (gap,variant,size,placement, ...), optional props are optional, and callbacks, item shapes and the genericTable/DataGrid/RadioGroupare typed. Prop types are exported fromxedonium(import type { AccordionProps } from 'xedonium'). TypeScript apps that relied on the old, looser types may see new errors where a prop was misused.
1.2.0 - 2026-10-06
Added
- Unit test suite (Vitest + Testing Library) with a 90% coverage gate enforced by a pre-push hook and CI.
- CI workflow that lints and tests every push to
dev. - Community files: contributing guide, code of conduct, security policy, and issue and pull request templates.