Skip to content

feat: Blits UI foundation — Hello World, tenant fonts, state/storage, Nx 23 - #3

Merged
skdonthi merged 5 commits into
mainfrom
feat/blits-hello
Jul 1, 2026
Merged

feat: Blits UI foundation — Hello World, tenant fonts, state/storage, Nx 23#3
skdonthi merged 5 commits into
mainfrom
feat/blits-hello

Conversation

@skdonthi

@skdonthi skdonthi commented Jul 1, 2026

Copy link
Copy Markdown
Owner

Summary

Blits UI foundation on top of the CCL production baseline.

  • Nx 21.6 → 23.0 via nx migrate; removed the obsolete NX_ISOLATE_PLUGINS=false workaround from all scripts.
  • Tenant-driven fonts (MSDF) — font set declared in customers/<line>/config.json (fonts), files tenant-owned in customers/<line>/public/fonts. build-tv materializes the active tenant's public/ into the app before Vite (Blits' msdf generator scans <appRoot>/public), so only the active brand's assets ship. CCL uses Tempo Std (headings) + Open Sans (body) from the legacy app.
  • State & storage — new @x-tv/storage lib: createStorage(namespace), namespaced (xtv.<ns>.) persistence over Blits' storage plugin with in-memory fallback, usable anywhere. Registered Blits appState plugin (global reactive state, seeded from config). Migrated deviceId to it. Dropped unused zustand.
  • Hello World screen — Blits component rendering "Hello World" + a caption from this.$appState (customer · platform · locale). Builds into deployable .wgt/.ipk to verify the pipeline on real hardware.
  • Docsdocs/state-and-storage.md (state layers + persistence + decision guide); linked from CLAUDE.md + README.

Verification

typecheck · 9 vitest tests · Biome (98 files) · all three platforms build (.wgt + sssp_config.xml, .ipk; Android .apk needs gradle).

Per-brand isolation preserved (a CCL bundle carries no other-tenant tokens/assets).

Shiva Krishna D added 5 commits July 1, 2026 14:03
- nx migrate 21.6.11 -> 23.0.1 (9 migrations applied clean).
- Remove NX_ISOLATE_PLUGINS=false from all scripts — builds (single +
  run-many) work without it on Nx 23; the plugin-isolation workaround is
  obsolete.
- Fonts are tenant-declared (customers/<line>/config.json `fonts`: default +
  families) and tenant-owned (customers/<line>/public/fonts). build-tv
  materializes the active tenant's public/ into the app before Vite (Blits'
  msdf generator scans <appRoot>/public), so only the active brand's assets
  ship. runtime-config exposes FontSet; core drives Blits.Launch fonts from it.
- New @x-tv/storage lib: createStorage(namespace) — namespaced (xtv.<ns>.)
  persistence over Blits' storage plugin with in-memory fallback, usable
  anywhere (bootstrap, libs, components). device-info deviceId migrated to it.
- Register Blits appState plugin in core (seeded from config) for global
  reactive state. Drop unused zustand dependency.
Root Blits app renders a HelloWorld component (Tempo Std headline, Open Sans
caption echoing customer · platform · profile) — a deployable screen to
confirm the .wgt/.ipk pipeline on a real TV. Uses the tenant brand fonts.
HelloWorld now reads global reactive state (this.$appState — customer,
platform, locale, seeded in core) via a computed, instead of a passed prop.
Demonstrates the appState wiring end to end.
@skdonthi
skdonthi merged commit e6a8bd5 into main Jul 1, 2026
2 checks passed
@skdonthi
skdonthi deleted the feat/blits-hello branch July 1, 2026 12:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant