- Changelog
- Experimental
- Next
- 5.0.2
- 5.0.1
- 5.0.0
- 4.4.0
- 4.3.1
- 4.3.0
- 4.2.1
- 4.2.0
- 4.1.0
- 4.0.0
- 3.6.0
- 3.5.0
- 3.4.0
- 3.3.4
- 3.3.3
- 3.3.2
- 3.3.1
- 3.3.0
- 3.2.1
- 3.2.0
- 3.1.1
- 3.1.0
- 3.0.0
- 2.8.1
- 2.8.0
- 2.7.1
- 2.7.0
- 2.6.0
- 2.5.0
- 2.4.2
- 2.4.1
- 2.4.0
- 2.3.0
- 2.2.0
- 2.1.0
- 2.0.1
- 2.0.0
- 1.19.0
- 1.18.0
- 1.17.0
- 1.16.0
- 1.15.0
- 1.14.0
- 1.13.0
- 1.12.1
- 1.12.0
- 1.11.6
- 1.11.5
- 1.11.4
- 1.11.3
- 1.11.2
- 1.11.1
- 1.11.0
- 1.10.0
- 1.9.1
- 1.9.0
- 1.8.1
- 1.8.0
- 1.7.2
- 1.7.1
- 1.7.0
- 1.6.1
- 1.6.0
- 1.5.2
- 1.5.1
- 1.5.0
- 1.4.0
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.6
- 1.2.5
- 1.2.4
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.2
- 1.1.1
- 1.1.0
Changelog
Azalea Kit UI follows
Semantic Versioning. Features or components that are deemed no longer necessary will have the
Components with the
New versions of AKU are released as-needed and generally occur when a critical mass of changes have accumulated.
The Experimental section below tracks in-flight experimental work organized by integration branch. Entries graduate into Next when the experimental flag is removed.
Experimental
Next
5.0.2
-
Fixed
ahi-input-mask, and with itahi-zip-code-input,ahi-ssn-inputandahi-phone-input, moving the caret to the end when a character was deleted or typed in the middle of a value. The next keystroke then landed at the end instead of where the user was typing, leaving the characters after the edit out of place, so a corrected phone number could come out complete but wrong. The caret now stays where the user is typing, moving past a separator the mask inserts in front of a typed character, and staying put when the mask rejects one. Withtype="email", which gives no caret position to read, the caret still moves to the end -
Fixed pressing Enter in
ahi-input-mask,ahi-zip-code-input,ahi-ssn-inputandahi-phone-inputnot submitting their form, as it does inahi-input. A consumer can still cancel thekeydownto stop it -
Fixed Delete just before a separator in
ahi-input-mask,ahi-zip-code-input,ahi-ssn-inputandahi-phone-inputleaving the value unchanged. The caret now steps over the separator, as Backspace steps back over one, so the next Delete removes the character after it. Delete of a trailing separator no longer also removes the character before it -
Fixed
ahi-number-inputacting on keys pressed in a control slotted into itslabelorhelp-text: Enter submitted the form and the arrow keys stepped the value. Only keys pressed in the field itself do that now - Release Date 10/29/2026
5.0.1
-
Fixed three text and icon pairings in the dark theme that missed WCAG 2.1 AA. The label of an outline
ahi-buttonwithvariant="primary"or"destructive"now uses--ahi-text-primaryor--ahi-text-criticalinstead of the fill color, going from 3.4:1 to 6.5:1 (primary) and from 2.9:1 to 10.3:1 (destructive) on--ahi-surface.--ahi-icon-on-interactiveand--ahi-text-on-interactiveare now a dark gray (--ahi-color-gray-50) in the dark theme instead of white, which was 2.5:1 on the blue-400--ahi-interactivefill. That makes theahi-checkboxcheck and indeterminate marks 7.7:1. In the light theme the outline primary label is one step darker (blue-700, the--ahi-text-primaryvalue); the outline border and every other light color are unchanged -
Fixed
ahi-memorable-datenot updating itsvalueuntil the day or year field was left, so a form could only enable its submit button after the user tapped away from the date. The value now follows each keystroke and month choice, and each change emitsahi-inputwith the new value.ahi-changestill fires once, when a changed field is left. The day and year fields’ ownahi-inputevents no longer escape the control, where they carried its previous value - Release Date 10/27/2026
5.0.0
-
🚨 BREAKING: AKU components now size their text at
--ahi-font-size-400(16px, scaled by--ahi-font-scale) instead of inheriting it from the page. Two things change. Text you size around a component no longer reaches inside it: a 14px table cell holding anahi-collapsiblerenders its label at 16px, and slotted content does the same. An app whose root is not 16px sees AKU text at the documented sizes instead of scaled to its root. An app on a 16px root that sizes nothing around its components sees no change, except that this text now follows--ahi-font-scaleset on:root, and no longer follows a larger default font size chosen in the browser’s settings. Inline text typeset with the copy around it keeps inheriting: theformat-*components,ahi-relative-time,ahi-fhir-human-nameandahi-fhir-quantity. To size a region’s components from the text around them, set--ahi-component-font-size: 1emon its container (notinherit, which a custom property applies to itself). To have AKU text follow the density tier, set--ahi-component-font-size: var(--ahi-type-body-font-size)on the element carrying the tier class. Afont-sizeyou set on an AKU element yourself still wins. See The host contract: text size -
Fixed
ahi-treenot indenting nestedahi-tree-items. Since 2.5.0 every label sat at the same position whatever its depth, so indent guides no longer lined up under their chevrons, and setting--ahi-component-font-sizeto a fixed size also pulled every guide into one column. Each level is indented one--indent-sizefurther than its parent again, with or without the token, and at the default--indent-sizeeach guide sits under its chevron again. First-level items move 16px to the left, back to where they sat before 2.5.0 -
Added
ahi-logo, which draws the Azalea Health logo, the flower alone, the AI sparkle and the myHealthspot logo, so apps no longer copy logo files. It follows the theme: full color on light surfaces and all white under.ahi-theme-darkor in an.ahi-invertsection of a light page, as the brand guidelines require.appearance="neutral"draws a mark in the current text color, for use as an icon, andappearance="inverse"draws it white on brand-colored backgrounds.sizesteps through set heights, and the--sizecustom property sets any other. On the AI sparkle,twinkleplays a twinkle when its button is hovered or focused, andworkingloops while set (for at most five seconds); neither plays with reduced motion. The colors are the brand logo colors,--ahi-brand-blue,-greenand-red, now the official values. Fixed-color files for favicons and app icons ship as@azaleahealth/azalea-kit-ui/brand/<name>-{brand,neutral,inverse}.svg. See Logo -
Updated the brand logo colors (
--ahi-brand-blue,--ahi-brand-green,--ahi-brand-red) to the official Azalea Health logo colors from the 2025 Brand Guidelines:#0a77bc,#00964cand#e63d2f, replacing#216caf,#31884aand#d74433. The--ahi-color-{blue,green,red}-*ramps are rebuilt so each official color is its-600step, on the same OKLCH lightness curve as every other ramp, with the lightest green and red steps kept just off white the way orange and yellow already are. Everything that resolves to these ramps shifts slightly: primary actions, links and focus are a brighter blue, and success and critical colors move with green and red. Token names are unchanged, and every text pairing the components draw still meets WCAG 2.1 AA. White on the primary fill is now 4.80:1, down from 5.48:1 -
Added
--ahi-brand-navy(#112749), the brand guidelines’ dark blue, for brand chrome such as nav bars and large backgrounds (white text 14.9:1), and a Brand colors section on the Color tokens page mapping every brand guidelines color to its AKU token -
Updated
--ahi-color-data-7to--ahi-color-yellow-800(was yellow-600). For deuteranopes, yellow-600 was nearly indistinguishable from--ahi-color-data-2(orange); the darker step is clearly distinct for normal vision and every color-vision deficiency, and still clears 3:1 on light and dark surfaces. The warning colors are unchanged -
Updated
ahi-buttonto draw a slottedahi-logoin the button’s own text color when the button is disabled or filled (variant="primary"or"destructive", withoutoutlineorplain). Without it, a full-color mark such as the AI sparkle looked enabled on a disabled button, and its blue vanished into the primary fill.ahi-logotakes the color through the new--logo-colorcustom property, which can also be set directly -
Fixed
ahi-avatarignoring the documented--sizecustom property when it is set on the element. Its size steps set--sizeinternally, so it only worked through::part(avatar).--sizeon the element now sets the avatar’s size, and::part(avatar)keeps working. An avatar under any element that sets--sizenow takes that size too - Release Date 10/14/2026
4.4.0
-
Fixed
ahi-input-mask, and with itahi-zip-code-input,ahi-ssn-inputandahi-phone-input, displaying inline. They now display as a block, likeahi-input, so a consumer giving themdisplay: blockto line them up with other fields can drop that override -
Fixed
ahi-input-mask,ahi-zip-code-input,ahi-ssn-inputandahi-phone-inputnot showing their error after a blocked form submission orreportValidity(), so a required field left empty showed no message. They also no longer keep showing an error after a form reset orresetValidity() -
Added follow-up questions to
ahi-fhir-questionnaire: an item withenableWhenshows only while its conditions are met (exists,=,!=,>,<,>=,<=, withenableBehavioranyorall), and hiding a group hides everything in it, as does hiding every question in it. Answers to hidden questions are left out of the response and kept, so they come back if the question does. An unchecked checkbox counts asfalsefor every operator butexists -
Added
initialResponsetoahi-fhir-questionnaire, for resuming a savedQuestionnaireResponse. Its answers fill the form without settingdirtyor emittingahi-questionnaire-change, a choice saved as its display or code still selects its option, and a response for a different questionnaire is not applied -
Added
paged,page,pageCountandfirstInvalidPage()toahi-fhir-questionnaire, to show one top-level group at a time while keeping every answer. The parent owns the navigation, enableWhen works across pages, and an answer that adds or drops an earlier page keeps the page on screen -
Added the FHIR
Taskresource type (fhir/resources/Task) with theTaskStatus,TaskIntentandTaskPriorityvalue sets, typedQuestionnaireItem.enableWhenandQuestionnaireItem.initial, and exportedExtensionValuesfromfhir/datatypes -
Updated
ahi-fhir-questionnaireto show its own text (Add another, Other…, the unit and value labels, and its loading and error messages) in English or Spanish, followinglangor<html lang>, and to pass itslangto the controls inside it -
Added the
ahi-fhir-questionnaireterms to the translations:addAnother,repeatedAnswerLabel,removeRow,otherOption,otherValue,loadingOptions,failedToLoadOptions,showingFirstOptions,noResultsTryAnotherSearch,failedToLoadResults,quantityValue,quantityUnit,loadingUnitsandfailedToLoadUnits. A locale that overrides the built-in English needs all of them -
Fixed
ahi-fhir-questionnairewriting dateTime answers without seconds or a UTC offset, and time answers without seconds, which FHIR requires. A dateTime answer now carries the browser’s offset (2026-03-01T09:30:00-05:00) and a time answer its seconds (08:15:00) -
Fixed
ahi-fhir-questionnaireemittingahi-questionnaire-changewhen it fills in a quantity’s only unit option on load or onreset() -
Fixed
ahi-fhir-questionnaireleaving every row after the first in a repeating question without an accessible name. Those rows are now labeled with the question and their position (“Medications, answer 2”), hidden from sight so the question text still shows once -
Fixed
ahi-layoutleaving a footer that is notsticky-footerpartway up the screen on a page shorter than the viewport, directly under the content with bare layout background below it. The main region now takes the height a short page leaves over, so the footer sits at the bottom of the viewport there, and still directly after the content on a page that scrolls -
Release Date 10/2/2026
4.3.1
-
Fixed
ahi-nav-itempainting the label of an active item that owns a subnav with--ahi-textrather than--ahi-color-navigation-text, which made it unreadable on a dark navigation. A consumer pinning--ahi-texton its nav items to work around this can drop that override -
Fixed
ahi-selectwithmultiplegiving its selected count (“2 options selected”), which screen readers announce as the field’s value, in English whatever the language. The count is now a translation term (numOptionsSelected, in English and Spanish), and it follows a later change to<html lang>or the select’s ownlang -
Fixed
ahi-tooltipopening when its target is clicked or tapped. Thehovertrigger now responds only to a mouse or pen resting on the target for--show-delay; pressing the target cancels a pending open, closes an open tooltip, and keeps it closed until the pointer leaves - Release Date 9/30/2026
4.3.0
-
Added
api-developer-portalto the consumer scan that generates the bundled icon set. It was commented out ofscripts/scan-icon-usage.js, so its icon names reached neither the allowlist the build bundles nor the--checkguard — and<ahi-icon>renders an unknown name as blank space with a console warning rather than an error, so an icon missing on that repo’s behalf shipped silently. That is howheart-handshakecame to be absent from 4.2.1 while the portal’s Community Help Center link was still asking for it. It andarrows-exchangejoin the set here, which is the whole of what the repo was missing -
Added an
errorproperty toahi-input-mask(and soahi-phone-input,ahi-zip-code-inputandahi-ssn-input),ahi-memorable-dateandahi-radio-group, as onahi-input: set it to the message and the control shows that message in its error row at once, as its only error, and reports itself invalid; clear it to clear the error -
Fixed
ahi-radio-groupshowing its error only to screen readers: once invalid, it now shows the message in an error row like the other form controls - Fixed the error icon sitting at the top of a form control’s error row instead of on the message’s first line
- Release Date 9/25/2026
4.2.1
-
Fixed
<ahi-care-timeline>renderingrole="status"messages inside itsrole="list"scroll container — the loading block and the “No events match the current filters.” message. ARIA allows a list onlylistitemchildren, so both made the list itself invalid (aria-required-children), and a screen reader can drop or mis-count the rows because of it. The loading block is nowaria-hidden, matching the skeleton row beside it and leaving the announcement to the component’s existing persistent live region, which already says “Loading events…” and then the final count; the empty-state message keeps its text on screen and is announced as “0 events loaded” by that same region -
Changed the accessibility gate to scan demos hosted in an iframe, and to scan each demo in its hovered state as well as at rest.
<ahi-care-summary>,<ahi-care-timeline>and<ahi-layout>demo themselves inside an iframe, and axe only crosses a frame boundary when it has been injected into that frame — so all three had been counted as scanned without being measured. That is what the<ahi-care-timeline>defect above was hiding behind. Elements examined rose from 26,876 to 28,547 -
Fixed
<ahi-banner>breaking its slotted content onto one line per fragment. The content slot sat directly inside the component’s flex column, and a slot isdisplay: contents, so every assigned node — each run of text, each<code>, each<strong>— flattened into the column and became its own flex item with a gap above it. A sentence with any inline markup in it came out as a vertical list of words. The slot is now the single flex item, so content lays out in normal flow; paragraph spacing inside the banner is unchanged -
Release Date 9/15/2026
4.2.0
-
Fixed
<ahi-layout>’s navigation collapse handle having no accessible name. It was a button wrapping one icon and nothing else — no text, noaria-label, notitle— so it announced as “button” and nothing more, while remaining keyboard focusable. It now carries a name and anaria-expanded, both following whether the nav is open, and both translated (collapseNavigationandexpandNavigation) rather than hardcoded. One consumer’s accessibility scan reported this on every one of its authenticated routes, this being app chrome; that is 26 of the 31 findings it was carrying -
Added
collapseNavigationandexpandNavigationto the translations. A locale that overrides the built-in English needs both, alongside the existingresizeNavigation - Release Date 9/15/2026
4.1.0
-
Fixed
<ahi-avatar>reporting itself to assistive technology as an image with no name. It renderedrole="img"unconditionally witharia-labelset to thelabelproperty, so an avatar without alabelemittedaria-label=""— arole-img-altfailure, seven times over in one consumer. An avatar with nolabelis now decorative (aria-hidden, norole), which is what such an avatar is: the name it sits beside is already on the page, and the component already treated its own fallback glyph that way. Dropping the empty attribute alone would not have been enough —role="img"takes its name only fromaria-label,aria-labelledbyortitle, never from content. Passlabelwhenever the avatar is the only thing identifying the person -
Fixed
<ahi-select>leaving its combobox and listbox with no accessible name when no label is supplied. Both hard-codedaria-labelledby="label", but the label element is deliberately not rendered without a label (an empty<label>blocks every other way of naming a control), so the reference pointed at an id that did not exist. The reference is now emitted only when there is a label to reference -
Added
aria-labelforwarding to<ahi-select>, matching<ahi-input>. Settingaria-labelon the host now names the control: ARIA attributes do not cross the shadow boundary and the host is not the focusable element, so a consumer naming an unlabelled select that way previously got nothing. A visiblelabelstill wins, and onlyaria-labelis mirrored — anaria-labelledbycannot resolve from inside the shadow root - Release Date 9/14/2026
4.0.0
-
Fixed grouped rows in
ahi-care-summarydropping a row’sannotationwhenever the row also had avalue. The type and the docs had said the two display modes work “independently or together” since they were added, but the render was a ternary — value, else annotation — so a row with a value never showed its annotation. Both now render, on screen and in print. This is what made an un-interpreted lab result unreadable as one: a lab that returns no interpretation has no flag to color and no arrow to draw, so the only way to say so is text beside the value, which is exactly the combination the row discarded. Assessed-and-normal, no-interpretation-returned, and an interpretation code we do not recognize all rendered as identical plain text, and a clinician scanning the card reads all three as reassuring. To surface the gap, send anannotationsuch as'No flag received'on rows whose result came back un-interpreted, and leave normal rows unmarked so the flagged ones keep their prominence.ahi-care-timelinealready rendered both together and is unchanged -
Fixed a grouped row’s
annotationinahi-care-summaryoverflowing its card when the text was long. The style was written when the only annotations were one-word severities that always fit, so it setwhite-space: nowrapand refused to shrink; a longer label — now that a row can pair one with a value — ran past the card’s right edge instead of wrapping. Annotations wrap now. The value beside them still never wraps: it holds its width and the annotation gives way -
Updated the accessibility documentation to name the tools that are actually approved. The checklist’s automated-validation item pointed at Deque’s axe DevTools browser extension — it predated the CI gate, and it is not the extension the tool review selected. It is now two items: the automated WCAG 2.1 AA scan (
npm run test:a11y, writing the evidence report toreports/a11y/, blocking in CI) and a manual review with Accessibility Insights for Web. Both run axe-core underneath, so what a reviewer sees on screen matches what CI reports. The contributing guide now says the same thing, rather than leaving the checklist as the only place it was written down -
Removed HTML_CodeSniffer from the accessibility procedures. It reads only the main document and not the shadow DOM, where nearly all Azalea Kit UI markup lives, so it both reported defects that were not real and missed defects that were — neither result is safe as §170.315(g)(5) evidence
-
Fixed the accessibility scan silently measuring less than it claimed. Its settle step collected components with
document.querySelectorAll('*'), which does not cross a shadow boundary, so a component rendered inside another component’s shadow root was never waited for — on a loaded machine those had not upgraded when the page was measured, had no box, and axe skipped them. Nested components are the norm here, so the blind spot covered most of the library; it is why the same commit could report 60 findings one run and 69 the next. The scan now descends into shadow roots, waits until the element count stops growing, fails outright if any AKU element is still un-upgraded when axe runs, and ratchets pages-scanned, elements-examined and per-rule counts againstscripts/a11y-baseline.jsonso a drop has to be re-recorded deliberately. Ten consecutive runs, three of them under a concurrent three-browser test suite, now report identical counts -
🚨 BREAKING: removed the
close-button__baseCSS part fromahi-tab. Its close affordance is no longer an<ahi-icon-button>— an element withrole="tab"must not contain interactive or focusable descendants, and a nested button stays in the accessibility tree as one however itstabindexis set. It is a decorative<span>now, so there is no inner button to expose a part for. Theclose-buttonpart itself is unchanged and still targets the affordance; if you were styling::part(close-button__base), style::part(close-button)instead -
Fixed the last WCAG 2.1 AA violation in the library. Closable tabs no longer nest an interactive control inside
role="tab", and the tab now carriesaria-keyshortcuts="Delete"so the keyboard path to closing — Delete or Backspace on the focused tab, added in 3.6.0 — is announced rather than left to be discovered. Clicking the affordance still closes the tab exactly as before. The accessibility scan now reports zero findings, down from the 69 the gate surfaced when it was introduced -
Release Date 9/14/2026
3.6.0
-
Fixed text in
ahi-calendarandahi-badgefailing the WCAG 2.1 AA contrast minimum. Adjacent-month days in the calendar were painted with the disabled text color despite being active, selectable dates, measuring 3.32:1 against the 4.5:1 they need; they now use--ahi-text-subdued(5.04:1) and stay visibly de-emphasized.ahi-badgedeclared no text color at all and inherited whatever surrounded it, so a badge placed inside anahi-icon-buttonpicked up that component’s icon color and rendered at 3.06:1 on its info surface — it now pins--ahi-textlikeahi-tagandahi-banneralready did, which clears every variant in both themes. Both are small visual changes: adjacent-month dates and badge labels render slightly darker. Override a badge’s color with::part(base)if you were relying on it inheriting -
Added a contrast suite that measures computed color against the painted background in a real browser, in both themes, so these cannot regress. It caught that the calendar defect was present in the dark theme too (3.58:1) — the accessibility scan only runs the light theme, and the dark theme’s
color-mix()surfaces cannot be checked any other way -
Fixed
ahi-pagination’s page-size control having no accessible name. The visible “Items per page” text was a plain<span>, and thearia-labelstanding in for a real association sat on<ahi-select>— an element with no role, where ARIA prohibits it, so it was discarded. The text is now the select’s own label and is properly associated; it looks the same, and thepage-size-labelCSS part still resolves to it -
Fixed
ahi-icon-buttonignoring atabindexset on the host.tabindexon a custom element governs the host and never reached the<button>inside its shadow root, so<ahi-icon-button tabindex="-1">left a live tab stop behind — which is howahi-tab-group’s scroll buttons became keyboard-reachable while being hidden from screen readers. Settingtabindexon the host now works as written; leaving it unset changes nothing -
🚨
ahi-tab’s close button is no longer in the tab order, and closable tabs now close with Delete or Backspace. Arole="tab"must not contain focusable descendants, so the close button is a pointer-only control; the keyboard path is pressing Delete (or Backspace) on the focused tab. Previously the button was reachable by Tab only by accident — thetabindex="-1"it already carried never reached inside the shadow root — and there was no intended keyboard path at all -
🚨
ahi-care-timeline’s scrolling list is now a tab stop. It scrolls, so keyboard users have to be able to reach and scroll it; in the error and empty states there was nothing focusable inside either, leaving it operable only with a pointer. It takes a focus ring on keyboard focus only -
Fixed form controls rendering an empty hidden
<label>when given no label. An explicit<label for>outranksaria-label,titleandplaceholderin the accessible-name calculation, so the empty one did not just fail to name the control — it blocked every other way of naming it. Affectsahi-input,ahi-textarea,ahi-select,ahi-number-input,ahi-range,ahi-combobox,ahi-checkbox-group,ahi-radio-groupandahi-memorable-date. No visual change: that element was alreadydisplay: none -
Fixed the documentation’s own accessibility: the template demos on the layout, care-summary and care-timeline pages had untitled
<iframe>s, and fifteen form-control demos across six pages rendered without labels -
Release Date 9/7/2026
3.5.0
-
Added an accessibility gate to CI.
npm run test:a11yruns axe-core against every component’s live docs demos in a real browser, configured for WCAG 2.1 Level AA, and writes an HTML and JSON report toreports/a11y/that CI keeps as a downloadable build artifact. It reads into each component’s shadow DOM — 813 shadow-DOM nodes on the first run, asserted on every run, since an empty report would otherwise be indistinguishable from a clean one. The first run is report-only and does not fail the build; it records a starting backlog of 60 findings across 6 rules (form labels, color contrast, frame titles,aria-hiddenfocus, nested interactive controls, and one scrollable region without keyboard access) -
Changed where changelog entries are written: each ticket now adds its own file under
docs/pages/whats-new/next/instead of a bullet in the shared## Nextblock, andnpm run releasecollates them. Contributors adddocs/pages/whats-new/next/<TICKET>.md; nothing else about an entry changes. This is what makes parallel branches merge through the Bitbucket PR button — the shared block collided by construction, and themerge=uniondriver that absorbed it locally was ignored by Bitbucket’s server-side merge. The Next section of this page is rendered from those fragments at build time, so it still shows what is coming -
Added
--ahi-component-font-size, a supported way to stop AKU text being sized by the host page’s root font-size. Set it on any container —--ahi-component-font-size: var(--ahi-type-body-font-size)— and every AKU component inside sizes itself from AKU’s type scale instead, including slotted content and nested components. Nothing changes unless you set it: the default isinherit, which is exactly the behavior every previous release had, and afont-sizeyou set on an AKU element yourself still wins. This closes the long-running question of whether AKU should pinfont-sizeon:host(it resizes text in any app whose root is not 16px, and ends slotted copy inheriting the surrounding size, so it ships as an opt-in instead). See The host contract: text size -
🚨 Planned for 4.0.0:
--ahi-component-font-sizewill default tovar(--ahi-type-body-font-size)rather thaninherit, so AKU components will size themselves consistently by default. Setting the property explicitly now is forward-compatible; if your app relies on AKU text inheriting its root font-size, that is the release to plan for -
Added a tokens-only variant of every theme —
themes/light.tokens.cssandthemes/dark.tokens.css— carrying just that theme’s token block. An app that wants both themes available at once should now load one complete theme plus the other’s tokens (light.css+dark.tokens.css) instead of two complete files: it saves ~10KB of byte-for-byte duplicate, and it removes a real load-order hazard, since the shared tail those files repeat (.ahi-toast-stack, the density modifiers,.ahi-visually-hidden,@layer ahi-utilities) is unscoped and whichever copy loads last wins it. The completelight.cssanddark.cssare unchanged, so a consumer loading a single theme needs to do nothing. The build now asserts each tokens file is a byte-exact prefix of its theme and that all themes share an identical tail -
Release Date 9/7/2026
3.4.0
-
Gave
--ahi-color-accent,--ahi-color-accent-secondaryand--ahi-color-text-on-accentvalues in both themes. All three were consumed byahi-top-bar,ahi-layout,ahi-nav-itemandahi-calendarbut defined by nothing, so an application that did not supply them got a top bar with no background at all. They now default to--ahi-color-blue-600,--ahi-color-blue-700and white; a consumer already overriding them is unaffected -
Restored the focus ring on
ahi-layout’s collapse button. It referenced--ahi-box-shadow-base, which has never existed in any theme, and one invalidvar()invalidates the wholebox-shadow— leaving the button withoutline: 0and nothing in its place -
Fixed
ahi-rangereading--ahi-line-height-800r, a typo for--ahi-line-height-800, and<ahi-text>’sbody-xsandbody-smroles carrying a stray secondletter-spacingthat referenced a token from a scale that does not exist — an invalidvar()computes to the inherited value rather than falling back to the valid declaration above it, so both roles were ignoring their own letter-spacing -
Added a sweep asserting every
--ahi-*a component references without a fallback is actually defined somewhere, which is what found the four above - Release Date 9/7/2026
3.3.4
-
Fixed the narrow and wide halves of the
30.625embreakpoint both matching at exactly 490px, so which one applied came down to sheet order. The narrow half now stops at30.6225em, matching how the47.9975em/48empair is already written; it affectsahi-radio,ahi-empty-stateandahi-table’s stacking container query. A new sweep across every component’s styles fails the suite if any future pair is written at the same width on both sides - Release Date 9/6/2026
3.3.3
-
Gated
ahi-table’s row hover behind@media (hover: hover), so a tapped row no longer keeps its highlight after the finger lifts, and a row a consumer has dimmed no longer has its text forced back to full strength on touch..ahi-row-selectedis deliberately outside the gate — it is a state, not a pointer position — and rows now take--ahi-surface-depressedwhile pressed, which is the feedback a tap gets in place of the hover -
Fixed a cell carrying
.ahi-table-ellipsiscollapsing to nothing once itsahi-tablestacked, which took the value off the card. The utility truncates by pairingmax-inline-size: 0withinline-size: 90%, which table layout resolves against the column but a flex item — which a stacked cell is — honours literally. The utility is now unset while stacked, so the value wraps - Release Date 9/6/2026
3.3.2
-
Fixed the navigation rail’s toggle sitting 6px to the right of every icon below it. Its position was
computed by padding the container in by half of what was left over after
--ahi-space-10, which is only correct if the control is 40px wide; the toggle is anahi-buttonsized by its own padding and icon, and measures 52px. It is centred by layout now, so no width is assumed - Release Date 9/6/2026
3.3.1
-
Fixed the navigation rail’s toggle, which 3.3.0 left unreachable in any layout with a top bar — so a rail
could not be expanded back to its labels at all. Three rules that place, stack and color the toggle all
still assumed it was sitting on the top bar: it was positioned by padding from a content column the rail
had already offset by a whole rail width (landing 26px into the content), stacked at the navigation’s
level rather than above the top bar (which then swallowed the click), and painted in the on-accent color,
which over the rail’s own surface is white on white. It is now anchored to the layout’s inline start, kept
above the top bar, and takes
--ahi-icon - Release Date 9/6/2026
3.3.0
-
Added rail-aware rendering to
ahi-nav-group. Insideahi-layout’s rail the group heading is taken out of sight rather than left to be clipped by the rail’s edge — measured at 40px of a 67px word inside a 72px rail before this. It stays in the accessibility tree, because it is what names the group’s list;display: nonewould have left every railed group anonymous. A group that follows another is separated by a divider in its place, while the first group gets neither divider nor heading space, so a rail does not open with a stray rule and a lone group wrapping a whole navigation comes out clean. All of it sits inside one@container style(--ahi-nav-rail: 1)block, so a group outside a rail renders exactly as before -
Added a
nav-railattribute toahi-layout. With it set, a wide-screen navigation that is not opened stays on screen as a narrow icon-only rail rather than hiding off-screen. The hidden state’s peek-on-hover return path is unreachable on a touch tablet, which left those users with a navigation that was either 250px of an 834px screen or two taps away; the rail keeps every top-level destination visible and one tap away while still handing most of that width back to the content column. It is a preference rather than a state —nav-openstill says whether the navigation is expanded — so toggling out of the expanded state returns to the rail, andpersist-nav-staterestores it with no new key. Off by default, wide screens only -
Added
--layout-nav-rail-width, the rail’s width, defaulting to one--ahi-target-min-sizeplus the padding around it. It follows the pointer rather than the viewport, so a touch device gets a rail sized for a thumb without that being inferred from screen width -
Added
--ahi-nav-rail, set to1on the layout’s navigation region while railed and inherited into slotted navigation content, soahi-nav-itemcan render icon-only. A custom property rather than an attribute because it has to cross two shadow boundaries, which no attribute selector does -
Fixed
ahi-layout’s narrow drawer taking the whole screen on a small phone. It was a flat 250px and is nowmin(250px, 80vw), so a viewport under 312.5px keeps a fifth of the page visible behind the drawer to dismiss it by. Wider phones are unaffected: at 375px the drawer still measures 250px -
Added icon-only rendering to
ahi-nav-itemforahi-layout’s rail. The label is clipped rather than hidden, so the item’s accessible name is unchanged —display: nonewould have renamed every item in the rail to its icon, and an icon-less one to nothing at all. The hit target grows to--ahi-target-min-sizeon both axes, abadgemoves onto the icon’s corner so a count stays readable, and the subnav chevron is dropped because tapping expands the whole rail rather than opening the section in place. All of it sits inside one@container style(--ahi-nav-rail: 1)block, so an item outside a rail renders exactly as before -
Added a fallback for a rail-capable
ahi-nav-itemwith noicon: the first letter of its label in a disc,aria-hiddensince it abbreviates the label rather than naming the item.iconis effectively required for any navigation that can be railed — several icon-less items would otherwise be indistinguishable from one another, which is worse than no rail at all - Release Date 9/6/2026
3.2.1
-
Fixed
ahi-combobox’s truncation footer reading as a tile detached from the list it describes. The listbox carried the popup’s background, rounded corners and--ahi-shadow-popover, which was correct while the listbox was the whole popup — but once the footer joined it as a sibling in 3.2.0, the listbox was dropping a shadow onto the footer and curving its own bottom corners away from the footer’s square top, on top of the footer’s border. Three separators between two halves of one surface.ahi-popuppaints nothing by design, so nothing else was holding the shape. Those four properties now sit on a newpanelpart wrapping the listbox and the footer, which clips its children to its own corners, leaving a single hairline between list and footer. Anyone styling::part(listbox)to adjust the popup’s background, radius or shadow should move that to::part(panel); everything else about the part is unchanged -
Fixed the same restructure’s other half: a truncated
ahi-comboboxoverflowing the viewport by the height of its footer.--auto-size-available-heightis Floating UI’s measure of the room between the field and the viewport edge, and it capped the listbox alone — so the footer was appended below that limit and the Show more control could land off the bottom of the screen, still reporting as visible to a test because it had a layout box. Measured in a consuming app at 725px in a 720px viewport, and 838px in an 839px one. The budget now caps the panel, and the listbox shrinks inside it rather than pushing the footer out, so the popup spends that height on both children. A consumer that worked around this by capping::part(listbox)themselves can drop it - Release Date 9/4/2026
3.2.0
-
Added a truncation footer to
ahi-comboboxforlazymode, so a capped option list no longer presents itself as the whole set. Settotal-resultsto the true number of matches and the foot of the listbox states what it is showing — “Showing 50 of 2,736 — keep typing to narrow” — resolving to “Showing all 3 matches” once the slice is complete. The footer is present in both cases deliberately: one that only appeared when something was wrong would teach you nothing about when its silence can be trusted. Nothing changes for a consumer that does not settotal-results -
Added
load-moretoahi-combobox, which renders a Show more control in that footer and emitsahi-load-morewith{ rendered, total }so you can extend the slice;load-more-countsets the slice size used in the label (“Show 50 more”). The control joins the arrow-key cycle after the last option rather than becoming a Tab stop — Down past the last option reaches it, and activating it moves focus to the first newly-added option — so Tab keeps meaning “leave the control”. Also addedahi-listbox-scroll-endfor consumers who want a scroll-driven reveal instead; there is deliberately no built-in scroll UI, since it is the least reachable of the options by anything but a mouse -
Added a
listbox-footerslot andlistbox-footer,listbox-footer-text,load-more-buttonandemptyCSS parts toahi-combobox. Filling the slot replaces the generated footer outright, so render your own count — and your ownaria-liveregion if it changes, or the update is silent to a screen reader -
Fixed
ahi-comboboxnever rendering its own empty-state messages.noOptionsTextandnoResultsTexthave been declared as properties since the component shipped, but nothing read them:render()emitted only the option slot and the.combobox__emptystyles were unreferenced, so a search that matched nothing produced a blank popup and both attributes were inert despite appearing in IDE autocomplete. They now render —no-results-textafter a search that matched nothing,no-options-textwhen there are no options at all — and defer toloading, so alazycombobox waiting on results no longer flashes “No results found” at you mid-fetch -
Fixed the
ahi-comboboxloading spinner rendering at 20px against the 16px expand icon it replaces, which made the field’s contents jump each timeloadingtoggled. The stylesheet set--sizeand--track-widthon it, andahi-spinnerreads neither — both were inert and the spinner fell back to its default size. It is now sized with thesizeattribute that actually works, and the two dead properties are gone -
Updated the
ahi-comboboxlazydocumentation, which described the mode as “server is responsible for filtering”. That excluded a supported and common case: filtering a list you already hold in memory.lazyonly means the combobox stops filtering and you take over — from a request or from an array, your choice — and it is the only way to keep the DOM small either way, since non-lazy filtering hides option elements and so still needs every one of them present. The docs page gains a worked in-memory example beside the async one -
Fixed
ahi-dialogrendering as a full-bleed bottom sheet on desktop instead of a centered modal, a regression present in every 3.x release. The panel is a bottom sheet by default and a media query at48emturns it into a centered modal; that query also held the one rule that sized the title by viewport width, and removing the latter in 3.0.0 — correctly, since type should not be decided by width — took the panel’s whole desktop layout with it. Centering, the620pxmax-width and the rounded corners are all back, and a dialog you have not styled yourself returns to how it looked before 3.0.0 with no action needed. Two things are worth checking if you did work around it. A panel given an explicitwidththrough::part(panel)was the visible face of this bug — the base panel isposition: fixedwithleftandrightboth pinned to 0, so adding a width over-constrained it and the browser droppedright, leaving the panel flush against the left edge with the page showing through on the right — and that panel is now centered, but it is also subject to the restoredmax-width: 620px, so setmax-widthalongsidewidthif you intend a panel wider than that. Amargin-inline: autoadded to work around the left-edge pinning is now redundant and can come out. Tests now measure the panel’s placement in both modes, which nothing did before - Release Date 9/4/2026
3.1.1
-
Fixed the theme stylesheets failing to load for consumers that run CSS through a preprocessor.
.ahi-grid’s overflow guard was written withmin(), and Sass implementations resolvemin()andmax()as Sass functions rather than leaving the CSS ones alone — given avar()where they want a number they throw, and the whole stylesheet is lost. The failure is silent and easy to misread: the server answers 200 with atext/csscontent type and an error page for a body, the browser parses it to zero rules, and every--ahi-*token disappears at once, so components render against whatever other tokens happen to be on the page rather than visibly unstyled. Bothlight.cssanddark.csswere affected. The guard is now spelledclamp(0px, …, 100%), which is arithmetically identical for any track size and has no Sass equivalent, so it passes through untouched —.ahi-gridbehaves exactly as before and no consumer action is needed. This only ever affected consumers who preprocess the theme; loading it as plain CSS was always fine. A build check now fails onmin()ormax()in any shipped theme so it cannot return -
Fixed the CDN build shipping two files that cannot load from it.
cdn/themes/light.styles.jsandcdn/themes/dark.styles.js— the Lit flavour of each theme — open withimport { css } from 'lit', a bare specifier, and they were the only two files incdn/that did not resolve entirely on their own, so loading either one from the CDN has always failed. They now ship indist/themes/only, which is where the@azaleahealth/azalea-kit-ui/themes/*.styles.jsexport already pointed and where a bundler can resolvelit— if that is how you import them, nothing changes. The removal matters to a host that compiles the whole vendoredcdn/tree ahead of time rather than loading it in the browser: there the bare import becomes a hard dependency on a module namedlitthat never exists, and the loader reports the two as unresolvable. Linking the theme as plain CSS —themes/light.css, the documented path — is unaffected - Release Date 9/1/2026
3.1.0
-
Added
resetValidity()to every form control —<ahi-input>,<ahi-textarea>,<ahi-select>,<ahi-combobox>,<ahi-checkbox>,<ahi-toggle>,<ahi-radio-group>,<ahi-range>,<ahi-input-mask>,<ahi-ssn-input>,<ahi-number-input>,<ahi-memorable-date>and<ahi-color-picker>. It hides a revealed error again, returning the control to its pristine state so it stops matching:user-invaliduntil the user next interacts with it. Until now the only way out of that state wasform.reset(), so a field the application repopulated itself — loading a draft, switching the record being edited, clearing a filter row — kept showing an error about a value nobody had typed. The value and the validity are unchanged: an empty required control is still invalid and still blocks submission; this only controls whether that is shown. Clearing it on a programmatic value assignment is deliberately NOT automatic — Chromium and WebKit drop:user-invalidthere while Firefox keeps it, so there is no consistent behavior to inherit -
Fixed
<ahi-tab-group>reserving sticky space when it is not sticky. A tab group that never setstickystill offset every sticky descendant inside it by the height of its tab strip — a gap under a bar that does not stick — and a group withplacement="start"or"end"contributed a vertical offset for a strip that sits beside the content rather than above it. Both now contribute nothing, which is what they always should have. If you were relying on that offset without settingsticky, set it. Sticky top and bottom groups are unchanged -
Updated
<ahi-nav-toggle>to take its breakpoint inemrather thanpx, matching every other breakpoint in AKU. Its collapse affordance now appears at the same effective width as the rest of the library for a reader who has changed their browser’s font size -
Added
tsc --noEmittonpm run verify, as its first step, and fixed the two type errors it immediately found. Nothing inverifyor the pipeline had ever run the typechecker — the build is esbuild, which strips types rather than checking them — sosrc/styles/host-independence.test.tshad been narrowing the public barrel’s exports toCustomElementConstructorsince the file landed, a type that is not a member of the union it was narrowing. Contributor-facing only: no component, token, or published API behavior changes, and nothing here affects an installed package. Contributors getnpm run typecheckas a standalone script -
Added
npm run spellchecktonpm run verify, so spelling is enforced in CI rather than only suggested by the commit hook. Nothing automated had ever run cspell in bulk, which left three ways past it:git commit --no-verify,npm run release(which skips hooks deliberately), and any file changed by a merge rather than a commit. The bulk run found six issues over 633 files — five British spellings and one coinage, all in code comments — and all six were corrected rather than added to the project dictionary, since widening a dictionary to absorb a backlog is how a spellchecker stops catching real typos. Contributor-facing only: nothing indist/orcdn/differs -
Fixed
<ahi-radio>switching to its narrow-screen layout 0.16px away from every other component. Its breakpoint read30.635emwhere<ahi-card>,<ahi-card-section>and<ahi-table>all use30.625em(490px) — a typo, not a distinct breakpoint. Radio now stacks in step with the components around it -
Updated
<ahi-empty-state>to reduce its padding at the same 490px breakpoint the rest of AKU uses, rather than a one-off 500px. An empty state between 490px and 500px wide now keeps its roomier padding instead of switching to the compact spacing 10px early -
Fixed the options inside
<ahi-select>and<ahi-combobox>being below the minimum touch-target size on phones, tablets and kiosks. 2.8.0 gave--ahi-field-min-heighta44pxfloor under@media (pointer: coarse), so the field a user taps to open the list is a compliant target — but the options it opens were left at content height, which is the same defect one layer down: the control you tap to open a select met the minimum and every control you tap to choose did not.--ahi-option-min-heightwas never declared by the theme at all —<ahi-option>and<ahi-combobox-option>read it with anautofallback — so, exactly as with fields, there was nothing at:rootfor a coarse-pointer rule to raise. The token is now declared by the theme and becomes44pxunder@media (pointer: coarse). Open dropdowns will be taller on touch: a list that currently fits on one screen may now scroll, and a<ahi-select>inside<ahi-memorable-date>inherits the change too. Nothing changes for a mouse — the default is stillauto, and a consumer that sets--ahi-option-min-heightitself still wins on proximity. Unlike--ahi-field-min-height, the floor is not multiplied by--ahi-font-scale: an option row already grows with its own text, so this is a fingertip measurement rather than a text container, and follows--ahi-target-min-sizeinstead -
Fixed
<ahi-memorable-date>clipping the day and year a patient had typed on narrow screens. The two fields were allowed to shrink below their own width, so a date of birth of01 / 2000read back as0and200on a phone — and in a container narrower than the row, the component overflowed sideways instead of laying out inside it. Day and year now hold their full width at every viewport and at all three density tiers, the month field takes the shrink instead, and the row fits its container down to 288px. -
Fixed
<ahi-tab-group>offsetting sticky content inside it by a hard-coded 46px. The offset now follows the tab strip’s real height, so it stays correct under a density tier, a scaled--ahi-font-scale, a re-tuned spacing scale, a coarse-pointer target size, a custom--track-width, or a tab taller than its own text. Tab groups that do not setstickyare unchanged, as are pages that render without a theme loaded. -
Fixed form controls turning red after a plain
form.checkValidity(). Every control built on the form plumbing —<ahi-input>,<ahi-textarea>,<ahi-select>,<ahi-combobox>,<ahi-checkbox>,<ahi-toggle>,<ahi-radio-group>,<ahi-range>,<ahi-input-mask>,<ahi-ssn-input>,<ahi-number-input>,<ahi-memorable-date>and<ahi-color-picker>— treated theinvalidevent as proof the user had touched it. The browser fires that event for the silentform.checkValidity()too, so asking a form whether it was valid put every empty required control into:state(user-invalid), showing the error border and the inline “Please fill out this field” message on a form nobody had typed in. It also undid aform.reset()the moment validity was re-checked. Silent checks are now silent, as they are on a native control; a blocked submit attempt andreportValidity()still reveal errors exactly as before. - Release Date 8/31/2026
3.0.0
-
🚨 BREAKING: type is no longer decided by viewport width. Eight width-driven declarations across six files are gone; each element takes a type role at every screen size. Sizes that differed above and below 768px now do not:
Below 768px Above 768px Now <ahi-checkbox>label15px 14px 14 / 20 <ahi-button>small, medium15px 14px 14 / 20 <ahi-button>large17px 16px 16 / 24 <ahi-menu-label>13px 12px 12 / 16 <ahi-dialog>title16 / 20 20 / 24 20 / 28 <ahi-card>title14px 16px 16 / 24 The checkbox row is the defect that started this work: its label was 15px on a phone and 14px on a desktop, while
<ahi-radio>was 14px everywhere. Both read thelabelrole now, and a test asserts they match. -
🚨 Fixed form fields inviting iOS Safari to zoom on tablets and kiosks.
--ahi-form-control-font-sizewas 16px with amin-width: 48emquery dropping it to 14px — but Safari’s focus-zoom is a property of the pointer, not the screen. An iPad in landscape, and every touchscreen kiosk, matched the desktop query, got 14px, and zoomed on every field focus. It is keyed onpointer: coarsenow: 14px by default, 16px on any touch device at any width. A phone or tablet keeps 16px fields; a mouse-driven desktop keeps 14px, as before -
🚨 BREAKING: the type scale is eight steps — 12, 14, 16, 18, 20, 24, 30, 36. There were fifteen, eight of them a single pixel from their neighbor, which is how the checkbox and radio labels came to disagree. The seven retired steps still resolve, so nothing breaks on upgrade, but they are deprecated and will be removed in 4.0.0:
--ahi-font-size-275→ 12px,-325→ 14px,-375→ 14px,-425→ 16px,-550→ 24px,-800→ 30px,-1000→ 36px. Each folds to the size a type role already sits on, not the arithmetic nearest — four of the seven sit exactly between two survivors -
Text inside
<ahi-care-summary>,<ahi-care-timeline>,<ahi-badge>and<ahi-text>moves with the trim: 11px becomes 12px and 13px becomes 14px. Clinical density is otherwise unchanged -
🚨 BREAKING: the font-weight scale is 400 / 500 / 600 / 700, from 450 / 550 / 650 / 700. On Windows this is a visible correction, not a tweak: CSS font matching walks available faces upward for any request above 500, so against Segoe UI the old 550 landed on Semibold and 650 landed on Bold.
--ahi-font-weight-semiboldand--ahi-font-weight-boldpainted the same weight, so 35 usages across<ahi-collapsible>,<ahi-dialog>,<ahi-empty-state>,<ahi-menu-label>,<ahi-nav-item>,<ahi-care-summary>,<ahi-care-timeline>and<ahi-fhir-questionnaire>rendered as bold, and 22 medium usages rendered as semibold. On macOS the stack resolves to SF Pro, which is variable, so all four values rendered distinctly and nothing looked wrong — the values were correct on the machine they were chosen on. Text is very slightly lighter on macOS as a result; on Windows the semibold tier exists again -
Added a
custom-elements.jsonguard tonpm run verify. It asserts every component still has a@summary, a validahi-*tag name, and@dependencytags naming components that exist. A doc block that comes adrift from its class — a stray variable between the two is enough — silently empties a component’s entry in the manifest that drives the VS Code and Vue integrations, with no error anywhere -
Added eight semantic type roles —
display,heading,subheading,body,body-emphasis,label,captionandcode— each published as a size and line-height pair (--ahi-type-<role>-font-sizeand--ahi-type-<role>-line-height). Reach for a role instead of picking a step from the numeric scale and a line height separately: that pairing is what the roles exist to make automatic. Choosing the two independently is how the library ended up with 14 distinct size/line-height combinations, 14px set against four different line heights, and 15px set inside a 16px line box — which is why<ahi-empty-state>clipped its own descenders. The--ahi-font-size-*and--ahi-line-height-*tokens are unchanged and still work -
Added type-role support to the density tiers.
ahi-density-comfortableandahi-density-spaciousnow re-point all eight roles, not just the four form-control tokens they covered before, so a tier moves every piece of text inside it. A tier can be applied to the document, to any wrapper around an AKU region, or — where you own nothing else — as role tokens set directly on a component. Compact remains the default and applying no class still changes nothing -
Added type utility classes for the eight roles —
ahi-text-display,-heading,-subheading,-body,-body-emphasis,-label,-caption,-code— plus modifiers for color (ahi-text-subdued,-critical,-warning,-success,-inherit), weight (ahi-text-regular,-medium,-semibold,-bold), alignment, transform, wrapping (ahi-text-truncate,-nowrap,-break-word,-clamp-2,-clamp-3), tabular figures and line-through. They read the same role tokens components read, so a density tier moves your markup and AKU’s internals together. See the utilities page, which also carries an<ahi-text>attribute-to-class migration table -
🚨 These utilities ship inside every theme, not in the opt-in
utility.css— loadinglight.cssordark.cssis enough. If your app embeds AKU components and a theme but has never linked the utility stylesheet, you can still migrate off<ahi-text>without adding one -
Moved
ahi-text-truncate,ahi-text-nowrap,ahi-visually-hiddenandahi-visually-hidden-labelfromutility.cssinto the theme, for the same reason. Nothing to change: every consumer ofutility.cssalready loads a theme, and the classes behave identically -
Updated
utility.cssso its type and accessibility classes no longer duplicate the theme’s. The file is smaller; no class was removed from what a consumer gets -
🚨 DEPRECATED:
<ahi-text>. Every one of its properties is plain CSS, so each instance cost a custom-element definition, a shadow root and a style recalculation to do what the platform does for free. Use the type utility classes instead — they ship inside every theme, so no extra stylesheet is needed, and there is an attribute-to-class table at Migrating from<ahi-text>. It still works and is not removed; removal will be considered at 4.0.0. It warns once per page, not once per element -
🚨 DEPRECATED:
<ahi-stack>. A pure slot passthrough with no behavior. Use.ahi-split.ahi-split-columnfor a vertical stack, or.ahi-splitwith.ahi-justify-content-startfor a horizontal one, plus.ahi-gap-*and the alignment classes. Unlike the<ahi-text>replacements these live in the opt-inutility.css, so a page that loads only a theme needs to add that stylesheet or write the three flex declarations itself -
Text inside eight components changes size.
<ahi-card>’s title keeps its size (16px, or 14px below 768px) and gains 4px of line height, 20px → 24px.<ahi-user-menu>’s name, title and email go 13px → 14px; its tenant and timestamp lines are unchanged.<ahi-banner>,<ahi-card-section>,<ahi-nav-group>,<ahi-nav-toggle>,<ahi-calendar>and<ahi-color-picker>render at exactly the sizes and weights they did before. -
Fixed
<ahi-user-menu>’s job-title line rendering at the medium weight instead of regular. It sits inside the trigger button, which sets medium, and the old<ahi-text>wrapper was masking that with its own reset -
Removed the
ahi-textdependency<ahi-checkbox>declared in its metadata. It renders no<ahi-text>and never has, socustom-elements.json— and the VS Code and Vue integrations that read it — had been reporting a dependency that did not exist -
Fixed
<ahi-top-bar>forcing the size of any text slotted into it. It setfont-size,line-height,font-weightandfont-styleon slottedh1–h6,p,emandspanwith!important, so an application title rendered at 14px no matter what the app asked for. Type now belongs to the consumer. The text color is still forced to the on-accent value — the component owns its background, so it owns the contrast, and a strayp { color: … }rule would otherwise make the bar unreadable. If you slot plain markup into a top bar, its text will now take your own styles; anything slotted as an<ahi-text>or another custom element never matched the rule and is unaffected -
Fixed the
<ahi-top-bar>documentation example never showing its logo. It was slotted asslot="logo", which the component stopped supporting in 2.0.0, so the image was silently dropped. The example also passed alogo-urlattribute the component has never had -
Added
.ahi-rowand.ahi-column, the neutral flex primitives<ahi-stack>maps onto —columnis its default,rowitsdirection="horizontal", both with the same default gap..ahi-splitcould not express a plain stack on its own because it forcesjustify-content: space-between -
🚨 BREAKING:
utility.cssis gone. Every utility class it held now ships insidelight.cssanddark.css, so there is one stylesheet instead of two. If you linkdist/themes/utility.cssor importdist/themes/utility.styles.js, remove it — the file no longer exists and the request will 404. No class was removed, renamed, or changed:ahi-cluster,ahi-grid,ahi-flank,ahi-frame,ahi-cloak,ahi-gap-*,ahi-align-items-*,ahi-justify-content-*,ahi-flex-wrap,ahi-split,ahi-body,ahi-headingandahi-captionall behave exactly as before, in the sameahi-utilitiescascade layer. A theme grows by under 2 KB -
The reason for the merge: the file was opt-in, but one by one its contents turned out to be load-bearing. The type utilities had to reach consumers who load only a theme, or deprecating
<ahi-text>would break them; then the accessibility helpers; then the flex set, for<ahi-stack>. What was left was not a coherent opt-in set — just the classes nothing had forced to move yet, with no answer to whyahi-rowshipped in the theme andahi-griddid not -
🚨 BREAKING: removed the
ahi-body,ahi-headingandahi-captionclasses. They were a first pass at type utilities and disagreed with the roles that replace them —ahi-bodypaired 14px with a 24px line height, one of the mismatched pairings this release exists to remove, andahi-headingrendered 24px where theheadingrole is 20px. Useahi-text-body,ahi-text-headingandahi-text-caption, which pair each size with its own leading. AKU never used them itself, and a search of chartaccess, myhealthspot, mypractice and api-developer-portal found no usage in any of them -
Fixed
npm run releasedeleting part of its own release notes. It promoted## Nextby keeping only the lines that begin with-, so any entry spanning more than one line lost everything after the first — this release’s six-row table of component size changes among them. The whole block is promoted verbatim now, and the script refuses to write a changelog that would lose a line -
Note for anyone adopting the type utilities: if your app styles
h1–h6globally, those rules override the utility classes. The utilities sit in theahi-utilitiescascade layer so your CSS can always win, which is deliberate — but it means an<h1 class="ahi-text-heading">takes yourfont-sizeand, since you probably do not also setline-height, the role’s line height, leaving a mismatched pair. Exclude opted-in elements withh1:not([class*='ahi-text-']). See the utilities page -
Release Date 8/31/2026
2.8.1
-
Fixed
<ahi-checkbox>drawing its check mark outside the box. 2.8.0 made the control a touch-sized label so the whole square could be pressed, but the check and indeterminate glyphs are positioned atwidth: 100%against that control — which used to be the 16px box. They stretched to the full target and drew across it, at every pointer type, not just on touch. The glyphs now anchor to the drawn box, and the box sits on the label’s first line rather than centred in the target -
Fixed
<ahi-radio>’s circle sitting above its label..radio__labelwas the<slot>element itself, so its 14px/20px only ever applied to content a consumer had wrapped in an element of their own — a bare text label, which is how it is normally written, became an anonymous flex item and inherited the host page’s type instead. The label is a real element now, so its own type applies whatever you slot, and the circle lines up with the first line at any label length - Release Date 8/30/2026
2.8.0
-
Fixed
<ahi-avatar>’s initials failing WCAG 2.1 AA contrast in the light theme. The initials inherited--ahi-icon-subduedfrom the avatar circle — a color chosen for the icon fallback glyph, which as text on--ahi-surface-neutralmeasured 2.75:1 against the 4.5:1 AA requires. They now use--ahi-text, the design system’s existing pairing for text on a neutral surface (the same one<ahi-tag>uses), which measures 12.8:1 in the light theme and 11.2:1 in the dark.--ahi-icon-subdueditself is unchanged, and the icon fallback still uses it — only the initials moved. Dark-theme initials are noticeably darker-on-lighter than before as a result -
Fixed
<ahi-layout>’s nav resize handle being an incomplete ARIA range widget. It is a focusablerole="separator", which requiresaria-valuenow,aria-valueminandaria-valuemax; all three were missing, so assistive tech announced a control that could be moved but never reported the width it moved to. The handle now exposes all three andaria-valuenowtracks both pointer drags and keyboard adjustment, and it has an accessible name (Resize navigation, localized). A nav width restored fromlocalStoragethat falls outside the 220–400px range — one written by an older build, say — is now pulled back into range on mount instead of restoring out of bounds -
Fixed form fields being below the minimum touch-target size on phones and tablets.
--ahi-field-min-heightwas never declared by the theme —<ahi-input>and<ahi-select>read it with a hard-coded36pxfallback — so there was nothing for a coarse-pointer rule to raise, and every consumer on a touch device inherited a 36px field, under the iOS 44pt / Android 48dp minimum, unless it remembered to set the token itself. 2.7.0 gave buttons a coarse-pointer floor via--ahi-target-min-size; fields were left behind. The token is now declared at:rootand becomes44pxunder@media (pointer: coarse), matching--ahi-target-min-size.<ahi-combobox>and<ahi-textarea>honour it too now — they had hard-coded the same36px— and<ahi-number-input>,<ahi-phone-input>,<ahi-ssn-input>,<ahi-zip-code-input>,<ahi-input-mask>,<ahi-memorable-date>and<ahi-color-picker>inherit the change through the<ahi-input>they compose. Touch layouts will get taller: a toolbar or filter row that currently fits N fields across on a tablet may reflow, and the same is true of thesize="small"buttons 2.7.0 already raised. Nothing changes for a mouse — the default is still 36px, and a consumer that sets--ahi-field-min-heightitself still wins on proximity -
Added
autocapitalize,autocomplete,autocorrect,spellcheck,inputmodeandenterkeyhintto<ahi-select>and<ahi-combobox>, matching<ahi-input>. Three of these were previously hard-coded onto the internal search field as literals with no property behind them, so a consumer could neither read nor change them, andautocorrectwas absent entirely — which is why iOS autocorrect could rewrite a typed identifier on blur and send the field searching for something the user never entered.autocorrectnow defaults tooffon both components, which is a behavior change: a typeahead matches the literal string against its options, so rewriting that string before matching is never what you want. Setautocorrect="on"if your field takes prose. The other five default to exactly what was hard-coded before, so nothing else moves -
Fixed
autocorrect="false"turning autocorrect on across<ahi-input>,<ahi-textarea>,<ahi-select>and<ahi-combobox>.autocorrectis a boolean IDL attribute whose content attribute is the string"on"/"off", and the HTML spec says any value other than"off"means on — so a framework that forces attributes throughsetAttributeand turns a boundfalseinto the string"false"was silently enabling the very thing the binding asked to disable. AKU now reads"false"and"0"as off alongside"off". This is a deliberate departure from the spec: the literal reading loses to a failure that is silent and wrong in the dangerous direction. Writingautocorrect="off"is still clearer, and other custom elements will not be as forgiving -
Added
--ahi-font-scale, a multiplier that lets an app pass an OS text-size preference — iOS Dynamic Type, Android’s accessibility text scaling — through to AKU’s text. Every one of the 15--ahi-font-size-*and 8--ahi-line-height-*tokens now resolves through it, as does--ahi-field-min-height, so a field keeps containing its own text as that text grows. The default is1and every token resolves to exactly the px value it had before, so nothing changes until you opt in. Set it on the root —document.documentElement.style.setProperty('--ahi-font-scale', factor), or a:root { }rule — not on a mid-tree ancestor: CSS substitutes avar()inside a custom property at the element where that property is declared, and these tokens are declared on:root, so a descendant inherits an already-resolved number. A consumer typically derives the factor by measuring a detached probe styledfont: -apple-system-bodyagainst the 17px default.--ahi-target-min-sizedeliberately does not scale — it is a fingertip minimum, and a reader who enlarged their text has the same size fingers — and spacing does not scale either, since that would move the layout rather than the type. Density tiers still compose: they re-point role tokens, which resolve through the scaled primitives -
Added a mobile mode to
<ahi-table>:stacked,sticky-column, and a scroll cue that needs no attribute. The table had one presentation at every width, andtd { white-space: nowrap }with nomin-widthguarantees a min-content width far wider than a phone — so a narrow table always scrolled sideways, the first column scrolled away with everything else, and the only hint that the remaining columns existed was the platform’s overlay scrollbar, which is invisible until you are already scrolling.stackedturns each row into a card, switched by a container query on the table’s own width rather than the viewport’s, so a table inside a narrow column stacks even on a wide screen. Each value is labelled with its column heading, which the component copies from your<thead>— your markup needs nothing but the attribute — and adata-labelyou set yourself is left alone, for spelling out an abbreviation or naming a column headed by an icon.sticky-columnpins the first column while the rest scrolls, and switches itself off while stacked, where each card is already its own row identifier. The scroll cue is pure CSS, draws nothing when the table fits, and fades out as you reach each end. All three are off by default and a table that opts into none of them renders exactly as before. Note this is the first use of container queries in AKU, and thatstackedmakes the table a query container — only when the attribute is present, sincecontainer-typecarries containment with it -
Fixed
<ahi-combobox>’serrorproperty showing nothing. It rendered your message into the error slot and stopped there — but that region is hidden until the control is in theuser-invalidstate, anderrornever put it there. So the text sat in the DOM, invisible, whilecheckValidity()returnedtrue: a property documented as “shows a validation error” neither showed anything nor was a validation error. Settingerrornow makes the control genuinely invalid — the message appears,:invalidmatches, and native form submission is blocked — and clearing it clears that validity. This is a behavior change for anyone already bindingerroron a combobox: the message will now actually appear, and the form will stop submitting while it is set -
Added the same
errorproperty to<ahi-input>,<ahi-select>and<ahi-textarea>, so validation state held in your app can be bound declaratively instead of wiring a template ref and a watcher tosetCustomValidity()for every field.setCustomValidity()still works and is unchanged;erroris a declarative wrapper over it. An error present in the initial markup applies on first render, without waiting for the user to touch the field -
Documented the
errorslot on the seven components that render one —<ahi-checkbox>,<ahi-color-picker>,<ahi-combobox>,<ahi-input>,<ahi-memorable-date>,<ahi-select>and<ahi-textarea>. Every one of them has always had it and not one said so. Their docs also now note thatsetCustomValidity(),checkValidity()andreportValidity()are inherited from the form-control base class, which is why they do not appear in each component’s generated type definitions — they exist and they work, they were just invisible -
Fixed
<ahi-table stacked>producing cards with no labels when the<table>is wrapped in another element. The column headings the component copies onto each cell were found through a direct-child selector, so any wrapper — a scroll container, a framework fragment — meant no headings were found and every value rendered bare, which is the failure deriving labels exists to prevent. Ownership is now decided by which<ahi-table>a node belongs to, so a wrapped table works and a table nested inside a cell still keeps its headings to itself -
Fixed
<ahi-checkbox>needing several taps to toggle on a phone. 2.7.0 gave the row a 44px minimum on coarse pointers, but the input inside it stayed 16px pinned to the top, leaving 26px of dead space — so a tap aimed at the middle of the apparent target landed on the wrapper and did nothing. The control is now a label sized to--ahi-target-min-size, with the box centred in it, so a press anywhere in the square toggles. On touch the control column grows from 20px to 44px, which shifts the text label right; a mouse sees no change. Found on a real device, not by the test suite -
Fixed
<ahi-radio>sitting under the interactive target minimum on touch. 2.7.0 wiredahi-icon-button,ahi-tab,ahi-menu-item,ahi-tree-item,ahi-checkboxandahi-toggleto--ahi-target-min-sizeand missed radio, which measured 36px on a coarse pointer. The whole choice row was always clickable, so this was a size gap rather than a mis-tap, but it was under the floor. Radio rows get taller on touch, like fields and tags; nothing changes for a mouse -
Fixed
<ahi-radio>’s control sitting below its label whenever the label wraps. The row centred the circle against the whole label block, so it looked right on one line and drifted on two — 10px below the first line at two lines, 20px at three, which any label of moderate length hits at phone width. It aligns to the first line now, at any label length, matching<ahi-checkbox> -
Fixed
<ahi-care-summary>’s tag detail text failing WCAG 2.1 AA contrast in the light theme. The panel that opens under a selected tag paints--ahi-surface-neutral, and the detail line used--ahi-text-subduedon top of it — 4.17:1 at 12px, under the 4.5:1 AA requires. It now uses--ahi-text, matching the detail name directly above it; the two still read as distinct by weight. Found while auditing the same token pairing the avatar fix above corrects -
Fixed
<ahi-spinner>’ssizeattribute doing nothing.sizewas never a declared property — the host was hard-coded to 20px — so<ahi-spinner size="large">was accepted without complaint and rendered a 20px spinner anyway: no error, no console warning, no type error. Consumers had already written it, including a table loading overlay where a 20px spinner in a full-width scrim reads as a rendering glitch rather than a loading state.sizeis now a real reflected property acceptingsmall(16px),medium(20px) andlarge(32px), so that markup starts working with no change on the consumer’s side.mediumis the default and is still 20px, so every spinner written before this — including the one<ahi-button>shows while loading — is unchanged. An unrecognized value falls back to the default box instead of collapsing, and settingwidth/heightinline still wins over the attribute, so the sizing the docs previously described keeps working. There is deliberately no--sizecustom property: a spinner takes its size one way -
Fixed
<ahi-tag>’s remove button overflowing the tag it sits in on touch devices. 2.7.0 gave<ahi-icon-button>a coarse-pointer floor through--ahi-target-min-size, so the remove target itself has been a compliant 44px on touch since that release — but the tag around it never moved, because it was pinned to a fixedheightof 28.8px. The 44px button spilled 7.6px past the tag’s border above and below, and hovering it painted a background across that spill, onto the tag sitting next to it. The tag is amin-heightnow, so it grows to contain its own control. Removable tags get taller on touch: 28.8px to 44px, so a filter bar or chip list that currently fits N tags across on a tablet may reflow. Nothing changes for a mouse, and a tag with no remove button is unaffected at either pointer type — both stay at exactly 28.8px. A deadline-heightdeclaration on the tag went with it: it computed to 34px and was invisible only because the fixed height clamped the box, so leaving it in place would have grown every tag to 34px at every pointer type, desktop included -
Fixed
<ahi-tab-group>making the whole page scroll sideways whenever its tabs overflow. The two scroll buttons sit in a gutter the tab strip reserves with inline padding, and that gutter was a fixed 24px while the<ahi-icon-button>inside it draws at 36px — 44px since 2.7.0 gave interactive targets a coarse-pointer floor. The remainder spilled out of the tab group onto the page, and because a host page usually only setsoverflow-x: hiddenonbody,htmlwas left scrollable: every route with a scrollable tab strip could be dragged horizontally, by 10px on a touch device and 6px with a mouse. It looked like a bug in the consuming page, not in the tab group. The gutter is now derived from the same tokens the button is built from, so the space reserved always matches what is drawn at either pointer type and the two cannot drift apart if a token is retuned. Tabs lose 12px of horizontal room per side when scroll controls are showing, so a strip may begin scrolling one tab sooner than before — that space was already being consumed, just by overflowing instead of by being reserved. Consumers that masked this withoverflow-x: hiddenonhtmlcan drop the workaround -
Fixed
<ahi-empty-state>clipping the descenders of a heading that wraps, and added amediaslot for an illustration above the content. The heading was styled at--ahi-font-size-500(20px) inside a--ahi-line-height-400(16px) line box — a line box shorter than the text it holds — so the moment a heading ran to a second line its descenders were cut off by the line below. It now uses--ahi-line-height-600(24px), which is the pairing the type scale already had for this size:<ahi-text>’sheading-lgvariant sets exactly that against the same font size, so the empty state was simply out of step with it. Headings grow by 8px per line as a result, which will make a tall empty state a little taller. The newmediaslot renders above the default slot and is deliberately unconstrained — AKU sets the gap beneath it and leaves every dimension to you, so an<ahi-icon>, an inline<svg>, an<img>and a container an animation renders into are all equally valid, and there is no size cap to work around. It costs nothing when unused: the spacing comes from a::slottedrule, which matches only when something is actually assigned, so an empty state with no media keeps the layout it has always had -
Fixed
<ahi-header>cutting off content taller than its own height. The header sized itself with a fixedblock-size, which made--ahi-header-block-sizea cap rather than a floor: content taller than it was not contained, and because the header centres its children and clips nothing, the excess spilled equally above and below the box — and the half that spilled upward was painted over by<ahi-layout>’s fixed top bar and simply vanished. At a 390px viewport, a 56px header holding a heading that wrapped to two lines put its first line 5px above the header’s own top edge; three lines hid an entire line. The header now usesmin-block-size, so it keeps its nominal height whenever the content fits and grows to contain the content when it does not, andsize="s"does the same at its own height.<ahi-layout>follows: the sticky offset it hands descendants through--ahi-sticky-topwas a static token pinned to--layout-header-size— correct only while the header was a fixed height — and is now measured from the rendered header, but only for a layout that setsstickyand fills the header slot, so a layout that never opted into sticky positioning is untouched. Consumers that compute layout from--layout-header-sizeor--ahi-sticky-topas if the header were a fixed height need a sweep: a header can now be taller than the token says, so a hard-coded top offset, acalc()against either token, or ascroll-marginset by hand under a header will be short by however much that header grew. Headers whose content already fitted render exactly as before - Release Date 8/30/2026
2.7.1
-
Fixed seven icons rendering as blank space in myhealthspot:
chart-bubble,heading,heartbeat,list-numbers,lungs,scale-outlineandthermometer. 2.0.0 replaced<ahi-icon>’s CDN fetch with an allowlist generated by scanning consumer repos, and myhealthspot was commented out of the scanner’s repo list, so its icons were never collected — five of the seven are the vital-sign glyphs, so the portal’s Vitals section drew an empty space per vital. myhealthspot is now scanned by default alongside mypractice, azaleaehr and azalea-assistant, sonpm run icons:checkguards it in CI. The scanner also ignoresdist-*/now, so a consumer’s second build target (myhealthspot’sdist-kiosk/) no longer feeds minified chunks into the report -
Fixed
<ahi-select>and<ahi-combobox>throwing while rendering on any engine whose selector parser doesn’t implement:state(). Both read their invalid state withthis.matches(':state(user-invalid)')from insiderender(), so theSyntaxErrortook the component’s whole render down instead of degrading. 2.0.0’s graceful degradation only ever wrapped the state writes, not this read. Both now read throughElementInternals.states, guarded the same way, and fall back to the pristine rendering when the state can’t be determined. Most visible in consumers’ jsdom test suites — jsdom has noCustomStateSetat any version, so this was not something a consumer could fix by upgrading its test environment -
Fixed an
<ahi-card>’stitlestill being impossible to resize from outside at 768px and up. 2.7.0 routed it through--ahi-text-heading-md-font-size, but the card went on re-declaring that token on its own title element under a media query, and a declaration on the element beats anything inherited down to it — so the override worked below 768px and was silently ignored above it, which is every width a clinic kiosk runs at. The size now comes from a new--ahi-card-title-font-size, declared at:rootwhere a consumer’s ancestor wins on proximity. Defaults are unchanged: 14px, stepping to 16px from 48em up - Release Date 8/27/2026
2.7.0
-
Added the
ahi-density-comfortableandahi-density-spaciousutility classes. AKU is built at clinician density — expert users reading dense charts, where more per screen means fewer scrolls — which is the wrong trade for patients, who use it infrequently, skew older, and read on a phone or on a clinic kiosk at arm’s length. Applying a class to any light-DOM ancestor raises the form-control type and touch targets inside it. Custom properties inherit across the shadow boundary, so this needs no per-component API and no::part(), and it scopes to a subtree — a dense table inside a comfortable page can opt back out. The default is unchanged: applying no class changes nothing. Field text never drops below 16px on touch in any tier, because below that iOS Safari auto-zooms the page when a field is focused -
Fixed the responsive halves of
--ahi-form-control-font-sizeand--ahi-target-min-sizebeing impossible to override. They were declared on each component’s:host, and a:hostdeclaration beats an inherited value — so setting either token from outside the component did nothing. They are now declared at:root, where anything closer in the tree wins -
Added
--ahi-form-control-font-size, the size of the text a form control renders in its field. It is16pxon touch — below that iOS Safari auto-zooms the page when a field is focused — and14pxfrom 768px up, where density is worth more.ahi-input,ahi-textarea,ahi-selectandahi-comboboxread it. That breakpoint used to be duplicated inside each control; it is one declaration now -
Fixed
ahi-selectandahi-comboboxrendering their field text larger thanahi-inputandahi-textareaon desktop. They were 16px where the other controls dropped to 14px, so a select sitting beside an input in the same form did not match it. All four are now 14px from 768px up -
Added
--ahi-target-min-size, the minimum size of an interactive target. It defaults to24px, the WCAG 2.2 AA floor, and becomes44pxunder@media (pointer: coarse).ahi-button,ahi-icon-button,ahi-tab,ahi-menu-item,ahi-tree-item,ahi-checkboxandahi-togglenow honour it -
Fixed
ahi-textvariants being impossible to resize from outside the component. Each variant sizes itself on an element inside its own shadow root, which wins over anything inherited, so settingfont-sizeon<ahi-text>— or reaching it through a::part()— silently did nothing. This is why anahi-card’stitlecould not be made larger at all. Every variant now routes through its own token,--ahi-text-heading-md-font-sizeand friends, with the current size as the default. They are per-variant on purpose: a single shared token would inherit and flatten every piece of text inside a container to one size -
Fixed interactive targets being sized by how wide the screen is rather than what is pointing at it. AKU
had no
pointer: coarsehandling at all, so a touchscreen kiosk running at desktop width got desktop-sized targets. Touch targets are now keyed on the pointer. Nothing changes for a mouse - Release Date 8/27/2026
2.6.0
-
Added
--ahi-font-size-375(15px) and--ahi-font-size-425(17px). Both sizes were already in use but hardcoded, because the scale jumped 14px → 16px → 18px with nothing in between;ahi-buttonandahi-checkboxhad been writing the raw pixel values. Every font size in the library now comes from a token -
Fixed
ahi-care-summary’s safety tooltip using off-scale font sizes. Its header, list and detail text were hand-tuned to 10.5px, 11.5px and 12.5px; they now use the 11px, 12px and 13px steps, which is a half-pixel larger in each case -
Fixed components inheriting
font-weight,font-style,font-variant,word-spacing,text-indent,word-breakandtab-sizefrom the host page. These are inherited properties that cross the shadow boundary, so a page setting any of them on a wrapper reached inside every AKU component in it — a section set in italics rendered the internals of its components in italics too. All seven are now pinned on:host. A survey of all five consuming apps found no code relying on inheriting any of them, so no migration is needed.white-spacewas deliberately left inheriting, andtext-align,font-family,font-sizeandcolorstill inherit as before - Release Date 8/27/2026
2.5.0
-
Fixed the last of the component sizing that still depended on the host page’s root font-size. 2.4.2
anchored the
--ahi-space-*tokens, but 139remlengths remained inside individual component stylesheets and in the radius, border-width, shadow and form-control-label tokens — so on a host with a root font-size (the EHR uses10pt) those still rendered at 83%. Every length AKU controls is now px, and no component’s geometry depends on the host page. Values are unchanged at the default 16px root, so apps that do not set a root font-size see no difference -
Fixed
--ahi-form-control-label-font-sizerendering at the wrong size on hosts with a root font-size. It was the one font size in the type scale declared inremrather thanpx, so it shrank while every other size held; it is now15px -
Fixed components inheriting
letter-spacingandtext-transformfrom the host page. Both are inherited properties that cross the shadow boundary, so a host setting them on a wrapper reached inside every AKU component in it — a page withtext-transform: uppercaseon a section had the internals of the components in that section rendered in upper case. Both are now pinned on:host.text-align,font-family,font-sizeandcolordeliberately still inherit, because they are routinely set around a component with the intent that its content picks them up: centering an empty state, giving clinical data a monospace font, or tinting an icon throughcurrentColor. Components whose own chrome needed an alignment or a font now declare it themselves rather than taking it from the page -
Fixed
ahi-paginationtaking its font from the host page rather than the design system. Its:hostdeclaredfont-family: inherit, which re-opted it out of the shared component styles -
Fixed
ahi-tree-itemindentation scaling with the host page’s font size instead of the component’s. It was1em; it is now16px - Release Date 8/21/2026
2.4.2
-
Fixed component spacing shrinking on host pages that set a root font-size. Every
--ahi-space-*token wasremwhile every--ahi-font-size-*token waspx, so a host withhtml { font-size: 10pt }(the EHR) rendered all AKU padding, gaps and margins at 83% while the type stayed full size. Spacing is now anchored to a new--ahi-space-basetoken (default16px) and derived from it, so the scale no longer depends on the host page. Apps that were deliberately scaling AKU spacing by changing the root font-size should now override--ahi-space-baseinstead — the token values themselves are unchanged at the default 16px root -
Added
--ahi-space-base, the anchor every--ahi-space-*token is derived from. Set it once to scale the whole spacing scale up or down -
Fixed components inheriting their line height from the host page.
line-heightcrosses the shadow boundary, and because an absolute line height inherits as a fixed pixel value regardless of the child’s font size, the same markup rendered very differently against a host baseline of28pxversusnormal— most visibly inahi-care-timeline, where event detail rows collapsed to half height, and inahi-care-summary. Components now pinline-heighton:host; a host that wants a different rhythm can still set it on the element itself -
Fixed
ahi-care-timelinerendering its date rail, detail grid, filter panel and match-confidence popover ~17% narrow on hosts with a root font-size, for the sameremreason. Its internal lengths are now px - Release Date 8/21/2026
2.4.1
-
Fixed npm installs missing the
cdn/directory. 2.0.0 dropped it on the premise that no consumer imports from the package’scdn/path, but azaleaehr’s postinstall vendors exactly that path — the EHR serves the self-contained browser build natively through an import map, so the bare-specifierdist/build cannot replace it — and itsnpm cifailed with ENOENT onnode_modules/@azaleahealth/azalea-kit-ui/cdn. Installs now ship bothdist/andcdn/again -
Added
thumb-up,thumb-down, andtrash-filledto the bundled icon set. The assistant SDK draws them (the feedback thumbs and the chat-favorites delete control) viasetAttribute('name', ...), which the icon scanner cannot resolve, so 2.0.0’s curated allowlist missed them and they rendered as blank space with an unknown-icon warning.azalea-assistantandazaleaehrare now enabled in the scanner’s default repo list, sonpm run icons:checkscans both whenever local checkouts sit alongside this repo and skips them without one, as in CI - Release Date 8/20/2026
2.4.0
-
Added
upload,zoom-in,zoom-out,wifi,sparkles,report-medical,bandage, andlayout-sidebar-rightto the bundled icon set. 2.0.0 replaced the runtime unpkg fetch with a curated allowlist, and the allowlist was generated from AKU’s own source only — every consumer repo inscripts/scan-icon-usage.js’sDEFAULT_REPOSwas commented out — so eight icons that mypractice has always drawn were left out and rendered as blank space with an unknown-icon warning. Four were plainname="..."attributes the scanner would have caught had it been pointed at the app; the other four reach<ahi-icon>through a property or a ternary, which it reports as unresolved rather than resolving.mypracticeis now enabled inDEFAULT_REPOSsonpm run icons:checkscans it whenever a local checkout sits alongside this repo, and is skipped without one, as in CI - Release Date 8/20/2026
2.3.0
-
Fixed
<ahi-card>rendering itstitlewith an element that was never registered. The card draws the title with<ahi-text>but never declared it as a dependency, so a consumer who imported only@azaleahealth/azalea-kit-ui/dist/components/card/card.js— the documented way to import one component — got a card whose title had no heading semantics and none of the intended typography. It only ever looked right because something else on the page happened to import<ahi-text>first -
Fixed
<ahi-collapsible>drawing no chevron in its summary. The chevrons are<ahi-icon>elements and the component’s documentation listed the dependency, but nothing registered it, so on a page that imported the collapsible alone the expand and collapse affordance was simply missing -
Fixed
click(),focus()andblur()on<ahi-nav-toggle>throwing aTypeError. All three forward to the button the component renders, which they looked up by a class name that button never had. Becauseclick()andfocus()also override the methods every element inherits, any caller reaching for them — including code that just moves focus to the toggle — hit the error rather than the toggle -
Fixed
<ahi-fhir-quantity>throwing while rendering before it has been given aquantity. The component read the comparator straight off the property, so the first render of a quantity that arrives from a fetch — the ordinary case — failed and left the element permanently blank rather than filling in once the data landed. It now renders nothing until it has a quantity, matching<ahi-fhir-human-name> -
Fixed
<ahi-format-bytes>throwing aRangeErrorfor any negative value, which took the surrounding render down with it. Sizing the value picked its unit prefix fromlog10, which isNaNfor a negative number, so the component asked the browser to format a unit that does not exist. Negative values now format with the sign in place —-1500reads as-1.5 kB -
Fixed
<ahi-text>keeping the wrong host display whenvisually-hiddenis set after the first render. The element it renders depends on bothasandvisually-hidden, but onlyaswas watched, so togglingvisually-hiddenon an element that had already rendered switched the tag to an inline<span>while the host kept the block display the previous tag asked for -
Fixed
<ahi-nav-item>emittingahi-activatetwice for a single change ofactive, so anything counting activations — analytics, or a handler that navigates — saw two -
Fixed
type="unit"missing from the type<ahi-format-number>declares for itstypeproperty. Unit formatting has always worked and is documented, but TypeScript consumers could not assign it without a cast and it was absent from the custom elements manifest, so editors never offered it - Release Date 8/19/2026
2.2.0
-
🚨 Removed: each component’s stylesheet is no longer published as its own module —
@azaleahealth/azalea-kit-ui/components/button/button.styles.jsand its 71 counterparts are gone fromdist/andcdn/. They were never intended to ship: the build’s entry-point pattern excluded*.style.ts, singular, so it matched nothing and every stylesheet became a standalone bundle. They were undocumented and are internal implementation, but the paths did resolve, so this is called out rather than treated as housekeeping. If you imported one, read the component’s staticstylesinstead —AhiButton.styles. Every documented entry point is unchanged, and the output is 144 files and roughly 78 KB smaller. This ships in a minor rather than a major because the surface was never intended, documented, or referenced by any Azalea application — the paths existed only as a side effect of a typo in the build’s entry-point pattern -
Fixed
<ahi-combobox>ignoring itsvalueproperty when set from code. Assigningcombobox.value = 'x'— how a form is normally populated from fetched data, or reset — stored the value but never selected the matching option, so the control kept showing nothing while reporting a value it could not display. Itsvalueaccessor was missing the decorator that makes a property reactive, so the handler that reconciles value with selection never ran.<ahi-select>was unaffected -
Fixed
<ahi-select>keeping a reference to a highlighted option after that option had been removed from the DOM. Replacing the options while the control is alive — an async fetch swapping the list is the ordinary case — left the old reference in place, so pressing Enter could select an option that was no longer there -
Updated
<ahi-combobox-option>to honor--ahi-option-min-height, which until now sized<ahi-option>only — a consumer enforcing a larger touch target got taller options in<ahi-select>but not in<ahi-combobox> -
Updated
<ahi-combobox-option>to render its checkmark only while the option is selected, with a placeholder reserving the same column otherwise, instead of rendering a hidden<ahi-icon>on every row — one fewer custom element and SVG per option in a long list.::part(checked-icon)still addresses the column in both states, and the layout is unchanged -
Fixed
<ahi-combobox-option>rewriting spaces in itsvalueto underscores and logging an error. 2.0.0 stopped round-tripping<ahi-select>and<ahi-combobox>values through space-delimited strings, so an option value may contain any character, but the change reached<ahi-option>only. A<ahi-combobox-option value="north carolina">silently becamenorth_carolina, and because the combobox selects options by exact value match it could then never be selected from the combobox’s ownvalue -
Fixed
<ahi-option>ignoring thehiddenattribute. The component setdisplayon its own host, which outranks the browser’s built-in rule for[hidden], so<ahi-option hidden>stayed visible -
Fixed
<ahi-select>and<ahi-combobox>breaking the page’s keyboard if they were removed from the DOM while their listbox was open — a route change, a closing modal, or any conditional render that unmounts an open control. While open, both listen ondocumentand claim Enter, Space, the arrow keys, Home and End, and those listeners were never removed on disconnect, so they outlived the element and went on cancelling those keys everywhere: spaces stopped typing into other inputs and Enter stopped submitting forms, with no visible cause. The listeners are now dropped when the element leaves the DOM. The other overlays (<ahi-dropdown>,<ahi-popover>,<ahi-tooltip>) already cleaned up correctly and are unaffected -
Fixed every day button in
<ahi-calendar>announcing the wrong date to screen readers for users in a timezone ahead of UTC. The calendar builds its dates at local midnight but formatted the accessible label in UTC, so anywhere east of Greenwich the label was shifted a day behind what the button displayed — the cell showing 15 announced “March 14”. The visible number, selection, and emittedvaluewere always correct; only the announced label was wrong -
Fixed the month and year dropdowns in
<ahi-calendar>falling out of step with the month on screen in Firefox. Both<select>elements are transparent and sit under the styled month/year labels, so they are what opens when you click — but after paging back a month and forward again the calendar showed March while the dropdown still highlighted January. Their options set selectedness through an attribute, which a browser is not required to re-apply once a<select>has been interacted with - Release Date 8/19/2026
2.1.0
-
Fixed overlays blending into the page in the dark theme. Every shadow token is translucent black, which
separates a floating surface by darkening the page around it — on a dark page there is nothing left to
darken, and an overlay’s own surface is only about 1.2:1 against the background, so
<ahi-popover>,<ahi-dropdown>,<ahi-select>,<ahi-combobox>,<ahi-menu>,<ahi-calendar>and<ahi-dialog>all sat on the page with no visible edge. The dark theme now gives--ahi-shadow-popoverand--ahi-shadow-modala light hairline ring as their first layer and deepens the black layers behind it. The ring rides in the shadow rather than in a border, so it costs no layout and is absent from the light theme, where the original shadows already worked -
Fixed
<ahi-radio-group>overflowing any container narrower than its options. The group’s<fieldset>inherited the element’s defaultmin-inline-size: min-content, so it refused to shrink and pushed past its parent instead of letting the options compress -
Fixed the checked option in an
<ahi-radio-button>group being effectively invisible. The checked state shared a CSS selector with:hover, so a selected option was filled with--ahi-action-secondary-hoveredon an--ahi-action-secondarybutton — roughly 1.03:1, indistinguishable — and looked identical to whichever option the pointer merely happened to be over. Checked now has its own treatment: the selected surface, a--ahi-action-primaryborder carrying the state at 5.4:1 in the light theme and 3.8:1 in dark, and matching label color. Hover and active states on a checked option now follow the selected family too -
Added a from/to date range filter to
<ahi-care-timeline>.CareTimelineFiltersgains optionaldateFromanddateTo(ISOYYYY-MM-DD), reported throughahi-care-timeline-filter-change. Both bounds are inclusive and either works alone as an open-ended “on or after” / “on or before” range. A segmented control offers 30 days, 6 months, 12 months, All time and Custom: a preset resolves to a closed range ending today and captions the window it came out as, while Custom replaces that caption with From/To fields seeded from the preset that was selected. A backwards range is reported rather than silently emptying the timeline, and an active range is named in the printed document’s Filtered view band. Because filtering is client-side over the pages fetched so far, any filter applied while a long history is still streaming shows a note that more matching events may appear, and the “No events match” empty state is withheld until loading finishes -
Updated the
<ahi-care-timeline>filter bar so every criterion lives behind the one Filters control — the panel now leads with date range, followed by event type and source, and its badge counts all three. An active-filter chip row sits beneath the bar listing each filter as a removable<ahi-tag>alongside Clear all, and is hidden when nothing is filtering, so a closed panel never hides why the timeline is showing a shortened list. The panel is now an<ahi-popover>(it holds a form, not a menu) with its date presets as an<ahi-radio-group>, and is anchored to the trigger’s left edge so it no longer shifts sideways when the active-count badge appears or disappears. The Match confidence legend is an<ahi-popover>too, so both panels announce as dialogs and share one overlay behavior The panel has a close X in its header and puts Clear all at the bottom-left of its footer opposite Done; the Clear filters button that previously sat in the bar is now Clear all in the chip row -
Added optional
valueColor,valueSuffix,indicator,annotation, andannotationColorproperties to<ahi-care-timeline>detail fields, so an expanded event can flag an individual result — an out-of-range lab value, for example — instead of listing every row in identical plain text. The property names match<ahi-care-summary>’s group rows, so one adapter feeds both components. Colors pass through the same validation used elsewhere in the component, the flag is conveyed to screen readers rather than by color and glyph alone, and it is reproduced in printed output. Fields that omit the new properties render exactly as before -
Added
detail,detail-field,detail-label, anddetail-valueCSS parts to<ahi-care-timeline>, so the expanded detail panel and its rows can be styled from outside the shadow root -
Added an optional
negationflag toCareSummaryGroupandCareSummaryTagin<ahi-care-summary>, for entries that assert an absence rather than an actual item — “No Known Allergies”, “No Known Medications”. Anegation: trueentry contributes 0 to the card header count, so an Active Allergies card for a patient with no allergies now shows no count badge instead of1, and it is excluded from the safety/review badges and the printed alert band even whencriticalorwarningis also set. The entry still renders unchanged and still counts towardmax-groups/max-tagstruncation. The flag is additive and opt-in — set it from your data adapter; a group with emptyrowsand no flag still counts as one item, as before -
Fixed
reportValidity()not revealing inline error messages on<ahi-input>,<ahi-textarea>,<ahi-checkbox>,<ahi-toggle>,<ahi-select>,<ahi-combobox>,<ahi-range>,<ahi-number-input>,<ahi-input-mask>,<ahi-ssn-input>,<ahi-zip-code-input>,<ahi-phone-input>,<ahi-memorable-date>, and<ahi-color-picker>. Calling it showed only the browser’s transient validation bubble and left the control’suser-invalidstate unset, so the inline message stayed hidden — visible wherever validation is driven programmatically rather than by a native form submission (for example controls inside a shadow root, which never associate with a surrounding<form>).checkValidity()remains silent, as the standard requires -
Fixed
<ahi-fhir-questionnaire>rendering its instructional text, “Add another”/remove controls on repeating items, unsupported-item placeholder, and load-error messages with unstyled colors and sizes. Its stylesheet referenced token names that don’t exist in the Azalea theme (--ahi-color-neutral-*,--ahi-color-primary-600,--ahi-color-danger-*,--ahi-font-size-small,--ahi-font-size-x-small), so those declarations were silently dropped — most visibly the “Add another” button, which rendered as plain body text instead of a link -
Fixed the Azalea Health logo not appearing in the
<ahi-top-bar>documentation example when the docs are served under a path prefix (as they are on adev03 at/ui-docs/) — the demo referenced the image with a root-relative URL that assumed the site was mounted at the domain root - Release Date 8/18/2026
2.0.1
-
Fixed
<ahi-care-timeline>growing to the full height of its event list instead of filling its container and scrolling internally. Its layout rules matched the wrapper’s CSS part exactly ([part='base']), so they stopped applying in 2.0.0 when the wrapper began exposing the component-named part alongside it (part="base care-timeline"); the timeline rendered at its full content height and neither it nor the page could scroll -
Fixed the embedded live examples on the Care Timeline, Care Summary, and Layout documentation pages
failing to load with “Not Found” when the docs are served under a path prefix (as they are on adev03 at
/ui-docs/). The example<iframe>used a root-relative URL that assumed the site was mounted at the domain root - Release Date 8/15/2026
2.0.0
-
🚨 BREAKING: Renamed the required-indicator custom properties
--ahi-input-required-content,--ahi-input-required-content-offset, and--ahi-input-required-content-colorto--ahi-form-control-required-content,--ahi-form-control-required-content-offset, and--ahi-form-control-required-content-colorrespectively. If you override any of these, update the names; the values and defaults are otherwise identical -
🚨 BREAKING: form controls no longer set the
data-required/data-optional/data-valid/data-invalid/data-user-valid/data-user-invalidattributes. Style validation states with the:state()pseudo-class instead — e.g.ahi-input:state(user-invalid) {...}— as described in the Form Controls guide -
🚨 BREAKING:
<ahi-select>and<ahi-combobox>value handling no longer round-trips through space-delimited strings — option values may now contain spaces. Inmultiplemode, assigning a string to thevalueproperty is treated as a single value instead of being split on spaces (assign an array for several values), and in single mode assigning an array keeps the first entry instead of joining.<ahi-option>no longer rewrites values containing spaces to underscores. Thevalueattribute is unchanged and remains space-delimited -
🚨 BREAKING:
<ahi-dialog>is rebuilt on the native<dialog>element (showModal()). Focus trapping and background inertness are now handled by the browser — stronger than the previous JavaScript focus trap (the page behind the dialog is fully inert, not just tab-trapped) — and Escape is handled through the nativecancelevent. The publicmodalproperty (withactivateExternal()/deactivateExternal()) is removed; third-party overlays no longer conflict with the dialog’s focus handling, so the escape hatch is unnecessary. All parts, events (including cancelableahi-request-close), animations, and theopen/show()/hide()API are unchanged -
🚨 BREAKING: the
autocorrectproperty on<ahi-input>and<ahi-textarea>is now a boolean, matching the platform’sautocorrectIDL attribute (the standard now defines it on every element, and TypeScript’s DOM types enforce it). The attribute is unchanged — keep usingautocorrect="on"/autocorrect="off"in markup; only property reads/writes change from'on'/'off'strings totrue/false -
🚨 BREAKING: the
formproperty on form controls now follows the native form-control contract — reading it returns the associated<form>element (ornull) instead of the form id string, and thegetForm()method has been removed (read theformproperty instead). Assigning still takes a form id and reflects to theformattribute; assigning an empty string removes the attribute and restores association with the nearest containing form -
🚨 BREAKING: removed the unused design tokens
--ahi-border-base,--ahi-linear, and--ahi-ease-outfrom the light and dark themes. Nothing in AKU or any Azalea application references them; if you do, usevar(--ahi-border-width-1) solid var(--ahi-border)for the border shorthand and the CSS keywordslinear/ease-out(or your owncubic-bezier()values) for the easings -
🚨 BREAKING: removed the
AhiNavToggleEventtype and itsahi-nav-toggleentry in the global event map — the event was declared but has never been emitted by any component -
🚨 DEPRECATED: the
hoistattribute on<ahi-dropdown>,<ahi-select>,<ahi-combobox>,<ahi-tooltip>, and<ahi-color-picker>, and thestrategyproperty on<ahi-popup>, are deprecated and will be removed in a future major. Overlay panels now render in the browser’s native top layer, so they escape clipping and stacking containers on their own — these properties have no effect except as a fallback on browsers without Popover API support. Remove them from your markup; no replacement is needed -
🚨 DEPRECATED: the generic
baseCSS part is deprecated on every component that renders one, in favor of a part named after the component — e.g.ahi-button::part(button),ahi-card::part(card),ahi-dialog::part(dialog). Components still renderbasealongside the new part, so existing::part(base)selectors keep working, butbasewill be removed in a future major; migrate to the component-named part. Where the component’s name is already an inner part, the wrapper part takes a-wrappersuffix (ahi-input→input-wrapper,ahi-textarea→textarea-wrapper). Host-styled components whosebasesat on a slot (ahi-menu-label,ahi-tab-panel) expose no wrapper part — style the host element directly. Components that never rendered abasepart are unaffected; form controls such as<ahi-select>continue to expose their outer wrapper asform-control -
Added component-named CSS parts alongside every existing
basepart (see the deprecation note above) so each wrapper has a self-documenting, non-generic selector -
Added a
nameattribute to<ahi-collapsible>for exclusive-accordion behavior — collapsible elements that share anameclose each other when one opens, so only one in the group is open at a time -
Added
formattribute/property support to<ahi-input>,<ahi-textarea>,<ahi-checkbox>, and<ahi-toggle>, which previously lacked it — every form control can now be placed outside its form and associated by id, consistently -
Added
<ahi-popover>— a new overlay component for displaying rich, interactive content (links, buttons, form controls) in a floating panel anchored to a trigger. It renders in the native top layer (never clipped), supportsplacement/distance/skidding/without-arrow, closes on outside-click and Escape, moves focus into the panel on open and restores it on close, and closes when an element markeddata-popover="close"is activated -
Added
<ahi-number-input>— a form-associated field for entering a formatted numeric value (plain decimal, currency, or unit). It formats the displayed value (grouping separators, precision, currency/unit affixes) as the user types while keeping the formvalueandvalueAsNumberas the raw number, supportsmin/maxclamping andstepwith stepper buttons and Up/Down arrow keys, and mirrors<ahi-format-number>’s formatting options. Use it instead of<ahi-input type="number">when you need grouping, currency, units, or fixed decimal precision. Thepercentstyle is not yet supported -
Added
<ahi-checkbox-group>— a semantic wrapper that labels and lays out a set of related<ahi-checkbox>elements (fieldset withrole="group", label, help text, andvertical/horizontalorientation with a--gapcustom property). Each child checkbox keeps its ownname/valueand submits independently; the group’srequiredattribute adds a visual indicator only (enforce the requirement on the individual checkboxes) -
Added a form-control custom-property group so the shared form-control chrome (label, help text, error
message, required indicator) is themeable as a set:
--ahi-form-control-label-font-size,--ahi-form-control-label-spacing,--ahi-form-control-help-text-color,--ahi-form-control-error-color, and--ahi-form-control-required-content/--ahi-form-control-required-content-offset/--ahi-form-control-required-content-color(these three are the renamed--ahi-input-required-content*properties from the breaking change above, now applying to every form control rather than just<ahi-input>). Defaults are unchanged, so there is no visual difference out of the box -
Added a
boundaryattribute to<ahi-popup>(viewportby default, orscroll) — setboundary="scroll"soflip/shift/auto-size positioning responds to the anchor’s scroll container again while the panel is in the native top layer -
Added cancelable
ahi-showandahi-hideevents to<ahi-dropdown>— callevent.preventDefault()to veto opening or closing -
Added a documentation page for
<ahi-popup>, the low-level positioning utility that dropdown, tooltip, popover, select, and combobox are built on -
Added shorter import paths that omit the
dist/prefix —@azaleahealth/azalea-kit-ui/components/button/button.jsnow resolves the same as@azaleahealth/azalea-kit-ui/dist/components/button/button.js, for every subpath (components/,utilities/,themes/,translations/,fhir/). Prefer the shorter form in new code so imports aren’t tied to the package’s internal build layout; thedist/-prefixed paths keep working and are not deprecated, so existing imports need no changes -
Added documentation for the one-copy-per-page requirement (Azalea Kit UI 101) — custom element names are
global, so the first copy of AKU to load owns the
ahi-tags and a second copy is silently ignored. The guide covers the console warning to look for, and how two copies typically end up on a page - Updated the duplicate-registration console warning to explain what it means and how to fix it: it now states that the already-registered version keeps the tag (so components behave as that version regardless of what your code imports), names the likely causes, and links to the guide. The explanation is printed once rather than repeated for every affected tag
- Updated the documentation’s import examples to the shorter, prefix-free paths
-
Added a default
slot="nav"to<ahi-tab>, so tabs placed inside<ahi-tab-group>no longer needslot="nav"set by hand (markup that already sets it is unaffected) -
Added documentation for CSS parts that were rendered but undocumented —
form-control-erroron<ahi-input>,<ahi-select>, and<ahi-combobox>;spinneron<ahi-combobox>and<ahi-menu-item>; andtextarea-adjusteron<ahi-textarea>— corrected<ahi-checkbox>’s documented help-text part to its rendered nameform-control-help-text, and added a build check that keeps every rendered part documented -
Updated
<ahi-icon>to self-host its icons instead of fetching them from the unpkg CDN at runtime. The curated set of icons the design system actually uses is now bundled with the component, so icons render offline, under strict Content-Security-Policy, and without a network round-trip. There is no API change —<ahi-icon name="...">works as before. An icon name that isn’t in the bundled set now resolves to nothing (with a console warning) rather than attempting a CDN fetch; useAhiIcon.registerIcon()to add a custom icon at runtime -
Updated
<ahi-popup>(and every component built on it —<ahi-dropdown>,<ahi-select>,<ahi-combobox>,<ahi-tooltip>, submenus, and<ahi-color-picker>) to render its panel in the browser’s native top layer via the Popover API. Panels now escape ancestoroverflow,transform/filter, and z-index stacking contexts automatically, so they are no longer clipped when nested inside scrolling or transformed containers — without needing thehoist/fixedworkaround.<ahi-popup>’sstrategyproperty — and thehoistattribute on the components built on it (<ahi-dropdown>,<ahi-select>,<ahi-combobox>,<ahi-tooltip>,<ahi-color-picker>) — are honored only as a fallback on browsers without Popover API support and are now deprecated (see the deprecation note above) -
Updated
<ahi-banner>toasts to also render in the top layer, so toast notifications always appear above open dropdowns, selects, and tooltips -
Updated the development toolchain to current majors (TypeScript 6.0, esbuild 0.28, web-test-runner 1.0,
ESLint 10, Prettier 3.9, cspell 10 and friends); building or developing AKU now requires Node >= 22.13
(
enginesupdated — consuming apps are unaffected at runtime, though npm may print an engine warning when installing on older Node) -
Updated the npm package to ship only
dist/— the browser-readycdn/bundles are no longer included in installs, roughly halving the installed size. No consumer imports from the package’scdn/path (it exists for the docs site and the downloadable CDN tarball); if you need the browser-ready build, downloadazalea-kit-ui-cdn.tar.gzfrom the docs site -
Updated
<ahi-radio-group>validation to report throughElementInternalsinstead of a hidden text input — the browser’s validation message now anchors to the group itself (no more 10-second hidden-input workaround), and the required-and-empty message is a localized AKU string (“Please select an option.”, with a Spanish translation included), clearer for a radio group than the browser’s generic text-field message -
Updated all form controls to native
Form-Associated Custom Elements
built on
ElementInternals. Controls now appear inform.elements, submit through nativeFormDataand participate in native constraint validation (includingform.reportValidity()andform.checkValidity(), which are no longer monkey-patched), and honor theformattribute natively —<ahi-button form>now reflects and associates natively as well. Submitted values always pass anullstate to the browser, so values (including PHI such as SSNs) are never restored by back/forward-cache or session restore -
Updated
<ahi-button>to size withmin-heightinstead of a fixedheight, so buttons no longer clip taller slotted content; single-line buttons render at the same height as before -
Updated every component to re-render when its own
langordirattribute changes (previously only a change to the document’s<html lang>was observed), so a localized component nested under an element with a differentlangformats correctly -
Updated
<ahi-option>to render its checkmark only for the selected option, reducing per-row rendering cost in long lists -
Updated
<ahi-dropdown>and<ahi-menu>keyboard navigation to focus items without scrolling the page now that menus render in the top layer -
Fixed
<ahi-memorable-date>so arequiredcontrol blocks native form submission (and emitsahi-invalid) even when the user hasn’t interacted with it yet — previously the first submit of a pristine form went through despite the empty required date -
Fixed date parsing to apply the full Gregorian leap-year rule — February 29 of a century non-leap year
(e.g.
2100-02-29) is now rejected instead of silently rolling over to March 1, so<ahi-memorable-date>reports it as invalid and<ahi-calendar>ignores such avaluerather than selecting the wrong day -
Fixed the expand/collapse affordance on
<ahi-care-timeline>event rows rendering as a blank space — thecaret-up-downandfoldicons it uses were missing from the bundled icon set, so neither the collapsed nor the expanded state drew an icon (each also logged an unknown-icon warning) -
Fixed a bug that left an empty
<ahi-banner>toast-stack container attached to the document body after the last toast was dismissed -
Fixed a bug where form controls that support the
formattribute (<ahi-select>,<ahi-combobox>,<ahi-radio-group>,<ahi-range>,<ahi-memorable-date>,<ahi-number-input>,<ahi-color-picker>) always rendered a stray emptyform=""attribute on themselves. The attribute now only appears when a form id is actually set, and clearing the property removes it (an emptyform=""breaks native form association for form-associated custom elements) -
Fixed localized components (
<ahi-format-date>,<ahi-format-number>,<ahi-format-bytes>,<ahi-relative-time>,<ahi-calendar>,<ahi-memorable-date>, and validation messages) throwing and failing to render when the page language is an invalid tag — most notablylang="auto", which Chrome’s built-in page translation sets on<html>; an invalid tag now falls back to the default translation -
Fixed
<ahi-input>keeping and submitting an invalid programmaticvalue(fornumber/date/time/datetime-local) that the field itself renders as empty; thevalueis now reconciled with what the native control accepts -
Fixed
<ahi-number-input>submitting a value different from what it displays — out-of-range values are now clamped (e.g.min="0"withvalue="-5"submits0) and non-numeric values cleared, so the submitted value always matches the field -
Fixed Enter-key submission in
<ahi-input>and<ahi-number-input>to follow native implicit-submission rules: a button-less multi-field form is no longer submitted, and the form’s real default submit button (itsname/value/formaction) is honored -
Fixed
<ahi-input>rendering the literal text “null” or “undefined” when itsvaluewas set tonull/undefined - Fixed invisible date/time placeholder text in
<ahi-input>on macOS Safari -
Fixed the caret and current line being hidden under the control’s padding when a fixed-
rows<ahi-textarea>scrolls -
Fixed
<ahi-number-input>steppers stealing focus while editing (which fired strayahi-blur/ahi-changeand stopped arrow-key stepping), and popping the virtual keyboard when a stepper is tapped on a touch device -
Fixed
<ahi-select>and<ahi-combobox>emitting spuriousahi-hide/ahi-after-hide, or running the close animation twice, when the control is disabled -
Fixed
<ahi-select>and<ahi-combobox>scrolling the whole page during keyboard navigation and type-ahead; the current option is now scrolled into view within the list instead (in<ahi-combobox>, filtered matches now scroll into view so Enter selects a visible option) -
Fixed
<ahi-select>and<ahi-combobox>not exposingaria-invalid/requiredon their inner input, so an invalid required control is now announced by assistive technology -
Fixed
<ahi-dropdown>failing to setaria-haspopup/aria-expandedon a trigger that had upgraded but not yet rendered; it now retries once the trigger is ready -
Fixed
<ahi-menu-item>exposingaria-haspopup/aria-expandedon an internal element with no role; they now sit on the host so submenu presence and state are announced -
Fixed
<ahi-menu>inheriting text alignment from a centered or right-aligned ancestor; it now defaults to start-aligned -
Fixed
<ahi-radio-group>being miscounted by Chrome’s accessibility tree (e.g. announced as “1 of 1”); the input wrapper is now markedrole="presentation" -
Fixed
<ahi-radio-group>placing keyboard focus on a disabled first radio when no radio is checked; Tab now lands on the first enabled radio -
Fixed
<ahi-icon-button>staying in its hover color after a mouse click until blur (the hover/focus color state now uses:focus-visible) -
Fixed a vertical
<ahi-divider>collapsing to zero height, and disappearing, in auto-height layouts such as toolbars -
Fixed
<ahi-spinner>shrinking or distorting when used as a flex item inside buttons and toolbars -
Fixed
<ahi-spinner>and<ahi-progress-bar>announcing a hardcoded English label to assistive technology; the default label is now localized (with a Spanish translation) -
Fixed
<ahi-progress-bar>and<ahi-skeleton>becoming invisible in Windows High Contrast / forced-colors mode -
Fixed
<ahi-toggle>not showing a keyboard focus ring when checked, and being indistinguishable between checked and unchecked in Windows High Contrast mode - Fixed a disabled
<ahi-checkbox>still showing a focus ring -
Fixed
<ahi-collapsible>leaving its content invisible whileopenstayed true when the header was toggled rapidly -
Fixed
<ahi-collapsible>toggling its panel when an interactive element (a link, button, input, or AKU form control) slotted into the label was clicked, instead of letting that element act -
Fixed
<ahi-collapsible>permanently clipping the focus rings and shadows of its content; clipping is now limited to the expand/collapse animation -
Fixed the
<ahi-tab-group>active-tab indicator disappearing at fractional browser zoom, and being thrown off by non-tab elements slotted into the tab nav -
Fixed
<ahi-dialog>closing entirely when the operating-system file picker of a slotted<input type="file">was dismissed -
Fixed
<ahi-dialog>not letting the keyboard scroll an overflowing body; the body is now focusable for scrolling, with a keyboard-only focus ring -
Fixed
<ahi-dialog>leaving the page permanently scroll-locked and inert when third-party CSS hid the open dialog; the modal is now suspended while hidden and resumed when it is shown again -
Fixed
<ahi-dialog>’s empty-label placeholder leaking a byte-order mark into copy/paste and assistive technology; it now uses a zero-width space -
Fixed
<ahi-popover>overflowing viewports narrower than its--max-width -
Fixed pressing Escape over an
<ahi-popover>or<ahi-tooltip>nested inside an open<ahi-dialog>also closing the dialog, on browsers without the CloseWatcher API -
Fixed
<ahi-tooltip>inheriting the trigger’s font (for example a heading’s size and weight) instead of using the tooltip typography tokens -
Fixed
<ahi-popup>leaking positioning observers when the element is removed before it finishes opening -
Fixed validation-state (
:state()) styling aborting on browsers that ship an outdated CustomStateSet API; it now degrades gracefully with a one-time console warning -
Fixed keyboard tab-order detection breaking for radio buttons whose
namecontains a quote or other CSS selector character (the radio group name is now escaped before it’s used in a selector) - Release Date 8/10/2026
1.19.0
-
Added a
preserveGroupOrderoption to<ahi-care-summary>groupedboxes — when set, the box renders its groups in the exact source order supplied and disables thecritical: truepriority treatment (critical groups are no longer hoisted to the top, and they are clipped bymax-groupslike any other group). Critical styling and the safety badges/print alert band are unaffected. Defaults tofalse, so existing behavior is unchanged - Release Date 7/16/2026
1.18.0
-
Added an optional utility-class stylesheet (
dist/themes/utility.css, or the Litutility.styles.js) — framework-agnostic, token-driven helpers for layout (ahi-cluster,ahi-grid,ahi-flank,ahi-split,ahi-frame), spacing (ahi-gap-*), flex alignment, typography, text truncation, and accessibility (ahi-visually-hidden,ahi-cloak). All classes live in theahi-utilitiescascade layer (so unlayered app CSS always wins) and reference--ahi-*tokens so they track the active theme. See the new Utilities guide under Getting Started -
Added a categorical / data-visualization color palette (
--ahi-color-data-1through--ahi-color-data-7) — seven distinct, accessible (≥3:1 on white) hues for non-semantic color-coding such as chart series,<ahi-care-timeline>event types, category tags, and avatars; ordered for adjacent-category distinction with green and red kept apart for red-green color-vision safety -
Updated
<ahi-care-summary>safety badges and safety tooltips to use the semantic critical/warning theme tokens instead of hardcoded colors, so they follow the palette and adapt to dark mode -
Updated the entire color system to be re-based on the Azalea brand: the primitive
--ahi-color-{blue,green,red}-*ramps are regenerated so each brand logo color is its-600step, neutrals (--ahi-color-gray-*) are retuned to a cool blue-gray, and every semantic theme token now resolves to a ramp step. Primary actions, links, focus, and informational surfaces are brand blue; success is brand green (status only); destructive is brand red; warning is a functional amber. All roles meet WCAG 2.1 AA (4.5:1 text, 3:1 UI). Token names are unchanged, so this is a values-only visual refresh — no code changes required to consume it. Added a Visual Tests page under Resources for reviewing the palette and components across states -
Rebuilt the dark theme (
dark.css) on the same brand role model as light: dark-mode interactive, primary-action, and focus colors are now brand blue (previously green), success/critical/warning/info resolve to the shared ramps as accessible light-on-dark steps, and colored surfaces are brand-hued tints of the dark surface. All dark-mode roles meet WCAG 2.1 AA (4.5:1 text, 3:1 UI) -
Fixed
<ahi-nav-item>active items showing no hover or press feedback — the accent background now darkens on hover/press so the state is distinguishable -
Fixed
<ahi-care-summary>omitting groups with no detail rows from a grouped card’s item count (e.g. an allergy documented without a coded reaction is now counted toward the card total) -
Fixed
<ahi-care-summary>performing a redundant extra render on initial load (and logging a Lit dev-mode update warning); the initial data fetch now starts within the first update cycle, so the loading skeleton appears on first paint - Release Date 7/15/2026
1.17.0
-
Added an
.ahi-invertclass that flips a subtree to the opposite color scheme (dark regions inside a light theme, or vice versa), including native form controls and scrollbars viacolor-scheme. The default (:root) theme scope is now zero-specificity, so.ahi-theme-darkand.ahi-invertwin regardless of stylesheet load order -
Updated
<ahi-ssn-input>to defaultautocompletetooffso Social Security Numbers are not autofilled or cached by default; set the attribute explicitly to opt in. See the Browser autofill & PHI guidance -
Fixed
<ahi-checkbox>not exposing its indeterminate state to assistive technology; indeterminate checkboxes now announce as “mixed” instead of “unchecked” -
Fixed keyboard focus escaping
<ahi-dropdown>when the dropdown is used inside another component’s shadow DOM — Tab now correctly closes the menu and returns focus to the trigger (affects menus nested in<ahi-user-menu>,<ahi-breadcrumb-item>,<ahi-layout>, and others) -
Fixed
<ahi-tree-item>leaving children visually hidden while marked expanded when toggled rapidly -
Fixed
<ahi-breadcrumb-item>rendering a button instead of a link whenhrefis an empty string (the current-page pattern) -
Fixed
<ahi-radio-group>failing to check the correct radio when itsvalueis bound as a non-string (e.g. a number) -
Fixed
<ahi-radio-group>clearing the announced error message when a custom validity message was set -
Fixed
<ahi-input>rendering unslotted child content inside the suffix due to a stray default slot -
Fixed
<ahi-input-mask>letter mask positions accepting non-letter characters ([ \ ] ^ _and backtick) in both JavaScript and native pattern validation -
Fixed a
<ahi-memorable-date>accessibility attribute (aria-errormessage) that referenced a non-existent element -
Fixed a stray
nameattribute on the<ahi-combobox>help-text element -
Fixed
<ahi-split-panel>emitting “ResizeObserver loop” console errors in Chromium during resize -
Fixed
<ahi-tab-group>clipping panel content and focus rings by removing an unnecessaryoverflowon the panel body -
Fixed
<ahi-format-date>and<ahi-relative-time>emitting stray whitespace around their rendered text -
Fixed the light theme missing the
--ahi-text-attentiontoken (previously defined only in the dark theme) - Release Date 7/12/2026
1.16.0
-
Added an expand-all / collapse-all control to
<ahi-care-timeline>— a toggle in the filter bar (left of the event count) flips the whole timeline between compact and detailed layouts in one action. It is a live mode: while streaming, events loaded after “Expand all” is activated render expanded automatically, and individually collapsing a single row overrides the mode for that row only. Bulk expansion is silent (it does not fire the per-cardahi-care-timeline-event-expandevent). The chosen mode is remembered per-device vialocalStorage; a new reflectedexpand-allattribute/expandAllproperty lets a host control it from a server-stored value (host value takes precedence overlocalStorage), and a newahi-care-timeline-expand-all-changeevent (detail.expanded: boolean, no PHI) fires on user toggles so the host can persist the preference server-side - Release Date 7/10/2026
1.15.0
-
Added an
errorsproperty to<ahi-care-timeline>and<ahi-care-summary>— pass an array ofCareErrorobjects ({ message, details? }, exported from both components’ type modules) to surface failures that occurred while fetching data outside the adapter. Each error renders as a row in a unified error region; entries withdetailsget a collapsed-by-default “Show details” disclosure that reveals the raw text (e.g. a stacktrace) in a scrollable monospace block. The region is exposed as a newerrorsCSS part. -
Added an accessible name to
<ahi-input>from a hostaria-label— the label is mirrored onto the inner<input>when no visiblelabelis set, so icon-only or externally-labelled inputs (like the timeline search box) are announced correctly by screen readers -
Updated
<ahi-care-timeline>and<ahi-care-summary>error states to be non-blocking — adapter failures are normalized into the sameCareErrormodel (capturing the stacktrace intodetailswhere available) and render in the unified error region alongside loaded content instead of replacing the entire component. In particular, a mid-scroll page failure in<ahi-care-timeline>no longer wipes already-loaded events.ahi-care-summary-erroremission andCareSummaryPendingErrorpolling behavior are unchanged. -
Updated
<ahi-care-timeline>filter pills and the “Clear filters” button to meet the WCAG 2.2 minimum target size (24px) -
Updated
<ahi-care-summary>expansion to actually reveal content — “Show all” and safety-badge expansion now lift the--summary-grid-max-heightcap (the cap applies only while the summary is clipped), so revealed items are no longer hidden inside an invisibly-scrolling grid; when the grid is capped it shows a persistent thin scrollbar and becomes a keyboard-focusable scroll region while (and only while) it can scroll -
Updated
<ahi-care-summary>tag overflow from ellipsis truncation to wrapping — a long medication label previously truncated with an ellipsis that hid its trailing dose strength; labels now wrap onto additional lines so the full entry is always readable -
Improved
<ahi-care-timeline>accessibility — filter and legend dropdown triggers are now single real buttons that receivearia-haspopup/aria-expanded, keyboard focus is recovered when the focused event card is virtualized out of the DOM, rows exposearia-setsize/aria-posinset, match-confidence badges have text labels, the streaming load status announces coarse milestones instead of every page, and icon-only toolbar triggers keep a 2.25rem tap target on narrow layouts -
Improved
<ahi-care-summary>accessibility — safety-badge tooltips are linked viaaria-describedby, dismiss on Escape, and stay open while hovered (WCAG 1.4.13); warning tags convey “incomplete entry” through visually-hidden text instead of an ignoredaria-label; card titles are exposed as headings via a newheading-levelattribute (default3) so screen-reader users can navigate between cards by heading -
Improved
<ahi-care-timeline>streaming performance — the sort worker now sends only the newly-visible events per page instead of re-sending the entire visible set (previously quadratic in page count), event comparisons are memoized, date formatters are hoisted, and rows render through keyed repeat so DOM nodes are reused across scroll renders -
Fixed
<ahi-care-timeline>rendering data from a previously-connected patient — swapping theadaptermid-stream could let late worker messages from the old patient’s stream land in the new patient’s timeline; all worker traffic is now stamped with a stream epoch and messages from a superseded stream are dropped -
Fixed
<ahi-care-timeline>and<ahi-care-summary>using adapter-supplied colors without validation — event, tag, and accent colors from the data adapter now pass a strict allow-gate before being interpolated into on-screen styles or print documents, blocking CSS-injection/XSS payloads (url(...),var(), gradients, structural characters); tag colors that cannot be parsed now fall back to black text instead of invisible white -
Fixed
<ahi-care-timeline>and<ahi-care-summary>print hardening —@pagemargin-box strings are CSS-escaped, non-string field values are coerced instead of aborting the whole print, and the print iframe is sandboxed (allow-same-origin allow-modals) with teardown that can no longer leak the iframe if the print dialog is dismissed unusually -
Fixed
<ahi-care-timeline>streaming and lifecycle robustness — a failed page fetch mid-scroll cleans up correctly, a crashed worker is rebuilt on next use, detaching and reattaching the element re-initializes streaming, events with a missing or non-stringid/start/type/titleare dropped instead of breaking the stream, date-only strings (YYYY-MM-DD) are parsed in local time instead of UTC (events no longer shift a day near midnight), and changing filters during a load no longer emits a prematureahi-care-timeline-load -
Fixed
<ahi-care-summary>lifecycle robustness — detaching and reattaching the element re-initializes polling, a synchronously-throwing adapter is caught into the error region, malformed box shapes from the adapter are dropped at ingestion instead of crashing the render,poll-intervalis clamped to a sane minimum, and reattaching an empty or errored summary no longer re-fetches and re-emits the load event -
Fixed
<ahi-care-summary>safety tooltips never opening in some layouts (the popover could be shown before its element was connected) and clipping at the left viewport edge (the tooltip now flips its anchor side to stay on screen) -
Fixed
<ahi-care-summary>key-value values being hard-clipped at the card edge — a long value in a narrow card now wraps instead of being cut mid-character; short values keep their right-aligned single-line layout - Release Date 7/6/2026
1.14.0
-
Added themeable minimum-height custom properties to the form controls —
<ahi-input>and<ahi-select>honor--ahi-field-min-height(default2.25rem) and<ahi-option>honors--ahi-option-min-height(defaultauto). Because CSS custom properties inherit through shadow boundaries, setting these on an ancestor also sizes the<ahi-select>/<ahi-input>nested inside<ahi-memorable-date>, so consumers can enforce a larger touch target (e.g. a 48px tablet/kiosk minimum) without reaching into component internals. The input’s vertical padding scales with the property so its text stays centered at any height. Defaults are unchanged, so existing consumers are unaffected. - Release Date 6/30/2026
1.13.0
-
Added localization to
<ahi-memorable-date>— the month dropdown, theMonth/Day/Yearplaceholders, the default help text, and the validation messages now follow the active language (from<html lang>or the element’slang). Month names are generated viaIntl; the other strings come from the new translation layer below. Previously these were always English. -
Added a translation layer to the localize utility —
registerTranslation/registerDefaultTranslationandLocalizeController.term(). English (dist/translations/en.js) is the bundled default; additional languages are opt-in imports. Spanish (dist/translations/es.js) ships as the first such translation —import '@azaleahealth/azalea-kit-ui/dist/translations/es.js'to enable it. - Release Date 6/30/2026
1.12.1
-
Fixed
<ahi-care-timeline>match-confidence badge icon — the High badge on event cards now uses theshield-checkicon to match the High entry in the match-confidence legend dropdown (it previously showedsquare-check) -
Fixed
<ahi-care-timeline>event card text not being selectable — the clickable card header is a<button>, whose contents are not selectable by default, so users could not highlight or right-click/copy the event title, description, or participant text; the header now setsuser-select: textwhile preserving click-to-expand - Release Date 6/17/2026
1.12.0
-
Added
<ahi-fhir-questionnaire>component — renders a dynamic form from a FHIR R4Questionnaireresource - Release Date 6/16/2026
1.11.6
-
Fixed
<ahi-care-summary>safety badges — the hover tooltip is no longer clipped on short cards (now uses fixed positioning), clicking a badge highlights all critical/warning items instead of only the first two, and a brief hover-intent delay keeps the tooltip from flashing when clicking the badge - Release Date 6/4/2026
1.11.5
-
Added clip-and-fade overflow to
<ahi-care-summary>cards — overflowing cards are faded at the bottom via a CSS::aftergradient; the fade clears when a card is expanded -
Added greedy bin-packing column layout to
<ahi-care-summary>— card heights are measured viaResizeObserverand distributed across columns to minimize the height difference between the tallest columns, replacing the previous round-robin assignment -
Added safety badges to
<ahi-care-summary>card headers — grouped boxes withcritical: truegroups show a red shield badge; tags boxes withwarning: truetags show an amber alert-triangle badge; each badge shows a hover/focus tooltip listing the flagged items and expands the card on click to highlight the relevant rows or tags -
Added total item count to
<ahi-care-summary>card headers — displayed as a muted count on the right side of each card title -
Added
--summary-grid-max-heightCSS custom property to<ahi-care-summary>— sets a maximum height on the card grid so only the grid scrolls internally while the unified footer remains fully visible below it; defaults tonone(no cap) -
Added
--summary-clip-heightCSS custom property to<ahi-care-summary>— controls themax-heightapplied to overflowing card bodies before they are clipped and faded; defaults to320px -
Redesigned
<ahi-care-summary>overflow model — per-card ”+N more” expand buttons replaced with a unified sticky footer; “Show all” expands all cards at once and “Collapse summary” resets all expansions; the footer remains visible after expansion so the user can always collapse -
Updated
<ahi-care-summary>printed card headers to show the total item count and critical/review safety badges matching the screen UI -
Removed ResizeObserver loop diagnostic suppression from
<ahi-care-timeline>— the window-level error listener that silenced"ResizeObserver loop completed with undelivered notifications"and"ResizeObserver loop limit exceeded"is no longer installed by the component. If your application surfaces these as visible dialogs or alerts, add the suppression in your own code. See the care-timeline documentation for the recommended snippet. - Release Date 5/22/2026
1.11.4
-
Added
print(context?)method to<ahi-care-timeline>— opens the browser print dialog with a formatted clinical document showing all currently visible (filtered) events; accepts an optionalCareTimelinePrintContextobject to populate a patient/encounter header with fields such aspatientName,dob,mrn,facility,attendingPhysician, andprintedBy; event type badges and tags render in color with a black-and-white outline fallback; cross-system match confidence badges include color-coded labels and symbols; a filtered-view notice is automatically included when type, source, or search filters are active -
Added “Clear filters” button to
<ahi-care-timeline>— appears in the filter bar whenever one or more type filters, source filters, or a search query is active; clicking it resets all three simultaneously -
⚠️ GLOBAL SIDE EFFECT:
<ahi-care-timeline>now suppresses benign ResizeObserver loop diagnostics at the window level. See the care-timeline documentation for details, when suppression affects your app, and how to opt out. -
Reduced
<ahi-care-timeline>ResizeObserver churn during window/panel resize — the scroll container’s ResizeObserver now defersvirtualizer.measure()to the next animation frame; calls that land while a collapsible card is mid-animation are dropped entirely, eliminating the burst of resize notifications produced by a height transition -
Improved
<ahi-care-timeline>initial row height estimates —estimateSizeis now data-aware: the base collapsed height is adjusted upward when an event has a description (+20 px), tags (+28 px), participants (+24 px), or asourcePatientblock (+32 px); this reduces scroll-position jitter on first render for events that carry those optional fields - Release Date 5/5/2026
1.11.3
-
Added
refresh()method to<ahi-care-timeline>— resets all state (events, filters, search, cursor) and re-fetches from the beginning using the current adapter; no-op when no adapter is set -
Added
refresh()method to<ahi-care-summary>— resets all state and re-polls using the current adapter; no-op when no adapter is set; the component resumes pending-state polling normally if the server returns HTTP 202 after the refresh -
Fixed
<ahi-care-timeline>throwing a “ResizeObserver loop completed with undelivered notifications” error on every scroll — wrapped each virtual item in Lit’skeyed()directive so DOM nodes are reused across renders rather than recreated; previously, every scroll-triggered re-render produced new nodes for all visible items, causing tanstack’s per-item ResizeObserver to callobserve()on each new node, which fires an immediate synchronous callback the browser cannot deliver within the current layout cycle -
Fixed
<ahi-care-summary>medication tags with long names being hard-clipped at the column edge — tags now truncate with an ellipsis (…) while keeping the warning/info indicator icon fully visible - Release Date 4/29/2026
1.11.2
-
Improved
<ahi-care-summary>print layout — standard and transfer documents now use CSS multi-column flow instead of a CSS Grid so boxes break naturally across pages; page headers/footers (patient name, MRN, DOB, room, printed-by, printed-at) are injected via@pagemargin boxes and suppressed on the first page where the full letterhead is already shown; the footer<div>has been removed in favor of the margin boxes; the alert band now renders allergies/safety items and incomplete-medication-warning items in separate labeled sub-sections divided by a dashed rule;critical-flagged allergy rows are further distinguished by severity (“life-threatening” vs. other) with distinct marker glyphs; the print header splits patient demographics onto two rows to reduce crowding; tag pills receive a thin outline so their pill shape survives black-and-white printing; key-value rows without avalueColorand without an indicator now receive a secondary (muted) text style; tag detail and warning-note lines no longer duplicate the tag label as bold text -
Fixed
<ahi-care-timeline>web worker failing to load when the package is consumed via Vite — the worker is now compiled to a self-contained IIFE and inlined as a Blob URL directly inside the component chunk instead of being shipped as a separate file; this removes the need foroptimizeDeps: { exclude: ['@azaleahealth/azalea-kit-ui'] }in Vite projects, and makes the component work correctly with Webpack, plain<script type="module">, and CDN usage without any consumer bundler configuration -
Fixed
<ahi-care-timeline>throwing a “ResizeObserver loop completed with undelivered notifications” error when scrolling on patients with large event counts — the scroll container’s ResizeObserver now only callsmeasure()when the container’s viewport dimensions actually change, preventing a feedback loop driven by sizer growth during streaming - Release Date 4/24/2026
1.11.1
-
Added
warningboolean field toCareSummaryTag— whentrue, renders an alert-triangle icon and a dashed border to signal missing safety-critical data (e.g. no dose or frequency); the border color is derived fromcolor(darkened 20%) when supplied, otherwise falls back tocurrentColor; tags withdetailrender an info-circle icon, or alert-triangle whenwarning: trueis also set; warning tags are always sorted before non-warning tags and are never hidden bymax-tagstruncation regardless of their position in the source data -
Added
print(context?)method to<ahi-care-summary>— opens the browser print dialog with a formatted clinical document; all content is always shown regardless ofmax-rows,max-tags, ormax-groupslimits; tags withdetailtext print their detail inline; empty boxes are suppressed -
Added standard print layout to
<ahi-care-summary>— two-column grid on letter paper with a severity-stratified alert band automatically injected above the grid when the data contains anycritical-flagged allergy groups orwarning: truemedication tags -
Added transfer/consultation print layout to
<ahi-care-summary>— enabled viatransferMode: trueon the print context; renders a single-column letterhead document with a “Reason for Consultation / Transfer” section (pre-filled or blank ruled lines for handwriting) and a four-field signature block -
Added
CareSummaryPrintContexttype with fields:patientName,dob,mrn,room,admissionDate,facility,attendingPhysician,printedBy,printedAt,footerNote,transferMode,consultReason -
Updated
<ahi-care-summary>box title style to be larger, bolder, and full-contrast for improved visual hierarchy -
Updated
<ahi-care-summary>key-value row alternating style from a background fill to a left border accent to avoid visual confusion withgroupedlayout section headers - Release Date 4/22/2026
1.11.0
-
🚨 BREAKING: replaced
grouped-listlayout in<ahi-care-summary>with a new'grouped'layout — updatelayout: 'grouped-list'tolayout: 'grouped' -
Added
groupedlayout to<ahi-care-summary>— renders rows organized into labeled groups with a tinted full-bleed header. Rows support value display (value,valueSuffix,indicator,valueColor) and annotation display (annotation,annotationColor) independently or together; suitable for allergies (substance → reactions with severity), lab results (panel → flagged values), and any other parent–child clinical data -
Added
max-groupsattribute to<ahi-care-summary>for truncatinggroupedboxes with a ”+N more” expand button. Groups markedcritical: trueare always visible regardless of truncation and render before non-critical groups — intended for safety-critical entries such as life-threatening allergies -
Added
patientIdentityproperty to<ahi-care-timeline>— when set to{ name, dob, mrn, ssnLast4?, sex? }, each field in an event’ssourcePatientis compared against the corresponding value and any mismatch is highlighted in yellow so clinicians can immediately spot discrepancies across federated records -
Added
ssnLast4field toCareTimelineEvent.sourcePatient— rendered as•••-••-XXXXon the card - Added
sexfield toCareTimelineEvent.sourcePatient -
Added
linkfield toCareTimelineEvent.sourcePatient— an optional{ label, href }rendered as a→link after the MRN; can point to a source chart, C-CDA document, external web application, or any other resource in the originating system -
Improved tag text color selection in
<ahi-care-timeline>and<ahi-care-summary>to use the APCA algorithm (WCAG 3 draft) instead of the WCAG 2.x relative luminance contrast ratio, producing more perceptually accurate black/white text choices on mid-tone backgrounds -
Updated
<ahi-care-timeline>source patient display to show calculated age in parentheses after DOB (e.g.03/14/1951 (75 yrs)) -
Updated
<ahi-care-timeline>source patient field order to: Name · DOB (age) · Sex · SSN · MRN · link - Release Date 4/16/2026
1.10.0
-
🚨 BREAKING: replaced
<ahi-care-timeline>typePalette: string[]withtypeColors: Record<string, string>— an explicit map of event type values to CSS color strings. Colors are no longer assigned dynamically by load order; each type always renders with its specified color regardless of when it first appears in the data stream -
🚨 BREAKING: renamed
max-fieldsattribute on<ahi-care-summary>tomax-rowsfor truncatingkey-valueboxes with a ”+N more” expand button -
Added
detailfield toCareSummaryTag— tags with a detail value render as interactive buttons with an info icon; tapping opens a detail panel below the tag list showing the supplemental text (e.g. SIG directions) -
Added empty state to
<ahi-care-summary>boxes — boxes with no data (emptyfields,tags, orgroupsarray) now display a “No data available” message instead of rendering a blank card -
Added colored dot indicators to
<ahi-care-timeline>type filter pills matching the event card type badge for at-a-glance type identification -
Updated
<ahi-care-timeline>selected type filter pills to show a checkmark and solid type-color border rather than overriding the background, preserving color consistency with the timeline connector dots -
Updated
<ahi-care-timeline>source filter pills to use the same neutral filled chip style as source tags on event cards -
Fixed
<ahi-care-timeline>event card title row layout on narrow screens — the facility name and timestamp now stack vertically when the card is too narrow to display them side-by-side, using a card-level container query - Release Date 4/15/2026
1.9.1
-
Updated
<ahi-care-timeline>to display event type as a text badge on each card, replacing color as the sole indicator of event type for improved accessibility -
Updated
<ahi-care-timeline>event type filter pills to use a color-tinted background matching the card badges for visual consistency -
Updated
<ahi-care-timeline>to display theenddate/time in the date column when present — same-day events show an end time only; multi-day events show the full end date and time - Fixed
<ahi-timeline>scroll jumping when expanding/collapsing event cards - Release Date 4/14/2026
1.9.0
-
Added
<ahi-care-summary>component for rendering a responsive grid of clinical summary boxes backed by a polling data adapter. Supportskey-valueandtagsbox layouts, configurable polling interval, skeleton loading state, and overflow truncation viamax-tagsandmax-fields -
Added
<ahi-care-timeline>component for rendering virtualized, streaming EHR patient event timelines with built-in filtering, sorting, and expandable detail panels -
<ahi-care-timeline>supports cursor-based incremental data loading via aCareTimelineDataAdapter, off-thread sorting and filtering via a Web Worker, and DOM virtualization for large datasets -
Web Worker files (
*-worker.ts) are now content-hashed in the build output for correct browser cache-busting - Release Date 4/10/2026
1.8.1
- Fixed extra inline padding in headers on small screens
-
Fixed icon SVG attributes (
width,height,class) being stripped incorrectly using regex, which causedstroke-widthto be mangled. Now usesDOMParserfor safe, precise attribute removal. - Release Date 3/31/2026
1.8.0
-
🚨 BREAKING: Health Icons (e.g.
syringe,blood-pressure,heart-organ) are no longer bundled. Icons are now sourced exclusively from Tabler Icons. Replace any health icon names with a Tabler equivalent or inline the SVG directly using thedefaultslot on<ahi-icon>. - Icons now load automatically from the Tabler CDN. No imports or registration required.
-
AhiIcon.registerIcon()andAhiIcon.registerIcons()are deprecated and will be removed in a future version. Existing calls can be safely removed. -
Significantly reduced install time by removing the icon build step from the
preparescript. - Release Date 3/18/2026
1.7.2
-
Added
<ahi-combobox>and<ahi-combobox-option>components for searchable dropdown selection with support for single/multi-select, async loading, and custom filtering -
Added documentation example for customizing icon position in
<ahi-collapsible>using CSS parts -
Fixed a bug in
<ahi-textarea>when usingresize="auto"that prevented the textarea from shrinking when content was removed - Release Date 1/28/2026
1.7.1
-
Added
iconproperty to<ahi-card-section>to display icons next to section titles -
Enhanced
<ahi-card>to allow full header customization via theheaderslot while maintaining backwards compatibility with thetitleproperty -
Changed
<ahi-tooltip>default trigger fromhover focustohoverto prevent tooltips from reappearing after interactive elements lose focus - Updated icon generation script to support both outline and filled variants from latest @tabler/icons version
- Updated many dependencies
- Fixed spacing token docs
- Release Date 8/20/2025
1.7.0
-
🚨 BREAKING:
<ahi-pagination>has been completely rewritten to focus on cursor-based pagination when total item counts are unknown - Added the
.focusfunction to<ahi-radio-group> -
Added the ability to set a custom snap function and use
repeat(n)to<ahi-split-panel> -
Improved performance of
<ahi-range>by skipping positioning logic when tooltip isn’t shown -
Improved accessibility of
<ahi-split-panel>by adding support for Enter to align with ARIA APG’s window splitter pattern - Improved performance of
<ahi-select>when using a large number of options -
Adjust
<ahi-banner>to create the toast stack when used only, making it usable in SSR environments. - Updated many dependencies
-
Fixed a bug in
<ahi-textarea>causing scroll jumping when usingresize="auto" -
Fixed a bug in
<ahi-textarea>that caused a console warning in Firefox when typing -
Fixed a bug in
<ahi-select>that caused multi-selects without placeholders to have the wrong padding -
Fixed a bug in
<ahi-select>that caused an exception in an edge case using Edge + autofill -
Fixed a bug in
<ahi-select>that caused the placeholder to display incorrectly when usingplaceholderandmultiple - Fixed a bug with with
<ahi-select>not respecting its initial value. -
Fixed a bug in
<ahi-select>when setting the value property before the element connected. - Fixed a bug in
<ahi-select>where it was using the wrong tag name. -
Fixed a bug in
<ahi-select>that prevented label changes in<ahi-option>from updating the controller - Fixed a bug with certain bundlers when using dynamic imports
- Fixed a bug in
<ahi-tab-group>when removed from the DOM too quickly. -
Fixed a bug in
<ahi-tab-group>that prevented changing tabs by settingactiveon<ahi-tab>elements -
Fixed a bug that prevented
<ahi-tab-group>to be activated properly when rendered in another<ahi-tab-group> - Fixed a bug in
<ahi-tooltip>that caused a memory leak in disconnected elements - Fixed a bug with radios in
<ahi-dialog>focus trapping. -
Fixed a bug that in
<ahi-dropdown>that prevented tab from working properly in some cases - Fixed accessibility issues for elements that are closed while having slotted focused children.
- Fixed the guard on popover to allow virtual elements
- Release Date 8/12/2025
1.6.1
- Fix icon build script failing
- Release Date 3/24/2025
1.6.0
-
Added the
countdownattribute to<ahi-banner>to show a visual indicator before the banner disappears - Added
<ahi-breadcrumb>and<ahi-breadcrumb-item>components - Added
<ahi-resize-observer>component - Added
<ahi-empty-state>component - Added
<ahi-pagination>component - Added
<ahi-tree>and<ahi-tree-item>components -
Scroll buttons for
<ahi-tab-group>auto hide when they are not clickable. Thefixed-scroll-controlsattribute can be included to prevent this behavior. -
Improved performance of
<ahi-popup>by waiting for the active state before spinning up the positioning library - Update
@floating-ui/domto 1.6.11 - Update
litto 3.2.0 - Update other dependencies
- Fixed a bug in
<ahi-button>that prevented link buttons from being disabled -
Fixed a bug that caused errors to show in the console when components disconnect before
firstUpdated()executes -
Fixed a bug in
<ahi-select>that caused the prefix icon to have incorrect spacing -
Fixed a bug in
<ahi-tab-group>that caused the active tab indicator to be the wrong size when the tab’s content changes -
Fixed a bug in
<ahi-select>that made the suffix slot collide with the clear button - Fixed a bug with morphing and DOM diffing that would cause elements with reflected initial attributes to not reset.
- Release Date 9/27/2024
1.5.2
-
Updated
<ahi-table>borders to use--ahi-dividerinstead of--ahi-border - Release Date 9/5/2024
1.5.1
- Fixed bug in
<ahi-calendar>not querying the month select correctly -
Fixed bugs in
<ahi-layout>and<ahi-calendar>where event handlers were being fired multiple times - Release Date 8/21/2024
1.5.0
-
🚨 BREAKING: replaced
<ahi-navigation>--backgroundand--header-dividerCSS properties with--ahi-color-navigation-surfaceand--ahi-navigation-header-dividerglobal tokens respectively -
🚨 BREAKING: replaced
<ahi-nav-group>--headingCSS property with the--ahi-color-navigation-heading-textglobal token -
🚨 BREAKING: replaced
<ahi-nav-item>--active,--text-on-active,--nav-hover,--badge, and--text-on-badgeCSS properties with--ahi-color-accent,--ahi-color-text-on-accent,--ahi-color-navigation-hover,--ahi-color-badge-notification, and--ahi-text-on-badge-notificationglobal tokens respectively -
🚨 BREAKING:
<ahi-top-bar>no longer embeds a menu toggle, has thebaseandlogoCSS parts, emits theahi-nav-toggletoggle event, or has alogoslot. Thesecondary-navslot has been renamed toendand the nav toggle is now it’s own component that can be customized through the<ahi-layout>nav-toggleslot. -
Added the
<ahi-layout>,<ahi-nav-toggle>,<ahi-header>, and<ahi-footer>components - Added the
<ahi-stack>component - Added the
<ahi-table>component - Added the
<ahi-calendar>component -
Added
paddingandstickyproperties to<ahi-tab-group>component -
Added
--ahi-z-index-sticky,--ahi-z-index-nav,--ahi-z-index-top-bartokens - Added a
labelproperty to the<ahi-spinner>component - Added a
suffixslot and corresponding part to<ahi-select> - Added the
base__popuppart to<ahi-dropdown> - Updated
<ahi-tab>closable property to reflect -
Updated
<ahi-tab-group>to a “roving tabindex” and<ahi-tab>is no longer tabbable by default. This aligns closer to the APG pattern for tabs. - Updated
customElements.defineto no longer register with anonymous classes by default - Updated
<ahi-avatar>to send an error event if image fails to load - Updated
<ahi-card>header to wrap when out of space - Update
@floating-ui/domto 1.6.8 - Update
@ctrl/tinycolorto 4.1.0 - Update
composed-offset-positionto 0.0.6 - Update
litto 3.1.4 - Update other dependencies
- Fixed a bug in
<ahi-tooltip>that allowed unwanted text properties to leak in - Fixed a bug in
<ahi-dialog>where it would create a layout shift when showed. -
Fixed a bug in
<ahi-split-panel>that caused it not to recalculate it’s position when going from beingdisplay: none;to its original display value. - Fixed a bug in
<ahi-button-group>classes -
Fixed a bug in
<ahi-textarea>that may throw errors ondisconnectedCallbackin test environments -
Fixed a bug in
<ahi-color-picker>that would log a non-passive event listener warning - Fixed a bug in the submenu controller that allowed submenus to go offscreen and not be scrollable
-
Fixed a bug in
<ahi-range>that caused the tooltip position to be incorrect in some cases -
Fixed a bug in
<ahi-radio-group>where if a click did not contain a<ahi-radio>it would show a console error. - Fixed a bug in
<ahi-banner>that caused it to appear above popups. -
Fixed the
AccountFHIR type definition by moving theAccountRelatedPersonEmployerExtensionfrom the root resource toAccount.guarantor -
Fixed a bug in
<ahi-details>that was accidentally detecting overflows and showing a scrollbar - Release Date 8/16/2024
1.4.0
-
🚨 BREAKING: renamed
--ahi-font-weight-normaltoken to--ahi-font-weight-regular -
🚨 BREAKING: renamed line height tokens to
--ahi-line-height-300,--ahi-line-height-400,--ahi-line-height-500,--ahi-line-height-600,--ahi-line-height-700,--ahi-line-height-800,--ahi-line-height-1000, and--ahi-line-height-1200, -
🚨 BREAKING: renamed font size tokens to
--ahi-font-size-275,--ahi-font-size-300,--ahi-font-size-325,--ahi-font-size-350,--ahi-font-size-400,--ahi-font-size-450,--ahi-font-size-500,--ahi-font-size-550,--ahi-font-size-600,--ahi-font-size-750,--ahi-font-size-800,--ahi-font-size-900, and--ahi-font-size-1000, -
Added letter spacing tokens
--ahi-letter-spacing-densest,--ahi-letter-spacing-denser,--ahi-letter-spacing-dense, and--ahi-letter-spacing-normal - Added the
<ahi-skeleton-thumbnail>component - Added the
<ahi-fhir-quantity>component - Added
placementattribute to<ahi-tab-group> - Added
paddingCSS property to<ahi-tab-panel> - Added additional documentation for
<ahi-tab-group> -
Added the
syncproperty to<ahi-dropdown>so the menu can easily sync sizes with the trigger element -
Added type definitions for
ScheduleEndTimeExtension,ScheduleInsuranceClassExtension,ScheduleInsuranceExtension,ScheduleIntervalTimeExtension, andScheduleStartTimeExtension - Added
DiagnosticReport._effectiveDateTimefor absenteffectiveDateTimes - Added type definition for
PatientGuarantorRelationshipExtension - Updated
<ahi-tab>to use interactive color rather than action primary - Update
@floating-ui/domto 1.6.3 - Update other dependencies
- Fixed an issue where
<ahi-button>s could be clicked whileloading - Fixed an issue with icons from HealthIcons not changing color correctly
-
Fixed a bug in
<ahi-select>that caused the menu to not close when rendered in a shadow root -
Fixed a bug in
<ahi-tab-group>that caused the scroll controls to toggle indefinitely when zoomed in Safari - Fixed a bug in the submenu controller that allowed two submenus to be open at the same time
- Fixed a bug in
.ahi-scroll-lockcausing layout shifts. -
Fixed a bug in
<ahi-input>that prevented the control from receiving focus when clicking over the clear button - Fixed a bug in
<ahi-button-group>that caused styles to stop working sometimes - Release Date 4/11/2024
1.3.4
- Fixed an issue where
<ahi-input-mask>s would cause an error on form reset
1.3.3
-
Added the
<ahi-skeleton-display-text>and<ahi-skeleton-body-text>components - Added
breakpointproperty to<ahi-top-bar> - 🚨 DEPRECATED:
<ahi-skeleton>component - Release Date 2/26/2024
1.3.2
- Added help text to
<ahi-toggle> - Added nutrition icons
- Refactored component styles to be consumed more efficiently
-
Fixed a bug in
<ahi-option>that caused HTML tags to be included ingetTextLabel() - Release Date 2/20/2024
1.3.1
- Update
litto 3.1.2 - Update
@tabler/iconsto 2.47.0 - Fixed
<ahi-menu-item>and<ahi-banner>not registering icons - Fixed
<ahi-nav-item>not reflecting properties - Release Date 2/8/2024
1.3.0
- Added the
<ahi-radio-buttoncomponent - Added the
<ahi-split-panel>component - Added the
<ahi-rangecomponent -
Added the
loadingattribute and thespinnerandspinner__basepart to<ahi-menu-item> -
Added the ability to call
form.checkValidity()and it will use AKU’s customcheckValidity()handler. - Added the
sizeattribute to the<ahi-radio>component. - Added the
PatientOccupationExtensiontype definition. -
Improved the accessibility of
<ahi-tooltip>so they persist when hovering over the tooltip and dismiss when pressing [[Esc]] -
Improved “close” behavior of multiple components in supportive browsers using the
CloseWatcherAPI - Update Tabler Icons to 2.46.0
- Update Lit to 3.1.1
- Update
@ctrl/tinycolorto 4.0.3 - Update
@floating-ui/domto 1.6.1 -
Fixed a bug where the
ahi-changeevent would always fire simultaneously with theahi-inputevent in<ahi-color-picker>. Theahi-changeevent now only fires when a user stops dragging a slider or stops dragging on the color canvas. -
Fixed a bug in form control components that used a
formproperty, but not an attribute. - Fixed a bug where nested dialogs were not properly trapping focus.
-
Fixed a bug in
<ahi-input>and<ahi-textarea>that made it work differently from<input>and<textarea>when using defaults - Fixed focus trapping not scrolling elements into view.
- Fixed more performance issues with focus trapping performance.
-
Fixed a bug in
<ahi-select>that prevented it from closing when tabbing to another select inside a shadow root -
Fixed
<ahi-dialog>not accounting for elements with hidden dialog controls like<video> -
Fixed a bug in
<ahi-option>that caused slotted content to show up when callinggetTextLabel() -
Fixed a bug that caused modal scroll locking to conflict with the
scrollbar-gutterproperty -
Fixed a bug that caused empty
<ahi-radio-group>elements to log an error in the console - Fixed a bug that caused form controls to submit even after they were removed from the DOM
-
Fixed a bug in
<ahi-color-picker>that caused picker values to not match the preview color - Fixed Meta.versionId FHIR type
- Release Date 1/30/2024
1.2.6
- Added
AppointmentRequestedStateExtensiontype definition -
Fixed
make-icons.jsbuild script to workaround an issue with the Health Icons metadata missing from the zip file - Release Date 1/4/2024
1.2.5
-
Added
<ahi-navigation>,<ahi-nav-item>, and<ahi-nav-group>components - Added
AccountResourceExtensiontype definition - Added
DataAbsentReasonExtensiontype definition - Updated Tabler Icons to 2.44.0
- Updated Lit to 3.1.0
- Updated TypeScript to 5.3.3
- Updated some other dependencies to latest versions
- Require Node.js >= 18
- Fixed the
RelatedPersonresource type not being exported - Release Date 12/27/2023
1.2.4
- Added automatic precision detection for
<ahi-format-date> - Release Date 11/16/2023
1.2.3
- Added a console warning if you attempt to register the same AKU component twice
- Added support for submenus in
<ahi-menu-item> - Added the
precisionproperty to<ahi-format-date> -
Turned off
removeCommentsintsconfig.jsonso JSDoc comments are preserved - Split auto-defining routes and non-auto-defining routes for components
- Updated Tabler Icons to 2.40.0
- Updated Lit to 3.0.2
- Updated TypeScript to 5.2.2
- Updated all other dependencies to latest versions
- Fixed a bug in the focus trapping utility used by modals that caused unexpected focus behavior
-
Fixed a bug in
<ahi-menu>that caused it not to fire theahi-selectevent if you clicked an element inside of a<ahi-menu-item> - Fixed a bug that caused focus trap logic to hang the browser in certain circumstances
- Fixed a bug that caused the [[Escape]] key to stop propagating when tooltips are disabled
- Removed erroneous spacing in radios
- Release Date 11/15/2023
1.2.2
- Adds a number of missing FHIR Extension types.
-
Adds
urls to FHIRExtensions that did not previously have aurldefined. -
Renames
PatientEthnicityExtensiontoUSCoreEthnicityExtension,PatientRaceExtensiontoUSCoreRaceExtension, andPaymentReconciliationExtensionBillingCodetoAzaleaBillingCodeExtensionand moves them all to the extensions file. - Release Date 11/01/2023
1.2.1
-
Adds missing extensions for the
PatientandPaymentReconciliationFHIR resources - Adds the
RelatedPersonFHIR resource type definition - Changes how FHIR
Extensions are defined to avoid circular generic typing - Release date 10/12/2023
-
Fixes incorrect type definitions for the
PatientPortalConfiguration,Appointment, andCapabilityStatementFHIR resources
1.2.0
-
🚨 BREAKING: Renamed the
ValueSetnamespace toValueSetsso as not to clash with theValueSetresource - Added the
submenu-iconpart to<ahi-menu-item> - Added the
spinnerpart to<ahi-button> - Added
azalea-kit-ui.jsandazalea-kit-ui-autoloader.jsto exportmaps. - Added support for virtual elements in
<ahi-popup> -
Added the
modalproperty to<ahi-dialog>to support third-party modals -
Added support for pressing [[Space]] to select/toggle selected
<ahi-menu-item>elements -
Added support for passing a JSON string to the
addressattribute of<ahi-fhir-address> - Added the
human-nameattribute to<ahi-fhir-human-name> -
Added the
Account,CodeSystem,Endpoint,Flag,Goal,Invoice,Medication,MessageHeader,NamingSystem,OperationDefinition,PaymentReconciliation,PractitionerRole,Provenance,Schedule,Slot,StructureDefinition, andValueSetFHIR resource type definitions. -
Improved
<ahi-collapsible>to use<details>internally for better semantics and to enable search to find in supportive browsers when collapsed -
Improved the behavior of the clear button in
<ahi-input>to prevent the component’s width from shifting when toggled - Updated
@ctrl/tinycolorto 4.0.2 - Updated
@tabler/iconsto 2.38.0 - Release date 10/9/2023
-
Fixed a bug in
<ahi-input>that caused date pickers to look filled in even when empty in Safari -
Fixed a bug in
<ahi-radio-group>where<ahi-radio>would not get checked sometimes. - Fixed a bug that caused slotted styles to not work in
<ahi-select> -
Fixed a bug in
<ahi-dialog>that caused nested modals to respond too eagerly to theEsckey -
Fixed a bug in
<ahi-dropdown>where aria attributes were incorrectly applied to the default<slot>causing Lighthouse errors -
Fixed a bug in valueAsDate on
<ahi-input>where it would always settype="date"for the underlying<input>element. It now falls back to the native browser implementation for the in-memory input. This may cause unexpected behavior if you’re using valueAsDate on any input elements that aren’t type=“date” - Fixed a number of slots that incorrectly had aria- and/or role attributes directly on them
-
Fixed a bug in focus trapping of modal elements like
<ahi-dialog>. We now manually handle focus ordering as well as addedoffsetParent()check for tabbable boundaries in Safari. -
Fixed a bug in
<ahi-dropdown>where pressing [[Up]] or [[Down]] when focused on the trigger wouldn’t focus the first/last menu items -
Fixed a regression that caused
<ahi-radio-button>to render incorrectly with gaps -
Fixed an issue with focus trapping elements like
<ahi-dialog>when wrapped by other elements not checking the assigned elements of<slot>s. -
Fixed a bug in
<ahi-toggle>that resulted in improper spacing between the label and the required asterisk - Fixed a bug in the autoloader causing it to register non-AKU elements
- Removed error when a missing popup anchor is provided
1.1.2
- Release date 10/3/2023
- Fixed required
ahi-memorable-dates not displaying the required indicator.
1.1.1
-
Added the
autocompleteattribute toahi-input-maskto control the input’s autocomplete setting. -
Set
ahi-memorable-dateday and year inputs to always haveautocomplete="off". - Release date 9/25/2023
1.1.0
-
🚨 BREAKING: replaced
--ahi-icon-size-xxl,--ahi-icon-size-xl,--ahi-icon-size-l,--ahi-icon-size-m,--ahi-icon-size-s,--ahi-icon-size-xs, and--ahi-icon-size-xxsdesign tokens with--ahi-icon-size-minor,--ahi-icon-size-major, and--ahi-icon-size-spot. -
🚨 BREAKING: The
colorattribute inahi-iconis no longer limited tobase,subdued,critical,attention,warning,highlight,success, orinherit. Instead it can be any valid CSS color value, including custom properties. -
🚨 BREAKING: The
sizeattribute inahi-iconis now limited tominor,major, orpart. - Added a
designsection in the docs with aniconspage. -
Added the
sizeandcolorattribute toahi-icon-buttonto customize the button’s size and color. - Updated all icons in form controls to use the new
minoricon size. - Updated
ahi-iconto dynamically import icons based on the library’s base path. - Release date 8/24/2023
-
Fixed
sun-filled,moon-filled, andgrip-verticalicons not appearing in the in docs.