Changelog Azalea Kit UI 101 Usage Customizing Utilities Form controls Laravel Vue FHIR Types Accessibility Icons Actions Button Button group Layout and structure Card Card section Care summary Care timeline Divider Empty state Footer Header Layout Stack Table Selection and input Calendar Checkbox Checkbox group Color picker Combobox Combobox option Input Input mask Memorable date Number input Option Phone input Radio Radio button Radio group Range Select SSN input Tag Textarea Toggle ZIP code input Images and icons Avatar Icon Icon button Logo Feedback indicators Badge Banner Progress bar Skeleton Skeleton body text Skeleton display text Skeleton thumbnail Spinner Typography Text Navigation Breadcrumb Breadcrumb item Dropdown Menu Menu item Menu label Navigation Nav group Nav item Nav toggle Pagination Tab Tab group Tab panel Top bar Tree Tree item User menu Overlays Dialog Popover Tooltip Utilities Collapsible FHIR address FHIR human name FHIR quantity FHIR questionnaire Format bytes Format date Format number Relative time Resize observer Split panel Tooltip Border Color Shadow Spacing Transition Typography Z-index Contributing Visual Tests Light Dark System

Changelog

Azalea Kit UI follows Semantic Versioning. Features or components that are deemed no longer necessary will have the Deprecated badge.

Components with the Experimental badge should not be used in production. They are made available as release candidates for development and testing purposes. As such, changes to experimental components will not be subject to semantic versioning.

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 it ahi-zip-code-input, ahi-ssn-input and ahi-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. With type="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-input and ahi-phone-input not submitting their form, as it does in ahi-input. A consumer can still cancel the keydown to stop it
  • Fixed Delete just before a separator in ahi-input-mask, ahi-zip-code-input, ahi-ssn-input and ahi-phone-input leaving 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-input acting on keys pressed in a control slotted into its label or help-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-button with variant="primary" or "destructive" now uses --ahi-text-primary or --ahi-text-critical instead 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-interactive and --ahi-text-on-interactive are 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-interactive fill. That makes the ahi-checkbox check and indeterminate marks 7.7:1. In the light theme the outline primary label is one step darker (blue-700, the --ahi-text-primary value); the outline border and every other light color are unchanged
  • Fixed ahi-memorable-date not updating its value until 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 emits ahi-input with the new value. ahi-change still fires once, when a changed field is left. The day and year fields’ own ahi-input events 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 an ahi-collapsible renders 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-scale set 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: the format-* components, ahi-relative-time, ahi-fhir-human-name and ahi-fhir-quantity. To size a region’s components from the text around them, set --ahi-component-font-size: 1em on its container (not inherit, 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. A font-size you set on an AKU element yourself still wins. See The host contract: text size
  • Fixed ahi-tree not indenting nested ahi-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-size to a fixed size also pulled every guide into one column. Each level is indented one --indent-size further than its parent again, with or without the token, and at the default --indent-size each 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-dark or in an .ahi-invert section of a light page, as the brand guidelines require. appearance="neutral" draws a mark in the current text color, for use as an icon, and appearance="inverse" draws it white on brand-colored backgrounds. size steps through set heights, and the --size custom property sets any other. On the AI sparkle, twinkle plays a twinkle when its button is hovered or focused, and working loops while set (for at most five seconds); neither plays with reduced motion. The colors are the brand logo colors, --ahi-brand-blue, -green and -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, #00964c and #e63d2f, replacing #216caf, #31884a and #d74433. The --ahi-color-{blue,green,red}-* ramps are rebuilt so each official color is its -600 step, 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-7 to --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-button to draw a slotted ahi-logo in the button’s own text color when the button is disabled or filled (variant="primary" or "destructive", without outline or plain). 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-logo takes the color through the new --logo-color custom property, which can also be set directly
  • Fixed ahi-avatar ignoring the documented --size custom property when it is set on the element. Its size steps set --size internally, so it only worked through ::part(avatar). --size on the element now sets the avatar’s size, and ::part(avatar) keeps working. An avatar under any element that sets --size now takes that size too
  • Release Date 10/14/2026

4.4.0

  • Fixed ahi-input-mask, and with it ahi-zip-code-input, ahi-ssn-input and ahi-phone-input, displaying inline. They now display as a block, like ahi-input, so a consumer giving them display: block to line them up with other fields can drop that override

  • Fixed ahi-input-mask, ahi-zip-code-input, ahi-ssn-input and ahi-phone-input not showing their error after a blocked form submission or reportValidity(), so a required field left empty showed no message. They also no longer keep showing an error after a form reset or resetValidity()

  • Added follow-up questions to ahi-fhir-questionnaire: an item with enableWhen shows only while its conditions are met (exists, =, !=, >, <, >=, <=, with enableBehavior any or all), 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 as false for every operator but exists

  • Added initialResponse to ahi-fhir-questionnaire, for resuming a saved QuestionnaireResponse. Its answers fill the form without setting dirty or emitting ahi-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, pageCount and firstInvalidPage() to ahi-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 Task resource type (fhir/resources/Task) with the TaskStatus, TaskIntent and TaskPriority value sets, typed QuestionnaireItem.enableWhen and QuestionnaireItem.initial, and exported ExtensionValues from fhir/datatypes

  • Updated ahi-fhir-questionnaire to show its own text (Add another, Other…, the unit and value labels, and its loading and error messages) in English or Spanish, following lang or <html lang>, and to pass its lang to the controls inside it

  • Added the ahi-fhir-questionnaire terms to the translations: addAnother, repeatedAnswerLabel, removeRow, otherOption, otherValue, loadingOptions, failedToLoadOptions, showingFirstOptions, noResultsTryAnotherSearch, failedToLoadResults, quantityValue, quantityUnit, loadingUnits and failedToLoadUnits. A locale that overrides the built-in English needs all of them

  • Fixed ahi-fhir-questionnaire writing 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-questionnaire emitting ahi-questionnaire-change when it fills in a quantity’s only unit option on load or on reset()

  • Fixed ahi-fhir-questionnaire leaving 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-layout leaving a footer that is not sticky-footer partway 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-item painting the label of an active item that owns a subnav with --ahi-text rather than --ahi-color-navigation-text, which made it unreadable on a dark navigation. A consumer pinning --ahi-text on its nav items to work around this can drop that override
  • Fixed ahi-select with multiple giving 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 own lang
  • Fixed ahi-tooltip opening when its target is clicked or tapped. The hover trigger 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-portal to the consumer scan that generates the bundled icon set. It was commented out of scripts/scan-icon-usage.js, so its icon names reached neither the allowlist the build bundles nor the --check guard — 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 how heart-handshake came to be absent from 4.2.1 while the portal’s Community Help Center link was still asking for it. It and arrows-exchange join the set here, which is the whole of what the repo was missing
  • Added an error property to ahi-input-mask (and so ahi-phone-input, ahi-zip-code-input and ahi-ssn-input), ahi-memorable-date and ahi-radio-group, as on ahi-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-group showing 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> rendering role="status" messages inside its role="list" scroll container — the loading block and the “No events match the current filters.” message. ARIA allows a list only listitem children, 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 now aria-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 is display: 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, no aria-label, no title — so it announced as “button” and nothing more, while remaining keyboard focusable. It now carries a name and an aria-expanded, both following whether the nav is open, and both translated (collapseNavigation and expandNavigation) 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 collapseNavigation and expandNavigation to the translations. A locale that overrides the built-in English needs both, alongside the existing resizeNavigation
  • Release Date 9/15/2026

4.1.0

  • Fixed <ahi-avatar> reporting itself to assistive technology as an image with no name. It rendered role="img" unconditionally with aria-label set to the label property, so an avatar without a label emitted aria-label="" — a role-img-alt failure, seven times over in one consumer. An avatar with no label is now decorative (aria-hidden, no role), 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 from aria-label, aria-labelledby or title, never from content. Pass label whenever 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-coded aria-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-label forwarding to <ahi-select>, matching <ahi-input>. Setting aria-label on 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 visible label still wins, and only aria-label is mirrored — an aria-labelledby cannot resolve from inside the shadow root
  • Release Date 9/14/2026

4.0.0

  • Fixed grouped rows in ahi-care-summary dropping a row’s annotation whenever the row also had a value. 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 an annotation such 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-timeline already rendered both together and is unchanged

  • Fixed a grouped row’s annotation in ahi-care-summary overflowing its card when the text was long. The style was written when the only annotations were one-word severities that always fit, so it set white-space: nowrap and 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 to reports/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 against scripts/a11y-baseline.json so 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__base CSS part from ahi-tab. Its close affordance is no longer an <ahi-icon-button> — an element with role="tab" must not contain interactive or focusable descendants, and a nested button stays in the accessibility tree as one however its tabindex is set. It is a decorative <span> now, so there is no inner button to expose a part for. The close-button part 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 carries aria-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-calendar and ahi-badge failing 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-badge declared no text color at all and inherited whatever surrounded it, so a badge placed inside an ahi-icon-button picked up that component’s icon color and rendered at 3.06:1 on its info surface — it now pins --ahi-text like ahi-tag and ahi-banner already 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 the aria-label standing 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 the page-size-label CSS part still resolves to it

  • Fixed ahi-icon-button ignoring a tabindex set on the host. tabindex on 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 how ahi-tab-group’s scroll buttons became keyboard-reachable while being hidden from screen readers. Setting tabindex on 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. A role="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 — the tabindex="-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> outranks aria-label, title and placeholder in the accessible-name calculation, so the empty one did not just fail to name the control — it blocked every other way of naming it. Affects ahi-input, ahi-textarea, ahi-select, ahi-number-input, ahi-range, ahi-combobox, ahi-checkbox-group, ahi-radio-group and ahi-memorable-date. No visual change: that element was already display: 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:a11y runs 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 to reports/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-hidden focus, 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 ## Next block, and npm run release collates them. Contributors add docs/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 the merge=union driver 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 is inherit, which is exactly the behavior every previous release had, and a font-size you set on an AKU element yourself still wins. This closes the long-running question of whether AKU should pin font-size on :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-size will default to var(--ahi-type-body-font-size) rather than inherit, 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.css and themes/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 complete light.css and dark.css are 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-secondary and --ahi-color-text-on-accent values in both themes. All three were consumed by ahi-top-bar, ahi-layout, ahi-nav-item and ahi-calendar but 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-700 and 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 invalid var() invalidates the whole box-shadow — leaving the button with outline: 0 and nothing in its place
  • Fixed ahi-range reading --ahi-line-height-800r, a typo for --ahi-line-height-800, and <ahi-text>’s body-xs and body-sm roles carrying a stray second letter-spacing that referenced a token from a scale that does not exist — an invalid var() 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.625em breakpoint both matching at exactly 490px, so which one applied came down to sheet order. The narrow half now stops at 30.6225em, matching how the 47.9975em / 48em pair is already written; it affects ahi-radio, ahi-empty-state and ahi-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-selected is deliberately outside the gate — it is a state, not a pointer position — and rows now take --ahi-surface-depressed while pressed, which is the feedback a tap gets in place of the hover
  • Fixed a cell carrying .ahi-table-ellipsis collapsing to nothing once its ahi-table stacked, which took the value off the card. The utility truncates by pairing max-inline-size: 0 with inline-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 an ahi-button sized 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. Inside ahi-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: none would 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-rail attribute to ahi-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-open still says whether the navigation is expanded — so toggling out of the expanded state returns to the rail, and persist-nav-state restores 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-size plus 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 to 1 on the layout’s navigation region while railed and inherited into slotted navigation content, so ahi-nav-item can 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 now min(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-item for ahi-layout’s rail. The label is clipped rather than hidden, so the item’s accessible name is unchanged — display: none would 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-size on both axes, a badge moves 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-item with no icon: the first letter of its label in a disc, aria-hidden since it abbreviates the label rather than naming the item. icon is 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-popup paints nothing by design, so nothing else was holding the shape. Those four properties now sit on a new panel part 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-combobox overflowing the viewport by the height of its footer. --auto-size-available-height is 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-combobox for lazy mode, so a capped option list no longer presents itself as the whole set. Set total-results to 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 set total-results
  • Added load-more to ahi-combobox, which renders a Show more control in that footer and emits ahi-load-more with { rendered, total } so you can extend the slice; load-more-count sets 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 added ahi-listbox-scroll-end for 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-footer slot and listbox-footer, listbox-footer-text, load-more-button and empty CSS parts to ahi-combobox. Filling the slot replaces the generated footer outright, so render your own count — and your own aria-live region if it changes, or the update is silent to a screen reader
  • Fixed ahi-combobox never rendering its own empty-state messages. noOptionsText and noResultsText have been declared as properties since the component shipped, but nothing read them: render() emitted only the option slot and the .combobox__empty styles 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-text after a search that matched nothing, no-options-text when there are no options at all — and defer to loading, so a lazy combobox waiting on results no longer flashes “No results found” at you mid-fetch
  • Fixed the ahi-combobox loading spinner rendering at 20px against the 16px expand icon it replaces, which made the field’s contents jump each time loading toggled. The stylesheet set --size and --track-width on it, and ahi-spinner reads neither — both were inert and the spinner fell back to its default size. It is now sized with the size attribute that actually works, and the two dead properties are gone
  • Updated the ahi-combobox lazy documentation, 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. lazy only 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-dialog rendering 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 at 48em turns 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, the 620px max-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 explicit width through ::part(panel) was the visible face of this bug — the base panel is position: fixed with left and right both pinned to 0, so adding a width over-constrained it and the browser dropped right, 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 restored max-width: 620px, so set max-width alongside width if you intend a panel wider than that. A margin-inline: auto added 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 with min(), and Sass implementations resolve min() and max() as Sass functions rather than leaving the CSS ones alone — given a var() 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 a text/css content 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. Both light.css and dark.css were affected. The guard is now spelled clamp(0px, …, 100%), which is arithmetically identical for any track size and has no Sass equivalent, so it passes through untouched — .ahi-grid behaves 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 on min() or max() in any shipped theme so it cannot return
  • Fixed the CDN build shipping two files that cannot load from it. cdn/themes/light.styles.js and cdn/themes/dark.styles.js — the Lit flavour of each theme — open with import { css } from 'lit', a bare specifier, and they were the only two files in cdn/ that did not resolve entirely on their own, so loading either one from the CDN has always failed. They now ship in dist/themes/ only, which is where the @azaleahealth/azalea-kit-ui/themes/*.styles.js export already pointed and where a bundler can resolve lit — if that is how you import them, nothing changes. The removal matters to a host that compiles the whole vendored cdn/ tree ahead of time rather than loading it in the browser: there the bare import becomes a hard dependency on a module named lit that 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-invalid until the user next interacts with it. Until now the only way out of that state was form.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-invalid there 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 set sticky still 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 with placement="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 setting sticky, set it. Sticky top and bottom groups are unchanged
  • Updated <ahi-nav-toggle> to take its breakpoint in em rather than px, 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 --noEmit to npm run verify, as its first step, and fixed the two type errors it immediately found. Nothing in verify or the pipeline had ever run the typechecker — the build is esbuild, which strips types rather than checking them — so src/styles/host-independence.test.ts had been narrowing the public barrel’s exports to CustomElementConstructor since 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 get npm run typecheck as a standalone script
  • Added npm run spellcheck to npm 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 in dist/ or cdn/ differs
  • Fixed <ahi-radio> switching to its narrow-screen layout 0.16px away from every other component. Its breakpoint read 30.635em where <ahi-card>, <ahi-card-section> and <ahi-table> all use 30.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-height a 44px floor 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-height was never declared by the theme at all — <ahi-option> and <ahi-combobox-option> read it with an auto fallback — so, exactly as with fields, there was nothing at :root for a coarse-pointer rule to raise. The token is now declared by the theme and becomes 44px under @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 still auto, and a consumer that sets --ahi-option-min-height itself 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-size instead
  • 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 of 01 / 2000 read back as 0 and 200 on 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 set sticky are 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 the invalid event as proof the user had touched it. The browser fires that event for the silent form.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 a form.reset() the moment validity was re-checked. Silent checks are now silent, as they are on a native control; a blocked submit attempt and reportValidity() 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> label 15px 14px 14 / 20
    <ahi-button> small, medium 15px 14px 14 / 20
    <ahi-button> large 17px 16px 16 / 24
    <ahi-menu-label> 13px 12px 12 / 16
    <ahi-dialog> title 16 / 20 20 / 24 20 / 28
    <ahi-card> title 14px 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 the label role now, and a test asserts they match.

  • 🚨 Fixed form fields inviting iOS Safari to zoom on tablets and kiosks. --ahi-form-control-font-size was 16px with a min-width: 48em query 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 on pointer: coarse now: 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-semibold and --ahi-font-weight-bold painted 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.json guard to npm run verify. It asserts every component still has a @summary, a valid ahi-* tag name, and @dependency tags 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, caption and code — each published as a size and line-height pair (--ahi-type-<role>-font-size and --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-comfortable and ahi-density-spacious now 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 — loading light.css or dark.css is 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-hidden and ahi-visually-hidden-label from utility.css into the theme, for the same reason. Nothing to change: every consumer of utility.css already loads a theme, and the classes behave identically

  • Updated utility.css so 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-column for a vertical stack, or .ahi-split with .ahi-justify-content-start for a horizontal one, plus .ahi-gap-* and the alignment classes. Unlike the <ahi-text> replacements these live in the opt-in utility.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-text dependency <ahi-checkbox> declared in its metadata. It renders no <ahi-text> and never has, so custom-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 set font-size, line-height, font-weight and font-style on slotted h1–h6, p, em and span with !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 stray p { 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 as slot="logo", which the component stopped supporting in 2.0.0, so the image was silently dropped. The example also passed a logo-url attribute the component has never had

  • Added .ahi-row and .ahi-column, the neutral flex primitives <ahi-stack> maps onto — column is its default, row its direction="horizontal", both with the same default gap. .ahi-split could not express a plain stack on its own because it forces justify-content: space-between

  • 🚨 BREAKING: utility.css is gone. Every utility class it held now ships inside light.css and dark.css, so there is one stylesheet instead of two. If you link dist/themes/utility.css or import dist/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-heading and ahi-caption all behave exactly as before, in the same ahi-utilities cascade 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 why ahi-row shipped in the theme and ahi-grid did not

  • 🚨 BREAKING: removed the ahi-body, ahi-heading and ahi-caption classes. They were a first pass at type utilities and disagreed with the roles that replace them — ahi-body paired 14px with a 24px line height, one of the mismatched pairings this release exists to remove, and ahi-heading rendered 24px where the heading role is 20px. Use ahi-text-body, ahi-text-heading and ahi-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 release deleting part of its own release notes. It promoted ## Next by 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–h6 globally, those rules override the utility classes. The utilities sit in the ahi-utilities cascade layer so your CSS can always win, which is deliberate — but it means an <h1 class="ahi-text-heading"> takes your font-size and, since you probably do not also set line-height, the role’s line height, leaving a mismatched pair. Exclude opted-in elements with h1: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 at width: 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__label was 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-subdued from the avatar circle — a color chosen for the icon fallback glyph, which as text on --ahi-surface-neutral measured 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-subdued itself 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 focusable role="separator", which requires aria-valuenow, aria-valuemin and aria-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 and aria-valuenow tracks both pointer drags and keyboard adjustment, and it has an accessible name (Resize navigation, localized). A nav width restored from localStorage that 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-height was never declared by the theme — <ahi-input> and <ahi-select> read it with a hard-coded 36px fallback — 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 :root and becomes 44px under @media (pointer: coarse), matching --ahi-target-min-size. <ahi-combobox> and <ahi-textarea> honour it too now — they had hard-coded the same 36px — 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 the size="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-height itself still wins on proximity
  • Added autocapitalize, autocomplete, autocorrect, spellcheck, inputmode and enterkeyhint to <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, and autocorrect was 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. autocorrect now defaults to off on 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. Set autocorrect="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>. autocorrect is 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 through setAttribute and turns a bound false into 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. Writing autocorrect="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 is 1 and 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 a var() 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 styled font: -apple-system-body against the 17px default. --ahi-target-min-size deliberately 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, and td { white-space: nowrap } with no min-width guarantees 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. stacked turns 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 a data-label you set yourself is left alone, for spelling out an abbreviation or naming a column headed by an icon. sticky-column pins 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 that stacked makes the table a query container — only when the attribute is present, since container-type carries containment with it
  • Fixed <ahi-combobox>’s error property showing nothing. It rendered your message into the error slot and stopped there — but that region is hidden until the control is in the user-invalid state, and error never put it there. So the text sat in the DOM, invisible, while checkValidity() returned true: a property documented as “shows a validation error” neither showed anything nor was a validation error. Setting error now makes the control genuinely invalid — the message appears, :invalid matches, and native form submission is blocked — and clearing it clears that validity. This is a behavior change for anyone already binding error on a combobox: the message will now actually appear, and the form will stop submitting while it is set
  • Added the same error property 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 to setCustomValidity() for every field. setCustomValidity() still works and is unchanged; error is 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 error slot 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 that setCustomValidity(), checkValidity() and reportValidity() 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 wired ahi-icon-button, ahi-tab, ahi-menu-item, ahi-tree-item, ahi-checkbox and ahi-toggle to --ahi-target-min-size and 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-subdued on 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>’s size attribute doing nothing. size was 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. size is now a real reflected property accepting small (16px), medium (20px) and large (32px), so that markup starts working with no change on the consumer’s side. medium is 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 setting width/height inline still wins over the attribute, so the sizing the docs previously described keeps working. There is deliberately no --size custom 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 fixed height of 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 a min-height now, 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 dead line-height declaration 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 sets overflow-x: hidden on body, html was 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 with overflow-x: hidden on html can drop the workaround
  • Fixed <ahi-empty-state> clipping the descenders of a heading that wraps, and added a media slot 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>’s heading-lg variant 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 new media slot 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 ::slotted rule, 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 fixed block-size, which made --ahi-header-block-size a 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 uses min-block-size, so it keeps its nominal height whenever the content fits and grows to contain the content when it does not, and size="s" does the same at its own height. <ahi-layout> follows: the sticky offset it hands descendants through --ahi-sticky-top was 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 sets sticky and fills the header slot, so a layout that never opted into sticky positioning is untouched. Consumers that compute layout from --layout-header-size or --ahi-sticky-top as 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, a calc() against either token, or a scroll-margin set 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-outline and thermometer. 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, so npm run icons:check guards it in CI. The scanner also ignores dist-*/ now, so a consumer’s second build target (myhealthspot’s dist-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 with this.matches(':state(user-invalid)') from inside render(), so the SyntaxError took 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 through ElementInternals.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 no CustomStateSet at any version, so this was not something a consumer could fix by upgrading its test environment
  • Fixed an <ahi-card>’s title still 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 :root where 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-comfortable and ahi-density-spacious utility 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-size and --ahi-target-min-size being impossible to override. They were declared on each component’s :host, and a :host declaration 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 is 16px on touch — below that iOS Safari auto-zooms the page when a field is focused — and 14px from 768px up, where density is worth more. ahi-input, ahi-textarea, ahi-select and ahi-combobox read it. That breakpoint used to be duplicated inside each control; it is one declaration now
  • Fixed ahi-select and ahi-combobox rendering their field text larger than ahi-input and ahi-textarea on 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 to 24px, the WCAG 2.2 AA floor, and becomes 44px under @media (pointer: coarse). ahi-button, ahi-icon-button, ahi-tab, ahi-menu-item, ahi-tree-item, ahi-checkbox and ahi-toggle now honour it
  • Fixed ahi-text variants 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 setting font-size on <ahi-text> — or reaching it through a ::part() — silently did nothing. This is why an ahi-card’s title could not be made larger at all. Every variant now routes through its own token, --ahi-text-heading-md-font-size and 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: coarse handling 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-button and ahi-checkbox had 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-break and tab-size from 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-space was deliberately left inheriting, and text-align, font-family, font-size and color still 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 139 rem lengths 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 uses 10pt) 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-size rendering at the wrong size on hosts with a root font-size. It was the one font size in the type scale declared in rem rather than px, so it shrank while every other size held; it is now 15px
  • Fixed components inheriting letter-spacing and text-transform from 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 with text-transform: uppercase on 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-size and color deliberately 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 through currentColor. Components whose own chrome needed an alignment or a font now declare it themselves rather than taking it from the page
  • Fixed ahi-pagination taking its font from the host page rather than the design system. Its :host declared font-family: inherit, which re-opted it out of the shared component styles
  • Fixed ahi-tree-item indentation scaling with the host page’s font size instead of the component’s. It was 1em; it is now 16px
  • 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 was rem while every --ahi-font-size-* token was px, so a host with html { 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-base token (default 16px) 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-base instead — 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-height crosses 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 of 28px versus normal — most visibly in ahi-care-timeline, where event detail rows collapsed to half height, and in ahi-care-summary. Components now pin line-height on :host; a host that wants a different rhythm can still set it on the element itself
  • Fixed ahi-care-timeline rendering its date rail, detail grid, filter panel and match-confidence popover ~17% narrow on hosts with a root font-size, for the same rem reason. 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’s cdn/ 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-specifier dist/ build cannot replace it — and its npm ci failed with ENOENT on node_modules/@azaleahealth/azalea-kit-ui/cdn. Installs now ship both dist/ and cdn/ again
  • Added thumb-up, thumb-down, and trash-filled to the bundled icon set. The assistant SDK draws them (the feedback thumbs and the chat-favorites delete control) via setAttribute('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-assistant and azaleaehr are now enabled in the scanner’s default repo list, so npm run icons:check scans 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, and layout-sidebar-right to 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 in scripts/scan-icon-usage.js’s DEFAULT_REPOS was 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 plain name="..." 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. mypractice is now enabled in DEFAULT_REPOS so npm run icons:check scans 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 its title with 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() and blur() on <ahi-nav-toggle> throwing a TypeError. All three forward to the button the component renders, which they looked up by a class name that button never had. Because click() and focus() 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 a quantity. 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 a RangeError for any negative value, which took the surrounding render down with it. Sizing the value picked its unit prefix from log10, which is NaN for 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 — -1500 reads as -1.5 kB
  • Fixed <ahi-text> keeping the wrong host display when visually-hidden is set after the first render. The element it renders depends on both as and visually-hidden, but only as was watched, so toggling visually-hidden on 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> emitting ahi-activate twice for a single change of active, so anything counting activations — analytics, or a handler that navigates — saw two
  • Fixed type="unit" missing from the type <ahi-format-number> declares for its type property. 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.js and its 71 counterparts are gone from dist/ and cdn/. 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 static styles instead — 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 its value property when set from code. Assigning combobox.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. Its value accessor 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 its value to 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 became north_carolina, and because the combobox selects options by exact value match it could then never be selected from the combobox’s own value
  • Fixed <ahi-option> ignoring the hidden attribute. The component set display on 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 on document and 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 emitted value were 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-popover and --ahi-shadow-modal a 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 default min-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-hovered on an --ahi-action-secondary button — 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-primary border 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>. CareTimelineFilters gains optional dateFrom and dateTo (ISO YYYY-MM-DD), reported through ahi-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, and annotationColor properties 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, and detail-value CSS parts to <ahi-care-timeline>, so the expanded detail panel and its rows can be styled from outside the shadow root
  • Added an optional negation flag to CareSummaryGroup and CareSummaryTag in <ahi-care-summary>, for entries that assert an absence rather than an actual item — “No Known Allergies”, “No Known Medications”. A negation: true entry contributes 0 to the card header count, so an Active Allergies card for a patient with no allergies now shows no count badge instead of 1, and it is excluded from the safety/review badges and the printed alert band even when critical or warning is also set. The entry still renders unchanged and still counts toward max-groups/max-tags truncation. The flag is additive and opt-in — set it from your data adapter; a group with empty rows and 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’s user-invalid state 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-color to --ahi-form-control-required-content, --ahi-form-control-required-content-offset, and --ahi-form-control-required-content-color respectively. 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-invalid attributes. 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. In multiple mode, assigning a string to the value property 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. The value attribute 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 native cancel event. The public modal property (with activateExternal()/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 cancelable ahi-request-close), animations, and the open/show()/hide() API are unchanged
  • 🚨 BREAKING: the autocorrect property on <ahi-input> and <ahi-textarea> is now a boolean, matching the platform’s autocorrect IDL attribute (the standard now defines it on every element, and TypeScript’s DOM types enforce it). The attribute is unchanged — keep using autocorrect="on"/autocorrect="off" in markup; only property reads/writes change from 'on'/'off' strings to true/false
  • 🚨 BREAKING: the form property on form controls now follows the native form-control contract — reading it returns the associated <form> element (or null) instead of the form id string, and the getForm() method has been removed (read the form property instead). Assigning still takes a form id and reflects to the form attribute; 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-out from the light and dark themes. Nothing in AKU or any Azalea application references them; if you do, use var(--ahi-border-width-1) solid var(--ahi-border) for the border shorthand and the CSS keywords linear/ease-out (or your own cubic-bezier() values) for the easings
  • 🚨 BREAKING: removed the AhiNavToggleEvent type and its ahi-nav-toggle entry in the global event map — the event was declared but has never been emitted by any component
  • 🚨 DEPRECATED: the hoist attribute on <ahi-dropdown>, <ahi-select>, <ahi-combobox>, <ahi-tooltip>, and <ahi-color-picker>, and the strategy property 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 base CSS 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 render base alongside the new part, so existing ::part(base) selectors keep working, but base will 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 -wrapper suffix (ahi-input → input-wrapper, ahi-textarea → textarea-wrapper). Host-styled components whose base sat on a slot (ahi-menu-label, ahi-tab-panel) expose no wrapper part — style the host element directly. Components that never rendered a base part are unaffected; form controls such as <ahi-select> continue to expose their outer wrapper as form-control
  • Added component-named CSS parts alongside every existing base part (see the deprecation note above) so each wrapper has a self-documenting, non-generic selector
  • Added a name attribute to <ahi-collapsible> for exclusive-accordion behavior — collapsible elements that share a name close each other when one opens, so only one in the group is open at a time
  • Added form attribute/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), supports placement/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 marked data-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 form value and valueAsNumber as the raw number, supports min/max clamping and step with 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. The percent style is not yet supported
  • Added <ahi-checkbox-group> — a semantic wrapper that labels and lays out a set of related <ahi-checkbox> elements (fieldset with role="group", label, help text, and vertical/horizontal orientation with a --gap custom property). Each child checkbox keeps its own name/value and submits independently; the group’s required attribute 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 boundary attribute to <ahi-popup> (viewport by default, or scroll) — set boundary="scroll" so flip/shift/auto-size positioning responds to the anchor’s scroll container again while the panel is in the native top layer
  • Added cancelable ahi-show and ahi-hide events to <ahi-dropdown> — call event.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.js now 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; the dist/-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 need slot="nav" set by hand (markup that already sets it is unaffected)
  • Added documentation for CSS parts that were rendered but undocumented — form-control-error on <ahi-input>, <ahi-select>, and <ahi-combobox>; spinner on <ahi-combobox> and <ahi-menu-item>; and textarea-adjuster on <ahi-textarea> — corrected <ahi-checkbox>’s documented help-text part to its rendered name form-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; use AhiIcon.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 ancestor overflow, transform/filter, and z-index stacking contexts automatically, so they are no longer clipped when nested inside scrolling or transformed containers — without needing the hoist/fixed workaround. <ahi-popup>’s strategy property — and the hoist attribute 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 (engines updated — 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-ready cdn/ bundles are no longer included in installs, roughly halving the installed size. No consumer imports from the package’s cdn/ path (it exists for the docs site and the downloadable CDN tarball); if you need the browser-ready build, download azalea-kit-ui-cdn.tar.gz from the docs site
  • Updated <ahi-radio-group> validation to report through ElementInternals instead 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 in form.elements, submit through native FormData and participate in native constraint validation (including form.reportValidity() and form.checkValidity(), which are no longer monkey-patched), and honor the form attribute natively — <ahi-button form> now reflects and associates natively as well. Submitted values always pass a null state 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 with min-height instead of a fixed height, 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 lang or dir attribute changes (previously only a change to the document’s <html lang> was observed), so a localized component nested under an element with a different lang formats 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 a required control blocks native form submission (and emits ahi-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 a value rather than selecting the wrong day
  • Fixed the expand/collapse affordance on <ahi-care-timeline> event rows rendering as a blank space — the caret-up-down and fold icons 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 form attribute (<ahi-select>, <ahi-combobox>, <ahi-radio-group>, <ahi-range>, <ahi-memorable-date>, <ahi-number-input>, <ahi-color-picker>) always rendered a stray empty form="" attribute on themselves. The attribute now only appears when a form id is actually set, and clearing the property removes it (an empty form="" 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 notably lang="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 programmatic value (for number/date/time/datetime-local) that the field itself renders as empty; the value is 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" with value="-5" submits 0) 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 (its name/value/formaction) is honored
  • Fixed <ahi-input> rendering the literal text “null” or “undefined” when its value was set to null/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 stray ahi-blur/ahi-change and 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 spurious ahi-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 exposing aria-invalid/required on their inner input, so an invalid required control is now announced by assistive technology
  • Fixed <ahi-dropdown> failing to set aria-haspopup/aria-expanded on a trigger that had upgraded but not yet rendered; it now retries once the trigger is ready
  • Fixed <ahi-menu-item> exposing aria-haspopup/aria-expanded on 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 marked role="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 while open stayed 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 name contains 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 preserveGroupOrder option to <ahi-care-summary> grouped boxes — when set, the box renders its groups in the exact source order supplied and disables the critical: true priority treatment (critical groups are no longer hoisted to the top, and they are clipped by max-groups like any other group). Critical styling and the safety badges/print alert band are unaffected. Defaults to false, 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 Lit utility.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 the ahi-utilities cascade 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-1 through --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 -600 step, 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-invert class that flips a subtree to the opposite color scheme (dark regions inside a light theme, or vice versa), including native form controls and scrollbars via color-scheme. The default (:root) theme scope is now zero-specificity, so .ahi-theme-dark and .ahi-invert win regardless of stylesheet load order
  • Updated <ahi-ssn-input> to default autocomplete to off so 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 when href is an empty string (the current-page pattern)
  • Fixed <ahi-radio-group> failing to check the correct radio when its value is 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 name attribute 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 unnecessary overflow on 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-attention token (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-card ahi-care-timeline-event-expand event). The chosen mode is remembered per-device via localStorage; a new reflected expand-all attribute/expandAll property lets a host control it from a server-stored value (host value takes precedence over localStorage), and a new ahi-care-timeline-expand-all-change event (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 errors property to <ahi-care-timeline> and <ahi-care-summary> — pass an array of CareError objects ({ 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 with details get 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 new errors CSS part.
  • Added an accessible name to <ahi-input> from a host aria-label — the label is mirrored onto the inner <input> when no visible label is 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 same CareError model (capturing the stacktrace into details where 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-error emission and CareSummaryPendingError polling 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-height cap (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 receive aria-haspopup/aria-expanded, keyboard focus is recovered when the focused event card is virtualized out of the DOM, rows expose aria-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 via aria-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 ignored aria-label; card titles are exposed as headings via a new heading-level attribute (default 3) 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 the adapter mid-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 — @page margin-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-string id/start/type/title are 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 premature ahi-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-interval is 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 (default 2.25rem) and <ahi-option> honors --ahi-option-min-height (default auto). 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, the Month/Day/Year placeholders, the default help text, and the validation messages now follow the active language (from <html lang> or the element’s lang). Month names are generated via Intl; the other strings come from the new translation layer below. Previously these were always English.
  • Added a translation layer to the localize utility — registerTranslation / registerDefaultTranslation and LocalizeController.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 the shield-check icon to match the High entry in the match-confidence legend dropdown (it previously showed square-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 sets user-select: text while preserving click-to-expand
  • Release Date 6/17/2026

1.12.0

  • Added <ahi-fhir-questionnaire> component — renders a dynamic form from a FHIR R4 Questionnaire resource
  • 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 ::after gradient; the fade clears when a card is expanded
  • Added greedy bin-packing column layout to <ahi-care-summary> — card heights are measured via ResizeObserver and 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 with critical: true groups show a red shield badge; tags boxes with warning: true tags 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-height CSS 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 to none (no cap)
  • Added --summary-clip-height CSS custom property to <ahi-care-summary> — controls the max-height applied to overflowing card bodies before they are clipped and faded; defaults to 320px
  • 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 optional CareTimelinePrintContext object to populate a patient/encounter header with fields such as patientName, dob, mrn, facility, attendingPhysician, and printedBy; 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 defers virtualizer.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 — estimateSize is 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 a sourcePatient block (+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’s keyed() 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 call observe() 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 @page margin 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 a valueColor and 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 for optimizeDeps: { 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 calls measure() 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 warning boolean field to CareSummaryTag — when true, 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 from color (darkened 20%) when supplied, otherwise falls back to currentColor; tags with detail render an info-circle icon, or alert-triangle when warning: true is also set; warning tags are always sorted before non-warning tags and are never hidden by max-tags truncation 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 of max-rows, max-tags, or max-groups limits; tags with detail text 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 any critical-flagged allergy groups or warning: true medication tags
  • Added transfer/consultation print layout to <ahi-care-summary> — enabled via transferMode: true on 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 CareSummaryPrintContext type 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 with grouped layout section headers
  • Release Date 4/22/2026

1.11.0

  • 🚨 BREAKING: replaced grouped-list layout in <ahi-care-summary> with a new 'grouped' layout — update layout: 'grouped-list' to layout: 'grouped'
  • Added grouped layout 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-groups attribute to <ahi-care-summary> for truncating grouped boxes with a ”+N more” expand button. Groups marked critical: true are always visible regardless of truncation and render before non-critical groups — intended for safety-critical entries such as life-threatening allergies
  • Added patientIdentity property to <ahi-care-timeline> — when set to { name, dob, mrn, ssnLast4?, sex? }, each field in an event’s sourcePatient is compared against the corresponding value and any mismatch is highlighted in yellow so clinicians can immediately spot discrepancies across federated records
  • Added ssnLast4 field to CareTimelineEvent.sourcePatient — rendered as •••-••-XXXX on the card
  • Added sex field to CareTimelineEvent.sourcePatient
  • Added link field to CareTimelineEvent.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[] with typeColors: 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-fields attribute on <ahi-care-summary> to max-rows for truncating key-value boxes with a ”+N more” expand button
  • Added detail field to CareSummaryTag — 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 (empty fields, tags, or groups array) 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 the end date/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. Supports key-value and tags box layouts, configurable polling interval, skeleton loading state, and overflow truncation via max-tags and max-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 a CareTimelineDataAdapter, 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 caused stroke-width to be mangled. Now uses DOMParser for 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 the default slot on <ahi-icon>.
  • Icons now load automatically from the Tabler CDN. No imports or registration required.
  • AhiIcon.registerIcon() and AhiIcon.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 prepare script.
  • 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 using resize="auto" that prevented the textarea from shrinking when content was removed
  • Release Date 1/28/2026

1.7.1

  • Added icon property to <ahi-card-section> to display icons next to section titles
  • Enhanced <ahi-card> to allow full header customization via the header slot while maintaining backwards compatibility with the title property
  • Changed <ahi-tooltip> default trigger from hover focus to hover to 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 .focus function 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 using resize="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 using placeholder and multiple
  • 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 setting active on <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 countdown attribute 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. The fixed-scroll-controls attribute 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/dom to 1.6.11
  • Update lit to 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-divider instead 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> --background and --header-divider CSS properties with --ahi-color-navigation-surface and --ahi-navigation-header-divider global tokens respectively
  • 🚨 BREAKING: replaced <ahi-nav-group> --heading CSS property with the --ahi-color-navigation-heading-text global token
  • 🚨 BREAKING: replaced <ahi-nav-item> --active, --text-on-active, --nav-hover, --badge, and --text-on-badge CSS properties with --ahi-color-accent, --ahi-color-text-on-accent, --ahi-color-navigation-hover, --ahi-color-badge-notification, and --ahi-text-on-badge-notification global tokens respectively
  • 🚨 BREAKING: <ahi-top-bar> no longer embeds a menu toggle, has the base and logo CSS parts, emits the ahi-nav-toggle toggle event, or has a logo slot. The secondary-nav slot has been renamed to end and the nav toggle is now it’s own component that can be customized through the <ahi-layout> nav-toggle slot.
  • 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 padding and sticky properties to <ahi-tab-group> component
  • Added --ahi-z-index-sticky, --ahi-z-index-nav, --ahi-z-index-top-bar tokens
  • Added a label property to the <ahi-spinner> component
  • Added a suffix slot and corresponding part to <ahi-select>
  • Added the base__popup part 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.define to 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/dom to 1.6.8
  • Update @ctrl/tinycolor to 4.1.0
  • Update composed-offset-position to 0.0.6
  • Update lit to 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 being display: none; to its original display value.
  • Fixed a bug in <ahi-button-group> classes
  • Fixed a bug in <ahi-textarea> that may throw errors on disconnectedCallback in 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 Account FHIR type definition by moving the AccountRelatedPersonEmployerExtension from the root resource to Account.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-normal token 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 placement attribute to <ahi-tab-group>
  • Added padding CSS property to <ahi-tab-panel>
  • Added additional documentation for <ahi-tab-group>
  • Added the sync property to <ahi-dropdown> so the menu can easily sync sizes with the trigger element
  • Added type definitions for ScheduleEndTimeExtension, ScheduleInsuranceClassExtension, ScheduleInsuranceExtension, ScheduleIntervalTimeExtension, and ScheduleStartTimeExtension
  • Added DiagnosticReport._effectiveDateTime for absent effectiveDateTimes
  • Added type definition for PatientGuarantorRelationshipExtension
  • Updated <ahi-tab> to use interactive color rather than action primary
  • Update @floating-ui/dom to 1.6.3
  • Update other dependencies
  • Fixed an issue where <ahi-button>s could be clicked while loading
  • 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-lock causing 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 breakpoint property 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 in getTextLabel()
  • Release Date 2/20/2024

1.3.1

  • Update lit to 3.1.2
  • Update @tabler/icons to 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-button component
  • Added the <ahi-split-panel> component
  • Added the <ahi-range component
  • Added the loading attribute and the spinner and spinner__base part to <ahi-menu-item>
  • Added the ability to call form.checkValidity() and it will use AKU’s custom checkValidity() handler.
  • Added the size attribute to the <ahi-radio> component.
  • Added the PatientOccupationExtension type 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 CloseWatcher API
  • Update Tabler Icons to 2.46.0
  • Update Lit to 3.1.1
  • Update @ctrl/tinycolor to 4.0.3
  • Update @floating-ui/dom to 1.6.1
  • Fixed a bug where the ahi-change event would always fire simultaneously with the ahi-input event in <ahi-color-picker>. The ahi-change event 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 form property, 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 calling getTextLabel()
  • Fixed a bug that caused modal scroll locking to conflict with the scrollbar-gutter property
  • 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 AppointmentRequestedStateExtension type definition
  • Fixed make-icons.js build 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 AccountResourceExtension type definition
  • Added DataAbsentReasonExtension type 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 RelatedPerson resource 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 precision property to <ahi-format-date>
  • Turned off removeComments in tsconfig.json so 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 the ahi-select event 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 FHIR Extensions that did not previously have a url defined.
  • Renames PatientEthnicityExtension to USCoreEthnicityExtension, PatientRaceExtension to USCoreRaceExtension, and PaymentReconciliationExtensionBillingCode to AzaleaBillingCodeExtension and moves them all to the extensions file.
  • Release Date 11/01/2023

1.2.1

  • Adds missing extensions for the Patient and PaymentReconciliation FHIR resources
  • Adds the RelatedPerson FHIR 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, and CapabilityStatement FHIR resources

1.2.0

  • 🚨 BREAKING: Renamed the ValueSet namespace to ValueSets so as not to clash with the ValueSet resource
  • Added the submenu-icon part to <ahi-menu-item>
  • Added the spinner part to <ahi-button>
  • Added azalea-kit-ui.js and azalea-kit-ui-autoloader.js to exportmaps.
  • Added support for virtual elements in <ahi-popup>
  • Added the modal property 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 address attribute of <ahi-fhir-address>
  • Added the human-name attribute to <ahi-fhir-human-name>
  • Added the Account, CodeSystem, Endpoint, Flag, Goal, Invoice, Medication, MessageHeader, NamingSystem, OperationDefinition, PaymentReconciliation, PractitionerRole, Provenance, Schedule, Slot, StructureDefinition, and ValueSet FHIR 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/tinycolor to 4.0.2
  • Updated @tabler/icons to 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 the Esc key
  • 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 set type="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 added offsetParent() 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 autocomplete attribute to ahi-input-mask to control the input’s autocomplete setting.
  • Set ahi-memorable-date day and year inputs to always have autocomplete="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-xxs design tokens with --ahi-icon-size-minor, --ahi-icon-size-major, and --ahi-icon-size-spot.
  • 🚨 BREAKING: The color attribute in ahi-icon is no longer limited to base, subdued, critical, attention, warning, highlight, success, or inherit. Instead it can be any valid CSS color value, including custom properties.
  • 🚨 BREAKING: The size attribute in ahi-icon is now limited to minor, major, or part.
  • Added a design section in the docs with an icons page.
  • Added the size and color attribute to ahi-icon-button to customize the button’s size and color.
  • Updated all icons in form controls to use the new minor icon size.
  • Updated ahi-icon to dynamically import icons based on the library’s base path.
  • Release date 8/24/2023
  • Fixed sun-filled, moon-filled, and grip-vertical icons not appearing in the in docs.