feat(display): @circuitforge/display strip-display Vue package #74

Closed
pyr0ball wants to merge 0 commits from feat/69-display-package into main
Owner

Summary

  • New packages/display/ npm package (@circuitforge/display, v0.1.0) - Vue 3 primitives for the strip display spec (1920x480 landscape / 480x1920 portrait kiosk). First non-Python module in this repo.
  • Packaged separately from the Python circuitforge-core distribution (per user decision on the packaging question the ticket itself raised) so products that don't use a strip display never pull in Vue as a dependency, and Vue component API changes don't force a PyPI version bump or vice versa.
  • Components: DisplayLayout (orientation-aware grid, identity zone, theme, slots), DisplayMetric (value/label/sparkline/severity), DisplayAlert (timestamped severity row), DisplayMacroButton (touch target emitting shell/url/api/display_switch action payloads - execution stays product-side).
  • src/theme.ts is the central theme file (CSS custom properties, dark-default) plus UnoCSS fragments for products already running UnoCSS (Turnstone, Robin) to merge into their own uno.config.ts.
  • launcher/launcher.html: static, framework-free product switcher per the spec.
  • Root README gains a short section pointing at the package; mkdocs Developer Guide gains a page on why it's a separate package and a build gotcha (Vite's emptyOutDir wiping vue-tsc's .d.ts output - fixed via emptyOutDir: false).
  • Did not bump circuitforge-core's Python version/CHANGELOG.md - this package has its own independent npm semver (0.1.0) and touches no Python code.

First consumer: Turnstone's sysadmin profile (turnstone#25, currently blocked on this ticket).

Closes #69

Test plan

  • npm test (Vitest) - 37/37 passed across all four components
  • npx vue-tsc --noEmit - clean
  • npm run build - produces ESM/CJS bundles + CSS + .d.ts correctly
## Summary - New packages/display/ npm package (@circuitforge/display, v0.1.0) - Vue 3 primitives for the strip display spec (1920x480 landscape / 480x1920 portrait kiosk). First non-Python module in this repo. - Packaged separately from the Python circuitforge-core distribution (per user decision on the packaging question the ticket itself raised) so products that don't use a strip display never pull in Vue as a dependency, and Vue component API changes don't force a PyPI version bump or vice versa. - Components: DisplayLayout (orientation-aware grid, identity zone, theme, slots), DisplayMetric (value/label/sparkline/severity), DisplayAlert (timestamped severity row), DisplayMacroButton (touch target emitting shell/url/api/display_switch action payloads - execution stays product-side). - src/theme.ts is the central theme file (CSS custom properties, dark-default) plus UnoCSS fragments for products already running UnoCSS (Turnstone, Robin) to merge into their own uno.config.ts. - launcher/launcher.html: static, framework-free product switcher per the spec. - Root README gains a short section pointing at the package; mkdocs Developer Guide gains a page on why it's a separate package and a build gotcha (Vite's emptyOutDir wiping vue-tsc's .d.ts output - fixed via emptyOutDir: false). - Did not bump circuitforge-core's Python version/CHANGELOG.md - this package has its own independent npm semver (0.1.0) and touches no Python code. First consumer: Turnstone's sysadmin profile (turnstone#25, currently blocked on this ticket). Closes #69 ## Test plan - [x] npm test (Vitest) - 37/37 passed across all four components - [x] npx vue-tsc --noEmit - clean - [x] npm run build - produces ESM/CJS bundles + CSS + .d.ts correctly
pyr0ball added 1 commit 2026-07-10 18:29:47 -07:00
feat(display): add @circuitforge/display strip-display Vue package
Some checks failed
CI / test (pull_request) Has been cancelled
6d82f3561f
New packages/display/ — Vue 3 primitives for products running a secondary
1920x480 landscape / 480x1920 portrait kiosk display, per the strip display
spec. First non-Python module in this repo; published as its own npm
package (not part of the Python circuitforge-core distribution) so products
that don't use a strip display never pull in Vue as a dependency.

- DisplayLayout — root wrapper: identity zone, orientation-aware grid
  (landscape/portrait), dark-default theme, #metrics/#alerts/#macros slots.
- DisplayMetric — value/label tile with optional unit, severity colour,
  sparkline.
- DisplayAlert — timestamped, severity-coloured alert row.
- DisplayMacroButton — touch target (44px+ min) emitting a
  shell/url/api/display_switch action payload; execution stays product-side.
- theme.ts — central theme file: CSS custom properties (dark/light) plus
  UnoCSS theme/shortcut fragments for products that already run UnoCSS
  (Turnstone, Robin) to spread into their own uno.config.ts.
- launcher/launcher.html — static, framework-free product switcher reading
  a sibling launcher.config.json.

37 Vitest tests across all four components; vue-tsc type-checks clean;
vite build produces ESM/CJS bundles + CSS + .d.ts.

First consumer: Turnstone's sysadmin profile (turnstone#25, currently
blocked on this ticket).

Closes: #69
Author
Owner

Merged into main via the freeze/0.22.0 integration branch (fast-forward) and released as v0.22.0: https://git.opensourcesolarpunk.com/Circuit-Forge/circuitforge-core/releases/tag/v0.22.0. Closing since the commits are already on main.

Merged into main via the freeze/0.22.0 integration branch (fast-forward) and released as v0.22.0: https://git.opensourcesolarpunk.com/Circuit-Forge/circuitforge-core/releases/tag/v0.22.0. Closing since the commits are already on main.
pyr0ball closed this pull request 2026-07-10 19:21:29 -07:00
Some checks failed
CI / test (pull_request) Has been cancelled

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/circuitforge-core#74
No description provided.