Session 2026-05-29: profile layout 2-col, file browser copy/paste, fbq-proxy/backfill fns, migrations, UI updates
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -21,6 +21,7 @@ This is the single source of truth for dashboard/profile visual structure and UI
|
||||
- Accent: `#F5A523`
|
||||
- Card bg dark: `rgba(255,255,255,0.02)`
|
||||
- Card bg light: `rgba(0,0,0,0.02)`
|
||||
- Sidebar/menu shell uses the same transparent card background token as cards
|
||||
- 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)`
|
||||
@@ -44,6 +45,9 @@ This is the single source of truth for dashboard/profile visual structure and UI
|
||||
- `border-radius: 8px`
|
||||
- `padding: 18px 21px`
|
||||
- `backdrop-filter: blur(12px)` + `-webkit-backdrop-filter`
|
||||
- Card width is not an intrinsic card token.
|
||||
- Width is owned by the page/grid/container the card lives in.
|
||||
- Cards should fill the slot provided by that page layout unless a page-level rule explicitly fixes a track.
|
||||
- Compact card radius (legacy generic `.card`): `4px` (do not use for new dashboard widgets)
|
||||
|
||||
## 6) Header + Top Right Controls
|
||||
@@ -57,7 +61,8 @@ This is the single source of truth for dashboard/profile visual structure and UI
|
||||
|
||||
## 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 2: `grid-template-columns: 1fr 1fr 280px`, `gap: 24`, `margin-top: 24`
|
||||
- Order: Recent Activity (left), Tasks In Progress (center), Calendar (right, fixed width)
|
||||
- Row 3: `grid-template-columns: 1fr 1fr`, `gap: 24`, `margin-top: 24`
|
||||
- Row 4 full-width: `margin-top: 24`
|
||||
|
||||
@@ -96,6 +101,9 @@ This is the single source of truth for dashboard/profile visual structure and UI
|
||||
|
||||
## 11) Tables
|
||||
- General table layout in dashboard cards: `table-layout: fixed`, `border-collapse: collapse`
|
||||
- Column widths are table-specific, not universal tokens.
|
||||
- Widths belong to the individual table/view that defines them.
|
||||
- Reuse widths only when the same table pattern is intentionally repeated.
|
||||
- Header cells:
|
||||
- `font-size: 10px`, `font-weight: 500`, uppercase, `letter-spacing: 0.6px`
|
||||
- bottom spacing: `padding-bottom: 12px`
|
||||
@@ -103,7 +111,7 @@ This is the single source of truth for dashboard/profile visual structure and UI
|
||||
- primary text: `13px`
|
||||
- secondary/metrics text: `12px`
|
||||
- row vertical spacing via cell padding: typically `5px`
|
||||
- Hot Items column widths:
|
||||
- Hot Tasks column widths:
|
||||
- check `10%`, task `40%`, requested by `35%`, due by `15%`
|
||||
- Client Highlight column widths:
|
||||
- icon `5%`, company `22%`, contact `23%`, projects `13%`, open `13%`, outstanding `12%`, paid `12%`
|
||||
@@ -114,26 +122,105 @@ This is the single source of truth for dashboard/profile visual structure and UI
|
||||
|
||||
## 12) Profile Page
|
||||
- Container: full available content width, column, `gap: 24`
|
||||
- Top row: `grid-template-columns: 1fr 280px`, `gap: 24`
|
||||
- Top row: `grid-template-columns: 60fr 40fr`, `gap: 24`
|
||||
- At `<=1200px`: top row stacks to one column
|
||||
- Main profile card uses widget shell
|
||||
- Profile card width is determined by the profile page grid, not by the card itself.
|
||||
- Internal card layout:
|
||||
- row `gap: 20px`
|
||||
- portrait column `width: 160px`, portrait max `140x140`, circle
|
||||
- portrait max `140x140`, circle
|
||||
- portrait aligns flush in the row without extra wrapper padding/side space
|
||||
- detail grid `140px 1fr`, `row-gap: 8`, `column-gap: 12`, `margin-top: 14`
|
||||
- profile name/title: `18px`, `500`, `line-height: 1.2`
|
||||
- company subtitle: `13px`, secondary text
|
||||
- contact/detail rows: `13px`, primary text
|
||||
- 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`
|
||||
- company line under title is always visible; fallback display is `—` when no company is assigned
|
||||
- right-side meta labels (`Member Since`, `Role`) use widget-title sizing: `11px`, `500`, uppercase, `letter-spacing: 0.8px`
|
||||
- right-side meta values use body sizing: `13px`
|
||||
- self-only edit button: `position: absolute`, `top: 18px`, `right: 21px` (aligns to card padding), `border-radius: 8px` (matches card), `height: 30px`, `font-size: 12px`, `padding: 0 12px`
|
||||
- default outline button hover/focus fills with accent gold and uses dark text
|
||||
- Right calendar card shows only tasks/events assigned to the viewed profile user
|
||||
- Modal:
|
||||
- overlay: fixed inset, `z-index: 1200`, bg `rgba(0,0,0,0.58)`, blur `6px`
|
||||
- overlay padding: `24px`
|
||||
- modal width: `min(620px, 100%)`
|
||||
- modal max-height: `calc(100vh - 48px)`, `overflow-y: auto`
|
||||
- Profile page left column includes a `Tasks In Progress` card above `Recent Activity`
|
||||
- Profile `Tasks In Progress` follows the dashboard table/card pattern:
|
||||
- same widget shell and header treatment
|
||||
- same show-all behavior (5 visible by default)
|
||||
- profile-specific filter is tasks assigned to the viewed user with statuses `in_progress`, `on_hold`, or `client_review`
|
||||
- columns are `Task` and `Status`
|
||||
- Profile activity feed action text pattern: `Task started`, `Task submitted`, `Task approved`, `Task rejected` (sentence title case)
|
||||
- Activity feed includes:
|
||||
- actions performed by the viewed user
|
||||
- `Task approved` and `Task rejected` entries for tasks assigned to that viewed user (even if actioned by someone else)
|
||||
## 12.5) File Sharing
|
||||
- Main split: `grid-template-columns: minmax(0, 1fr) minmax(0, 3fr)` for an effective `25 / 75` layout, `gap: 24`
|
||||
- Left stacked cards (`Pinned`, `Navigation`): `gap: 24`
|
||||
- Canonical folder structure:
|
||||
- team and subcontractor profile folders live at `Team/<User Name>`
|
||||
- company folders live at `Clients/<Company Name>`
|
||||
- project folders live at `Clients/<Company Name>/Projects/<Project Name>`
|
||||
- every project auto-creates `00 Project Files`
|
||||
- task folders live at `Clients/<Company Name>/Projects/<Project Name>/<Task Name>`
|
||||
- every task auto-creates `Request Info`, `Working Files`, and `Old Books`
|
||||
- request submission files are copied into `Request Info/R00`, `R01`, and higher revision folders
|
||||
- renaming a team user, subcontractor user, company, project, or task must rename the matching filesystem folder
|
||||
- folder repair/backfill is additive only: create missing folders, leave existing folders untouched
|
||||
- request-info backfill must skip files that already exist and must not overwrite added working files or user-managed files
|
||||
- deleting a task in the portal moves its task folder into `Archive/Clients/<Company Name>/Projects/<Project Name>/<Task Name>` instead of deleting it
|
||||
- deleting a project in the portal moves its project folder into `Archive/Clients/<Company Name>/Projects/<Project Name>` instead of deleting it
|
||||
- orphan reconciliation may move folders into archive when they no longer map to portal records
|
||||
- orphan team folders move to `Archive/Team/<Folder Name>` when no team or subcontractor profile matches that folder name
|
||||
- orphan project folders move to `Archive/Clients/<Company Name>/Projects/<Project Name>` when no portal project matches that folder name under that company
|
||||
- orphan reconciliation does not remove company roots or overwrite archived content; it merge-moves into archive
|
||||
- Access/home rules:
|
||||
- team members have full file access
|
||||
- client users with exactly one tied company use that company folder as home: `/Clients/<Company Name>`
|
||||
- client users tied to multiple companies use `/Clients` as home and only see company folders they are tied to
|
||||
- `/Clients` acts as a virtual parent for multi-company client users and must not expose unrelated company folders
|
||||
- subcontractor users use virtual home `/`
|
||||
- subcontractor virtual home shows `Team` plus only the project folders they are assigned to
|
||||
- subcontractor users skip all other root folders and must not see unrelated client or internal roots
|
||||
- subcontractor `Team` maps to the real shared `Team` folder
|
||||
- each subcontractor project folder is a virtual root that maps to the real client project path `/Clients/<Company>/Projects/<Project>`
|
||||
- Right card header:
|
||||
- title label is `File Browser`
|
||||
- drag/drop note sits directly under the title and uses subtext sizing: `12px`
|
||||
- current file path uses the same `11px` uppercase label treatment as the title row family
|
||||
- toolbar does not show `+ Folder` or `Upload` buttons
|
||||
- upload happens by dragging and dropping files or folders into the right card
|
||||
- delete action uses the same geometry as the profile edit button (`top: 18px`, `right: 21px`, `8px` radius, `30px` height, `12px` text, `0 12px` padding) but uses danger styling with red hover/fill
|
||||
- Right card table:
|
||||
- uses dashboard table styling (`table-layout: fixed`, transparent header row, `10px` uppercase headers, `13px/12px` body text)
|
||||
- card padding matches dashboard widget shell (`18px 21px`)
|
||||
- clickable text inside the table highlights in accent; rows do not use block hover fill
|
||||
- body cells are borderless like dashboard card tables
|
||||
- body cell padding matches dashboard tables exactly: `5px`
|
||||
- visible headers (`Name`, `Size`, `Modified`) use shared sortable header controls
|
||||
- file/folder icon footprint is compact so row height stays on the same cadence as dashboard tables
|
||||
- alternating rows use a very subtle theme-aware tint for scanability
|
||||
- Navigation tree:
|
||||
- `Home` aligns to the first arrow column
|
||||
- connector line runs through the arrow center column
|
||||
- pinned folders are user-specific and must not be shared across users on the same device/browser session
|
||||
- hover is text-only accent color, no row fill
|
||||
|
||||
## 13) Radius + Geometry Rules
|
||||
- Dashboard/profile widgets: `8px` radius
|
||||
- Sidebar: `8px` radius
|
||||
- Buttons/input/dropdowns mostly `4px` radius
|
||||
- Standard app buttons use the `Edit Profile` geometry:
|
||||
- height: `30px`
|
||||
- horizontal padding: `0 12px`
|
||||
- border-radius: `8px`
|
||||
- font-size: `11px`
|
||||
- font-weight: `500`
|
||||
- letter-spacing: `0.8px`
|
||||
- text-transform: uppercase
|
||||
- line-height: `1`
|
||||
- label color follows theme text roles:
|
||||
- dark mode: primary button labels use dark text on accent fill; outline labels use primary text on transparent surface
|
||||
- light mode: outline labels use light-theme primary text; danger labels use danger text
|
||||
- outline button border uses the same `var(--border)` token as card outlines unless a button role explicitly overrides it
|
||||
- keep existing button role styling intact (`outline`, `primary`, `danger`); geometry changes, not role colors
|
||||
- Inputs/dropdowns may use their own control radius unless a page-specific rule says otherwise
|
||||
- Circular elements (avatar/day/icon badges): `50%`
|
||||
|
||||
## 14) Z-Index Stack
|
||||
@@ -155,9 +242,13 @@ This is the single source of truth for dashboard/profile visual structure and UI
|
||||
- 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`).
|
||||
- Clickable text links use text-only highlight on hover/focus (`color: var(--accent)`), not whole-row/background fill.
|
||||
- Hover and active must be visually distinct:
|
||||
- hover uses stronger temporary contrast (`bg` + thin border),
|
||||
- active remains persistent selected-state background.
|
||||
- File Sharing left navigation exception:
|
||||
- `Pinned` + `Navigation` tree rows use text-only hover highlight (`color: var(--accent)`).
|
||||
- Do not apply row background fill for hover in this section.
|
||||
|
||||
## 16) Non-Negotiable Implementation Rules
|
||||
- Keep gradient backgrounds on `html`, not `body`
|
||||
@@ -168,4 +259,10 @@ This is the single source of truth for dashboard/profile visual structure and UI
|
||||
2. Active Projects
|
||||
3. Net Profit
|
||||
4. Revenue (wide)
|
||||
- Keep row 2 order: Recent Activity (left), Calendar (right)
|
||||
- Keep row 2 order: Recent Activity (left), Tasks In Progress (center), Calendar (right fixed at `280px`)
|
||||
|
||||
## 18) Invoice Rules
|
||||
- New work (`R00`) is billed at the new-service rate.
|
||||
- Revision `R01` is free.
|
||||
- Revisions `R02+` are billed incrementally: each uninvoiced revision entry contributes exactly `1x` revision charge.
|
||||
- Previously invoiced revisions are excluded; later invoices only charge newly uninvoiced revisions (e.g. if `R02` was already invoiced, at `R04` only `R03` + `R04` are billed).
|
||||
|
||||
Reference in New Issue
Block a user