Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

381 lines
12 KiB
JSON

[
{
"id": "F001",
"description": "Install `next-themes` package in the server workspace",
"implemented": true,
"prdRefs": ["FR-1.1"]
},
{
"id": "F001b",
"description": "Add `darkMode: 'class'` to `server/tailwind.config.ts`",
"implemented": true,
"prdRefs": ["FR-1.2"]
},
{
"id": "F002",
"description": "Replace hardcoded `background: 'white'` and `card: 'white'` in Tailwind config `colors` with CSS variable references that swap between themes",
"implemented": true,
"prdRefs": ["FR-1.2"]
},
{
"id": "F003",
"description": "Make status colors (success, warning, error) in Tailwind config theme-aware by defining CSS variables for them in both `.light` and `.dark` blocks",
"implemented": true,
"prdRefs": ["FR-1.3"]
},
{
"id": "F004",
"description": "Replace custom `ThemeContext` with `next-themes` `ThemeProvider` in root layout — remove `server/src/context/ThemeContext.tsx` hardcoded light-only logic; `next-themes` handles localStorage, system preference, and flash prevention",
"implemented": true,
"prdRefs": ["FR-1.5"]
},
{
"id": "F004b",
"description": "Create `useAppTheme()` wrapper hook that combines `next-themes` `useTheme()` with DB persistence — syncs theme changes to `user_preferences` table via `UserPreferences.upsert()`",
"implemented": true,
"prdRefs": ["FR-1.6"]
},
{
"id": "F005",
"description": "Update root layout (`server/src/app/layout.tsx`) — remove hardcoded `className=\"light\"` on `<body>`, wrap with `next-themes` `ThemeProvider` (attribute='class', defaultTheme='system')",
"implemented": true,
"prdRefs": ["FR-1.5"]
},
{
"id": "F006",
"description": "Pass `appearance` prop (light/dark) to Radix UI `<Theme>` component based on active theme",
"implemented": true,
"prdRefs": ["FR-1.6"]
},
{
"id": "F007",
"description": "Pass `forceColorScheme` or equivalent color scheme prop to `<MantineProvider>` based on active theme",
"implemented": true,
"prdRefs": ["FR-1.7"]
},
{
"id": "F008",
"description": "Create a `ThemeToggle` component with three options: Light, Dark, System — using sun/moon icons",
"implemented": true,
"prdRefs": ["FR-2.1"]
},
{
"id": "F009",
"description": "Place the `ThemeToggle` component in the MSP portal header bar, accessible from every page",
"implemented": true,
"prdRefs": ["FR-2.2"]
},
{
"id": "F009b",
"description": "Place the `ThemeToggle` component in the client portal navigation bar",
"implemented": true,
"prdRefs": ["FR-2.3"]
},
{
"id": "F010",
"description": "`next-themes` handles localStorage persistence (key: `theme`) and blocking script for flash prevention automatically — no custom code needed",
"implemented": true,
"prdRefs": ["FR-2.4"]
},
{
"id": "F011",
"description": "On theme change, sync preference to `user_preferences` DB table via `UserPreferences.upsert(knex, { user_id, setting_name: 'theme', setting_value: JSON.stringify(theme) })`",
"implemented": true,
"prdRefs": ["FR-2.6"]
},
{
"id": "F012",
"description": "On authenticated page load, fetch theme preference from `user_preferences` DB and apply it (overriding localStorage if different) — enables cross-device sync",
"implemented": true,
"prdRefs": ["FR-2.7"]
},
{
"id": "F013",
"description": "Create a token mapping layer that syncs `--color-*` variables to `--alga-*` variables (or vice versa) whenever the theme changes",
"implemented": true,
"prdRefs": ["FR-3.1"]
},
{
"id": "F014",
"description": "Ensure both `--color-*` and `--alga-*` token sets update when theme class changes on `<body>`",
"implemented": true,
"prdRefs": ["FR-3.2"]
},
{
"id": "F015",
"description": "Update the iframe bridge (`iframeBridge.ts`) to re-send theme tokens to extension iframes when the user switches theme",
"implemented": true,
"prdRefs": ["FR-3.3"]
},
{
"id": "F016",
"description": "Sidebar renders correctly in dark mode — verify CSS variables and visual appearance",
"implemented": true,
"prdRefs": ["FR-4.1"]
},
{
"id": "F017",
"description": "Header renders correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-4.2"]
},
{
"id": "F018",
"description": "Fix dark submenu CSS variables in `.dark` block — change `--color-submenu-bg: #D0D5DD` to dark value (e.g. `#1f2937`), `--color-submenu-text: #000000` to light value (e.g. `#f5f5f5`), and verify submenu renders correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-1.9", "FR-4.3"]
},
{
"id": "F019",
"description": "Main content area background switches to dark background in dark mode",
"implemented": true,
"prdRefs": ["FR-4.4"]
},
{
"id": "F020",
"description": "Page-level layout wrappers (e.g., content containers, split panes) use theme-aware backgrounds",
"implemented": true,
"prdRefs": ["FR-4.5"]
},
{
"id": "F021",
"description": "Cards and panels use theme-aware backgrounds instead of `bg-white`",
"implemented": true,
"prdRefs": ["FR-5.1"]
},
{
"id": "F022",
"description": "Form components (inputs, selects, textareas) use theme-aware borders, backgrounds, and text colors",
"implemented": true,
"prdRefs": ["FR-5.2"]
},
{
"id": "F023",
"description": "Checkbox and switch components use theme-aware colors — fix hardcoded `white` in globals.css switch thumb",
"implemented": true,
"prdRefs": ["FR-5.2", "FR-8.1"]
},
{
"id": "F024",
"description": "All button variants render correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-5.3"]
},
{
"id": "F025",
"description": "Data tables and grids use theme-aware borders, row hovers, header backgrounds, and text colors",
"implemented": true,
"prdRefs": ["FR-5.4"]
},
{
"id": "F026",
"description": "Modals and dialogs have dark backgrounds and borders in dark mode",
"implemented": true,
"prdRefs": ["FR-5.5"]
},
{
"id": "F027",
"description": "Dropdowns and popovers use theme-aware backgrounds",
"implemented": true,
"prdRefs": ["FR-5.6"]
},
{
"id": "F028",
"description": "Tooltips use theme-aware backgrounds and text",
"implemented": true,
"prdRefs": ["FR-5.7"]
},
{
"id": "F029",
"description": "Badges and status indicators are readable in dark mode — badge CSS variables already exist for both themes",
"implemented": true,
"prdRefs": ["FR-5.8"]
},
{
"id": "F030",
"description": "Alerts and notification toasts render correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-5.9"]
},
{
"id": "F031",
"description": "Tabs and navigation components use theme-aware colors",
"implemented": true,
"prdRefs": ["FR-5.10"]
},
{
"id": "F032",
"description": "Ticket list and detail views render correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-6.1"]
},
{
"id": "F033",
"description": "Project views (board and list) render correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-6.2"]
},
{
"id": "F034",
"description": "Billing and invoice screens render correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-6.3"]
},
{
"id": "F035",
"description": "Scheduling and calendar views render correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-6.4"]
},
{
"id": "F036",
"description": "Dashboard widgets and chart components render correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-6.5"]
},
{
"id": "F037",
"description": "Document editor (Tiptap/ProseMirror) renders correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-6.6"]
},
{
"id": "F038",
"description": "Settings pages render correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-6.7"]
},
{
"id": "F039",
"description": "react-day-picker custom overrides in globals.css support dark mode",
"implemented": true,
"prdRefs": ["FR-7.1"]
},
{
"id": "F040",
"description": "react-big-calendar has dark mode overrides (CDN CSS + custom overrides)",
"implemented": true,
"prdRefs": ["FR-7.2"]
},
{
"id": "F041",
"description": "Radix UI Tables custom overrides in globals.css support dark mode — fix hardcoded `rgba(0, 0, 0, 0.05)` hover",
"implemented": true,
"prdRefs": ["FR-7.3"]
},
{
"id": "F042",
"description": "Mantine components respect the active theme color scheme",
"implemented": true,
"prdRefs": ["FR-7.4"]
},
{
"id": "F043",
"description": "Tiptap/ProseMirror editor area has appropriate dark mode styles",
"implemented": true,
"prdRefs": ["FR-7.5"]
},
{
"id": "F044",
"description": "Replace hardcoded `white` values in globals.css switch/button styles with `rgb(var(--color-*))` references",
"implemented": true,
"prdRefs": ["FR-8.1"]
},
{
"id": "F045",
"description": "Replace hardcoded hex colors for collaboration cursor (`#0d0d0d`) in globals.css with CSS variables",
"implemented": true,
"prdRefs": ["FR-8.2"]
},
{
"id": "F046",
"description": "Migrate CSS module files (12 files) from hardcoded hex colors to CSS variable references",
"implemented": true,
"prdRefs": ["FR-8.3"]
},
{
"id": "F047",
"description": "Replace hardcoded `rgba(0, 0, 0, ...)` in table hover rows and `bg-dotted` background with theme-aware values",
"implemented": true,
"prdRefs": ["FR-8.4"]
},
{
"id": "F048",
"description": "Hardcoded `time-slot-working` background `white` in globals.css replaced with CSS variable",
"implemented": true,
"prdRefs": ["FR-8.1"]
},
{
"id": "F049",
"description": "Extension loading overlay gradient uses theme-aware values in dark mode",
"implemented": true,
"prdRefs": ["FR-8.4"]
},
{
"id": "F050",
"description": "Add `next-themes` `ThemeProvider` to client portal layout (`server/src/app/client-portal/ClientPortalLayoutClient.tsx`)",
"implemented": true,
"prdRefs": ["FR-9.1"]
},
{
"id": "F051",
"description": "Replace hardcoded `bg-gray-100` in `ClientPortalLayout.tsx` with theme-aware CSS variable reference",
"implemented": true,
"prdRefs": ["FR-9.3"]
},
{
"id": "F052",
"description": "Update `generateColorShades()` in `packages/tenancy/src/lib/generateBrandingStyles.ts` to also produce an inverted dark-mode scale (swap 50↔900, 100↔800, 200↔700, 300↔600, keep 400/500 similar) — same RGB lerp algorithm, inverted step mapping",
"implemented": true,
"prdRefs": ["FR-9.4"]
},
{
"id": "F052b",
"description": "Update `generateBrandingStyles()` to emit branded CSS variables scoped under `.dark` selector for dark mode shades, in addition to existing unscoped (light mode) variables",
"implemented": true,
"prdRefs": ["FR-9.4"]
},
{
"id": "F052c",
"description": "Update `BrandingProvider` client-side injection to also inject `.dark`-scoped branded variables (inverted shades) alongside the existing light-mode variables",
"implemented": true,
"prdRefs": ["FR-9.4"]
},
{
"id": "F053",
"description": "Add `next-themes` provider to client portal auth pages (`server/src/app/auth/client-portal/`) so login/signup forms support dark mode",
"implemented": true,
"prdRefs": ["FR-9.5"]
},
{
"id": "F054",
"description": "Client portal tickets page renders correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-9.6"]
},
{
"id": "F055",
"description": "Client portal invoices/billing page renders correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-9.6"]
},
{
"id": "F056",
"description": "Client portal approvals page renders correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-9.6"]
},
{
"id": "F057",
"description": "Client portal profile page renders correctly in dark mode",
"implemented": true,
"prdRefs": ["FR-9.6"]
},
{
"id": "F058",
"description": "Add dark/light mode preview toggle to client portal branding settings page — when admin configures branding colors, they can preview how the client portal looks in both light and dark modes",
"implemented": true,
"prdRefs": ["FR-9.4"]
}
]