Skip to content

feat: custom theming enhancements#8342

Merged
pushya22 merged 11 commits intopreviewfrom
chore-custom-theming-enhancements
Dec 16, 2025
Merged

feat: custom theming enhancements#8342
pushya22 merged 11 commits intopreviewfrom
chore-custom-theming-enhancements

Conversation

@anmolsinghbhatia
Copy link
Copy Markdown
Collaborator

@anmolsinghbhatia anmolsinghbhatia commented Dec 15, 2025

Description

This PR includes enhancement for custom theming.

Type of Change

  • Feature
  • Improvement
  • Code refactoring

Screenshots and Media (if applicable)

Summary by CodeRabbit

  • New Features

    • Custom Theme Builder: import/export JSON configs and create/apply richer multi‑shade custom themes.
  • Improvements

    • New OKLCH‑based palette generation for more accurate, perceptually consistent colors.
    • Streamlined theme selection and appearance flow; improved dropdown placement and clearer generation/loading states.
    • More reliable apply/clear of custom themes sourced from user profile.
  • Docs

    • Added brand/neutral 0‑shade CSS tokens to support the new palette system.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Dec 15, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Replaces legacy 5-shade theming with a new OKLCH-based 14-stop palette system: adds color conversion, validation, palette generation, inversion and browser-application utilities; removes old theme utilities; updates types, stores, components, CSS tokens, and package deps to use the new applyCustomTheme/clearCustomTheme workflow.

Changes

Cohort / File(s) Summary
New theme library
packages/utils/src/theme/* (color-conversion.ts, color-validation.ts, constants.ts, palette-generator.ts, theme-application.ts, theme-inversion.ts, index.ts)
Adds OKLCH color conversions, hex validation/normalization, centralized constants, 14-stop palette generator, palette inversion, applyCustomTheme/clearCustomTheme browser application, and a consolidated public theme API.
Removed legacy theme
packages/utils/src/theme.ts
Deletes legacy 5-color theming utilities and exports (applyTheme, unsetCustomCssVariables, shade calculations, resolveGeneralTheme).
Legacy compat & re-export
packages/utils/src/theme-legacy.ts, packages/utils/src/index.ts
Adds legacy helper resolveGeneralTheme and re-exports it from the utils index.
Types updated
packages/types/src/users.ts
Adjusts IUserTheme / TUserProfile.theme: removes text, palette, sidebarText, sidebarBackground; makes primary/background optional and darkPalette optional boolean.
Package deps
packages/utils/package.json
Adds runtime dependency chroma-js (^3.2.0) and devDependency @types/chroma-js (^3.1.2).
Theme integration in app
apps/web/core/lib/wrappers/store-wrapper.tsx, apps/web/app/(all)/profile/appearance/page.tsx, apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/preferences/page.tsx, apps/web/ce/components/preferences/theme-switcher.tsx, apps/web/core/components/core/theme/theme-switch.tsx
Replaces applyTheme/unsetCustomCssVariables with applyCustomTheme/clearCustomTheme, reads theme from userProfile.theme (new payload shape), adjusts component observers/exports, and tweaks dropdown placement.
Custom theme UI
apps/web/core/components/core/theme/custom-theme-selector.tsx, apps/web/core/components/core/theme/config-handler.tsx
Rewrites selector to internalize flow (removes applyThemeChange prop), adds loading state, hex validation/normalization, palette generation via new APIs, import/export JSON handling, toasts, and updated form handling; adds CustomThemeConfigHandler for import/export.
Store defaults & profile shape
apps/space/core/store/profile.store.ts, apps/web/core/store/user/profile.store.ts
Remove initialization of legacy theme fields (text, palette, sidebarText, sidebarBackground) from default profile theme; set darkPalette default to boolean/false and simplify theme update iteration.
CSS tokens
packages/tailwind-config/variables.css, packages/tailwind-config/index.css
Adds --color-neutral-0 and --color-brand-0 tokens to light/dark sections; updates body utility to include bg-canvas.
Layout tweak
apps/web/app/layout.tsx
Removes the bg-canvas class from the root container's className.
Exports & helpers
packages/utils/src/index.ts
Re-exports resolveGeneralTheme and exposes the new theme API surface from internal theme modules.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant UI as Client UI (theme controls)
participant Store as Profile Store
participant Utils as Theme Utils (palette gen & apply)
participant DOM as Browser (:root CSS)
UI->>Store: update userProfile.theme (theme="custom", primary, background, darkPalette)
Store-->>UI: persisted profile change / new profile data
UI->>Utils: call applyCustomTheme(primary, background, mode)
Utils->>Utils: generate palettes (OKLCH → 14 stops), validate inputs
Utils->>Utils: invert palette if mode is dark
Utils->>DOM: set --color-... CSS variables on :root
Utils-->>UI: success / error
UI->>UI: show toast / update controls

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

  • Areas needing extra attention:
    • palette generation correctness and dynamic valueStop (packages/utils/src/theme/palette-generator.ts)
    • OKLCH/color conversion fallbacks and chroma-js usage (packages/utils/src/theme/color-conversion.ts)
    • color validation and lightness adjustment edge cases (packages/utils/src/theme/color-validation.ts)
    • CSS variable mapping, alpha tokens and cleanup logic (packages/utils/src/theme/theme-application.ts)
    • Type changes for IUserTheme / TUserProfile and their propagation across stores/components
    • Custom theme import/export parsing and UI loading/error flows (custom-theme-selector.tsx, config-handler.tsx)
    • Replacement of legacy utilities and ensuring no remaining usages of removed functions

Poem

🐰 I nibble hex into OKLCH light,
Fourteen shades hop from day to night,
I tuck them in :root with careful gleam,
Primary and neutral stitch the dream,
A rabbit's palette, baked into theme. ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Description check ❓ Inconclusive The PR description identifies it as a Feature/Improvement/Refactoring but lacks detailed information about specific changes, test scenarios, and references. Key sections are incomplete or missing. Add specifics about the new theming system (OKLCH-based palette generation), key files modified, test scenarios performed, and any related issues/PRs referenced to provide complete context.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat: custom theming enhancements' is directly related to the main objective of the PR, which involves significant custom theming improvements across the codebase including new OKLCH-based color system, custom theme application utilities, and theme selector refactoring.
Docstring Coverage ✅ Passed Docstring coverage is 84.00% which is sufficient. The required threshold is 80.00%.
✨ 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 chore-custom-theming-enhancements

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.

@anmolsinghbhatia anmolsinghbhatia marked this pull request as ready for review December 16, 2025 09:52
Copilot AI review requested due to automatic review settings December 16, 2025 09:52
Copy link
Copy Markdown
Contributor

@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: 8

🧹 Nitpick comments (4)
packages/utils/src/theme-legacy.ts (1)

20-21: Consider refactoring nested ternary for readability.

The nested ternary operator works correctly but could be more readable with an early-return pattern or if-else structure.

Apply this diff for improved readability:

-export const resolveGeneralTheme = (resolvedTheme: string | undefined) =>
-  resolvedTheme?.includes("light") ? "light" : resolvedTheme?.includes("dark") ? "dark" : "system";
+export const resolveGeneralTheme = (resolvedTheme: string | undefined): string => {
+  if (resolvedTheme?.includes("light")) return "light";
+  if (resolvedTheme?.includes("dark")) return "dark";
+  return "system";
+};
packages/utils/src/theme/constants.ts (1)

6-22: Clarify the shade count in ALPHA_MAPPING documentation.

The comment on line 7 states "14-shade palette system" but ALPHA_MAPPING contains 12 entries (100–1200), while SHADE_STOPS (line 29) has 14 entries including 50. Consider updating the comment to reflect that ALPHA_MAPPING provides 12 alpha levels for the 14-shade palette system, excluding the extreme shades.

Apply this diff to improve clarity:

 /**
- * Alpha mapping for 14-shade palette system
+ * Alpha mapping for the 14-shade palette system
+ * Provides 12 alpha levels (excludes extreme shades 50 and >1200)
  */
 export const ALPHA_MAPPING = {
packages/utils/src/theme/theme-application.ts (1)

55-58: Consider clarifying alpha mapping behavior for white vs black.

Lines 56-57 apply the same alpha value to both --color-alpha-white-* and --color-alpha-black-* variables using neutralOKLCH. The naming suggests these should have different behaviors (white alpha vs black alpha), but both use the same base color.

If this is intentional, consider adding a comment explaining why both use neutralOKLCH. If they should differ, adjust the implementation:

  Object.entries(ALPHA_MAPPING).forEach(([key, value]) => {
-   themeElement.style.setProperty(`--color-alpha-white-${key}`, oklchToCSS(neutralOKLCH, value * 100));
-   themeElement.style.setProperty(`--color-alpha-black-${key}`, oklchToCSS(neutralOKLCH, value * 100));
+   const whiteAlpha = { l: 1, c: 0, h: 0 }; // Pure white with alpha
+   const blackAlpha = { l: 0, c: 0, h: 0 }; // Pure black with alpha
+   themeElement.style.setProperty(`--color-alpha-white-${key}`, oklchToCSS(whiteAlpha, value * 100));
+   themeElement.style.setProperty(`--color-alpha-black-${key}`, oklchToCSS(blackAlpha, value * 100));
  });
apps/web/core/components/core/theme/custom-theme-selector.tsx (1)

100-106: Remove outdated comment.

The comment on line 105 references a useEffect that doesn't exist in the code. This could confuse future maintainers.

Apply this diff:

   onChange(hex);
-  // useEffect will handle preview update with debouncing
 };
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 22339b9 and 5131dde.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (21)
  • apps/space/core/store/profile.store.ts (0 hunks)
  • apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/preferences/page.tsx (2 hunks)
  • apps/web/app/(all)/profile/appearance/page.tsx (3 hunks)
  • apps/web/ce/components/preferences/theme-switcher.tsx (3 hunks)
  • apps/web/core/components/core/theme/custom-theme-selector.tsx (2 hunks)
  • apps/web/core/components/core/theme/theme-switch.tsx (1 hunks)
  • apps/web/core/lib/wrappers/store-wrapper.tsx (2 hunks)
  • apps/web/core/store/user/profile.store.ts (0 hunks)
  • packages/tailwind-config/variables.css (7 hunks)
  • packages/types/src/users.ts (2 hunks)
  • packages/utils/package.json (2 hunks)
  • packages/utils/src/index.ts (1 hunks)
  • packages/utils/src/theme-legacy.ts (1 hunks)
  • packages/utils/src/theme.ts (0 hunks)
  • packages/utils/src/theme/color-conversion.ts (1 hunks)
  • packages/utils/src/theme/color-validation.ts (1 hunks)
  • packages/utils/src/theme/constants.ts (1 hunks)
  • packages/utils/src/theme/index.ts (1 hunks)
  • packages/utils/src/theme/palette-generator.ts (1 hunks)
  • packages/utils/src/theme/theme-application.ts (1 hunks)
  • packages/utils/src/theme/theme-inversion.ts (1 hunks)
💤 Files with no reviewable changes (3)
  • apps/space/core/store/profile.store.ts
  • apps/web/core/store/user/profile.store.ts
  • packages/utils/src/theme.ts
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • packages/utils/src/index.ts
  • apps/web/core/components/core/theme/theme-switch.tsx
  • packages/utils/src/theme-legacy.ts
  • apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/preferences/page.tsx
  • packages/utils/src/theme/theme-application.ts
  • apps/web/app/(all)/profile/appearance/page.tsx
  • packages/utils/src/theme/color-conversion.ts
  • packages/utils/src/theme/index.ts
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • packages/utils/src/theme/theme-inversion.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
  • packages/types/src/users.ts
  • packages/utils/src/theme/color-validation.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/utils/src/theme/palette-generator.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Enable TypeScript strict mode and ensure all files are fully typed

Files:

  • packages/utils/src/index.ts
  • apps/web/core/components/core/theme/theme-switch.tsx
  • packages/utils/src/theme-legacy.ts
  • apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/preferences/page.tsx
  • packages/utils/src/theme/theme-application.ts
  • apps/web/app/(all)/profile/appearance/page.tsx
  • packages/utils/src/theme/color-conversion.ts
  • packages/utils/src/theme/index.ts
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • packages/utils/src/theme/theme-inversion.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
  • packages/types/src/users.ts
  • packages/utils/src/theme/color-validation.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/utils/src/theme/palette-generator.ts
**/*.{js,jsx,ts,tsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Prettier with Tailwind plugin for code formatting, run pnpm fix:format

Files:

  • packages/utils/src/index.ts
  • apps/web/core/components/core/theme/theme-switch.tsx
  • packages/utils/src/theme-legacy.ts
  • packages/tailwind-config/variables.css
  • packages/utils/package.json
  • apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/preferences/page.tsx
  • packages/utils/src/theme/theme-application.ts
  • apps/web/app/(all)/profile/appearance/page.tsx
  • packages/utils/src/theme/color-conversion.ts
  • packages/utils/src/theme/index.ts
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • packages/utils/src/theme/theme-inversion.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
  • packages/types/src/users.ts
  • packages/utils/src/theme/color-validation.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/utils/src/theme/palette-generator.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use ESLint with shared config across packages, adhering to max warnings limits per package
Use camelCase for variable and function names, PascalCase for components and types
Use try-catch with proper error types and log errors appropriately

Files:

  • packages/utils/src/index.ts
  • apps/web/core/components/core/theme/theme-switch.tsx
  • packages/utils/src/theme-legacy.ts
  • apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/preferences/page.tsx
  • packages/utils/src/theme/theme-application.ts
  • apps/web/app/(all)/profile/appearance/page.tsx
  • packages/utils/src/theme/color-conversion.ts
  • packages/utils/src/theme/index.ts
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • packages/utils/src/theme/theme-inversion.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
  • packages/types/src/users.ts
  • packages/utils/src/theme/color-validation.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/utils/src/theme/palette-generator.ts
**/package.json

📄 CodeRabbit inference engine (AGENTS.md)

Use workspace:* for internal packages and catalog: for external dependencies in imports

Files:

  • packages/utils/package.json
🧠 Learnings (16)
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `import type { Type } from "mod" with { "resolution-mode": "import" }` for specific module resolution contexts (TypeScript 5.3+)

Applied to files:

  • packages/utils/src/index.ts
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use `-active` state variants for elements in pressed/active states and `-selected` state variants only when actual selection logic exists

Applied to files:

  • apps/web/core/components/core/theme/theme-switch.tsx
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use semantic text colors: `text-primary` for main text and headings, `text-secondary` for descriptions, `text-tertiary` for labels and metadata, `text-placeholder` for placeholder text

Applied to files:

  • packages/utils/src/theme-legacy.ts
  • packages/tailwind-config/variables.css
  • packages/utils/src/theme/theme-application.ts
  • apps/web/app/(all)/profile/appearance/page.tsx
  • packages/utils/src/theme/index.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
  • packages/utils/src/theme/color-validation.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use semantic border colors: `border-subtle` for subtle borders and dividers, `border-subtle-1` for slightly more visible borders, `border-strong` for emphasis, `border-strong-1` for very strong borders

Applied to files:

  • packages/tailwind-config/variables.css
  • packages/utils/src/theme/theme-application.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
  • packages/utils/src/theme/constants.ts
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : In rare cases, form elements (inputs, buttons, switches) in modals or surfaces may use one layer level above for visual separation (e.g., `bg-layer-2` with `bg-surface-1`), but this should not be used for content boxes or cards

Applied to files:

  • packages/tailwind-config/variables.css
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Do not use Canvas (`bg-canvas`) for page-level backgrounds, nested containers, cards, modals, dropdowns, sidebars, panels, or anywhere other than the application root

Applied to files:

  • packages/tailwind-config/variables.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Match layer numbers to surface numbers: `bg-surface-1` uses `bg-layer-1`, `bg-surface-2` uses `bg-layer-2`, `bg-surface-3` uses `bg-layer-3`

Applied to files:

  • packages/tailwind-config/variables.css
📚 Learning: 2025-08-29T08:45:15.953Z
Learnt from: sriramveeraghanta
Repo: makeplane/plane PR: 7672
File: pnpm-workspace.yaml:8-9
Timestamp: 2025-08-29T08:45:15.953Z
Learning: The makeplane/plane repository uses pnpm v10.12.1, which supports onlyBuiltDependencies configuration in pnpm-workspace.yaml files.

Applied to files:

  • packages/utils/package.json
📚 Learning: 2025-12-12T15:20:36.519Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:36.519Z
Learning: Applies to packages/plane/ui/**/*.{ts,tsx} : Build components in `plane/ui` package with Storybook for isolated development

Applied to files:

  • packages/utils/package.json
📚 Learning: 2025-12-12T15:20:36.519Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:36.519Z
Learning: Applies to **/package.json : Use `workspace:*` for internal packages and `catalog:` for external dependencies in imports

Applied to files:

  • packages/utils/package.json
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • packages/utils/package.json
📚 Learning: 2025-06-04T16:22:44.344Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7164
File: packages/ui/.storybook/main.ts:24-47
Timestamp: 2025-06-04T16:22:44.344Z
Learning: In packages/ui/.storybook/main.ts, the webpackFinal function intentionally overrides the CSS loader strategy by finding and replacing existing CSS rules. This is a temporary workaround for a known upstream issue in Storybook's CSS handling that has been communicated to the Storybook maintainers. The current implementation should not be changed until the upstream issue is resolved.

Applied to files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • apps/web/core/lib/wrappers/store-wrapper.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use Surface (`bg-surface-1`, `bg-surface-2`, `bg-surface-3`) for top-level containers that sit directly on the canvas and serve as main content areas, page sections, or primary containers

Applied to files:

  • packages/utils/src/theme/index.ts
📚 Learning: 2025-12-12T15:20:36.519Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:36.519Z
Learning: Applies to packages/shared-state/**/*.{ts,tsx} : Maintain MobX stores in `packages/shared-state` using reactive patterns

Applied to files:

  • apps/web/core/lib/wrappers/store-wrapper.tsx
📚 Learning: 2025-10-21T17:22:05.204Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7989
File: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx:45-46
Timestamp: 2025-10-21T17:22:05.204Z
Learning: In the makeplane/plane repository, the refactor from useParams() to params prop is specifically scoped to page.tsx and layout.tsx files in apps/web/app (Next.js App Router pattern). Other components (hooks, regular client components, utilities) should continue using the useParams() hook as that is the correct pattern for non-route components.

Applied to files:

  • apps/web/core/lib/wrappers/store-wrapper.tsx
📚 Learning: 2025-03-11T19:42:41.769Z
Learnt from: janreges
Repo: makeplane/plane PR: 6743
File: packages/i18n/src/store/index.ts:160-161
Timestamp: 2025-03-11T19:42:41.769Z
Learning: In the Plane project, the file 'packages/i18n/src/store/index.ts' already includes support for Polish language translations with the case "pl".

Applied to files:

  • apps/web/core/lib/wrappers/store-wrapper.tsx
🧬 Code graph analysis (7)
packages/utils/src/theme-legacy.ts (1)
packages/utils/src/index.ts (1)
  • resolveGeneralTheme (31-31)
packages/utils/src/theme/theme-application.ts (5)
packages/utils/src/theme/index.ts (8)
  • applyCustomTheme (16-16)
  • generateThemePalettes (10-10)
  • hexToOKLCH (21-21)
  • invertPalette (36-36)
  • getNeutralMapping (36-36)
  • getBrandMapping (36-36)
  • oklchToCSS (25-25)
  • clearCustomTheme (16-16)
packages/utils/src/theme/palette-generator.ts (1)
  • generateThemePalettes (199-214)
packages/utils/src/theme/color-conversion.ts (2)
  • hexToOKLCH (34-47)
  • oklchToCSS (53-56)
packages/utils/src/theme/theme-inversion.ts (3)
  • invertPalette (17-34)
  • getNeutralMapping (51-68)
  • getBrandMapping (77-93)
packages/utils/src/theme/constants.ts (1)
  • ALPHA_MAPPING (9-22)
apps/web/app/(all)/profile/appearance/page.tsx (2)
packages/utils/src/theme/index.ts (2)
  • applyCustomTheme (16-16)
  • clearCustomTheme (16-16)
packages/utils/src/theme/theme-application.ts (2)
  • applyCustomTheme (20-68)
  • clearCustomTheme (74-112)
apps/web/ce/components/preferences/theme-switcher.tsx (2)
packages/utils/src/theme/theme-application.ts (2)
  • applyCustomTheme (20-68)
  • clearCustomTheme (74-112)
packages/types/src/users.ts (1)
  • IUserTheme (99-104)
apps/web/core/lib/wrappers/store-wrapper.tsx (1)
packages/utils/src/theme/theme-application.ts (2)
  • applyCustomTheme (20-68)
  • clearCustomTheme (74-112)
packages/utils/src/theme/color-validation.ts (1)
packages/utils/src/theme/index.ts (2)
  • validateHexColor (33-33)
  • normalizeHexColor (33-33)
apps/web/core/components/core/theme/custom-theme-selector.tsx (5)
packages/types/src/users.ts (1)
  • IUserTheme (99-104)
apps/space/core/hooks/store/use-user-profile.ts (1)
  • useUserProfile (7-11)
packages/utils/src/theme/theme-application.ts (1)
  • applyCustomTheme (20-68)
packages/propel/src/toast/toast.tsx (1)
  • setToast (245-265)
packages/ui/src/form-fields/input-color-picker.tsx (1)
  • InputColorPicker (22-105)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: CodeQL analysis (javascript-typescript)
  • GitHub Check: Agent
  • GitHub Check: Build packages
🔇 Additional comments (23)
apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/preferences/page.tsx (1)

13-37: LGTM! Clean observer pattern refactoring.

The refactoring from wrapping observer at export time to wrapping at declaration time is a cleaner pattern. This makes the component reference consistent throughout the file and follows modern React/MobX conventions.

Also applies to: 39-39

packages/tailwind-config/variables.css (1)

24-26: Excellent documentation improvements for the new theming system.

The added comments clearly explain the dynamic nature of the palette system, the derivation of alpha colors, and the role of the new anchor shades (neutral-0, brand-0). This documentation will help developers understand how custom themes interact with the CSS variables.

Also applies to: 28-28, 43-43, 238-239, 255-256, 270-272, 567-568, 584-585

apps/web/core/components/core/theme/theme-switch.tsx (1)

51-51: LGTM! Simple UI positioning improvement.

Adding the placement="bottom-end" prop improves the dropdown positioning to align with the updated theming UI flow.

packages/utils/src/index.ts (1)

31-31: LGTM! Correct public API export.

The export of resolveGeneralTheme from the theme-legacy module properly exposes the utility function as part of the public API.

apps/web/ce/components/preferences/theme-switcher.tsx (2)

69-75: Same darkPalette validation issue as above.

The same validation logic on lines 70-71 has the same potential edge case handling issue. If the suggestion above is applied, this location should be updated consistently.

Apply the same fix here:

-      if (theme?.theme === "custom") {
-        if (theme?.primary && theme?.background && theme?.darkPalette !== undefined) {
-          applyCustomTheme(theme.primary, theme.background, theme.darkPalette ? "dark" : "light");
-        }
+      if (theme?.theme === "custom") {
+        if (theme?.primary && theme?.background && typeof theme?.darkPalette === 'boolean') {
+          applyCustomTheme(theme.primary, theme.background, theme.darkPalette ? "dark" : "light");
+        }
       } else {

112-112: Minor cleanup: empty className removed.

Good cleanup removing the empty className="" attribute.

packages/utils/package.json (1)

28-28: The package versions are valid and active. chroma-js version 3.2.0 was published 11 days ago and is the latest, and @types/chroma-js version 3.1.2 was published 28 days ago. Both have no known vulnerabilities.

However, the suggestion to use catalog: is inconsistent with the workspace's existing patterns. While the workspace defines centralized versions in pnpm-workspace.yaml, it does not mandate catalog: usage—many external dependencies in the same file use explicit versions (e.g., clsx, date-fns, sanitize-html, @types/hast), and neither chroma-js nor @types/chroma-js are listed in the catalog. Using explicit versions for these packages is acceptable and consistent with the workspace's current approach.

Likely an incorrect or invalid review comment.

packages/utils/src/theme/theme-inversion.ts (1)

1-93: LGTM! Well-structured palette inversion and mapping utilities.

The inversion logic correctly swaps palette shades for dark mode, and the mapping functions provide clear transformations to CSS variable names. The implementation aligns well with the new OKLCH-based theming system.

packages/utils/src/theme/theme-application.ts (2)

20-68: LGTM! Robust theme application with proper validation.

The function correctly:

  • Validates inputs with early returns and warnings
  • Generates OKLCH palettes with proper mode handling
  • Inverts palettes for dark mode
  • Applies comprehensive CSS variable mappings
  • Handles text-on-color contrast

74-112: LGTM! Complete cleanup of custom theme variables.

The function properly removes all custom CSS variables that were set by applyCustomTheme, ensuring a clean state when switching away from custom themes.

packages/utils/src/theme/color-validation.ts (1)

1-91: LGTM! Comprehensive color validation and normalization.

The utilities provide:

  • Proper hex format validation (3 or 6 digits)
  • Safe 3-to-6 digit hex expansion
  • OKLCH bounds clamping with sensible defaults
  • Adaptive lightness adjustment for dark mode

The implementation handles edge cases well (extreme lightness, low chroma, hue normalization).

packages/utils/src/theme/index.ts (1)

1-53: LGTM! Well-organized public API surface.

The barrel export provides a clean, documented entry point for the theme system with logical grouping by functionality (palette generation, theme application, color conversion, validation, inversion, constants).

packages/utils/src/theme/color-conversion.ts (1)

1-138: LGTM! Comprehensive color conversion utilities with proper error handling.

The module provides complete conversion coverage:

  • OKLCH conversions for perceptual color space
  • Legacy RGB/hex support for backward compatibility
  • HSL conversions and grayscale detection
  • Safe defaults on error (mid-gray fallback)

chroma-js version 3.2.0 properly supports OKLCH color space conversions, making it an appropriate choice for these transformations.

apps/web/core/components/core/theme/custom-theme-selector.tsx (5)

1-13: LGTM!

The imports are well-structured and follow TypeScript best practices, including the use of import type for type-only imports.


15-17: LGTM!

The type definition properly enforces that the theme must be "custom" using an intersection type, providing good type safety for the parent component callback.


19-61: LGTM!

The component setup is well-structured with proper state management, refs, and form initialization. The getSavedTheme function provides sensible fallback defaults and the form is correctly initialized with these values.


63-98: LGTM!

The handleUpdateTheme function is well-implemented with:

  • Proper validation of required fields
  • Synchronous theme application followed by persistence
  • Good error handling with user feedback via toasts
  • Correct cleanup in the finally block

209-315: LGTM!

The component rendering is well-structured with:

  • Clear form layout and sections
  • Proper use of Controller for form fields
  • Good UX with color preview via inline styles
  • Accessible import/export controls
packages/utils/src/theme/palette-generator.ts (5)

1-19: LGTM!

The file header provides clear documentation about the module's purpose and approach. The imports are well-organized and properly typed.


60-85: LGTM!

The calculateDynamicValueStop function is well-implemented with clear logic to find the closest shade stop based on OKLCH lightness. The algorithm is straightforward and well-documented.


87-94: LGTM!

The type guard is properly implemented using TypeScript's type predicate syntax, enabling correct type narrowing.


96-188: LGTM!

The generateColorPalette function is well-implemented with:

  • Proper input validation and normalization
  • Dynamic anchor stop calculation with manual override support
  • Clean interpolation logic for smooth color gradients
  • Correct OKLCH color space operations with clamping
  • Comprehensive error handling

190-214: LGTM!

The generateThemePalettes function provides a clean convenience API for the common use case of generating both brand and neutral palettes. The implementation is straightforward and well-documented.

Comment on lines +75 to +83
if (theme?.theme === "custom") {
// New 2-color palette system loaded from profile
if (theme?.primary && theme?.background && theme?.darkPalette !== undefined) {
applyCustomTheme(theme.primary, theme.background, theme.darkPalette ? "dark" : "light");
}
} else {
// Clear custom theme when switching away
clearCustomTheme();
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Same type handling issue in applyThemeChange.

Line 78 has the same darkPalette type handling concern as the previous comment.

Apply the same fix here:

  if (theme?.theme === "custom") {
    // New 2-color palette system loaded from profile
    if (theme?.primary && theme?.background && theme?.darkPalette !== undefined) {
-     applyCustomTheme(theme.primary, theme.background, theme.darkPalette ? "dark" : "light");
+     const mode = typeof theme.darkPalette === "boolean"
+       ? (theme.darkPalette ? "dark" : "light")
+       : "light"; // or parse string if needed
+     applyCustomTheme(theme.primary, theme.background, mode);
    }
  } else {
    // Clear custom theme when switching away
    clearCustomTheme();
  }
🤖 Prompt for AI Agents
apps/web/app/(all)/profile/appearance/page.tsx around lines 75 to 83: the code
uses theme.darkPalette in a ternary without normalizing its type (same issue as
prior comment); coerce the value to a boolean before deciding the palette string
— e.g. use Boolean(theme.darkPalette) or a strict comparison (theme.darkPalette
=== true) in the ternary so applyCustomTheme receives either "dark" or "light"
deterministically, and ensure the null/undefined path remains guarded by the
existing checks.

Comment on lines +46 to +61
// Load custom theme from profile when theme is custom
useEffect(() => {
const loadCustomTheme = () => {
if (currentTheme?.value === "custom" && userProfile?.theme) {
try {
const theme = userProfile.theme;
if (theme.primary && theme.background && theme.darkPalette !== undefined) {
applyCustomTheme(theme.primary, theme.background, theme.darkPalette ? "dark" : "light");
}
} catch (error) {
console.error("Failed to load custom theme from profile:", error);
}
}
};
loadCustomTheme();
}, [currentTheme, userProfile?.theme]);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find the theme-switcher.tsx file
find . -name "theme-switcher.tsx" -type f 2>/dev/null | head -5

# Also search for darkPalette type definitions and usage
rg -l "darkPalette" --type=ts --type=tsx 2>/dev/null | head -10

Repository: makeplane/plane

Length of output: 114


🏁 Script executed:

#!/bin/bash
# Read the theme-switcher.tsx file
cat -n ./apps/web/ce/components/preferences/theme-switcher.tsx

# Also search for the theme type/interface definition
rg -n "type.*theme|interface.*theme|darkPalette" --type=ts --type=tsx -A 3 -B 1 ./apps/web/ce/components/preferences/ 2>/dev/null | head -50

Repository: makeplane/plane

Length of output: 4633


🏁 Script executed:

#!/bin/bash
# Search for applyCustomTheme function definition and userProfile theme type
rg -n "applyCustomTheme|userProfile.*theme|darkPalette.*:" --type=ts --type=tsx -A 2 -B 2 2>/dev/null | head -80

Repository: makeplane/plane

Length of output: 41


🏁 Script executed:

#!/bin/bash
# Search for IUserTheme type definition
rg -n "interface IUserTheme|type IUserTheme" --type=ts --type=tsx -A 10 2>/dev/null | head -40

# Also search in types directory
find . -path "*/types*" -name "*.ts" -o -name "*.tsx" | xargs rg "IUserTheme" -A 10 2>/dev/null | head -50

Repository: makeplane/plane

Length of output: 4686


🏁 Script executed:

#!/bin/bash
# Search for darkPalette property definition across the codebase
rg "darkPalette\s*[?:]" --type=ts --type=tsx -B 2 -A 2 2>/dev/null | head -60

Repository: makeplane/plane

Length of output: 41


🏁 Script executed:

#!/bin/bash
# Search in plane/types package for IUserTheme definition
find . -path "*/@plane/types*" -name "*.ts" 2>/dev/null | xargs rg -l "IUserTheme" 2>/dev/null | head -5

# Also try searching more broadly
rg "export.*interface IUserTheme|export.*type IUserTheme" --type=ts --type=tsx -A 15 2>/dev/null | head -80

Repository: makeplane/plane

Length of output: 291


🏁 Script executed:

#!/bin/bash
# Read the IUserTheme type definition
cat -n packages/types/src/users.ts | head -200

Repository: makeplane/plane

Length of output: 6312


Handle darkPalette type cases properly — string type requires different validation

The type definition shows darkPalette?: string | boolean | undefined, where strings represent serialized JSON palettes and booleans are legacy values. The current check (theme.darkPalette !== undefined) combined with truthiness coercion (theme.darkPalette ? "dark" : "light") doesn't properly distinguish between these cases. An empty string passes validation but becomes "light"; a JSON string (truthy) becomes "dark". The suggested fix to use typeof theme.darkPalette === 'boolean' would incorrectly reject valid string values. Instead, explicitly handle both types: if strings should represent parsed palette data rather than a mode, validate and parse them. If they should simply coerce to mode via truthiness, document this behavior. At minimum, clarify whether empty strings are valid or should be rejected during theme serialization.

🤖 Prompt for AI Agents
In apps/web/ce/components/preferences/theme-switcher.tsx around lines 46 to 61,
the current logic treats theme.darkPalette with a loose undefined/truthy check
which mis-handles the union type string | boolean | undefined; change the branch
to explicitly handle types: if typeof theme.darkPalette === "boolean" use it to
decide "dark" vs "light"; else if typeof theme.darkPalette === "string" validate
that the string is non-empty and parse it or extract its intended mode (or
reject/skip if it’s an empty string), and only then call applyCustomTheme with
the correct mode; update the dependency/validation check to ensure empty strings
are rejected and add a try/catch around JSON.parse for string cases to log and
skip invalid serialized palettes.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces a comprehensive enhancement to the custom theming system, migrating from a legacy 5-color RGB-based system to a modern 2-color OKLCH-based palette generator. The new system uses chroma-js for perceptually uniform color generation, creating 14-shade palettes from brand and neutral colors with proper dark mode support.

Key Changes

  • New theme architecture: Implemented a modular theme system with OKLCH color space support, replacing the old RGB-based approach
  • Simplified theme configuration: Reduced from 5 colors (background, text, primary, sidebarBg, sidebarText) to 2 colors (brand, neutral) with automatic palette generation
  • Enhanced UI: Added theme import/export functionality, dark/light mode toggle, and improved color picker UX

Reviewed changes

Copilot reviewed 21 out of 22 changed files in this pull request and generated 19 comments.

Show a summary per file
File Description
pnpm-lock.yaml Added chroma-js@3.2.0 and @types/chroma-js@3.1.2 dependencies; downgraded CSS tools packages
packages/utils/src/theme/color-conversion.ts New utility for hex/OKLCH conversions using chroma-js
packages/utils/src/theme/palette-generator.ts Core 14-shade palette generator with OKLCH color space support
packages/utils/src/theme/theme-inversion.ts Dark mode palette inversion and CSS variable mapping
packages/utils/src/theme/theme-application.ts Applies generated palettes to CSS variables
packages/utils/src/theme/constants.ts Configuration constants for shade stops and lightness maps
packages/utils/src/theme/color-validation.ts Input validation and color adjustment utilities
packages/utils/src/theme/index.ts Public API exports for theme system
packages/utils/src/theme.ts Deleted - old 5-color theme system
packages/utils/src/theme-legacy.ts New file preserving resolveGeneralTheme for backward compatibility
packages/utils/src/index.ts Updated to export from new theme system
packages/utils/package.json Added chroma-js dependencies
packages/types/src/users.ts Simplified IUserTheme interface to 2-color system
packages/tailwind-config/variables.css Added CSS variable comments documenting dynamic theme generation
apps/web/core/components/core/theme/custom-theme-selector.tsx Major refactor with new 2-color system, import/export, and theme mode toggle
apps/web/core/components/core/theme/theme-switch.tsx Added placement prop to dropdown
apps/web/core/lib/wrappers/store-wrapper.tsx Updated to use new theme application functions
apps/web/ce/components/preferences/theme-switcher.tsx Migrated to new theme system
apps/web/app/(all)/profile/appearance/page.tsx Updated theme application logic
apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/preferences/page.tsx Wrapped component with observer
apps/web/core/store/user/profile.store.ts Removed obsolete theme fields from store
apps/space/core/store/profile.store.ts Removed obsolete theme fields from store
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

const handleUploadConfig = async (event: React.ChangeEvent<HTMLInputElement>) => {
const file = event.target.files?.[0];
if (!file) return;

Copy link

Copilot AI Dec 16, 2025

Choose a reason for hiding this comment

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

The file upload handler doesn't validate the file size or type beyond checking for .json extension. A malicious user could upload a very large JSON file that could cause memory issues when parsed. Consider adding file size validation (e.g., max 1MB) before calling file.text() to prevent potential DoS attacks.

Suggested change
// Validate file size (max 1MB)
const MAX_SIZE = 1048576; // 1MB in bytes
if (file.size > MAX_SIZE) {
setToast({
type: TOAST_TYPE.ERROR,
title: t("error"),
message: "File is too large. Maximum allowed size is 1MB.",
});
// Reset file input
if (fileInputRef.current) {
fileInputRef.current.value = "";
}
return;
}

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Copy Markdown
Contributor

@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: 0

♻️ Duplicate comments (6)
apps/web/core/components/core/theme/custom-theme-selector.tsx (6)

100-106: Remove misleading comment.

The comment on line 105 references a useEffect that handles preview updates with debouncing, but no such useEffect exists in this component.

   const handleValueChange = (val: string | undefined, onChange: (...args: unknown[]) => void) => {
     let hex = val;
     // prepend a hashtag if it doesn't exist
     if (val && val[0] !== "#") hex = `#${val}`;
     onChange(hex);
-    // useEffect will handle preview update with debouncing
   };

129-141: Internationalize toast messages.

Hard-coded English strings should use the t() translation function for consistency with the rest of the component.

       setToast({
         type: TOAST_TYPE.SUCCESS,
         title: t("success"),
-        message: "Theme configuration downloaded successfully.",
+        message: t("theme_configuration_downloaded_successfully"),
       });
     } catch (error) {
       console.error("Failed to download config:", error);
       setToast({
         type: TOAST_TYPE.ERROR,
         title: t("error"),
-        message: "Failed to download theme configuration.",
+        message: t("failed_to_download_theme_configuration"),
       });
     }

189-200: Internationalize toast messages.

Hard-coded English strings in import success/error toasts should use t() for consistency.

       setToast({
         type: TOAST_TYPE.SUCCESS,
         title: t("success"),
-        message: "Theme configuration imported successfully",
+        message: t("theme_configuration_imported_successfully"),
       });
     } catch (error) {
       console.error("Failed to upload config:", error);
       setToast({
         type: TOAST_TYPE.ERROR,
         title: t("error"),
-        message: error instanceof Error ? error.message : "Failed to import theme configuration",
+        message: error instanceof Error ? error.message : t("failed_to_import_theme_configuration"),
       });
     }

301-311: Internationalize button labels.

Button labels "Upload config", "Download config", and "Generating..." should use t().

           <Button variant="secondary" type="button" onClick={() => fileInputRef.current?.click()} size="sm">
-            Upload config
+            {t("upload_config")}
           </Button>
           <Button variant="secondary" type="button" onClick={handleDownloadConfig} size="sm">
-            Download config
+            {t("download_config")}
           </Button>
         </div>

         {/* Save Theme Button */}
         <Button variant="primary" type="submit" loading={isSubmitting || isLoadingPalette}>
-          {isSubmitting ? t("creating_theme") : isLoadingPalette ? "Generating..." : t("set_theme")}
+          {isSubmitting ? t("creating_theme") : isLoadingPalette ? t("generating") : t("set_theme")}
         </Button>

144-147: Add file size validation before parsing.

Large JSON files could cause memory issues. Validate file size before calling file.text().

   const handleUploadConfig = async (event: React.ChangeEvent<HTMLInputElement>) => {
     const file = event.target.files?.[0];
     if (!file) return;

+    // Validate file size (max 1MB)
+    const MAX_FILE_SIZE = 1024 * 1024; // 1MB
+    if (file.size > MAX_FILE_SIZE) {
+      setToast({
+        type: TOAST_TYPE.ERROR,
+        title: t("error"),
+        message: t("file_too_large"),
+      });
+      return;
+    }
+
     try {
       const text = await file.text();

166-170: Fix inconsistent validation error message.

The validation checks that themeMode is a boolean, but the error message suggests string values 'light' or 'dark'.

       // Validate theme mode
       const themeMode = config.darkPalette ?? false;
       if (typeof themeMode !== "boolean") {
-        throw new Error("Invalid theme mode. Must be 'light' or 'dark'");
+        throw new Error("Invalid theme mode. Must be a boolean value");
       }
🧹 Nitpick comments (5)
apps/web/core/components/core/theme/custom-theme-selector.tsx (5)

219-219: Internationalize label text.

The label "Brand Color" should use the t() translation function.

-              <h3 className="text-left text-13 font-medium text-secondary">Brand Color</h3>
+              <h3 className="text-left text-13 font-medium text-secondary">{t("brand_color")}</h3>

224-230: Internationalize validation messages.

Validation error messages should use t() for internationalization consistency.

                   rules={{
-                    required: "Brand color is required",
+                    required: t("brand_color_is_required"),
                     pattern: {
                       value: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,
-                      message: "Enter a valid hex code",
+                      message: t("enter_a_valid_hex_code"),
                     },
                   }}

251-251: Internationalize label text.

The label "Neutral Color" should use the t() translation function.

-              <h3 className="text-left text-13 font-medium text-secondary">Neutral Color</h3>
+              <h3 className="text-left text-13 font-medium text-secondary">{t("neutral_color")}</h3>

256-262: Internationalize validation messages.

Same i18n issue as the Brand Color field.

                   rules={{
-                    required: "Neutral color is required",
+                    required: t("neutral_color_is_required"),
                     pattern: {
                       value: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,
-                      message: "Enter a valid hex code",
+                      message: t("enter_a_valid_hex_code"),
                     },
                   }}

285-292: Internationalize labels and mode text.

Hard-coded strings "Theme Mode", "Dark mode", and "Light mode" should use translation functions. The darkPalette toggle correctly passes a boolean now.

           <div className="flex flex-col items-start gap-2">
-            <h3 className="text-left text-13 font-medium text-secondary">Theme Mode</h3>
+            <h3 className="text-left text-13 font-medium text-secondary">{t("theme_mode")}</h3>
             <Controller
               control={control}
               name="darkPalette"
               render={({ field: { value, onChange } }) => (
                 <ToggleSwitch value={!!value} onChange={onChange} size="sm" />
               )}
             />
-            <span className="text-12 text-tertiary">{watch("darkPalette") ? "Dark mode" : "Light mode"}</span>
+            <span className="text-12 text-tertiary">{watch("darkPalette") ? t("dark_mode") : t("light_mode")}</span>
           </div>
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5131dde and df63395.

📒 Files selected for processing (1)
  • apps/web/core/components/core/theme/custom-theme-selector.tsx (2 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Enable TypeScript strict mode and ensure all files are fully typed

Files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
**/*.{js,jsx,ts,tsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Prettier with Tailwind plugin for code formatting, run pnpm fix:format

Files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use ESLint with shared config across packages, adhering to max warnings limits per package
Use camelCase for variable and function names, PascalCase for components and types
Use try-catch with proper error types and log errors appropriately

Files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
🧠 Learnings (5)
📓 Common learnings
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use semantic text colors: `text-primary` for main text and headings, `text-secondary` for descriptions, `text-tertiary` for labels and metadata, `text-placeholder` for placeholder text
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use `-active` state variants for elements in pressed/active states and `-selected` state variants only when actual selection logic exists

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Hover states must always match the base background layer: use `bg-layer-X hover:bg-layer-X-hover` pattern, never mix hover states between different layers

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : In rare cases, form elements (inputs, buttons, switches) in modals or surfaces may use one layer level above for visual separation (e.g., `bg-layer-2` with `bg-surface-1`), but this should not be used for content boxes or cards

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use semantic text colors: `text-primary` for main text and headings, `text-secondary` for descriptions, `text-tertiary` for labels and metadata, `text-placeholder` for placeholder text

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Build packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (3)
apps/web/core/components/core/theme/custom-theme-selector.tsx (3)

1-17: LGTM!

Imports are well-organized and the type definition for TCustomThemeSelector clearly specifies the expected callback signature.


31-61: LGTM!

The getSavedTheme function properly loads saved theme from user profile with sensible fallback defaults. Form initialization is correct.


63-98: LGTM!

The theme update flow is well-structured with proper error handling, loading state management, and internationalized toast messages.

Copy link
Copy Markdown
Contributor

@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: 0

♻️ Duplicate comments (5)
packages/utils/src/theme/theme-inversion.ts (2)

36-50: Clarify that shade numbers refer to CSS variables, not palette stops.

The comment mentions "darker shades for text (900, 950, 1000)" but the CSS variable mapping uses different keys (1000, 1100, 1200) that source from those palette stops. This distinction could be clearer.


9-16: Documentation references non-existent shade 1250.

The comment says "Maps each shade to its opposite (50↔1250, 100↔1200, 200↔1100, etc.)" but the ColorPalette type and SHADE_STOPS only include values up to 1000. The actual implementation maps 50↔1000, 100↔950, etc.

 /**
  * Invert a color palette for dark mode
- * Maps each shade to its opposite (50↔1250, 100↔1200, 200↔1100, etc.)
+ * Maps each shade to its opposite (50↔1000, 100↔950, 200↔900, etc.)
  * Shades around the middle are preserved for smooth transitions
  *
  * @param palette - 14-shade color palette to invert
  * @returns Inverted palette with swapped shades
  */
packages/utils/src/theme/theme-application.ts (2)

55-58: Both alpha-white and alpha-black use the same base color.

Both CSS variables are set using neutralOKLCH, which means they will produce identical colors at the same alpha level. alpha-white should use white (l: 1, c: 0, h: 0) and alpha-black should use black (l: 0, c: 0, h: 0).

  Object.entries(ALPHA_MAPPING).forEach(([key, value]) => {
-   themeElement.style.setProperty(`--color-alpha-white-${key}`, oklchToCSS(neutralOKLCH, value * 100));
-   themeElement.style.setProperty(`--color-alpha-black-${key}`, oklchToCSS(neutralOKLCH, value * 100));
+   themeElement.style.setProperty(`--color-alpha-white-${key}`, oklchToCSS({ l: 1, c: 0, h: 0 }, value * 100));
+   themeElement.style.setProperty(`--color-alpha-black-${key}`, oklchToCSS({ l: 0, c: 0, h: 0 }, value * 100));
  });

63-67: Icon color logic is inverted relative to text color.

When the brand color is dark, both text and icons should be white for proper contrast. Currently, --text-color-icon-on-color is set to black when the brand is dark, which would result in poor visibility.

  themeElement.style.setProperty(`--text-color-on-color`, oklchToCSS(isBrandColorDark ? whiteInOKLCH : blackInOKLCH));
  themeElement.style.setProperty(
    `--text-color-icon-on-color`,
-   oklchToCSS(isBrandColorDark ? blackInOKLCH : whiteInOKLCH)
+   oklchToCSS(isBrandColorDark ? whiteInOKLCH : blackInOKLCH)
  );
apps/web/core/lib/wrappers/store-wrapper.tsx (1)

50-57: Verify type handling for darkPalette.

If theme.darkPalette can be string | boolean | undefined, the truthy check on line 53 may not behave correctly for string values (e.g., "false" would be truthy). Consider explicit type handling.

      if (currentTheme === "custom") {
        // New 2-color palette system
        if (theme.primary && theme.background && theme.darkPalette !== undefined) {
-         applyCustomTheme(theme.primary, theme.background, theme.darkPalette ? "dark" : "light");
+         const mode = theme.darkPalette === true || theme.darkPalette === "dark" ? "dark" : "light";
+         applyCustomTheme(theme.primary, theme.background, mode);
        }
      } else {
        clearCustomTheme();
      }
🧹 Nitpick comments (5)
apps/web/core/store/user/profile.store.ts (1)

218-221: Inconsistent variable naming between success and rollback paths.

The success path uses dataKey while the rollback logic (lines 229-232) still uses userKey. For consistency, consider using the same variable name in both paths.

Apply this diff to align the variable naming:

     } catch (error) {
       runInAction(() => {
-        Object.keys(data).forEach((key: string) => {
-          const userKey: keyof IUserTheme = key as keyof IUserTheme;
-          if (currentProfileTheme) set(this.data.theme, userKey, currentProfileTheme[userKey]);
+        Object.keys(data).forEach((key) => {
+          const dataKey = key as keyof IUserTheme;
+          if (currentProfileTheme) set(this.data.theme, dataKey, currentProfileTheme[dataKey]);
         });
apps/web/core/components/core/theme/custom-theme-selector.tsx (1)

209-234: Consider displaying validation errors dynamically.

The hasError prop is hard-coded to false, which means validation errors won't be visually indicated on the input. Consider connecting it to the form state:

  <InputColorPicker
    name="primary"
    value={value}
    onChange={(val) => handleValueChange(val, onChange)}
    placeholder="#3f76ff"
    className="w-full placeholder:text-placeholder/60"
    style={{
      backgroundColor: value,
      color: "#ffffff",
    }}
-   hasError={false}
+   hasError={!!formState.errors.primary}
  />

Apply the same pattern to the background color picker at line 262.

apps/web/app/(all)/profile/appearance/page.tsx (1)

32-49: Add setTheme to the dependency array.

The setTheme function from next-themes is called inside the callback but not included in the dependency array. While it's likely stable, following the exhaustive-deps rule ensures correctness.

    },
-   [updateUserTheme]
+   [setTheme, updateUserTheme]
  );
apps/web/ce/components/preferences/theme-switcher.tsx (1)

36-57: Add setTheme to the dependency array.

The setTheme function is used inside the callback but missing from the dependency array. Include it for completeness:

    },
-   [updateUserTheme]
+   [setTheme, updateUserTheme]
  );
packages/utils/src/theme/theme-application.ts (1)

78-103: Consider extracting CSS variable keys to constants for consistency.

The neutralKeys and brandKeys arrays duplicate information that could be derived from the mapping functions or centralized in constants.ts. This would prevent drift between apply and clear operations.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between df63395 and dd95904.

📒 Files selected for processing (12)
  • apps/web/app/(all)/profile/appearance/page.tsx (3 hunks)
  • apps/web/ce/components/preferences/theme-switcher.tsx (4 hunks)
  • apps/web/core/components/core/theme/custom-theme-selector.tsx (2 hunks)
  • apps/web/core/components/core/theme/theme-switch.tsx (2 hunks)
  • apps/web/core/lib/wrappers/store-wrapper.tsx (4 hunks)
  • apps/web/core/store/user/profile.store.ts (2 hunks)
  • packages/tailwind-config/variables.css (4 hunks)
  • packages/types/src/users.ts (1 hunks)
  • packages/utils/src/theme/constants.ts (1 hunks)
  • packages/utils/src/theme/palette-generator.ts (1 hunks)
  • packages/utils/src/theme/theme-application.ts (1 hunks)
  • packages/utils/src/theme/theme-inversion.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/web/core/components/core/theme/theme-switch.tsx
  • packages/utils/src/theme/palette-generator.ts
  • packages/types/src/users.ts
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • apps/web/core/store/user/profile.store.ts
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • packages/utils/src/theme/theme-application.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/utils/src/theme/theme-inversion.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Enable TypeScript strict mode and ensure all files are fully typed

Files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • apps/web/core/store/user/profile.store.ts
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • packages/utils/src/theme/theme-application.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/utils/src/theme/theme-inversion.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
**/*.{js,jsx,ts,tsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Prettier with Tailwind plugin for code formatting, run pnpm fix:format

Files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • apps/web/core/store/user/profile.store.ts
  • packages/tailwind-config/variables.css
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • packages/utils/src/theme/theme-application.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/utils/src/theme/theme-inversion.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use ESLint with shared config across packages, adhering to max warnings limits per package
Use camelCase for variable and function names, PascalCase for components and types
Use try-catch with proper error types and log errors appropriately

Files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • apps/web/core/store/user/profile.store.ts
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • packages/utils/src/theme/theme-application.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/utils/src/theme/theme-inversion.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
🧠 Learnings (19)
📚 Learning: 2025-10-21T17:22:05.204Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7989
File: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx:45-46
Timestamp: 2025-10-21T17:22:05.204Z
Learning: In the makeplane/plane repository, the refactor from useParams() to params prop is specifically scoped to page.tsx and layout.tsx files in apps/web/app (Next.js App Router pattern). Other components (hooks, regular client components, utilities) should continue using the useParams() hook as that is the correct pattern for non-route components.

Applied to files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • apps/web/core/lib/wrappers/store-wrapper.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use semantic text colors: `text-primary` for main text and headings, `text-secondary` for descriptions, `text-tertiary` for labels and metadata, `text-placeholder` for placeholder text

Applied to files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • packages/tailwind-config/variables.css
  • apps/web/ce/components/preferences/theme-switcher.tsx
  • packages/utils/src/theme/theme-application.ts
  • packages/utils/src/theme/constants.ts
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/utils/src/theme/theme-inversion.ts
  • apps/web/core/lib/wrappers/store-wrapper.tsx
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • apps/web/ce/components/preferences/theme-switcher.tsx
📚 Learning: 2025-10-09T20:43:07.762Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/core/components/new-user-popup.tsx:4-6
Timestamp: 2025-10-09T20:43:07.762Z
Learning: The `next-themes` library is React-compatible and can be used outside of Next.js applications. It's not Next.js-specific despite its name.

Applied to files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • apps/web/ce/components/preferences/theme-switcher.tsx
📚 Learning: 2025-10-01T15:30:17.605Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7888
File: packages/propel/src/avatar/avatar.stories.tsx:2-3
Timestamp: 2025-10-01T15:30:17.605Z
Learning: In the makeplane/plane repository, avoid suggesting inline type imports (e.g., `import { Avatar, type TAvatarSize }`) due to bundler compatibility issues. Keep type imports and value imports as separate statements.

Applied to files:

  • apps/web/app/(all)/profile/appearance/page.tsx
  • apps/web/ce/components/preferences/theme-switcher.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use semantic border colors: `border-subtle` for subtle borders and dividers, `border-subtle-1` for slightly more visible borders, `border-strong` for emphasis, `border-strong-1` for very strong borders

Applied to files:

  • packages/tailwind-config/variables.css
  • packages/utils/src/theme/theme-application.ts
  • packages/utils/src/theme/constants.ts
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : In rare cases, form elements (inputs, buttons, switches) in modals or surfaces may use one layer level above for visual separation (e.g., `bg-layer-2` with `bg-surface-1`), but this should not be used for content boxes or cards

Applied to files:

  • packages/tailwind-config/variables.css
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use `-active` state variants for elements in pressed/active states and `-selected` state variants only when actual selection logic exists

Applied to files:

  • packages/tailwind-config/variables.css
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Do not use Canvas (`bg-canvas`) for page-level backgrounds, nested containers, cards, modals, dropdowns, sidebars, panels, or anywhere other than the application root

Applied to files:

  • packages/tailwind-config/variables.css
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Avoid `enum`s if the project prefers erasable syntax, using `const` objects or unions instead (TypeScript 5.8+)

Applied to files:

  • apps/web/ce/components/preferences/theme-switcher.tsx
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Rely on narrowing from direct boolean comparisons for type guards

Applied to files:

  • apps/web/ce/components/preferences/theme-switcher.tsx
  • apps/web/core/lib/wrappers/store-wrapper.tsx
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Leverage inferred type predicates to reduce the need for explicit `is` return types in filter/check functions

Applied to files:

  • apps/web/ce/components/preferences/theme-switcher.tsx
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `with { type: "json" }` for import attributes; avoid deprecated `assert` syntax (TypeScript 5.3/5.8+)

Applied to files:

  • apps/web/ce/components/preferences/theme-switcher.tsx
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Ensure variables are initialized before use to avoid errors with never-initialized variables (TypeScript 5.7+)

Applied to files:

  • apps/web/ce/components/preferences/theme-switcher.tsx
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Utilize narrowing in `switch(true)` blocks for control flow analysis (TypeScript 5.3+)

Applied to files:

  • apps/web/ce/components/preferences/theme-switcher.tsx
📚 Learning: 2025-06-04T16:22:44.344Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7164
File: packages/ui/.storybook/main.ts:24-47
Timestamp: 2025-06-04T16:22:44.344Z
Learning: In packages/ui/.storybook/main.ts, the webpackFinal function intentionally overrides the CSS loader strategy by finding and replacing existing CSS rules. This is a temporary workaround for a known upstream issue in Storybook's CSS handling that has been communicated to the Storybook maintainers. The current implementation should not be changed until the upstream issue is resolved.

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • apps/web/core/lib/wrappers/store-wrapper.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Hover states must always match the base background layer: use `bg-layer-X hover:bg-layer-X-hover` pattern, never mix hover states between different layers

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:36.519Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:36.519Z
Learning: Applies to packages/shared-state/**/*.{ts,tsx} : Maintain MobX stores in `packages/shared-state` using reactive patterns

Applied to files:

  • apps/web/core/lib/wrappers/store-wrapper.tsx
📚 Learning: 2025-03-11T19:42:41.769Z
Learnt from: janreges
Repo: makeplane/plane PR: 6743
File: packages/i18n/src/store/index.ts:160-161
Timestamp: 2025-03-11T19:42:41.769Z
Learning: In the Plane project, the file 'packages/i18n/src/store/index.ts' already includes support for Polish language translations with the case "pl".

Applied to files:

  • apps/web/core/lib/wrappers/store-wrapper.tsx
🧬 Code graph analysis (6)
apps/web/app/(all)/profile/appearance/page.tsx (7)
apps/space/core/hooks/store/use-user-profile.ts (1)
  • useUserProfile (7-11)
apps/admin/core/hooks/store/use-theme.tsx (1)
  • useTheme (6-10)
packages/i18n/src/hooks/use-translation.ts (1)
  • useTranslation (23-35)
packages/constants/src/themes.ts (2)
  • THEME_OPTIONS (15-82)
  • I_THEME_OPTION (3-13)
packages/i18n/src/store/index.ts (1)
  • t (222-243)
packages/propel/src/toast/toast.tsx (1)
  • setPromiseToast (284-314)
apps/web/core/components/core/theme/custom-theme-selector.tsx (1)
  • CustomThemeSelector (13-304)
apps/web/core/store/user/profile.store.ts (1)
packages/types/src/users.ts (1)
  • IUserTheme (99-104)
apps/web/ce/components/preferences/theme-switcher.tsx (7)
apps/space/core/hooks/store/use-user-profile.ts (1)
  • useUserProfile (7-11)
apps/admin/core/hooks/store/use-theme.tsx (1)
  • useTheme (6-10)
packages/i18n/src/hooks/use-translation.ts (1)
  • useTranslation (23-35)
packages/constants/src/themes.ts (2)
  • THEME_OPTIONS (15-82)
  • I_THEME_OPTION (3-13)
packages/i18n/src/store/index.ts (1)
  • t (222-243)
apps/web/core/components/core/theme/theme-switch.tsx (1)
  • ThemeSwitch (15-85)
apps/web/core/components/core/theme/custom-theme-selector.tsx (1)
  • CustomThemeSelector (13-304)
packages/utils/src/theme/constants.ts (1)
packages/utils/src/theme/index.ts (13)
  • SHADE_STOPS (52-52)
  • DEFAULT_VALUE_STOP (50-50)
  • BASELINE_LIGHTNESS_MAP (40-40)
  • DEFAULT_HUE_SHIFT_BRAND (43-43)
  • DEFAULT_HUE_SHIFT_NEUTRAL (44-44)
  • DEFAULT_LIGHT_MODE_LIGHTNESS_MIN (46-46)
  • DEFAULT_LIGHT_MODE_LIGHTNESS_MAX (45-45)
  • DEFAULT_DARK_MODE_LIGHTNESS_MIN (48-48)
  • DEFAULT_DARK_MODE_LIGHTNESS_MAX (47-47)
  • ColorMode (41-41)
  • DEFAULT_COLOR_MODE (42-42)
  • SaturationCurve (51-51)
  • DEFAULT_SATURATION_CURVE (49-49)
apps/web/core/components/core/theme/custom-theme-selector.tsx (6)
apps/space/core/hooks/store/use-user-profile.ts (1)
  • useUserProfile (7-11)
packages/i18n/src/hooks/use-translation.ts (1)
  • useTranslation (23-35)
packages/types/src/users.ts (1)
  • IUserTheme (99-104)
packages/propel/src/toast/toast.tsx (1)
  • setToast (245-265)
packages/ui/src/form-fields/input-color-picker.tsx (1)
  • InputColorPicker (22-105)
packages/ui/src/button/toggle-switch.tsx (1)
  • ToggleSwitch (56-56)
apps/web/core/lib/wrappers/store-wrapper.tsx (1)
packages/utils/src/theme/theme-application.ts (2)
  • applyCustomTheme (20-68)
  • clearCustomTheme (74-112)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Build packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (20)
packages/tailwind-config/variables.css (1)

234-234: LGTM! Consistent addition of shade-0 tokens for the new palette system.

The addition of --color-neutral-0 and --color-brand-0 in both light and dark modes is well-implemented:

  • Light mode uses pure white (oklch(1 0 0)) for the lightest shade
  • Dark mode uses the darkest value (oklch(0.1689 0.0021 286.18)) to maintain palette inversion
  • Placement at the top of each color block is logical for a "0" shade
  • Values are properly formatted in OKLCH color space

This aligns with the PR's goal of implementing a 14-stop palette system for enhanced custom theming.

Also applies to: 251-251, 559-559, 576-576

apps/web/core/store/user/profile.store.ts (2)

214-226: LGTM! Clean refactoring of the theme update logic.

The updateUserTheme method correctly maintains optimistic updates with rollback on error. The variable renaming improves code clarity, and the API call properly passes the updated theme object.


41-41: Verify the impact of initializing darkPalette to false instead of undefined.

The codebase contains explicit checks for darkPalette !== undefined in custom-theme-selector.tsx and store-wrapper.tsx. With this initialization change, the custom theme application logic in store-wrapper.tsx will now execute on store initialization (applying light mode by default), whereas previously it would have been skipped when darkPalette was undefined. Ensure this behavioral change is intentional and doesn't cause unintended theme application during startup.

apps/web/core/components/core/theme/custom-theme-selector.tsx (5)

1-23: LGTM! Component refactored to be self-contained.

The component has been properly refactored to manage its own state and no longer depends on external props. The addition of loading state and file input ref supports the new import/export functionality.


26-45: LGTM! Safe theme initialization with proper fallbacks.

The function correctly derives initial form values from the user profile with sensible defaults when theme data is incomplete.


58-87: LGTM! Proper async theme update handling.

The function correctly validates required fields, manages loading state, and provides appropriate user feedback through toasts. Error handling is in place with proper logging.


132-195: LGTM! Comprehensive theme config import with validation.

The upload handler properly validates the config file structure, hex color formats, and theme mode type before applying the configuration. Error handling is in place with appropriate user feedback.


270-281: LGTM! Theme mode toggle correctly handles boolean values.

The toggle switch now properly handles boolean values, and the conditional label provides clear feedback to the user.

apps/web/app/(all)/profile/appearance/page.tsx (2)

1-30: LGTM! Clean refactor to derived state.

The component now correctly derives currentTheme from the user profile using useMemo, eliminating the need for local state management and synchronization effects.


51-75: LGTM! Simplified theme management flow.

The component correctly renders the theme switcher and conditionally shows the custom theme selector when needed. The removal of the applyThemeChange prop aligns with the refactored self-contained CustomThemeSelector.

apps/web/ce/components/preferences/theme-switcher.tsx (2)

1-34: LGTM! Consistent refactor to derived state.

The component follows the same clean pattern as the profile appearance page, deriving currentTheme from the user profile using useMemo.


59-74: LGTM! Clean preference section implementation.

The component properly wraps the theme controls in a preference section and conditionally shows the custom theme selector. The refactor aligns with the self-contained CustomThemeSelector pattern.

packages/utils/src/theme/theme-inversion.ts (1)

77-93: LGTM!

The getBrandMapping function correctly maps palette stops to CSS variable keys, and uses DEFAULT_VALUE_STOP for the default brand color reference.

apps/web/core/lib/wrappers/store-wrapper.tsx (2)

43-59: Theme effect structure looks correct.

The effect properly handles custom vs non-custom themes and the dependency on userProfile?.theme ensures re-application when any theme property changes.


19-19: LGTM!

The refactor to a function declaration with observer() wrapping at export is a valid MobX pattern.

Also applies to: 72-74

packages/utils/src/theme/constants.ts (4)

24-29: Documentation and implementation are now consistent.

The comment correctly states "50 = white, 1000 = black" and SHADE_STOPS includes exactly those values. Good alignment.


43-58: LGTM!

BASELINE_LIGHTNESS_MAP keys now align exactly with SHADE_STOPS, resolving the previously flagged inconsistency.


92-114: Well-structured type definitions and defaults.

The ColorMode and SaturationCurve types with their defaults are clearly documented. Using as const for SHADE_STOPS enables precise literal type inference.


6-22: LGTM!

ALPHA_MAPPING provides a clear mapping from shade keys to opacity values (5% to 95%) for generating alpha color variants.

packages/utils/src/theme/theme-application.ts (1)

20-35: No action required—hex validation already occurs upstream.

The generateThemePalettes function (called on line 33) already validates both hex colors using validateHexColor and throws an error if either is invalid. By the time hexToOKLCH is called on lines 34–35, the colors have already been validated. Additionally, hexToOKLCH includes error handling with a safe default fallback ({ l: 0.5, c: 0, h: 0 }), so invalid input cannot cause unexpected behavior.

Likely an incorrect or invalid review comment.

Copy link
Copy Markdown
Contributor

@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: 0

♻️ Duplicate comments (5)
apps/web/core/components/core/theme/custom-theme-selector.tsx (5)

121-121: Internationalize user-facing messages.

The success and error messages are hard-coded instead of using the t() translation function, inconsistent with other messages in the component.

Apply this pattern (as noted in past reviews):

-        message: "Theme configuration downloaded successfully.",
+        message: t("theme_configuration_downloaded"),
-        message: "Failed to download theme configuration.",
+        message: t("failed_to_download_theme_configuration"),

Also applies to: 128-128


136-139: Add file size validation for security.

The file upload handler doesn't validate file size before parsing, which could allow very large JSON files to cause memory issues.

As noted in past reviews, add file size validation (e.g., max 1MB) before calling file.text() to prevent potential DoS attacks.


181-181: Internationalize user-facing messages.

The success and error messages for theme import are hard-coded instead of using the t() translation function.

Apply this pattern (as noted in past reviews):

-        message: "Theme configuration imported successfully",
+        message: t("theme_configuration_imported"),
-        message: error instanceof Error ? error.message : "Failed to import theme configuration",
+        message: error instanceof Error ? error.message : t("failed_to_import_theme_configuration"),

Also applies to: 188-188


291-291: Internationalize button labels.

The button labels "Upload config" and "Download config" are hard-coded instead of using the t() translation function.

As noted in past reviews, apply this pattern:

-            Upload config
+            {t("upload_config")}
-            Download config
+            {t("download_config")}

Also applies to: 294-294


300-300: Internationalize loading text.

The "Generating..." text is hard-coded instead of using the t() translation function.

As noted in past reviews:

-          {isSubmitting ? t("creating_theme") : isLoadingPalette ? "Generating..." : t("set_theme")}
+          {isSubmitting ? t("creating_theme") : isLoadingPalette ? t("generating") : t("set_theme")}
🧹 Nitpick comments (2)
apps/web/core/components/core/theme/custom-theme-selector.tsx (2)

147-153: Consider extracting hex pattern to a constant.

The hex validation pattern /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/ is duplicated in three places (lines 147, 216, 248), violating DRY.

Consider extracting to a constant at the top of the file:

const HEX_COLOR_PATTERN = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;

Then use it in all validation sites.


231-231: Make error display dynamic.

The hasError prop is hardcoded to false, so validation errors from the form rules (lines 213-219, 245-251) won't be visually indicated to users.

Apply this diff to use form state:

+                      hasError={!!formState.errors.primary}
-                      hasError={false}
+                      hasError={!!formState.errors.background}
-                      hasError={false}

You'll need to destructure errors from formState in line 50:

-    formState: { isSubmitting },
+    formState: { isSubmitting, errors },

Also applies to: 263-263

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between dd95904 and 2087ef0.

📒 Files selected for processing (1)
  • apps/web/core/components/core/theme/custom-theme-selector.tsx (2 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Enable TypeScript strict mode and ensure all files are fully typed

Files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
**/*.{js,jsx,ts,tsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Prettier with Tailwind plugin for code formatting, run pnpm fix:format

Files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use ESLint with shared config across packages, adhering to max warnings limits per package
Use camelCase for variable and function names, PascalCase for components and types
Use try-catch with proper error types and log errors appropriately

Files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
🧠 Learnings (3)
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use `-active` state variants for elements in pressed/active states and `-selected` state variants only when actual selection logic exists

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use semantic text colors: `text-primary` for main text and headings, `text-secondary` for descriptions, `text-tertiary` for labels and metadata, `text-placeholder` for placeholder text

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Hover states must always match the base background layer: use `bg-layer-X hover:bg-layer-X-hover` pattern, never mix hover states between different layers

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: check:lint
  • GitHub Check: check:types
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (3)
apps/web/core/components/core/theme/custom-theme-selector.tsx (3)

26-46: LGTM: Clean theme initialization.

The getSavedTheme helper properly validates the user profile theme data and provides sensible defaults when data is missing.


59-88: LGTM: Solid theme update flow.

The function properly handles validation, async theme application, persistence, and user feedback with appropriate loading states and error handling.


271-282: LGTM: Theme mode toggle correctly implemented.

The darkPalette field is now properly handled as a boolean with the ToggleSwitch, and the live mode display provides good user feedback.

Copy link
Copy Markdown
Contributor

@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: 0

♻️ Duplicate comments (5)
apps/web/core/components/core/theme/config-handler.tsx (4)

44-48: Internationalize user-facing messages.

The success and error messages for theme configuration download are hardcoded strings and should use the t() function for translation consistency.

Apply this diff to internationalize the messages:

       setToast({
         type: TOAST_TYPE.SUCCESS,
         title: t("success"),
-        message: "Theme configuration downloaded successfully.",
+        message: t("theme_config_downloaded"),
       });
     } catch (error) {
       console.error("Failed to download config:", error);
       setToast({
         type: TOAST_TYPE.ERROR,
         title: t("error"),
-        message: "Failed to download theme configuration.",
+        message: t("theme_config_download_failed"),
       });

Also applies to: 51-55


59-65: Add file size validation to prevent DoS attacks.

Reading large files without size validation can cause memory exhaustion. Add a maximum file size check before parsing.

Apply this diff to add file size validation:

   const handleUploadConfig = async (event: React.ChangeEvent<HTMLInputElement>) => {
     const file = event.target.files?.[0];
     if (!file) return;
+
+    // Validate file size (max 1MB)
+    const MAX_SIZE = 1048576; // 1MB in bytes
+    if (file.size > MAX_SIZE) {
+      setToast({
+        type: TOAST_TYPE.ERROR,
+        title: t("error"),
+        message: t("file_too_large"),
+      });
+      if (fileInputRef.current) {
+        fileInputRef.current.value = "";
+      }
+      return;
+    }
 
     try {

104-108: Internationalize user-facing messages.

The success and error messages for theme configuration import should use the t() function for translation consistency.

Apply this diff to internationalize the messages:

       setToast({
         type: TOAST_TYPE.SUCCESS,
         title: t("success"),
-        message: "Theme configuration imported successfully",
+        message: t("theme_config_imported"),
       });
     } catch (error) {
       console.error("Failed to upload config:", error);
       setToast({
         type: TOAST_TYPE.ERROR,
         title: t("error"),
-        message: error instanceof Error ? error.message : "Failed to import theme configuration",
+        message: error instanceof Error ? error.message : t("theme_config_import_failed"),
       });

Also applies to: 111-115


127-132: Internationalize button labels.

The button labels "Import config" and "Download config" should use the t() function for translation consistency.

Apply this diff:

-      <Button variant="secondary" type="button" onClick={() => fileInputRef.current?.click()}>
-        Import config
-      </Button>
-      <Button variant="secondary" type="button" onClick={handleDownloadConfig}>
-        Download config
-      </Button>
+      <Button variant="secondary" type="button" onClick={() => fileInputRef.current?.click()}>
+        {t("import_config")}
+      </Button>
+      <Button variant="secondary" type="button" onClick={handleDownloadConfig}>
+        {t("download_config")}
+      </Button>
apps/web/core/components/core/theme/custom-theme-selector.tsx (1)

188-190: Internationalize loading state label.

The "Generating..." text should be internationalized for consistency with other UI strings in the component.

Apply this diff:

           <Button variant="primary" size="lg" type="submit" loading={isSubmitting || isLoadingPalette}>
-            {isSubmitting ? t("creating_theme") : isLoadingPalette ? "Generating..." : t("set_theme")}
+            {isSubmitting ? t("creating_theme") : isLoadingPalette ? t("generating") : t("set_theme")}
           </Button>
🧹 Nitpick comments (1)
apps/web/core/components/core/theme/config-handler.tsx (1)

63-65: Validate JSON structure before type assertion.

The as IUserTheme assertion bypasses type safety. The parsed JSON should be validated to confirm it has the expected structure before treating it as IUserTheme.

Consider adding runtime validation:

     try {
       const text = await file.text();
-      const config = JSON.parse(text) as IUserTheme;
+      const parsed = JSON.parse(text);
+      
+      // Validate it's an object
+      if (typeof parsed !== "object" || parsed === null) {
+        throw new Error("Invalid configuration format");
+      }
+      
+      const config = parsed as IUserTheme;
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2087ef0 and cba4d26.

📒 Files selected for processing (4)
  • apps/web/app/layout.tsx (1 hunks)
  • apps/web/core/components/core/theme/config-handler.tsx (1 hunks)
  • apps/web/core/components/core/theme/custom-theme-selector.tsx (1 hunks)
  • packages/tailwind-config/index.css (1 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • apps/web/core/components/core/theme/config-handler.tsx
  • apps/web/app/layout.tsx
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Enable TypeScript strict mode and ensure all files are fully typed

Files:

  • apps/web/core/components/core/theme/config-handler.tsx
  • apps/web/app/layout.tsx
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
**/*.{js,jsx,ts,tsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use Prettier with Tailwind plugin for code formatting, run pnpm fix:format

Files:

  • apps/web/core/components/core/theme/config-handler.tsx
  • apps/web/app/layout.tsx
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/tailwind-config/index.css
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{js,jsx,ts,tsx}: Use ESLint with shared config across packages, adhering to max warnings limits per package
Use camelCase for variable and function names, PascalCase for components and types
Use try-catch with proper error types and log errors appropriately

Files:

  • apps/web/core/components/core/theme/config-handler.tsx
  • apps/web/app/layout.tsx
  • apps/web/core/components/core/theme/custom-theme-selector.tsx
🧠 Learnings (11)
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Do not use Canvas (`bg-canvas`) for page-level backgrounds, nested containers, cards, modals, dropdowns, sidebars, panels, or anywhere other than the application root

Applied to files:

  • apps/web/app/layout.tsx
  • packages/tailwind-config/index.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/App.{tsx,ts,jsx,js} **/app.{tsx,ts,jsx,js} **/root.{tsx,ts,jsx,js} **/layout.{tsx,ts,jsx,js} : Canvas (`bg-canvas`) should only be used at the application root level and appear exactly once in the entire application, wrapping all pages and routes

Applied to files:

  • apps/web/app/layout.tsx
  • packages/tailwind-config/index.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use Surface (`bg-surface-1`, `bg-surface-2`, `bg-surface-3`) for top-level containers that sit directly on the canvas and serve as main content areas, page sections, or primary containers

Applied to files:

  • apps/web/app/layout.tsx
  • packages/tailwind-config/index.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use Layer (`bg-layer-1`, `bg-layer-2`, `bg-layer-3`) for nested elements within a surface, including cards, group headers, nested containers, dropdowns, modals, and any element appearing on top of a surface

Applied to files:

  • apps/web/app/layout.tsx
  • packages/tailwind-config/index.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use `-active` state variants for elements in pressed/active states and `-selected` state variants only when actual selection logic exists

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/tailwind-config/index.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use semantic text colors: `text-primary` for main text and headings, `text-secondary` for descriptions, `text-tertiary` for labels and metadata, `text-placeholder` for placeholder text

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
  • packages/tailwind-config/index.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Hover states must always match the base background layer: use `bg-layer-X hover:bg-layer-X-hover` pattern, never mix hover states between different layers

Applied to files:

  • apps/web/core/components/core/theme/custom-theme-selector.tsx
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : In rare cases, form elements (inputs, buttons, switches) in modals or surfaces may use one layer level above for visual separation (e.g., `bg-layer-2` with `bg-surface-1`), but this should not be used for content boxes or cards

Applied to files:

  • packages/tailwind-config/index.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Use semantic border colors: `border-subtle` for subtle borders and dividers, `border-subtle-1` for slightly more visible borders, `border-strong` for emphasis, `border-strong-1` for very strong borders

Applied to files:

  • packages/tailwind-config/index.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Match layer numbers to surface numbers: `bg-surface-1` uses `bg-layer-1`, `bg-surface-2` uses `bg-layer-2`, `bg-surface-3` uses `bg-layer-3`

Applied to files:

  • packages/tailwind-config/index.css
📚 Learning: 2025-12-12T15:20:52.636Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: packages/tailwind-config/AGENTS.md:0-0
Timestamp: 2025-12-12T15:20:52.636Z
Learning: Applies to packages/tailwind-config/**/*.{tsx,ts,jsx,js} : Never use hover states without the base background class; always apply hover as `hover:bg-layer-X-hover` in addition to `bg-layer-X`, not standalone

Applied to files:

  • packages/tailwind-config/index.css
🧬 Code graph analysis (1)
apps/web/core/components/core/theme/config-handler.tsx (5)
packages/types/src/users.ts (1)
  • IUserTheme (99-104)
packages/i18n/src/hooks/use-translation.ts (1)
  • useTranslation (23-35)
apps/api/plane/settings/storage.py (1)
  • url (16-17)
packages/propel/src/toast/toast.tsx (1)
  • setToast (245-265)
apps/web/public/workbox-9f2f79cf.js (1)
  • error (436-436)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: check:lint
  • GitHub Check: check:types
🔇 Additional comments (2)
apps/web/app/layout.tsx (1)

81-81: LGTM! Removal of bg-canvas coordinated with CSS centralization.

The removal of bg-canvas from this root container is correct, as the canvas background is now applied via the CSS body rule in packages/tailwind-config/index.css. This refactoring provides better separation of concerns by centralizing canvas styling in CSS rather than managing it through React className props.

Based on learnings, this change ensures bg-canvas appears exactly once at the true application root (the body element), which is architecturally more sound than applying it to a nested div.

packages/tailwind-config/index.css (1)

17-17: LGTM! Canvas background correctly centralized on body element.

This change moves bg-canvas from the React root container to the CSS body rule, which is architecturally cleaner and ensures the canvas background is consistently applied at the true application root. This approach follows the established pattern that Canvas should appear exactly once and wrap all application content.

Based on learnings, Canvas (bg-canvas) should only be used at the application root level and appear exactly once. This change satisfies that requirement by applying it to the body element via CSS.

Please verify that custom theme application and theme switching logic still works correctly with bg-canvas now on the body element instead of the React root container:

#!/bin/bash
# Description: Verify custom theme application works with bg-canvas on body element
# Expected: Theme utilities should apply CSS variables that bg-canvas references

# Search for theme application logic that might reference body or root elements
rg -nC3 --type=ts --type=tsx 'applyCustomTheme|clearCustomTheme|bg-canvas' 

# Search for theme switching components
ast-grep --pattern $'export function ThemeSwitch($$$) {
  $$$
}'

# Check if any theme logic specifically targets the root container
rg -nC3 --type=ts --type=tsx 'app-container|root.*theme|theme.*root'

@pushya22 pushya22 merged commit fa63964 into preview Dec 16, 2025
8 of 9 checks passed
@pushya22 pushya22 deleted the chore-custom-theming-enhancements branch December 16, 2025 12:48
KooshaPari added a commit to KooshaPari/Planify that referenced this pull request Mar 29, 2026
)

* [PAI-963] feat: enhance CustomSelect component with context for dropdown management (makeplane#8202)

* feat: enhance CustomSelect component with context for dropdown management

* refactor: streamline CustomSelect component structure and improve dropdown options rendering

* [WEB-5603] feat: enhance workspace settings layout and members page (makeplane#8266)

* feat: enhance workspace settings layout and members page with new components

* refactor: update workspace settings layout and members page to use default exports

* refactor: settings layout import changes

* refactor: simplify workspaceSlug usage in settings layout

* [WEB-5592] chore: add static files update settings for static files support (makeplane#8251)

* chore: add static files collection and update settings for static files support

* chore: add WhiteNoise middleware for static file handling

* chore(deps): upgrade WhiteNoise to version 6.11.0 and add static file reverse proxy in Caddyfile

* [WEB-5256]chore: quick actions refactor (makeplane#8019)

* chore: quick actions refactor

* chore: lint fix

* chore: unified factory for actions

* chore: lint fix

* * chore: removed redundant files
* chore: updated imports

* chore: updated interfaces to types

* chore: updated undefined handling

* [WIKI-829] fix: add option to only show placeholder on empty editor (makeplane#8232)

* feat: add placeholderOnEmpty functionality to editor components

* Update packages/editor/src/core/extensions/placeholder.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* refactor: rename placeholderOnEmpty to showPlaceholderOnEmpty across editor components

* chore : make optional

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* [WIKI-830] fix: copy clipboard functionality in the editor (makeplane#8229)

* feat: enhance clipboard functionality for markdown and HTML content

* fix: improve error handling and state management in CustomImageNodeView component

* fix: correct asset retrieval query by removing workspace filter in DuplicateAssetEndpoint

* fix: update meta tag creation in PasteAssetPlugin for clipboard HTML content

* feat: implement copyMarkdownToClipboard utility for enhanced clipboard functionality

* refactor: replace copyMarkdownToClipboard utility with copyTextToClipboard for simplified clipboard operations

* refactor: streamline clipboard operations by replacing copyTextToClipboard with copyMarkdownToClipboard in editor components

* refactor: simplify PasteAssetPlugin by removing unnecessary meta tag handling and streamlining HTML processing

* feat: implement asset duplication processing on paste for enhanced clipboard functionality

* chore:remove async from copy markdown method

* chore: add paste html

* remove:prevent default

* refactor: remove hasChanges from processAssetDuplication return type for simplified asset processing

* fix: format options-dropdown.tsx

* feat: add timezone selection to workspace settings (makeplane#8248)

* feat: add timezone selection to workspace onboarding, creation and settings

* refactor: remove timezone selection from workspace creation and onboarding forms

* [WEB-5285] feat: enhance ChangeTrackerMixin to capture changed fields on save (makeplane#8270)

- Added an override for the save method in ChangeTrackerMixin to store changed fields before resetting tracking.
- Implemented a new method, _reset_tracked_fields, to ensure subsequent saves detect changes relative to the last saved state.
- Updated IssueComment to utilize _changes_on_save for determining changed fields, improving accuracy in tracking modifications.

* [WEB-5585]chore: timeline chart refactor (makeplane#8246)

* chore: timeline chart refactor

* fix: format

* [WEB-5575]feat: enhance APITokenLogMiddleware to support logging to MongoDB (makeplane#8241)

* feat: enhance APITokenLogMiddleware to support logging to MongoDB

- Added functionality to log external API requests to MongoDB, with a fallback to PostgreSQL if MongoDB is unavailable.
- Implemented error handling for MongoDB connection and logging operations.
- Introduced additional fields for MongoDB logs, including timestamps and user identifiers.
- Refactored request logging logic to streamline the process and improve maintainability.

* fix: improve MongoDB availability checks in APITokenLogMiddleware

- Enhanced the logic for determining MongoDB availability by checking if the collection is not None.
- Added a check for MongoDB configuration before attempting to retrieve the collection.
- Updated error handling to ensure the middleware correctly reflects the state of MongoDB connectivity.

* feat: implement logging functionality in logger_task for API activity

- Added a new logger_task module to handle logging of API activity to MongoDB and PostgreSQL.
- Introduced functions for safely decoding request/response bodies and processing logs based on MongoDB availability.
- Refactored APITokenLogMiddleware to utilize the new logging functions, improving code organization and maintainability.

* refactor: simplify MongoDB logging in logger_task and middleware

- Removed direct dependency on MongoDB collection in log_to_mongo function, now retrieving it internally.
- Updated process_logs to check MongoDB configuration before logging, enhancing error handling.
- Cleaned up logger.py by removing unused imports related to MongoDB.

* feat: add Celery task decorator to process_logs function in logger_task

- Introduced the @shared_task decorator to the process_logs function, enabling asynchronous processing of log data.
- Updated function signature to include a return type of None for clarity.

* [WEB-5609] fix: extended sidebar item pin/unpin makeplane#8287

* [WEB-5608] chore: Hide "Pro" Features in Community Edition (makeplane#8288)

* chore: Hide "Pro" Features in Community Edition

* refactor: remove time tracking feature and simplify project features list

* chore: moving star us button to the top navigation (makeplane#8289)

* chore: optimize turborepo (makeplane#8286)

* [WIKI-844] fix: realtime sync post vite migration with title editor sync and indexed db access (makeplane#8294)

* fix: robust way to handle socket connection and read from indexeddb cache when reqd

* fix: realtime sync working with failure handling

* fix: title editor added

* merge preview into fix/realtime-sync

* check

* page renderer props

* lint errors

* lint errors

* lint errors

* sanitize html

* sanitize html

* format fix

* fix lint

* [WEB-4440] fix: duplicate sequence when creating multiple workitems in rapid succession (makeplane#8298)

- Replace advisory lock with transaction-level lock in Issue model save method
- Updated the save method in the Issue model to use a transaction-level advisory lock for better concurrency control.
- Simplified the locking mechanism by removing the explicit unlock step, as the lock is automatically released at the end of the transaction.
- Maintained existing functionality for sequence and sort order management while improving code clarity.

* chore: format files in API server (makeplane#8292)

* chore: fix ruff checks (makeplane#8305)

* fix: editor sync changes (makeplane#8306)

* chore: upate function declarations

* chore: formatted files

* chore: fix/check tooling improvements with turbo (makeplane#8304)

* fix: broken lock file

* chore: add Plane sync label to github templates makeplane#8303

Co-authored-by: Pushya Mitra Thiruvooru <pushya@Pushyas-MacBook-Pro.local>

* [WEB-5624] chore: added webhook translations makeplane#8312

* chore(deps): upgrade next themes package

* [WEB-5654]fix: custom select selection and dropdown close makeplane#8324

* [WEB-5124] chore: intake work item toast enhancements (makeplane#8329)

* [WEB-5647] chore: list layout work item identifier enhancements (makeplane#8326)

* chore: file formating

* [WEB-5650] feat: Enable Gitea OAuth configuration  (makeplane#8325)

* feat: implement OAuth configuration helper and integrate into auth forms

* fix: ensure OAuth providers are disabled by default if not configured

* [WEB-5602] feat: new design system (makeplane#8220)

* chore: init tailwind v4

* chore: update all configs

* chore: add source to parse monorepo packages

* chore: combine all css files

* feat: added extended colors

* chore: update typography

* chore: update extended color var names

* refactor: remove initial spacing variable and update dark mode selector

* chore: update css files

* chore: update animations

* chore: remove spacing tokens

* fix: external css files

* chore: update tailwind-merge version

* chore: update font family

* chore: added brief agents.md and story for new design system

* chore: enhance design system documentation with rare exceptions for visual separation

* chore: add fontsource package for typography

* chore: material symbols font added

* chore: update shadow default

* chore: add stroke and outline theme vars

* chore: update ring and fill colors

* chore: overwrite tailwind typography tokens

* chore: add high contrast mode tokens

* chore: update scrollbar colors

* chore: backward compatibility for buttons and placeholders

* chore: add priority colors

* chore: update urgent priority color

* chore: update plan colors

* chore: add missing utility class

* chore: update height and padding classes

* chore: update label colors

* chore: add missing utlity

* chore: add typography plugin to space app

* chore: replace existing classNames with new design system tokens makeplane#8244 (makeplane#8278)

* chore: update border colors

* chore: update all borders

* chore: update text colors

* chore: update css variables

* chore: update font sizes and weights

* chore: update bg colors

* chore: sync changes

* fix: uncomment spacing-1200 variable in variables.css

* chore: update primary colors

* refactor: updated border to border-subtle

* refactor: update various components and improve UI consistency across the application

* updated classnames

* updated classnames

* refactor: update color-related class names to use new design system variables for consistency

* chore: default automations

* chore: update text sizes

* chore: home and power k

* chore: home and power k

* chore: replace ui package button components

* chore: update text sizes

* chore: updated issue identifier (makeplane#8275)

* refactor: top navigation and sidebar design token (makeplane#8276)

* chore: update all button components (makeplane#8277)

* chore: new button component

* chore: update existing buttons

* chore: overwrite tailwind typography tokens

* fix: twMerge config + fixed cn instances

* refactor: toast design token updated (makeplane#8279)

* chore: update existing buttons

* chore: tooltip design token updatged (makeplane#8280)

* chore: moved cn utility to propel (makeplane#8281)

* chore: update space app UI (makeplane#8285)

* chore; update space app filters component

* fix: button whitespace wrap

* chore: space app votes

* chore: update dropdown components

* refactor: auth, onboarding, sidebar, and common component design token migration (makeplane#8291)

* chore: checkbox component design token updated

* chore: indicator and oauth component design token updated

* chore: sidebar design token updated

* chore: auth and onboarding design token updated

* chore: update divider color

* style: update background colors and hover effects across list components

* fix: tailwind merge

* refactor: toggle switch design token migration and header utility classname added (makeplane#8295)

* chore: toggle component design token updated

* chore: h-header utility class added

* chore: updated color tokens for work item detail page (makeplane#8296)

* chore: update react-day-picker UI

* refactor: update button sizes and styles in filters components

* refactor: breadcrumbs design token updated (makeplane#8297)

* chore: update priority icon colors

* refactor: updated layout variables

* chore: update plan card primary CTA

* Chore update editor design system (makeplane#8299)

* refactor: update styles for callout, color selector, logo selector, and image uploader

* refactor:fix image

* chore: update settings UI

* chore: updated notifications color and size tokens (makeplane#8302)

* chore: update sm button border radius

* fix: logo renderer

* chore: icon button component

* chore: remove deprecated classes

* chore: remove deprecated classes

* chore: update editor list spacing

* fix: icon button size

* chore: improvements (makeplane#8309)

* chore: update cycles and modules pages

* refactor: update background styles across various components to use new design system colors

* fix: button type errors

* chore: update modals design system (makeplane#8310)

* refactor: callout bg

* refactor: code  bg

* refactor: modal size and variant

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>

* chore: update next-themes

* design: update billing and plans component styles and remove unused utility functions (makeplane#8313)

* refactor: empty state design token migration and improvements (makeplane#8315)

* fix: profile page

* refactor: tabs design token updated (makeplane#8316)

* chore: updated buttons and tokens for work items (makeplane#8317)

* fix: adjust trial button spacing in checkout modal

* chore: update add button hover state

* fix: type error (makeplane#8318)

* fix: type error

* chore: code refactor

* refactor: update button sizes and background styles in rich filters components

* refactor: update editor bg

* refactor: enhance Gantt chart sidebar functionality and styling

- Removed unused  prop from .
- Updated  to include new props for better block management and scrolling behavior.
- Improved auto-scroll functionality for Gantt chart items.
- Adjusted styles in  component for consistent design.

* regression: gantt design

* chore: new badge component

* fix: favorite star

* chore: update backgroung, typography and button sizes across workspace settings general and members pages

* fix: header button sizes

* fix: emoji icon logo (makeplane#8323)

* more fixes

* chore: update settings sidebar

* refactor: avatar component

* chore: updated work item detail sidebar (makeplane#8327)

* refactor: update link preview

* fix: work item property dropdowns

* fix: dropdown buttons border radius

* chore: update power k translation

* chore: updated profile activity design (makeplane#8328)

* chore: update settings pages

* chore: update work item sidebar alignments (makeplane#8330)

* refactor: admin design system

* chore: update page header

---------

Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com>
Co-authored-by: VipinDevelops <vipinchaudhary1809@gmail.com>
Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: gakshita <akshitagoyal1516@gmail.com>
Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com>
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>

* fix: formatting

* reexport types

* fix: lint error

---------

Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com>
Co-authored-by: VipinDevelops <vipinchaudhary1809@gmail.com>
Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: gakshita <akshitagoyal1516@gmail.com>
Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com>
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>

* [WEB-5668] fix: add fetchWorkspaceLevelProjectEntities method and update project-related fetch keys (makeplane#8347)

* [SILO-783] feat: added porters and new serializer based exporter (makeplane#8335)

* [WEB-5699] refactor: update styling and classnames of charts according to new design system (makeplane#8345)

* refactor: update styling and class names according to new design system in charts

* refactor: clean up

* feat: custom theming enhancements (makeplane#8342)

* [WEB-5671] chore: settings workspace members enhancements makeplane#8346

* [WEB-5666] chore: set project timezone same as workspace timezone in project (makeplane#8340)

* [WEB-5614] fix: new design system consistency (makeplane#8351)

* chore: tooltip enhancements

* chore: project card enhancements

* chore: work item card enhancements

* chore: update component styles and class names for consistency across the application

---------

Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>

* [WEB-5708] regression: remove material icon instances from the Space app (makeplane#8353)

* chore: sync changes (makeplane#8343)

* [WEB-5614] chore: work item detail and list layout enhancements makeplane#8355

* regression: replace old css vars with the new design system tokens (makeplane#8354)

* chore: replace old css vars

* fix: replace shadow and primary colors

* chore: remove hardcoded colors

* [WEB-5614] chore: custom theme on colour improvement makeplane#8356

* [WEB-5732] style: update work item detail properties UI (makeplane#8357)

* [WEB-5730] fix: user mention colors makeplane#8358

* [WEB-5614] fix: empty state and padding token fixes (makeplane#8359)

* [WEB-5614] chore: update component styles and class names for consistency across projects makeplane#8360

* [WEB-5614] chore: logo and icon enhancements makeplane#8362

* fix: work item property icon renderer (makeplane#8363)

* [WEB-5614] fix: sidebar and label dropdown makeplane#8364

* fix: material icons font file (makeplane#8366)

* [WEB-5614] chore: lucide icon code refactor makeplane#8365

* fix: nested context menu UI (makeplane#8367)

* [WEB-5708] style: space app kanban card UI (makeplane#8368)

* [WEB-5742] fix: input field background makeplane#8369

* [WEB-5641] chore: sub work item quick menu padding makeplane#8370

* chore: replace old classNames (makeplane#8372)

* chore: update component styles and class names for consistency across the application (makeplane#8376)

* [WEB-5660] [WEB-5737] fix: cycle and module sidebar makeplane#8375

* [WEB-5676] style: gantt column outline makeplane#8374

* [WEB-5614] chore: platform design token enhancements (makeplane#8373)

* [WEB-5649] [WEB-5675] fix: local font files makeplane#8377

* [WEB-5614] chore: primitive token updated (makeplane#8378)

* fix: tooltip imports (makeplane#8379)

* [WEB-5614] chore: platform header and breadcrumb enhancements (makeplane#8383)

* [WEB-5652] fix: kanban quick add UI makeplane#8382

* [WEB-5726] fix: showing an empty state on deleted work item link makeplane#8381

* fix: space app default background (makeplane#8384)

* [WIKI-849] feat: debounce for mention search (makeplane#8380)

* fix: font imports (makeplane#8387)

* chore: platform layout enhancements (makeplane#8386)

* fix: image uploader bg in light mode (makeplane#8385)

* [WEB-5614] refactor: update styling and structure across various components (makeplane#8388)

* fix: input fields bg (makeplane#8389)

* fix: custom z-index classNames (makeplane#8395)

* [WEB-5454] fix: optimize date validation logic in CycleCreateUpdateModal makeplane#8394

* [WEB-5614] chore: work item detail comment and sidebar enhancements (makeplane#8397)

* [WEB-5675] chore: implement `fontsource` as the fonts library (makeplane#8398)

* [WEB-5762] fix: workitem detail sidebar properties design consistency (makeplane#8400)

* [WEB-5761]fix: intake spacing issue (makeplane#8399)

* [WEB-5614] chore: sidebar enhancement makeplane#8401

* [WEB-5768]chore: updated comment UI makeplane#8402

* [WEB-5614] chore: package and layout enhancements makeplane#8403

* chore: update storybook dependency

* [WEB-5657] feat: add synchronization configuration for multiple providers in authentication adapter  (makeplane#8336)

* feat: add sync functionality for OAuth providers

- Implemented `check_sync_enabled` method to verify if sync is enabled for Google, GitHub, GitLab, and Gitea.
- Added `sync_user_data` method to update user details, including first name, last name, display name, and avatar.
- Updated configuration variables to include sync options for each provider.
- Integrated sync check into the login/signup process.

* feat: add sync toggle for OAuth providers in configuration forms

* fix: remove default value for sync options in OAuth configuration forms

* chore: delete old avatar and upload a new one

* chore: update class method

* chore: add email nullable

* refactor: streamline sync check for multiple providers and improve avatar deletion logic

* fix: ensure ENABLE_SYNC configurations default to "0" for Gitea, Github, Gitlab, and Google forms

* fix: simplify toggle switch value handling in ControllerSwitch component

---------

Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>

* [WEB-5657] chore: synchronization configuration for multiple providers in authentication adapter makeplane#8409

* [WEB-5746]fix: workspace member modal z-index makeplane#8410

* [WEB-5773] fix: editor image full screen modal (makeplane#8413)

* [WEB-5774] fix: editor nodes background colors (makeplane#8416)

* [WEB-5776]chore: updated design system for alert modal makeplane#8415

* [WEB-5775] fix: mentions search on empty query makeplane#8417

* [WEB-5662][WEB-5770] fix: alignment of cycles in sidebar and layout selection dropdown button (makeplane#8414)

* fix: alpha colors (makeplane#8418)

* [WEB-5784] fix: truncation issue in wi properties (makeplane#8422)

* fix: update background surface 2 variables in tailwind config

* fix: improve layout and truncation handling in issue link and list items

* docs: update readme with react router badge (makeplane#8424)

Updated feature list and modified the local development section.

* [WEB-5788] fix: board layout group by icon makeplane#8426

* [WEB-5792] regression: editor font family makeplane#8427

* [WIKI-740] refactor: editor table performance (makeplane#8411)

* [WEB-5786] fix: updated font size for dates at Kanban card makeplane#8429

* [WEB-5772] fix: theme switch flicker (makeplane#8428)

* [WEB-5784] fix: truncation of links in work items (makeplane#8430)

* [WEB-5772] chore: theme switcher and editor colors enhancements (makeplane#8436)

* [WEB-5772] chore: theme switcher code refactor makeplane#8438

* chore: workspace events (makeplane#8439)

* chore: adding invite and joined events

* chore: adding workspace create and update events

* [WEB-5798] refactor: web and admin auth related components and update admin designs (makeplane#8431)

* refactor: web and admin auth related components and update admin designs.

* fix: format

* [WEB-5581] fix: resolve logo spinner hydration and theme loading issues (makeplane#8450)

- Fix hydration mismatch by lazy loading components that depend on theme
- Ensure LogoSpinner renders with correct theme on initial load

* [WEB-5791] fix: broken favicon in links (makeplane#8396)

* fix: using base url of a redirect url

* chore: internal networks check for the final_url

* fix: none final_url

* fix: exception handling

* fix: exception handling

* chore: remove unused imports

* refactor: moved ip address check logic into separate function

* fix: ValueError logic

* [WEB-5667] fix: estimate value display in analytics makeplane#8448

* [WEB-5779] fix: handle loading state while fetching project cover image (makeplane#8419)

* refactor: replace cover image handling with CoverImage component across profile and project forms

* fix: extend CoverImage component to accept additional img props

* Update apps/web/core/components/common/cover-image.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: handle undefined cover image URL in ProfileSidebar component

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* [WEB-5782]chore: migrated modals to @plane/ui (makeplane#8420)

* chore: migrated modal to @plane/ui

* chore: fixed spacings

* [WEB-5808] chore: sidebar project list enhancements (makeplane#8451)

* chore: sidebar project list enhancements

* chore: code refactor

* chore: code refactor

* [WEB-5324] refactor: add Unified OAuth Configuration and Missing Gitea Options (makeplane#8050)

* refactor: add Unified OAuth Configuration and Missing Gitea Options

- Replaced the AuthenticationModes component with a more streamlined implementation using AuthenticationMethodCard.
- Removed obsolete authentication modes files from the codebase.
- Enhanced the AuthRoot component to utilize the new OAuth configuration hook for better management of authentication options.
- Updated type definitions for instance authentication modes to reflect the new structure.

* refactor: update OAuth type imports and remove obsolete types

- Replaced local type imports with centralized imports from @plane/types in core, extended, and index OAuth hooks.
- Removed the now redundant types.ts file as its definitions have been migrated.
- Enhanced type definitions for OAuth options to improve consistency across the application.

* feat: add new Gitea logo and update OAuth icon imports to use standard HTML img tags

* chore: remove unused authentication logos and upgrade button component

* [WEB-5574]chore: notification card refactor (makeplane#8234)

* chore: notification card refactor

* chore: moved base activity types to constants package

* [WEB-5804] refactor: decouple filter value types from filter configurations (makeplane#8441)

* [WEB-5804] refactor: decouple filter value types from filter configurations

Remove value type constraints from filter configurations to support
operator-specific value types. Different operators can accept different
value types for the same filter property, so value types should be
determined at the operator level rather than the filter level.

- Remove generic value type parameter from TFilterConfig
- Update TOperatorConfigMap to accept union of all value types
- Simplify filter config factory signatures across all filter types
- Add forceUpdate parameter to updateConditionValue method

* refactor: remove filter value type constraints from filter configurations

Eliminate the generic value type parameter from filter configurations to allow for operator-specific value types. This change enhances flexibility by enabling different operators to accept various value types for the same filter property.

- Updated TFilterConfig and related interfaces to remove value type constraints
- Adjusted filter configuration methods and types accordingly
- Refactored date operator support to align with the new structure

* [WEB-5785]fix: favorites icon size makeplane#8449

* [WEB-5781]chore: removed info banner for preferences makeplane#8442

* [WEB-5809] refactor: tailwind config inline variables (makeplane#8437)

* refactor: actions icon migration (makeplane#8219)

* chore: gitignore updated

* chore: check icon added to propel package

* feat: search icon migration

* chore: check icon migration

* chore: plus icon added to propel package

* chore: code refactor

* chore: plus icon migration and code refactor

* chore: trash icon added to propel package

* chore: code refactor

* chore: trash icon migration

* chore: edit icon added to propel package

* chore: new tab icon added to propel package

* chore: edit icon migration

* chore: newtab icon migration

* chore: lock icon added to propel package

* chore: lock icon migration

* chore: globe icon added to propel package

* chore: globe icon migration

* chore: copy icon added to propel package

* chore: copy icon migration

* chore: link icon added to propel package

* chore: link icon migration

* chore: link icon migration

* chore: info icon added to propel package

* chore: code refactor

* chore: code refactor

* chore: code refactor

* chore: code refactor

* regression: red and green color backgrounds (makeplane#8456)

* [WEB-5815] chore: removed the deleted states (makeplane#8457)

* Typo: database extension error message (makeplane#8461)

* [WEB-5179] chore: icon utils code refactor makeplane#8458

* [WEB-5790] feat: new email templates (makeplane#8423)

* chore: remove unused get_client_ip import (makeplane#8453)

Remove unused import `get_client_ip` from workspace/invite.py.
Identified by ruff linter (F401 error).

Signed-off-by: majiayu000 <1835304752@qq.com>

* [WEB-5822] fix: migrate ImagePickerPopover to Propel Tabs component and render only enabled tabs makeplane#8290

- Replace custom tab implementation with Propel Tabs
- Dynamically render only enabled tabs based on configuration
- Filter tabs by isEnabled property for cleaner conditional rendering
- Improve tab navigation and accessibility with Propel components

* chore: navigation preference enhancements (makeplane#8468)

* [WEB-5472] refactor: components of project creation flow (makeplane#8462)

* [WEB-857] regression: image uploader error state makeplane#8471

* [WEB-4959]chore: refactor project member page makeplane#8464

* [WEB-5472] refactor: project form makeplane#8472

* migration: added webhook version, navigation related fields and allowed_rate_limit for APIToken (makeplane#8339)

* migration: added version field in webhook

* chore: add max_length

* chore: added product tour fields

* chore: updated the migration file

* chore: removed the duplicated migration file

* chore: added allowed_rate_limit for api_tokens

* chore: changed key feature tour to product tour

* chore: added is_subscribed_to_changelog field

---------

Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>

* fix: correct spelling error in database.ts log message (makeplane#8452)

Fix "convertion" -> "conversion" in error log message.

Signed-off-by: majiayu000 <1835304752@qq.com>

* [WEB-5598] refactor: streamline object creation in workspace seed task and improve error handling in workspace creation makeplane#8264

* chore: remove posthog events (makeplane#8465)

* chore: remove posthog events

* chore: remove event tracking

* chore: lint errors

* chore: minor changes based on comments

* fix: type errors

* Revert "[WEB-4959]chore: refactor project member page makeplane#8464" (makeplane#8476)

This reverts commit c97e418.

* chore: remove unused right sidebar component and clean up workspace member settings (makeplane#8477)

* [WEB-5537]refactor: rename IssueUserProperty to ProjectUserProperty and update related references  (makeplane#8206)

* refactor: rename IssueUserProperty to ProjectUserProperty and update related references across the codebase

* migrate: move issue user properties to project user properties and update related fields and constraints

* refactor: rename IssueUserPropertySerializer and IssueUserDisplayPropertyEndpoint to ProjectUserPropertySerializer and ProjectUserDisplayPropertyEndpoint, updating all related references

* fix: enhance ProjectUserDisplayPropertyEndpoint to handle missing properties by creating new entries and improve response handling

* fix: correct formatting in migration for ProjectUserProperty model options

* migrate: add migration to update existing non-service API tokens to remove workspace association

* migrate: refine migration to update existing non-service API tokens by excluding bot users from workspace removal

* chore: changed the project sort order in project user property

* chore: remove allowed_rate_limit from APIToken

* chore: updated user-properties endpoint for frontend

* chore: removed the extra projectuserproperty

* chore: updated the migration file

* chore: code refactor

* fix: type error

---------

Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: sangeethailango <sangeethailango21@gmail.com>
Co-authored-by: vamsikrishnamathala <matalav55@gmail.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>

* [WIKI-826] chore: add unique id as key to logo selector (makeplane#8494)

* [VPAT-50] chore(security): add X-Frame-Options header to nginx configuration to prevent clickjacking attacks (makeplane#8507)

* [VPAT-50] chore(security): add X-Frame-Options header to nginx configuration to prevent clickjacking attacks

* [SECURITY] chore: enhance nginx configuration with additional security headers

* chore: updated migration file name (makeplane#8515)

* chore(deps): react router upgraded

* [WEB-5890] migration: added getting_started_checklist, tips, explored_feature fields on the workspace member table (makeplane#8489)

* migration: added getting_started_checklist and tips field

* fix: remove defaults and added explored_features field

* fix: added user table migration

* [WEB-5907] fix: magic code sign-in at Space app. makeplane#8552

* [WIKI-735] fix: table insert handle z-index makeplane#8545

* [WEB-5898] chore: update tailwind config makeplane#8516

* chore(deps): bump lodash-es in the npm_and_yarn group across 1 directory (makeplane#8573)

Bumps the npm_and_yarn group with 1 update in the / directory: [lodash-es](https://github.com/lodash/lodash).


Updates `lodash-es` from 4.17.21 to 4.17.23
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](lodash/lodash@4.17.21...4.17.23)

---
updated-dependencies:
- dependency-name: lodash-es
  dependency-version: 4.17.23
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* [WEB-5845] chore: changing description field to description json (makeplane#8230)

* chore: migrating description to description json

* chore: replace description with description_json

* chore: updated migration file

* chore: updated the migration file

* chore: added description key in external endpoint

* chore: updated the migration file

* chore: updated the typo

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>

* chore: fix typos in comments (makeplane#8553)

* [GIT-61] chore: allow .md files to be uploaded (makeplane#8571)

* chore: allow .md files to be uploaded

* chore: allow .md files to be uploaded

* [WEB-5860] [WEB-5861] [WEB-5862] style: improved settings interface (makeplane#8520)

* style: improved profile settings

* chore: minor improvements

* style: improved workspace settings

* style: workspace settings content

* style: improved project settings

* fix: project settings flat map

* chore: add back navigation from settings pages

* style: settings content

* style: estimates list

* refactor: remove old code

* refactor: removed unnecessary line breaks

* refactor: create a common component for page header

* chore: add fade-in animation to sidebar

* fix: formatting

* fix: project settings sidebar header

* fix: workspace settings sidebar header

* fix: settings content wrapper scroll

* chore: separate project settings features

* fix: formatting

* refactor: custom theme selector

* refactor: settings headings

* refactor: settings headings

* fix: project settings sidebar padding

* fix: sidebar header padding

* fix: sidebar item permissions

* fix: missing editable check

* refactor: remove unused files

* chore: remove unnecessary code

* chore: add missing translations

* fix: formatting

* [GIT-45] fix: allow markdown file attachments (makeplane#8524)

* fix: allow markdown file attachments

- Add text/markdown to ATTACHMENT_MIME_TYPES
- Fixes issue where .md files were rejected with 'Invalid file type' error

* added the support for frontend mime type too

* fix: node view renders (makeplane#8559)

* fix node renders

* fix handlers

* fix: duplicate id

* fix: pdf export (makeplane#8564)

* feat: pdf export

* fix: tests

* fix: tests

---------

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>

* migration: back migrate all product tour fields to set true (makeplane#8575)

* [GIT-66] improvement: prevent disabling last enabled authentication method (makeplane#8570)

* fully translated into Ukrainian language (makeplane#8579)

* chore:  add copyright (makeplane#8584)

* feat: adding new copyright info on all files

* chore: adding CI

* fix: module percentage calculation (makeplane#8595)

* fix: file fomatting

* [SECUR-113] fix: ssrf for work item links (makeplane#8607)

* [SECUR-104] fix: Arbitrary Modification of API Token Rate Limits#8612

* chore(deps): upgrade django version

* [WEB-6058] chore : add logic to handle save#8614

* chore(deps): update the node pacakges

* fix: type fix for description payload (makeplane#8619)

* fix: type fix

* fix: duplicate type fix

* chore(deps): update lodash package

* [WEB-6149] migration: change estimate point key max value to 50 makeplane#8620

* fix: remove ee folder from web (makeplane#8622)

* chore: merge constants and services (makeplane#8623)

* fix: remove constants and services

* fix: formatting

* fix: types check

* chore: merge helpers and layouts (makeplane#8624)

* fix: remove constants and services

* fix: formatting

* chore: merge helpers and layouts

* fix: workspace disbale flag handling

* chore(deps): bump cryptography (makeplane#8625)

Bumps the pip group with 1 update in the /apps/api/requirements directory: [cryptography](https://github.com/pyca/cryptography).


Updates `cryptography` from 44.0.1 to 46.0.5
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](pyca/cryptography@44.0.1...46.0.5)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.5
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* style: update ASCII art in install script header (makeplane#8628)

* [WEB-6038] fix: work item empty title flicker makeplane#8618

* fix: workitem description input inital load (makeplane#8617)

* [WEB-6137] fix: work item peek view outside click makeplane#8610

* [SECUR-105] fix: csv injection vulnerability sanitization makeplane#8611

* [WIKI-877] fix: order of this dropdown options in pages makeplane#8563

* [WEB-5899]fix: project sort order (makeplane#8530)

* fix: project sort order

* chore: updated queryset for sort_order

* chore: admin folder structure (makeplane#8632)

* chore: admin folder structure

* fix: copy right check and formatting

* fix: types

* i18n(ru): expand Russian translation coverage (makeplane#8603)

Added missing translations for:
- Profile preferences (language, timezone settings)
- Account settings sections (preferences, notifications, security, api-tokens, activity)
- Workspace settings (billing, exports, webhooks headings/descriptions)
- Project settings (states, labels, estimates, automations headings/descriptions)
- Power-K command palette (contextual actions, navigation, creation, preferences, help)
- Sidebar elements (stickies, your_work, pin/unpin)
- Common actions (copy_markdown, overview)
- Navigation customization options

* chore(deps): update axios dependency

* [GIT-57 | WEB-5912] fix: app sidebar ux and responsiveness (makeplane#8560)

* fix: project extended sidebar accordion ux

* fix: app sidebar mobile responsiveness ux

* chore: code refactor

* refactor: table drag preview using decorations (makeplane#8597)

* refactor: table drag preview using decorations

* fix: history meta for table drag state

* [WEB-5884] chore: layout loader enhancements makeplane#8500

* [WEB-1201] chore: dropdown options hierarchy improvements (makeplane#8501)

* chore: sortBySelectedFirst and sortByCurrentUserThenSelected utils added

* chore: members dropdown updated

* chore: module dropdown updated

* chore: project and label dropdown updated

* chore: code refactor

* [GIT-44] refactor(auth): add PASSWORD_TOO_WEAK error code (makeplane#8522)

* refactor(auth): add PASSWORD_TOO_WEAK error code and update related error handling in password change flow

* fix(auth): update import to use type for EAuthenticationErrorCodes in security page

* Update apps/web/app/(all)/profile/security/page.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/security/page.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* refactor: updated auth error exception accross zxcvbn usages

* fix: improve error handling for password strength validation and update error messages

* i18n(ru): update Russian translations for stickies and automation description

Added translation for 'stickies' and improved formatting of the automation description in Russian locale.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update translations.ts: issue-artifacts discoverd (makeplane#7979)

* [WEB-5873] fix: user avatar ui consistency (makeplane#8495)

* fix: user avatar ui consistency

* chore: code refactor

* [SILO-820] fix: update serializer for module detail API endpoint to use ModuleUpdateSerializer (makeplane#8496)

* [VPAT-51] fix: update workspace invitation flow to use token for validation makeplane#8508

- Modified the invite link to include a token for enhanced security.
- Updated the WorkspaceJoinEndpoint to validate the token instead of the email.
- Adjusted the workspace invitation task to generate links with the token.
- Refactored the frontend to handle token in the invitation process.

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>

* [WEB-5871] chore: added intake count for projects (makeplane#8497)

* chore: add intake_count in project list endpoint

* chore: sidebar project navigation intake count added

* fix: filter out closed intake issues in the count

* chore: code refactor

* chore: code refactor

* fix: filter out deleted intake issues

---------

Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>

* [WEB-5829] fix: Intake open work count (makeplane#8547)

* fix: open intake count at sidebar header

* chore: reverted inbox store arguments to core store

* fix: intake count update

* [WEB-5863] fix: estimate point input validation makeplane#8492

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>

* [VPAT-55] chore(security): implement input validation across authentication and workspace forms (makeplane#8528)

* chore(security): implement input validation across authentication and workspace forms

  - Add OWASP-compliant autocomplete attributes to all auth input fields
  - Create centralized validation utilities blocking injection-risk characters
  - Apply validation to names, display names, workspace names, and slugs
  - Block special characters: < > ' " % # { } [ ] * ^ !
  - Secure sensitive input fields across admin, web, and space apps

* chore: add missing workspace name validation to settings and admin forms

* feat: enhance validation regex for international names and usernames

- Updated regex patterns to support Unicode characters for person names, display names, company names, and slugs.
- Improved validation functions to block injection-risk characters in names and slugs.

* [VPAT-16] improvement: add file validation to prevent malicious uploads makeplane#8493

Add client-side checks for double extensions, dangerous file types,
dot files, and path traversal patterns. Addresses security audit
recommendations for file upload validation.

* [WEB-5827] fix: persist external cover image URLs (Unsplash) in project updates makeplane#8482

* [VPAT-27] chore(security): disable autocomplete on sensitive input fields makeplane#8517

Disable autocomplete on authentication and security-related forms to prevent
browsers from storing sensitive credentials. This affects sign-in, password
reset, account security, and onboarding forms across admin, web, and space apps.

Modified components:
- Auth forms (email, password, unique code, forgot/reset/set password)
- Account security pages
- Instance setup and profile onboarding
- Shared UI components (auth-input, password-input)

* [WEB-5917] fix: generate clean plain text from HTML email template makeplane#8535

* [WEB-5878] chore: add validation for project name/identifier for special characters (makeplane#8529)

* chore: update ProjectSerializer to raise validation for special characters in name and identifier

* chore: update external endpoints

* fix: external api serializer validation

* update serializer to send error code

* fix: move the regex expression to Project model

* [WEB-6194]migration: added archived_at in IssueView makeplane#8641

* migration: added archived_at in IssueView

* fix: lint

* fix: IDOR Vulnerabilities in Asset & Attachment Endpoints (makeplane#8644)

* fix: idor issues in project assets and issue attachements

* fix: comments

* fix: Member Information Disclosure via Public Endpoint makeplane#8646

* chore: Add forum link and remove discord link on readme (makeplane#8655)

* Update README to remove Discord and add Forum link

Removed Discord badge and replaced Releases link with Forum link.

* Fix forum link in README.md

* fix: Update healthcheck endpoint in Dockerfile to target /spaces/ path (makeplane#8674)

* Change Dependabot update interval from weekly to daily

* [WIKI-887] fix: add scroll in heading layout (makeplane#8596)

* fix: add scroll in heading layout

* chore: remove visible scroll  bar

* fix :format

* chore: fix outline scroll

* chore: fix format

* chore: fix translation

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>

* fix: merge lists in editor (makeplane#8639)

* chore: replace prettier with oxfmt (makeplane#8676)

* fix: replace eslint with oxlint (makeplane#8677)

* fix: replace eslint with oxlint

* chore: adding max warning

* fix: formatting

* chore(deps): minimatch and rollup package vulnerabilities (makeplane#8675)

* fix: package updates

* fix: package upgrades

* fix: minimatch package vulnerabilities

* fix: ajv package vulnerabilities

* fix: lint

* fix: format

* [SILO-1028] feat: Project Summary external API (makeplane#8661)

* add project summary endpoint

* update response structure

* [WIKI-852] chore: update page version save logic (makeplane#8440)

* chore: updated the logic for page version task

* chore: updated the html variable

* chore: handled the exception

* chore: changed the function name

* chore: added a custom variable

* [WEB-5225] feat: enhance authentication logging with detailed error and info message (makeplane#7998)

* feat: enhance authentication logging with detailed error and info messages

- Added logging for various authentication events in the Adapter and its subclasses, including email validation, user existence checks, and password strength validation.
- Implemented error handling for GitHub OAuth email retrieval, ensuring proper logging of unexpected responses and missing primary emails.
- Updated logging configuration in local and production settings to include a dedicated logger for authentication events.

* chore: address copilot comments

* chore: addressed some additional comments

* chore: update log

* fix: lint

* [WEB-6420] chore: migrate community references from Discord to Forum (makeplane#8657)

* chore: replace Discord references with Forum links

* chore: migrate help and community CTAs from Discord to Forum

* refactor: replace Discord icons with lucide MessageSquare

* chore: rename Discord labels and keys to Forum

* chore: remove obsolete Discord icon component

* chore: update Discord references to Forum in templates

* chore: code refactoring

* fix: dependabot and codeql CI

* fix: disable react-in-jsx-scope rule in oxlint config (makeplane#8682)

After makeplane#8677 replaced ESLint with OxLint, the react-in-jsx-scope rule
was not disabled. This causes all commits touching JSX files to fail
the pre-commit hook (oxlint --deny-warnings).

React 17+ uses automatic JSX runtime so explicit React imports are
not required.

Fixes makeplane#8681

* chore: space folders (makeplane#8707)

* chore: change the space folders structure

* fix: format

* chore(deps): django version upgrade

* [GIT-40]fix: apply sub-issue display filter when adding work items makeplane#8534

* [WEB-5606] fix: work item preview word break makeplane#8537

* [WIKI-892] fix: description input component re-render makeplane#8600

* [WIKI-785] refactor: editor markdown handler makeplane#8546

* [WEB-5911] fix: error outline button text color makeplane#8531

* [SECUR-116] fix: ssrf webhook url for ip address makeplane#8716

* [WEB-6420] chore: self-host social icons in project invitation email (makeplane#8718)

* chore: add self-hosted social icon assets for email templates

* chore: pass current_site to project invitation email context

* chore: replace mailinblue CDN icons with self-hosted static assets

* feat: Complete Agent and Worktrees modules

- Add Agent CRUD API and frontend
- Add Worktrees page with CRUD
- Add extended routes for /agents and /worktrees
- Add custom sidebar navigation

---------

Signed-off-by: majiayu000 <1835304752@qq.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: pratapalakshmi <137189067+pratapalakshmi@users.noreply.github.com>
Co-authored-by: b-saikrishnakanth <130811169+b-saikrishnakanth@users.noreply.github.com>
Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com>
Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
Co-authored-by: Vipin Chaudhary <VipinChaudhary1809@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
Co-authored-by: Dheeraj Kumar Ketireddy <dheeraj.ketireddy@plane.so>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: Aaron <lifeiscontent@users.noreply.github.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>
Co-authored-by: pushya22 <130810100+pushya22@users.noreply.github.com>
Co-authored-by: Pushya Mitra Thiruvooru <pushya@Pushyas-MacBook-Pro.local>
Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com>
Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com>
Co-authored-by: gakshita <akshitagoyal1516@gmail.com>
Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com>
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>
Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com>
Co-authored-by: Sangeetha <sangeethailango21@gmail.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>
Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com>
Co-authored-by: Shaikh Naasir <yoursdeveloper@protonmail.com>
Co-authored-by: lif <1835304752@qq.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: vamsikrishnamathala <matalav55@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
Co-authored-by: yy <yhymmt37@gmail.com>
Co-authored-by: punto <119956578+AshrithSathu@users.noreply.github.com>
Co-authored-by: Ship it <161483884+vcscroll@users.noreply.github.com>
Co-authored-by: Akshat Jain <akshatjain9782@gmail.com>
Co-authored-by: stelmsk <151884118+stelmsk@users.noreply.github.com>
Co-authored-by: Cornelius <70640137+conny3496@users.noreply.github.com>
Co-authored-by: Vihar Kurama <vihar.kurama@gmail.com>
Co-authored-by: Saurabh Kumar <70131915+Saurabhkmr98@users.noreply.github.com>
Co-authored-by: darkingtail <51188676+darkingtail@users.noreply.github.com>
Co-authored-by: Claude Code <claude@anthropic.com>
AbstractBike added a commit to AbstractBike/plane that referenced this pull request Apr 2, 2026
* fix: editor sync changes (#8306)

* chore: upate function declarations

* chore: formatted files

* chore: fix/check tooling improvements with turbo (#8304)

* fix: broken lock file

* chore: add Plane sync label to github templates #8303

Co-authored-by: Pushya Mitra Thiruvooru <pushya@Pushyas-MacBook-Pro.local>

* [WEB-5624] chore: added webhook translations #8312

* chore(deps): upgrade next themes package

* [WEB-5654]fix: custom select selection and dropdown close #8324

* [WEB-5124] chore: intake work item toast enhancements (#8329)

* [WEB-5647] chore: list layout work item identifier enhancements (#8326)

* chore: file formating

* [WEB-5650] feat: Enable Gitea OAuth configuration  (#8325)

* feat: implement OAuth configuration helper and integrate into auth forms

* fix: ensure OAuth providers are disabled by default if not configured

* [WEB-5602] feat: new design system (#8220)

* chore: init tailwind v4

* chore: update all configs

* chore: add source to parse monorepo packages

* chore: combine all css files

* feat: added extended colors

* chore: update typography

* chore: update extended color var names

* refactor: remove initial spacing variable and update dark mode selector

* chore: update css files

* chore: update animations

* chore: remove spacing tokens

* fix: external css files

* chore: update tailwind-merge version

* chore: update font family

* chore: added brief agents.md and story for new design system

* chore: enhance design system documentation with rare exceptions for visual separation

* chore: add fontsource package for typography

* chore: material symbols font added

* chore: update shadow default

* chore: add stroke and outline theme vars

* chore: update ring and fill colors

* chore: overwrite tailwind typography tokens

* chore: add high contrast mode tokens

* chore: update scrollbar colors

* chore: backward compatibility for buttons and placeholders

* chore: add priority colors

* chore: update urgent priority color

* chore: update plan colors

* chore: add missing utility class

* chore: update height and padding classes

* chore: update label colors

* chore: add missing utlity

* chore: add typography plugin to space app

* chore: replace existing classNames with new design system tokens #8244 (#8278)

* chore: update border colors

* chore: update all borders

* chore: update text colors

* chore: update css variables

* chore: update font sizes and weights

* chore: update bg colors

* chore: sync changes

* fix: uncomment spacing-1200 variable in variables.css

* chore: update primary colors

* refactor: updated border to border-subtle

* refactor: update various components and improve UI consistency across the application

* updated classnames

* updated classnames

* refactor: update color-related class names to use new design system variables for consistency

* chore: default automations

* chore: update text sizes

* chore: home and power k

* chore: home and power k

* chore: replace ui package button components

* chore: update text sizes

* chore: updated issue identifier (#8275)

* refactor: top navigation and sidebar design token (#8276)

* chore: update all button components (#8277)

* chore: new button component

* chore: update existing buttons

* chore: overwrite tailwind typography tokens

* fix: twMerge config + fixed cn instances

* refactor: toast design token updated (#8279)

* chore: update existing buttons

* chore: tooltip design token updatged (#8280)

* chore: moved cn utility to propel (#8281)

* chore: update space app UI (#8285)

* chore; update space app filters component

* fix: button whitespace wrap

* chore: space app votes

* chore: update dropdown components

* refactor: auth, onboarding, sidebar, and common component design token migration (#8291)

* chore: checkbox component design token updated

* chore: indicator and oauth component design token updated

* chore: sidebar design token updated

* chore: auth and onboarding design token updated

* chore: update divider color

* style: update background colors and hover effects across list components

* fix: tailwind merge

* refactor: toggle switch design token migration and header utility classname added (#8295)

* chore: toggle component design token updated

* chore: h-header utility class added

* chore: updated color tokens for work item detail page (#8296)

* chore: update react-day-picker UI

* refactor: update button sizes and styles in filters components

* refactor: breadcrumbs design token updated (#8297)

* chore: update priority icon colors

* refactor: updated layout variables

* chore: update plan card primary CTA

* Chore update editor design system (#8299)

* refactor: update styles for callout, color selector, logo selector, and image uploader

* refactor:fix image

* chore: update settings UI

* chore: updated notifications color and size tokens (#8302)

* chore: update sm button border radius

* fix: logo renderer

* chore: icon button component

* chore: remove deprecated classes

* chore: remove deprecated classes

* chore: update editor list spacing

* fix: icon button size

* chore: improvements (#8309)

* chore: update cycles and modules pages

* refactor: update background styles across various components to use new design system colors

* fix: button type errors

* chore: update modals design system (#8310)

* refactor: callout bg

* refactor: code  bg

* refactor: modal size and variant

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>

* chore: update next-themes

* design: update billing and plans component styles and remove unused utility functions (#8313)

* refactor: empty state design token migration and improvements (#8315)

* fix: profile page

* refactor: tabs design token updated (#8316)

* chore: updated buttons and tokens for work items (#8317)

* fix: adjust trial button spacing in checkout modal

* chore: update add button hover state

* fix: type error (#8318)

* fix: type error

* chore: code refactor

* refactor: update button sizes and background styles in rich filters components

* refactor: update editor bg

* refactor: enhance Gantt chart sidebar functionality and styling

- Removed unused  prop from .
- Updated  to include new props for better block management and scrolling behavior.
- Improved auto-scroll functionality for Gantt chart items.
- Adjusted styles in  component for consistent design.

* regression: gantt design

* chore: new badge component

* fix: favorite star

* chore: update backgroung, typography and button sizes across workspace settings general and members pages

* fix: header button sizes

* fix: emoji icon logo (#8323)

* more fixes

* chore: update settings sidebar

* refactor: avatar component

* chore: updated work item detail sidebar (#8327)

* refactor: update link preview

* fix: work item property dropdowns

* fix: dropdown buttons border radius

* chore: update power k translation

* chore: updated profile activity design (#8328)

* chore: update settings pages

* chore: update work item sidebar alignments (#8330)

* refactor: admin design system

* chore: update page header

---------

Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com>
Co-authored-by: VipinDevelops <vipinchaudhary1809@gmail.com>
Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: gakshita <akshitagoyal1516@gmail.com>
Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com>
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>

* fix: formatting

* reexport types

* fix: lint error

---------

Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com>
Co-authored-by: VipinDevelops <vipinchaudhary1809@gmail.com>
Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: gakshita <akshitagoyal1516@gmail.com>
Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com>
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>

* [WEB-5668] fix: add fetchWorkspaceLevelProjectEntities method and update project-related fetch keys (#8347)

* [SILO-783] feat: added porters and new serializer based exporter (#8335)

* [WEB-5699] refactor: update styling and classnames of charts according to new design system (#8345)

* refactor: update styling and class names according to new design system in charts

* refactor: clean up

* feat: custom theming enhancements (#8342)

* [WEB-5671] chore: settings workspace members enhancements #8346

* [WEB-5666] chore: set project timezone same as workspace timezone in project (#8340)

* [WEB-5614] fix: new design system consistency (#8351)

* chore: tooltip enhancements

* chore: project card enhancements

* chore: work item card enhancements

* chore: update component styles and class names for consistency across the application

---------

Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>

* [WEB-5708] regression: remove material icon instances from the Space app (#8353)

* chore: sync changes (#8343)

* [WEB-5614] chore: work item detail and list layout enhancements #8355

* regression: replace old css vars with the new design system tokens (#8354)

* chore: replace old css vars

* fix: replace shadow and primary colors

* chore: remove hardcoded colors

* [WEB-5614] chore: custom theme on colour improvement #8356

* [WEB-5732] style: update work item detail properties UI (#8357)

* [WEB-5730] fix: user mention colors #8358

* [WEB-5614] fix: empty state and padding token fixes (#8359)

* [WEB-5614] chore: update component styles and class names for consistency across projects #8360

* [WEB-5614] chore: logo and icon enhancements #8362

* fix: work item property icon renderer (#8363)

* [WEB-5614] fix: sidebar and label dropdown #8364

* fix: material icons font file (#8366)

* [WEB-5614] chore: lucide icon code refactor #8365

* fix: nested context menu UI (#8367)

* [WEB-5708] style: space app kanban card UI (#8368)

* [WEB-5742] fix: input field background #8369

* [WEB-5641] chore: sub work item quick menu padding #8370

* chore: replace old classNames (#8372)

* chore: update component styles and class names for consistency across the application (#8376)

* [WEB-5660] [WEB-5737] fix: cycle and module sidebar #8375

* [WEB-5676] style: gantt column outline #8374

* [WEB-5614] chore: platform design token enhancements (#8373)

* [WEB-5649] [WEB-5675] fix: local font files #8377

* [WEB-5614] chore: primitive token updated (#8378)

* fix: tooltip imports (#8379)

* [WEB-5614] chore: platform header and breadcrumb enhancements (#8383)

* [WEB-5652] fix: kanban quick add UI #8382

* [WEB-5726] fix: showing an empty state on deleted work item link #8381

* fix: space app default background (#8384)

* [WIKI-849] feat: debounce for mention search (#8380)

* fix: font imports (#8387)

* chore: platform layout enhancements (#8386)

* fix: image uploader bg in light mode (#8385)

* [WEB-5614] refactor: update styling and structure across various components (#8388)

* fix: input fields bg (#8389)

* fix: custom z-index classNames (#8395)

* [WEB-5454] fix: optimize date validation logic in CycleCreateUpdateModal #8394

* [WEB-5614] chore: work item detail comment and sidebar enhancements (#8397)

* [WEB-5675] chore: implement `fontsource` as the fonts library (#8398)

* [WEB-5762] fix: workitem detail sidebar properties design consistency (#8400)

* [WEB-5761]fix: intake spacing issue (#8399)

* [WEB-5614] chore: sidebar enhancement #8401

* [WEB-5768]chore: updated comment UI #8402

* [WEB-5614] chore: package and layout enhancements #8403

* chore: update storybook dependency

* [WEB-5657] feat: add synchronization configuration for multiple providers in authentication adapter  (#8336)

* feat: add sync functionality for OAuth providers

- Implemented `check_sync_enabled` method to verify if sync is enabled for Google, GitHub, GitLab, and Gitea.
- Added `sync_user_data` method to update user details, including first name, last name, display name, and avatar.
- Updated configuration variables to include sync options for each provider.
- Integrated sync check into the login/signup process.

* feat: add sync toggle for OAuth providers in configuration forms

* fix: remove default value for sync options in OAuth configuration forms

* chore: delete old avatar and upload a new one

* chore: update class method

* chore: add email nullable

* refactor: streamline sync check for multiple providers and improve avatar deletion logic

* fix: ensure ENABLE_SYNC configurations default to "0" for Gitea, Github, Gitlab, and Google forms

* fix: simplify toggle switch value handling in ControllerSwitch component

---------

Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>

* [WEB-5657] chore: synchronization configuration for multiple providers in authentication adapter #8409

* [WEB-5746]fix: workspace member modal z-index #8410

* [WEB-5773] fix: editor image full screen modal (#8413)

* [WEB-5774] fix: editor nodes background colors (#8416)

* [WEB-5776]chore: updated design system for alert modal #8415

* [WEB-5775] fix: mentions search on empty query #8417

* [WEB-5662][WEB-5770] fix: alignment of cycles in sidebar and layout selection dropdown button (#8414)

* fix: alpha colors (#8418)

* [WEB-5784] fix: truncation issue in wi properties (#8422)

* fix: update background surface 2 variables in tailwind config

* fix: improve layout and truncation handling in issue link and list items

* docs: update readme with react router badge (#8424)

Updated feature list and modified the local development section.

* [WEB-5788] fix: board layout group by icon #8426

* [WEB-5792] regression: editor font family #8427

* [WIKI-740] refactor: editor table performance (#8411)

* [WEB-5786] fix: updated font size for dates at Kanban card #8429

* [WEB-5772] fix: theme switch flicker (#8428)

* [WEB-5784] fix: truncation of links in work items (#8430)

* [WEB-5772] chore: theme switcher and editor colors enhancements (#8436)

* [WEB-5772] chore: theme switcher code refactor #8438

* chore: workspace events (#8439)

* chore: adding invite and joined events

* chore: adding workspace create and update events

* [WEB-5798] refactor: web and admin auth related components and update admin designs (#8431)

* refactor: web and admin auth related components and update admin designs.

* fix: format

* [WEB-5581] fix: resolve logo spinner hydration and theme loading issues (#8450)

- Fix hydration mismatch by lazy loading components that depend on theme
- Ensure LogoSpinner renders with correct theme on initial load

* [WEB-5791] fix: broken favicon in links (#8396)

* fix: using base url of a redirect url

* chore: internal networks check for the final_url

* fix: none final_url

* fix: exception handling

* fix: exception handling

* chore: remove unused imports

* refactor: moved ip address check logic into separate function

* fix: ValueError logic

* [WEB-5667] fix: estimate value display in analytics #8448

* [WEB-5779] fix: handle loading state while fetching project cover image (#8419)

* refactor: replace cover image handling with CoverImage component across profile and project forms

* fix: extend CoverImage component to accept additional img props

* Update apps/web/core/components/common/cover-image.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: handle undefined cover image URL in ProfileSidebar component

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* [WEB-5782]chore: migrated modals to @plane/ui (#8420)

* chore: migrated modal to @plane/ui

* chore: fixed spacings

* [WEB-5808] chore: sidebar project list enhancements (#8451)

* chore: sidebar project list enhancements

* chore: code refactor

* chore: code refactor

* [WEB-5324] refactor: add Unified OAuth Configuration and Missing Gitea Options (#8050)

* refactor: add Unified OAuth Configuration and Missing Gitea Options

- Replaced the AuthenticationModes component with a more streamlined implementation using AuthenticationMethodCard.
- Removed obsolete authentication modes files from the codebase.
- Enhanced the AuthRoot component to utilize the new OAuth configuration hook for better management of authentication options.
- Updated type definitions for instance authentication modes to reflect the new structure.

* refactor: update OAuth type imports and remove obsolete types

- Replaced local type imports with centralized imports from @plane/types in core, extended, and index OAuth hooks.
- Removed the now redundant types.ts file as its definitions have been migrated.
- Enhanced type definitions for OAuth options to improve consistency across the application.

* feat: add new Gitea logo and update OAuth icon imports to use standard HTML img tags

* chore: remove unused authentication logos and upgrade button component

* [WEB-5574]chore: notification card refactor (#8234)

* chore: notification card refactor

* chore: moved base activity types to constants package

* [WEB-5804] refactor: decouple filter value types from filter configurations (#8441)

* [WEB-5804] refactor: decouple filter value types from filter configurations

Remove value type constraints from filter configurations to support
operator-specific value types. Different operators can accept different
value types for the same filter property, so value types should be
determined at the operator level rather than the filter level.

- Remove generic value type parameter from TFilterConfig
- Update TOperatorConfigMap to accept union of all value types
- Simplify filter config factory signatures across all filter types
- Add forceUpdate parameter to updateConditionValue method

* refactor: remove filter value type constraints from filter configurations

Eliminate the generic value type parameter from filter configurations to allow for operator-specific value types. This change enhances flexibility by enabling different operators to accept various value types for the same filter property.

- Updated TFilterConfig and related interfaces to remove value type constraints
- Adjusted filter configuration methods and types accordingly
- Refactored date operator support to align with the new structure

* [WEB-5785]fix: favorites icon size #8449

* [WEB-5781]chore: removed info banner for preferences #8442

* [WEB-5809] refactor: tailwind config inline variables (#8437)

* refactor: actions icon migration (#8219)

* chore: gitignore updated

* chore: check icon added to propel package

* feat: search icon migration

* chore: check icon migration

* chore: plus icon added to propel package

* chore: code refactor

* chore: plus icon migration and code refactor

* chore: trash icon added to propel package

* chore: code refactor

* chore: trash icon migration

* chore: edit icon added to propel package

* chore: new tab icon added to propel package

* chore: edit icon migration

* chore: newtab icon migration

* chore: lock icon added to propel package

* chore: lock icon migration

* chore: globe icon added to propel package

* chore: globe icon migration

* chore: copy icon added to propel package

* chore: copy icon migration

* chore: link icon added to propel package

* chore: link icon migration

* chore: link icon migration

* chore: info icon added to propel package

* chore: code refactor

* chore: code refactor

* chore: code refactor

* chore: code refactor

* regression: red and green color backgrounds (#8456)

* [WEB-5815] chore: removed the deleted states (#8457)

* Typo: database extension error message (#8461)

* [WEB-5179] chore: icon utils code refactor #8458

* [WEB-5790] feat: new email templates (#8423)

* chore: remove unused get_client_ip import (#8453)

Remove unused import `get_client_ip` from workspace/invite.py.
Identified by ruff linter (F401 error).

Signed-off-by: majiayu000 <1835304752@qq.com>

* [WEB-5822] fix: migrate ImagePickerPopover to Propel Tabs component and render only enabled tabs #8290

- Replace custom tab implementation with Propel Tabs
- Dynamically render only enabled tabs based on configuration
- Filter tabs by isEnabled property for cleaner conditional rendering
- Improve tab navigation and accessibility with Propel components

* chore: navigation preference enhancements (#8468)

* [WEB-5472] refactor: components of project creation flow (#8462)

* [WEB-857] regression: image uploader error state #8471

* [WEB-4959]chore: refactor project member page #8464

* [WEB-5472] refactor: project form #8472

* migration: added webhook version, navigation related fields and allowed_rate_limit for APIToken (#8339)

* migration: added version field in webhook

* chore: add max_length

* chore: added product tour fields

* chore: updated the migration file

* chore: removed the duplicated migration file

* chore: added allowed_rate_limit for api_tokens

* chore: changed key feature tour to product tour

* chore: added is_subscribed_to_changelog field

---------

Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>

* fix: correct spelling error in database.ts log message (#8452)

Fix "convertion" -> "conversion" in error log message.

Signed-off-by: majiayu000 <1835304752@qq.com>

* [WEB-5598] refactor: streamline object creation in workspace seed task and improve error handling in workspace creation #8264

* chore: remove posthog events (#8465)

* chore: remove posthog events

* chore: remove event tracking

* chore: lint errors

* chore: minor changes based on comments

* fix: type errors

* Revert "[WEB-4959]chore: refactor project member page #8464" (#8476)

This reverts commit c97e41851530fbb0426c542fa8739ab95218f8a5.

* chore: remove unused right sidebar component and clean up workspace member settings (#8477)

* [WEB-5537]refactor: rename IssueUserProperty to ProjectUserProperty and update related references  (#8206)

* refactor: rename IssueUserProperty to ProjectUserProperty and update related references across the codebase

* migrate: move issue user properties to project user properties and update related fields and constraints

* refactor: rename IssueUserPropertySerializer and IssueUserDisplayPropertyEndpoint to ProjectUserPropertySerializer and ProjectUserDisplayPropertyEndpoint, updating all related references

* fix: enhance ProjectUserDisplayPropertyEndpoint to handle missing properties by creating new entries and improve response handling

* fix: correct formatting in migration for ProjectUserProperty model options

* migrate: add migration to update existing non-service API tokens to remove workspace association

* migrate: refine migration to update existing non-service API tokens by excluding bot users from workspace removal

* chore: changed the project sort order in project user property

* chore: remove allowed_rate_limit from APIToken

* chore: updated user-properties endpoint for frontend

* chore: removed the extra projectuserproperty

* chore: updated the migration file

* chore: code refactor

* fix: type error

---------

Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: sangeethailango <sangeethailango21@gmail.com>
Co-authored-by: vamsikrishnamathala <matalav55@gmail.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>

* [WIKI-826] chore: add unique id as key to logo selector (#8494)

* [VPAT-50] chore(security): add X-Frame-Options header to nginx configuration to prevent clickjacking attacks (#8507)

* [VPAT-50] chore(security): add X-Frame-Options header to nginx configuration to prevent clickjacking attacks

* [SECURITY] chore: enhance nginx configuration with additional security headers

* chore: updated migration file name (#8515)

* chore(deps): react router upgraded

* [WEB-5890] migration: added getting_started_checklist, tips, explored_feature fields on the workspace member table (#8489)

* migration: added getting_started_checklist and tips field

* fix: remove defaults and added explored_features field

* fix: added user table migration

* [WEB-5907] fix: magic code sign-in at Space app. #8552

* [WIKI-735] fix: table insert handle z-index #8545

* [WEB-5898] chore: update tailwind config #8516

* chore(deps): bump lodash-es in the npm_and_yarn group across 1 directory (#8573)

Bumps the npm_and_yarn group with 1 update in the / directory: [lodash-es](https://github.com/lodash/lodash).


Updates `lodash-es` from 4.17.21 to 4.17.23
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23)

---
updated-dependencies:
- dependency-name: lodash-es
  dependency-version: 4.17.23
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* [WEB-5845] chore: changing description field to description json (#8230)

* chore: migrating description to description json

* chore: replace description with description_json

* chore: updated migration file

* chore: updated the migration file

* chore: added description key in external endpoint

* chore: updated the migration file

* chore: updated the typo

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>

* chore: fix typos in comments (#8553)

* [GIT-61] chore: allow .md files to be uploaded (#8571)

* chore: allow .md files to be uploaded

* chore: allow .md files to be uploaded

* [WEB-5860] [WEB-5861] [WEB-5862] style: improved settings interface (#8520)

* style: improved profile settings

* chore: minor improvements

* style: improved workspace settings

* style: workspace settings content

* style: improved project settings

* fix: project settings flat map

* chore: add back navigation from settings pages

* style: settings content

* style: estimates list

* refactor: remove old code

* refactor: removed unnecessary line breaks

* refactor: create a common component for page header

* chore: add fade-in animation to sidebar

* fix: formatting

* fix: project settings sidebar header

* fix: workspace settings sidebar header

* fix: settings content wrapper scroll

* chore: separate project settings features

* fix: formatting

* refactor: custom theme selector

* refactor: settings headings

* refactor: settings headings

* fix: project settings sidebar padding

* fix: sidebar header padding

* fix: sidebar item permissions

* fix: missing editable check

* refactor: remove unused files

* chore: remove unnecessary code

* chore: add missing translations

* fix: formatting

* [GIT-45] fix: allow markdown file attachments (#8524)

* fix: allow markdown file attachments

- Add text/markdown to ATTACHMENT_MIME_TYPES
- Fixes issue where .md files were rejected with 'Invalid file type' error

* added the support for frontend mime type too

* fix: node view renders (#8559)

* fix node renders

* fix handlers

* fix: duplicate id

* fix: pdf export (#8564)

* feat: pdf export

* fix: tests

* fix: tests

---------

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>

* migration: back migrate all product tour fields to set true (#8575)

* [GIT-66] improvement: prevent disabling last enabled authentication method (#8570)

* fully translated into Ukrainian language (#8579)

* chore:  add copyright (#8584)

* feat: adding new copyright info on all files

* chore: adding CI

* fix: module percentage calculation (#8595)

* fix: file fomatting

* [SECUR-113] fix: ssrf for work item links (#8607)

* [SECUR-104] fix: Arbitrary Modification of API Token Rate Limits#8612

* chore(deps): upgrade django version

* [WEB-6058] chore : add logic to handle save#8614

* chore(deps): update the node pacakges

* fix: type fix for description payload (#8619)

* fix: type fix

* fix: duplicate type fix

* chore(deps): update lodash package

* [WEB-6149] migration: change estimate point key max value to 50 #8620

* fix: remove ee folder from web (#8622)

* chore: merge constants and services (#8623)

* fix: remove constants and services

* fix: formatting

* fix: types check

* chore: merge helpers and layouts (#8624)

* fix: remove constants and services

* fix: formatting

* chore: merge helpers and layouts

* fix: workspace disbale flag handling

* chore(deps): bump cryptography (#8625)

Bumps the pip group with 1 update in the /apps/api/requirements directory: [cryptography](https://github.com/pyca/cryptography).


Updates `cryptography` from 44.0.1 to 46.0.5
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/44.0.1...46.0.5)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.5
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* style: update ASCII art in install script header (#8628)

* [WEB-6038] fix: work item empty title flicker #8618

* fix: workitem description input inital load (#8617)

* [WEB-6137] fix: work item peek view outside click #8610

* [SECUR-105] fix: csv injection vulnerability sanitization #8611

* [WIKI-877] fix: order of this dropdown options in pages #8563

* [WEB-5899]fix: project sort order (#8530)

* fix: project sort order

* chore: updated queryset for sort_order

* chore: admin folder structure (#8632)

* chore: admin folder structure

* fix: copy right check and formatting

* fix: types

* i18n(ru): expand Russian translation coverage (#8603)

Added missing translations for:
- Profile preferences (language, timezone settings)
- Account settings sections (preferences, notifications, security, api-tokens, activity)
- Workspace settings (billing, exports, webhooks headings/descriptions)
- Project settings (states, labels, estimates, automations headings/descriptions)
- Power-K command palette (contextual actions, navigation, creation, preferences, help)
- Sidebar elements (stickies, your_work, pin/unpin)
- Common actions (copy_markdown, overview)
- Navigation customization options

* chore(deps): update axios dependency

* [GIT-57 | WEB-5912] fix: app sidebar ux and responsiveness (#8560)

* fix: project extended sidebar accordion ux

* fix: app sidebar mobile responsiveness ux

* chore: code refactor

* refactor: table drag preview using decorations (#8597)

* refactor: table drag preview using decorations

* fix: history meta for table drag state

* [WEB-5884] chore: layout loader enhancements #8500

* [WEB-1201] chore: dropdown options hierarchy improvements (#8501)

* chore: sortBySelectedFirst and sortByCurrentUserThenSelected utils added

* chore: members dropdown updated

* chore: module dropdown updated

* chore: project and label dropdown updated

* chore: code refactor

* [GIT-44] refactor(auth): add PASSWORD_TOO_WEAK error code (#8522)

* refactor(auth): add PASSWORD_TOO_WEAK error code and update related error handling in password change flow

* fix(auth): update import to use type for EAuthenticationErrorCodes in security page

* Update apps/web/app/(all)/profile/security/page.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/security/page.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* refactor: updated auth error exception accross zxcvbn usages

* fix: improve error handling for password strength validation and update error messages

* i18n(ru): update Russian translations for stickies and automation description

Added translation for 'stickies' and improved formatting of the automation description in Russian locale.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update translations.ts: issue-artifacts discoverd (#7979)

* [WEB-5873] fix: user avatar ui consistency (#8495)

* fix: user avatar ui consistency

* chore: code refactor

* [SILO-820] fix: update serializer for module detail API endpoint to use ModuleUpdateSerializer (#8496)

* [VPAT-51] fix: update workspace invitation flow to use token for validation #8508

- Modified the invite link to include a token for enhanced security.
- Updated the WorkspaceJoinEndpoint to validate the token instead of the email.
- Adjusted the workspace invitation task to generate links with the token.
- Refactored the frontend to handle token in the invitation process.

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>

* [WEB-5871] chore: added intake count for projects (#8497)

* chore: add intake_count in project list endpoint

* chore: sidebar project navigation intake count added

* fix: filter out closed intake issues in the count

* chore: code refactor

* chore: code refactor

* fix: filter out deleted intake issues

---------

Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>

* [WEB-5829] fix: Intake open work count (#8547)

* fix: open intake count at sidebar header

* chore: reverted inbox store arguments to core store

* fix: intake count update

* [WEB-5863] fix: estimate point input validation #8492

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>

* [VPAT-55] chore(security): implement input validation across authentication and workspace forms (#8528)

* chore(security): implement input validation across authentication and workspace forms

  - Add OWASP-compliant autocomplete attributes to all auth input fields
  - Create centralized validation utilities blocking injection-risk characters
  - Apply validation to names, display names, workspace names, and slugs
  - Block special characters: < > ' " % # { } [ ] * ^ !
  - Secure sensitive input fields across admin, web, and space apps

* chore: add missing workspace name validation to settings and admin forms

* feat: enhance validation regex for international names and usernames

- Updated regex patterns to support Unicode characters for person names, display names, company names, and slugs.
- Improved validation functions to block injection-risk characters in names and slugs.

* [VPAT-16] improvement: add file validation to prevent malicious uploads #8493

Add client-side checks for double extensions, dangerous file types,
dot files, and path traversal patterns. Addresses security audit
recommendations for file upload validation.

* [WEB-5827] fix: persist external cover image URLs (Unsplash) in project updates #8482

* [VPAT-27] chore(security): disable autocomplete on sensitive input fields #8517

Disable autocomplete on authentication and security-related forms to prevent
browsers from storing sensitive credentials. This affects sign-in, password
reset, account security, and onboarding forms across admin, web, and space apps.

Modified components:
- Auth forms (email, password, unique code, forgot/reset/set password)
- Account security pages
- Instance setup and profile onboarding
- Shared UI components (auth-input, password-input)

* [WEB-5917] fix: generate clean plain text from HTML email template #8535

* [WEB-5878] chore: add validation for project name/identifier for special characters (#8529)

* chore: update ProjectSerializer to raise validation for special characters in name and identifier

* chore: update external endpoints

* fix: external api serializer validation

* update serializer to send error code

* fix: move the regex expression to Project model

* [WEB-6194]migration: added archived_at in IssueView #8641

* migration: added archived_at in IssueView

* fix: lint

* fix: IDOR Vulnerabilities in Asset & Attachment Endpoints (#8644)

* fix: idor issues in project assets and issue attachements

* fix: comments

* fix: Member Information Disclosure via Public Endpoint #8646

* chore: Add forum link and remove discord link on readme (#8655)

* Update README to remove Discord and add Forum link

Removed Discord badge and replaced Releases link with Forum link.

* Fix forum link in README.md

* fix: Update healthcheck endpoint in Dockerfile to target /spaces/ path (#8674)

* Change Dependabot update interval from weekly to daily

* [WIKI-887] fix: add scroll in heading layout (#8596)

* fix: add scroll in heading layout

* chore: remove visible scroll  bar

* fix :format

* chore: fix outline scroll

* chore: fix format

* chore: fix translation

---------

Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>

* fix: merge lists in editor (#8639)

* chore: replace prettier with oxfmt (#8676)

* fix: replace eslint with oxlint (#8677)

* fix: replace eslint with oxlint

* chore: adding max warning

* fix: formatting

* chore(deps): minimatch and rollup package vulnerabilities (#8675)

* fix: package updates

* fix: package upgrades

* fix: minimatch package vulnerabilities

* fix: ajv package vulnerabilities

* fix: lint

* fix: format

* [SILO-1028] feat: Project Summary external API (#8661)

* add project summary endpoint

* update response structure

* [WIKI-852] chore: update page version save logic (#8440)

* chore: updated the logic for page version task

* chore: updated the html variable

* chore: handled the exception

* chore: changed the function name

* chore: added a custom variable

* [WEB-5225] feat: enhance authentication logging with detailed error and info message (#7998)

* feat: enhance authentication logging with detailed error and info messages

- Added logging for various authentication events in the Adapter and its subclasses, including email validation, user existence checks, and password strength validation.
- Implemented error handling for GitHub OAuth email retrieval, ensuring proper logging of unexpected responses and missing primary emails.
- Updated logging configuration in local and production settings to include a dedicated logger for authentication events.

* chore: address copilot comments

* chore: addressed some additional comments

* chore: update log

* fix: lint

* [WEB-6420] chore: migrate community references from Discord to Forum (#8657)

* chore: replace Discord references with Forum links

* chore: migrate help and community CTAs from Discord to Forum

* refactor: replace Discord icons with lucide MessageSquare

* chore: rename Discord labels and keys to Forum

* chore: remove obsolete Discord icon component

* chore: update Discord references to Forum in templates

* chore: code refactoring

* fix: dependabot and codeql CI

* fix: disable react-in-jsx-scope rule in oxlint config (#8682)

After #8677 replaced ESLint with OxLint, the react-in-jsx-scope rule
was not disabled. This causes all commits touching JSX files to fail
the pre-commit hook (oxlint --deny-warnings).

React 17+ uses automatic JSX runtime so explicit React imports are
not required.

Fixes #8681

* chore: space folders (#8707)

* chore: change the space folders structure

* fix: format

* chore(deps): django version upgrade

* [GIT-40]fix: apply sub-issue display filter when adding work items #8534

* [WEB-5606] fix: work item preview word break #8537

* [WIKI-892] fix: description input component re-render #8600

* [WIKI-785] refactor: editor markdown handler #8546

* [WEB-5911] fix: error outline button text color #8531

* [SECUR-116] fix: ssrf webhook url for ip address #8716

* [WEB-6420] chore: self-host social icons in project invitation email (#8718)

* chore: add self-hosted social icon assets for email templates

* chore: pass current_site to project invitation email context

* chore: replace mailinblue CDN icons with self-hosted static assets

* [WIKI-874] refactor: description input component (#8544)

* refactor: description input component

* fix: add missing prop to rich text editor

* chore(deps): bump python-json-logger from 3.3.0 to 4.0.0 in /apps/api (#8692)

Bumps [python-json-logger](https://github.com/nhairs/python-json-logger) from 3.3.0 to 4.0.0.
- [Release notes](https://github.com/nhairs/python-json-logger/releases)
- [Changelog](https://github.com/nhairs/python-json-logger/blob/main/docs/changelog.md)
- [Commits](https://github.com/nhairs/python-json-logger/compare/v3.3.0...v4.0.0)

---
updated-dependencies:
- dependency-name: python-json-logger
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump pytest from 7.4.0 to 9.0.2 in /apps/api (#8693)

Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.0 to 9.0.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.0...9.0.2)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 9.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* [WEB-6599] feat: instance not ready ui revamp (#8755)

* feat: instance not ready ui revamp

* chore: code refactoring

* chore: code refactoring

* chore(deps): upgrade the undici and flatted versions

* [WEB-6610] Fix work item drag handle hover gap (#8759)

* [WEB-6610] Fix work item drag handle hover gap

Amp-Thread-ID: https://ampcode.com/threads/T-019ce703-e30e-769b-9436-a7f5506e8a6c
Co-authored-by: Amp <amp@ampcode.com>

* fix: use p-0! pl-6! for correct drag handle hover area

Amp-Thread-ID: https://ampcode.com/threads/T-019ce703-e30e-769b-9436-a7f5506e8a6c
Co-authored-by: Amp <amp@ampcode.com>

* fix: update containerClassName to -ml-6 border-none p-0! pl-6!

Amp-Thread-ID: https://ampcode.com/threads/T-019ce703-e30e-769b-9436-a7f5506e8a6c
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>

* chore(deps): bump the actions group across 1 directory with 11 updates (#8741)

Bumps the actions group with 11 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/checkout](https://github.com/actions/checkout) | `4` | `6` |
| [makeplane/actions](https://github.com/makeplane/actions) | `1.0.0` | `1.4.0` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4` | `7` |
| [softprops/action-gh-release](https://github.com/softprops/action-gh-release) | `2.1.0` | `2.5.0` |
| [actions/setup-node](https://github.com/actions/setup-node) | `4` | `6` |
| [actions/setup-go](https://github.com/actions/setup-go) | `5` | `6` |
| [docker/login-action](https://github.com/docker/login-action) | `3` | `4` |
| [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | `3` | `4` |
| [docker/build-push-action](https://github.com/docker/build-push-action) | `6.9.0` | `7.0.0` |
| [tailscale/github-action](https://github.com/tailscale/github-action) | `2` | `4` |
| [actions/cache](https://github.com/actions/cache) | `4` | `5` |



Updates `actions/checkout` from 4 to 6
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

Updates `makeplane/actions` from 1.0.0 to 1.4.0
- [Release notes](https://github.com/makeplane/actions/releases)
- [Commits](https://github.com/makeplane/actions/compare/v1.0.0...v1.4.0)

Updates `actions/upload-artifact` from 4 to 7
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)

Updates `softprops/action-gh-release` from 2.1.0 to 2.5.0
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2.1.0...v2.5.0)

Updates `actions/setup-node` from 4 to 6
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)

Updates `actions/setup-go` from 5 to 6
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v5...v6)

Updates `docker/login-action` from 3 to 4
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v3...v4)

Updates `docker/setup-buildx-action` from 3 to 4
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4)

Updates `docker/build-push-action` from 6.9.0 to 7.0.0
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6.9.0...v7.0.0)

Updates `tailscale/github-action` from 2 to 4
- [Release notes](https://github.com/tailscale/github-action/releases)
- [Commits](https://github.com/tailscale/github-action/compare/v2...v4)

Updates `actions/cache` from 4 to 5
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: makeplane/actions
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: softprops/action-gh-release
  dependency-version: 2.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/setup-go
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: docker/login-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: docker/setup-buildx-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: docker/build-push-action
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: tailscale/github-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: remove chat support component

* fix: added workspace member check in allow permission for creator #8778

* fix: package updates

* fix: remove unused imports and variables (part 1 — packages & non-web-core) (#8751)

* fix: remove unused imports and variables (part 1)

Resolve oxlint no-unused-vars warnings in packages/*, apps/admin,
apps/space, apps/live, and apps/web (non-core).

* fix: resolve CI check failures

* fix: resolve check:types failures

* fix: resolve check:types and check:format failures

- Use destructuring alias for activeCycleResolvedPath
- Format propel tab-navigation file

* fix: format propel button helper with oxfmt

Reorder Tailwind classes to match oxfmt canonical ordering.

* fix: remove unused imports and variables (part 2 — web/core non-issues) (#8752)

* fix: remove unused imports and variables (part 2)

Resolve oxlint no-unused-vars warnings in apps/web/core/
(excluding components/issues/).

* fix: resolve CI check failures

* fix: resolve check:types failures

* fix: remove unused imports and variables (part 3) (#8753)

Resolve oxlint no-unused-vars warnings in
apps/web/core/components/issues/.

* fix: removed unused files

* chore: remove service token endpoint which is unused (#8797)

* fix: broken lockfile

* fix: add model_activity.delay() to API issue update/create paths for webhook dispatch (#8792)

Fixes #6746

API-driven issue updates (PUT update, PUT create-via-upsert, PATCH) were
missing `model_activity.delay()` calls, so webhooks were never dispatched
for changes made through the API. The web UI paths already include these
calls (e.g. in `post()` at L475), but the `put()` and `partial_update()`
methods only called `issue_activity.delay()`.

This adds `model_activity.delay()` immediately after each existing
`issue_activity.delay()` in these three code paths, using the same
signature as the existing call in `post()`.

Tested on Plane CE v1.2.1 self-hosted: API PATCH triggers
`webhook_send_task` in the Celery worker, confirming webhook delivery.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* [WEB-6702] feat: redesign intake action buttons and use design tokens (#8801)

* feat: intake action buttons redesign

* chore: code refactoring

* Open [WEB-6739] fix: color inside of active projects of analytics overview tab #8803

* [WEB-6734] fix: circular progress indicator stroke color#8802

* fix: migrate page navigation pane tabs from headless ui to propel (#8805)

* chore(deps): bump requests (#8804)

Bumps the pip group with 1 update in the /apps/api/requirements directory: [requests](https://github.com/psf/requests).


Updates `requests` from 2.32.4 to 2.33.0
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.32.4...v2.33.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.33.0
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: tsdown watch (#8813)

closes #8791

* [WEB-6762] fix: missing profile icons for recent activities on "Your Work" Page #8812

* [WEB-6763] fix: date range dropdown clipped in sub-issues list #8809

* [WEB-6783] fix: crash when deleting work item from peek view in workspace spreadsheet (#8821)

* fix: guard against undefined issue in SpreadsheetIssueRow

* fix: add defensive guard for isIssueNew in list block-root

* chore(deps): bump cryptography (#8819)

Bumps the pip group with 1 update in the /apps/api/requirements directory: [cryptography](https://github.com/pyca/cryptography).


Updates `cryptography` from 46.0.5 to 46.0.6
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/46.0.5...46.0.6)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.6
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* [SILO-1087] feat: add IssueRelations external API (#8763)

* add IssueRelations external API

* update serializer methods and filter by slug

* [SILO-1026] feat: add estimates external API endpoints (#8664)

* add project summary endpoint

* update response structure

* add estimates external API endpoints with migrations

* fix invalid project and workspace error

* [WEB-6794] fix: align profile cover update with correct unsplash and upload handling (#8830)

* fix: profile cover update

* chore: code refactoring

* chore: code refactoring

* chore(deps): update dependency overrides (#8831)

Update brace-expansion override from 2.0.2 to 5.0.5 and add picomatch,
yaml@1, and yaml@2 overrides to pin transitive dependency versions.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore(deps): replace dotenvx with dotenv and update overrides (#8832)

* chore(deps): replace dotenvx with dotenv and update dependency overrides

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: sort devDependencies in package.json files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: version bump

* fix: scope IssueBulkUpdateDateEndpoint query to workspace and project (#8834)

The bulk update date endpoint fetched issues by ID without filtering
by workspace or project, allowing any authenticated project member to
modify start_date and target_date of issues in any workspace/project
across the entire instance (IDOR - CWE-639).

Scoped the query to include workspace__slug and project_id filters,
consistent with other issue endpoints in the codebase.

Ref: GHSA-4q54-h4x9-m329

* chore: adding traget commit sha for the github release

* [INFRA-346] chore: remove artifacts.plane.so references from community deployments (#8836)

* chore: Intake snooze modal width

* [INFRA-351] fix: correct directory and command for space program in supervisor.conf #8838

* [WEB-6813] fix: module not associated when accepting intake work items (#8839)

* fix: intake module association on accept

* chore: code refactoring

* chore: add ops/ — NixOS module + obs + hooks

---------

Signed-off-by: majiayu000 <1835304752@qq.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
Co-authored-by: Aaron <lifeiscontent@users.noreply.github.com>
Co-authored-by: pushya22 <130810100+pushya22@users.noreply.github.com>
Co-authored-by: Pushya Mitra Thiruvooru <pushya@Pushyas-MacBook-Pro.local>
Co-authored-by: b-saikrishnakanth <130811169+b-saikrishnakanth@users.noreply.github.com>
Co-authored-by: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com>
Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com>
Co-authored-by: VipinDevelops <vipinchaudhary1809@gmail.com>
Co-authored-by: gakshita <akshitagoyal1516@gmail.com>
Co-authored-by: Palanikannan M <akashmalinimurugu@gmail.com>
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
Co-authored-by: b-saikrishnakanth <bsaikrishnakanth97@gmail.com>
Co-authored-by: M. Palanikannan <73993394+Palanikannan1437@users.noreply.github.com>
Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com>
Co-authored-by: Sangeetha <sangeethailango21@gmail.com>
Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>
Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com>
Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Shaikh Naasir <yoursdeveloper@protonmail.com>
Co-authored-by: lif <1835304752@qq.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: vamsikrishnamathala <matalav55@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
Co-authored-by: yy <yhymmt37@gmail.com>
Co-authored-by: punto <119956578+AshrithSathu@users.noreply.github.com>
Co-authored-by: Ship it <161483884+vcscroll@users.noreply.github.com>
Co-authored-by: Akshat Jain <akshatjain9782@gmail.com>
Co-authored-by: stelmsk <151884118+stelmsk@users.noreply.github.com>
Co-authored-by: Cornelius <70640137+conny3496@users.noreply.github.com>
Co-authored-by: Dheeraj Kumar Ketireddy <dheeraj.ketireddy@plane.so>
Co-authored-by: Vihar Kurama <vihar.kurama@gmail.com>
Co-authored-by: Saurabh Kumar <70131915+Saurabhkmr98@users.noreply.github.com>
Co-authored-by: darkingtail <51188676+darkingtail@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: ouchan <111338754+ouchanip@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants