Skip to content

feat(settings): premium single-column layout, onboarding banner, and unit tests - #16

Merged
AndersonDesign1 merged 9 commits into
mainfrom
feat/premium-settings-onboarding
May 27, 2026
Merged

feat(settings): premium single-column layout, onboarding banner, and unit tests#16
AndersonDesign1 merged 9 commits into
mainfrom
feat/premium-settings-onboarding

Conversation

@AndersonDesign1

@AndersonDesign1 AndersonDesign1 commented May 27, 2026

Copy link
Copy Markdown
Owner

Description

This PR delivers the premium Settings page redesign alongside custom settings onboarding, pre-population of logged-in user details, fully optimized state synchronization, and robust Vitest unit tests.

Changes Included

  1. Premium Minimal Layout: Center-aligned single-column page structure (\max-w-3xl mx-auto).
  2. Branded Visuals: Applied exact project-level nested frame styles to the logo badge and implemented the dashed file uploader dropzone from the projects assets view.
  3. Interactive Onboarding On Factory Defaults: Custom personalized onboarding welcome banner pre-filled with admin signup session details (name and email), which automatically commits and hides once details are saved.
  4. Vercel Client Portal Domains: Migrated portal URL domains to \useclientra.vercel.app.
  5. State Sync & Dependency Optimization: Refactored the settings \useEffect\ sync block to depend only on the pre-computed \isDefaultSettings\ boolean and granular user fields (\currentUser?.name, \currentUser?.email), resolving linter dependencies.
  6. Tests: Added a comprehensive suite (\src/tests/settings.test.tsx) covering settings path generation and workspace onboarding rendering. Resolved a missing QueryClient provider in existing pending invites tests.

Verification Results

  • Lint & CSS Sorting (Biome): Cleanly passed.
  • TypeScript (tsc): Compiles perfectly with zero errors.
  • Test Suite (Vitest): All 92 unit and component tests passing successfully.
  • Production Build (Nitro): Succeeded with no errors or native module warnings.

Summary by CodeRabbit

  • New Features

    • Added workspace personalization prompt for initial setup.
  • Bug Fixes

    • Corrected client portal URL domain.
  • Style

    • Redesigned Settings page layout and visual hierarchy.
    • Enhanced workspace branding upload interface.
    • Improved toggle switch and copy button interactions.
    • Revamped Features tab with card-based layout.

Review Change Stack

@vercel

vercel Bot commented May 27, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
clientra Ready Ready Preview, Comment May 27, 2026 6:09pm

@coderabbitai

coderabbitai Bot commented May 27, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@AndersonDesign1, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 21 minutes and 24 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6b866399-f4d6-4bd0-bc1a-4d4815eeef34

📥 Commits

Reviewing files that changed from the base of the PR and between 6263bf0 and e163116.

📒 Files selected for processing (3)
  • src/__tests__/client-pending-invites.test.tsx
  • src/__tests__/settings.test.tsx
  • src/routes/settings.tsx
📝 Walkthrough

Walkthrough

This PR enhances the Settings feature by introducing React Query test infrastructure, exporting Settings utilities, updating WorkspaceTab state logic to use the current user session for form defaults when settings are pristine, overhauling the WorkspaceTab and FeaturesTab UI with new card-based layouts, and adding comprehensive test coverage for the updated Settings route.

Changes

Settings Feature Enhancement

Layer / File(s) Summary
React Query test infrastructure
src/__tests__/client-pending-invites.test.tsx, src/__tests__/settings.test.tsx
Shared QueryClient configured with retry: false and renderWithClient helper introduced to centralize rendering under QueryClientProvider. All test suites updated to use this helper.
Settings route exports and configuration
src/routes/settings.tsx
getPortalPath function and WorkspaceTab component are now exported. Constants DEFAULT_WORKSPACE_NAME and DEFAULT_SUPPORT_EMAIL added. Portal URL domain migrated from useclientra.com to useclientra.vercel.app.
WorkspaceTab state synchronization
src/routes/settings.tsx
WorkspaceTab integrates authClient session. New isDefaultSettings logic initializes workspace name and support email from current user when settings are at defaults, otherwise from loaded settings.
WorkspaceTab UI overhaul
src/routes/settings.tsx
Major UI restructuring adds conditional "personalize your workspace" callout for default settings, updates logo upload presentation, and refines save/copy button controls and styling.
FeaturesTab and FeatureToggle styling
src/routes/settings.tsx
FeaturesTab refactored to card-based layout with feature info row and vertical toggles container. FeatureToggle updated with refined toggle switch styling for hover/checked states and knob positioning.
Settings loading state styling
src/routes/settings.tsx
Loading state restyled with centered/max-width wrapper and adjusted spacing for skeleton layout.
Settings route test coverage
src/__tests__/settings.test.tsx
Tests added for getPortalPath slug transformation logic and WorkspaceTab UI, including verification of personalized onboarding banner when settings are at defaults.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 The settings dance now gleams so bright,
With React Query tests set just right,
WorkspaceTab learns its user's name,
Features card-styled, all looking the same,
Portal paths point to verdant new ground! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: premium single-column layout redesign, onboarding banner functionality, and addition of unit tests—all reflected in the changeset.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/premium-settings-onboarding

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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6263bf0e06

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/routes/settings.tsx
setSaveStatus("saving");
try {
const portalUrl = `https://useclientra.com/portal/${portalPath}`;
const portalUrl = `https://useclientra.vercel.app/portal/${portalPath}`;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep portal links on the production domain

When an admin saves workspace settings, this now persists a portalUrl on useclientra.vercel.app instead of the previous branded useclientra.com domain, and the same hardcoded host is used for the copied/displayed URL. In production this publishes and shares the Vercel deployment URL for any workspace profile edit, which is a regression from the existing production-facing portal link and should stay on the canonical app host or come from configuration.

Useful? React with 👍 / 👎.

@greptile-apps

greptile-apps Bot commented May 27, 2026

Copy link
Copy Markdown

Greptile Summary

This PR redesigns the Settings page to a centered single-column layout (max-w-3xl), adds a personalized onboarding banner that pre-fills workspace name and support email from the logged-in user's session when factory defaults are detected, migrates portal URLs from useclientra.com to useclientra.vercel.app, and adds Vitest coverage for getPortalPath and WorkspaceTab. A QueryClientProvider wrapper is also backfilled into the existing pending-invites tests.

  • Layout & UX: Both WorkspaceTab and FeaturesTab now render inside a card with a section header; the logo preview is updated to match the project-card design, and the dashed upload dropzone is reused from the projects view.
  • Onboarding logic: isDefaultSettings (name + email both at factory values) gates the banner and pre-population useEffect; the banner hides automatically once the user saves non-default values.
  • Test additions: getPortalPath slug generation is exercised with edge cases, and WorkspaceTab is integration-tested for field rendering and banner visibility under mock factory-default settings.

Confidence Score: 4/5

Safe to merge; all changes are UI/UX and test infrastructure with no data-loss or auth risk.

The core settings save/load flow is unchanged and the new onboarding logic works correctly for the primary scenario. The intentional omission of settings from the useEffect dependency array means the form won't resync if a background refetch updates a non-default workspace from another session, but this is an edge case that won't affect typical single-session usage. Test isolation is slightly weakened by the module-scoped queryClient not being cleared between cases, though the fully mocked hooks make this harmless today.

No files require special attention; src/routes/settings.tsx carries the only intentional tradeoff (effect dep narrowing) which is now documented in a comment.

Important Files Changed

Filename Overview
src/routes/settings.tsx Major UI redesign to single-column layout with onboarding banner; getPortalPath and WorkspaceTab exported for tests; useEffect deps intentionally narrowed with a biome-ignore (documented stale-settings tradeoff); portal domain migrated to vercel.app.
src/tests/settings.test.tsx New test file covering getPortalPath slug logic and WorkspaceTab rendering/onboarding banner; module-scoped queryClient not cleared between tests (minor test isolation gap).
src/tests/client-pending-invites.test.tsx Adds missing QueryClientProvider wrapper to fix previously broken renders; all three test cases migrated from bare render to renderWithClient; logic and assertions unchanged.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[WorkspaceTab mounts] --> B{settings loaded?}
    B -- No --> C[form = empty strings]
    B -- Yes --> D{isDefaultSettings?}
    D -- Yes + currentUser --> E[useEffect: pre-fill with currentUser.name / email]
    D -- No --> F[useEffect: fill from settings.workspaceName / supportEmail]
    E --> G[Onboarding banner visible]
    F --> H[No banner]
    G --> I[User reviews / edits form]
    H --> I
    I --> J[Save Changes]
    J --> K[mutateAsync → cache invalidated → settings refetch]
    K --> L{isDefaultSettings changed?}
    L -- Yes: now false --> M[useEffect re-runs → else branch → form synced]
    L -- No: still false --> N[Effect does NOT re-run, form retains user edits]
    M --> O[Banner hidden]
    N --> P[Form stays as-is]
Loading
Prompt To Fix All With AI
Fix the following 2 code review issues. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 2
src/__tests__/settings.test.tsx:48-54
**Module-scoped QueryClient shared across tests**

`queryClient` is created once at module scope and never cleared between test cases. If React Query writes anything to the cache during a test (even from intercepted hooks that partially execute before mocks kick in), stale entries persist into the next test. The `afterEach(cleanup)` handles the DOM but not the query cache. Adding `queryClient.clear()` to the `afterEach` block would prevent this. The same pattern also appears in `client-pending-invites.test.tsx` at the same scope level.

### Issue 2 of 2
src/routes/settings.tsx:158-170
**Stale `settings` closure in non-default branch of `useEffect`**

`settings` is referenced inside the effect's `else` branch but deliberately excluded from the dependency array. When settings are NOT at factory defaults, the effect only re-runs if `isDefaultSettings`, `currentUser?.name`, or `currentUser?.email` changes. If React Query performs a background refetch that updates `settings.workspaceName` or `settings.supportEmail` while `isDefaultSettings` stays `false` and the user identity hasn't changed, the effect won't re-run, so the form fields silently diverge from the server state. The biome-ignore comment says "Only trigger on defaults and user credential changes," but the consequence is that server-side changes to a non-default workspace (e.g., from another tab or admin update) are never reflected in the form until a full remount.

```suggestion
  // Sync local state when settings load.
  // `settings` is intentionally excluded so background refetches do not
  // clobber in-progress edits. `isDefaultSettings` is derived from
  // `settings`, so any change that affects default detection still triggers
  // the effect. The tradeoff is that external changes to a non-default
  // workspace (e.g. from another tab) won't be reflected until remount.
  // biome-ignore lint/correctness/useExhaustiveDependencies: intentional – see comment above
  useEffect(() => {
    if (settings) {
      if (isDefaultSettings && currentUser) {
        setWorkspaceName(currentUser.name ?? "My Workspace");
        setSupportEmail(currentUser.email ?? DEFAULT_SUPPORT_EMAIL);
      } else {
        setWorkspaceName(settings.workspaceName);
        setSupportEmail(settings.supportEmail);
      }
    }
  }, [isDefaultSettings, currentUser?.name, currentUser?.email]);
```

Reviews (1): Last reviewed commit: "test(settings): add workspace tab and sl..." | Re-trigger Greptile

Comment on lines +48 to +54
const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: false,
},
},
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Module-scoped QueryClient shared across tests

queryClient is created once at module scope and never cleared between test cases. If React Query writes anything to the cache during a test (even from intercepted hooks that partially execute before mocks kick in), stale entries persist into the next test. The afterEach(cleanup) handles the DOM but not the query cache. Adding queryClient.clear() to the afterEach block would prevent this. The same pattern also appears in client-pending-invites.test.tsx at the same scope level.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/__tests__/settings.test.tsx
Line: 48-54

Comment:
**Module-scoped QueryClient shared across tests**

`queryClient` is created once at module scope and never cleared between test cases. If React Query writes anything to the cache during a test (even from intercepted hooks that partially execute before mocks kick in), stale entries persist into the next test. The `afterEach(cleanup)` handles the DOM but not the query cache. Adding `queryClient.clear()` to the `afterEach` block would prevent this. The same pattern also appears in `client-pending-invites.test.tsx` at the same scope level.

How can I resolve this? If you propose a fix, please make it concise.

Comment thread src/routes/settings.tsx Outdated
Comment on lines +158 to +170
// Sync local state when settings load
// biome-ignore lint/correctness/useExhaustiveDependencies: Only trigger on defaults and user credential changes
useEffect(() => {
if (settings) {
setWorkspaceName(settings.workspaceName);
setSupportEmail(settings.supportEmail);
if (isDefaultSettings && currentUser) {
setWorkspaceName(currentUser.name ?? "My Workspace");
setSupportEmail(currentUser.email ?? DEFAULT_SUPPORT_EMAIL);
} else {
setWorkspaceName(settings.workspaceName);
setSupportEmail(settings.supportEmail);
}
}
}, [settings]);
}, [isDefaultSettings, currentUser?.name, currentUser?.email]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Stale settings closure in non-default branch of useEffect

settings is referenced inside the effect's else branch but deliberately excluded from the dependency array. When settings are NOT at factory defaults, the effect only re-runs if isDefaultSettings, currentUser?.name, or currentUser?.email changes. If React Query performs a background refetch that updates settings.workspaceName or settings.supportEmail while isDefaultSettings stays false and the user identity hasn't changed, the effect won't re-run, so the form fields silently diverge from the server state. The biome-ignore comment says "Only trigger on defaults and user credential changes," but the consequence is that server-side changes to a non-default workspace (e.g., from another tab or admin update) are never reflected in the form until a full remount.

Suggested change
// Sync local state when settings load
// biome-ignore lint/correctness/useExhaustiveDependencies: Only trigger on defaults and user credential changes
useEffect(() => {
if (settings) {
setWorkspaceName(settings.workspaceName);
setSupportEmail(settings.supportEmail);
if (isDefaultSettings && currentUser) {
setWorkspaceName(currentUser.name ?? "My Workspace");
setSupportEmail(currentUser.email ?? DEFAULT_SUPPORT_EMAIL);
} else {
setWorkspaceName(settings.workspaceName);
setSupportEmail(settings.supportEmail);
}
}
}, [settings]);
}, [isDefaultSettings, currentUser?.name, currentUser?.email]);
// Sync local state when settings load.
// `settings` is intentionally excluded so background refetches do not
// clobber in-progress edits. `isDefaultSettings` is derived from
// `settings`, so any change that affects default detection still triggers
// the effect. The tradeoff is that external changes to a non-default
// workspace (e.g. from another tab) won't be reflected until remount.
// biome-ignore lint/correctness/useExhaustiveDependencies: intentional – see comment above
useEffect(() => {
if (settings) {
if (isDefaultSettings && currentUser) {
setWorkspaceName(currentUser.name ?? "My Workspace");
setSupportEmail(currentUser.email ?? DEFAULT_SUPPORT_EMAIL);
} else {
setWorkspaceName(settings.workspaceName);
setSupportEmail(settings.supportEmail);
}
}
}, [isDefaultSettings, currentUser?.name, currentUser?.email]);
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/routes/settings.tsx
Line: 158-170

Comment:
**Stale `settings` closure in non-default branch of `useEffect`**

`settings` is referenced inside the effect's `else` branch but deliberately excluded from the dependency array. When settings are NOT at factory defaults, the effect only re-runs if `isDefaultSettings`, `currentUser?.name`, or `currentUser?.email` changes. If React Query performs a background refetch that updates `settings.workspaceName` or `settings.supportEmail` while `isDefaultSettings` stays `false` and the user identity hasn't changed, the effect won't re-run, so the form fields silently diverge from the server state. The biome-ignore comment says "Only trigger on defaults and user credential changes," but the consequence is that server-side changes to a non-default workspace (e.g., from another tab or admin update) are never reflected in the form until a full remount.

```suggestion
  // Sync local state when settings load.
  // `settings` is intentionally excluded so background refetches do not
  // clobber in-progress edits. `isDefaultSettings` is derived from
  // `settings`, so any change that affects default detection still triggers
  // the effect. The tradeoff is that external changes to a non-default
  // workspace (e.g. from another tab) won't be reflected until remount.
  // biome-ignore lint/correctness/useExhaustiveDependencies: intentional – see comment above
  useEffect(() => {
    if (settings) {
      if (isDefaultSettings && currentUser) {
        setWorkspaceName(currentUser.name ?? "My Workspace");
        setSupportEmail(currentUser.email ?? DEFAULT_SUPPORT_EMAIL);
      } else {
        setWorkspaceName(settings.workspaceName);
        setSupportEmail(settings.supportEmail);
      }
    }
  }, [isDefaultSettings, currentUser?.name, currentUser?.email]);
```

How can I resolve this? If you propose a fix, please make it concise.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/routes/settings.tsx`:
- Around line 159-170: The useEffect that sets workspaceName/supportEmail
(useEffect) currently only depends on isDefaultSettings and currentUser fields,
so when non-default settings change the effect won't run; update the dependency
array to include settings (or at minimum settings.workspaceName and
settings.supportEmail) so that when settings updates the effect reruns and calls
setWorkspaceName and setSupportEmail accordingly, keeping portalPath/hasChanges
and inputs in sync; retain the existing isDefaultSettings/currentUser checks and
keep the biome-ignore comment if needed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 75f53d38-8afc-46c6-841b-60d0adf19012

📥 Commits

Reviewing files that changed from the base of the PR and between 2b540a0 and 6263bf0.

📒 Files selected for processing (3)
  • src/__tests__/client-pending-invites.test.tsx
  • src/__tests__/settings.test.tsx
  • src/routes/settings.tsx

Comment thread src/routes/settings.tsx Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 20e3bd3549

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


vi.mock("@/lib/api", () => ({
useSettingsData: () => ({
data: mockSettings,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid closing hoisted mocks over local fixtures

In Vitest, vi.mock factories are hoisted and executed before the module-scope fixtures here are initialized, so this mock closes over mockSettings (and the auth mock similarly closes over mockUser) while those const bindings are still in the temporal dead zone. Running this test file will fail during module mocking before any assertions run; move these fixtures into vi.hoisted, inline them inside the factory, or return them from a hoisted setup.

Useful? React with 👍 / 👎.

@AndersonDesign1
AndersonDesign1 merged commit 4672959 into main May 27, 2026
5 checks passed
@AndersonDesign1
AndersonDesign1 deleted the feat/premium-settings-onboarding branch May 27, 2026 18:09

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e163116aa8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +27 to +37

vi.mock("@/lib/api", () => ({
useSettingsData: () => ({
data: mockSettings,
isLoading: false,
error: null,
}),
useUpdateSettingsMutation: () => ({
mutateAsync: vi.fn(),
isPending: false,
}),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Provide all route imports in the API mock

When this test imports @/routes/settings, the route module also imports ensureSettingsData to construct the TanStack route loader, but the full @/lib/api mock only exposes the two hooks here. Under Vitest this causes the settings module import to fail with a missing mocked export before any assertions run; include ensureSettingsData (or use vi.importActual for unmocked exports) so the route can be evaluated.

Useful? React with 👍 / 👎.

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