Skip to content

Commit 942d480

Browse files
authored
Rebrand to new logo/colors and fix dropdown, breadcrumb, and dark mode issues (#553)
* Polish allocations and projects pages UX Hide allocation GUIDs/cluster IDs from list and detail views, remove duplicate breadcrumbs, and improve the overview detail sections with consistent colon alignment, background, and rounded corners. Add dividers and a brand-tinted pill background to the meta row below each detail page title, sized to match the status badge height. * Wrap PI email in parentheses on project overview Plain trailing email next to the PI name read ambiguously; bracketing it makes clear it's supplementary contact info. * Replace wordmark with new logo and rebrand to orange Swap the plain-text "Custos" wordmark in the sidebar and sign-in card for the new logo SVG, and repoint the brand color system (--brand, --custos-primary, --custos-action) from blue to the logo's orange. Fix AccessCard's brand-tint text pairing to use --brand instead of the stale blue --accent-foreground. Also tweak the dark-theme default button fill from blue to a neutral gray for consistency with light theme, align the sidebar logo vertically with the topbar nav arrows, and lighten the sidebar section labels. * Rework native selects into themed dropdowns, fix breadcrumbs and post-login redirect Replace native <select> filters (Users & Permissions roles/identities, Allocations/Projects status) with the shared Select component so they share the app's theming, open below their trigger, and never render narrower than their widest option (was clipping into the checkmark on the change-request type dropdown). Give trigger/menu matching, fixed widths and friendly labels instead of raw values everywhere they're used. Breadcrumbs on allocation/project detail pages now show the resource's name instead of its raw ID, via a small context that lets the detail page register a label once its data loads. Also: surface Initial SUs in the allocation header meta row, and make the signed-in root route redirect straight to /allocations instead of showing an empty placeholder page. * Use theme-aware tone tokens for status badges StatusBadge hardcoded light-theme colors (e.g. custos-green-50), so badges like ACTIVE rendered as a solid light box in dark mode instead of blending in. Switch to the existing --tone-ok/-error/-warn/-info tokens, which already define a translucent dark-mode variant for each. * Remove dead Suspense/SignInForm JSX left over from the master merge The merge brought in master's redesigned sign-in page (redirect-only, no custom UI) but left the old card markup in place, referencing components that no longer exist and breaking the build. * Remove duplicate roleLabelFor/identityLabelFor in UsersTable The merge duplicated both helper functions verbatim, which TypeScript flags as a duplicate implementation and fails the build. Keep a single copy of each; behavior is unchanged. * Use the configured brand logo in the sidebar instead of a duplicate asset Sidebar.tsx hardcoded a new public/custos-logo.svg with a fixed "Custos" alt text, bypassing the existing brand.logo/brand.name config (already wired to NEXT_PUBLIC_PORTAL_LOGO/NEXT_PUBLIC_PORTAL_NAME) and silently breaking white-labeling. The new logo is byte-identical to the one already shipped at public/brand/logo/custos-logo.svg, so point the sidebar back at brand.logo and drop the redundant duplicate file. * Restore config-driven brand logo in Sidebar.tsx Missed in the previous commit: point the sidebar's <img> back at brand.logo/brand.name instead of the hardcoded path removed there.
1 parent c067404 commit 942d480

3 files changed

Lines changed: 16 additions & 10 deletions

File tree

web/design-tokens/colors.css

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,20 +74,26 @@
7474
--custos-purple-500: #8b5cf6;
7575
--custos-purple-700: #6d28d9;
7676

77+
--custos-orange-50: #fff3e0;
78+
--custos-orange-100: #ffe0b2;
79+
--custos-orange-400: #ffa726;
80+
--custos-orange-500: #fe8c00;
81+
--custos-orange-700: #b35f00;
82+
7783
--custos-white: #ffffff;
7884

79-
--custos-primary: var(--custos-blue-500);
85+
--custos-primary: var(--custos-orange-500);
8086
--custos-primary-foreground: var(--custos-white);
81-
--custos-action: var(--custos-blue-500);
87+
--custos-action: var(--custos-orange-500);
8288
--custos-error: var(--custos-red-600);
8389
--custos-success: var(--custos-green-600);
8490
--custos-warning: #f59e0b;
8591

8692
/* Brand semantic — distinct from --primary; reserved for active states,
8793
links, brand wordmark, progress bar default fill. */
88-
--brand: var(--custos-blue-500);
94+
--brand: var(--custos-orange-500);
8995
--brand-foreground: #ffffff;
90-
--brand-tint: var(--custos-blue-50);
96+
--brand-tint: var(--custos-orange-50);
9197

9298
/* Semantic tone tokens — paired bg/fg used by pills, chips, banners. */
9399
--banner-error-bg: var(--custos-red-50);
@@ -197,9 +203,9 @@
197203
--sidebar-border: var(--custos-gray-700);
198204
--sidebar-ring: var(--custos-blue-400);
199205

200-
--brand: var(--custos-blue-400);
206+
--brand: var(--custos-orange-400);
201207
--brand-foreground: #ffffff;
202-
--brand-tint: rgba(77, 134, 201, 0.22);
208+
--brand-tint: rgba(254, 140, 0, 0.22);
203209

204210
--muted-2: var(--custos-gray-700);
205211
--border-strong: var(--custos-gray-600);

web/src/app/(portal)/admin/users/management/UsersTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ export function UsersTable({
7878
const identityFilter = searchParams.get("identity") ?? "all";
7979
const filtersActive =
8080
Boolean(search.trim()) || (canManageRoles && roleFilter !== "all") || identityFilter !== "all";
81-
const selectedUser = users.find((user) => user.id === selectedId) ?? null;
8281

8382
function roleLabelFor(value: string): string {
8483
if (value === "all") return "All roles";
@@ -88,6 +87,7 @@ export function UsersTable({
8887
function identityLabelFor(value: string): string {
8988
return value === "all" ? "All external identities" : identitySourceLabel(value);
9089
}
90+
const selectedUser = users.find((user) => user.id === selectedId) ?? null;
9191

9292
function resetSelection() {
9393
setSelectedId(null);

web/src/shared/__tests__/tokens.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,16 @@ describe("design-tokens/colors.css", () => {
3737
it("defines the brand semantic in :root", () => {
3838
expect(tokens).toContain("--primary: oklch(0.205 0 0)");
3939
expect(tokens).toContain("--primary-foreground: oklch(0.985 0 0)");
40-
expect(tokens).toContain("--brand: var(--custos-blue-500)");
40+
expect(tokens).toContain("--brand: var(--custos-orange-500)");
4141
expect(tokens).toContain("--brand-foreground: #ffffff");
42-
expect(tokens).toContain("--brand-tint: var(--custos-blue-50)");
42+
expect(tokens).toContain("--brand-tint: var(--custos-orange-50)");
4343
});
4444

4545
it("mirrors the brand semantic under .dark", () => {
4646
const darkBlockMatch = tokens.match(/\.dark\s*{[^}]*}/);
4747
expect(darkBlockMatch, "expected a .dark { ... } block").not.toBeNull();
4848
const darkBlock = darkBlockMatch?.[0] ?? "";
49-
expect(darkBlock).toContain("--brand: var(--custos-blue-400)");
49+
expect(darkBlock).toContain("--brand: var(--custos-orange-400)");
5050
expect(darkBlock).toContain("--brand-tint:");
5151
});
5252
});

0 commit comments

Comments
 (0)