Skip to content

Modern UI#1689

Draft
a-limyr wants to merge 73 commits intomasterfrom
feature/modernize-ui-with-mui-theming
Draft

Modern UI#1689
a-limyr wants to merge 73 commits intomasterfrom
feature/modernize-ui-with-mui-theming

Conversation

@a-limyr
Copy link
Copy Markdown
Contributor

@a-limyr a-limyr commented Mar 24, 2026

Summary

This PR is a revamping of the UI. The new UI, is responsive, modern and themable.

Issue

Motivation

The existing Abzu UI was built on an older stack (class-based React components, legacy MUI, hand-rolled CSS) that made it difficult to enforce consistent design, add theming support, or iterate on UX quickly. There
was no design system to speak of — styling was scattered across dozens of CSS files, and the component tree mixed presentation and data-fetching concerns freely.

The goal of this branch is to introduce a modern, parallel UI layer that can eventually replace the legacy one. By running both UIs side-by-side (controlled by a uiMode flag in Redux state), we avoid a big-bang
rewrite and allow gradual migration with no disruption to users currently on the legacy UI.

How the code works

All new code lives under src/components/modern/ and src/containers/modern/. The entry point is src/containers/modern/App.tsx, which is completely separate from the legacy LegacyApp.js.

The three main editing surfaces — EditStopPage (regular stop places), EditParentStopPlace (multimodal stops), and EditGroupOfStopPlaces (groups) — all follow the same structural pattern:

  • A collapsible drawer on the left edge of the map. When expanded, the drawer shows the full editor; when collapsed, a MinimizedBar takes its place, giving access to quick-actions without hiding the map.
  • Quays and parking inside EditStopPage are first-class panels with their own view state, navigated to via a replace-in-place pattern (View union type: stopPlace | quay | parking), with a back arrow returning to the
    stop place view.

A new ReportPage was also built from scratch under src/components/modern/ReportPage/, with full filter/column/pagination/export support and URL-persisted state. This is not fully responsive yet, but is not a major priority at the moment.

Technical approach and design decisions

Parallel UI, zero legacy breakage. The uiMode flag in Redux (state.user.uiMode) gates which component tree renders. The legacy UI is untouched and continues to work. All new components are TypeScript; new containers
are thin wrappers that read Redux state and pass it down.

Hooks-per-component pattern. Each major component has a dedicated hooks/use.ts orchestrator that composes several focused sub-hooks (state, dialogs, CRUD, form, quays, parking). This keeps components
as pure presentational shells and makes business logic independently testable.

MUI v7 with configurable theming. The theme system reads a themeConfig / themeConfigs path from bootstrap.json at runtime, fetches a JSON theme file, and applies it on top of the MUI base. This lets deployments supply their own colours and logo without a code change. The Config interface in ConfigContext.ts was extended with themeConfig and themeConfigs to type-check this at compile time;

Shared component library. Reusable pieces — MinimizedBar, LoadingDialog, GroupMembership, ParentMembership, CopyIdButton, FavoriteButton, TagTray, ImportedId, and others — live in src/components/modern/Shared/ and
are used consistently across all three panel types, giving the UI a uniform look and behaviour.

Closes #1084

Unit tests

Manually testing for now, but we should look into UI testing frameworks in the future.

  - Restore title visibility for desktop users only (hidden on mobile)
  - Remove max width constraint from header to allow full-width layout
  - Hide search input helper text when focused for cleaner appearance
  - Remove white border underlines from focused and expanded search states
  - Increase search dropdown max height from 60vh to 80vh
  - Fix z-index issues with search autocomplete dropdown
Created index.ts files inside modern/Header/components for clean imports.
# Conflicts:
#	package-lock.json
#	package.json
Reorganized some code and removed map menu for location.
Moved location and zoom setting to map settings.
Removed tariff zone settings since it is no longer needed in new UI.
…the starting point of the new UI.

Created first version of a GroupOfStopPlaces modern version.
Fixed environment badge not using correct theme.
Removed tiamatEnv color override.
Minor layout change for group of stop place edit box.
Added a generic default logo.
Supports multiple themes, but when only one theme available no theme switching menu is available.
Modernized the search result box.
Changed search icon breakpoint.
Updating expand collapse logic for edit boxes.
Minor changes and updates.
Modern dialog boxes for parent stop place.
First pass and implementation.
Better user experience with loading indicator when loading stop place.
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 24, 2026

Visit the preview URL for this PR (updated for commit 6f3a4e6):

https://ent-ror-abzu-dev--pr1689-feature-modernize-ui-o2rlk60l.web.app

(expires Thu, 30 Apr 2026 07:20:38 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

Sign: 062563fce35e36a421ef531ddfc5db6c937ea3b1

a-limyr added 28 commits March 24, 2026 14:46
# Conflicts:
#	src/config/ConfigContext.ts
Major refactoring of file structure to adhere to best practices and clean code.
FareZone implementation.
Add elements button to map.
Loading animation fix for better user experience when selecting stop places.
Removed hard coded color values.
Fixed some errors with missing theme elements resulting in console log errors.
Updated some translations.
Fixed some more errors.
Fixed add children function for parent stop.
Marker scaling for markers when zooming.
Removing an unused file.
Creating a black funicular svg.
Updating the metro icon to an M in the modern UI.
Supporting max native zoom in map libre.
Updated documentation for setting up theme.
@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
2 Security Hotspots
0.6% Coverage on New Code (required ≥ 80%)
5.9% Duplication on New Code (required ≤ 3%)
D Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

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.

Better organization of color, fonts and logo, and support for easy customization

1 participant