Skip to content

Comments

Darker dark mode#472

Merged
Blaumaus merged 7 commits intomainfrom
dark-mode-improvements
Feb 7, 2026
Merged

Darker dark mode#472
Blaumaus merged 7 commits intomainfrom
dark-mode-improvements

Conversation

@Blaumaus
Copy link
Member

@Blaumaus Blaumaus commented Feb 7, 2026

Changes

If applicable, please describe what changes were made in this pull request.

Community Edition support

  • Your feature is implemented for the Swetrix Community Edition
  • This PR only updates the Cloud (Enterprise) Edition code (e.g. Paddle webhooks, blog, payouts, etc.)

Database migrations

  • Clickhouse / MySQL migrations added for this PR
  • No table schemas changed in this PR

Documentation

  • You have updated the documentation according to your PR
  • This PR did not change any publicly documented endpoints

Summary by CodeRabbit

  • New Features

    • Multi-tab organisation settings (General, People, Projects, Danger) with improved navigation.
    • Enhanced People and Projects management views with a consistent, table-driven UI.
    • Organisation-settings translations added for multiple languages.
  • UI/UX Improvements

    • Refined dark theme palette for more consistent visuals across the app.
    • Unified auth and social sign-in button appearances.
    • Standardized form controls (inputs, textareas, selects) and button variants for cohesive editing and interaction.

@Blaumaus Blaumaus self-assigned this Feb 7, 2026
@coderabbitai
Copy link

coderabbitai bot commented Feb 7, 2026

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

Widespread Tailwind dark-mode token updates (slate-800/900 → slate-900/950) across the app, plus UI refactors: tabbed Organisation Settings with a new SettingsTab type, Headless UI role menus replacing custom dropdowns in People pages, auth button simplifications, Textarea converted to forwardRef+memo, and added locale strings for organisation settings. (50 words)

Changes

Cohort / File(s) Summary
Global dark-mode theme
web/app/**, web/app/routes/*.tsx, web/app/root.tsx, web/public/**/*
Mass replacement of Tailwind dark-mode color tokens (mostly slate-800/900 → slate-900/950) across pages, components, and UI primitives (backgrounds, hovers, borders, rings). Purely presentational.
Organisation settings — tabbed UI
web/app/pages/Organisations/Settings/index.tsx
Adds multi-tab settings (general, people, projects, danger), URL search-param driven activeTab, tab metadata, and new `type SettingsTab = 'general'
People management (Org + Project)
web/app/pages/Organisations/Settings/People.tsx, web/app/pages/Project/Settings/People/People.tsx
Replaces custom dropdowns with Headless UI Menu/Transition, removes manual click-outside/ref logic, moves role-change and remove flows into MenuItems, and updates table/row markup and styling.
Auth buttons simplified
web/app/components/GithubAuth.tsx, web/app/components/GoogleAuth.tsx, web/app/components/OIDCAuth.tsx
Removed isMiniButton prop for GitHub/Google; components now render a single Button variant. OIDCAuth removes w-full and updates dark-mode tokens; Button className adjustments for dark borders/backgrounds.
Textarea API & implementation
web/app/ui/Textarea.tsx
Converted Textarea to memo(forwardRef) with props extending HTML textarea attributes, forwards ref, spreads rest props, and updates styling. Public API and typing changed accordingly.
Modal & Button updates
web/app/ui/Modal.tsx, web/app/ui/Button.tsx
Modal now uses Button component for close action; Button variants (secondary/white/semiDanger/ghost) updated with explicit border/background/dark-mode classes.
Project list / Projects settings
web/app/pages/Organisations/Settings/Projects.tsx
Reworked Projects list into a responsive bordered table with new row markup and dark-mode styling adjustments.
Large UI refactors (Project view, tabs, primitives)
web/app/pages/Project/View/*, web/app/pages/Project/tabs/*, web/app/ui/{Select,MultiSelect,Datepicker,Dropdown,Combobox,Input,Pagination,Checkbox,...}
Wide presentational changes, some component swaps (e.g., Textarea usage in AskAI), group selector updates for Checkbox, ring color adjustments (ring-black/10 → ring-gray-200), and various className reorganizations.
Localization — organisation settings
web/public/locales/{en,de,fr,pl,uk}.json
Adds organisations.settings.tabs JSON entries (general, generalDesc, people, peopleDesc, projects, projectsDesc, danger, dangerDesc) across locales.
High-impact/structural files
web/app/pages/Organisations/Settings/index.tsx, web/app/pages/Organisations/Settings/People.tsx, web/app/pages/Project/Settings/People/People.tsx
Large diffs with structural UI changes (tab system, Headless UI menus, table restructuring) — these files deserve focused review for UX/state integration.
Small behavioral signature changes
web/app/components/GoogleAuth.tsx, web/app/ui/Textarea.tsx
Removed isMiniButton prop from GoogleAuth props; Textarea props/type and export shape changed (forwardRef + memo).

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant OrgSettings as Organisation Settings Page
    participant TabNav as Tab Navigation (sidebar/select)
    participant PeopleComp as People Component (Headless Menu)
    participant API as Backend API

    User->>OrgSettings: Request organisation settings page
    OrgSettings->>OrgSettings: Read URL search params → set activeTab
    OrgSettings->>TabNav: Render tab sidebar / mobile Select
    User->>TabNav: Select "People" tab
    TabNav-->>OrgSettings: activeTab change
    OrgSettings->>PeopleComp: Mount People component
    User->>PeopleComp: Open member role menu
    PeopleComp->>PeopleComp: Headless UI Menu opens (Transition)
    User->>PeopleComp: Select role / choose remove
    PeopleComp->>API: PATCH member role or DELETE member
    API-->>PeopleComp: Return success/failure
    PeopleComp-->>User: Update UI / show feedback
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 I hopped through classes late at night,

Swapped slates to deepen moonlit sight.
Menus now glide, tabs take their place,
Textarea forwards, buttons embrace.
A darker coat — the UI hums with delight.

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive The PR description follows the provided template structure with all required sections marked, but the 'Changes' section is empty and provides no substantive explanation of what was modified. Add details in the Changes section describing the scope of dark mode updates (e.g., 'Updated dark mode color tokens from slate-800/900 to slate-900/950 variants across 100+ components for darker dark mode aesthetics').
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Darker dark mode' is concise and clearly summarizes the main change: updating dark mode color tokens to darker slate values throughout the codebase.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch dark-mode-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@Blaumaus Blaumaus marked this pull request as ready for review February 7, 2026 19:15
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
web/app/pages/Project/tabs/Experiments/ExperimentSettingsModal.tsx (2)

816-833: ⚠️ Potential issue | 🟡 Minor

Use indigo-500 for dark-mode accents in toggle buttons.

These dark-mode accent classes use indigo-600/300, which conflicts with the project token rules. Please switch dark-mode accent colors to indigo-500.
As per coding guidelines: "Use indigo-600 as the primary accent color in light mode and indigo-500 in dark mode."

✅ Suggested fix (example for one toggle state)
-  ? 'border-indigo-500 bg-indigo-50 text-indigo-700 dark:border-indigo-600 dark:bg-indigo-900/20 dark:text-indigo-300'
+  ? 'border-indigo-500 bg-indigo-50 text-indigo-700 dark:border-indigo-500 dark:bg-indigo-900/20 dark:text-indigo-500'

Also applies to: 893-913, 969-988


739-756: ⚠️ Potential issue | 🟡 Minor

Align success/danger colors with semantic tokens (emerald/red-500/600).

The "Increase" state uses green in dark mode and the "Decrease" state uses red-400; both deviate from the semantic palette rules.
As per coding guidelines: "Apply danger color as red-500/600, success as emerald-500/600, warning as amber-500/600 for semantic status indicators."

✅ Suggested fix
-  ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'
+  ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-500'
...
-  ? 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400'
+  ? 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-500'
web/app/pages/Project/tabs/Experiments/ExperimentResults.tsx (1)

385-409: ⚠️ Potential issue | 🟡 Minor

Dark-mode hover effect is invisible on table rows.

The container at Line 385 sets dark:bg-slate-900/50, and the row hover at Line 409 applies dark:hover:bg-slate-900/50 — the same color. Users won't see any hover feedback in dark mode.

Use a slightly different shade for the hover, e.g. dark:hover:bg-slate-800/50:

Proposed fix
-                    className='hover:bg-gray-50 dark:hover:bg-slate-900/50'
+                    className='hover:bg-gray-50 dark:hover:bg-slate-800/50'

The same issue applies to the MetricsTable rows at Lines 509 and 571, whose parent (Line 479) also uses dark:bg-slate-900/50.

web/app/pages/Organisations/Settings/Projects.tsx (1)

306-314: ⚠️ Potential issue | 🟡 Minor

Match the search field styling to the design system (rings, radius, dark bg).

This input uses rounded-lg, ring-gray-300, and focus:ring-gray-500, and a dark:bg-slate-950. These don’t align with the required tokens and focus styling.

Proposed fix
-            className='block h-8 w-full rounded-lg border-none bg-gray-50 p-2.5 text-sm text-gray-900 ring-1 ring-gray-300 focus:ring-gray-500 sm:pl-10 dark:bg-slate-950 dark:text-white dark:placeholder-gray-400 dark:ring-slate-600 dark:focus:ring-slate-200'
+            className='block h-8 w-full rounded-md border-none bg-gray-50 p-2.5 text-sm text-gray-900 ring-1 ring-black/5 focus:ring-indigo-500 sm:pl-10 dark:bg-slate-900 dark:text-white dark:placeholder-gray-400 dark:ring-white/10 dark:focus:ring-indigo-500'

As per coding guidelines: Apply ring borders to inputs with focus:ring-indigo-500 for focus states; Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders; Use border radius: rounded-md for small elements, rounded-lg for medium, rounded-xl for large, rounded-2xl for cards.

web/app/pages/Organisations/Settings/People.tsx (1)

361-366: ⚠️ Potential issue | 🟡 Minor

Remove modal closes prematurely — user never sees the loading state and won't see server errors.

onRemove calls fetcher.submit(), which returns synchronously. The await has no effect, so closeRemoveUserModal() fires immediately, closing the dialog before the request completes. If deletion fails, the error toast still fires (from the useEffect), but the modal is already gone. Meanwhile, the useEffect at line 226 also calls closeRemoveUserModal() on success, making the call here redundant.

Drop closeRemoveUserModal() from onSubmit and rely solely on the useEffect success handler (which already closes the modal on success at line 226):

Proposed fix
       <Modal
         onClose={closeRemoveUserModal}
-        onSubmit={async () => {
-          await onRemove(memberToRemove!)
-          closeRemoveUserModal()
+        onSubmit={() => {
+          onRemove(memberToRemove!)
         }}
         submitText={t('common.yes')}
🤖 Fix all issues with AI agents
In `@web/app/components/pricing/MarketingPricing.tsx`:
- Around line 170-173: The button in MarketingPricing.tsx uses bg-gray-100 with
a child span class text-gray-100, causing unreadable light-on-light contrast;
update the button/span classes so light mode has readable contrast while
preserving dark-mode look — for example change the button background to a
translucent variant (e.g., bg-white/10 or similar) or switch the span to a dark
text color in light mode (e.g., replace text-gray-100 with text-gray-800 and add
dark:text-gray-100) inside the same button element; modify the className on the
button element and the span that renders {t('pricing.billedYearly')}
accordingly.
🟡 Minor comments (53)
web/app/pages/NotFound/index.tsx-14-14 (1)

14-14: ⚠️ Potential issue | 🟡 Minor

Align dark background token with design guidelines.

Line 14 uses dark:bg-slate-950, but the design tokens specify slate-900 for dark backgrounds. Please switch to dark:bg-slate-900 to keep palette consistency. As per coding guidelines: "Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders".

✅ Suggested change
-    <div className='min-h-min-footer bg-gray-50 px-4 py-16 sm:px-6 sm:py-24 md:grid md:place-items-center lg:px-8 dark:bg-slate-950'>
+    <div className='min-h-min-footer bg-gray-50 px-4 py-16 sm:px-6 sm:py-24 md:grid md:place-items-center lg:px-8 dark:bg-slate-900'>
web/app/pages/Project/tabs/Captcha/CaptchaView.tsx-224-227 (1)

224-227: ⚠️ Potential issue | 🟡 Minor

Use slate-900 for dark background tokens.

dark:bg-slate-950 conflicts with the required dark background token. Please switch to dark:bg-slate-900 to match the design system. As per coding guidelines, "Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders".

🔧 Suggested fix
-        className={cx('flex flex-col bg-gray-50 dark:bg-slate-950', {
+        className={cx('flex flex-col bg-gray-50 dark:bg-slate-900', {
           'min-h-including-header': !isEmbedded,
           'min-h-screen': isEmbedded,
         })}
web/app/utils/renderCtaHtml.ts-20-20 (1)

20-20: ⚠️ Potential issue | 🟡 Minor

Inconsistent dark-mode gradient between the two CTAs.

Line 20 updates renderTimeToSwitchCta to dark:to-slate-800/50, but renderDitchGoogleCta on line 69 still uses the old dark:to-orange-300/20. Given both CTAs share the same gradient structure, this looks like an oversight.

Proposed fix
-      <div class="absolute inset-0 rounded-4xl bg-linear-115 from-red-500/50 to-orange-300/30 sm:bg-linear-145 dark:from-red-500/40 dark:to-orange-300/20"></div>
+      <div class="absolute inset-0 rounded-4xl bg-linear-115 from-red-500/50 to-orange-300/30 sm:bg-linear-145 dark:from-red-500/40 dark:to-slate-800/50"></div>

Also applies to: 69-69

web/app/pages/Project/Settings/Annotations.tsx-226-226 (1)

226-226: ⚠️ Potential issue | 🟡 Minor

Inconsistent dark divider color: dark:divide-slate-700 here vs dark:divide-slate-800 on the parent table (Line 208).

The table-level divide-y on Line 208 was updated to dark:divide-slate-800, but the tbody row divider here still uses dark:divide-slate-700. This looks like an oversight in the sweep.

Proposed fix
-              <tbody className='divide-y divide-gray-200 bg-white dark:divide-slate-700 dark:bg-slate-950'>
+              <tbody className='divide-y divide-gray-200 bg-white dark:divide-slate-800 dark:bg-slate-950'>
web/app/ui/MultiSelect.tsx-138-140 (1)

138-140: ⚠️ Potential issue | 🟡 Minor

Selected and hover states share the same dark background — no visual distinction.

Both isSelected (Line 138: dark:bg-slate-900/80) and !isSelected hover (Line 139: dark:hover:bg-slate-900/80) resolve to the same dark-mode color. A user hovering over an unselected item will see the same background as a selected item, making it hard to tell them apart. Consider using a slightly different shade for one of the two states (e.g., dark:hover:bg-slate-800/60 for hover).

web/app/ui/MultiSelect.tsx-98-98 (1)

98-98: ⚠️ Potential issue | 🟡 Minor

Focus ring color deviates from coding guidelines.

The input uses focus:ring-slate-900 (light) and dark:focus:ring-slate-300 (dark), but the project guidelines specify focus:ring-indigo-500 for input focus states. The slate focus rings blend with the background and provide less visual distinction for accessibility.

Proposed fix
-          className='w-full cursor-text rounded-md border-0 bg-white py-2 pr-10 pl-3 text-sm font-medium ring-1 ring-gray-300 transition-colors ring-inset placeholder:text-gray-400 hover:bg-gray-50 focus:ring-2 focus:ring-slate-900 focus:outline-hidden dark:bg-slate-950 dark:text-gray-50 dark:ring-slate-700/80 dark:placeholder:text-gray-500 dark:hover:bg-slate-900 dark:focus:ring-slate-300'
+          className='w-full cursor-text rounded-md border-0 bg-white py-2 pr-10 pl-3 text-sm font-medium ring-1 ring-gray-300 transition-colors ring-inset placeholder:text-gray-400 hover:bg-gray-50 focus:ring-2 focus:ring-indigo-500 focus:outline-hidden dark:bg-slate-950 dark:text-gray-50 dark:ring-slate-700/80 dark:placeholder:text-gray-500 dark:hover:bg-slate-900 dark:focus:ring-indigo-500'

As per coding guidelines: "Apply ring borders to inputs with focus:ring-indigo-500 for focus states."

web/app/pages/Project/tabs/Experiments/ExperimentResults.tsx-195-195 (1)

195-195: ⚠️ Potential issue | 🟡 Minor

Tooltip ring border is invisible in dark mode.

ring-black/10 on a dark:bg-slate-900 background provides virtually no contrast. Add dark:ring-white/10 to match the dark border guideline.

Proposed fix
-        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/10 px-3 py-1'>
+        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/10 dark:ring-white/10 px-3 py-1'>

As per coding guidelines: "Use Tailwind CSS design tokens: … ring-1 ring-black/5 for light borders, ring-white/10 for dark borders."

web/app/pages/Project/Settings/Emails/Emails.tsx-238-242 (1)

238-242: ⚠️ Potential issue | 🟡 Minor

Dropdown panel may blend into the table row in dark mode.

Both the dropdown (Line 241: dark:bg-slate-950) and the parent table row (Line 215: dark:bg-slate-950) now share the same background color. Since this is an absolutely positioned floating element, it will be visually indistinguishable from the row behind it in dark mode. Previously the dropdown likely used dark:bg-slate-900, which provided natural contrast.

Consider adding a shadow or ring to the dropdown in dark mode so it visually separates from the underlying content:

Suggested fix
-               className='absolute right-0 z-10 mt-2 w-72 origin-top-right divide-y divide-gray-200 rounded-md bg-white text-left focus:outline-hidden dark:divide-gray-700 dark:bg-slate-950'
+               className='absolute right-0 z-10 mt-2 w-72 origin-top-right divide-y divide-gray-200 rounded-md bg-white shadow-lg ring-1 ring-black/5 text-left focus:outline-hidden dark:divide-gray-700 dark:bg-slate-950 dark:ring-white/10'

As per coding guidelines, dark borders should use ring-white/10.

web/app/ui/Pagination.tsx-175-175 (1)

175-175: ⚠️ Potential issue | 🟡 Minor

Page number and next buttons also use the darker palette.

The remaining pagination buttons (page numbers and desktop next button) consistently apply dark:bg-slate-950 and dark:hover:bg-slate-900, which maintains internal consistency but conflicts with the coding guidelines.

Given that this deviation is systematic across the entire component and aligns with the PR's "Darker dark mode" objective, this appears to be an intentional design decision. However, the guidelines should be updated to reflect this new standard if this is the intended direction.

As per coding guidelines: "Use HeadlessUI-based buttons as primary components with bg-slate-900 for light mode and bg-slate-800 for dark mode".

Also applies to: 195-195, 198-198

web/app/ui/Pagination.tsx-133-133 (1)

133-133: ⚠️ Potential issue | 🟡 Minor

Same guideline concern applies to desktop navigation buttons.

The desktop previous/next buttons also use the darker slate-950/900 palette instead of the guideline-specified slate-800. This should be addressed consistently with the mobile buttons.

As per coding guidelines: "Use HeadlessUI-based buttons as primary components with bg-slate-900 for light mode and bg-slate-800 for dark mode".

Also applies to: 136-136

web/app/ui/Pagination.tsx-158-158 (1)

158-158: ⚠️ Potential issue | 🟡 Minor

Dots navigation button has the same guideline deviation.

The ellipsis (dots) button uses dark:bg-slate-950 and dark:hover:bg-slate-900, continuing the pattern of darker colors that deviate from the established guidelines.

As per coding guidelines: "Use HeadlessUI-based buttons as primary components with bg-slate-900 for light mode and bg-slate-800 for dark mode".

web/app/ui/Pagination.tsx-61-61 (1)

61-61: ⚠️ Potential issue | 🟡 Minor

Update dark mode button colors to align with design system.

The pagination buttons use dark:bg-slate-950 and dark:hover:bg-slate-900, which are darker than the established design preference specifying slate-800 for dark mode buttons. The established design guidance indicates buttons should use slate-800 for dark mode, not slate-950.

Consider reverting to dark:bg-slate-800 / dark:hover:bg-slate-700 to maintain consistency with the design system, or explicitly update the design guidelines if a darker palette is intentional.

Applies to: lines 61, 64, 81, 84, and similar button patterns elsewhere in the file.

web/app/pages/Project/tabs/Traffic/MetricCards.tsx-181-181 (1)

181-181: ⚠️ Potential issue | 🟡 Minor

Potential inconsistency: dropdown panel uses slate-950 while similar floating elements use slate-900.

The metric dropdown and its header now use dark:bg-slate-950, which is the token used for page-level backgrounds elsewhere in this PR. Other floating/popup elements (e.g., ChartContextMenu) use dark:bg-slate-900. If the intent is for floating panels to be one step lighter than the page to maintain visual hierarchy, consider using dark:bg-slate-900 here instead.

Suggested diff
-              'absolute top-4 z-10 mt-2 min-w-[250px] origin-top transform cursor-auto overflow-hidden rounded-md border border-black/10 bg-white whitespace-normal shadow-lg transition-all duration-200 ease-out dark:border-slate-700/50 dark:bg-slate-950',
+              'absolute top-4 z-10 mt-2 min-w-[250px] origin-top transform cursor-auto overflow-hidden rounded-md border border-black/10 bg-white whitespace-normal shadow-lg transition-all duration-200 ease-out dark:border-slate-700/50 dark:bg-slate-900',
-              <div className='flex items-center justify-between border-b border-black/10 bg-white p-2 dark:border-slate-700/50 dark:bg-slate-950'>
+              <div className='flex items-center justify-between border-b border-black/10 bg-white p-2 dark:border-slate-700/50 dark:bg-slate-900'>

Also applies to: 188-188

web/app/pages/Auth/CreateNewPassword/CreateNewPassword.tsx-27-34 (1)

27-34: ⚠️ Potential issue | 🟡 Minor

Card and page share the same dark background — no visual separation.

Both the outer container (Line 27) and the card wrapper (Line 34) use dark:bg-slate-950. In dark mode, the card will blend into the page background, losing visual hierarchy. The dark:ring-slate-800 border provides minimal contrast.

Consider differentiating the card with dark:bg-slate-900 (or similar) so it stands out from the slate-950 page background, consistent with the guideline of using distinct tokens for cards vs. page backgrounds.

Proposed fix
-          <div className='bg-white px-6 py-12 shadow-xs ring-1 ring-gray-200 sm:rounded-lg sm:px-12 dark:bg-slate-950 dark:ring-slate-800'>
+          <div className='bg-white px-6 py-12 shadow-xs ring-1 ring-gray-200 sm:rounded-lg sm:px-12 dark:bg-slate-900 dark:ring-slate-800'>

As per coding guidelines: "Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards"

web/app/ui/Input.tsx-48-48 (1)

48-48: ⚠️ Potential issue | 🟡 Minor

Input background at dark:bg-slate-950 may lack contrast against the page background.

With root.tsx also changing the page background to dark:bg-slate-950, the input field will be indistinguishable from the page unless the ring border (dark:ring-slate-700/80 on line 51) provides enough visual separation. Consider keeping inputs at dark:bg-slate-900 so they stand out from the page surface, which is the established design token for dark backgrounds. As per coding guidelines, "Use Tailwind CSS design tokens: … slate-900 for dark backgrounds, white/slate-800 for cards".

web/app/pages/Auth/ForgotPassword/ForgotPassword.tsx-40-47 (1)

40-47: ⚠️ Potential issue | 🟡 Minor

Card background matches page background in dark mode, losing visual hierarchy.

Both the page (line 40) and the form card (line 47) use dark:bg-slate-950, making the card visually indistinguishable from the surrounding background. The ring-1 ring-slate-800 border provides minimal separation, but the coding guidelines specify white/slate-800 for cards in dark mode to maintain a clear content hierarchy.

Suggested fix
-          <div className='bg-white px-6 py-12 shadow-xs ring-1 ring-gray-200 sm:rounded-lg sm:px-12 dark:bg-slate-950 dark:ring-slate-800'>
+          <div className='bg-white px-6 py-12 shadow-xs ring-1 ring-gray-200 sm:rounded-lg sm:px-12 dark:bg-slate-900 dark:ring-slate-800'>

As per coding guidelines, "Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards".

web/app/pages/Project/tabs/Traffic/TrafficHeaderActions.tsx-200-200 (1)

200-200: ⚠️ Potential issue | 🟡 Minor

Minor inconsistency between the two dropdown buttonClassName props.

Line 200 (segments dropdown) includes focus:border-indigo-500, but Line 219 (export dropdown) omits it. Both buttons should have the same focus styling for visual consistency.

Proposed fix
-        buttonClassName='!p-2 rounded-md hover:bg-white border border-gray-50/0 hover:border-gray-300 hover:dark:border-slate-700/80 dark:hover:bg-slate-900 focus:z-10 focus:outline-hidden focus:ring-1 focus:ring-indigo-500 focus:dark:ring-gray-200'
+        buttonClassName='!p-2 rounded-md hover:bg-white border border-gray-50/0 hover:border-gray-300 hover:dark:border-slate-700/80 dark:hover:bg-slate-900 focus:z-10 focus:outline-hidden focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500 focus:dark:ring-gray-200'

Also applies to: 219-219

web/app/pages/Dashboard/Dashboard.tsx-392-392 (1)

392-392: ⚠️ Potential issue | 🟡 Minor

Minor inconsistency between desktop and mobile search input dark mode styles.

The desktop input (Line 392) uses dark:ring-slate-700/80 and dark:focus:ring-slate-300, while the mobile input (Line 454) uses dark:ring-slate-600 and dark:focus:ring-slate-200. Additionally, the desktop variant includes ring-inset and bg-white for light mode, but the mobile variant uses bg-gray-50. Consider aligning these for a consistent look across breakpoints.

Also applies to: 454-454

web/app/ui/StatusPage.tsx-122-123 (1)

122-123: ⚠️ Potential issue | 🟡 Minor

Primary and non-primary buttons are visually indistinguishable in dark mode.

Both variants use dark:bg-slate-900 dark:hover:bg-slate-700, so in dark mode a user cannot tell which action is primary. The coding guidelines specify bg-slate-800 for dark-mode primary buttons, and non-primary should have a distinct treatment (e.g., a border-only or lighter surface).

Consider differentiating — for example, using the project's Button component here instead of inline classes, or adjusting the dark tokens so primary stands out:

Suggested diff
 action.primary
-  ? 'bg-slate-900 text-white hover:bg-slate-700 focus:ring-slate-500 dark:bg-slate-900 dark:hover:bg-slate-700'
-  : 'bg-gray-100 text-gray-700 hover:bg-gray-200 focus:ring-gray-500 dark:bg-slate-900 dark:text-gray-200 dark:hover:bg-slate-700',
+  ? 'bg-slate-900 text-white hover:bg-slate-700 focus:ring-slate-500 dark:bg-slate-800 dark:hover:bg-slate-700'
+  : 'bg-gray-100 text-gray-700 hover:bg-gray-200 focus:ring-gray-500 dark:bg-slate-950 dark:text-gray-200 dark:hover:bg-slate-900',

As per coding guidelines, "Use HeadlessUI-based buttons as primary components with bg-slate-900 for light mode and bg-slate-800 for dark mode."

Also applies to: 136-137

web/app/ui/Button.tsx-61-61 (1)

61-61: ⚠️ Potential issue | 🟡 Minor

Secondary button background matches the page background in dark mode.

dark:bg-slate-950 is the same token now used for page backgrounds (e.g., StatusPage, main layouts). The dark:border-slate-700/80 border provides some differentiation, but the button may appear to blend into the background in contexts where the page surface is also slate-950.

Consider using dark:bg-slate-900 for the secondary variant to maintain a visible contrast step against the page.

web/app/components/GithubAuth.tsx-9-15 (1)

9-15: ⚠️ Potential issue | 🟡 Minor

Interface name GoogleAuthProps is a copy-paste artifact — should be GithubAuthProps.

The interface is named GoogleAuthProps but is used exclusively by the GithubAuth component. This is confusing and likely carried over from GoogleAuth.tsx.

Proposed fix
-interface GoogleAuthProps {
+interface GithubAuthProps {
   className?: string
   onClick: () => void
   disabled?: boolean
 }

-const GithubAuth = ({ className, onClick, disabled }: GoogleAuthProps) => {
+const GithubAuth = ({ className, onClick, disabled }: GithubAuthProps) => {
web/app/ui/Checkbox.tsx-39-39 (1)

39-39: ⚠️ Potential issue | 🟡 Minor

Missing visible focus indicator on the checkbox.

There's no focus:ring-* or data-[focus]:ring-* class on the HeadlessCheckbox. Keyboard users won't see a focus ring when tabbing to this control, which is an accessibility concern. As per coding guidelines, inputs should have focus:ring-indigo-500 for focus states.

♿ Suggested fix
-        className='group/checkbox size-4 shrink-0 cursor-pointer rounded-sm bg-white ring-1 ring-gray-300 transition-colors duration-100 ease-out ring-inset group-hover:bg-gray-100 data-[checked]:bg-slate-900 data-[checked]:ring-slate-900 dark:bg-slate-950 dark:ring-slate-700/80 dark:group-hover:bg-slate-900/70 dark:data-[checked]:bg-slate-100 dark:data-[checked]:ring-slate-100'
+        className='group/checkbox size-4 shrink-0 cursor-pointer rounded-sm bg-white ring-1 ring-gray-300 transition-colors duration-100 ease-out ring-inset group-hover:bg-gray-100 data-[checked]:bg-slate-900 data-[checked]:ring-slate-900 data-[focus]:ring-2 data-[focus]:ring-indigo-500 dark:bg-slate-950 dark:ring-slate-700/80 dark:group-hover:bg-slate-900/70 dark:data-[checked]:bg-slate-100 dark:data-[checked]:ring-slate-100 dark:data-[focus]:ring-indigo-400'
web/app/components/Header/index.tsx-683-684 (1)

683-684: ⚠️ Potential issue | 🟡 Minor

Use slate-900 for header dark backgrounds.
Both header variants now use slate-950 in dark mode, which diverges from the dark background token.

Suggested update (apply to both headers)
-        'border-b border-gray-200 bg-gray-50 dark:border-slate-600/40 dark:bg-slate-950':
+        'border-b border-gray-200 bg-gray-50 dark:border-slate-600/40 dark:bg-slate-900':

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

Also applies to: 749-750

web/app/pages/Onboarding/Onboarding.tsx-316-316 (1)

316-316: ⚠️ Potential issue | 🟡 Minor

Match dark icon-chip backgrounds to the slate-900 token.
These chips use dark:bg-slate-950, which is outside the dark background token.

Suggested update (apply to all listed chips)
-              className='relative z-10 size-5 shrink-0 bg-white text-amber-500 dark:bg-slate-950'
+              className='relative z-10 size-5 shrink-0 bg-white text-amber-500 dark:bg-slate-900'

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

Also applies to: 339-339, 362-362

web/app/routes/_index.tsx-1906-1906 (1)

1906-1906: ⚠️ Potential issue | 🟡 Minor

Use slate-900 for the page dark background.
The main wrapper uses slate-950 for dark mode, which is outside the dark background token.

Suggested update
-      <main className='bg-gray-50 dark:bg-slate-950'>
+      <main className='bg-gray-50 dark:bg-slate-900'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Project/View/ViewProject.helpers.tsx-807-810 (1)

807-810: ⚠️ Potential issue | 🟡 Minor

Use ring-black/5 for tooltip borders.
The tooltip container uses ring-black/10, which doesn’t match the border token guideline.

Suggested update (apply to both tooltips in this block)
-        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/10 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>
+        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/5 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

Also applies to: 966-969

web/app/pages/Dashboard/SortSelector.tsx-97-97 (1)

97-97: ⚠️ Potential issue | 🟡 Minor

Use card/ring tokens for the popover panel surface.
This panel reads as a card, but its background and ring tokens don’t align with the design tokens.

Suggested update
-              <div className='overflow-hidden rounded-lg bg-gray-50 p-1 ring-1 ring-gray-200 dark:bg-slate-900 dark:ring-slate-800'>
+              <div className='overflow-hidden rounded-lg bg-white p-1 ring-1 ring-black/5 dark:bg-slate-800 dark:ring-white/10'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/components/Header/index.tsx-163-163 (1)

163-163: ⚠️ Potential issue | 🟡 Minor

Use slate-900 for the dark panel surface.
The solutions panel uses slate-950 in dark mode, which is outside the dark background token.

Suggested update
-              <div className='flex w-[650px] flex-col divide-y divide-gray-300/80 rounded-lg border border-gray-300/80 bg-gray-50/50 p-1.5 dark:divide-slate-700/60 dark:border-slate-700/60 dark:bg-slate-950/50'>
+              <div className='flex w-[650px] flex-col divide-y divide-gray-300/80 rounded-lg border border-gray-300/80 bg-gray-50/50 p-1.5 dark:divide-slate-700/60 dark:border-slate-700/60 dark:bg-slate-900/50'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Project/View/ViewProject.helpers.tsx-1958-1960 (1)

1958-1960: ⚠️ Potential issue | 🟡 Minor

Use ring-black/5 for tooltip borders (both compare modes).

Suggested update (apply to both tooltip containers)
-          return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/10 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>
+          return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/5 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

Also applies to: 2060-2063

web/app/pages/Onboarding/Onboarding.tsx-650-650 (1)

650-650: ⚠️ Potential issue | 🟡 Minor

Bring the main onboarding card dark background in line with token guidance.
The dark background is using slate-900/25 instead of the card slate-800 token.

Suggested update
-          <div className='relative mx-auto min-h-0 w-full max-w-5xl flex-1 overflow-hidden rounded-2xl bg-white ring-1 ring-black/5 dark:bg-slate-900/25 dark:ring-white/10'>
+          <div className='relative mx-auto min-h-0 w-full max-w-5xl flex-1 overflow-hidden rounded-2xl bg-white ring-1 ring-black/5 dark:bg-slate-800/25 dark:ring-white/10'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Project/View/ViewProject.helpers.tsx-2418-2419 (1)

2418-2419: ⚠️ Potential issue | 🟡 Minor

Use ring-black/5 for tooltip borders.

Suggested update
-        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/10 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>
+        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/5 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/routes/_index.tsx-556-557 (1)

556-557: ⚠️ Potential issue | 🟡 Minor

Use slate-800 for dark card surfaces across previews.
Several preview cards use dark:bg-slate-950; the card token set specifies slate-800 for dark mode.

Suggested update (apply to all listed cards)
-            className='rounded-md bg-white px-3 py-2 text-xs text-slate-900 ring-1 ring-black/5 dark:bg-slate-950 dark:text-gray-50 dark:ring-white/10'
+            className='rounded-md bg-white px-3 py-2 text-xs text-slate-900 ring-1 ring-black/5 dark:bg-slate-800 dark:text-gray-50 dark:ring-white/10'

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

Also applies to: 572-572, 632-633, 916-916, 955-955, 1216-1216, 1243-1243, 1263-1263, 1331-1331, 1533-1533

web/app/components/Header/index.tsx-875-875 (1)

875-875: ⚠️ Potential issue | 🟡 Minor

Use gray-50 for the light mobile panel background.
The mobile dialog uses gray-100/80; the token guidance calls for gray-50 for light backgrounds.

Suggested update
-        <DialogPanel className='fixed inset-y-0 top-0 right-0 z-30 w-full overflow-y-auto border-gray-300/80 bg-gray-100/80 p-4 backdrop-blur-2xl sm:max-w-sm sm:border dark:border-slate-900/80 dark:bg-slate-900/80'>
+        <DialogPanel className='fixed inset-y-0 top-0 right-0 z-30 w-full overflow-y-auto border-gray-300/80 bg-gray-50/80 p-4 backdrop-blur-2xl sm:max-w-sm sm:border dark:border-slate-900/80 dark:bg-slate-900/80'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Onboarding/Onboarding.tsx-704-705 (1)

704-705: ⚠️ Potential issue | 🟡 Minor

Use indigo-500 for the dark selection ring.
The selected state uses a slate ring in dark mode rather than the indigo accent.

Suggested update
-                                    ? 'bg-indigo-50 ring-2 ring-indigo-500 dark:bg-slate-900 dark:ring-slate-200'
+                                    ? 'bg-indigo-50 ring-2 ring-indigo-500 dark:bg-slate-900 dark:ring-indigo-500'

As per coding guidelines: Use indigo-600 as the primary accent color in light mode and indigo-500 in dark mode.

web/app/pages/Onboarding/Onboarding.tsx-955-956 (1)

955-956: ⚠️ Potential issue | 🟡 Minor

Align textarea surface and ring tokens.
The textarea surface/ring uses slate-950 and gray ring tokens instead of the standard palette.

Suggested update
-                                'bg-white dark:bg-slate-950 ring-1 ring-gray-200 dark:ring-slate-700',
+                                'bg-white dark:bg-slate-900 ring-1 ring-black/5 dark:ring-white/10',

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Dashboard/SortSelector.tsx-74-74 (1)

74-74: ⚠️ Potential issue | 🟡 Minor

Align the dark background token to slate-900.
The dark background on the button is set to slate-950, but the token guidance calls for slate-900 for dark backgrounds.

Suggested update
-          <PopoverButton className='inline-flex w-full rounded-md border border-transparent bg-gray-50 p-2 text-sm font-medium text-gray-700 outline-hidden transition-colors hover:border-gray-300 hover:bg-white dark:bg-slate-950 dark:text-gray-50 hover:dark:border-slate-700/80 dark:hover:bg-slate-900'>
+          <PopoverButton className='inline-flex w-full rounded-md border border-transparent bg-gray-50 p-2 text-sm font-medium text-gray-700 outline-hidden transition-colors hover:border-gray-300 hover:bg-white dark:bg-slate-900 dark:text-gray-50 hover:dark:border-slate-700/80 dark:hover:bg-slate-800'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Project/View/ViewProject.helpers.tsx-1552-1553 (1)

1552-1553: ⚠️ Potential issue | 🟡 Minor

Use ring-black/5 for tooltip borders.

Suggested update
-        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/10 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>
+        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/5 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Project/View/ViewProject.helpers.tsx-1759-1762 (1)

1759-1762: ⚠️ Potential issue | 🟡 Minor

Use ring-black/5 for tooltip borders.

Suggested update
-          <div class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/10 px-2 py-1 text-xs md:text-sm max-w-xs md:max-w-sm max-h-[300px] md:max-h-[400px] overflow-y-auto shadow-lg z-50'>
+          <div class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/5 px-2 py-1 text-xs md:text-sm max-w-xs md:max-w-sm max-h-[300px] md:max-h-[400px] overflow-y-auto shadow-lg z-50'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Onboarding/Onboarding.tsx-392-392 (1)

392-392: ⚠️ Potential issue | 🟡 Minor

Align the project visualisation card tokens.
Dark background and ring values are outside the card token palette.

Suggested update
-        <div className='flex size-20 shrink-0 items-center justify-center rounded-xl bg-white shadow-sm ring-1 ring-gray-200 dark:bg-slate-950 dark:ring-slate-800'>
+        <div className='flex size-20 shrink-0 items-center justify-center rounded-xl bg-white shadow-sm ring-1 ring-black/5 dark:bg-slate-800 dark:ring-white/10'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Project/View/ViewProject.helpers.tsx-1352-1353 (1)

1352-1353: ⚠️ Potential issue | 🟡 Minor

Use ring-black/5 for tooltip borders.

Suggested update
-        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/10 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>
+        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/5 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/components/Header/index.tsx-284-284 (1)

284-284: ⚠️ Potential issue | 🟡 Minor

Align menu panel ring and dark background tokens.
The panel uses ring-slate-200 and dark:bg-slate-950 rather than the standard ring and dark background tokens.

Suggested update
-            className='absolute right-0 z-30 mt-2 w-60 min-w-max origin-top-right rounded-md bg-white p-1 ring-1 ring-slate-200 transition duration-200 ease-out focus:outline-hidden data-closed:scale-95 data-closed:opacity-0 dark:bg-slate-950 dark:ring-slate-800'
+            className='absolute right-0 z-30 mt-2 w-60 min-w-max origin-top-right rounded-md bg-white p-1 ring-1 ring-black/5 transition duration-200 ease-out focus:outline-hidden data-closed:scale-95 data-closed:opacity-0 dark:bg-slate-900 dark:ring-white/10'

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/routes/_index.tsx-449-451 (1)

449-451: ⚠️ Potential issue | 🟡 Minor

Align feature card surface and ring tokens.
The card uses ring-gray-200 and a dark slate-800/25 background that’s outside the card token set.

Suggested update
-      'flex h-full flex-col overflow-hidden bg-white ring-1 ring-gray-200 dark:bg-slate-800/25 dark:ring-slate-800/60',
+      'flex h-full flex-col overflow-hidden bg-white ring-1 ring-black/5 dark:bg-slate-800 dark:ring-white/10',

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Onboarding/Onboarding.tsx-926-926 (1)

926-926: ⚠️ Potential issue | 🟡 Minor

Use ring tokens and slate-900 for the tracking card.
Border and background tokens are off the recommended palette.

Suggested update
-                        <div className='rounded-xl border border-gray-200 bg-gray-50 p-5 dark:border-slate-700 dark:bg-slate-950'>
+                        <div className='rounded-xl bg-gray-50 p-5 ring-1 ring-black/5 dark:bg-slate-900 dark:ring-white/10'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/routes/_index.tsx-321-321 (1)

321-321: ⚠️ Potential issue | 🟡 Minor

Align demo CTA surfaces with background/ring tokens.
Both CTA buttons use ring-black/10 and dark:bg-slate-950, which don’t match the border/background tokens.

Suggested update (apply to both CTA buttons)
-            className='pointer-events-auto inline-flex items-center rounded-md bg-white px-4 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-black/10 transition-all hover:bg-gray-50 dark:bg-slate-950 dark:text-white dark:ring-white/10 dark:hover:bg-slate-900'
+            className='pointer-events-auto inline-flex items-center rounded-md bg-white px-4 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-black/5 transition-all hover:bg-gray-50 dark:bg-slate-900 dark:text-white dark:ring-white/10 dark:hover:bg-slate-800'

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

Also applies to: 347-347

web/app/pages/Onboarding/Onboarding.tsx-749-752 (1)

749-752: ⚠️ Potential issue | 🟡 Minor

Align welcome card surfaces with light/dark background tokens.
The outer card uses slate-50 and slate-950, which diverges from the gray-50/slate-900 background guidance.

Suggested update
-                        <div className='rounded-2xl border border-gray-200 bg-slate-50 shadow-xs dark:border-slate-700/70 dark:bg-slate-950/80'>
+                        <div className='rounded-2xl border border-gray-200 bg-gray-50 shadow-xs dark:border-slate-700/70 dark:bg-slate-900/80'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Onboarding/Onboarding.tsx-165-165 (1)

165-165: ⚠️ Potential issue | 🟡 Minor

Align IconNode card surface tokens.
This card uses ring/background tokens that don’t match the designated card/ring palette.

Suggested update
-    <div className='flex size-14 items-center justify-center rounded-xl bg-white shadow-sm ring-1 ring-gray-200 dark:bg-slate-900 dark:ring-slate-700'>
+    <div className='flex size-14 items-center justify-center rounded-xl bg-white shadow-sm ring-1 ring-black/5 dark:bg-slate-800 dark:ring-white/10'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/components/Header/index.tsx-339-339 (1)

339-339: ⚠️ Potential issue | 🟡 Minor

Align the disclosure panel surface and ring tokens.
This panel uses slate-950 and slate ring tokens instead of the standard ring and dark background palette.

Suggested update
-                      className='absolute right-0 z-50 w-full min-w-max origin-top-right rounded-md bg-white p-1 ring-1 ring-slate-200 focus:outline-hidden dark:bg-slate-950 dark:ring-slate-700/80'
+                      className='absolute right-0 z-50 w-full min-w-max origin-top-right rounded-md bg-white p-1 ring-1 ring-black/5 focus:outline-hidden dark:bg-slate-900 dark:ring-white/10'

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Project/View/ViewProject.helpers.tsx-1171-1172 (1)

1171-1172: ⚠️ Potential issue | 🟡 Minor

Use ring-black/5 for tooltip borders.

Suggested update
-        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/10 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>
+        return `<ul class='bg-gray-50 dark:text-gray-50 dark:bg-slate-900 rounded-md ring-1 ring-black/5 px-2 py-1 text-xs md:text-sm max-h-[250px] md:max-h-[350px] overflow-y-auto shadow-lg z-50'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Onboarding/Onboarding.tsx-279-301 (1)

279-301: ⚠️ Potential issue | 🟡 Minor

Use card/ring tokens for the error list rows.
The rows use slate-950 backgrounds and gray rings that drift from the token set.

Suggested update (apply to each row)
-            <div className='flex items-center gap-3 rounded-lg bg-gray-50 p-4 ring-1 ring-gray-100 dark:bg-slate-950 dark:ring-slate-800'>
+            <div className='flex items-center gap-3 rounded-lg bg-gray-50 p-4 ring-1 ring-black/5 dark:bg-slate-900 dark:ring-white/10'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/components/pricing/BillingPricing.tsx-509-509 (1)

509-509: ⚠️ Potential issue | 🟡 Minor

Stray 200 in table className — likely a copy-paste artifact.

Both <table> elements have className='200 min-w-full divide-y ...'. The 200 is an invalid Tailwind class and likely a leftover from duration-200 or similar. It won't break rendering but emits a meaningless class in the DOM.

🐛 Proposed fix
-                  <table className='200 min-w-full divide-y divide-gray-300 dark:divide-slate-700'>
+                  <table className='min-w-full divide-y divide-gray-300 dark:divide-slate-700'>

Apply to both occurrences (lines 509 and 576).

Also applies to: 576-576

web/app/pages/Organisations/Settings/Projects.tsx-158-163 (1)

158-163: ⚠️ Potential issue | 🟡 Minor

Use slate-800 for dark card rows and medium weight for body text.

Rows use dark:bg-slate-950, and body text lacks the required medium weight.

Proposed fix
-      className='bg-white hover:bg-gray-50 dark:bg-slate-950 dark:hover:bg-slate-900/50'
+      className='bg-white hover:bg-gray-50 dark:bg-slate-800 dark:hover:bg-slate-900/50'
@@
-      <td className='px-4 py-3 text-sm whitespace-nowrap text-gray-900 dark:text-gray-100'>
+      <td className='px-4 py-3 text-sm font-medium whitespace-nowrap text-gray-900 dark:text-gray-100'>

As per coding guidelines: Implement full light and dark mode support with warm grays for light mode and slate tones for dark mode; Use font weights: medium for body text, semibold for labels, bold for headings.

web/app/pages/Organisations/Settings/Projects.tsx-83-86 (1)

83-86: ⚠️ Potential issue | 🟡 Minor

Align input rings and focus color with design tokens.

The search input uses ring-gray-300 and focus:ring-indigo-600, which diverges from the required ring tokens and focus color.

Proposed fix
-            className='block w-full rounded-md border-0 py-1.5 pl-10 text-gray-900 ring-1 ring-gray-300 ring-inset placeholder:text-gray-400 focus:ring-2 focus:ring-indigo-600 focus:ring-inset sm:text-sm sm:leading-6 dark:bg-slate-900 dark:text-white dark:ring-slate-600 dark:focus:ring-slate-400'
+            className='block w-full rounded-md border-0 py-1.5 pl-10 text-gray-900 ring-1 ring-black/5 ring-inset placeholder:text-gray-400 focus:ring-2 focus:ring-indigo-500 focus:ring-inset sm:text-sm sm:leading-6 dark:bg-slate-900 dark:text-white dark:ring-white/10 dark:focus:ring-indigo-500'

As per coding guidelines: Apply ring borders to inputs with focus:ring-indigo-500 for focus states; Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders.

web/app/pages/Organisations/Settings/Projects.tsx-322-336 (1)

322-336: ⚠️ Potential issue | 🟡 Minor

Treat the table wrapper as a card (radius + ring tokens + dark background).

The wrapper uses border and rounded-lg with dark:bg-slate-950, which diverges from the card tokens and radius.

Proposed fix
-          <div className='overflow-hidden rounded-lg border border-gray-200 dark:border-slate-800'>
+          <div className='overflow-hidden rounded-2xl bg-white ring-1 ring-black/5 dark:bg-slate-800 dark:ring-white/10'>
@@
-              <tbody className='divide-y divide-gray-200 bg-white dark:divide-slate-800 dark:bg-slate-950'>
+              <tbody className='divide-y divide-gray-200 bg-white dark:divide-slate-800 dark:bg-slate-800'>

As per coding guidelines: Use Tailwind CSS design tokens: gray-50 for light backgrounds, slate-900 for dark backgrounds, white/slate-800 for cards, ring-1 ring-black/5 for light borders, ring-white/10 for dark borders; Use border radius: rounded-md for small elements, rounded-lg for medium, rounded-xl for large, rounded-2xl for cards.

@Blaumaus Blaumaus merged commit 2ca03a7 into main Feb 7, 2026
7 checks passed
@coderabbitai coderabbitai bot mentioned this pull request Feb 11, 2026
6 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant