openova/products/catalyst
e3mrah 245b359057
feat(ui): theme toggle + card cosmetics (refs #179) (#225)
* feat(ui): add light/dark theme toggle in PortalShell header

Mount ThemeToggle (sun/moon icon button) in the top-right of every
PortalShell page (Sovereign Apps, Jobs, AppDetail, JobDetail). Click
flips the `data-theme` attribute on `<html>` and persists to
`localStorage['oo-theme']`, in lockstep with the existing bootstrap
script in index.html and the useTheme hook.

Light theme palette: extend [data-theme="light"] in globals.css with
peers for every console token (--color-bg, --color-bg-2, --color-text,
--color-text-strong, --color-text-dim, --color-text-dimmer,
--color-border, --color-border-strong, --color-surface,
--color-surface-hover, --color-accent, --color-accent-hover,
--color-warn, --color-danger, --color-success). All ratios are
WCAG AA-or-better against --color-bg = #ffffff:
  text-on-bg          17.85:1  AAA
  text-strong-on-bg   20.17:1  AAA
  text-dim-on-bg       7.58:1  AAA
  text-dimmer-on-bg    4.76:1  AA
  accent-on-bg         5.17:1  AA
  danger-on-bg         6.47:1  AAA
  warn-on-bg           5.02:1  AA
  success-on-bg        5.48:1  AA

Two cosmetic-guard regression tests are added:
  • theme-toggle is present in PortalShell header
  • clicking theme-toggle flips data-theme on the html element +
    persists to localStorage[oo-theme]

Refs #179.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(wizard): card description = 2 lines, + bubble floats over body

Two regressions on the StepComponents grid (#179):

1) Some cards rendered with a 1-line description because the
   .corp-comp-desc rule clamped at 2 lines but did NOT reserve 2
   lines of vertical space. Short descriptions collapsed the card
   body by ~14px and pulled the chip row (line 4) up, leaving the
   chips on a visibly ragged Y across the grid.

   Fix: add `min-height: 2.5em` to .corp-comp-desc. Computed value
   = 2.5 × 0.76rem × 1.4 lh × 16px = 30.4px reserved height — every
   card now hosts 2 lines of description even when the actual copy
   is one line. Verified: chipsY identical at 523.1 / 641.5 / 759.8
   across each row of three cards on the choose-stack grid.

2) The right ¼ of every card body was effectively empty because
   the inline "+" Add button shared line 1 with the family chip,
   reserving horizontal space the description never got to use.

   Fix: lift the toggle button out of .corp-comp-body and absolute-
   position it at top: 0.5rem; right: 0.5rem; z-index: 10 so it
   OVERLAYS the description's top-right corner instead of reserving
   width. Lines 2-3 (description) now span the full body width.

Acceptance:
  • All 93 StepComponents.test.tsx unit tests still pass
  • All 17 cosmetic-guard tests still pass (16 unrelated failures
    are pre-existing on origin/main, sibling agent territory)
  • New cosmetic-guard test "every component card has min-h:108px
    and 2-line description" added (asserts webkitLineClamp === '2',
    descBox.height ≥ 26px, chip-row Y spread ≤ 2px within a row)

Refs #179.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: hatiyildiz <hatice.yildiz@openova.io>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 07:00:21 +02:00
..
bootstrap feat(ui): theme toggle + card cosmetics (refs #179) (#225) 2026-04-30 07:00:21 +02:00
chart deploy: update catalyst images to 2d0ea7c 2026-04-29 19:43:32 +00:00
README.md feat(consolidation): Phase 1 — move Catalyst-Zero apps + CI + manifests into public monorepo 2026-04-28 12:08:09 +02:00

OpenOva Catalyst (composite Blueprint)

The umbrella Blueprint bp-catalyst-platform — composes the Catalyst control plane.

Status: Deployed. Updated: 2026-04-28.

This product directory contains:

  • chart/ — the Helm chart that deploys Catalyst-Zero on a Kubernetes cluster (and every franchised Sovereign).
  • chart/templates/{ui,api}-deployment.yaml + service + ingress — the catalyst-ui (React SPA wizard scaffold) and catalyst-api (Go bootstrap API) workloads.
  • chart/templates/sme-services/ — 11 manifests for the legacy SME backend services + the consolidated console, admin, marketplace UI workloads (sourced from core/{console,admin,marketplace}/).
  • chart/templates/marketplace-api/ — manifests for the Go marketplace-api backend (sourced from core/marketplace-api/).
  • bootstrap/{ui,api}/ — the source code for catalyst-ui and catalyst-api (deployed via the catalyst-build CI workflow).

For the unified architecture and the wizard's target shape, see docs/PROVISIONING-PLAN.md, docs/ARCHITECTURE.md, and docs/SOVEREIGN-PROVISIONING.md.


How Catalyst-Zero is deployed today

A Flux Kustomization on the Catalyst-Zero cluster (Contabo k3s) reconciles products/catalyst/chart/templates/ from this public repo. CI workflows (.github/workflows/{catalyst,console,admin,marketplace,marketplace-api}-build.yaml) build and push images on every push to main, then the deploy step pins the image SHA into the corresponding manifest in this directory and commits back. Flux picks up the commit and rolls the deployment.

Image registry: ghcr.io/openova-io/openova/{catalyst-ui,catalyst-api,console,admin,marketplace,marketplace-api}:<sha>.

Migration status (per docs/PROVISIONING-PLAN.md)

Component Source location Image Status
catalyst-ui products/catalyst/bootstrap/ui/ ghcr.io/openova-io/openova/catalyst-ui public repo
catalyst-api products/catalyst/bootstrap/api/ ghcr.io/openova-io/openova/catalyst-api public repo
console core/console/ ghcr.io/openova-io/openova/console public repo (Phase 1)
admin core/admin/ ghcr.io/openova-io/openova/admin public repo (Phase 1)
marketplace core/marketplace/ ghcr.io/openova-io/openova/marketplace public repo (Phase 1)
marketplace-api core/marketplace-api/ ghcr.io/openova-io/openova/marketplace-api public repo (Phase 1)
sme-{auth,billing,catalog,domain,gateway,notification,provisioning,tenant} (still in openova-private/services/) ghcr.io/openova-io/openova-private/sme-* follow-up phase — source not yet moved