Releases: teamblind/chorus
@teamblind-chorus/ui@1.2.0
Minor Changes
- d738b50: list/standard: add a per-row embedded
bannerslot. A Standard List row now
accepts anitem.bannerholding a<Banner>, rendered below the row's text
group at the row's full content width (sys.layout.stack.xs/ 8px gap). The row
stacks (text group over Banner) and the Banner is a nested-action region — its
own controls never commit the row and the row's hover/pressed overlay is
suppressed over it. Ships the matchingchorus-list__bannerstyles.
@teamblind-chorus/ui@1.1.0
@teamblind-chorus/ui
1.0.1
Patch Changes
- 3895b63: Verify the release pipeline publishes via OIDC trusted publishing (no NPM_TOKEN). No runtime changes — this patch exercises the OIDC publish path end-to-end and confirms provenance attestation for both packages.
- Updated dependencies [3895b63]
- @teamblind-chorus/tokens@1.0.1
1.0.0
Major Changes
- 29b4e9b: Rename npm scope from
@blind-dsaito@teamblind-chorus. First release under the new scope, starting at 1.0.0.
Patch Changes
- Updated dependencies [29b4e9b]
- @teamblind-chorus/tokens@1.0.0
0.12.0
Minor Changes
- 2f81abd: Badge role gains the
inverseappearance —<Badge variant="role" appearance="inverse">PRO</Badge>— the high-contrast inverseSurface pair reserved for the PRO mark on paid professional users. The one-badge-per-nickname contract is now explicit: exactly one role badge may ride the nickname. - d6d80d0: NavigationBar sub: side slots are per-side choices (each optionally a Text Button, Icon Button, or Toolbar Button / text link) and the title is now optional — title-less bars render a non-heading placeholder so the side slots hold their grid columns. Documented composer pattern: leading default Text Button (Cancel) dismisses, trailing accent Text Button (Post) commits, no page title.
0.11.0
Minor Changes
- Badge family splits into
update(the existing count pill / dot, still the default) and the newrolesub —<Badge variant="role">Verified</Badge>, a tonal primaryContainer identity pill (10px label, 16px rung, radius.full) naming a user's role or title in English (Channel owner, Verified). Metadata's meta row drops the@prefix convention (the trailing item is the bare nickname) and object meta items gain abadgefield that renders a presentational mark after the nickname link, outside the<a>— the role badge's canonical seat.
0.10.0
Minor Changes
- 2cf2df2: Ship a paste-ready Chorus reconstruction prompt at
@teamblind-chorus/ui/agents/reconstruct.md. It converts ad-hoc / agent-invented UI into pure Chorus — inventory non-Chorus components, route each intent throughcatalog.md, rebuild with real components + tokens (honoring slot grammar and the layout contract), then enforce via the@teamblind-chorus/ui/eslintpreset and the rail self-diagnostic.
0.9.0
Minor Changes
-
da0d65c: Typography utility classes + deterministic Chorus-First lint preset
- tokens:
tokens.cssnow emits.sys-typo-<role>-<rung>utility classes (5 roles × 3 rungs) that bundle font-family + size + weight + line-height + tracking. There is no CSSfontshorthand token (the shorthand can't carry letter-spacing); applyclassName="sys-typo-body-md"instead of wiring the four leaf vars by hand. - ui: new
@teamblind-chorus/ui/eslintflat-config preset — the deterministic backstop for "Chorus First". It fails consumer builds on raw hex, Tailwind color utilities, shadcn@/components/ui/*imports, raw<button>/<a>CTAs, and off-scale inline spacing/typography, independent of whether the agent guide was loaded.
- tokens:
Patch Changes
- Updated dependencies [da0d65c]
- @teamblind-chorus/tokens@0.4.0
0.8.0
Minor Changes
-
Add an optional
statusBarprop to ProfileHeader for edge-to-edge / immersive profile screens.Pass
statusBar(canonical 9:41) orstatusBar={{ time: '…' }}to paint an iOS-style app status bar (time + cellular / Wi-Fi / battery glyphs) above the overlay NavigationBar, at the very top of the cover. The status bar has a transparent fill and fixed-white (ref.palette.white.1000) glyphs, so the cover image shows through the OS-chrome zone — the same "image provides the contrast" contract as the overlay nav.The overlay nav and status bar now stack in a shared
chorus-profile-header__overlaycolumn. When the status bar is present it paysenv(safe-area-inset-top)and the overlay nav collapses its own top inset so the two sit flush below the notch instead of double-stacking. The region is decorative OS-chrome mimicry:aria-hidden, intentionally off-token (raw px +-apple-systemfont), like the docs IOSKeyboard mock. Off by default — existing ProfileHeader usage is unchanged.
0.7.0
Minor Changes
-
cfa89f5: Add two composite list components and unify the optional-header contract across SuggestionList / Carousel.
New components:
DirectoryList— vertical follow-roster (<Header />+<List variant="entry" size="large" />). Sibling of SuggestionList: same entity-agnostic row anatomy (avatar + identity + trailing Toggle Button) but no swipeable pager — the full set is scanned vertically at thelarge(48 avatar) rung. Reach for it on browse / "new channels" / "people you may know" surfaces.NavList— vertical label-only nav block (<Header />+<List variant="nav" />). Each row is a route target; trailing chevron supplied by the nav variant. Reach for it on category indexes, settings menus, and any "pick a sub-page" surface where no leading thumbnail belongs.
Both wrappers share the SuggestionList surface chrome (
surfacefill,container.lgblock /container.mdinline padding,stack.md(16) header-to-list gap) and force the inner List into embedded mode so the wrapper owns the rail. Rows keep the list-family-defaultcontainer.mdinline padding for the touch target and addmargin-inline: -container.mdso the visible avatar / label lines up with the header label at 16 from the surface — same alignment trick SuggestionList uses for its page rows.Header contract unified across composite blocks:
SuggestionList,Carousel(PostCarousel,ProfileCarousel):labelis required; the optionalheaderActionextends the header with a trailingaccentText Button when there's an index page to route to. The previously-documentedno headerandno header actionvariants are removed — every composite block now carries a label.Text Buttondocs:Accentis promoted out of "Use cases" to a top-level type/appearance section directly underDefault, matching the other appearance variants.
-
ca53c95: Three correctness fixes for the 0.5.0 typed surface, plus two domain renames and eight industry-standard component aliases so AI consumers (Lovable, Cursor, v0) reach the right component on first try.
Correctness fixes (the 0.5.0 regressions):
- Fix discriminated-union narrowing on multi-sub families. In 0.5.0 the
variantliteral was emitted as optional on every sub (e.g.FormFieldSearchProps.variant?: "search"), so<FormField variant="search" …>did not narrow underif (props.variant === "search")andFormFieldPropscollapsed structurally back toward the input shape. The generator now marksvariantoptional only on the family's default sub (the one runtime defaults to) and required on every other sub, soFormField / NavigationBar / Tabs / Chip / Button / Listprops narrow correctly. This was the headline regression from the 0.5.0 release. - Emit
dist/index.d.ctsanddist/icons/index.d.cts. UndermoduleResolution: node16/bundler, CJS consumers resolve types from.d.cts, not.d.ts. 0.5.0 only shipped.d.ts, so CJS-typed consumers got "no types" silently.package.jsonexportsnow declarestypesper condition (import → .d.ts,require → .d.cts). - Thread the spec's
elementthroughRefAttributes<…>. 0.5.0 typed every export'srefasHTMLElement. NowButtonexposesHTMLButtonElement,FormField/input/searchexposeHTMLInputElement, etc., souseRef<HTMLButtonElement>()on the receiving end keeps its type through the component boundary.
Domain renames (canonical name moves; old names stay as deprecated runtime + type aliases via
spec.exportAlias):ChannelList→SuggestionList. The anatomy is "swipeable pager of follow-suggestion rows (avatar + name + meta lines + Follow toggle)" — entity-agnostic. The oldchannel-listwas a misleading domain word.ChannelRail→AvatarRail. Horizontal avatar+label entry rail —avatar-raildescribes the shape directly.- Both schema folders are renamed (
schema/components/{suggestion-list,avatar-rail}/); all references acrossmanifest.json,catalog.md,AGENTS.md,LOVABLE.md, screen recipes, agent guides, and docs site are updated. CSS class names (chorus-channel-list→chorus-suggestion-list,chorus-channel-rail→chorus-avatar-rail) renamed instyles.css.
Industry-standard aliases (declared via the new
spec.exportAliasfield; each emits an extra<Alias>Props = Omit<SourceProps, "variant">so thevariantdiscriminator stays out of the alias surface):Sheet←BottomSheet(shadcn naming)Alert←Banner(shadcn naming)Avatar←Thumbnail(shadcn / Material naming)AppBar←NavigationBar / home(Material naming)BottomNav←TabBar(Material naming)Input←FormField / input(drops thevariant="input"boilerplate)SearchBar←FormField / searchSelect←FormField / select
Build / generator polish (rolled into the same release):
build-types.mjsnow reusesloadManifest/loadFamily/readJsonfromschema/lint/— one walker shared with the validators, noreaddirSyncscan that could pick up specsfamily.jsondeliberately omits.tsupno longer spawns a fresh Node to run the generator; it imports it via a URL-hoppedawait import()so cwd is irrelevant and the build saves ~120ms.extractExportsnow warns when it seesexport default/export *(today a no-op in this package; future drift will be loud rather than silently shrinking the typed surface).family.schema.json'svisualReusedescription is now a one-liner that points atAGENTS.md§ Design principles — no more 700 chars of policy prose duplicated inside a JSON Schema.spec.schema.jsonadds theexportAliasfield (s...
- Fix discriminated-union narrowing on multi-sub families. In 0.5.0 the
@teamblind-chorus/ui@1.0.1
@teamblind-chorus/ui@1.0.0
@teamblind-chorus/tokens@1.0.1
Patch Changes
- 3895b63: Verify the release pipeline publishes via OIDC trusted publishing (no NPM_TOKEN). No runtime changes — this patch exercises the OIDC publish path end-to-end and confirms provenance attestation for both packages.
@teamblind-chorus/tokens@1.0.0
Major Changes
- 29b4e9b: Rename npm scope from
@blind-dsaito@teamblind-chorus. First release under the new scope, starting at 1.0.0.