Changelog
Deprecations
Section titled “Deprecations”8 entries in the registry (generated/deprecations.json), generated from @deprecated JSDoc tags. Deprecated APIs keep working for one minor release.
| Kind | Component | Prop | Replacement | Since | Message |
|---|---|---|---|---|---|
| prop | Button | block | fullWidth | 0.4.0 | Use fullWidth instead (renamed in 0.4.0). block keeps working until 0.5.0. |
| prop | DatePicker | block | fullWidth | 0.4.0 | Use fullWidth instead (renamed in 0.4.0). block keeps working until 0.5.0. |
| component | Label | — | Tag | 0.4.0 | Use Tag instead (since 0.4.0). Tag now carries the same status variants
(success / danger / attention / muted / accent) and is read-only when onRemove is
absent, so one pill component covers both status words and removable chips — and the name no
longer collides with FormControl.Label. Label keeps rendering until 0.5.0. |
| prop | NumberInput | block | fullWidth | 0.4.0 | Use fullWidth instead (renamed in 0.4.0). block keeps working until 0.5.0. |
| prop | SegmentedControl | block | fullWidth | 0.4.0 | Use fullWidth instead (renamed in 0.4.0). block keeps working until 0.5.0. |
| prop | Select | block | fullWidth | 0.4.0 | Use fullWidth instead (renamed in 0.4.0). block keeps working until 0.5.0. |
| prop | TextInput | block | fullWidth | 0.4.0 | Use fullWidth instead (renamed in 0.4.0). block keeps working until 0.5.0. |
| prop | Textarea | block | fullWidth | 0.4.0 | Use fullWidth instead (renamed in 0.4.0). block keeps working until 0.5.0. |
All notable changes to tenet-ui are documented here. This project follows Semantic Versioning. Pre-1.0, breaking changes may land in a minor release.
0.4.0 — 2026-09-12
Section titled “0.4.0 — 2026-09-12”tenet-ui now lives in its own repository (apurvkhare/tenet-ui) with a docs site, a Storybook, an icon set, an ESLint plugin, and a type-derived catalog. This release also carries the first deliberate deprecations, so consumers (and tooling) can exercise a migration path.
- Heading — levels 1–4 mapped to the type scale (
--fontSize-5/4/3/2),asto decouple the element from the size,truncate. - Text — body copy with
size,tone,weight,as,truncate,align. - Grid — CSS-grid layout primitive next to
Stack:columns(number or{ base, sm, md, lg }),gap/rowGapfrom the space scale,Grid.Item span. - Icon and the icon set (
tenet-ui/icons) — a curated subset of Lucide (ISC) re-packaged as React components:size16 | 20 | 24, decorative by default,labelmakes an icon meaningful (role="img"). The manifest ships asgenerated/icons.jsonfor tooling (icon search, docs gallery). - EmptyState — title, description, decorative icon, primary and secondary actions; composes Heading, Text and Stack.
- Tag gains the status variants
success,danger,attention,mutedand is the read-only status pill whenonRemoveis absent (see Deprecated). - Tokens:
fontSize.5(36px display),lineHeight.tight/.default,breakpoint.sm/.md/.lg. EveryfgColor.*token now carries machine-readable contrast pairs in$extensions.tenet.contrast(aaandaaLargelists ofbgColor.*tokens), copied todist/tokens.jsonascontrastand verified at build time (a pair that stops meeting its rating fails the build). - Catalog:
generated/components.json(schema 2) is now derived from the TypeScript types (props, defaults, JSDoc@default/@deprecated, story ids), plus a small hand-kept<Name>.meta.jsonper component (status,a11yReviewed, subcomponent → interface mapping,related). Newgenerated/deprecations.json(the migration registry) andgenerated/guidelines/(per-component and system guidelines, shipped in the tarball). - System guidelines in
guidelines/system/: color, typography, layout, forms, feedback, data display, iconography, accessibility, content. - Storybook (React + Vite) with a light/dark toolbar, play functions on the
interactive components,
scripts/check-a11y.mjs(axe over every story in both themes),scripts/build-baselines.mjs(per-story screenshots at 1280, both themes, with a manifest) andscripts/check-story-ids.mjs. - Docs site (
docs/, Astro Starlight) generated from the repo: getting started, tokens, components with live examples, icons, foundations, changelog; emitsllms.txt,llms-full.txt,llms-small.txt. - eslint-plugin-tenet-ui (
packages/eslint-plugin):no-raw-color,no-raw-spacing,no-unknown-token,prefer-component,require-styles-import,no-deprecated-api. package.jsongainsrepository,homepage,bugs, and the exports./icons,./generated/icons.json,./generated/deprecations.json.
Deprecated (still working; removed in 0.5.0)
Section titled “Deprecated (still working; removed in 0.5.0)”- The
blockprop is renamedfullWidthonButton,TextInput,Textarea,NumberInput,Select,SegmentedControlandDatePicker.blockkeeps working with a one-time dev warning;fullWidthwins when both are passed. Codemod:sed -i '' 's/\bblock\b/fullWidth/'on JSX props, oreslint --fixwith thetenet-ui/no-deprecated-apirule. Label→Tag.Tagnow covers the read-only status pill, so one component owns both status words and removable chips, and the name no longer collides withFormControl.Label.<Label variant="x">becomes<Tag variant="x">(same variant names).Labelrenders unchanged with a dev warning.
Changed
Section titled “Changed”- Component folders follow one convention:
<Name>.tsx,.types.ts,.css,.stories.tsx,.guidelines.md(moved fromguidelines/<name>.md, with frontmatter) and.meta.json(replaces.docs.json). - The runtime contract is one stylesheet:
import 'tenet-ui/styles.css'(src/index.tsused to saytokens.css). - Stories import from
@storybook/react-vite.
0.3.0 — 2026-06-23
Section titled “0.3.0 — 2026-06-23”Hardening pass from a systematic audit (accessibility, CSS/layout, and API reviews across all components, plus a runtime sweep at multiple viewports and in both themes).
Changed (potentially breaking)
Section titled “Changed (potentially breaking)”- Table now renders its
<table>inside a<div class="Tenet-Table__scroll">scroll viewport so wide tables scroll horizontally instead of being clipped. Update any CSS that assumed<table>was a direct child of.Tenet-Table__container. - Overlays (
Menu,Select,Popover,DatePicker,Tooltip) now render their floating layer in a portal todocument.body, positioned to the viewport (so they can’t be clipped by anoverflow:hiddenancestor or run off-screen). Overlayz-indexis now150(aboveDialog’s100, belowToast’s200). Theming assumesdata-color-modeis on<html>/<body>.
Textareagains asizescale (small | medium | large) to match the other fields.SelectandSegmentedControlnow extend their host element’s HTML attributes and forward...rest(sodata-*,style,onBlur, etc. pass through).- New semantic token
--bgColor-backdrop(modal scrim), themed. ToastEntrytype is now exported.
- Accessibility:
aria-describedbyis merged (not overwritten) inRadio,RadioGroup, andTooltip;Menu/Popovercompose the caller’sonClick/onKeyDown/refon the trigger instead of clobbering them. - Dialog no longer hides notification layers (
Toast) from screen readers while open (layers markeddata-tenet-layerare skipped in itsaria-hiddensweep). - Layout: long labels in
Menu/Selectand longAccordiontitles now ellipsize/wrap instead of spilling;Paginationwraps at narrow widths; a globalbox-sizing: border-boxreset (scoped to tenet-ui elements) preventswidth:100%+padding overflow (e.g. fields inside aDialog). - Tokens:
Dialogbackdrop andSwitchfocus ring now use tokens instead of hardcoded values. docs.jsoncatalog drift fixed (Checkboxinvalid/indeterminate,SelectclassName,Textareasize).
0.2.0 — 2026-06-21
Section titled “0.2.0 — 2026-06-21”- “Editorial Ink” visual identity (token-layer rebrand) across light and dark.
- Expanded to 36 components.
- Dual-package correctness: per-condition
typesinexports(ESM.d.ts/ CJS.d.cts),engines.node >= 18. publint + @arethetypeswrong/cli clean.
0.1.0 — 2026-06-21
Section titled “0.1.0 — 2026-06-21”- Initial release: design tokens + React component library.