- ChangedFive published files stopped carrying a second copy of an argument the documentation already held.
- ChangedThe published stylesheets and components stopped carrying arguments in their headers.
- ChangedTwo published files stopped carrying their own design document.
- ChangedEvery transition in the kit reads a duration token and an easing token.
- FixedTwo menus in the topbar and the dropdown panel transitioned
all, which includesvisibility— a discrete property held at its OLD value for the whole duration, so the menu was stillhiddenin the frame it opened. - AddedFour easing tokens beside
--ease:--ease-out,--ease-in,--ease-sharpand--ease-spring, each aliasing a brand--easing-*primitive. - AddedThe reduced-motion net moved to
src/styles/reduced-motion.css, one copy, andapliteni-ui/react/cssnow ships it too. - AddedA gate over all of it.
- ChangedA disabled control is now painted, not faded.ButtonInputNavDropdown
- Added
--disabled-ink,--disabled-surfaceand--disabled-border— aliases onto--muted,--surface-2and--border, so the ramp gains nothing to keep in sync. - AddedThe floor is 3:1, and it has a second half.
- ChangedThe floor gate takes its subjects from every disabled selector in the sheet rather than from every rule that sets
opacity— a gate keyed on one technique goes silent the moment the technique changes. - ChangedThe accessibility floor page's disabled gap is retired: the ledger is gone and the ratchet states a real number.
- ChangedThe kit has three breakpoints, not six.
- AddedA gate over the convention.
- ChangedThe Layout and density guideline states the position on the two coincidences:
560is also--panel-lgand860is also--measure, and nothing marks it at the query.
- FixedThe three controls that sat under the kit's 24 × 24 CSS px target floor now reach it, and two of them did it without being redrawn.Targets
- ChangedThe target gate measures what a pointer can land on, not what the stylesheet draws.
- AddedThree tests that keep the new path honest
- ChangedThe accessibility floor page's target-size gap is retired — the exemption list is down to one entry, and that one is a story's own demo topbar rather than kit code.
- Added
docs/specification.md— what the kit ships, what it guarantees, what a consumer may rely on, and what it deliberately does not do. - Changed
docs/adr/is gone, and its reasoning was split by who needs it. - AddedA gate over documentation references.
- ChangedEvery stroked glyph in the kit is drawn at 1.5 CSS px or wider.
- AddedA gate that renders the kit rather than reading it.
- Added
.ui-field__errorsizes its glyph.
- FixedThe focus ring is the accent at full opacity, and it is declared once.Focus
- ChangedSeven
--ringdeclarations are gone — the light one intokens.cssand all six inaccents.css. - AddedThe accessibility floor page states a ring floor of 4.22:1 rather than a gap.
- ChangedThe table's row rhythm reads the spacing scale — the base rhythm as much as
--dense, because the base was as off-scale as the modifier it was being compared against.Table - ChangedThree of those numbers sat exactly between two steps — 14 between 12 and 16, 10 between 8 and 12, 6 between 4 and 8 — and where they did the tie goes to what the value is for.
- AddedA gate over the table's box spacing.
- AddedTwo scales for everything under the reading column, and the unit picks which one you are on.
- ChangedFive widths moved, none by much: the toast and its stack 400px → 420px (
--panel-md),.ui-section-head620px → 560px (--panel-lg), the feedback confirmation line 38ch → 44ch, the hero subtitle 52ch → 54ch and the shell subtitle 60ch → 62ch.ToastEmptyDeniedFeedbackHeroShell - ChangedThe measure gate's floor is the smallest panel step rather than
--measure, and it is still read out of the token file rather than written into the test — add a step below 320px and the floor follows it down. - FixedThe gate reads
style="…"attributes as CSS. - AddedA written position on breakpoints, which is the one width a token cannot express — a media query cannot read a custom property.
- ChangedThe two glyphs that carry a status are stroked heavier: the callout icon goes 1.8 → 2.1, the toast check 2 → 2.8.CalloutToast
- FixedThe callout icons take the text-grade
--chip-*-inkrather than the raw signal token.Callout - FixedA neutral toast's check is legible.Toast
- AddedA gate over twenty pairs — two glyph families × five statuses × both themes — each held to the bar its own stroke earns.
- Added
busyRegion({ label, readyLabel, busy, body, lines })andsetBusy(root, { busy, message, body })— a screen's pending state, and the first thing in the kit that announces one.Loading - Added
skeleton({ lines, width, height, radius })andskeletonTable({ rows, cols, head })— placeholder shapes that reserve the layout that is coming, so the page does not jump when the rows land.Loading - Added
deniedState({ title, sub, need, actions, icon })— the 403, drawn inemptyState()'s layout language, because to a reader the two are the same event: what you came for is not here.Denied - Added
.ui-sr, the visually-hidden utility the kit did not have. - AddedReact takes
busy.ButtonLoadingDenied - FixedThe Guidelines / The full state set page stops declaring this a gap.
- ChangedThe kit's page container is 1120px, down from 1180px.ContainerTopbarFooter
- Added
--containerand--measure— the two widths a page actually has. - FixedThe app shell states its reading width in one place.Shell
- AddedA gate fails on a literal page-scale
max-widthanywhere insrc/stylesor the site. - AddedA Guidelines / Layout and density page: the two widths, why one source beats two held in step, and where density comes from.
- FixedA status glyph and a close button no longer share a shape.ToastCallout
- Added
iconOnlyAllowed— the closed list of actions a control may drop its visible label for: close or dismiss, copy, overflow menu, expand or collapse.Button - Added
iconMeanings— what a glyph means when a component picks it for you rather than you naming it, covering the eight the kit wires to semantics. - Fixed
card,chartanddocare declared once each.Icons - AddedA Guidelines / Iconography page: when a control may go wordless, what a glyph means, and what adding one costs — naming, which group it belongs to, and where its path came from.
- FixedA toast's trailing action is readable on every status.Toast
- Added
--toast-action-ink— the trailing action's colour is its own custom property, set per status alongside--toast-accent.Toast - FixedThe React data table's sort caret is legible.DataTable
- FixedThe accent picker shows Nebula as the violet you actually get.Footer
- AddedThe kit has guidelines — five pages in Storybook under Guidelines, with an index that says what each covers and how many of its rules the kit actually meets.
- AddedTwo rules say the kit does not meet them yet, and name the issue tracking each.
- ChangedThe design rules left
CONTRIBUTING.md. - FixedThe wording guideline cited a button labelled
Revoke, which fails the test the rule states out loud — does the label make sense on its own?
- Added
appShell()— the kit has one page shell now.Shell - AddedThe rail folds to icons below 720px instead of disappearing.Shell
- Breaking
accountShell()is now a preset overappShell(), and its markup changed.Shell - Breaking
ACCOUNT_NAVis a list of{ id, icon, label }objects, not[id, icon, label]tuples.Shell - BreakingA nav label that arrives pre-escaped now shows its entity.Shell
- Breaking
crumbis escaped rather than inserted as HTML.Shell - Changed
subis a<p>, not a<div>.Shell - RemovedThe
.ui-sideand.ui-shellrules are gone from the stylesheet.Shell - FixedA rail label keeps the kit's own colour under a host stylesheet's
a:link. - FixedA badged rail row is announced with its count.
- FixedThe signed-in reader sits beside the rail's navigation, not inside it — a screen reader was announcing the reader's email address as a navigation entry.
- FixedA shell no longer names a reader you did not give it.Shell
- ChangedThe account menu's initials come from the display name when there is one, and from the address otherwise.
- Changed
ACCOUNT_NAVspells its ampersand as&rather than&.
- Breaking
drawer({ open: true })now really opens — the page behind goes inert, Tab is trapped in the panel, Escape closes it. - Added
confirm()— the question a page stops for before something irreversible. - FixedOpening a drawer puts the reader inside it.Drawer
- FixedTwo overlays open at once — two drawers, or a confirm over a drawer — no longer hide the whole page from assistive technology until a reload.
- ChangedNothing you can see. 0.9.0 shipped, and then two comments inside shipped stylesheets changed without a version bump, so the package on npm stopped matching the source.
- FixedReleasing no longer depends on someone remembering to do it.
- BreakingThe inline-icon reset is a floor again, not a ceiling.
- Added
footer(),success(),successCheck()andwireSuccess()are reachable from the package root. - Added
empty.cssships through/inline, so the empty-state styles reach anyone using the inline stylesheet rather than the built one. - FixedThe theme control reports the theme you are in, never the one a click would produce — in the glyph and in the accessible name, which is rewritten whenever the state changes.Topbar
- Fixed
--pinkclears the surfaces it is drawn on in both themes, and the live pill and info badge clear AA in light.BadgeCallout - FixedA glow wash is a tint of the colour it carries.
- FixedThe danger nav row is quiet at rest and turns
--pinkon hover, which is what the destructive-actions guideline says it should do. - ChangedColour contrast is measured rather than reviewed by eye.
- FixedThe zebra table recipe insets its own end cells, so a striped row no longer runs into the container border.Table
- FixedThe audience switcher on the homepage announces itself as a tablist and then behaves like one — roving tabindex, arrow keys,
aria-selected. - FixedThe Storybook toolbar selector works again, and the workbench stops composing stories from outside the kit.
- FixedReleases publish again.
- AddedReact components ship as
@apliteni/apliteni-ui/react— Button, Badge, Card, Icon, Modal and DataTable, with their own stylesheets and stories. - AddedGuidelines are a place in Storybook now, starting with destructive actions.
- AddedStorybook flips theme in one click instead of through a dropdown.
- FixedLight-mode Phoenix and Emerald were deepened to meet WCAG AA.
- FixedDanger is always
--pink, and colour comes from tokens rather than from literals scattered through the components. - FixedField errors are connected to their fields, decorative icons are hidden from assistive technology, every icon-only control has a name, and the accessibility gates that were meant to catch all of this actually run.Inputs
- ChangedThe icon set is unified on canonical Feather/Lucide glyphs, so the same idea is the same drawing everywhere.
- ChangedStorybook 8 → 10 and Vite 5 → 6.
- ChangedRelicensed as MIT (was proprietary/UNLICENSED).
- FixedTable row hover no longer collides with its container’s border —
.ui-table--hovernow draws the highlight as an inset, rounded pill (a few px clear of the edge) instead of a full-bleed rectangle. - ChangedHomepage polish: code-block Copy buttons morph a copy glyph into a checkmark on success (reduced-motion swaps instantly), bento icon tiles use larger crisp glyphs, and the footer gets a visible link hover plus an Apliteni → apliteni.com link.
- AddedTabs component —
tabs({ items, active, name })renders an accessible tablist + panels (framework-agnostic HTML string); wire it withinitTabs().
- ChangedTheme toggle is now a single icon-only switch — a compact sun/moon button (no "Light/Dark" text).
- RemovedAurora background — the
aurora()component and the.ui-bg-aurorabackdrop are gone. - AddedHomepage bento shows more of the kit — live Icons and Motion cells — and its blocks read as distinct panels (per-cell hue, no card hover).
- AddedMotion library — a small, token-driven set of reusable effects as plain classes: entrances (
.m-fade-in,.m-slide-up/-down/-left/-right,.m-scale-in,.m-blur-in), micro-interactions (.m-lift,.m-press,.m-skeleton), attention (.m-pulse,.m-shake,.m-draw) and staggered scroll reveals ([data-reveal]+ the optionalinitReveal()hook). - AddedOne global
prefers-reduced-motionrule that neutralises every animation and transition in the kit — closing gaps where the badge pulse and smooth scroll were previously unguarded — while letting one-shots settle on their final frame. - ChangedMotion now speaks the Apliteni brand vocabulary — durations and easings sync from design-system (
--duration-*/--easing-*); the kit’s--dur-*/--easealias onto them, with new--delay-1…5for staggering. - ChangedLanding “Built for people and agents alike” grid rebuilt as a bento with per-cell hues and no card hover, so the blocks read as distinct and the real controls inside each one no longer fight a card-level animation.
- AddedAmbient aurora background —
aurora()lays down drifting glow blobs plus an optional paper grain. - AddedAccessibility CI gate — every story runs through axe (WCAG 2.0/2.1 A + AA) under
npm test, so violations can’t regress. - AddedApliteni seedling on the Brand page alongside the kit prism, each with a size ramp.
- FixedResolved the WCAG A/AA violations the a11y panel flagged — real labels on every input, named listboxes,
select()factory. - FixedConsent-card brand lockup — the mark no longer jams against the label;
.brandis now self-contained outside the topbar. - FixedThe aurora CSS now ships through the inline / server-render bundle too (
/inlineexport, sitekit.css), not just the bundler entry. - ChangedCalmer Storybook manager chrome — purple reads as a sparing accent, not a wall.
- ChangedLight theme is now a true white app —
--bg/--surfaceboth#ffffffwith retuned neutrals, so downstream products stop forking CSS. - AddedFinance data-table treatment (
.ui-table--dense/--zebra/--hover,__num/__code) and the semantic status badges, promoted into the kit. - FixedLight cards get a hairline border + soft shadow so they read as panels on white; a too-wide table scrolls inside the card instead of bleeding past its corners.
- FixedActive segmented pill now sits inside its track — the heavy card shadow was spilling past the edge and reading as overflow.Segmented
- AddedGradient-bars busy loader on buttons — the button is disabled while it works.Button
- AddedCentered + glow Google-SSO sign-in, with idle / signing-in states.
- Added
--accent-strongtoken — primary buttons now clear WCAG AA contrast.Button - Added
--seg-active-bgtoken — the active segmented pill reads clearly in dark.Segmented - AddedGoogle-SSO-only sign-in story.
- FixedCard grids no longer misalign — spacing moved to
.ui-card-stack(the child margin leaked into rows).Card - ChangedRemoved the auto-generated Storybook “Docs” pages; intro wordmark reads apliteni-ui.
- FixedLarger feature icons; aligned landing preview cards; roomier hero.
- ChangedVersion moved to a nav pill; dropped the Strategy footer link.
- FixedEnlarged the consent scope + app-chip icons.
- FixedAccount menu stays hidden until the session is confirmed (
.acct.on).
- AddedFirst release — tokens, components, and the deck theme.
- AddedAccent sub-themes — Nebula, Phoenix, Ocean and Emerald — in dark and light.
- AddedStorybook workbench + the ui.apli.tech landing.