Skip to content

feat(webapp): dashboard redesign - #1399

Open
satsh-co wants to merge 8 commits into
mlco2:masterfrom
satsh-co:feat/webapp-dashboard-redesign
Open

feat(webapp): dashboard redesign#1399
satsh-co wants to merge 8 commits into
mlco2:masterfrom
satsh-co:feat/webapp-dashboard-redesign

Conversation

@satsh-co

@satsh-co satsh-co commented Aug 22, 2026

Copy link
Copy Markdown

Implements the Figma redesign of the dashboard: sidebar rail (bottom bar on mobile),
account menu, global panel, and the projects page with its empty state and
create-project modal. Fully responsive, since Figma has desktop frames only.

Screenshots

Homepage (global):

Desktop Mobile
localhost_3000_mock-org-1(1440x900) localhost_3000_mock-org-1(iPhone 14 Pro Max) (1)

Homepage + Account menu open:

Desktop Mobile
localhost_3000_mock-org-1(1440x900) (1) localhost_3000_mock-org-1(iPhone 14 Pro Max) (4)

Account settings page:

Desktop Mobile
localhost_3000_mock-org-1(1440x900) (2) localhost_3000_mock-org-1(iPhone 14 Pro Max) (5)

Projects page:

Desktop Mobile
localhost_3000_mock-org-1(1440x900) (3) localhost_3000_mock-org-1(iPhone 14 Pro Max) (2)

Create project modal:
localhost_3000_mock-org-1(1440x900) (4)

Project settings modal (General tab):

Desktop Mobile
localhost_3000_mock-org-1(1440x900) (5) localhost_3000_mock-org-1(iPhone 14 Pro Max) (3)

Project settings modal (API tokens tab):
localhost_3000_mock-org-1_projects(1440x900)

Todo

  • Global navigation (sidebar rail / mobile bottom bar, account menu, settings page)
  • Dashboard homepage (global panel)
  • Projects page
  • Members page
  • Project dashboard page
  • Remaining adjustments (organisation, experiment, delete, project settings)

Remarks

  • Sidebar on desktop has hamburger icon
    • Resolved: desktop shouldn’t have hamburger icon, and the sidebar transforms into a bottom navigation bar on mobile
  • Glossary doesn't exist in current implementation
    • Resolved: replaced with Members + created its pixel-art icon
  • The organisation picture functionality is not implemented in code
    • Resolved: remove it completely from the dashboard + needed to create “organisation” icon
    • What is this “camera +” icon, what does it do?
    • Screenshot 2026-08-22 at 7 24 39 PM
  • Cannot identify logged in user’s organisation to separate it from the “dashboards you’ve been invited to”
    • Resolved: small addition in code to check if organisation admin = logged in user
  • There is no “Members” icon or an “Account” icon
    • Resolved: created missing icons
  • Gauges are not representative of anything
    • Is this fine?
  • All designs, apart from the dashboard homepage, have the old navigation, the wrong background, and no breadcrumbs
    • Resolved: kept navigation in sidebar rail / bottom bar + reused homepage surface and breadcrumbs, and will reuse them across all pages
  • There is no mobile design in Figma
    • Resolved: made logical and coherent design choices and created mobile responsive UI
  • Project page design features non-existent functionality
    • Resolved: replaced "Last updated on 02/02/24" with project description and kept the existing Settings / Delete actions behind the new “⋮” menu, whose contents were never designed
  • You could create a project with an empty name
    • Resolved: “create” button is disabled until a name is entered + it's a real form now so “Enter” submits
  • "Project settings" modal is redesigned as "Edit project" modal in Figma
    • Resolved: redesigned the project settings to match the typography, inputs and button styles. Also implemented the "copy link" share button which was in the project settings page but not in the modal + made it directly appear/disappear when toggling the switch that makes the project public.

Links

AI Usage Disclosure

  • 🟥 AI-vibecoded: You cannot explain the logic. Car analogy : the car drive by itself, you are outside it and just tell it where to go.
  • 🟠 AI-generated: Car analogy : the car drive by itself, you are inside and give instructions.
  • ⭐ AI-assisted. Car analogy : you drive the car, AI help you find your way.
  • ♻️ No AI used. Car analogy : you drive the car.

First step of the dashboard redesign. Remove the mobile header and its
drawer. Implement a single navigation component that presents as a vertical rail
beside the content on desktop and as a bottom bar on mobile, with the
account menu at its end. Rework the org global panel around a consumed-
energy gauge and an extended date range picker, and add a settings panel
wired into the router.

Add the Disket Mono display face, a Figma-derived icon set, and the
supporting Tailwind and global CSS type/color tokens the new surfaces use.
Extend the API schemas and mock data/handlers to back them, with tests.

Also ignore the Vite cache directory (.vite/).
@satsh-co
satsh-co requested a review from a team as a code owner August 22, 2026 16:28
satsh-co and others added 7 commits August 22, 2026 19:30
Second step of the dashboard redesign. Rebuild the Projects page in both
its empty and populated states: breadcrumb and surface shared with the
global panel, a heading row carrying the primary action, and a table of
rows whose two text columns light as one item and whose overflow menu
holds the existing Settings and Delete actions.

Rework the create-project and project-settings dialogs onto the design's
panel, fields and buttons. Project settings now opens in place from a
project row, which makes ProjectSettingsPage a duplicate of it, so that
page and its route are removed and the public sharing link it owned moves
into the dialog beside the toggle that produces it. The visibility toggle
saves on its own so that link appears and disappears with it, while
"Save changes" writes the fields and closes; a failed save keeps the
dialog open so the edits survive. Creating a project with an empty name is
no longer possible, and the form submits on Enter.

Fix the dialog transition app-wide. The panel was centred with a transform
that tailwindcss-animate's keyframes overwrote, which the shadcn default
compensates for by sliding it in from the top-left corner; centring it by
layout instead lets it fade and rise in place, with a reduced-motion
variant. Fix the account menu regrouping its organizations as it closes,
by latching the admin lookup instead of keying it on the open state.

Extract the redesign's controls into components — form field, primary and
secondary button, menu panel and item, tab nav, modal header, project row,
settings nav item, rail button — replacing the class-string constants the
first step left behind, and adopt them in the pages and dialogs already
redesigned. Drop the Figma node ids from comments, keeping the reasoning
they carried, and rename createProjectModal to kebab-case to match the
convention the rest of the components follow.
Every icon exported from the Figma file lived in a single figma-icons.tsx. Give each its own module, named
the way the icons supplied outside that file already were, and delete the
barrel. Repoint the rail, the account menu, the project row, the global
dashboard and the settings page at the new modules.

Declare the props contract once as FigmaIconProps, replacing the local
copy each icon carried, and reduce every icon's comment to a line saying
what the glyph shows — the sizes, insets, hex fills and node ids they
listed described the design file rather than the code, and went stale the
moment either changed.
Square 2px corners like the fields and buttons, lime when on, and the
palette's hover colour. Restyled in place rather than added alongside the
shadcn switch, since the project-settings dialog is its only caller.
The pre-redesign navigation, the page-header breadcrumb and the radial
chart have had no callers since the rail, the pages' inline breadcrumbs
and the consumed-energy gauges replaced them. Four test files were the
only thing still importing them, so the suite was covering code no user
could reach.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Put the page on the redesigned shell — dark surface, breadcrumb, display
title carrying the project's description and its visibility pill — and
move the project's own actions into that heading as ProjectActions, so
nothing about the project's identity is drawn from inside its panels.
ProjectSettingsPage went with it: opening settings in place from a row
made that page a duplicate of the dialog.

Replace the three radial charts with the global dashboard's gauges and
equivalences, both now shared components, and give the four charts one
section treatment: a heading, a line of context, its export control, and
no card. They sit in a cross of rules rather than in boxes, with the gaps
as padding inside the cells so the rules meet.

Rework the experiment controls: a section heading with the picker and
"Add an experiment" beside it, the selected experiment's details in a
field-styled panel, and the create-experiment dialog on the same panel,
fields and buttons as the other two dialogs.

Add the pixel-art refresh, download, share, logout, cog, padlock and
overflow glyphs, and restyle the select, the toast-adjacent controls and
the token form onto the redesign's fields and buttons.

Cover what the redesign had left untested — the rail, the account menu,
settings, the project row, the dialogs and the equivalences — taking the
suite to 124 tests, and stub ResizeObserver so Radix components can mount
under jsdom.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Put the page on the Projects page's shell — dark surface, breadcrumb,
display title — and give it the same table treatment, with each member as
a MemberRow. The invite control is a form on the page rather than a
dialog, since the API takes a single email address.

Move that call behind addOrganizationUser: the endpoint subscribes an
existing account and answers with a bare status object, so there is
nothing to validate and the page refetches the list instead.

Restyle the toasts onto the design's alert. Sonner's own rules hang off a
stylesheet it injects after Tailwind's, which no class can outrank, so
they render unstyled and restate the shape the design draws.

Let Table take classes for its scroll container, which the members table
needs to bound its own height.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Put the panel on the app's dark surface, outlined in the page's own rule
rather than the menus' green — a menu's border marks where the pointer is
working, and a panel you only read does not need that weight. The date
range picker's calendar shares the primitive and follows.

Show the public link as text instead of a read-only field: it is read and
copied, never typed into. Its copy control becomes an icon button, so it
matches the four in the project's heading.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant