Skip to content

Releases: teamblind/chorus

@teamblind-chorus/ui@1.2.0

17 Jun 07:06
75a10a1

Choose a tag to compare

Minor Changes

  • d738b50: list/standard: add a per-row embedded banner slot. A Standard List row now
    accepts an item.banner holding 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 matching chorus-list__banner styles.

@teamblind-chorus/ui@1.1.0

16 Jun 10:26
e41198e

Choose a tag to compare

@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-dsai to @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 inverse appearance — <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 new role sub — <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 a badge field 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 through catalog.md, rebuild with real components + tokens (honoring slot grammar and the layout contract), then enforce via the @teamblind-chorus/ui/eslint preset and the rail self-diagnostic.

0.9.0

Minor Changes

  • da0d65c: Typography utility classes + deterministic Chorus-First lint preset

    • tokens: tokens.css now emits .sys-typo-<role>-<rung> utility classes (5 roles × 3 rungs) that bundle font-family + size + weight + line-height + tracking. There is no CSS font shorthand token (the shorthand can't carry letter-spacing); apply className="sys-typo-body-md" instead of wiring the four leaf vars by hand.
    • ui: new @teamblind-chorus/ui/eslint flat-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.

Patch Changes

  • Updated dependencies [da0d65c]
    • @teamblind-chorus/tokens@0.4.0

0.8.0

Minor Changes

  • Add an optional statusBar prop to ProfileHeader for edge-to-edge / immersive profile screens.

    Pass statusBar (canonical 9:41) or statusBar={{ 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__overlay column. When the status bar is present it pays env(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-system font), 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 the large (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 (surface fill, container.lg block / container.md inline 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-default container.md inline padding for the touch target and add margin-inline: -container.md so 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): label is required; the optional headerAction extends the header with a trailing accent Text Button when there's an index page to route to. The previously-documented no header and no header action variants are removed — every composite block now carries a label.
    • Text Button docs: Accent is promoted out of "Use cases" to a top-level type/appearance section directly under Default, 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 variant literal was emitted as optional on every sub (e.g. FormFieldSearchProps.variant?: "search"), so <FormField variant="search" …> did not narrow under if (props.variant === "search") and FormFieldProps collapsed structurally back toward the input shape. The generator now marks variant optional only on the family's default sub (the one runtime defaults to) and required on every other sub, so FormField / NavigationBar / Tabs / Chip / Button / List props narrow correctly. This was the headline regression from the 0.5.0 release.
    • Emit dist/index.d.cts and dist/icons/index.d.cts. Under moduleResolution: 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.json exports now declares types per condition (import → .d.ts, require → .d.cts).
    • Thread the spec's element through RefAttributes<…>. 0.5.0 typed every export's ref as HTMLElement. Now Button exposes HTMLButtonElement, FormField/input/search expose HTMLInputElement, etc., so useRef<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):

    • ChannelListSuggestionList. The anatomy is "swipeable pager of follow-suggestion rows (avatar + name + meta lines + Follow toggle)" — entity-agnostic. The old channel-list was a misleading domain word.
    • ChannelRailAvatarRail. Horizontal avatar+label entry rail — avatar-rail describes the shape directly.
    • Both schema folders are renamed (schema/components/{suggestion-list,avatar-rail}/); all references across manifest.json, catalog.md, AGENTS.md, LOVABLE.md, screen recipes, agent guides, and docs site are updated. CSS class names (chorus-channel-listchorus-suggestion-list, chorus-channel-railchorus-avatar-rail) renamed in styles.css.

    Industry-standard aliases (declared via the new spec.exportAlias field; each emits an extra <Alias>Props = Omit<SourceProps, "variant"> so the variant discriminator stays out of the alias surface):

    • SheetBottomSheet (shadcn naming)
    • AlertBanner (shadcn naming)
    • AvatarThumbnail (shadcn / Material naming)
    • AppBarNavigationBar / home (Material naming)
    • BottomNavTabBar (Material naming)
    • InputFormField / input (drops the variant="input" boilerplate)
    • SearchBarFormField / search
    • SelectFormField / select

    Build / generator polish (rolled into the same release):

    • build-types.mjs now reuses loadManifest / loadFamily / readJson from schema/lint/ — one walker shared with the validators, no readdirSync scan that could pick up specs family.json deliberately omits.
    • tsup no longer spawns a fresh Node to run the generator; it imports it via a URL-hopped await import() so cwd is irrelevant and the build saves ~120ms.
    • extractExports now warns when it sees export default / export * (today a no-op in this package; future drift will be loud rather than silently shrinking the typed surface).
    • family.schema.json's visualReuse description is now a one-liner that points at AGENTS.md § Design principles — no more 700 chars of policy prose duplicated inside a JSON Schema.
    • spec.schema.json adds the exportAlias field (s...
Read more

@teamblind-chorus/ui@1.0.1

12 Jun 04:02
ea828cc

Choose a tag to compare

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

@teamblind-chorus/ui@1.0.0

12 Jun 02:17
4033beb

Choose a tag to compare

Major Changes

  • 29b4e9b: Rename npm scope from @blind-dsai to @teamblind-chorus. First release under the new scope, starting at 1.0.0.

Patch Changes

  • Updated dependencies [29b4e9b]
    • @teamblind-chorus/tokens@1.0.0

@teamblind-chorus/tokens@1.0.1

12 Jun 04:02
ea828cc

Choose a tag to compare

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

12 Jun 02:17
4033beb

Choose a tag to compare

Major Changes

  • 29b4e9b: Rename npm scope from @blind-dsai to @teamblind-chorus. First release under the new scope, starting at 1.0.0.