feat(ui): establish premium design foundation from mockups
CI and Deploy / test (push) Successful in 2m21s
CI and Deploy / deploy (push) Successful in 39s

Extract design tokens from the mockup set (F:\Pictures\website\jobtracker\new
dashboard, pipeline, job-workspace, features, workflow screens) into the
central theme so every screen picks the change up automatically:

- Heading weight: h1-h4 go bold/black (800/700) to match the mockups' heavy
  display type; h5/h6 stay a lighter semibold so dense screens don't turn
  into a wall of black text.
- Card shadow: replace the flat 1px "section" shadow + visible border with a
  soft floating shadow and no border, matching how mockup cards sit on the
  grey page background.
- Border radius: 10/12/8px -> 14/16/10px across shape/card/button defaults,
  matching the mockups' rounder corners.
- New GradientButton component wrapping the mockup's signature indigo->cyan
  CTA gradient ("Tailor my CV for this role", "See the interface tour"),
  reserved for the single most important AI-assist/hero action per screen.

The dark navy sidebar (#0f172a) already matched the mockups from an earlier
pass -- untouched here.

Verified: tsc clean, full frontend suite green (65/65). Live visual
screenshot verification wasn't possible -- the Browser pane's screenshot
tool times out in this environment; verified structurally via read_page
and the app rendering without console errors instead.
This commit is contained in:
cesnimda
2026-07-13 08:50:26 +02:00
parent b8b7987c58
commit 1ab92e5c9d
2 changed files with 70 additions and 15 deletions
@@ -0,0 +1,33 @@
import React from "react";
import Button, { ButtonProps } from "@mui/material/Button";
import { GRADIENT_CTA } from "../theme";
/**
* The mockup's gradient AI/primary-action pill ("Tailor my CV for this role", "See the
* interface tour"). Reserve this for the single most important AI-assist or hero action on a
* screen -- everything else stays a plain contained/outlined Button, or the gradient stops
* reading as a signal and becomes wallpaper.
*/
export default function GradientButton({ sx, disabled, ...props }: ButtonProps) {
return (
<Button
variant="contained"
disableElevation
disabled={disabled}
sx={[
(theme: any) => ({
background: disabled ? undefined : GRADIENT_CTA,
color: disabled ? undefined : "#fff",
boxShadow: disabled ? undefined : theme.vars.customShadows.gradientButton,
"&:hover": disabled
? undefined
: { background: GRADIENT_CTA, filter: "brightness(1.06)", boxShadow: theme.vars.customShadows.gradientButton },
}),
...(Array.isArray(sx) ? sx : sx ? [sx] : []),
]}
{...props}
/>
);
}