Skip to content

Update website design tokens fetched from single source of truth#56

Merged
PropzSaladaz merged 4 commits into
masterfrom
enhancement/add-website
Apr 13, 2026
Merged

Update website design tokens fetched from single source of truth#56
PropzSaladaz merged 4 commits into
masterfrom
enhancement/add-website

Conversation

@PropzSaladaz
Copy link
Copy Markdown
Owner

No description provided.

@PropzSaladaz PropzSaladaz self-assigned this Apr 13, 2026
@qodo-code-review
Copy link
Copy Markdown

Review Summary by Qodo

Implement centralized design tokens and expand platform support

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Create centralized design token system sourced from single tokens.json
• Add website theme support with light/dark mode CSS variables
• Implement iOS build job in mobile release workflow
• Add macOS bundle support to desktop release workflow
Diagram
flowchart LR
  tokens["tokens.json<br/>(Single Source)"] -->|Generate| ts["tokens.ts<br/>(TypeScript)"]
  tokens -->|Generate| css["css-vars.css<br/>(CSS Variables)"]
  tokens -->|Generate| preset["tailwind.preset.cjs<br/>(Tailwind Config)"]
  ts -->|applyTheme| website["Website Theme<br/>(Light/Dark)"]
  css -->|Import| website
  preset -->|Configure| website
  website -->|data-theme attr| html["HTML Root<br/>(data-theme)"]
  release["Release Workflows"] -->|Add iOS| ios["iOS Build Job"]
  release -->|Add macOS| macos["macOS Bundle"]
Loading

Grey Divider

File Changes

1. website/app/theme/tokens.ts ✨ Enhancement +70/-0

New TypeScript token definitions with theme utilities

website/app/theme/tokens.ts


2. website/app/theme/css-vars.css ✨ Enhancement +102/-0

Generated CSS variables for light and dark themes

website/app/theme/css-vars.css


3. website/app/theme/tailwind.preset.cjs ✨ Enhancement +79/-0

Auto-generated Tailwind preset from design tokens

website/app/theme/tailwind.preset.cjs


View more (8)
4. website/app/theme/tailwind.aliases.css ✨ Enhancement +9/-0

Optional Tailwind utility aliases for common patterns

website/app/theme/tailwind.aliases.css


5. website/app/globals.css ✨ Enhancement +4/-34

Import generated CSS vars, remove hardcoded tokens

website/app/globals.css


6. website/app/layout.tsx ✨ Enhancement +1/-1

Add data-theme attribute for dark mode support

website/app/layout.tsx


7. desktop_app/app/theme/css-vars.css ✨ Enhancement +4/-14

Remove neumorphic shadow, update shadow helper class

desktop_app/app/theme/css-vars.css


8. desktop_app/src-tauri/tauri.conf.json ⚙️ Configuration changes +2/-1

Add macOS DMG bundle target to build configuration

desktop_app/src-tauri/tauri.conf.json


9. .github/workflows/release-desktop.yml ✨ Enhancement +2/-0

Add macOS build job to desktop release workflow

.github/workflows/release-desktop.yml


10. .github/workflows/release-mobile.yml ✨ Enhancement +95/-3

Add iOS build job with code signing and artifact upload

.github/workflows/release-mobile.yml


11. tools/theming/index.mjs ✨ Enhancement +4/-2

Update token generation to support website target

tools/theming/index.mjs


Grey Divider

Qodo Logo

@qodo-code-review
Copy link
Copy Markdown

qodo-code-review Bot commented Apr 13, 2026

Code Review by Qodo

🐞 Bugs (3)   📘 Rule violations (0)   📎 Requirement gaps (0)
🐞\ ≡ Correctness (2) ☼ Reliability (1)

Grey Divider


Action required

1. Broken shadow token usage 🐞
Description
--shadow-neumorphic was removed from desktop_app/app/theme/css-vars.css, but desktop CSS modules
and Tailwind config still reference var(--shadow-neumorphic), so shadows will resolve to invalid
and styling will regress.
Code

desktop_app/app/theme/css-vars.css[L34-39]

-  --shadow-neumorphic:
-    -2px -1px 5px rgba(255, 255, 255, 0.84),
-    -8px -3px 9px rgba(255, 255, 255, 0.77),
-    -18px -8px 12px rgba(255, 255, 255, 0.68),
-    6px 1px 6px rgba(95, 95, 95, 0.09),
-    1px 0px 3px rgba(95, 95, 95, 0.1);
Evidence
The theme variables no longer define --shadow-neumorphic (the theme jumps from --color-shadow-*
directly to spacing vars), while multiple components and Tailwind config still rely on
var(--shadow-neumorphic) for box-shadow. This creates broken/empty shadows at runtime.

desktop_app/app/theme/css-vars.css[31-36]
desktop_app/app/dashboard/dashboard.module.css[35-45]
desktop_app/app/home.module.css[28-43]
desktop_app/tailwind.config.ts[51-56]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`--shadow-neumorphic` was removed from the generated theme CSS, but the desktop app still references it for `box-shadow`, leading to invalid computed shadows.

## Issue Context
The new generated shadow helper is `.shadow-2layer` based on `--color-shadow-low/high`. Existing CSS and Tailwind config still use `var(--shadow-neumorphic)`.

## Fix Focus Areas
- desktop_app/app/theme/css-vars.css[31-36]
- desktop_app/app/dashboard/dashboard.module.css[35-45]
- desktop_app/app/home.module.css[28-43]
- desktop_app/tailwind.config.ts[51-56]

## What to change
- Replace `box-shadow: var(--shadow-neumorphic);` usages with the new 2-layer shadow (e.g. `0 1px 2px var(--color-shadow-low), 0 4px 8px var(--color-shadow-high)`) or apply the `.shadow-2layer` helper class where applicable.
- Update Tailwind `boxShadow.neumorphic` to either be removed or mapped to the new 2-layer shadow so `shadow-neumorphic` utilities don’t produce invalid CSS.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Missing iOS export plist 🐞
Description
The new signed iOS build step runs flutter build ipa with
--export-options-plist=ios/ExportOptions.plist, but that file is not present in the repo, so the
signed iOS release path will fail.
Code

.github/workflows/release-mobile.yml[R156-162]

+      - name: Build iOS (signed)
+        if: env.IOS_SIGNING == 'true'
+        working-directory: mobile_client
+        run: |
+          flutter build ipa --release --no-tree-shake-icons \
+            --export-options-plist=ios/ExportOptions.plist
+
Evidence
The workflow explicitly points flutter build ipa at mobile_client/ios/ExportOptions.plist
(relative to working-directory: mobile_client). A repository-wide search for ExportOptions.plist
returns no matches, so this path will be missing at runtime.

.github/workflows/release-mobile.yml[156-162]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The iOS signed build step references `ios/ExportOptions.plist`, but the file is not present, so `flutter build ipa` will fail when signing is enabled.

## Issue Context
This only affects the signed path (`flutter build ipa ... --export-options-plist=...`). The unsigned build path uses `flutter build ios --no-codesign` and does not need this file.

## Fix Focus Areas
- .github/workflows/release-mobile.yml[156-162]
- mobile_client/ios/ExportOptions.plist[1-1]

## What to change
- Either commit `mobile_client/ios/ExportOptions.plist` (with correct export method/team settings for your signing approach), OR
- Remove `--export-options-plist=ios/ExportOptions.plist` and use a different deterministic export mechanism that does not rely on a missing file.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. iOS signing guard incomplete 🐞
Description
The signing step is gated only on APPLE_CERTIFICATE_BASE64, but it unconditionally uses
APPLE_CERTIFICATE_PASSWORD and APPLE_PROVISIONING_PROFILE_BASE64, so partial secret
configuration will still run the step and fail.
Code

.github/workflows/release-mobile.yml[R123-129]

+      - name: Install Apple certificate and provisioning profile
+        if: env.APPLE_CERTIFICATE_BASE64 != ''
+        env:
+          APPLE_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
+          APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
+          APPLE_PROVISIONING_PROFILE_BASE64: ${{ secrets.APPLE_PROVISIONING_PROFILE_BASE64 }}
+        run: |
Evidence
The if: condition checks only the certificate secret, while the script later decodes the
provisioning profile and uses the certificate password; if either is empty, the base64 decode/import
will fail inside this step.

.github/workflows/release-mobile.yml[123-151]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The code signing step can run with incomplete Apple signing secrets, causing avoidable workflow failures.

## Issue Context
The step checks only `APPLE_CERTIFICATE_BASE64` but requires three secrets to succeed.

## Fix Focus Areas
- .github/workflows/release-mobile.yml[123-129]

## What to change
- Update the `if:` condition to also require `APPLE_CERTIFICATE_PASSWORD` and `APPLE_PROVISIONING_PROFILE_BASE64` to be non-empty (use `secrets.*` directly or ensure `env.*` is reliably populated).
- Optionally, add a clear error message and skip signing if any required secret is missing.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

Comment on lines +156 to +162
- name: Build iOS (signed)
if: env.IOS_SIGNING == 'true'
working-directory: mobile_client
run: |
flutter build ipa --release --no-tree-shake-icons \
--export-options-plist=ios/ExportOptions.plist

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

2. Missing ios export plist 🐞 Bug ≡ Correctness

The new signed iOS build step runs flutter build ipa with
--export-options-plist=ios/ExportOptions.plist, but that file is not present in the repo, so the
signed iOS release path will fail.
Agent Prompt
## Issue description
The iOS signed build step references `ios/ExportOptions.plist`, but the file is not present, so `flutter build ipa` will fail when signing is enabled.

## Issue Context
This only affects the signed path (`flutter build ipa ... --export-options-plist=...`). The unsigned build path uses `flutter build ios --no-codesign` and does not need this file.

## Fix Focus Areas
- .github/workflows/release-mobile.yml[156-162]
- mobile_client/ios/ExportOptions.plist[1-1]

## What to change
- Either commit `mobile_client/ios/ExportOptions.plist` (with correct export method/team settings for your signing approach), OR
- Remove `--export-options-plist=ios/ExportOptions.plist` and use a different deterministic export mechanism that does not rely on a missing file.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

--color-overlay: rgba(2, 6, 23, 0.36);
--color-shadow-high: rgba(0, 0, 0, 0.1);
--color-shadow-low: rgba(0, 0, 0, 0.25);
--shadow-neumorphic:
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

1. Broken shadow token usage 🐞 Bug ≡ Correctness

--shadow-neumorphic was removed from desktop_app/app/theme/css-vars.css, but desktop CSS modules
and Tailwind config still reference var(--shadow-neumorphic), so shadows will resolve to invalid
and styling will regress.
Agent Prompt
## Issue description
`--shadow-neumorphic` was removed from the generated theme CSS, but the desktop app still references it for `box-shadow`, leading to invalid computed shadows.

## Issue Context
The new generated shadow helper is `.shadow-2layer` based on `--color-shadow-low/high`. Existing CSS and Tailwind config still use `var(--shadow-neumorphic)`.

## Fix Focus Areas
- desktop_app/app/theme/css-vars.css[31-36]
- desktop_app/app/dashboard/dashboard.module.css[35-45]
- desktop_app/app/home.module.css[28-43]
- desktop_app/tailwind.config.ts[51-56]

## What to change
- Replace `box-shadow: var(--shadow-neumorphic);` usages with the new 2-layer shadow (e.g. `0 1px 2px var(--color-shadow-low), 0 4px 8px var(--color-shadow-high)`) or apply the `.shadow-2layer` helper class where applicable.
- Update Tailwind `boxShadow.neumorphic` to either be removed or mapped to the new 2-layer shadow so `shadow-neumorphic` utilities don’t produce invalid CSS.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@PropzSaladaz PropzSaladaz merged commit f3572d3 into master Apr 13, 2026
6 checks passed
@PropzSaladaz PropzSaladaz deleted the enhancement/add-website branch April 13, 2026 22:56
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