283511bf3a
- Fix nav links not working from profile page (useEffect infinite re-render via unstable profile object ref)
- Fix nav hover/active: gold icon highlight, no background change; active links non-clickable
- Fix hover layout shift: add border: 1px solid transparent to all interactive elements
- Header icon buttons (search, theme toggle) now highlight gold on hover
- Profile page: replace calendar with activity feed (60/40 grid), add stat cards (tasks completed, active projects, revision requests, submissions)
- Profile card: title field, icon rows for location/email/linkedin, member since + role bottom-right, edit button top-right
- Profile portrait: remove wrapper column, fix left-gap alignment
- Add profiles.title migration
- Dashboard recent activity: name → /profile/{id}, task → /requests/{id} (clickable links)
- Icon-only sidebar with gold active/hover state, pointer-events: none on active links
- layout.md updated with profile page geometry rules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6.8 KiB
6.8 KiB
Fourge Portal Layout System
This is the single source of truth for dashboard/profile visual structure and UI geometry.
1) Global Frame
- Viewport app shell:
height: 100vh,overflow: hidden - Main content gutter:
24pxall sides - Sidebar:
width: 76px,top: 24px,left: 24px,height: calc(100vh - 48px),border-radius: 8px - Main wrapper offset from sidebar:
margin-left: 100px - Page rhythm unit:
24px(header spacing, card gaps, section gaps)
2) Theme + Background
- Background ownership is
bodyviabackground: var(--bg). - Dark base token
--bgis full gradient:- radial glow + vertical dark gradient.
- Light base token
--bgis full gradient:- gray radial glow + white vertical gradient.
- Do not use
htmltheme-gradient scripting for Safari chrome behavior.
3) Tokens
- Accent:
#F5A523 - Card bg dark:
rgba(255,255,255,0.02) - Card bg light:
rgba(0,0,0,0.02) - Secondary card tone dark:
rgba(255,255,255,0.08) - Secondary card tone light:
rgba(0,0,0,0.08) - Border dark:
rgba(245,165,35,0.15) - Border light:
rgba(0,0,0,0.1) - Text primary dark/light:
#ffffff / #0d0d0d - Text secondary dark/light:
#a8a8a8 / rgba(0,0,0,0.6) - Text muted dark/light:
#666666 / rgba(0,0,0,0.38)
4) Typography
- Font family:
Fourge, then-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif - Base font size:
14px - Header title:
28px,500,line-height: 1.2 - Header subtitle:
13px - Widget title:
11px,500, uppercase,letter-spacing: 0.8px - Body table text:
12px/13pxby column importance
5) Card System
- Default widget shell:
background: var(--card-bg)border: 1px solid var(--border)border-radius: 8pxpadding: 18px 21pxbackdrop-filter: blur(12px)+-webkit-backdrop-filter
- Compact card radius (legacy generic
.card):4px(do not use for new dashboard widgets)
6) Header + Top Right Controls
- Site header:
padding-top: 24px,padding-bottom: 24px - Right control row:
- Search icon button:
32x32 - Search button to theme toggle space:
7px(search-wrap margin-right) - Theme toggle:
32x32 - Theme toggle to avatar:
14px(avatar-wrap margin-left) - Avatar button:
49x49, circle,2pxinner ring +2pxaccent outline
- Search icon button:
7) Dashboard Grids (Team)
- Stat row:
grid-template-columns: 1fr 1fr 1fr 1.5fr,gap: 24,margin-bottom: 0 - Row 2:
grid-template-columns: 1fr 280px,gap: 24,margin-top: 24 - Row 3:
grid-template-columns: 1fr 1fr,gap: 24,margin-top: 24 - Row 4 full-width:
margin-top: 24
8) Stat Cards
- Card min height:
120px - Internal row gap:
21px - Label/value/sub spacing:
- Label:
margin-bottom: 5px - Value:
30px,400,letter-spacing: -0.5,line-height: 1.1 - Sub:
12px,margin-top: 5px
- Label:
- Icon badge:
27x27, circle - Icon glyph:
13x13
9) Calendar
- Card uses widget shell
- Header-to-grid gap:
14px - Weekday label:
10px,600,letter-spacing: 0.5 - Day cell button:
28x28, circular - Day number:
12px - Today style: bg
#F5A523, text#0d0d0d,700 - Dots: up to 3, each
3x3, gap2 - Popover:
- Anchored left of cell:
right: calc(100% + 8px), vertical centered width: 210px,padding: 10px 12px,border-radius: 8px- shadow
0 12px 32px rgba(0,0,0,0.45) - row dot
6x6, row text12px
- Anchored left of cell:
10) Activity + Performance Rows
- Visible rows target: 5
- Row layout:
display:flex,align-items:center,gap:10px - Row spacing:
margin-top: 10pxfrom second row onward - Name text:
13px - Meta/date text:
11px - Progress track:
height: 4px,radius: 2px - Percentage width slot:
min-width: 28px
11) Tables
- General table layout in dashboard cards:
table-layout: fixed,border-collapse: collapse - Header cells:
font-size: 10px,font-weight: 500, uppercase,letter-spacing: 0.6px- bottom spacing:
padding-bottom: 12px
- Body cells:
- primary text:
13px - secondary/metrics text:
12px - row vertical spacing via cell padding: typically
5px
- primary text:
- Hot Items column widths:
- check
10%, task40%, requested by35%, due by15%
- check
- Client Highlight column widths:
- icon
5%, company22%, contact23%, projects13%, open13%, outstanding12%, paid12%
- icon
- Sorting rule:
- Every visible data column header must be sortable.
- Use clickable header controls (
SortTh) with ascending/descending indicator. - Exclude only non-data utility/action columns (checkbox-only, icon-only status marker, action buttons).
12) Profile Page
- Container: full available content width, column,
gap: 24 - Top row:
grid-template-columns: 1fr 280px,gap: 24 - At
<=1200px: top row stacks to one column - Main profile card uses widget shell
- Internal card layout:
- row
gap: 20px - portrait column
width: 160px, portrait max140x140, circle - detail grid
140px 1fr,row-gap: 8,column-gap: 12,margin-top: 14 - social row
margin-top: 14,gap: 8 - self-only edit button:
position: absolute,top: 18px,right: 21px(aligns to card padding),border-radius: 8px(matches card),height: 30px,font-size: 12px
- row
- Right calendar card shows only tasks/events assigned to the viewed profile user
- Modal:
- overlay: fixed inset,
z-index: 1200, bgrgba(0,0,0,0.58), blur6px - overlay padding:
24px - modal width:
min(620px, 100%) - modal max-height:
calc(100vh - 48px),overflow-y: auto
- overlay: fixed inset,
13) Radius + Geometry Rules
- Dashboard/profile widgets:
8pxradius - Sidebar:
8pxradius - Buttons/input/dropdowns mostly
4pxradius - Circular elements (avatar/day/icon badges):
50%
14) Z-Index Stack
- Sidebar:
200 - Header dropdowns/tooltips:
300 - Calendar hover popover:
1002within card context (card can be 1001 active) - Modal overlay:
1200
15) Motion
- Motion vars:
- fast
160ms - base
220ms - easing
cubic-bezier(0.22, 1, 0.36, 1)
- fast
- Dropdown animation:
ui-fade-upfromtranslateY(4px)+ opacity 0 -> 1
17) Hover Interaction Contract
- Sidebar, header icon buttons, dropdown items, and avatar menu items must show a visible hover surface before click.
- Single hover source-of-truth block controls these elements.
- Dark hover surface baseline:
#1f1f1f. - Light hover surface baseline:
rgba(0,0,0,0.08). - Nav icon opacity must lift from muted to full on hover (
opacity: 1). - Hover and active must be visually distinct:
- hover uses stronger temporary contrast (
bg+ thin border), - active remains persistent selected-state background.
- hover uses stronger temporary contrast (
16) Non-Negotiable Implementation Rules
- Keep gradient backgrounds on
html, notbody - Keep widget shell values (
18px 21px,8px, blur 12, border token) consistent - Maintain global
24pxspacing rhythm for page/frame/grid gaps - Keep team dashboard card order:
- Open Tasks
- Active Projects
- Net Profit
- Revenue (wide)
- Keep row 2 order: Recent Activity (left), Calendar (right)