Skip to content

feat: add Persian language support (#6786) #6791

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from

Conversation

mmkhak
Copy link

@mmkhak mmkhak commented Mar 21, 2025

  • Added Persian (فارسی) to the list of supported languages.
  • Updated the TranslationStore to include Persian translations.
  • Extended TLanguage type to include "fa".

Description

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • Feature (non-breaking change which adds functionality)
  • Improvement (change that would cause existing functionality to not work as expected)
  • Code refactoring
  • Performance improvements
  • Documentation update

Screenshots and Media (if applicable)

Test Scenarios

References

Summary by CodeRabbit

  • New Features
    • Added Persian (فارسی) language support to expand the range of available languages.
    • Introduced comprehensive Persian translations for navigation elements, user authentication interfaces, notifications, and error messages, enhancing the localized user experience.
  • Style Changes
    • Adjusted various CSS class names to improve layout and visual alignment across components, including changes from left to right positioning and updates to padding and margin classes.
    • Modified border color classes for error states from red to a new color scheme, improving visual consistency in error handling.

* Added Persian (فارسی) to the list of supported languages.
* Updated the TranslationStore to include Persian translations.
* Extended TLanguage type to include "fa".
@CLAassistant
Copy link

CLAassistant commented Mar 21, 2025

CLA assistant check
All committers have signed the CLA.

Copy link
Contributor

coderabbitai bot commented Mar 21, 2025

Walkthrough

This pull request expands internationalization support by adding Persian ("fa") language to the system. The updates include adding a new entry in the supported language array, new locale JSON files that provide Persian translations for UI components, and updates to the language type definitions and the translation import method. No existing language configurations or public API declarations have been modified.

Changes

File(s) Change Summary
packages/i18n/src/constants/language.ts, packages/i18n/src/types/language.ts Added Persian ("fa") support by inserting a new language object in the supported languages array and extending the TLanguage type definition.
packages/i18n/src/locales/fa/core.json, packages/i18n/src/locales/fa/translations.json Introduced new JSON locale files containing Persian translations for UI elements such as sidebar labels, authentication fields, notifications, and error messages.
packages/i18n/src/store/index.ts Updated the TranslationStore’s importLanguageFile method to include a new switch case for Persian ("fa") and reformatted the existing Korean ("ko") case for consistency.
web/.gitignore Added entries to ignore .next and node_modules directories.
web/app/[workspaceSlug]/(projects)/... Various layout adjustments across multiple components, primarily changing margin and padding classes to shift element positions from left to right.
web/ce/components/... Multiple components updated to adjust class names for layout, primarily switching margins from left to right.
web/core/components/... Various components updated to modify class names for layout and styling, focusing on margin and padding adjustments.

Sequence Diagram(s)

sequenceDiagram
    participant User as U
    participant UI as UserInterface
    participant TS as TranslationStore
    participant FS as FileSystem

    U->>UI: Selects Persian language ("fa")
    UI->>TS: Calls importLanguageFile("fa")
    TS->>FS: Loads "fa/translations.json"
    FS-->>TS: Returns translation data
    TS-->>UI: Supplies translations to update UI
Loading

Possibly related PRs

  • chore: platform ux improvement #6555: The changes in the main PR, which involve adding a new language option and updating related translation files, are related to the changes in the retrieved PR, which also involves modifications to translation keys and their corresponding values across multiple language files. Both PRs focus on localization and language support within the application.
  • [WEB-3560] fix: table layout issue block and code refactor #6805: The changes in the main PR, which involve modifications to the layout and positioning of various elements, are related to the changes in the retrieved PR, specifically regarding the adjustments made to the Row component and its styling in the IssueRowDetails component. Both PRs focus on layout issues and involve similar modifications to class names affecting element positioning.
  • feat(translations): add Korean translation #6755: The changes in the main PR, which add Persian language support, are related to the retrieved PR that adds Korean language support, as both involve modifications to the SUPPORTED_LANGUAGES array in the language.ts file to include new language options.

Suggested labels

🌐frontend, 🌟enhancement, 🧹chore

Poem

I'm a hopping rabbit in code-filled lands,
Persian blooms now join our plans.
JSON carrots crunch with delight,
Language fields now sparkle bright.
With each new change, I skip and cheer,
Leaping ahead with a joyful twitch of my ear! 🐇

✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

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

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

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

Other keywords and placeholders

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

CodeRabbit Configuration File (.coderabbit.yaml)

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

Documentation and Community

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

Copy link
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

🧹 Nitpick comments (3)
packages/i18n/src/locales/fa/core.json (3)

76-82: Unique Code Field: Placeholder Localization Check

The unique code block provides a clear label and supporting text. However, the placeholder value "gets-sets-flys" is not localized. Please confirm if this is intentional or if it should be updated to a Persian equivalent.


83-91: General Auth Strings: Consistency and Contextual Accuracy

The remaining common authentication strings (e.g., account prompts and login actions) are clear. Note the use of "Plane" in the "new_to_plane" key; if "Plane" is a proper noun or brand name it can remain as is, otherwise consider localizing for full language consistency.


171-172: File Termination: Verify Trailing Content

The JSON file correctly closes with the "}" on line 171; however, an extra line marker ("172") appears immediately after. Please ensure that no unintended text is included in the final JSON file.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 72307ec and dc1092a.

📒 Files selected for processing (5)
  • packages/i18n/src/constants/language.ts (1 hunks)
  • packages/i18n/src/locales/fa/core.json (1 hunks)
  • packages/i18n/src/locales/fa/translations.json (1 hunks)
  • packages/i18n/src/store/index.ts (1 hunks)
  • packages/i18n/src/types/language.ts (1 hunks)
🔇 Additional comments (13)
packages/i18n/src/constants/language.ts (1)

7-7: LGTM: Persian language addition is properly implemented

The Persian language entry is added correctly with appropriate native language label "فارسی" and ISO 639-1 language code "fa".

packages/i18n/src/types/language.ts (1)

1-1: LGTM: Type definition updated correctly

The TLanguage type definition has been properly extended to include the "fa" language code for Persian.

packages/i18n/src/store/index.ts (1)

166-169: LGTM: TranslationStore updated correctly for Persian language

The case for Persian language has been properly added to the importLanguageFile method, and the indentation for the Korean language case has been adjusted for consistency.

packages/i18n/src/locales/fa/translations.json (1)

1-334: LGTM: Comprehensive Persian translations provided

The Persian translations file is well-structured and contains a comprehensive set of key-value pairs for UI elements. The translations appear to be professionally done in Persian with proper character encoding.

I notice the file includes pluralization support (line 333) which follows the correct format for internationalization.

packages/i18n/src/locales/fa/core.json (9)

1-20: Sidebar Translations: Clear and Well-Structured

The "sidebar" section is organized and the translation keys accurately describe the corresponding menu items. Ensure that these terms stay aligned with any future UI adjustments.


24-31: Email Field Translations: Accurate and Consistent

The email field’s label, placeholder, and error messages are clearly defined and appropriately localized. No issues noted in this segment.


32-75: Password Translations: Comprehensive and Consistent

The translations for the password section—including labels, placeholders, nested keys (such as for confirming, current, and new passwords), error messages, and toast notifications—are detailed and well-structured. Please verify that these messages align with the UI validation logic and user expectations for password complexity requirements.


92-115: Sign-Up Section: Clear Instructions & Verification of Empty Subheader

The sign-up block—with its header text, step-by-step instructions, and error messaging—is well-organized. The empty sub_header for the "email" step may be intentional; please double-check if additional guidance should be provided.


116-134: Sign-In Section: Adequate and Consistent Localization

The sign-in section mirrors the sign-up structure effectively and offers clear messaging for various authentication methods. The application of empty sub_headers (where applicable) appears consistent.


135-153: Forgot Password Section: Detailed and User-Friendly

This segment provides thorough instructions and feedback for recovering an account. The error messages and descriptive texts should contribute to a solid user experience during the password recovery process.


154-157: Reset Password: Direct and Focused Messaging

The reset password block offers concise instructions to prompt users towards securing their account. Confirm that this text integrates seamlessly into the recovery flow.


158-161: Set Password Section: Clear Security Communication

The set password messages clearly communicate the importance of account security. Ensure that the tone and terminology remain consistent with other areas addressing password management.


162-170: Sign-Out Feedback: Simple and Effective Error Messaging

The error message for unsuccessful sign-out attempts is straightforward and aligns with the style of other feedback messages.

mmkhak added 3 commits March 24, 2025 21:01
* Improved several Persian translation phrases for better clarity and consistency, including descriptions for account deactivation and error messages.
* Added new translation keys for project views and toast notifications to enhance user experience in the Persian language.
* Added new translation keys for sidebar items including projects, pages, and workspace to improve user experience in the Persian language.
* Updated existing translations for better clarity and consistency.
* Improved Persian translations for sidebar navigation, project views, and user notifications to enhance clarity and user experience.
* Added new translation keys and updated existing ones for consistency across the application.
Copy link
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: 21

🔭 Outside diff range comments (2)
web/core/components/analytics/custom-analytics/custom-analytics.tsx (1)

32-94: 🛠️ Refactor suggestion

Implement a proper RTL context to support Persian language.

The current changes attempt to support Persian (RTL) language by hardcoding sidebar position, but this approach will break the layout for LTR languages. To properly support both RTL and LTR languages, you should implement a direction context.

Consider implementing an RTL context approach:

  1. Create a hook to detect the current language direction:
// useLanguageDirection.ts
import { useTranslation } from 'react-i18next'; // or your i18n library

export const useLanguageDirection = () => {
  const { i18n } = useTranslation();
  const isRTL = i18n.language === 'fa' || i18n.dir() === 'rtl';
  return { isRTL, direction: isRTL ? 'rtl' : 'ltr' };
};
  1. Use this hook in your component to apply conditional styling:
const { isRTL } = useLanguageDirection();

// Then use isRTL in your className and style conditions

This way, the UI will adapt correctly based on the user's selected language.

🧰 Tools
🪛 Biome (1.9.4)

[error] 54-54: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)

web/app/profile/sidebar.tsx (1)

3-74: 🛠️ Refactor suggestion

Add language direction detection for RTL support

To properly implement RTL support for Persian while maintaining LTR layout for other languages, you need to detect the current language direction. Consider adding a directional context or hook:

import { useEffect, useRef, useState } from "react";
import { observer } from "mobx-react";
import Link from "next/link";
import { usePathname } from "next/navigation";
// icons
import {
  ChevronRight,
+ ChevronLeft,
  LogOut,
  MoveLeft,
  Plus,
  UserPlus,
  Activity,
  Bell,
  CircleUser,
  KeyRound,
  Settings2,
} from "lucide-react";
// plane imports
import { PROFILE_ACTION_LINKS } from "@plane/constants";
import { useOutsideClickDetector } from "@plane/hooks";
import { useTranslation } from "@plane/i18n";
import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui";
// components
import { SidebarNavItem } from "@/components/sidebar";
// constants
// helpers
import { cn } from "@/helpers/common.helper";
import { getFileURL } from "@/helpers/file.helper";
// hooks
import { useAppTheme, useUser, useUserSettings, useWorkspace } from "@/hooks/store";
import { usePlatformOS } from "@/hooks/use-platform-os";

Then, in your component:

// Add this line in your component to detect RTL languages
const { i18n, t } = useTranslation();
const isRTL = i18n.language === 'fa' || i18n.language === 'ar'; // Add any other RTL languages
♻️ Duplicate comments (2)
web/core/components/account/auth-forms/email.tsx (1)

56-56: ⚠️ Potential issue

Check if "border-led-500" is a valid CSS class.

The error state border has been changed from border-red-500 to border-led-500. This appears to be either a typo or a reference to a custom color that might not be defined in the system.

web/core/components/account/auth-forms/password.tsx (1)

131-131: ⚠️ Potential issue

Check if "border-led-500" is a valid CSS class and margins adjusted for RTL.

The error state border has been changed from border-red-500/50 to border-led-500/50, and margin positioning has been flipped from ml-auto to mr-auto for RTL support.

Also applies to: 137-137

🧹 Nitpick comments (28)
web/core/components/integration/github/single-user-select.tsx (1)

79-79: This change supports RTL layout for Persian language.

Changing the avatar positioning from left-0 to right-0 aligns with right-to-left (RTL) layout requirements for Persian language support. This adjustment helps maintain proper visual hierarchy in RTL reading contexts.

For more comprehensive RTL support, consider implementing a directional framework or using CSS logical properties (like inset-inline-start instead of left/right) to automatically handle direction changes based on the current language setting rather than hardcoding directional values.

web/core/components/page-views/workspace-dashboard.tsx (1)

76-76: Consider dynamic RTL/LTR positioning for language support.

Changing the tour overlay positioning from left-0 to right-0 aligns with supporting right-to-left (RTL) languages like Persian. However, this fixed positioning will affect all users regardless of their language preference.

Consider implementing a dynamic approach that adjusts positioning based on the current language direction:

-<div className="fixed right-0 top-0 z-20 grid h-full w-full place-items-center bg-custom-backdrop bg-opacity-50 transition-opacity">
+<div className={`fixed ${t('common.direction') === 'rtl' ? 'right-0' : 'left-0'} top-0 z-20 grid h-full w-full place-items-center bg-custom-backdrop bg-opacity-50 transition-opacity`}>

This ensures proper positioning for both LTR and RTL languages without affecting existing user experiences.

web/core/components/issues/issue-layouts/filters/header/helpers/dropdown.tsx (1)

73-73: Consider using RTL-aware positioning for better internationalization.

The indicator position has been changed from right to left, which may be related to supporting right-to-left languages like Persian. However, this change will affect all users regardless of language direction.

For better internationalization support, consider using a direction-aware approach:

- <span className="absolute h-2 w-2 -left-0.5 -top-0.5 bg-custom-primary-100 rounded-full" />
+ <span className={`absolute h-2 w-2 ${isRTL ? '-right-0.5' : '-left-0.5'} -top-0.5 bg-custom-primary-100 rounded-full`} />

Where isRTL could be determined from the current language context or direction.

Is this change part of RTL support for Persian language? If so, let's ensure it only affects RTL language users.

web/core/components/cycles/archived-cycles/header.tsx (1)

88-88: Adjusted margin class for RTL language support.

The class has been changed from "ml-auto" to "mr-auto" which is appropriate for supporting right-to-left languages like Persian. This change ensures proper alignment of the search component in RTL layouts.

For more robust RTL support, consider using a conditional approach based on current language direction:

- "mr-auto flex items-center justify-start gap-1 rounded-md border border-transparent bg-custom-background-100 text-custom-text-400 w-0 transition-[width] ease-linear overflow-hidden opacity-0",
+ "flex items-center justify-start gap-1 rounded-md border border-transparent bg-custom-background-100 text-custom-text-400 w-0 transition-[width] ease-linear overflow-hidden opacity-0 ${isRTL ? 'mr-auto' : 'ml-auto'}",

This would make the direction logic explicit and maintainable as you add more RTL language support.

web/core/components/labels/create-update-label-inline.tsx (2)

154-154: Consider using a dynamic approach for RTL language support

The change from left-0 to right-0 for the Popover.Panel positioning supports RTL languages like Persian, which is good. However, this approach hardcodes the positioning regardless of the current language direction.

Consider using a dynamic approach that adapts based on the current language direction:

- <Popover.Panel className="absolute right-0 top-full z-20 mt-3 w-screen max-w-xs px-2 sm:px-0">
+ <Popover.Panel className={`absolute ${isRTL ? 'right-0' : 'left-0'} top-full z-20 mt-3 w-screen max-w-xs px-2 sm:px-0`}>

You would need to add a utility or hook to determine if the current language is RTL:

// Example utility
const isRTL = ['ar', 'fa', 'he', 'ur'].includes(currentLanguage);

206-206: Apply consistent RTL-friendly padding

Changing from pl-8 to pr-8 supports RTL languages like Persian, but similar to the Popover positioning, this hardcodes the padding direction regardless of the current language.

Consider a dynamic approach for padding as well:

- {errors.name?.message && <p className="p-0.5 pr-8 text-sm text-red-500">{errors.name?.message}</p>}
+ {errors.name?.message && <p className={`p-0.5 ${isRTL ? 'pr-8' : 'pl-8'} text-sm text-red-500`}>{errors.name?.message}</p>}

This ensures that your UI will respond correctly to both LTR and RTL languages without requiring separate style changes for each language addition.

web/core/components/pages/loaders/page-loader.tsx (1)

6-35: Consider using CSS logical properties for RTL support.

While the current changes correctly implement RTL support for Persian, consider using CSS logical properties (e.g., margin-inline-start: auto instead of mr-auto) for more maintainable RTL support across the application.

By using logical properties, you wouldn't need to explicitly change margin classes for RTL languages. The browser would automatically adjust based on the document's text direction.

- <div className="relative flex items-center gap-2 mr-auto">
+ <div className="relative flex items-center gap-2" style={{ marginInlineStart: 'auto' }}>

Or using Tailwind plugins that support logical properties:

- <div className="relative flex items-center gap-2 mr-auto">
+ <div className="relative flex items-center gap-2 ms-auto">
🧰 Tools
🪛 Biome (1.9.4)

[error] 7-7: Unexpected empty object pattern.

(lint/correctness/noEmptyPattern)

web/core/components/inbox/content/inbox-issue-mobile-header.tsx (1)

105-105: These margin adjustments support RTL layout for Persian language.

The changes from mr-2 to ml-2 and ml-auto to mr-auto properly adjust the component's layout to support right-to-left languages like Persian. This is appropriate for internationalization support.

For future maintainability, consider using CSS logical properties like margin-inline-start and margin-inline-end which automatically adjust based on the text direction, rather than hardcoding ml- and mr- classes. This would make the code more resilient to language direction changes without requiring manual updates.

-<MoveRight className="h-4 w-4 text-custom-text-300 hover:text-custom-text-200 ml-2" />
+<MoveRight className="h-4 w-4 text-custom-text-300 hover:text-custom-text-200 ms-2" />
-"w-4 h-4 flex-shrink-0 ml-2 my-auto",
+"w-4 h-4 flex-shrink-0 ms-2 my-auto",
-<div className="mr-auto">
+<div className="me-auto">

Note: If you're using Tailwind CSS, you would need to ensure the logical property plugins are enabled or use appropriate RTL-aware utility classes.

Also applies to: 111-111, 138-138

web/app/invitations/page.tsx (1)

133-227: Consider using a conditional layout based on language direction

While the current implementation works for supporting Persian, consider implementing a more dynamic approach that conditionally applies RTL or LTR styles based on the current language direction. This would make the codebase more maintainable as you add more languages in the future.

- <div className="absolute right-0 top-1/2 h-[0.5px] w-full -translate-y-1/2 border-b-[0.5px] border-custom-border-200 sm:right-1/2 sm:top-0 sm:h-screen sm:w-[0.5px] sm:-translate-x-1/2 sm:translate-y-0 sm:border-l-[0.5px] md:right-1/3" />
+ <div className={`absolute ${isRTL ? 'right-0' : 'left-0'} top-1/2 h-[0.5px] w-full -translate-y-1/2 border-b-[0.5px] border-custom-border-200 sm:${isRTL ? 'right-1/2' : 'left-1/2'} sm:top-0 sm:h-screen sm:w-[0.5px] sm:-translate-x-1/2 sm:translate-y-0 sm:${isRTL ? 'border-l-[0.5px]' : 'border-r-[0.5px]'} md:${isRTL ? 'right-1/3' : 'left-1/3'}`} />

You can determine the direction with:

// Add near the top of the component
const { t, i18n } = useTranslation();
const isRTL = i18n.language === "fa" || i18n.language === "ar"; // Add other RTL languages as needed
web/core/components/issues/peek-overview/view.tsx (1)

253-253: Border direction change to support RTL layout

Changing from border-l to border-r aligns with RTL layout requirements for Persian language support.

For better maintainability, consider extracting these directional CSS properties into utility functions or CSS variables that can adapt based on the current language direction. This would make the RTL/LTR support more explicit and easier to maintain across the application.

- className={`h-full !w-[400px] flex-shrink-0 border-r border-custom-border-200 p-4 py-5 overflow-hidden vertical-scrollbar scrollbar-sm ${
+ className={`h-full !w-[400px] flex-shrink-0 border-${isRTL ? 'r' : 'l'} border-custom-border-200 p-4 py-5 overflow-hidden vertical-scrollbar scrollbar-sm ${
web/core/components/core/theme/color-picker-input.tsx (3)

84-84: Consider using CSS logical properties for RTL language support.

Changing the position from right-4 to left-4 supports RTL languages like Persian, but this hard-coded approach might not be optimal. For better internationalization, consider using CSS logical properties instead.

-<div className="absolute left-4 top-2.5">
+<div className={`absolute ${isRTL ? 'left-4' : 'right-4'} top-2.5`}>

This approach would require adding a context or prop to determine if the current language is RTL.


116-118: Invert the panel positioning logic for RTL support.

The panel positioning logic has been flipped to support RTL layouts, but similar to the previous comment, this hard-coded approach might not handle language switching gracefully.

<Popover.Panel
  className={`absolute bottom-8 z-20 mt-1 max-w-xs px-2 sm:px-0 ${
-    position === "right" ? "right-0" : "left-0"
+    (position === "right") !== isRTL ? "right-0" : "left-0"
  }`}
>

This would adapt the positioning based on both the position prop and the current language direction.


25-27: Consider adding an RTL indicator to improve internationalization support.

The component could benefit from explicit RTL awareness to properly handle bidirectional text interfaces.

type Props = {
  name: keyof IUserTheme;
  position?: "left" | "right";
+ isRTL?: boolean;
  watch: UseFormWatch<any>;
  setValue: UseFormSetValue<any>;
  control: Control<IUserTheme, any>;
  error: FieldError | Merge<FieldError, FieldErrorsImpl<any>> | undefined;
  register: UseFormRegister<any>;
};

Then destructure this property with a default value in the component:

- const { name, position = "left", watch, setValue, error, control } = props;
+ const { name, position = "left", isRTL = false, watch, setValue, error, control } = props;
web/convert-margin-padding.js (6)

4-11: Misleading function name and comment

The function name convertClasses and comment "Convert margin/padding classes" don't match the actual implementation. The function is swapping chevron directions (likely for RTL language support), not modifying margin or padding classes.

-// Function to convert margin/padding classes
-function convertClasses(content) {
+// Function to swap chevron directions for RTL support
+function swapChevronDirections(content) {
   return content
-    // Convert margin classes\
+    // Swap ChevronLeft and ChevronRight using temporary placeholder
     .replace(/ChevronLeft/g, 'ChevronRigh2t')
     .replace(/ChevronRight/g, 'ChevronLeft')
     .replace(/ChevronRigh2t/g, 'ChevronRight')
 }

8-10: Use a safer temporary placeholder

Using 'ChevronRigh2t' as a temporary placeholder is risky as it's very similar to the actual string and could potentially exist in the codebase already.

-    .replace(/ChevronLeft/g, 'ChevronRigh2t')
-    .replace(/ChevronRight/g, 'ChevronLeft')
-    .replace(/ChevronRigh2t/g, 'ChevronRight')
+    .replace(/ChevronLeft/g, '__TEMP_CHEVRON_LEFT__')
+    .replace(/ChevronRight/g, 'ChevronLeft')
+    .replace(/__TEMP_CHEVRON_LEFT__/g, 'ChevronRight')

19-19: Update function call if name is changed

If you rename the convertClasses function as suggested above, don't forget to update this function call.

-    content = convertClasses(content);
+    content = swapChevronDirections(content);

31-44: Add filtering for excluded directories

The current implementation will process all directories including potentially unwanted ones like node_modules, dist, etc.

function walkDir(dir) {
  const files = fs.readdirSync(dir);
+  
+  // Skip directories that shouldn't be processed
+  const excludeDirs = ['node_modules', 'dist', 'build', '.git'];
+  if (excludeDirs.includes(path.basename(dir))) {
+    return;
+  }
  
  files.forEach(file => {
    const filePath = path.join(dir, file);
    const stat = fs.statSync(filePath);
    
    if (stat.isDirectory()) {
      walkDir(filePath);
    } else if (file.endsWith('.tsx') || file.endsWith('.jsx')) {
      processFile(filePath);
    }
  });
}

46-47: Add script configuration options

Consider adding command-line arguments to make the script more flexible (e.g., specify directories, dry run mode).

-// Start processing from the current directory
-walkDir('.'); 
+// Parse command line arguments
+const args = process.argv.slice(2);
+const startDir = args[0] || '.';
+const dryRun = args.includes('--dry-run');
+
+if (dryRun) {
+  console.log('Running in dry-run mode - no files will be modified');
+  // Modify processFile to not write changes in dry-run mode
+}
+
+console.log(`Starting to process files from: ${startDir}`);
+walkDir(startDir);
+console.log('Done processing files');

1-47: Consider async file operations for better performance

The script uses synchronous file operations which can be slow for large codebases. Consider using async versions for better performance.

Here's a partial example of how this could be implemented:

const fs = require('fs').promises;
const path = require('path');

// Async function to process a file
async function processFile(filePath) {
  try {
    let content = await fs.readFile(filePath, 'utf8');
    const originalContent = content;
    
    content = swapChevronDirections(content);
    
    if (content !== originalContent) {
      await fs.writeFile(filePath, content);
      console.log(`Converted classes in: ${filePath}`);
    }
  } catch (error) {
    console.error(`Error processing ${filePath}:`, error);
  }
}

// And so on for walkDir...
web/core/components/issues/issue-layouts/list/block.tsx (6)

8-8: Consider using conditional icon imports for RTL languages

You've changed the import from ChevronRight to ChevronLeft to support Persian language (RTL). While this works, it might affect the UX for LTR languages where users expect right-pointing chevrons for expansion.

Consider conditionally importing the appropriate icon based on the current language direction:

-import { ChevronLeft } from "lucide-react";
+import { ChevronLeft, ChevronRight } from "lucide-react";
+import { useLanguageDirection } from "@/hooks/use-language-direction"; // Create this hook

Then use the appropriate icon based on the language direction:

const { isRTL } = useLanguageDirection();
// ...
{isRTL ? <ChevronLeft /> : <ChevronRight />}

212-212: Consider using dynamic positioning based on language direction

You've changed the positioning from left-1 to right-1 to support RTL languages like Persian. This works for RTL but might create inconsistency for LTR languages.

Consider using a dynamic approach that adjusts based on the current language direction:

-<div className="flex-shrink-0 grid place-items-center w-3.5 absolute right-1">
+<div className={`flex-shrink-0 grid place-items-center w-3.5 absolute ${isRTL ? 'right-1' : 'left-1'}`}>

This ensures the UI remains consistent for both RTL and LTR language users.


249-255: Update chevron usage to support both LTR and RTL layouts

You've changed the chevron from right to left for RTL support. While this works, it would be better to dynamically select the appropriate chevron and adjust rotation logic based on language direction.

-<ChevronLeft
-  className={cn("size-4", {
-    "rotate-90": isExpanded,
-  })}
-  strokeWidth={2.5}
-/>
+{isRTL ? (
+  <ChevronLeft
+    className={cn("size-4", {
+      "rotate-90": isExpanded,
+    })}
+    strokeWidth={2.5}
+  />
+) : (
+  <ChevronRight
+    className={cn("size-4", {
+      "-rotate-90": isExpanded,
+    })}
+    strokeWidth={2.5}
+  />
+)}

This ensures proper visual cues for both RTL and LTR language users.


259-260: Use dynamic positioning for animation pulse based on language direction

The position of the animation pulse has been changed from left-0 to right-0 for RTL languages. This should be dynamically determined based on the current language direction.

-<div className="absolute right-0 top-0 z-[99999] h-full w-full animate-pulse bg-custom-background-100/20" />
+<div className={`absolute ${isRTL ? 'right-0' : 'left-0'} top-0 z-[99999] h-full w-full animate-pulse bg-custom-background-100/20`} />

279-279: Set margins dynamically based on language direction

The margin has been changed from ml-2 to mr-2 for RTL support. This should also be determined dynamically based on language direction.

-<IssueStats issueId={issue.id} className="mr-2 font-medium text-custom-text-350" />
+<IssueStats issueId={issue.id} className={`${isRTL ? 'mr-2' : 'ml-2'} font-medium text-custom-text-350`} />

1-334: Consider implementing a comprehensive RTL support strategy

While your changes support Persian (RTL) language by adjusting UI element positioning, a more robust approach would be to implement a systematic RTL support strategy.

I recommend:

  1. Create a hook or context for managing language direction:
// hooks/use-language-direction.ts
import { useContext } from 'react';
import { LanguageContext } from '@/contexts/language-context';

export const useLanguageDirection = () => {
  const { language } = useContext(LanguageContext);
  const rtlLanguages = ['fa', 'ar', 'he']; // Persian, Arabic, Hebrew
  const isRTL = rtlLanguages.includes(language);
  
  return { isRTL };
};
  1. Consider using CSS logical properties where possible:
- margin-left: 8px;
+ margin-inline-start: 8px;

- left: 0;
+ inset-inline-start: 0;
  1. For complex layouts, use the dir attribute to set the text direction:
<div dir={isRTL ? 'rtl' : 'ltr'}>...</div>

This approach will make your codebase more maintainable when supporting multiple languages with different text directions.

web/core/components/common/new-empty-state.tsx (1)

14-15: Consider renaming "direction" property in future refactors

While the implementation is correct, for maintainability the property name direction might be slightly confusing when supporting RTL languages. In a future refactor, consider renaming to position to better reflect that it indicates whether the comic box should appear on the left or right side of the button.

web/core/components/issues/issue-layouts/quick-add/root.tsx (1)

162-162: Consider using optional chaining for nested property access

The current code uses multiple checks (errors && errors?.name && errors?.name?.message). For better readability and consistency, consider using optional chaining throughout.

- errors && errors?.name && errors?.name?.message ? `border-led-500 bg-red-500/10` : ``
+ errors?.name?.message ? `border-red-500 bg-red-500/10` : ``
🧰 Tools
🪛 Biome (1.9.4)

[error] 162-162: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

web/app/profile/sidebar.tsx (1)

1-290: Consider using RTL context provider for language direction consistency

Rather than adding RTL detection logic in each component, consider implementing a global RTL context provider that makes the current language direction available throughout the application.

This would simplify the conditional styling and make RTL/LTR handling more consistent:

// Create a direction context (in a separate file)
const DirectionContext = createContext({ isRTL: false });

export const DirectionProvider = ({ children }) => {
  const { i18n } = useTranslation();
  const isRTL = ['fa', 'ar', 'he'].includes(i18n.language);
  
  return (
    <DirectionContext.Provider value={{ isRTL }}>
      {children}
    </DirectionContext.Provider>
  );
};

export const useDirection = () => useContext(DirectionContext);

Then in your components:

const { isRTL } = useDirection();

This also allows you to apply global RTL styles like dir="rtl" at the root level.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between dc1092a and 02245d5.

📒 Files selected for processing (207)
  • packages/ui/src/button/toggle-switch.tsx (1 hunks)
  • web/.gitignore (1 hunks)
  • web/app/[workspaceSlug]/(projects)/analytics/page.tsx (1 hunks)
  • web/app/[workspaceSlug]/(projects)/extended-project-sidebar.tsx (2 hunks)
  • web/app/[workspaceSlug]/(projects)/extended-sidebar.tsx (1 hunks)
  • web/app/[workspaceSlug]/(projects)/profile/[userId]/mobile-header.tsx (3 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/[cycleId]/page.tsx (1 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx (2 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/mobile-header.tsx (3 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/header.tsx (1 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(list)/mobile-header.tsx (4 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/[moduleId]/page.tsx (1 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/header.tsx (2 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/mobile-header.tsx (3 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/settings/(with-sidebar)/layout.tsx (1 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx (1 hunks)
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(list)/mobile-header.tsx (3 hunks)
  • web/app/[workspaceSlug]/(projects)/settings/(with-sidebar)/layout.tsx (1 hunks)
  • web/app/[workspaceSlug]/(projects)/settings/(with-sidebar)/members/page.tsx (1 hunks)
  • web/app/[workspaceSlug]/(projects)/sidebar.tsx (1 hunks)
  • web/app/accounts/forgot-password/page.tsx (1 hunks)
  • web/app/accounts/reset-password/page.tsx (4 hunks)
  • web/app/accounts/set-password/page.tsx (4 hunks)
  • web/app/create-workspace/page.tsx (1 hunks)
  • web/app/installations/[provider]/page.tsx (1 hunks)
  • web/app/invitations/page.tsx (2 hunks)
  • web/app/layout.tsx (1 hunks)
  • web/app/profile/security/page.tsx (3 hunks)
  • web/app/profile/sidebar.tsx (8 hunks)
  • web/ce/components/active-cycles/workspace-active-cycles-upgrade.tsx (2 hunks)
  • web/ce/components/pages/editor/ai/ask-pi-menu.tsx (1 hunks)
  • web/ce/components/pages/editor/ai/menu.tsx (4 hunks)
  • web/ce/components/pages/editor/embed/issue-embed-upgrade-card.tsx (1 hunks)
  • web/ce/components/projects/mobile-header.tsx (1 hunks)
  • web/ce/components/workspace/sidebar/extended-sidebar-item.tsx (1 hunks)
  • web/ce/components/workspace/sidebar/sidebar-item.tsx (1 hunks)
  • web/ce/components/workspace/upgrade/one-plan-upgrade.tsx (1 hunks)
  • web/ce/components/workspace/upgrade/paid-plans-upgrade-modal.tsx (2 hunks)
  • web/ce/components/workspace/upgrade/pro-plan-upgrade.tsx (2 hunks)
  • web/convert-margin-padding.js (1 hunks)
  • web/core/components/account/auth-forms/auth-banner.tsx (1 hunks)
  • web/core/components/account/auth-forms/email.tsx (1 hunks)
  • web/core/components/account/auth-forms/forgot-password-popover.tsx (2 hunks)
  • web/core/components/account/auth-forms/password.tsx (4 hunks)
  • web/core/components/account/auth-forms/unique-code.tsx (2 hunks)
  • web/core/components/account/deactivate-account-modal.tsx (1 hunks)
  • web/core/components/analytics/custom-analytics/custom-analytics.tsx (1 hunks)
  • web/core/components/analytics/custom-analytics/sidebar/projects-list.tsx (1 hunks)
  • web/core/components/analytics/custom-analytics/table.tsx (2 hunks)
  • web/core/components/analytics/project-modal/main-content.tsx (1 hunks)
  • web/core/components/analytics/project-modal/modal.tsx (1 hunks)
  • web/core/components/analytics/scope-and-demand/demand.tsx (1 hunks)
  • web/core/components/analytics/scope-and-demand/leaderboard.tsx (1 hunks)
  • web/core/components/api-token/modal/generated-token-details.tsx (1 hunks)
  • web/core/components/api-token/token-list-item.tsx (2 hunks)
  • web/core/components/automation/select-month-modal.tsx (2 hunks)
  • web/core/components/common/filters/created-by.tsx (1 hunks)
  • web/core/components/common/latest-feature-block.tsx (2 hunks)
  • web/core/components/common/logo-spinner.tsx (1 hunks)
  • web/core/components/common/new-empty-state.tsx (3 hunks)
  • web/core/components/core/content-overflow-HOC.tsx (1 hunks)
  • web/core/components/core/filters/date-filter-modal.tsx (1 hunks)
  • web/core/components/core/image-picker-popover.tsx (4 hunks)
  • web/core/components/core/modals/bulk-delete-issues-modal.tsx (1 hunks)
  • web/core/components/core/modals/existing-issues-list-modal.tsx (2 hunks)
  • web/core/components/core/modals/user-image-upload-modal.tsx (1 hunks)
  • web/core/components/core/modals/workspace-image-upload-modal.tsx (1 hunks)
  • web/core/components/core/theme/color-picker-input.tsx (2 hunks)
  • web/core/components/core/theme/theme-switch.tsx (2 hunks)
  • web/core/components/cycles/analytics-sidebar/issue-progress.tsx (1 hunks)
  • web/core/components/cycles/analytics-sidebar/sidebar-header.tsx (2 hunks)
  • web/core/components/cycles/archived-cycles/header.tsx (1 hunks)
  • web/core/components/cycles/cycle-peek-overview.tsx (1 hunks)
  • web/core/components/cycles/cycles-view-header.tsx (1 hunks)
  • web/core/components/cycles/list/cycle-list-group-header.tsx (1 hunks)
  • web/core/components/cycles/list/cycle-list-project-group-header.tsx (3 hunks)
  • web/core/components/dashboard/widgets/issue-panels/issues-list.tsx (1 hunks)
  • web/core/components/dashboard/widgets/issue-panels/tabs-list.tsx (1 hunks)
  • web/core/components/dashboard/widgets/loaders/issues-by-state-group.tsx (1 hunks)
  • web/core/components/dashboard/widgets/overview-stats.tsx (2 hunks)
  • web/core/components/dropdowns/priority.tsx (7 hunks)
  • web/core/components/editor/embeds/mentions/user.tsx (1 hunks)
  • web/core/components/editor/lite-text-editor/toolbar.tsx (2 hunks)
  • web/core/components/editor/rich-text-editor/rich-text-editor.tsx (1 hunks)
  • web/core/components/editor/rich-text-editor/rich-text-read-only-editor.tsx (1 hunks)
  • web/core/components/editor/sticky-editor/color-palette.tsx (1 hunks)
  • web/core/components/empty-state/comic-box-button.tsx (3 hunks)
  • web/core/components/estimates/create/modal.tsx (2 hunks)
  • web/core/components/estimates/points/create.tsx (2 hunks)
  • web/core/components/estimates/points/update.tsx (2 hunks)
  • web/core/components/exporter/guide.tsx (2 hunks)
  • web/core/components/gantt-chart/blocks/block-row-list.tsx (1 hunks)
  • web/core/components/gantt-chart/blocks/block-row.tsx (1 hunks)
  • web/core/components/gantt-chart/chart/header.tsx (1 hunks)
  • web/core/components/gantt-chart/chart/views/month.tsx (2 hunks)
  • web/core/components/gantt-chart/chart/views/quarter.tsx (2 hunks)
  • web/core/components/gantt-chart/chart/views/week.tsx (1 hunks)
  • web/core/components/gantt-chart/helpers/blockResizables/left-resizable.tsx (2 hunks)
  • web/core/components/gantt-chart/helpers/blockResizables/right-resizable.tsx (2 hunks)
  • web/core/components/gantt-chart/helpers/draggable.tsx (1 hunks)
  • web/core/components/gantt-chart/sidebar/issues/block.tsx (2 hunks)
  • web/core/components/gantt-chart/sidebar/issues/sidebar.tsx (1 hunks)
  • web/core/components/gantt-chart/sidebar/modules/block.tsx (1 hunks)
  • web/core/components/gantt-chart/sidebar/modules/sidebar.tsx (1 hunks)
  • web/core/components/gantt-chart/sidebar/root.tsx (1 hunks)
  • web/core/components/global/timezone-select.tsx (1 hunks)
  • web/core/components/home/root.tsx (1 hunks)
  • web/core/components/home/widgets/empty-states/no-projects.tsx (1 hunks)
  • web/core/components/home/widgets/manage/widget-item-drag-handle.tsx (1 hunks)
  • web/core/components/home/widgets/manage/widget-item.tsx (1 hunks)
  • web/core/components/inbox/content/inbox-issue-header.tsx (1 hunks)
  • web/core/components/inbox/content/inbox-issue-mobile-header.tsx (2 hunks)
  • web/core/components/inbox/inbox-filter/filters/labels.tsx (1 hunks)
  • web/core/components/inbox/inbox-filter/filters/members.tsx (1 hunks)
  • web/core/components/inbox/inbox-filter/filters/state.tsx (1 hunks)
  • web/core/components/inbox/modals/select-duplicate.tsx (1 hunks)
  • web/core/components/inbox/sidebar/inbox-list-item.tsx (1 hunks)
  • web/core/components/inbox/sidebar/root.tsx (2 hunks)
  • web/core/components/integration/github/single-user-select.tsx (1 hunks)
  • web/core/components/issues/attachment/attachment-item-list.tsx (1 hunks)
  • web/core/components/issues/attachment/attachment-list-item.tsx (1 hunks)
  • web/core/components/issues/attachment/attachment-list-upload-item.tsx (1 hunks)
  • web/core/components/issues/bulk-operations/upgrade-banner.tsx (1 hunks)
  • web/core/components/issues/issue-detail-widgets/relations/content.tsx (1 hunks)
  • web/core/components/issues/issue-detail/issue-activity/activity-filter.tsx (1 hunks)
  • web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/activity-block.tsx (1 hunks)
  • web/core/components/issues/issue-detail/issue-activity/comments/comment-block.tsx (2 hunks)
  • web/core/components/issues/issue-detail/issue-activity/comments/comment-card.tsx (2 hunks)
  • web/core/components/issues/issue-detail/label/label-list-item.tsx (1 hunks)
  • web/core/components/issues/issue-detail/label/select/label-select.tsx (1 hunks)
  • web/core/components/issues/issue-detail/root.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/calendar/dropdowns/months-dropdown.tsx (3 hunks)
  • web/core/components/issues/issue-layouts/calendar/dropdowns/options-dropdown.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/calendar/header.tsx (2 hunks)
  • web/core/components/issues/issue-layouts/calendar/issue-block.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/filters/assignee.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/filters/created-by.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/filters/cycle.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/filters/labels.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/filters/mentions.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/filters/module.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/filters/project.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/filters/state-group.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/filters/state.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/helpers/dropdown.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/filters/header/helpers/filter-option.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/gantt/blocks.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/group-drag-overlay.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/kanban/block.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/kanban/headers/sub-group-by-card.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/kanban/swimlanes.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/list/block.tsx (5 hunks)
  • web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx (2 hunks)
  • web/core/components/issues/issue-layouts/list/list-group.tsx (2 hunks)
  • web/core/components/issues/issue-layouts/quick-add/form/calendar.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/quick-add/form/gantt.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/quick-add/form/kanban.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/quick-add/form/spreadsheet.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/quick-add/root.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/roots/project-layout-root.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/spreadsheet/columns/header-column.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx (5 hunks)
  • web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header.tsx (1 hunks)
  • web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx (1 hunks)
  • web/core/components/issues/issue-modal/components/description-editor.tsx (1 hunks)
  • web/core/components/issues/parent-issues-list-modal.tsx (1 hunks)
  • web/core/components/issues/peek-overview/view.tsx (2 hunks)
  • web/core/components/issues/sub-issues/issue-list-item.tsx (3 hunks)
  • web/core/components/issues/sub-issues/root.tsx (2 hunks)
  • web/core/components/issues/title-input.tsx (1 hunks)
  • web/core/components/issues/workspace-draft/root.tsx (1 hunks)
  • web/core/components/labels/create-label-modal.tsx (2 hunks)
  • web/core/components/labels/create-update-label-inline.tsx (2 hunks)
  • web/core/components/labels/label-block/label-item-block.tsx (1 hunks)
  • web/core/components/labels/label-block/label-name.tsx (1 hunks)
  • web/core/components/labels/label-drag-n-drop-HOC.tsx (1 hunks)
  • web/core/components/labels/project-setting-label-group.tsx (2 hunks)
  • web/core/components/modules/analytics-sidebar/issue-progress.tsx (1 hunks)
  • web/core/components/modules/analytics-sidebar/root.tsx (2 hunks)
  • web/core/components/modules/archived-modules/header.tsx (1 hunks)
  • web/core/components/modules/dropdowns/filters/lead.tsx (1 hunks)
  • web/core/components/modules/dropdowns/filters/members.tsx (1 hunks)
  • web/core/components/modules/gantt-chart/blocks.tsx (1 hunks)
  • web/core/components/modules/module-card-item.tsx (1 hunks)
  • web/core/components/modules/module-peek-overview.tsx (1 hunks)
  • web/core/components/modules/module-view-header.tsx (1 hunks)
  • web/core/components/onboarding/create-workspace.tsx (4 hunks)
  • web/core/components/onboarding/header.tsx (1 hunks)
  • web/core/components/onboarding/invite-members.tsx (3 hunks)
  • web/core/components/onboarding/profile-setup.tsx (8 hunks)
  • web/core/components/onboarding/switch-account-dropdown.tsx (2 hunks)
  • web/core/components/onboarding/tour/root.tsx (1 hunks)
  • web/core/components/onboarding/tour/sidebar.tsx (1 hunks)
  • web/core/components/page-views/workspace-dashboard.tsx (1 hunks)
  • web/core/components/pages/editor/editor-body.tsx (1 hunks)
  • web/core/components/pages/editor/header/toolbar.tsx (2 hunks)
  • web/core/components/pages/editor/summary/heading-components.tsx (2 hunks)
  • web/core/components/pages/editor/title.tsx (2 hunks)
  • web/core/components/pages/loaders/page-content-loader.tsx (2 hunks)
  • web/core/components/pages/loaders/page-loader.tsx (2 hunks)
  • web/core/components/pages/version/editor.tsx (1 hunks)
  • web/core/components/pages/version/sidebar-root.tsx (1 hunks)
  • web/core/components/profile/form.tsx (8 hunks)
  • web/core/components/profile/notification/email-notification-form.tsx (1 hunks)
⛔ Files not processed due to max files limit (68)
  • web/core/components/profile/sidebar.tsx
  • web/core/components/project-states/state-item-title.tsx
  • web/core/components/project/card.tsx
  • web/core/components/project/confirm-project-member-remove.tsx
  • web/core/components/project/create/common-attributes.tsx
  • web/core/components/project/create/header.tsx
  • web/core/components/project/dropdowns/filters/lead.tsx
  • web/core/components/project/dropdowns/filters/members.tsx
  • web/core/components/project/form.tsx
  • web/core/components/project/member-list.tsx
  • web/core/components/project/publish-project/modal.tsx
  • web/core/components/project/search-projects.tsx
  • web/core/components/project/send-project-invitation-modal.tsx
  • web/core/components/project/settings/archive-project/selection.tsx
  • web/core/components/project/settings/delete-project-section.tsx
  • web/core/components/project/settings/features-list.tsx
  • web/core/components/project/settings/member-columns.tsx
  • web/core/components/stickies/action-bar.tsx
  • web/core/components/stickies/modal/search.tsx
  • web/core/components/stickies/modal/stickies.tsx
  • web/core/components/stickies/sticky/sticky-item-drag-handle.tsx
  • web/core/components/ui/empty-space.tsx
  • web/core/components/ui/loader/layouts/gantt-layout-loader.tsx
  • web/core/components/ui/loader/layouts/project-inbox/inbox-layout-loader.tsx
  • web/core/components/ui/loader/layouts/spreadsheet-layout-loader.tsx
  • web/core/components/ui/loader/settings/api-token.tsx
  • web/core/components/ui/loader/settings/web-hook.tsx
  • web/core/components/ui/markdown-to-component.tsx
  • web/core/components/views/view-list-header.tsx
  • web/core/components/web-hooks/form/individual-event-options.tsx
  • web/core/components/web-hooks/form/secret-key.tsx
  • web/core/components/workspace-notifications/notification-app-sidebar-option.tsx
  • web/core/components/workspace-notifications/root.tsx
  • web/core/components/workspace-notifications/sidebar/header/options/menu-option/menu-item.tsx
  • web/core/components/workspace-notifications/sidebar/notification-card/item.tsx
  • web/core/components/workspace-notifications/sidebar/notification-card/options/snooze/modal.tsx
  • web/core/components/workspace-notifications/sidebar/notification-card/options/snooze/root.tsx
  • web/core/components/workspace/ConfirmWorkspaceMemberRemove.tsx
  • web/core/components/workspace/confirm-workspace-member-remove.tsx
  • web/core/components/workspace/create-workspace-form.tsx
  • web/core/components/workspace/invite-modal/actions.tsx
  • web/core/components/workspace/invite-modal/fields.tsx
  • web/core/components/workspace/logo.tsx
  • web/core/components/workspace/settings/member-columns.tsx
  • web/core/components/workspace/settings/members-list.tsx
  • web/core/components/workspace/settings/workspace-details.tsx
  • web/core/components/workspace/sidebar/dropdown-item.tsx
  • web/core/components/workspace/sidebar/dropdown.tsx
  • web/core/components/workspace/sidebar/favorites/favorite-folder.tsx
  • web/core/components/workspace/sidebar/favorites/favorite-items/common/favorite-item-drag-handle.tsx
  • web/core/components/workspace/sidebar/favorites/favorite-items/common/favorite-item-title.tsx
  • web/core/components/workspace/sidebar/favorites/favorite-items/root.tsx
  • web/core/components/workspace/sidebar/favorites/favorites-menu.tsx
  • web/core/components/workspace/sidebar/help-section.tsx
  • web/core/components/workspace/sidebar/project-navigation.tsx
  • web/core/components/workspace/sidebar/projects-list-item.tsx
  • web/core/components/workspace/sidebar/projects-list.tsx
  • web/core/components/workspace/sidebar/user-menu-item.tsx
  • web/core/components/workspace/sidebar/workspace-menu-header.tsx
  • web/core/components/workspace/sidebar/workspace-menu-item.tsx
  • web/core/components/workspace/sidebar/workspace-menu.tsx
  • web/core/components/workspace/views/header.tsx
  • web/core/components/workspace/views/quick-action.tsx
  • web/core/components/workspace/views/view-list-item.tsx
  • web/core/layouts/auth-layout/workspace-wrapper.tsx
  • web/core/lib/n-progress/AppProgressBar.tsx
  • web/package.json
  • web/styles/globals.css
✅ Files skipped from review due to trivial changes (144)
  • web/core/components/editor/rich-text-editor/rich-text-read-only-editor.tsx
  • web/core/components/issues/issue-layouts/calendar/dropdowns/options-dropdown.tsx
  • web/core/components/gantt-chart/blocks/block-row-list.tsx
  • web/core/components/editor/sticky-editor/color-palette.tsx
  • web/core/components/issues/attachment/attachment-item-list.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/settings/(with-sidebar)/layout.tsx
  • web/core/components/common/logo-spinner.tsx
  • web/core/components/issues/issue-layouts/spreadsheet/columns/header-column.tsx
  • web/core/components/gantt-chart/sidebar/issues/sidebar.tsx
  • web/core/components/account/deactivate-account-modal.tsx
  • web/core/components/issues/issue-detail/issue-activity/activity-filter.tsx
  • web/core/components/home/widgets/manage/widget-item.tsx
  • web/core/components/inbox/sidebar/inbox-list-item.tsx
  • web/core/components/analytics/scope-and-demand/leaderboard.tsx
  • web/core/components/issues/issue-layouts/quick-add/form/kanban.tsx
  • web/core/components/issues/attachment/attachment-list-upload-item.tsx
  • web/ce/components/workspace/sidebar/sidebar-item.tsx
  • web/core/components/issues/title-input.tsx
  • web/core/components/issues/issue-layouts/calendar/issue-block.tsx
  • web/core/components/issues/issue-layouts/filters/header/filters/module.tsx
  • web/app/[workspaceSlug]/(projects)/profile/[userId]/mobile-header.tsx
  • web/core/components/issues/issue-layouts/filters/header/filters/assignee.tsx
  • web/core/components/onboarding/header.tsx
  • web/core/components/home/widgets/empty-states/no-projects.tsx
  • web/core/components/modules/dropdowns/filters/members.tsx
  • web/ce/components/projects/mobile-header.tsx
  • web/core/components/core/content-overflow-HOC.tsx
  • web/core/components/pages/version/sidebar-root.tsx
  • web/core/components/core/modals/user-image-upload-modal.tsx
  • web/core/components/issues/issue-layouts/filters/header/filters/cycle.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(list)/mobile-header.tsx
  • web/core/components/analytics/custom-analytics/sidebar/projects-list.tsx
  • web/core/components/labels/label-block/label-name.tsx
  • web/core/components/issues/issue-detail/issue-activity/comments/comment-block.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/header.tsx
  • web/core/components/analytics/project-modal/main-content.tsx
  • web/core/components/issues/bulk-operations/upgrade-banner.tsx
  • web/core/components/api-token/modal/generated-token-details.tsx
  • web/core/components/onboarding/tour/sidebar.tsx
  • web/app/installations/[provider]/page.tsx
  • web/core/components/pages/editor/summary/heading-components.tsx
  • web/core/components/issues/issue-layouts/filters/header/filters/labels.tsx
  • web/core/components/labels/create-label-modal.tsx
  • web/core/components/gantt-chart/sidebar/modules/block.tsx
  • web/core/components/dashboard/widgets/issue-panels/issues-list.tsx
  • web/core/components/issues/issue-layouts/filters/header/filters/mentions.tsx
  • web/ce/components/pages/editor/embed/issue-embed-upgrade-card.tsx
  • web/core/components/issues/issue-layouts/kanban/swimlanes.tsx
  • web/core/components/issues/issue-layouts/filters/header/helpers/filter-option.tsx
  • web/core/components/modules/analytics-sidebar/issue-progress.tsx
  • web/ce/components/workspace/upgrade/one-plan-upgrade.tsx
  • web/core/components/inbox/inbox-filter/filters/state.tsx
  • web/core/components/cycles/list/cycle-list-group-header.tsx
  • web/core/components/issues/issue-layouts/filters/header/filters/project.tsx
  • web/core/components/issues/issue-layouts/filters/header/filters/state.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx
  • web/core/components/issues/issue-layouts/group-drag-overlay.tsx
  • web/core/components/issues/issue-layouts/filters/header/filters/state-group.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/mobile-header.tsx
  • web/app/accounts/reset-password/page.tsx
  • web/app/[workspaceSlug]/(projects)/settings/(with-sidebar)/members/page.tsx
  • web/core/components/issues/issue-layouts/calendar/dropdowns/months-dropdown.tsx
  • web/core/components/modules/module-card-item.tsx
  • web/core/components/inbox/inbox-filter/filters/labels.tsx
  • web/core/components/core/filters/date-filter-modal.tsx
  • web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx
  • web/core/components/issues/issue-detail/issue-activity/comments/comment-card.tsx
  • web/core/components/pages/version/editor.tsx
  • web/core/components/gantt-chart/chart/header.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/mobile-header.tsx
  • web/core/components/core/modals/existing-issues-list-modal.tsx
  • web/core/components/issues/issue-layouts/calendar/header.tsx
  • web/core/components/modules/dropdowns/filters/lead.tsx
  • web/app/layout.tsx
  • web/core/components/issues/issue-detail/label/select/label-select.tsx
  • web/core/components/issues/issue-modal/components/description-editor.tsx
  • web/core/components/core/image-picker-popover.tsx
  • web/core/components/labels/label-drag-n-drop-HOC.tsx
  • web/core/components/api-token/token-list-item.tsx
  • web/core/components/common/latest-feature-block.tsx
  • web/core/components/estimates/create/modal.tsx
  • web/ce/components/pages/editor/ai/ask-pi-menu.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx
  • web/core/components/automation/select-month-modal.tsx
  • web/core/components/profile/notification/email-notification-form.tsx
  • web/core/components/cycles/analytics-sidebar/issue-progress.tsx
  • web/core/components/cycles/cycles-view-header.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/[cycleId]/page.tsx
  • web/core/components/issues/issue-layouts/quick-add/form/calendar.tsx
  • web/core/components/gantt-chart/helpers/draggable.tsx
  • web/core/components/inbox/inbox-filter/filters/members.tsx
  • web/core/components/gantt-chart/sidebar/modules/sidebar.tsx
  • web/core/components/issues/sub-issues/root.tsx
  • web/core/components/exporter/guide.tsx
  • web/app/profile/security/page.tsx
  • web/core/components/modules/analytics-sidebar/root.tsx
  • web/core/components/onboarding/switch-account-dropdown.tsx
  • web/ce/components/workspace/upgrade/pro-plan-upgrade.tsx
  • web/app/accounts/forgot-password/page.tsx
  • web/core/components/issues/issue-layouts/roots/project-layout-root.tsx
  • web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/activity-block.tsx
  • web/core/components/issues/issue-layouts/spreadsheet/issue-column.tsx
  • web/core/components/core/modals/bulk-delete-issues-modal.tsx
  • web/core/components/core/theme/theme-switch.tsx
  • web/core/components/inbox/content/inbox-issue-header.tsx
  • web/core/components/editor/lite-text-editor/toolbar.tsx
  • web/core/components/gantt-chart/chart/views/month.tsx
  • web/core/components/inbox/sidebar/root.tsx
  • web/core/components/account/auth-forms/unique-code.tsx
  • web/core/components/onboarding/invite-members.tsx
  • web/core/components/pages/editor/header/toolbar.tsx
  • web/core/components/dropdowns/priority.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(list)/mobile-header.tsx
  • web/core/components/cycles/analytics-sidebar/sidebar-header.tsx
  • web/app/accounts/set-password/page.tsx
  • web/ce/components/workspace/upgrade/paid-plans-upgrade-modal.tsx
  • web/core/components/onboarding/create-workspace.tsx
  • web/core/components/common/filters/created-by.tsx
  • web/core/components/pages/loaders/page-content-loader.tsx
  • web/core/components/issues/attachment/attachment-list-item.tsx
  • web/core/components/inbox/modals/select-duplicate.tsx
  • web/core/components/issues/issue-layouts/quick-add/form/spreadsheet.tsx
  • web/core/components/core/modals/workspace-image-upload-modal.tsx
  • web/core/components/issues/issue-detail-widgets/relations/content.tsx
  • web/core/components/home/root.tsx
  • web/core/components/issues/parent-issues-list-modal.tsx
  • web/core/components/issues/issue-detail/root.tsx
  • web/core/components/issues/issue-layouts/filters/header/filters/created-by.tsx
  • web/core/components/labels/project-setting-label-group.tsx
  • web/core/components/modules/archived-modules/header.tsx
  • web/core/components/editor/rich-text-editor/rich-text-editor.tsx
  • web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/header.tsx
  • web/core/components/issues/sub-issues/issue-list-item.tsx
  • web/core/components/issues/issue-layouts/list/list-group.tsx
  • web/core/components/issues/workspace-draft/root.tsx
  • web/core/components/estimates/points/create.tsx
  • web/core/components/analytics/custom-analytics/table.tsx
  • web/app/[workspaceSlug]/(projects)/analytics/page.tsx
  • web/core/components/pages/editor/editor-body.tsx
  • web/core/components/issues/issue-layouts/kanban/headers/sub-group-by-card.tsx
  • web/core/components/home/widgets/manage/widget-item-drag-handle.tsx
  • web/core/components/estimates/points/update.tsx
  • web/ce/components/active-cycles/workspace-active-cycles-upgrade.tsx
  • web/core/components/issues/issue-layouts/gantt/blocks.tsx
🧰 Additional context used
🧬 Code Definitions (4)
web/core/components/gantt-chart/helpers/blockResizables/left-resizable.tsx (1)
packages/utils/src/common.ts (1)
  • cn (7-7)
web/core/components/gantt-chart/helpers/blockResizables/right-resizable.tsx (1)
packages/utils/src/common.ts (1)
  • cn (7-7)
web/core/components/issues/issue-layouts/list/block.tsx (1)
web/ce/components/issues/issue-layouts/issue-stats.tsx (1)
  • IssueStats (13-13)
web/core/components/gantt-chart/chart/views/quarter.tsx (1)
packages/utils/src/common.ts (1)
  • cn (7-7)
🪛 Biome (1.9.4)
web/core/components/issues/issue-layouts/quick-add/root.tsx

[error] 162-162: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

🔇 Additional comments (88)
web/.gitignore (2)

4-4: Good addition: Ignoring the build directory (.next).
Adding .next ensures that Next.js build artifacts are not tracked in version control, which helps keep the repository clean and lean.


5-5: Proper inclusion of node_modules.
Including node_modules in the ignore list is a standard best practice for Node.js projects, as it avoids tracking bulky dependency files.

web/core/components/dashboard/widgets/issue-panels/tabs-list.tsx (1)

31-31: Great RTL support adjustment!

The change from left-[1px] to right-[1px] appears to be part of the Persian language support implementation, adjusting the positioning to accommodate right-to-left text direction. This change ensures the tab indicator is properly positioned in RTL layouts.

web/core/components/analytics/scope-and-demand/demand.tsx (2)

37-37: LGTM: Properly supporting RTL for Persian language

Changing from ml-1 to mr-1 ensures correct margin placement when the UI is displayed in right-to-left languages like Persian (فارسی).


45-45: LGTM: Ensuring correct progress bar direction for RTL languages

Changing the positioning from left-0 to right-0 ensures the progress bar animation starts from the correct side when displayed in right-to-left languages like Persian.

web/core/components/dashboard/widgets/loaders/issues-by-state-group.tsx (2)

10-10: Changed padding from left to right to support RTL languages.

The padding class has been changed from pl-6 to pr-6, which shifts the padding from the left side to the right side. This change supports right-to-left (RTL) layout for Persian language, which is the purpose of this PR.


14-14: Adjusted positioning to support RTL layout.

The positioning has been changed from left-1/2 to right-1/2, which modifies the horizontal alignment of this element to support right-to-left (RTL) layout for Persian. This is consistent with the PR's goal of adding Persian language support.

web/core/components/dashboard/widgets/overview-stats.tsx (3)

70-70: Changed border orientation for RTL language support.

The CSS selector has been updated to use border-l instead of border-r, changing the border from the right side to the left side of elements. This modification correctly supports right-to-left (RTL) layout for Persian language.


74-74: Updated border styling for larger screens to support RTL.

The large screen border class has been modified from lg:border-r to lg:border-l to maintain consistent RTL layout support across different screen sizes for Persian language.


89-89: Switched padding from left to right for RTL support.

The padding classes have been changed from pl-10 sm:pl-20 md:pl-20 lg:pl-20 to pr-10 sm:pr-20 md:pr-20 lg:pr-20, which shifts padding from the left side to the right side across all screen sizes. This change properly supports right-to-left (RTL) layout for Persian language.

web/core/components/gantt-chart/chart/views/week.tsx (1)

16-16: CSS class changed for RTL support

The change from left-0 to right-0 properly aligns the chart container for right-to-left languages like Persian. This modification ensures that the Gantt chart displays correctly when the application language is set to Persian.

web/core/components/gantt-chart/chart/views/quarter.tsx (2)

18-18: CSS class changed for RTL support

The change from left-0 to right-0 correctly aligns the chart container for right-to-left languages like Persian. This modification ensures that the Gantt chart displays properly when the application language is set to Persian.


42-42: Margin adjusted for RTL display

The margin class change from ml-2 to mr-2 correctly adjusts the spacing of the "Current" indicator for right-to-left text flow. This ensures proper visual presentation in Persian language mode.

web/core/components/onboarding/tour/root.tsx (1)

140-140: RTL layout support added for close button positioning

The positioning of the close button has been adjusted from right to left alignment, supporting right-to-left (RTL) language layouts which aligns with adding Persian language support to the application.

web/core/components/onboarding/profile-setup.tsx (5)

322-324: RTL layout support added for user avatar placeholder

The positioning of the avatar placeholder has been adjusted from left to right alignment, supporting right-to-left (RTL) language layouts.


331-335: RTL layout support added for user avatar image

The margin and positioning of the user avatar image have been updated to support right-to-left (RTL) language layouts.


345-345: RTL layout support added for form labels

The positioning of the required field asterisk has been adjusted to appear on the right side of labels, which is more natural for RTL languages like Persian.

Also applies to: 380-380, 510-510, 541-541


437-437: RTL layout support added for password input fields

The padding in password input fields has been adjusted from right to left to accommodate the icon positioning change for RTL support.

Also applies to: 480-480


444-445: RTL layout support added for password visibility toggles

The eye icons for toggling password visibility have been repositioned from the right side to the left side of the input fields, maintaining proper alignment for RTL languages.

Also applies to: 449-450, 484-485, 489-490

web/core/components/account/auth-forms/auth-banner.tsx (1)

22-22: RTL direction support for Persian language.

The class change from ml-auto to mr-auto flips the alignment of the close button, which is necessary for right-to-left (RTL) languages like Persian. This ensures proper layout when the application is used in Persian.

web/core/components/pages/loaders/page-loader.tsx (2)

14-14: RTL direction support for Persian language.

Changing from ml-auto to mr-auto correctly adjusts the layout for right-to-left (RTL) languages like Persian, ensuring that loader components are properly aligned.


24-24: RTL direction support for Persian language.

Similar to the previous change, this modification from ml-auto to mr-auto ensures proper alignment in RTL languages like Persian for the mapped loader items.

web/app/invitations/page.tsx (5)

137-137: Proper RTL support implemented for vertical border

The change from left-0 to right-0 and sm:border-r-[0.5px] to sm:border-l-[0.5px] correctly updates the border positioning to support right-to-left layout for Persian language.


139-141: RTL layout support for logo positioning

The positioning adjustment from left-5 to right-5 and sm:left-1/2 to sm:right-1/2 properly aligns the logo for right-to-left languages.


146-146: Email display positioning corrected for RTL

Changing from right-4 to left-4 and sm:right-16 to sm:left-16 appropriately repositions the user email display for right-to-left layout.


152-152: Invitation container padding adjusted for RTL

The padding adjustment from sm:pr-[8.33%] to sm:pl-[8.33%] correctly maintains the layout spacing for right-to-left text flow.


212-212: Empty state container aligned for RTL

The positioning change from left-0 to right-0 properly aligns the empty state container for right-to-left language display.

web/core/components/issues/peek-overview/view.tsx (1)

115-116: UI layout adjustments for RTL language support

The changes to positioning and borders (from right to left, and left to right) appear to be part of the Persian language support implementation, as Persian is a right-to-left (RTL) language. These modifications flip the UI layout direction appropriately.

Consider if these styles should be conditionally applied based on the current language direction rather than hardcoded, to ensure proper display for both LTR and RTL languages. This could be implemented using a context or hook that checks the current language direction.

web/core/components/editor/embeds/mentions/user.tsx (1)

74-74: Positioning change enhances RTL language support

The change from left-0 to right-0 properly aligns the user mention popup for right-to-left languages like Persian. This adjustment ensures that the popup appears on the right side, which feels more natural in RTL contexts.

web/core/components/cycles/cycle-peek-overview.tsx (1)

48-48: Layout adjustment for RTL support

Changing the position from right-0 to left-0 correctly repositions the cycle peek sidebar for right-to-left language support. This ensures the component appears on the correct side of the screen when using Persian or other RTL languages.

web/app/[workspaceSlug]/(projects)/sidebar.tsx (1)

57-57: Border and margin adjustments for RTL layout

The changes from border-r to border-l and md:ml-0 to md:mr-0 correctly modify the sidebar's border and margin positioning to support right-to-left languages. This ensures proper visual hierarchy when the application is used in Persian.

web/app/[workspaceSlug]/(projects)/settings/(with-sidebar)/layout.tsx (1)

38-38: Padding adjustment for RTL layout

Changing from !pr-0 to !pl-0 correctly adjusts the padding direction to support right-to-left text flow in Persian. This ensures consistent spacing in the workspace settings layout when using RTL languages.

web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/[moduleId]/page.tsx (1)

72-72: RTL layout adjustment for Persian language support

The change from border-r to border-l and right-0 to left-0 properly adjusts the sidebar positioning for right-to-left (RTL) languages like Persian. This ensures correct layout directionality when the application is displayed in Persian.

web/core/components/modules/module-peek-overview.tsx (1)

44-44: RTL layout adjustment for Persian language support

The changes to border and positioning classes (border-l to border-r and right-0 to left-0) provide proper RTL support for Persian language users. This ensures UI elements maintain proper positioning and borders in right-to-left reading contexts.

web/core/components/modules/module-view-header.tsx (1)

112-112: RTL layout adjustment for Persian language support

Changing ml-auto to mr-auto correctly adjusts the margin alignment for RTL languages. This ensures proper text alignment when displaying Persian content, which flows from right to left.

web/core/components/gantt-chart/blocks/block-row.tsx (1)

87-87: RTL layout adjustment for Persian language support

The changes from border-r-0 to border-l-0 appropriately adjust border styling for RTL language support. When displaying content in Persian, this ensures border styling appears correctly relative to the reading direction.

Also applies to: 91-91

web/core/components/empty-state/comic-box-button.tsx (3)

34-34: Good RTL adaptation for Persian language support.

Changing the placement from "right-end" to "left-end" is appropriate for supporting right-to-left languages like Persian. This ensures the popper element will be correctly positioned for RTL layouts.


56-58: Proper adjustment of positioning for RTL support.

The changes from right-aligned to left-aligned classes for these elements properly accommodate Persian language support by ensuring the UI components are correctly positioned in RTL layouts.


71-71: Correct RTL adaptation for comic box pointer.

The adjustments to the border and positioning properties ensure the pointer element will display correctly in RTL mode when used with Persian language.

web/core/components/gantt-chart/sidebar/root.tsx (3)

53-53: Good RTL adaptation for Gantt chart sidebar.

Changing the sidebar positioning from left to right and adjusting the border from right to left properly supports RTL layouts for Persian language.


60-60: Well implemented padding adjustment for RTL.

Changing padding from right to left (pr-4 to pl-4) ensures proper text alignment in RTL mode when displaying Persian content.


67-67: Appropriate positioning change for selection component.

Repositioning the MultipleSelectGroupAction from left to right side ensures proper alignment in RTL layouts for Persian language support.

web/core/components/gantt-chart/helpers/blockResizables/right-resizable.tsx (3)

35-35: Good RTL adaptation for date display.

Correctly repositioning the date indicator from right to left side supports proper RTL layout when displaying Persian dates.


47-47: Proper RTL adjustment for resize handle.

Moving the resize handle from right to left ensures the resizing functionality works correctly in RTL mode for Persian language users.


51-54: Correct adaptation of visual indicators for RTL.

The changes to the positioning classes and conditional styling ensure visual elements display properly in RTL layout when supporting Persian language.

web/app/[workspaceSlug]/(projects)/extended-sidebar.tsx (3)

107-107: Appropriate border adjustment for RTL support.

Changing the border from right to left properly supports RTL layout for Persian language users.


111-113: Correct sidebar positioning for RTL layout.

Adjusting the positioning from left-based to right-based ensures the sidebar appears on the correct side of the screen when using RTL languages like Persian.


106-114: Verify RTL transition direction.

The transition directional property (translate-x) was not updated despite the sidebar position changing from left to right. For RTL layouts, you should consider updating:

- "translate-x-0 opacity-100 pointer-events-auto": extendedSidebarCollapsed,
- "-translate-x-full opacity-0 pointer-events-none": !extendedSidebarCollapsed,
+ "translate-x-0 opacity-100 pointer-events-auto": extendedSidebarCollapsed,
+ "translate-x-full opacity-0 pointer-events-none": !extendedSidebarCollapsed,

This ensures the sidebar slides in from the right direction in RTL mode.

web/app/[workspaceSlug]/(projects)/extended-project-sidebar.tsx (3)

111-111: Border adjustment for RTL support.

The border has been changed from right to left to properly support right-to-left text direction for Persian language.


115-116: Positioning adjustment for RTL orientation.

Correctly updated positioning attributes from left to right to accommodate right-to-left (RTL) layout direction needed for Persian language support.


137-137: Margin alignment changed for RTL support.

The margin has been changed from ml-auto to mr-auto to maintain proper alignment in right-to-left text direction.

web/core/components/gantt-chart/helpers/blockResizables/left-resizable.tsx (3)

35-35: Date string positioning updated for RTL support.

The positioning of the date string div has been changed from -left-36 to -right-36 to maintain proper alignment in RTL layout.


49-49: Resize handle positioning changed for RTL layout.

The resize handle's positioning has been updated from -left-1.5 to -right-1.5 to ensure proper interaction in right-to-left orientation.


53-56: Resizing indicator adjusted for RTL direction.

The resizing indicator element's positioning and its conditional styling have been updated to work correctly in RTL layout.

web/core/components/gantt-chart/sidebar/issues/block.tsx (3)

44-45: Border adjustment for RTL layout support.

The border classes have been updated from border-r-0 to border-l-0 to properly handle right-to-left layout direction.


51-51: Padding direction flipped for RTL support.

Changed padding from right (pr-4) to left (pl-4) to maintain proper spacing in right-to-left text direction.


61-61: Selection action positioning updated for RTL layout.

The positioning of the multiple select entity action has been changed from left-1 to right-1 to ensure proper alignment in RTL layout.

web/app/create-workspace/page.tsx (4)

65-65: Divider orientation and positioning updated for RTL support.

The border and positioning of the divider element have been adjusted to properly align in right-to-left layout direction.


67-67: Logo link positioning adjusted for RTL orientation.

The logo link position has been changed from left to right alignment for proper display in right-to-left layout.


74-74: User email positioning changed for RTL layout.

The user email display has been repositioned from the right side to the left side to maintain proper layout in RTL context.


78-78: Content padding direction flipped for RTL support.

The main content padding has been changed from right-padding to left-padding to properly render content in right-to-left direction.

web/core/components/issues/issue-layouts/kanban/block.tsx (1)

86-86: Layout change for RTL language support

The positioning of the quick actions menu has been moved from the right side to the left side of the container. This change is aligned with adding Persian language support, as Persian is a right-to-left (RTL) language that requires UI mirroring.

web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx (2)

99-99: Updated positioning for RTL language support

The position of the MultipleSelectGroupAction component has been moved from left to right, which is consistent with the overall changes for supporting Persian as a right-to-left language.


122-122: Adjusted padding for RTL text layout

The count element's padding has been changed from left padding to right padding, which properly aligns the count text when the application is displayed in right-to-left mode for Persian language support.

web/core/components/cycles/list/cycle-list-project-group-header.tsx (2)

5-5: Changed directional icon for RTL support

Changing from ChevronRight to ChevronLeft is appropriate for Persian language support, as directional UI elements need to be mirrored in right-to-left languages.


40-40: Adjusted padding for RTL text layout

The padding has been changed from left to right to ensure proper text spacing when displaying content in a right-to-left language like Persian.

web/core/components/issues/issue-layouts/spreadsheet/spreadsheet-header.tsx (3)

46-46: Updated positioning for RTL language support

The sticky positioning has been changed from left to right, which is necessary for proper layout when displaying content in right-to-left languages like Persian.


49-49: Adjusted table header alignment for RTL support

This class modification ensures that the table header is properly aligned when the application is displayed in right-to-left mode for Persian language support.


54-54: Repositioned selection controls for RTL layout

The MultipleSelectGroupAction component's positioning and margin have been adjusted to align correctly in right-to-left layout required for Persian language support.

web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx (1)

255-257: Adjust positioning for RTL language support.

The change from left-1/2 to right-1/2 helps with RTL (right-to-left) language support for Persian, ensuring proper alignment of the delete area.

web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx (1)

137-138: Adjust padding for RTL language support.

The change from pl-2 (padding-left) to pr-2 (padding-right) properly adjusts the layout for RTL languages like Persian, ensuring correct spacing in the group-by card.

web/ce/components/pages/editor/ai/menu.tsx (3)

4-4: Update icon import for RTL language support.

Changing the import from ChevronRight to ChevronLeft is appropriate for RTL language support.


176-181: Update chevron direction for RTL language support.

Using ChevronLeft instead of ChevronRight provides the correct visual indicator for RTL languages.


265-265: Adjust padding for RTL language support.

Changing from pl-[54.8px] to pr-[54.8px] correctly adjusts the spacing for RTL languages.

web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx (6)

6-6: Update icon import for RTL language support.

Changing the import from ChevronRight to ChevronLeft is appropriate for RTL language support.


259-260: Adjust positioning for RTL language support.

Changing from left-0 to right-0 correctly positions the element for RTL languages.


264-266: Update border styling for RTL language support.

Switching from border-r-[0.5px] to border-l-[0.5px] correctly adjusts the border position for RTL layout.


289-303: Adjust checkbox positioning and margins for RTL language support.

The changes to position (right-1 to left-1) and margin (mr-1 to ml-1) properly align the selection checkbox for RTL languages.


332-338: Update chevron direction for RTL language support.

Using ChevronLeft instead of ChevronRight provides the correct visual indicator for RTL languages when expanding sub-issues.


348-349: Adjust text padding for RTL language support.

Changing from pr-4 to pl-4 correctly adjusts the text padding for RTL languages.

web/core/components/common/new-empty-state.tsx (3)

68-69: CSS adjustments for RTL support look good

These changes correctly position the decorative dots based on comic box direction, supporting right-to-left languages like Persian. The code now uses right-side positioning when direction is "left" and vice versa.

Also applies to: 73-74


82-84: Comic box positioning properly flipped for RTL

The positioning of the comic box and its connecting triangle has been correctly updated to support right-to-left layout. The change from left-1/2 to right-1/2 and ml to mr classes ensures proper alignment in RTL languages.

Also applies to: 86-87


97-99: Left direction comic box correctly positioned

The comic box positioning for the left direction case has been properly updated to support RTL languages, with appropriate margin and flex direction adjustments.

web/core/components/labels/label-block/label-item-block.tsx (1)

68-68:

❓ Verification inconclusive

Adjust positioning based on language direction rather than hardcoding.

The change from right-2.5 to left-2.5 appears to be part of adding support for Persian, which is a right-to-left (RTL) language. However, hardcoding the position to left-2.5 might affect the UI for left-to-right languages.

Consider using conditional styling based on the current language direction:

- className={`absolute left-2.5 flex items-start gap-3.5 px-4 ${
+ className={`absolute ${isRTL ? 'left-2.5' : 'right-2.5'} flex items-start gap-3.5 px-4 ${

This would ensure correct positioning for both RTL and LTR languages.


🏁 Script executed:

#!/bin/bash
# Search for RTL handling in the codebase
echo "Searching for RTL handling mechanisms in the codebase..."
rg -i "rtl|direction|right.to.left" --type ts --type tsx

# Search for language detection/setting
echo "Searching for language detection mechanisms..."
rg -i "language|locale|direction" --type ts --type tsx

Length of output: 397


#!/bin/bash
# Re-run the search by explicitly adding the TSX file type to capture all relevant files
echo "Searching for RTL handling keywords using explicit TSX file type..."
rg --type-add 'tsx:*.tsx' -i "isRTL|rtl|direction" .

echo "Searching for language detection patterns using explicit TSX file type..."
rg --type-add 'tsx:*.tsx' -i "locale|language|direction" .

Please run the above script to further verify if a conditional language direction mechanism (e.g., an isRTL flag or similar) already exists in the codebase. If the output still returns no relevant matches, manually verify whether there is a centralized RTL handling solution; otherwise, consider integrating one.


Use Conditional RTL Positioning in Label Item Block

Instead of hardcoding left-2.5, update the class to conditionally apply positioning based on the current language direction. For example:

- className={`absolute left-2.5 flex items-start gap-3.5 px-4 ${
+ className={`absolute ${isRTL ? 'left-2.5' : 'right-2.5'} flex items-start gap-3.5 px-4 ${

Ensure that a robust RTL detection mechanism is in place. If one isn’t present, please consider adding it to support multiple languages and avoid UI issues for left-to-right layouts.


</details>
<details>
<summary>web/core/components/profile/form.tsx (1)</summary>

`174-174`: **Element positioning flipped to support RTL layout.**

The positioning of UI elements has been changed to better support right-to-left (RTL) languages like Persian (فارسی). The profile picture container is now positioned to the right, and the cover image picker is positioned to the left.



Also applies to: 186-186, 197-197

</details>
<details>
<summary>web/core/components/account/auth-forms/forgot-password-popover.tsx (1)</summary>

`14-14`: **Popover position adjusted for RTL layout.**

The popover placement has been changed from "right-start" to "left-start" and margin adjusted from "ml-3" to "mr-3" to better support right-to-left languages like Persian.



Also applies to: 41-41

</details>
<details>
<summary>web/core/components/account/auth-forms/password.tsx (1)</summary>

`188-188`: **Icons and padding adjusted for RTL layout.**

The positioning of icons and padding has been changed to support right-to-left languages:
1. Icons (eye, eye-off, x-circle) are now positioned on the left instead of right
2. Padding has been changed from right padding to left padding

These changes improve the user experience for Persian language users.



Also applies to: 206-206, 214-214, 219-219, 239-239, 245-245, 250-250

</details>
<details>
<summary>web/core/components/modules/gantt-chart/blocks.tsx (1)</summary>

`59-59`: <details>
<summary>❓ Verification inconclusive</summary>

**Verify RTL layout consistency**

Changing this div's position from `left-0` to `right-0` seems to be part of supporting right-to-left (RTL) layout for Persian language. However, the div at lines 60-65 still uses left-based positioning with `left: ${SIDEBAR_WIDTH}px`. For comprehensive RTL support, consider whether this element's positioning also needs adjustment.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check how RTL direction is handled elsewhere in the codebase

# Look for RTL direction implementations
echo "Searching for RTL direction implementations..."
rg -A 2 "direction.*rtl|dir=.rtl" --type tsx --type ts

# Look for other instances of right-0 positioning that might be part of this RTL effort
echo "Searching for right-0 positioning in similar components..."
rg -A 2 "className=.*right-0.*top-0" --type tsx

Length of output: 392


Action Required: Verify and Align RTL Layout Positioning

The change to using right-0 in line 59 appears intended to enable RTL support. However, the subsequent element (lines 60–65) still employs left-based positioning (using left: ${SIDEBAR_WIDTH}px), which could lead to inconsistent layouts for RTL languages like Persian. Since our initial automated search didn’t yield clear results (due to file type recognition issues), please perform a manual verification to confirm that the left-based styling is either appropriately adjusted in an RTL context or revised so all elements consistently support RTL layouts.

@@ -41,7 +41,7 @@ export const TimezoneSelect: FC<TTimezoneSelect> = observer((props) => {
options={isDisabled || disabled ? [] : timezones}
onChange={onChange}
buttonClassName={cn(buttonClassName, {
"border-red-500": error,
"border-led-500": error,
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Possible typo in error border class name.

The border class has been changed from what appears to be border-red-500 (standard error color) to border-led-500. This seems like a typo as "led" is not a standard color name in most CSS frameworks. If this is related to Persian language support, the connection isn't clear.

If led is a custom color variable that has been defined elsewhere for internationalization purposes, please clarify. Otherwise, consider reverting to border-red-500 or the correct color name.


🏁 Script executed:

#!/bin/bash
# Search for other instances of "border-led-500" to see if it's used elsewhere
echo "Searching for border-led-500 in the codebase..."
rg "border-led-500" --type ts --type tsx --type js --type jsx

echo -e "\nSearching for custom color definitions that might include 'led'..."
rg "led.*?:" --type ts --type tsx --type css --type scss

Length of output: 436


Attention: Confirm the intended border color in timezone-select.tsx

  • The file at web/core/components/global/timezone-select.tsx (line 44) currently uses "border-led-500", which is non-standard.
  • A search for any other occurrence or custom definition of a color class containing "led" yielded no results, suggesting it may be a typo.
  • If this was meant to be a custom value for internationalization or another purpose, please document its usage. Otherwise, consider reverting to the common "border-red-500" for error states.

@@ -32,7 +32,7 @@ export const PageEditorTitle: React.FC<Props> = observer((props) => {
});

return (
<div className="relative w-full flex-shrink-0 md:pl-5 px-4">
<div className="relative w-full flex-shrink-0 md:pr-5 px-4">
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Consider dynamic RTL/LTR padding adjustment

The padding direction has been changed from md:pl-5 to md:pr-5 to support Persian (RTL) language. This works for RTL languages but might create inconsistencies for LTR languages.

Consider using dynamic padding based on the current language direction:

-<div className="relative w-full flex-shrink-0 md:pr-5 px-4">
+<div className={cn("relative w-full flex-shrink-0 px-4", {
+  "md:pr-5": isRTL, // for RTL languages like Persian
+  "md:pl-5": !isRTL // for LTR languages
+})}>

This would require adding a context or hook to determine the current language direction (isRTL).

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div className="relative w-full flex-shrink-0 md:pr-5 px-4">
<div className={cn("relative w-full flex-shrink-0 px-4", {
"md:pr-5": isRTL, // for RTL languages like Persian
"md:pl-5": !isRTL // for LTR languages
})}>

@@ -65,7 +65,7 @@ export const PageEditorTitle: React.FC<Props> = observer((props) => {
/>
<div
className={cn(
"pointer-events-none absolute bottom-1 right-1 z-[2] rounded bg-custom-background-100 p-0.5 text-xs text-custom-text-200 opacity-0 transition-opacity",
"pointer-events-none absolute bottom-1 left-1 z-[2] rounded bg-custom-background-100 p-0.5 text-xs text-custom-text-200 opacity-0 transition-opacity",
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Consider dynamic RTL/LTR positioning

The character counter positioning has been changed from right-1 to left-1 to accommodate Persian language's RTL layout. While this works for RTL languages, it creates inconsistency for LTR languages.

Consider dynamically setting the position based on the current language direction:

-"pointer-events-none absolute bottom-1 left-1 z-[2] rounded bg-custom-background-100 p-0.5 text-xs text-custom-text-200 opacity-0 transition-opacity",
+"pointer-events-none absolute bottom-1 z-[2] rounded bg-custom-background-100 p-0.5 text-xs text-custom-text-200 opacity-0 transition-opacity",
+isRTL ? "left-1" : "right-1",

This would ensure the character counter appears in the correct position regardless of language direction.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"pointer-events-none absolute bottom-1 left-1 z-[2] rounded bg-custom-background-100 p-0.5 text-xs text-custom-text-200 opacity-0 transition-opacity",
"pointer-events-none absolute bottom-1 z-[2] rounded bg-custom-background-100 p-0.5 text-xs text-custom-text-200 opacity-0 transition-opacity",
isRTL ? "left-1" : "right-1",

Comment on lines +263 to 265
} flex w-full items-center justify-center rounded border-2 border-led-500/20 bg-custom-background-100 px-3 py-5 text-xs font-medium italic text-red-500 ${
isDragOverDelete ? "bg-red-500 opacity-70 blur-2xl" : ""
} transition duration-300`}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix incorrect CSS class name.

There appears to be a typo in the border color class. You've changed it from border-red-500/20 to border-led-500/20. The color "led" doesn't exist in standard Tailwind CSS.

-              } flex w-full items-center justify-center rounded border-2 border-led-500/20 bg-custom-background-100 px-3 py-5 text-xs font-medium italic text-red-500 ${
+              } flex w-full items-center justify-center rounded border-2 border-red-500/20 bg-custom-background-100 px-3 py-5 text-xs font-medium italic text-red-500 ${
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
} flex w-full items-center justify-center rounded border-2 border-led-500/20 bg-custom-background-100 px-3 py-5 text-xs font-medium italic text-red-500 ${
isDragOverDelete ? "bg-red-500 opacity-70 blur-2xl" : ""
} transition duration-300`}
} flex w-full items-center justify-center rounded border-2 border-red-500/20 bg-custom-background-100 px-3 py-5 text-xs font-medium italic text-red-500 ${
isDragOverDelete ? "bg-red-500 opacity-70 blur-2xl" : ""
} transition duration-300`}

!isProjectLevel
? "absolute bottom-0 right-0 top-0 h-full max-w-[250px] flex-shrink-0 sm:max-w-full md:relative"
? "absolute bottom-0 left-0 top-0 h-full max-w-[250px] flex-shrink-0 sm:max-w-full md:relative"
: ""
)}
style={workspaceAnalyticsSidebarCollapsed ? { right: `-${window?.innerWidth || 0}px` } : {}}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix sidebar collapse animation for RTL layouts.

The sidebar has been moved to the left side, but the collapse animation still uses right positioning, which will cause incorrect animation behavior for RTL layouts.

Update the collapse animation to use the appropriate side based on layout direction:

- style={workspaceAnalyticsSidebarCollapsed ? { right: `-${window?.innerWidth || 0}px` } : {}}
+ style={workspaceAnalyticsSidebarCollapsed 
+   ? (isRTL 
+      ? { left: `-${window?.innerWidth || 0}px` } 
+      : { right: `-${window?.innerWidth || 0}px` }) 
+   : {}}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
style={workspaceAnalyticsSidebarCollapsed ? { right: `-${window?.innerWidth || 0}px` } : {}}
style={workspaceAnalyticsSidebarCollapsed
? (isRTL
? { left: `-${window?.innerWidth || 0}px` }
: { right: `-${window?.innerWidth || 0}px` })
: {}}

@@ -213,7 +213,7 @@ export const ProfileLayoutSidebar = observer(() => {
{workspace?.logo_url && workspace.logo_url !== "" ? (
<img
src={getFileURL(workspace.logo_url)}
className="absolute left-0 top-0 h-full w-full rounded object-cover"
className="absolute right-0 top-0 h-full w-full rounded object-cover"
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Logo positioning should adapt to language direction

Workspace logo positioning has been changed from left-0 to right-0. This should be conditional for proper multilingual support:

- className="absolute right-0 top-0 h-full w-full rounded object-cover"
+ className={`absolute ${isRTL ? 'right-0' : 'left-0'} top-0 h-full w-full rounded object-cover`}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
className="absolute right-0 top-0 h-full w-full rounded object-cover"
className={`absolute ${isRTL ? 'right-0' : 'left-0'} top-0 h-full w-full rounded object-cover`}

@@ -188,7 +188,7 @@ export const ProfileLayoutSidebar = observer(() => {
<div
className={cn("vertical-scrollbar scrollbar-xs mt-2 px-4 h-full space-y-1.5 overflow-y-auto", {
"scrollbar-sm": !sidebarCollapsed,
"ml-2.5 px-1": sidebarCollapsed,
"mr-2.5 px-1": sidebarCollapsed,
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Scrollbar margins should adapt to language direction

The scrollbar margin has been changed from ml-2.5 px-1 to mr-2.5 px-1. For proper RTL support, this should be conditional:

- "mr-2.5 px-1": sidebarCollapsed,
+ [isRTL ? "mr-2.5" : "ml-2.5", "px-1"].join(" "): sidebarCollapsed,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"mr-2.5 px-1": sidebarCollapsed,
[isRTL ? "mr-2.5" : "ml-2.5", "px-1"].join(" "): sidebarCollapsed,

Comment on lines +128 to +131
className={`fixed inset-y-0 z-20 flex h-full flex-shrink-0 flex-grow-0 flex-col border-l border-custom-sidebar-border-200 bg-custom-sidebar-background-100 duration-300 md:relative
${sidebarCollapsed ? "-ml-[250px]" : ""}
sm:${sidebarCollapsed ? "-ml-[250px]" : ""}
md:ml-0 ${sidebarCollapsed ? "w-[70px]" : "w-[250px]"}
md:mr-0 ${sidebarCollapsed ? "w-[70px]" : "w-[250px]"}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Directional styles should adapt to the current language

The sidebar border and positioning have been unconditionally changed from border-r to border-l and margins from ml- to mr- to support RTL layout for Persian. This will affect all users regardless of their language preference.

Consider using a conditional approach to apply directional styles:

- className={`fixed inset-y-0 z-20 flex h-full flex-shrink-0 flex-grow-0 flex-col border-l border-custom-sidebar-border-200 bg-custom-sidebar-background-100 duration-300 md:relative 
+ className={`fixed inset-y-0 z-20 flex h-full flex-shrink-0 flex-grow-0 flex-col ${isRTL ? 'border-l' : 'border-r'} border-custom-sidebar-border-200 bg-custom-sidebar-background-100 duration-300 md:relative 
  ${sidebarCollapsed ? "-ml-[250px]" : ""}
  sm:${sidebarCollapsed ? "-ml-[250px]" : ""}
- md:mr-0 ${sidebarCollapsed ? "w-[70px]" : "w-[250px]"}
+ md:${isRTL ? 'mr-0' : 'ml-0'} ${sidebarCollapsed ? "w-[70px]" : "w-[250px]"}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
className={`fixed inset-y-0 z-20 flex h-full flex-shrink-0 flex-grow-0 flex-col border-l border-custom-sidebar-border-200 bg-custom-sidebar-background-100 duration-300 md:relative
${sidebarCollapsed ? "-ml-[250px]" : ""}
sm:${sidebarCollapsed ? "-ml-[250px]" : ""}
md:ml-0 ${sidebarCollapsed ? "w-[70px]" : "w-[250px]"}
md:mr-0 ${sidebarCollapsed ? "w-[70px]" : "w-[250px]"}
className={`fixed inset-y-0 z-20 flex h-full flex-shrink-0 flex-grow-0 flex-col ${isRTL ? 'border-l' : 'border-r'} border-custom-sidebar-border-200 bg-custom-sidebar-background-100 duration-300 md:relative
${sidebarCollapsed ? "-ml-[250px]" : ""}
sm:${sidebarCollapsed ? "-ml-[250px]" : ""}
md:${isRTL ? 'mr-0' : 'ml-0'} ${sidebarCollapsed ? "w-[70px]" : "w-[250px]"}

@@ -6,7 +6,7 @@ import Link from "next/link";
import { usePathname } from "next/navigation";
// icons
import {
ChevronLeft,
ChevronRight,
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Ensure RTL-specific changes are conditionally applied

You've changed ChevronLeft to ChevronRight for the sidebar navigation, which appears to be for RTL language support (Persian). However, this change is applied unconditionally, which would affect the UI for all languages, not just RTL languages.

Consider making this conditional based on the current language direction:

- <ChevronRight className="h-5 w-5" strokeWidth={1} />
+ {isRTL ? <ChevronRight className="h-5 w-5" strokeWidth={1} /> : <ChevronLeft className="h-5 w-5" strokeWidth={1} />}

You'll need to add a variable to detect if the current language is RTL.

Committable suggestion skipped: line range outside the PR's diff.

@@ -139,7 +139,7 @@ export const ProfileLayoutSidebar = observer(() => {
}`}
>
<span className="grid h-5 w-5 flex-shrink-0 place-items-center">
<ChevronLeft className="h-5 w-5" strokeWidth={1} />
<ChevronRight className="h-5 w-5" strokeWidth={1} />
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Chevron direction should change based on language direction

The chevron icon should point in different directions based on whether the current language is LTR or RTL. This change unconditionally uses ChevronRight which would be incorrect for LTR languages.

- <ChevronRight className="h-5 w-5" strokeWidth={1} />
+ {isRTL ? <ChevronRight className="h-5 w-5" strokeWidth={1} /> : <ChevronLeft className="h-5 w-5" strokeWidth={1} />}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<ChevronRight className="h-5 w-5" strokeWidth={1} />
{isRTL ? <ChevronRight className="h-5 w-5" strokeWidth={1} /> : <ChevronLeft className="h-5 w-5" strokeWidth={1} />}

@sriramveeraghanta
Copy link
Member

Hey @mmkhakdaman

Our plane component currently does not support Right-to-Left (RTL) language rendering. We are in the process of implementing comprehensive RTL support. Once our component changes are fully implemented, manual modifications to individual components will not be necessary.

Additionally, the changes you have proposed affect multiple components that could impact other language implementations. Therefore, we cannot merge your pull request at this time. We kindly request that you allow us some time to resolve these technical considerations on our end.

@sriramveeraghanta
Copy link
Member

Closing this PR as the changes will effect other languages, You changes will transform UI from LTR to RTL.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants