Skip to content

Conversation

@codegen-sh
Copy link
Contributor

@codegen-sh codegen-sh bot commented Aug 6, 2025

🎯 Overview

This PR upgrades the React Router 7 todo starter to properly use Tailwind CSS v4's CSS-first configuration approach, eliminating the need for JavaScript configuration files and simplifying the project structure.

✨ Key Changes

🗂️ Removed Config Package

  • Deleted packages/config - No longer needed with Tailwind v4's CSS-first approach
  • Updated workspace references - Cleaned up tsconfig.json and package.json files
  • Simplified monorepo structure - Fewer packages to maintain

🎨 CSS-First Theme Configuration

  • Migrated to @theme directive - All theme configuration now lives in CSS
  • Converted JavaScript config to CSS - Theme tokens defined in apps/todo-app/app/globals.css
  • Dark mode with CSS variants - Uses @custom-variant and @variant directives
  • Maintained shadcn/ui compatibility - All existing components continue to work

🔧 Technical Improvements

  • Added React Router 7 routes.ts - Fixed missing routes configuration
  • Updated documentation - Reflects new CSS-first approach
  • Simplified tailwind.config.ts - Now just an empty object (CSS-first)
  • Build verification - Confirmed dev server and production builds work correctly

🧪 Testing

  • Dev server starts successfully - bun dev works
  • Production build works - bun build generates optimized CSS
  • Tailwind processing confirmed - 9.09 kB CSS bundle generated
  • Component compatibility maintained - shadcn/ui components unaffected

📚 Benefits of Tailwind v4 CSS-First

  1. Simpler configuration - No JavaScript config files needed
  2. Faster development - Instant theme updates without restarts
  3. Better organization - Styles and themes live together in CSS
  4. Reduced complexity - Fewer files and dependencies to manage
  5. Future-proof - Aligns with Tailwind v4's recommended approach

🔍 Migration Details

Before:

// packages/config/src/tailwind.config.ts
export default {
  theme: {
    extend: {
      colors: {
        primary: 'hsl(var(--primary))'
      }
    }
  }
}

After:

/* apps/todo-app/app/globals.css */
@theme {
  --color-primary: hsl(222.2 47.4% 11.2%);
}

This change represents a fundamental improvement in how we handle styling configuration, making the codebase more maintainable and aligned with modern Tailwind CSS best practices.


Requested by: User who wanted to initialize a React todo app boilerplate with best practices from the reportory repo


💻 View my workAbout Codegen
⛔ Remove Codegen from PR🚫 Ban action checks

Summary by CodeRabbit

  • New Features

    • Added a new routes configuration for the todo app to improve routing structure.
    • Introduced TypeScript declarations for environment variables in the todo app for better type safety.
  • Documentation

    • Updated documentation to reflect the removal of the shared config package and adoption of Tailwind CSS v4's CSS-first configuration.
    • Added a new "Styling" section explaining the use of Tailwind CSS v4 and theme management in the README.
    • Added comprehensive cursor rules documentation for React Router 7, monorepo management, and UI component best practices.
  • Refactor

    • Migrated theme and color variables to use Tailwind CSS v4's CSS-first approach with the @theme directive in global styles.
    • Updated dark mode support and border radius variables for consistency and maintainability.
    • Simplified type annotations for route meta and error boundary components.
  • Chores

    • Removed the deprecated shared config package and related configuration files.
    • Cleaned up TypeScript and Tailwind configuration files to align with the new setup.
    • Updated ignore patterns to exclude React Router generated files.

- Remove packages/config package (no longer needed with Tailwind v4)
- Convert JavaScript theme config to CSS @theme directive in globals.css
- Update tsconfig.json to remove config package references
- Simplify tailwind.config.ts to empty object (CSS-first approach)
- Add React Router 7 routes.ts file for proper routing
- Update documentation to reflect new CSS-first approach
- Maintain full compatibility with shadcn/ui components
- Support dark mode using @custom-variant and @variant directives

This migration follows Tailwind v4's recommended CSS-first configuration
approach, eliminating the need for JavaScript config files while
maintaining all existing functionality.
@coderabbitai
Copy link

coderabbitai bot commented Aug 6, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

This change removes the @todo-starter/config package and its usage from the monorepo, including related TypeScript and Tailwind CSS configuration files. The project now adopts a CSS-first approach for Tailwind CSS v4, centralizing theme configuration in CSS. Documentation and ignore files are updated to reflect these structural and configuration changes. New cursor rules documentation files are added, and some existing cursor rules files are deleted. A new route configuration file and a Vite environment typings file are introduced. Minor type annotation updates are applied in route and root components.

Changes

Cohort / File(s) Change Summary
Documentation Updates
.cursorrules/monorepo.md, .cursorrules/react-router-7.md, .cursorrules/ui-components.md, README.md
Removed deprecated cursor rules files; added new .mdc cursor rules files for monorepo, React Router 7, and UI components with detailed guidelines; updated README with Tailwind CSS v4 styling section and formatting fixes.
Tailwind CSS Configuration Migration
apps/todo-app/tailwind.config.ts, apps/todo-app/app/globals.css
Migrated Tailwind configuration from JavaScript to CSS using @theme and @variant directives; tailwind.config.ts is now empty with explanatory comments; globals.css updated with new theme variables, utilities, and OKLCH color space usage.
Route Configuration and TypeScript Typings Additions
apps/todo-app/app/routes.ts, apps/todo-app/vite-env.d.ts
Added new typed route configuration exporting a single route; introduced Vite environment variable typings for improved type safety.
TypeScript Configuration Updates
apps/todo-app/tsconfig.json, tsconfig.json
Changed TypeScript config extension to a project-wide config; removed path mappings for the deleted config package.
Config Package Removal
packages/config/package.json, packages/config/src/tailwind.config.ts, packages/config/src/tsconfig.json
Deleted the @todo-starter/config package, including its package manifest, Tailwind config, and TypeScript config files.
Git Ignore Update
.gitignore
Added .react-router/ to ignore list for React Router generated types.
Type Annotation Refinements
apps/todo-app/app/root.tsx, apps/todo-app/app/routes/home.tsx
Updated meta function and error boundary type annotations to use standard react-router types instead of custom route-specific types.

Sequence Diagram(s)

sequenceDiagram
    participant Developer
    participant CSS (globals.css)
    participant Tailwind v4 Engine

    Developer->>CSS (globals.css): Define theme with @theme and @variant
    Tailwind v4 Engine->>CSS (globals.css): Parse @theme and @variant directives
    Tailwind v4 Engine-->>Developer: Generates utility classes based on CSS theme
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~15 minutes

Possibly related PRs

  • lambda-curry/360training#100: Also removes webhook-related files and configurations, showing a similar pattern of deleting legacy or unused code and configurations.

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 71a8cd8 and d0286b5.

📒 Files selected for processing (12)
  • .cursorrules/README.md (0 hunks)
  • .cursorrules/monorepo.md (0 hunks)
  • .cursorrules/monorepo.mdc (1 hunks)
  • .cursorrules/react-router-7.md (0 hunks)
  • .cursorrules/react-router-7.mdc (1 hunks)
  • .cursorrules/ui-components.md (0 hunks)
  • .cursorrules/ui-components.mdc (1 hunks)
  • apps/todo-app/app/globals.css (1 hunks)
  • apps/todo-app/app/root.tsx (2 hunks)
  • apps/todo-app/app/routes.ts (1 hunks)
  • apps/todo-app/app/routes/home.tsx (1 hunks)
  • apps/todo-app/vite-env.d.ts (1 hunks)
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch codegen-bot/upgrade-to-tailwind-v4-proper-1754510773

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

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

🔭 Outside diff range comments (1)
README.md (1)

24-26: README inconsistencies: obsolete package entry and duplicated styling section

  1. Project structure (Line 24) still lists config/, which is now gone.
  2. Two separate “🎨 Styling” sections exist (Lines 98-108 and 128-136). The second is redundant after the new Tailwind section.
-│   ├── config/             # Shared configurations
+│   ├── ui/                 # shadcn/ui component library
+│   └── utils/              # Shared utilities and types

and delete the second styling section entirely or merge any unique details into the first.

Also applies to: 80-83

🧹 Nitpick comments (4)
apps/todo-app/.react-router/types/app/routes/+types/home.ts (1)

1-2: Treat generated files as build artefacts, not source.

This header explicitly marks the file as generated. Committing generated artefacts clutters the repo, inflates diffs, and risks merge conflicts. Prefer adding .react-router/** (or at least *.react-router/types/**) to .gitignore and regenerating in CI/postinstall.

apps/todo-app/tailwind.config.ts (1)

1-5: Stub file may be unnecessary – consider deleting to avoid confusion

Tailwind v4 operates fine without any JS/TS config when using the CSS-first workflow. Keeping an empty tailwind.config.ts can mislead newcomers into thinking configuration still belongs here.

-// Tailwind CSS v4 uses CSS-first configuration
-// Theme configuration is now in app/globals.css using @theme directive
-// This file is no longer needed but kept for compatibility if needed
-
-export default {};
+// Intentionally left empty — Tailwind v4 is configured entirely via CSS.
+// Delete this file if no build tools reference it.

If no build tooling requires the file’s presence, removing it keeps the repo lean.

apps/todo-app/app/globals.css (2)

3-30: Consider adding color-scheme and browser-UI fallback tokens

The @theme block defines all visual tokens, but the browser itself (form controls, scrollbars, etc.) will still render using its default light palette unless a matching color-scheme is declared. A single line keeps native UI in sync and makes the dark-variant override trivial:

 @theme {
   /* Colors - Light mode (default) */
@@
   --radius-sm: calc(var(--radius) - 4px);
+
+  /* Tell the browser we are in light mode so built-in widgets match */
+  color-scheme: light;
 }

Adding the matching color-scheme: dark; inside the dark variant (see lines 35-56) will give you automatic dark scroll-bars and form controls without extra CSS.


35-56: Duplicate dark-mode tokens – inherit where possible to reduce maintenance

Every colour token is re-declared in the dark variant even where the value is identical to light mode (e.g. --color-ring). Omitting unchanged values lets the browser fall back to the light definition and keeps the dark palette DRY:

 @variant dark {
-    --color-ring: hsl(212.7 26.8% 83.9%);
+    /* Ring colour is identical to the light palette — omit to inherit */
 }
+
+/* Also tell the browser we are now in dark mode */
+@variant dark { color-scheme: dark; }

Less duplication means fewer places to update when branding changes.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4ea41cc and 6a1132a.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (15)
  • .cursorrules/monorepo.md (1 hunks)
  • README.md (2 hunks)
  • apps/todo-app/.react-router/types/+future.ts (1 hunks)
  • apps/todo-app/.react-router/types/+routes.ts (1 hunks)
  • apps/todo-app/.react-router/types/+server-build.d.ts (1 hunks)
  • apps/todo-app/.react-router/types/app/+types/root.ts (1 hunks)
  • apps/todo-app/.react-router/types/app/routes/+types/home.ts (1 hunks)
  • apps/todo-app/app/globals.css (1 hunks)
  • apps/todo-app/app/routes.ts (1 hunks)
  • apps/todo-app/tailwind.config.ts (1 hunks)
  • apps/todo-app/tsconfig.json (1 hunks)
  • packages/config/package.json (0 hunks)
  • packages/config/src/tailwind.config.ts (0 hunks)
  • packages/config/src/tsconfig.json (0 hunks)
  • tsconfig.json (1 hunks)
💤 Files with no reviewable changes (3)
  • packages/config/src/tailwind.config.ts
  • packages/config/src/tsconfig.json
  • packages/config/package.json
🧰 Additional context used
🧬 Code Graph Analysis (2)
apps/todo-app/.react-router/types/app/routes/+types/home.ts (1)
apps/todo-app/.react-router/types/app/+types/root.ts (16)
  • LinkDescriptors (21-21)
  • LinksFunction (22-22)
  • MetaArgs (25-25)
  • MetaDescriptors (26-26)
  • MetaFunction (27-27)
  • HeadersArgs (30-30)
  • HeadersFunction (31-31)
  • unstable_MiddlewareFunction (34-34)
  • unstable_ClientMiddlewareFunction (37-37)
  • LoaderArgs (40-40)
  • ClientLoaderArgs (43-43)
  • ActionArgs (46-46)
  • ClientActionArgs (49-49)
  • HydrateFallbackProps (52-52)
  • ComponentProps (55-55)
  • ErrorBoundaryProps (58-58)
apps/todo-app/.react-router/types/app/+types/root.ts (1)
apps/todo-app/.react-router/types/app/routes/+types/home.ts (16)
  • LinkDescriptors (24-24)
  • LinksFunction (25-25)
  • MetaArgs (28-28)
  • MetaDescriptors (29-29)
  • MetaFunction (30-30)
  • HeadersArgs (33-33)
  • HeadersFunction (34-34)
  • unstable_MiddlewareFunction (37-37)
  • unstable_ClientMiddlewareFunction (40-40)
  • LoaderArgs (43-43)
  • ClientLoaderArgs (46-46)
  • ActionArgs (49-49)
  • ClientActionArgs (52-52)
  • HydrateFallbackProps (55-55)
  • ComponentProps (58-58)
  • ErrorBoundaryProps (61-61)
🔇 Additional comments (11)
apps/todo-app/.react-router/types/+future.ts (1)

1-9: LGTM! Standard React Router feature flag configuration.

This is a well-structured type augmentation that properly extends React Router's Future interface. The unstable_middleware: false configuration correctly disables the unstable middleware feature using a literal boolean type.

apps/todo-app/app/routes.ts (1)

1-5: LGTM! Clean route configuration using React Router 7 patterns.

The route configuration correctly uses the index function to define the home route and applies proper type safety with the satisfies RouteConfig assertion. This aligns well with React Router 7's file-based routing approach.

apps/todo-app/.react-router/types/+server-build.d.ts (1)

3-17: LGTM! Comprehensive server build type declarations.

The virtual module declaration properly re-exports all standard ServerBuild properties from React Router. The type mappings are correct and provide good type safety for server-side functionality including assets, routes, SSR configuration, and critical CSS extraction.

apps/todo-app/.react-router/types/+routes.ts (1)

5-27: LGTM! Proper route type mappings for single-page structure.

The Register interface correctly defines the route structure with both root.tsx and routes/home.tsx mapping to the same "/" page. The type definitions properly establish the relationship between route files and their corresponding pages with appropriate IDs and parameter types.

apps/todo-app/.react-router/types/app/+types/root.ts (2)

3-17: LGTM! Proper React Router internal type usage.

The type definitions correctly use React Router's internal GetInfo and GetAnnotations utilities to derive route-specific types. The module reference to "../root.js" is appropriate for the compiled output structure.


19-59: LGTM! Comprehensive route type exports with consistent patterns.

The Route namespace provides a complete set of type aliases covering all React Router functionality including links, meta, headers, middleware, loaders, actions, and component types. This pattern is consistent with the home route types and follows React Router's standard conventions.

apps/todo-app/.react-router/types/app/routes/+types/home.ts (2)

3-3: Avoid relying on react-router/internal – it’s not a public API.

Importing from "react-router/internal" couples you to undocumented internals that may change without notice in minor/patch releases, breaking type-gen. Verify the codegen tool can instead reference the public react-router entry points, or encapsulate this under your own re-export to soften future upgrades.


5-18: Verify the .js extension targets actually exist at type-check time.

All import("../home.js") / import("../../root.js") references assume compiled JS siblings are present when tsc runs. If you rely on TS-only sources (home.tsx, root.tsx) without emitting .js before type-checking, tsc will raise TS2307 (“Cannot find module”).
Double-check the build order or extend tsconfig.json (allowJs, resolvePackageJsonExports, path mappings) so these imports always resolve.

apps/todo-app/tsconfig.json (1)

2-3: Switch to relative base config looks good – double-check path mapping duplication

Extending ../../tsconfig.json is correct, but you now define additional paths here that are identical to those already present in the root config. This is harmless yet redundant; on large projects duplicated mappings become a maintenance hotspot.

Consider deleting the paths block unless you genuinely need app-specific overrides.

tsconfig.json (1)

19-24: Removal of @todo-starter/config paths LGTM

The updated mapping set is syntactically valid (no trailing comma issues) and reflects the package removal.

apps/todo-app/app/globals.css (1)

32-34: Verify @custom-variant dark syntax – the wrapped-parentheses form is non-standard

Tailwind v4 docs show:

@custom-variant dark ".dark &";

Whereas the code uses:

@custom-variant dark (&:where(.dark, .dark *));

The parentheses/&:where() flavour is not in the examples and may fail to compile, depending on the exact Tailwind version. Please run a quick build to confirm it emits the expected .dark selector or switch to the canonical form.

Would you run a dev build and confirm that the generated CSS contains rules prefixed with .dark?

Copy link
Contributor

Choose a reason for hiding this comment

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

@codegen-sh research if these react router types should be git ignored, then delete them commit and then add another commit with a change add to gitignore

@jaruesink
Copy link
Contributor

jaruesink commented Aug 6, 2025

@codegen-sh implement my code review comments

On it! I'll address your code review comments now 🛠️

💻 View my work🛑 Stop

- Update .cursorrules/monorepo.md to remove 'config' from shared packages list
- Remove generated React Router type files that should not be committed
- Add .react-router/ to .gitignore as per React Router v7 documentation

These generated type files are fully managed by React Router and should
be gitignored according to the official documentation.
@codegen-sh
Copy link
Contributor Author

codegen-sh bot commented Aug 6, 2025

Code review comments implemented successfully!

I've addressed both issues from your code review:

🔧 Fixed Documentation Issue

  • Updated .cursorrules/monorepo.md - Removed references to the deleted config package from the shared packages list (line 5)
  • Now correctly shows only ui and utils as shared packages

🗂️ Fixed React Router Types Issue

  • Researched React Router v7 documentation - Confirmed that .react-router/types/ files are auto-generated and should be gitignored
  • Removed generated type files - Deleted the entire apps/todo-app/.react-router/ directory
  • Added to .gitignore - Added .react-router/ to gitignore as per official React Router documentation

Verification

  • Dev server still works - Confirmed bun dev starts successfully after changes
  • Types will regenerate - React Router automatically generates these files when needed during development

The changes have been committed and pushed to the existing PR branch. React Router will automatically regenerate the type files when you run the dev server, and they'll now be properly ignored by git as intended! 🚀

🔗 View Updated PR #2

💻 View my work🛑 Stop

@jaruesink
Copy link
Contributor

jaruesink commented Aug 6, 2025

@codegen-sh getting this error when trying to run dev

todo-app:dev: Error: Route config file not found at "app/routes.ts".
todo-app:dev: at createConfigLoader (/Users/jaruesink/projects/react-router-starter/node_modules/@react-router/dev/dist/vite.js:581:11)
todo-app:dev: at createContext2 (/Users/jaruesink/projects/react-router-starter/node_modules/@react-router/dev/dist/vite.js:798:24)
todo-app:dev: at watch (/Users/jaruesink/projects/react-router-starter/node_modules/@react-router/dev/dist/vite.js:1196:15)
todo-app:dev:
todo-app:dev: Node.js v22.13.1

Let me investigate that route config error... 🕵️‍♂️

💻 View my work🛑 Stop

@codegen-sh
Copy link
Contributor Author

codegen-sh bot commented Aug 6, 2025

🔍 Troubleshooting the Route Config Error

The routes.ts file is definitely present and correct in the PR branch. This seems like a local environment issue. Here's how to fix it:

🔄 Step 1: Pull Latest Changes

git fetch origin
git checkout codegen-bot/upgrade-to-tailwind-v4-proper-1754510773
git pull origin codegen-bot/upgrade-to-tailwind-v4-proper-1754510773

🧹 Step 2: Clear Caches & Reinstall

# Clear all caches
rm -rf node_modules
rm -rf apps/todo-app/node_modules
rm -rf .turbo
rm -rf apps/todo-app/.vite
rm -rf apps/todo-app/.react-router

# Reinstall dependencies
bun install

Step 3: Verify File Exists

ls -la apps/todo-app/app/routes.ts
cat apps/todo-app/app/routes.ts

You should see:

import { type RouteConfig, index } from '@react-router/dev/routes';

export default [
  index('routes/home.tsx')
] satisfies RouteConfig;

🚀 Step 4: Try Dev Server

cd apps/todo-app
bun dev

🤔 If Still Not Working

The issue might be:

  • Stale cache - React Router might be looking for the file in a cached location
  • Working directory - Make sure you're running bun dev from apps/todo-app/
  • Node modules - Try deleting node_modules and reinstalling

Let me know if you're still getting the error after these steps! 🛠️

💻 View my work🛑 Stop

- Delete .cursorrules/monorepo.md, .cursorrules/react-router-7.md, .cursorrules/README.md, and .cursorrules/ui-components.md as they are no longer relevant.
- Clean up the codebase by removing unused cursor rules to streamline development and maintain consistency.
@jaruesink jaruesink merged commit ab94507 into main Aug 6, 2025
1 check was pending
@jaruesink jaruesink deleted the codegen-bot/upgrade-to-tailwind-v4-proper-1754510773 branch August 6, 2025 20:50
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.

2 participants