Skip to content

[WEB-5188 | WEB-5190] chore: layout and properties icon revamp #7980

Merged
pushya22 merged 20 commits intopreviewfrom
chore-layout-and-properties-icon-revamp
Oct 24, 2025
Merged

[WEB-5188 | WEB-5190] chore: layout and properties icon revamp #7980
pushya22 merged 20 commits intopreviewfrom
chore-layout-and-properties-icon-revamp

Conversation

@anmolsinghbhatia
Copy link
Collaborator

@anmolsinghbhatia anmolsinghbhatia commented Oct 16, 2025

Summary

This PR includes following changes:

  • Layout and Properties icon migration from luicde to propel.
  • Icon component refactoring

Layout icon:

  • List -> ListLayoutIcon
  • Kanban -> BoardLayoutIcon
  • Calendar -> CalendarLayoutIcon
  • Sheet -> SheetLayoutIcon
  • GanttChartSquare -> TimelineLayoutIcon
  • LayoutGrid -> GridLayoutIcon
  • GalleryVertical -> CardLayoutIcon

Properties icon:

  • DoubleCircleIcon -> StatePropertyIcon
  • Users → MembersPropertyIcon
  • Signal → PriorityPropertyIcon
  • CalendarClock → StartDatePropertyIcon
  • CalendarCheck2 → DueDatePropertyIcon
  • Tag → LabelPropertyIcon
  • CopyPlus → DuplicatePropertyIcon
  • UserCircle2 → UserCirclePropertyIcon
  • Triangle → EstimatePropertyIcon
  • LayoutPanelTop → ParentPropertyIcon
  • Waypoints → RelationPropertyIcon

Reference

[WEB-5188 | WEB-5190]

Summary by CodeRabbit

  • UI Enhancements

    • Standardized and replaced icons across the app (properties, dropdowns, headers, modals, sidebars, action lists, layouts) for a consistent visual language.
    • New property and layout icons improve clarity for state, priority, dates, members, labels, parent, duplicate, relations, estimates, and views.
  • New Features

    • Introduced a centralized icon registry, a dynamic Icon component, and an icons gallery for previewing sizes and categories.
  • Refactor

    • Consolidated icon assets and a wrapper to unify sizing, coloring, and rendering across components.

@anmolsinghbhatia anmolsinghbhatia self-assigned this Oct 16, 2025
@makeplane
Copy link

makeplane bot commented Oct 16, 2025

Linked to Plane Work Item(s)

References

This comment was auto-generated by Plane

@anmolsinghbhatia anmolsinghbhatia changed the title [WEB-5188 | WEB-5190] chore: new layout icon set added to propel [WEB-5188 | WEB-5190] chore: layout and properties icon revamp Oct 16, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 16, 2025

Walkthrough

Replaced lucide-react icons across the codebase with a new @plane/propel icon system: added IconWrapper, ICON_REGISTRY, Icon helper APIs, many new property/layout/project/sub-brand icons and barrels, Storybook stories, and updated numerous app files to use the new icons and adjusted a few icon prop signatures.

Changes

Cohort / File(s) Summary
Icon infra & registry
packages/propel/src/icons/icon-wrapper.tsx, packages/propel/src/icons/icon.tsx, packages/propel/src/icons/registry.ts, packages/propel/src/icons/helpers.ts, packages/propel/src/icons/default-icon.tsx
Add IconWrapper, Icon component, ICON_REGISTRY, helper APIs (getIconComponent, isValidIconName, getIconNames, getIconsByCategory) and DefaultIcon.
Property icons & barrel
packages/propel/src/icons/properties/*, packages/propel/src/icons/properties/index.ts
Add many property icons (MembersPropertyIcon, DueDatePropertyIcon, StatePropertyIcon, PriorityPropertyIcon, LabelPropertyIcon, EstimatePropertyIcon, StartDatePropertyIcon, ParentPropertyIcon, UserCirclePropertyIcon, ScopePropertyIcon, DuplicatePropertyIcon, OverdueDatePropertyIcon, WorkflowsPropertyIcon, HashPropertyIcon, DropdownPropertyIcon, etc.) and a properties barrel export.
Layout icons & barrel
packages/propel/src/icons/layouts/*, packages/propel/src/icons/layouts/index.ts
Add layout icons (ListLayoutIcon, BoardLayoutIcon, CalendarLayoutIcon, GridLayoutIcon, TimelineLayoutIcon, SheetLayoutIcon, CardLayoutIcon) and export them from a layouts index.
Project & sub-brand icons
packages/propel/src/icons/project/*, packages/propel/src/icons/sub-brand/*
Add/refactor project icons (CycleIcon refactor, EpicIcon, WorkItemsIcon, Intake/Module/Page/View refactors) and sub-brand icons (pi-chat, plane, wiki) with barrel exports.
Propel public API & constants
packages/propel/src/icons/index.ts, packages/propel/src/icons/constants.tsx, packages/propel/src/icons/actions/index.ts
Rework public exports (add IconName/IconProps/ICON_REGISTRY exports), add categorized icon maps/constants, and add actions barrel; reorganize package export surface.
Stories / docs
packages/propel/src/icons/icons.stories.tsx, packages/propel/src/icons/constants.tsx
Add Storybook stories showcasing icons, registry usage, and sizes; add categorized icon constants used by the stories.
Icon components refactor (wrapper adoption)
many packages/propel/src/icons/* (project/sub-brand modules)
Convert many icon components to use IconWrapper and unified ISvgIcons props (remove width/height/className from public signatures, add clipPathId handling).
Apps — bulk icon swaps
apps/.../core/..., apps/.../web/... (many files; see diff)
Replace lucide-react icon imports/usages with @plane/propel/icons across ~100+ app files; mostly direct swaps in JSX and imports; a few components adjusted to accept size/width/height differences (e.g., IssueLayoutIcon, ModuleLayoutIcon).
Constants update
packages/constants/src/issue/common.ts
Update SPREADSHEET_PROPERTY_DETAILS icon name strings to new property icon keys.
Misc
.gitignore
Add AGENTS.md to .gitignore and adjust temp/ entry.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant UI as Component
    participant IconComp as Icon(name)
    participant Registry as ICON_REGISTRY
    participant Impl as SpecificIcon
    participant Wrapper as IconWrapper
    UI->>IconComp: <Icon name="property.state" {...props}/>
    IconComp->>Registry: lookup(name)
    Registry-->>IconComp: returns Impl (or default)
    IconComp->>Impl: render with props
    Impl->>Wrapper: IconWrapper({ color, clipPathId?, ... })
    Wrapper->>SVG: render <svg> + <path fill={color}/>
    SVG-->>Wrapper: rendered SVG
    Wrapper-->>Impl: wrapped output
    Impl-->>IconComp: JSX
    IconComp-->>UI: rendered icon
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60–90 minutes

Possibly related PRs

Suggested reviewers

  • sriramveeraghanta
  • prateekshourya29
  • vamsikrishnamathala

Poem

🐰
New glyphs hop into the wood,
A tidy registry hums for good,
Wrapped paths sparkle where they stood,
A hundred files now wear them proud,
I nibble code and sing aloud. 🥕

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed The PR title "[WEB-5188 | WEB-5190] chore: layout and properties icon revamp" is clear, specific, and directly summarizes the main objective of the changeset. The title accurately captures that this PR involves migrating layout and properties icons from lucide-react to the @plane/propel icon library. The phrasing "icon revamp" appropriately describes the comprehensive icon replacement and component refactoring across the codebase. The title is concise, avoids vague language, and provides enough context for a developer reviewing the commit history to understand the primary change.
Description Check ✅ Passed The PR description provides substantial detail about the changes, including a clear summary and comprehensive mappings of all icon migrations for both layout icons and properties icons. However, the description is missing two required template sections: "Type of Change" (with checkboxes for Bug fix, Feature, Improvement, Code refactoring, etc.) and "Test Scenarios" (describing how the changes were tested). The provided description does include a summary equivalent and references, and the information present is detailed and specific rather than vague. Since the core content about what changed is clearly communicated, this represents a mostly complete description despite the missing template sections.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore-layout-and-properties-icon-revamp

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c6f0f5a and 7f775ee.

📒 Files selected for processing (1)
  • .gitignore (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • .gitignore
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Analyze (javascript)
  • GitHub Check: Build and lint web apps

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@anmolsinghbhatia anmolsinghbhatia marked this pull request as ready for review October 18, 2025 13:54
Copilot AI review requested due to automatic review settings October 18, 2025 13:54
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR migrates layout and properties icons from Lucide to the Propel icon system, introducing a centralized icon registry and wrapper component for consistent icon management across the codebase.

Key Changes:

  • Introduced IconWrapper component and icon registry system for centralized icon management
  • Migrated 7 layout icons and 20+ property icons from Lucide to Propel
  • Refactored icon components to use consistent structure and naming conventions

Reviewed Changes

Copilot reviewed 120 out of 120 changed files in this pull request and generated no comments.

Show a summary per file
File Description
packages/propel/src/icons/registry.ts New icon registry mapping icon names to components
packages/propel/src/icons/icon-wrapper.tsx New wrapper component providing consistent SVG structure
packages/propel/src/icons/icon.tsx New Icon component for registry-based icon usage
packages/propel/src/icons/layouts/*.tsx New layout icon components (list, board, calendar, sheet, timeline, grid, card)
packages/propel/src/icons/properties/*.tsx New property icon components (state, members, priority, dates, labels, etc.)
packages/propel/src/icons/workspace/*.tsx Refactored workspace icons to use IconWrapper
packages/propel/src/icons/project/*.tsx Refactored project icons to use IconWrapper
packages/propel/src/icons/sub-brand/*.tsx Refactored sub-brand icons to use IconWrapper
packages/constants/src/issue/common.ts Updated icon references from Lucide to Propel names
apps/web/core/components/**/*.tsx Updated imports and usage across application components

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/web/ce/components/issues/issue-layouts/utils.tsx (1)

67-81: Update SPREADSHEET_PROPERTY_DETAILS modules icon key or the map key to ensure consistency.

Verification found a mismatch: the modules property in SPREADSHEET_PROPERTY_DETAILS (packages/constants/src/issue/common.ts, line 284) uses icon key "DiceIcon", but the SpreadSheetPropertyIconMap in the PR uses key "ModuleIcon". This will cause the modules column header icon to render as null.

Update either:

  • Change packages/constants/src/issue/common.ts line 284 from icon: "DiceIcon" to icon: "ModuleIcon", or
  • Change the map key from ModuleIcon to DiceIcon and add the appropriate DiceIcon import
packages/constants/src/issue/common.ts (1)

244-316: Update line 252: created_on property uses invalid icon name "CalendarDays".

The PR successfully updates most property icons to valid Propel icons (MembersPropertyIcon, DueDatePropertyIcon, etc.), but the created_on property at line 252 retains "CalendarDays", which is a Lucide icon name that does not exist in Propel exports. This will cause a runtime error.

Change line 252 from icon: "CalendarDays" to a valid Propel icon name. Based on the pattern of the updated icons, likely candidates are "CalendarLayoutIcon" or a dedicated date icon if one exists.

Additionally, properties outside this section (updated_on at line 324, link at line 332, attachment_count at line 340) also use undefined Lucide icons (CalendarDays, Link2, Paperclip) and should be addressed in a follow-up to maintain consistency across the constant.

♻️ Duplicate comments (2)
packages/propel/src/icons/properties/state-icon.tsx (1)

6-13: Same clipPath ID collision issue applies here.

This icon uses a hardcoded clipPathId="clip0_1617_2765" which has the same collision risk mentioned in the CycleIcon review. Please apply the same fix across all icons with hardcoded clipPathId values.

packages/propel/src/icons/properties/label-icon.tsx (1)

6-17: Same clipPath ID collision issue applies here.

This icon uses a hardcoded clipPathId="clip0_1617_2786". Please apply the same fix for unique ID generation as noted in the CycleIcon review.

🧹 Nitpick comments (12)
packages/propel/src/icons/properties/boolean-icon.tsx (1)

1-13: Clean implementation following icon system conventions.

The component structure is solid: proper TypeScript typing, sensible default for color ("currentColor" inherits parent text color), and correct use of fill={color} on the path element.

Minor observation: you're passing color={color} to IconWrapper, but based on the relevant code snippet, IconWrapper doesn't explicitly use a color prop—it only spreads ...rest onto the <svg> element. Since SVG elements don't have a native color attribute and the actual coloring happens via fill={color} on the path, passing color to IconWrapper appears unnecessary. If this is a consistent pattern across all property icons for future extensibility, that's fine; otherwise, you could simplify to just spread {...rest}.

If desired, you could simplify to:

-  <IconWrapper color={color} {...rest}>
+  <IconWrapper {...rest}>

(Only if color isn't needed by IconWrapper and this pattern isn't intentional across the icon system.)

packages/propel/src/icons/sub-brand/plane-icon.tsx (1)

6-6: Minor: file name vs export name mismatch.

The file is plane-icon.tsx but exports PlaneNewIcon. Consider renaming the file to plane-new-icon.tsx or exporting PlaneIcon for discoverability.

apps/web/core/components/modules/select/status.tsx (1)

37-41: LGTM; add aria-hidden to decorative placeholder icon.

StatePropertyIcon is decorative when no value is selected; hide it from screen readers.

-                  <StatePropertyIcon className={`h-3 w-3 ${error ? "text-red-500" : "text-custom-text-200"}`} />
+                  <StatePropertyIcon
+                    aria-hidden="true"
+                    className={`h-3 w-3 ${error ? "text-red-500" : "text-custom-text-200"}`}
+                  />
apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/state.tsx (1)

25-27: LGTM; mark the activity icon as decorative.

The state glyph here is non-informational text-wise; hide it from AT.

-      icon={<StatePropertyIcon className="h-4 w-4 flex-shrink-0 text-custom-text-200" />}
+      icon={<StatePropertyIcon aria-hidden="true" className="h-4 w-4 flex-shrink-0 text-custom-text-200" />}
apps/web/core/components/integration/github/root.tsx (1)

57-79: Use Propel's WorkItemsIcon for "Work item" step to align with lucide→Propel migration.

The WorkItemsIcon is properly exported from "@plane/propel/icons" and the import path is already used elsewhere in the file (e.g., MembersPropertyIcon). Update line 9 and the integration workflow data mapping:

-import { ArrowLeft, Check, List, Settings, UploadCloud } from "lucide-react";
-import { MembersPropertyIcon } from "@plane/propel/icons";
+import { ArrowLeft, Check, Settings, UploadCloud } from "lucide-react";
+import { MembersPropertyIcon, WorkItemsIcon } from "@plane/propel/icons";
-  { title: "Work item", key: "repo-details", icon: List },
+  { title: "Work item", key: "repo-details", icon: WorkItemsIcon },
apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/label.tsx (1)

3-3: Icon migration correct, but note minor inconsistency.

The replacement of Tag with LabelPropertyIcon is functionally correct. However, this file uses explicit height={14} width={14} props while most other files in this PR use className-based sizing (e.g., className="h-3.5 w-3.5"). Both approaches work, but consider standardizing for consistency.

To align with the more common pattern in this PR:

-      icon={<LabelPropertyIcon height={14} width={14} className="text-custom-text-200" />}
+      icon={<LabelPropertyIcon className="h-3.5 w-3.5 text-custom-text-200" />}

Also applies to: 27-27

packages/propel/src/icons/icon.tsx (1)

6-8: Exclude "default" from IconName; keep runtime fallback (optional dev‑warn).

Prevent passing "default" via types. Keep fallback for safety; optionally warn in dev when fallback triggers.

*** packages/propel/src/icons/registry.ts
-export type IconName = keyof typeof ICON_REGISTRY;
+export type IconName = Exclude<keyof typeof ICON_REGISTRY, "default">;

Optional (dev only) in Icon:

 export const Icon: React.FC<IconProps> = ({ name, ...props }) => {
-  const IconComponent = ICON_REGISTRY[name] || ICON_REGISTRY.default;
+  const IconComponent = ICON_REGISTRY[name] || ICON_REGISTRY.default;
+  if (process.env.NODE_ENV !== "production" && !ICON_REGISTRY[name]) {
+    // eslint-disable-next-line no-console
+    console.warn(`[Icon] Unknown icon name: ${String(name)}; rendering default.`);
+  }
   return <IconComponent {...props} />;
 };

Also applies to: 10-12

packages/propel/src/icons/icons.stories.tsx (1)

1-1: Align Storybook typings with recommended CSF usage.

Import types from @storybook/react; use satisfies Meta and type stories from typeof meta.

-import type { Meta, StoryObj } from "@storybook/react-vite";
+import type { Meta, StoryObj } from "@storybook/react";
@@
-const meta: Meta = {
+const meta = {
   title: "Icons",
   parameters: {
     layout: "padded",
     docs: {
       description: {
         component:
           "A comprehensive collection of all icons used throughout the application. Supports both direct imports and registry-based usage.",
       },
     },
   },
-};
+} satisfies Meta;
 
 export default meta;
-type Story = StoryObj;
+type Story = StoryObj<typeof meta>;

Please confirm your Storybook major version; adjust import if you’re on an older framework preset.

Also applies to: 15-30

packages/propel/src/icons/constants.tsx (2)

15-23: Fix label to match component naming.

Use “ViewsIcon” for consistency with the registry/component.

   { icon: <Icon name="project.view" />, title: "ViewIcon" },
+  // Consistent with ViewsIcon component
+  // { icon: <Icon name="project.view" />, title: "ViewsIcon" },

2-2: Harden maps with const assertions.

Append as const to each exported map to preserve literal titles and prevent accidental mutation.

-export const ActionsIconsMap = [{ icon: <Icon name="action.add" />, title: "AddIcon" }];
+export const ActionsIconsMap = [{ icon: <Icon name="action.add" />, title: "AddIcon" }] as const;
@@
-export const WorkspaceIconsMap = [
+export const WorkspaceIconsMap = [
   ...
-];
+] as const;
@@
-export const ProjectIconsMap = [
+export const ProjectIconsMap = [
   ...
-];
+] as const;
@@
-export const SubBrandIconsMap = [
+export const SubBrandIconsMap = [
   ...
-];
+] as const;
@@
-export const LayoutIconsMap = [
+export const LayoutIconsMap = [
   ...
-];
+] as const;
@@
-export const PropertyIconsMap = [
+export const PropertyIconsMap = [
   ...
-];
+] as const;

Also applies to: 4-13, 15-23, 25-29, 31-39, 41-62

apps/web/core/components/issues/issue-layouts/layout-icon.tsx (1)

11-19: Improve consistency by coercing size to string to match icon library patterns.

The codebase icon implementations (AiIcon, IconWrapper, etc.) consistently use string defaults for width/height. While React.SVGAttributes accepts both string and number, coercing size to string ensures uniform handling across the icon system.

-}: { layout: EIssueLayoutTypes; size?: number } & Omit<ISvgIcons, "width" | "height">) => {
+}: { layout: EIssueLayoutTypes; size?: number | string } & Omit<ISvgIcons, "width" | "height">) => {
   const iconProps = {
     ...props,
-    ...(size && { width: size, height: size }),
+    ...(size && { width: String(size), height: String(size) }),
   };
apps/web/core/components/common/activity/helper.tsx (1)

24-36: Propel icon import set looks good; clean up newly unused imports

After this migration, lucide Calendar appears unused. Also, given React types are globally available in this repo, importing ReactNode is optional. Consider removing both to keep imports tight. Based on learnings.

-import type { ReactNode } from "react";
+// React types are globally available; explicit import optional

 import {
   RotateCcw,
   Network,
   Link as LinkIcon,
-  Calendar,
   Inbox,
   AlignLeft,
   Paperclip,
   Type,
   FileText,
   Globe,
   Hash,
   Clock,
   Bell,
   LayoutGrid,
   GitBranch,
   Timer,
   ListTodo,
   Layers,
 } from "lucide-react";
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f266cd8 and c44eaf4.

📒 Files selected for processing (107)
  • apps/space/core/components/issues/issue-layouts/properties/due-date.tsx (2 hunks)
  • apps/space/core/components/issues/issue-layouts/properties/labels.tsx (2 hunks)
  • apps/space/core/components/issues/issue-layouts/properties/member.tsx (2 hunks)
  • apps/space/core/components/issues/navbar/layout-icon.tsx (1 hunks)
  • apps/space/core/components/issues/peek-overview/issue-properties.tsx (5 hunks)
  • apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/mobile-header.tsx (2 hunks)
  • apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/mobile-header.tsx (3 hunks)
  • apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/mobile-header.tsx (2 hunks)
  • apps/web/ce/components/issues/issue-layouts/utils.tsx (2 hunks)
  • apps/web/ce/components/relations/index.tsx (2 hunks)
  • apps/web/ce/hooks/work-item-filters/use-work-item-filters-config.tsx (10 hunks)
  • apps/web/core/components/automation/auto-close-automation.tsx (2 hunks)
  • apps/web/core/components/command-palette/actions/issue-actions/actions-list.tsx (4 hunks)
  • apps/web/core/components/common/activity/helper.tsx (1 hunks)
  • apps/web/core/components/core/modals/user-image-upload-modal.tsx (2 hunks)
  • apps/web/core/components/core/modals/workspace-image-upload-modal.tsx (2 hunks)
  • apps/web/core/components/cycles/analytics-sidebar/sidebar-details.tsx (2 hunks)
  • apps/web/core/components/cycles/list/cycle-list-item-action.tsx (3 hunks)
  • apps/web/core/components/dropdowns/date-range.tsx (2 hunks)
  • apps/web/core/components/dropdowns/estimate.tsx (5 hunks)
  • apps/web/core/components/dropdowns/member/avatar.tsx (2 hunks)
  • apps/web/core/components/inbox/content/issue-properties.tsx (7 hunks)
  • apps/web/core/components/inbox/modals/create-modal/issue-properties.tsx (3 hunks)
  • apps/web/core/components/integration/github/root.tsx (2 hunks)
  • apps/web/core/components/integration/jira/root.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail-widgets/action-buttons.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/properties.tsx (3 hunks)
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/assignee.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/estimate.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/label.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/parent.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/priority.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/state.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail/label/select/label-select.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail/sidebar.tsx (10 hunks)
  • apps/web/core/components/issues/issue-layouts/layout-icon.tsx (1 hunks)
  • apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx (3 hunks)
  • apps/web/core/components/issues/issue-layouts/properties/labels.tsx (2 hunks)
  • apps/web/core/components/issues/issue-layouts/spreadsheet/columns/due-date-column.tsx (2 hunks)
  • apps/web/core/components/issues/issue-layouts/spreadsheet/columns/start-date-column.tsx (2 hunks)
  • apps/web/core/components/issues/issue-modal/components/default-properties.tsx (2 hunks)
  • apps/web/core/components/issues/peek-overview/properties.tsx (10 hunks)
  • apps/web/core/components/issues/select/base.tsx (2 hunks)
  • apps/web/core/components/issues/workspace-draft/draft-issue-properties.tsx (3 hunks)
  • apps/web/core/components/modules/analytics-sidebar/root.tsx (4 hunks)
  • apps/web/core/components/modules/module-layout-icon.tsx (3 hunks)
  • apps/web/core/components/modules/select/status.tsx (2 hunks)
  • apps/web/core/components/modules/sidebar-select/select-status.tsx (2 hunks)
  • apps/web/core/components/profile/overview/stats.tsx (2 hunks)
  • apps/web/core/components/readonly/estimate.tsx (2 hunks)
  • packages/constants/src/issue/common.ts (3 hunks)
  • packages/propel/src/icons/actions/add-icon.tsx (1 hunks)
  • packages/propel/src/icons/actions/index.ts (1 hunks)
  • packages/propel/src/icons/add-icon.tsx (0 hunks)
  • packages/propel/src/icons/constants.tsx (1 hunks)
  • packages/propel/src/icons/cycle-icon.tsx (0 hunks)
  • packages/propel/src/icons/cycle/cycle-group-icon.tsx (1 hunks)
  • packages/propel/src/icons/default-icon.tsx (1 hunks)
  • packages/propel/src/icons/epic-icon.tsx (0 hunks)
  • packages/propel/src/icons/helpers.ts (1 hunks)
  • packages/propel/src/icons/icon-wrapper.tsx (1 hunks)
  • packages/propel/src/icons/icon.tsx (1 hunks)
  • packages/propel/src/icons/icons.stories.tsx (1 hunks)
  • packages/propel/src/icons/index.ts (2 hunks)
  • packages/propel/src/icons/intake-icon.tsx (0 hunks)
  • packages/propel/src/icons/layouts/board-icon.tsx (1 hunks)
  • packages/propel/src/icons/layouts/calendar-icon.tsx (1 hunks)
  • packages/propel/src/icons/layouts/card-icon.tsx (1 hunks)
  • packages/propel/src/icons/layouts/grid-icon.tsx (1 hunks)
  • packages/propel/src/icons/layouts/index.ts (1 hunks)
  • packages/propel/src/icons/layouts/list-icon.tsx (1 hunks)
  • packages/propel/src/icons/layouts/sheet-icon.tsx (1 hunks)
  • packages/propel/src/icons/layouts/timeline-icon.tsx (1 hunks)
  • packages/propel/src/icons/plane-icon.tsx (0 hunks)
  • packages/propel/src/icons/project/cycle-icon.tsx (1 hunks)
  • packages/propel/src/icons/project/epic-icon.tsx (1 hunks)
  • packages/propel/src/icons/project/index.ts (1 hunks)
  • packages/propel/src/icons/project/intake-icon.tsx (1 hunks)
  • packages/propel/src/icons/project/module-icon.tsx (2 hunks)
  • packages/propel/src/icons/project/page-icon.tsx (1 hunks)
  • packages/propel/src/icons/project/view-icon.tsx (1 hunks)
  • packages/propel/src/icons/project/work-items-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/boolean-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/dropdown-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/due-date-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/duplicate-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/estimate-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/hash-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/index.ts (1 hunks)
  • packages/propel/src/icons/properties/label-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/members-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/overdue-date-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/parent-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/priority-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/relates-to-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/relation-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/scrope-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/start-date-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/state-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/user-circle-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/user-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/user-square-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/workflows-icon.tsx (1 hunks)
  • packages/propel/src/icons/registry.ts (1 hunks)
  • packages/propel/src/icons/sub-brand/index.ts (1 hunks)
  • packages/propel/src/icons/sub-brand/pi-chat.tsx (1 hunks)
  • packages/propel/src/icons/sub-brand/plane-icon.tsx (1 hunks)
⛔ Files not processed due to max files limit (13)
  • packages/propel/src/icons/sub-brand/wiki-icon.tsx
  • packages/propel/src/icons/view-icon.tsx
  • packages/propel/src/icons/wiki-icon.tsx
  • packages/propel/src/icons/work-items-icon.tsx
  • packages/propel/src/icons/workspace/analytics-icon.tsx
  • packages/propel/src/icons/workspace/archive-icon.tsx
  • packages/propel/src/icons/workspace/dashboard-icon.tsx
  • packages/propel/src/icons/workspace/draft-icon.tsx
  • packages/propel/src/icons/workspace/home-icon.tsx
  • packages/propel/src/icons/workspace/inbox-icon.tsx
  • packages/propel/src/icons/workspace/index.ts
  • packages/propel/src/icons/workspace/project-icon.tsx
  • packages/propel/src/icons/workspace/your-work-icon.tsx
💤 Files with no reviewable changes (5)
  • packages/propel/src/icons/cycle-icon.tsx
  • packages/propel/src/icons/intake-icon.tsx
  • packages/propel/src/icons/plane-icon.tsx
  • packages/propel/src/icons/add-icon.tsx
  • packages/propel/src/icons/epic-icon.tsx
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
PR: makeplane/plane#7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/mobile-header.tsx
  • apps/web/core/components/inbox/modals/create-modal/issue-properties.tsx
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/assignee.tsx
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/label.tsx
  • apps/web/core/components/issues/peek-overview/properties.tsx
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/estimate.tsx
  • apps/web/core/components/issues/issue-detail-widgets/action-buttons.tsx
  • apps/web/core/components/common/activity/helper.tsx
  • apps/web/ce/components/issues/issue-layouts/utils.tsx
🧬 Code graph analysis (93)
packages/propel/src/icons/project/view-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/layouts/timeline-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/overdue-date-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/boolean-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/modules/sidebar-select/select-status.tsx (1)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
apps/web/core/components/integration/github/root.tsx (1)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/layouts/grid-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/duplicate-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/relation-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/inbox/content/issue-properties.tsx (6)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/properties/priority-icon.tsx (1)
  • PriorityPropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
packages/propel/src/icons/properties/duplicate-icon.tsx (1)
  • DuplicatePropertyIcon (6-13)
packages/propel/src/icons/properties/workflows-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/members-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/project/work-items-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/modules/select/status.tsx (1)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/mobile-header.tsx (3)
packages/propel/src/icons/layouts/list-icon.tsx (1)
  • ListLayoutIcon (6-13)
packages/propel/src/icons/layouts/board-icon.tsx (1)
  • BoardLayoutIcon (6-13)
packages/propel/src/icons/layouts/calendar-icon.tsx (1)
  • CalendarLayoutIcon (6-13)
packages/propel/src/icons/layouts/board-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/issues/select/base.tsx (1)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/mobile-header.tsx (3)
packages/propel/src/icons/layouts/list-icon.tsx (1)
  • ListLayoutIcon (6-13)
packages/propel/src/icons/layouts/board-icon.tsx (1)
  • BoardLayoutIcon (6-13)
packages/propel/src/icons/layouts/calendar-icon.tsx (1)
  • CalendarLayoutIcon (6-13)
packages/propel/src/icons/project/epic-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/sub-brand/plane-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/space/core/components/issues/peek-overview/issue-properties.tsx (3)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
packages/propel/src/icons/properties/priority-icon.tsx (1)
  • PriorityPropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
packages/propel/src/icons/properties/estimate-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/layouts/card-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/hash-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/registry.ts (1)
packages/propel/src/icons/index.ts (2)
  • ICON_REGISTRY (4-4)
  • IconName (2-2)
apps/web/core/components/issues/issue-layouts/spreadsheet/columns/start-date-column.tsx (1)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/parent-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/user-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/cycles/analytics-sidebar/sidebar-details.tsx (1)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/properties/label-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/default-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/automation/auto-close-automation.tsx (1)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
packages/propel/src/icons/project/intake-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/space/core/components/issues/issue-layouts/properties/labels.tsx (1)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
packages/propel/src/icons/icon.tsx (1)
packages/propel/src/icons/registry.ts (2)
  • IconName (115-115)
  • ICON_REGISTRY (49-113)
packages/propel/src/icons/constants.tsx (1)
packages/propel/src/icons/icon.tsx (1)
  • Icon (10-13)
apps/web/core/components/command-palette/actions/issue-actions/actions-list.tsx (3)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
packages/propel/src/icons/properties/priority-icon.tsx (1)
  • PriorityPropertyIcon (6-13)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/layouts/calendar-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/layouts/sheet-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/layouts/list-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/state-icon.tsx (2)
packages/propel/src/icons/index.ts (1)
  • ISvgIcons (1-1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/mobile-header.tsx (3)
packages/propel/src/icons/layouts/list-icon.tsx (1)
  • ListLayoutIcon (6-13)
packages/propel/src/icons/layouts/grid-icon.tsx (1)
  • GridLayoutIcon (6-13)
packages/propel/src/icons/layouts/timeline-icon.tsx (1)
  • TimelineLayoutIcon (6-13)
apps/space/core/components/issues/navbar/layout-icon.tsx (4)
apps/web/core/components/issues/issue-layouts/layout-icon.tsx (1)
  • IssueLayoutIcon (11-35)
apps/space/core/types/issue.d.ts (1)
  • TIssueLayout (3-3)
packages/propel/src/icons/layouts/list-icon.tsx (1)
  • ListLayoutIcon (6-13)
packages/propel/src/icons/layouts/board-icon.tsx (1)
  • BoardLayoutIcon (6-13)
packages/propel/src/icons/project/cycle-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/inbox/modals/create-modal/issue-properties.tsx (1)
packages/propel/src/icons/properties/parent-icon.tsx (1)
  • ParentPropertyIcon (6-21)
packages/propel/src/icons/properties/user-square-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/relates-to-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/assignee.tsx (1)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
apps/web/core/components/issues/issue-detail/label/select/label-select.tsx (1)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
apps/web/core/components/dropdowns/estimate.tsx (1)
packages/propel/src/icons/properties/estimate-icon.tsx (1)
  • EstimatePropertyIcon (6-13)
apps/web/core/components/issues/workspace-draft/draft-issue-properties.tsx (2)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
packages/propel/src/icons/helpers.ts (1)
packages/propel/src/icons/registry.ts (2)
  • IconName (115-115)
  • ICON_REGISTRY (49-113)
apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx (2)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/label.tsx (1)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
apps/web/core/components/integration/jira/root.tsx (1)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/properties.tsx (2)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
apps/space/core/components/issues/issue-layouts/properties/member.tsx (1)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
apps/web/core/components/issues/peek-overview/properties.tsx (9)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/properties/priority-icon.tsx (1)
  • PriorityPropertyIcon (6-13)
packages/propel/src/icons/properties/user-circle-icon.tsx (1)
  • UserCirclePropertyIcon (6-13)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
packages/propel/src/icons/properties/estimate-icon.tsx (1)
  • EstimatePropertyIcon (6-13)
packages/propel/src/icons/properties/parent-icon.tsx (1)
  • ParentPropertyIcon (6-21)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
packages/propel/src/icons/properties/dropdown-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/issues/issue-detail/sidebar.tsx (9)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/properties/priority-icon.tsx (1)
  • PriorityPropertyIcon (6-13)
packages/propel/src/icons/properties/user-circle-icon.tsx (1)
  • UserCirclePropertyIcon (6-13)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
packages/propel/src/icons/properties/estimate-icon.tsx (1)
  • EstimatePropertyIcon (6-13)
packages/propel/src/icons/properties/parent-icon.tsx (1)
  • ParentPropertyIcon (6-21)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
apps/web/core/components/issues/issue-layouts/properties/labels.tsx (1)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/estimate.tsx (1)
packages/propel/src/icons/properties/estimate-icon.tsx (1)
  • EstimatePropertyIcon (6-13)
apps/web/ce/hooks/work-item-filters/use-work-item-filters-config.tsx (7)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/properties/user-circle-icon.tsx (1)
  • UserCirclePropertyIcon (6-13)
packages/propel/src/icons/properties/priority-icon.tsx (1)
  • PriorityPropertyIcon (6-13)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/state.tsx (1)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
packages/propel/src/icons/properties/user-circle-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/issues/issue-modal/components/default-properties.tsx (1)
packages/propel/src/icons/properties/parent-icon.tsx (1)
  • ParentPropertyIcon (6-21)
apps/web/core/components/core/modals/workspace-image-upload-modal.tsx (1)
packages/propel/src/icons/properties/user-circle-icon.tsx (1)
  • UserCirclePropertyIcon (6-13)
packages/propel/src/icons/properties/priority-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/cycles/list/cycle-list-item-action.tsx (1)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/actions/add-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/modules/module-layout-icon.tsx (3)
packages/propel/src/icons/layouts/list-icon.tsx (1)
  • ListLayoutIcon (6-13)
packages/propel/src/icons/layouts/grid-icon.tsx (1)
  • GridLayoutIcon (6-13)
packages/propel/src/icons/layouts/timeline-icon.tsx (1)
  • TimelineLayoutIcon (6-13)
apps/web/core/components/issues/issue-detail-widgets/action-buttons.tsx (1)
packages/propel/src/icons/properties/relation-icon.tsx (1)
  • RelationPropertyIcon (6-13)
apps/web/core/components/core/modals/user-image-upload-modal.tsx (1)
packages/propel/src/icons/properties/user-circle-icon.tsx (1)
  • UserCirclePropertyIcon (6-13)
apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/priority.tsx (1)
packages/propel/src/icons/properties/priority-icon.tsx (1)
  • PriorityPropertyIcon (6-13)
packages/propel/src/icons/project/page-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/core/components/issues/issue-layouts/layout-icon.tsx (6)
apps/space/core/components/issues/navbar/layout-icon.tsx (1)
  • IssueLayoutIcon (5-23)
packages/propel/src/icons/layouts/list-icon.tsx (1)
  • ListLayoutIcon (6-13)
packages/propel/src/icons/layouts/board-icon.tsx (1)
  • BoardLayoutIcon (6-13)
packages/propel/src/icons/layouts/calendar-icon.tsx (1)
  • CalendarLayoutIcon (6-13)
packages/propel/src/icons/layouts/sheet-icon.tsx (1)
  • SheetLayoutIcon (6-13)
packages/propel/src/icons/layouts/timeline-icon.tsx (1)
  • TimelineLayoutIcon (6-13)
apps/web/core/components/common/activity/helper.tsx (8)
packages/propel/src/icons/properties/priority-icon.tsx (1)
  • PriorityPropertyIcon (6-13)
packages/propel/src/icons/workspace/archive-icon.tsx (1)
  • ArchiveIcon (6-13)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
packages/propel/src/icons/properties/estimate-icon.tsx (1)
  • EstimatePropertyIcon (6-13)
apps/space/core/components/issues/issue-layouts/properties/due-date.tsx (1)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
apps/web/core/components/dropdowns/date-range.tsx (1)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
packages/propel/src/icons/project/module-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/ce/components/issues/issue-layouts/utils.tsx (9)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
packages/propel/src/icons/properties/estimate-icon.tsx (1)
  • EstimatePropertyIcon (6-13)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-17)
packages/propel/src/icons/project/module-icon.tsx (1)
  • ModuleIcon (6-29)
packages/propel/src/icons/project/cycle-icon.tsx (1)
  • CycleIcon (6-17)
packages/propel/src/icons/properties/priority-icon.tsx (1)
  • PriorityPropertyIcon (6-13)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/state-icon.tsx (1)
  • StatePropertyIcon (6-13)
apps/web/core/components/dropdowns/member/avatar.tsx (1)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
apps/web/core/components/readonly/estimate.tsx (1)
packages/propel/src/icons/properties/estimate-icon.tsx (1)
  • EstimatePropertyIcon (6-13)
apps/web/core/components/modules/analytics-sidebar/root.tsx (2)
packages/propel/src/icons/properties/start-date-icon.tsx (1)
  • StartDatePropertyIcon (6-13)
packages/propel/src/icons/properties/members-icon.tsx (1)
  • MembersPropertyIcon (6-13)
packages/propel/src/icons/properties/scrope-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
apps/web/ce/components/relations/index.tsx (1)
packages/propel/src/icons/properties/duplicate-icon.tsx (1)
  • DuplicatePropertyIcon (6-13)
apps/web/core/components/profile/overview/stats.tsx (1)
packages/propel/src/icons/properties/user-circle-icon.tsx (1)
  • UserCirclePropertyIcon (6-13)
apps/web/core/components/issues/issue-layouts/spreadsheet/columns/due-date-column.tsx (1)
packages/propel/src/icons/properties/due-date-icon.tsx (1)
  • DueDatePropertyIcon (6-13)
apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/parent.tsx (1)
packages/propel/src/icons/properties/parent-icon.tsx (1)
  • ParentPropertyIcon (6-21)
packages/propel/src/icons/sub-brand/pi-chat.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/icons.stories.tsx (5)
packages/propel/src/icons/constants.tsx (6)
  • SubBrandIconsMap (25-29)
  • WorkspaceIconsMap (4-13)
  • ProjectIconsMap (15-23)
  • LayoutIconsMap (31-39)
  • PropertyIconsMap (41-62)
  • ActionsIconsMap (2-2)
packages/propel/src/icons/icon.tsx (1)
  • Icon (10-13)
packages/propel/src/icons/workspace/home-icon.tsx (1)
  • HomeIcon (6-13)
packages/propel/src/icons/project/cycle-icon.tsx (1)
  • CycleIcon (6-17)
packages/propel/src/icons/workspace/project-icon.tsx (1)
  • ProjectIcon (6-13)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build and lint web apps

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: 1

🧹 Nitpick comments (2)
packages/propel/src/icons/project/intake-icon.tsx (1)

10-10: Consider removing the color prop from IconWrapper.

The color prop is passed to IconWrapper, but based on the wrapper's interface (lines 10-17 in icon-wrapper.tsx), it doesn't explicitly accept a color parameter. While it gets passed through via ...rest to the SVG element, it has no standard effect there. The color is correctly used in the path's fill attribute (line 13), so passing it to the wrapper is unnecessary.

Apply this diff to remove the unnecessary prop:

-    <IconWrapper color={color} clipPathId={clipPathId} {...rest}>
+    <IconWrapper clipPathId={clipPathId} {...rest}>
packages/propel/src/icons/properties/user-circle-icon.tsx (1)

6-10: Consider simplifying color prop usage.

The color prop is passed to IconWrapper (line 10) but only consumed by the path element (line 13). Since IconWrapper spreads ...rest to the SVG element, color becomes an unused SVG attribute.

If this pattern is intentional for API consistency across all property icons, disregard this comment. Otherwise, you could avoid passing color to IconWrapper and use it only in the child path.

-  return (
-    <IconWrapper color={color} clipPathId={clipPathId} {...rest}>
+  return (
+    <IconWrapper clipPathId={clipPathId} {...rest}>
       <path
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c44eaf4 and 5329cb4.

📒 Files selected for processing (14)
  • .gitignore (1 hunks)
  • packages/propel/src/icons/actions/add-icon.tsx (1 hunks)
  • packages/propel/src/icons/project/cycle-icon.tsx (2 hunks)
  • packages/propel/src/icons/project/intake-icon.tsx (1 hunks)
  • packages/propel/src/icons/project/view-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/dropdown-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/duplicate-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/label-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/scrope-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/state-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/user-circle-icon.tsx (1 hunks)
  • packages/propel/src/icons/properties/user-square-icon.tsx (1 hunks)
  • packages/propel/src/icons/sub-brand/plane-icon.tsx (2 hunks)
  • packages/propel/src/icons/sub-brand/wiki-icon.tsx (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • .gitignore
🚧 Files skipped from review as they are similar to previous changes (5)
  • packages/propel/src/icons/properties/dropdown-icon.tsx
  • packages/propel/src/icons/properties/state-icon.tsx
  • packages/propel/src/icons/properties/user-square-icon.tsx
  • packages/propel/src/icons/properties/duplicate-icon.tsx
  • packages/propel/src/icons/properties/scrope-icon.tsx
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
PR: makeplane/plane#7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • packages/propel/src/icons/sub-brand/plane-icon.tsx
🧬 Code graph analysis (8)
packages/propel/src/icons/properties/user-circle-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/actions/add-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/properties/label-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/sub-brand/wiki-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/project/intake-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/project/view-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/sub-brand/plane-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/project/cycle-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Cursor Bugbot
  • GitHub Check: Build and lint web apps
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (14)
packages/propel/src/icons/project/cycle-icon.tsx (3)

3-4: LGTM! Import paths updated correctly.

The import changes align with the refactored icon structure, moving IconWrapper from the parent directory and updating the type import path accordingly.


6-8: Excellent use of React.useId() for unique clipPath identifiers.

The component signature is clean and the use of React.useId() ensures that multiple instances of the icon won't have clipPath ID collisions. This is a React 18+ best practice for generating unique IDs.


9-21: Clean IconWrapper integration.

The refactoring successfully delegates SVG structure to IconWrapper while maintaining the icon's visual implementation through the path elements. The clipPath pattern provides defensive boundaries, and the color prop correctly flows through to the fill attributes.

packages/propel/src/icons/project/view-icon.tsx (1)

6-17: Critical issue resolved: unique clipPathId per instance.

The implementation correctly addresses the previous critical review by using React.useId() to generate a unique clipPathId for each component instance (line 7). This prevents DOM ID collisions when multiple ViewsIcon components render on the same page, ensuring valid HTML and correct SVG clipping behavior.

packages/propel/src/icons/project/intake-icon.tsx (2)

3-4: LGTM - Import statements are correct.

The imports for IconWrapper and ISvgIcons align with the refactored icon infrastructure.


7-7: LGTM - Good use of React.useId() for unique clip path IDs.

Generating a unique clipPathId per icon instance prevents ID collisions when multiple instances are rendered on the same page.

packages/propel/src/icons/properties/user-circle-icon.tsx (1)

1-17: LGTM! Clean icon component implementation.

The component follows React best practices:

  • Properly typed with React.FC<ISvgIcons>
  • Uses React.useId() for SSR-safe unique IDs
  • Defaults color to "currentColor" for CSS inheritance
  • Spreads rest props for flexibility

The implementation aligns well with the PR's goal of migrating from lucide-react to custom propel icons.

packages/propel/src/icons/actions/add-icon.tsx (1)

6-17: LGTM! Good use of React.useId() and IconWrapper pattern.

The refactoring to use IconWrapper and React.useId() for unique clipPath IDs is well-executed. This ensures no ID collisions when multiple instances of the icon are rendered and provides consistent defaults for sizing and styling. The pattern aligns well with the broader icon infrastructure migration described in the PR.

packages/propel/src/icons/sub-brand/plane-icon.tsx (1)

6-21: Previous clipPathId collision issue successfully resolved.

The hard-coded clipPathId issue flagged in the previous review has been correctly addressed. Using React.useId() ensures each component instance generates a unique clipPathId, eliminating the collision risk.

packages/propel/src/icons/properties/label-icon.tsx (3)

1-6: LGTM! Clean imports and component signature.

The component declaration follows TypeScript best practices with proper typing and sensible defaults for the color prop.


11-21: LGTM! Correct SVG path implementation.

The path elements properly use the color prop for their fill attributes, which is where it actually affects the rendered output. The structure and nesting are correct.


7-10: The color prop is indeed spread to the SVG element without effect.

The IconWrapper component explicitly destructures known props and spreads remaining attributes directly to the <svg> element. Since color is not destructured, it passes through ...rest and becomes an unused attribute on the SVG tag. While SVG elements accept the color attribute per the React type system, it has no visual impact—the actual coloring comes from the fill attributes on path elements inside the component.

This pattern is consistent across all property icons, suggesting it may be intentional for consistency, though it adds unnecessary attributes to the DOM. Verify whether this is desired behavior or should be cleaned up.

packages/propel/src/icons/sub-brand/wiki-icon.tsx (2)

3-17: LGTM! Clean refactor to IconWrapper pattern.

The migration successfully centralizes SVG rendering logic while maintaining the icon's visual appearance. The use of prop spreading (...rest) ensures backward compatibility, and the clipPath ensures the icon respects its 16×16 bounds.


7-7: React 18.3.1 is in use—React.useId() is fully supported.

Verified: pnpm-workspace.yaml specifies React 18.3.1 in the catalog, which supports React.useId(). The code is correct as-is.

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: 1

🧹 Nitpick comments (1)
packages/propel/src/icons/registry.ts (1)

49-113: Registry structure is solid. Consider adding documentation.

The centralized registry with namespaced keys (e.g., property.state, layout.board) provides excellent organization and type-safe lookup capability. The as const assertion correctly enables precise type inference.

Minor naming inconsistency: workspace.views (plural) vs project.view (singular) at lines 65 and 74. While not breaking, consistent naming (either both singular or both plural) would reduce cognitive load.

Consider adding JSDoc to document the registry structure and usage patterns:

+/**
+ * Central registry for all icon components.
+ * 
+ * Access icons using namespaced keys following the pattern `category.name`:
+ * - sub-brand.* : Sub-brand icons (Plane, Wiki, Pi-Chat)
+ * - workspace.* : Workspace-level navigation icons
+ * - project.*   : Project-specific icons
+ * - layout.*    : Layout type icons (board, list, calendar, etc.)
+ * - property.*  : Issue/entity property icons
+ * - action.*    : Action icons (add, etc.)
+ * - default     : Fallback icon for undefined lookups
+ * 
+ * @example
+ * const StateIcon = ICON_REGISTRY["property.state"];
+ */
 export const ICON_REGISTRY = {
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5329cb4 and b4a5067.

📒 Files selected for processing (5)
  • apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/mobile-header.tsx (3 hunks)
  • apps/web/core/components/issues/issue-layouts/properties/labels.tsx (2 hunks)
  • packages/propel/src/icons/properties/index.ts (1 hunks)
  • packages/propel/src/icons/properties/scope-icon.tsx (1 hunks)
  • packages/propel/src/icons/registry.ts (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
PR: makeplane/plane#7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/mobile-header.tsx
🧬 Code graph analysis (3)
apps/web/core/components/issues/issue-layouts/properties/labels.tsx (1)
packages/propel/src/icons/properties/label-icon.tsx (1)
  • LabelPropertyIcon (6-21)
packages/propel/src/icons/registry.ts (1)
packages/propel/src/icons/index.ts (2)
  • ICON_REGISTRY (4-4)
  • IconName (2-2)
apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/mobile-header.tsx (3)
packages/propel/src/icons/layouts/list-icon.tsx (1)
  • ListLayoutIcon (6-13)
packages/propel/src/icons/layouts/grid-icon.tsx (1)
  • GridLayoutIcon (6-13)
packages/propel/src/icons/layouts/timeline-icon.tsx (1)
  • TimelineLayoutIcon (6-13)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Build and lint web apps
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (8)
apps/web/core/components/issues/issue-layouts/properties/labels.tsx (2)

10-10: LGTM! Icon import successfully migrated to propel.

The import correctly switches from lucide-react to the internal propel icon library, aligning with the PR's objective to standardize icon usage.


104-104: Previous issue resolved—icon usage is now correct.

The unnecessary strokeWidth prop has been removed as suggested in the previous review. The icon now correctly receives only the className prop, which is appropriate for custom SVG components.

packages/propel/src/icons/registry.ts (2)

1-47: LGTM! Well-organized imports.

The imports are logically grouped by category (actions, layouts, project, properties, sub-brand, workspace), making the file easy to navigate and maintain.


115-115: Excellent type safety with IconName.

Deriving IconName from keyof typeof ICON_REGISTRY ensures compile-time validation of registry keys and excellent IDE autocomplete support.

apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/mobile-header.tsx (3)

3-6: Icon imports correctly migrated to propel package.

The imports have been properly updated to use icons from @plane/propel/icons. The type-only React import is appropriate for the explicit typing used at line 16.


14-34: Type definition properly fixed and icon references look good.

The icon type at line 16 has been correctly updated to React.FC<ISvgIcons>, resolving the type mismatch identified in the previous review. The icon references (ListLayoutIcon, GridLayoutIcon, TimelineLayoutIcon) align with the imported components and maintain proper type safety.


48-48: Icon usage in JSX is correct.

The ListLayoutIcon component is properly used with the className prop, which is compatible with the ISvgIcons interface.

packages/propel/src/icons/properties/index.ts (1)

1-20: LGTM! Clean barrel export structure.

The exports are well-organized in alphabetical order, making the module easy to maintain and navigate. The barrel pattern appropriately consolidates all property icon exports into a single entry point.

pushya22
pushya22 previously approved these changes Oct 24, 2025
@pushya22 pushya22 merged commit d71dfe8 into preview Oct 24, 2025
6 checks passed
@pushya22 pushya22 deleted the chore-layout-and-properties-icon-revamp branch October 24, 2025 14:23
ClarenceChen0627 pushed a commit to ClarenceChen0627/plane that referenced this pull request Dec 5, 2025
ClarenceChen0627 pushed a commit to ClarenceChen0627/plane that referenced this pull request Dec 5, 2025
ClarenceChen0627 pushed a commit to ClarenceChen0627/plane that referenced this pull request Dec 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants