feat(design-system): add core design-system components#338
Merged
Conversation
Add the design-system infrastructure for Menlo's web workspace. - wire Tailwind CSS v4 through PostCSS for the Angular app, libraries, and Storybook - define Catppuccin palette tokens, semantic theme colors, and Nunito Sans defaults - add a reusable ThemeService with signal-based state, localStorage persistence, and html.dark wiring - export the theme infrastructure from menlo-lib and initialize it in the app bootstrap path - add a Storybook infrastructure smoke story and patched dependency overrides needed for a clean audit Refs #321 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Add Storybook foundation documentation stories for colours, typography, spacing, icons, and shadows/radii so the design-system tokens are discoverable before atom work starts. The new stories render Latte and Mocha side-by-side, document Tailwind class recipes, and keep the work scoped to menlo-lib while preserving the existing infrastructure branch. Closes #322 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the standalone mnl-button to menlo-lib so the design-system branch can start composing interactive controls from a shared primitive. The component now ships variant and size inputs, loading and disabled behavior, projected icon slots, Storybook documentation, and focused unit coverage for the interaction guards. The menlo-lib coverage config now excludes Storybook-only foundation helpers so the strict coverage gate stays meaningful without parser failures in docs-only files. Closes #323 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Load the shared Tailwind v4 entrypoint with the @tailwindcss/container-queries plugin so issue #321 matches its documented infrastructure contract instead of only installing the package. Regenerate documentation.json after the Storybook validation run so the tracked API/docs metadata reflects the design-system sources already present on this branch. Refs #321 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the mnl-input and mnl-select atoms to menlo-lib with signal-based APIs, ControlValueAccessor support, Storybook coverage, and exhaustive Vitest coverage so the design-system branch can start composing consistent form flows.\n\nThe change also fixes the published menlo-lib type metadata for Vite dev resolution, refreshes generated frontend docs/assets, and applies the repo-local formatting cleanup required for the validation gates to stay green.\n\nCloses #324\nRelates to #320\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the responsive navigation shell for issue #330 so Menlo can switch between a mobile bottom tab bar and a desktop sidebar without duplicating layout logic in the app. This adds the new menlo-lib tab bar and page shell components with router-aware active states, scroll reset behaviour, Storybook coverage, and exhaustive tests, and wires the authenticated app shell into the new organism. Closes #330 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the standalone mnl-panel molecule to menlo-lib with viewport-aware auto/sheet/dialog modes, focus trapping, dismissal outputs, scroll locking, Storybook coverage, and Vitest coverage. Refresh the generated Storybook documentation artifact so the new component is reflected in tracked docs. Closes #331 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the standalone mnl-toggle and mnl-badge atoms with Storybook coverage, Vitest suites, and barrel exports so the design system can support boolean inputs and status pills for the next migration slices. Refresh documentation.json after the Storybook build and capture the ng-packagr template-visibility learning in AGENTS for follow-on component work. Closes #325 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the progress bar and avatar atoms for the Menlo design system so downstream card and budget list work can compose accessible status and identity primitives. This adds standalone Angular components, Storybook coverage, unit tests, barrel exports, and a brief repo learning from the Playwright validation lane. Closes #326 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the reusable mnl-card and mnl-stat molecules to menlo-lib so the design-system branch can compose dashboard and budget summary surfaces from shared containers instead of bespoke markup. The new components include Storybook documentation for padding, projection, and trend variants, focused Vitest coverage for slot projection and conditional trend rendering, and the barrel exports needed for downstream migrations. Closes #328 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- add the mnl-list-item and mnl-page-header molecules with theme-aware gradients, projection slots, stories, and Vitest coverage - refresh exports, foundation preview variables, and the generated Storybook documentation artifact for the new design-system surfaces Closes #332 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the Menlo home experience onto the new design-system primitives so the landing page uses the shared page header, cards, stats, buttons, and badges instead of bespoke styling. Also restyle the home budget widget and align the menlo-lib public API export so the app can consume the page header from the packaged library surface. Closes #335 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Closes #336 Relates to #320 Validated with: - pnpm run lint - pnpm run build:all:prod - pnpm run test - pnpm run test:e2e - pnpm audit --audit-level moderate - pnpm licenses list --json - dotnet format Menlo.slnx --verify-no-changes --no-restore - dotnet test Menlo.slnx --no-restore --nologo - dotnet list package --vulnerable --include-transitive Note: `pnpm exec nx run-many --target=test --all --outputStyle=static -- --coverage` still fails on pre-existing 100% global coverage gates in `menlo-app` and `menlo-lib` outside issue #336; `budget-list.component.ts` is 100% covered. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Introduce the mnl-form-layout organism in menlo-lib as the presentation shell for multi-section forms. This adds projected title and action slots, a sticky action bar that works inside mnl-panel, realistic Storybook coverage, focused Vitest coverage, barrel exports, and refreshed generated documentation so the budget-form migration can depend on a stable shared layout. Closes #333 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the new mnl-toast primitive and MnlToastService for stacked feedback notifications in menlo-lib. This covers the design-system feedback surface needed before the remaining budget-form migration work in issue #320 and ships the related tests, Storybook stories, and refreshed documentation metadata. Closes #327 Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Migrate the budget detail page, category management flows, and item create/edit/fill-forward/delete workflows onto the shared menlo-lib design-system primitives while preserving the existing budget API behaviour and test selectors.\n\nAdd configurable test IDs to the shared form controls and panel so the migrated workspace keeps its Vitest and Playwright contracts without falling back to raw bespoke controls, and update the affected budget form specs for formatted amount input behaviour.\n\nValidation completed with pnpm format, pnpm lint, pnpm test, pnpm build, pnpm test:e2e, pnpm audit --audit-level moderate, pnpm licenses list --json, dotnet format --verify-no-changes, dotnet test Menlo.slnx, dotnet list package --vulnerable --include-transitive, and Aspire-backed HTTP/Playwright validation on localhost:4200.\n\nCloses #337\nRelates to #320\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the Menlo chart palette helper, export it through the theme surface, and document the new chart foundation stories for the design system. This also records the required ApexCharts dependencies and refreshed generated UI documentation for the library surface. Closes #334 Refs #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Remove the TypeScript-only preview annotation that Storybook was serving directly to the browser and escape the literal Lucide import braces in the icons foundations story so Angular can parse the template. Refs #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
chore: upgrade Aspire packages to version 13.3.5 fix: refactor AppHost to use AddViteApp and enable browser logs test: enhance app routing tests for better coverage test: improve app component tests for routing behavior feat(toggle): implement MnlToggleComponent with improved accessibility
Add targeted app and library spec coverage for the remaining uncovered frontend branches so the PR test gate can pass locally and in CI. Relates to #320 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The web-ui resource was showing as Running (Unhealthy) after switching from AddJavaScriptApp to AddViteApp in feat/321-design-system-infra. The Vite development server was binding to IPv6 only (::1:4200), while the API's reverse proxy attempted connections via IPv4 (127.0.0.1:4200), causing the health check to fail and reverse proxy to time out. Fixes by: 1. Setting HOST environment variable to 127.0.0.1 in AppHost.cs 2. Explicitly configuring Vite server.host to 127.0.0.1 in vite.config.mts Result: web-ui resource now shows Running (Healthy) and reverse proxy works correctly. Related: feat/321-design-system-infra
Prefer Services:web-ui:http:0 for SPA proxy resolution in development and keep connection string fallback. Rename AppHost web-ui endpoint name from https to http to match actual HTTP endpoint configuration. This resolves intermittent API root timeouts and blank page loads when proxying to the web-ui dev server.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary- add Tailwind CSS v4 design-system infrastructure across the Menlo app, libraries, and Storybook- define Catppuccin theme tokens, semantic colors, and Nunito Sans as the shared visual foundation- add a reusable ThemeService in menlo-lib and initialize it during app bootstrap- add Storybook Foundations documentation for colours, typography, spacing, icons, and shadows/radii in menlo-lib- add the standalone mnl-button, mnl-input, and mnl-select atoms with signal-based APIs, CVA integration for the form controls, Storybook docs, and exhaustive Vitest coverage in menlo-lib- add the standalone mnl-form-field and mnl-amount-input molecules with accessible label/error composition, currency-prefix formatting, CVA wiring, Storybook docs, and full coverage in menlo-lib- add the standalone mnl-tab-bar molecule and mnl-page-shell organism with router-aware active state handling, responsive mobile/desktop navigation, page-scroll reset on route changes, Storybook docs, and full coverage in menlo-lib- add the standalone mnl-panel molecule with viewport-aware auto/sheet/dialog modes, focus trapping, dismissal handling, body scroll locking, Storybook docs, and full coverage in menlo-lib- add the standalone mnl-toggle and mnl-badge atoms with signal APIs, CVA and keyboard support for the toggle, Storybook docs, and full Vitest coverage in menlo-lib- wire the authenticated app shell to the new page shell organism without migrating the route content yet- refresh the tracked documentation.json artifact after Storybook validation and keep repo formatting aligned with the validation gates## Validation- pushd src\ui\web; pnpm format && pnpm lint && pnpm test && pnpm build && popd- pushd src\ui\web; pnpm build-storybook && pnpm build-storybook:lib && pnpm audit --audit-level moderate && pnpm licenses list --json && popd- dotnet restore Menlo.slnx- dotnet format Menlo.slnx --verify-no-changes --no-restore- dotnet build Menlo.slnx --no-restore --configuration Release- dotnet test Menlo.slnx --no-build --configuration Release --verbosity minimal --collect:"XPlat Code Coverage" --results-directory .\coverage\issue-331 --logger trx --logger "console;verbosity=minimal"- .\scripts\check-api-coverage-baseline.ps1 -CoverageDir coverage\issue-331 -Threshold 70 -HeadSha HEAD- dotnet list Menlo.slnx package --vulnerable --include-transitive- aspire start --apphost src\api\Menlo.AppHost\Menlo.AppHost.csproj --isolated --non-interactive --nologo --format Json- aspire wait web-ui --apphost src\api\Menlo.AppHost\Menlo.AppHost.csproj --status up --timeout 180 --non-interactive --nologo- aspire describe web-ui --apphost src\api\Menlo.AppHost\Menlo.AppHost.csproj --format Json --non-interactive --nologo- HTTP 200 from http://localhost:4200/Closes #321Closes #322Closes #323Closes #324Closes #329Closes #330Closes #331Closes #325Relates to #320## Update: Issue #326- add the standalone mnl-progress and mnl-avatar atoms with accessible progress semantics, image fallback handling, Storybook stories, and Vitest coverage in menlo-lib- rerun Playwright from a clean dev-server instance to avoid stale Vite overlays before completing audit and license validationCloses #326## Update: Issue #328- add the standalone mnl-card and mnl-stat molecules with padding variants, projected header/footer slots, interactive hover treatment, and badge-backed trend states in menlo-lib- add Storybook coverage and focused Vitest suites for slot projection, interactive rendering, and conditional trend badges so the home and budget-list migrations can compose these primitives confidently### Validation- pushd src\ui\web; pnpm nx test menlo-lib --runInBand && pnpm lint && pnpm test && pnpm build && pnpm build-storybook && pnpm build-storybook:lib && pnpm audit --audit-level moderate && pnpm licenses list --json && popd- dotnet restore Menlo.slnx- dotnet format Menlo.slnx --verify-no-changes --no-restore- dotnet build Menlo.slnx --no-restore --configuration Release- dotnet test Menlo.slnx --no-build --configuration Release --verbosity minimal --collect:"XPlat Code Coverage" --results-directory .\coverage\issue-328 --logger trx --logger "console;verbosity=minimal"- .\scripts\check-api-coverage-baseline.ps1 -CoverageDir coverage\issue-328 -Threshold 70 -HeadSha HEAD- dotnet list Menlo.slnx package --vulnerable --include-transitive- aspire start --apphost src\api\Menlo.AppHost\Menlo.AppHost.csproj --isolated --non-interactive --nologo --format Json- aspire wait web-ui --apphost src\api\Menlo.AppHost\Menlo.AppHost.csproj --status up --timeout 180 --non-interactive --nologo- aspire describe --apphost src\api\Menlo.AppHost\Menlo.AppHost.csproj --format Json --non-interactive --nologo- HTTP 200 from http://localhost:4200/Closes #328
Update: Issue #332
mnl-list-itemandmnl-page-headermolecules with projected slots, interactive and selected states, theme-aware gradient tokens, Storybook coverage, and Vitest suites in menlo-libValidation
Closes #332
Update: Issue #335
Validation
Closes #335
Update: Issue #336
mnl-page-header,mnl-card,mnl-progress,mnl-badge, andmnl-button, replacing the bespoke SCSS-driven layoutmnl-buttondrives navigation to budget detail without reintroducing page-specific button stylesbudget-list.component.scssValidation
Coverage note
pnpm exec nx run-many --target=test --all --outputStyle=static -- --coveragestill fails on this branch becausemenlo-appandmenlo-libboth enforce 100% global coverage across pre-existing uncovered files outside issue Design System: Migration - Budget List Page #336.budget-list.component.tsitself is 100% covered locally.Closes #336
Update: Issue #333
mnl-form-layoutorganism with projected title, section, and action slots plus a sticky action bar that stays withinmnl-panelboundariessrc/index.tsandpublic-api.ts, and refresh the trackeddocumentation.jsonartifactValidation
pushd src\ui\web; pnpm run lint && pnpm run test && pnpm run build:all:prod && pnpm audit --audit-level moderate && pnpm run start && popdpushd src\ui\web; pnpm exec nx format:check --files="projects/menlo-lib/src/index.ts,projects/menlo-lib/src/public-api.ts,projects/menlo-lib/src/lib/organisms/form-layout/form-layout.component.ts,projects/menlo-lib/src/lib/organisms/form-layout/form-layout.component.spec.ts,projects/menlo-lib/src/lib/organisms/form-layout/form-layout.stories.ts,projects/menlo-lib/src/lib/organisms/form-layout/index.ts" && pnpm exec nx test menlo-lib -- --coverage && pnpm exec nx build-storybook menlo-lib && pnpm licenses list --json > coverage\licenses-menlo-web.json && popdCoverage note
pnpm exec nx test menlo-lib -- --coveragestill trips the library's existing project-wide 100% threshold because other pre-existing files on this branch remain uncovered;src/lib/organisms/form-layout/form-layout.component.tsitself is 100% covered.Closes #333
Update: Issue #327
Validation
Notes
Closes #327
Update: Issue #337
mnl-page-header,mnl-card,mnl-list-item,mnl-form-layout,mnl-form-field,mnl-amount-input,mnl-panel, andMnlToastServiceValidation
Set-Location src\\ui\\web; pnpm format && pnpm lint && pnpm test && pnpm build && pnpm test:e2e && pnpm audit --audit-level moderate && pnpm licenses list --jsondotnet format --verify-no-changesdotnet test Menlo.slnxdotnet list package --vulnerable --include-transitiveaspire start --isolated --non-interactive --format Json --apphost src\\api\\Menlo.AppHost\\Menlo.AppHost.csprojaspire wait web-ui-xhgbuhtq --status healthy --timeout 180 --non-interactive --apphost src\\api\\Menlo.AppHost\\Menlo.AppHost.csprojHTTP 200 from http://localhost:4200/pnpm exec playwright test e2e/budget-item-create.spec.ts --workers=1Note
.ralph.donewas not created in this slice.Closes #337
Update: Issue #334
Validation
Closes #334
Update: Storybook rendering
Refs #320
Coverage update