From 995725bf32184fba9f363923b6fdb98044b12a97 Mon Sep 17 00:00:00 2001 From: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com> Date: Thu, 18 Dec 2025 19:41:48 +0530 Subject: [PATCH 1/2] refactor: update styling and structure across various components for consistency and improved UI --- .../(projects)/analytics/[tabId]/page.tsx | 6 +- .../components/analytics/select/project.tsx | 11 +++- .../components/base-layouts/kanban/group.tsx | 4 +- .../base-layouts/layout-switcher.tsx | 24 +++++--- .../workspace/sidebar/projects-list-item.tsx | 4 +- .../workspace/sidebar/projects-list.tsx | 37 ++++++------ .../propel/src/charts/area-chart/root.tsx | 2 +- packages/propel/src/charts/bar-chart/root.tsx | 2 +- .../propel/src/charts/line-chart/root.tsx | 2 +- .../propel/src/charts/scatter-chart/root.tsx | 2 +- packages/propel/src/charts/tree-map/root.tsx | 2 +- packages/propel/src/icon-button/helper.tsx | 1 + .../propel/src/icon-button/icon-button.tsx | 14 +++-- packages/propel/src/tabs/tabs.tsx | 60 +++++++++++-------- 14 files changed, 102 insertions(+), 69 deletions(-) diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx index 5dfb017b3fe..f3a5fe3e80c 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx @@ -72,17 +72,17 @@ function AnalyticsPage({ params }: Route.ComponentProps) {
- + {ANALYTICS_TABS.map((tab) => ( { if (!tab.isDisabled) { handleTabChange(tab.key); diff --git a/apps/web/core/components/analytics/select/project.tsx b/apps/web/core/components/analytics/select/project.tsx index b30d85259a1..2b657fdc9e6 100644 --- a/apps/web/core/components/analytics/select/project.tsx +++ b/apps/web/core/components/analytics/select/project.tsx @@ -1,8 +1,10 @@ import { observer } from "mobx-react"; // plane package imports +import { getButtonStyling } from "@plane/propel/button"; import { Logo } from "@plane/propel/emoji-icon-picker"; -import { ProjectIcon } from "@plane/propel/icons"; +import { ChevronDownIcon, ProjectIcon } from "@plane/propel/icons"; import { CustomSearchSelect } from "@plane/ui"; +import { cn } from "@plane/utils"; // hooks import { useProject } from "@/hooks/store/use-project"; @@ -40,8 +42,9 @@ export const ProjectSelect = observer(function ProjectSelect(props: Props) { value={value ?? []} onChange={(val: string[]) => onChange(val)} options={options} - label={ -
+ className="border-none p-0" + customButton={ +
{value && value.length > 3 ? `3+ projects` @@ -51,8 +54,10 @@ export const ProjectSelect = observer(function ProjectSelect(props: Props) { .map((p) => getProjectById(p)?.name) .join(", ") : "All projects"} +
} + customButtonClassName="border-none p-0 bg-transparent hover:bg-transparent w-auto h-auto" multiple /> ); diff --git a/apps/web/core/components/base-layouts/kanban/group.tsx b/apps/web/core/components/base-layouts/kanban/group.tsx index 4b96a1544aa..39bd2c3ed90 100644 --- a/apps/web/core/components/base-layouts/kanban/group.tsx +++ b/apps/web/core/components/base-layouts/kanban/group.tsx @@ -35,7 +35,7 @@ export const BaseKanbanGroup = observer(function BaseKanbanGroup {/* Group Header */} -
+
{renderGroupHeader ? ( renderGroupHeader({ group, itemCount: itemIds.length, isCollapsed, onToggleGroup }) ) : ( diff --git a/apps/web/core/components/base-layouts/layout-switcher.tsx b/apps/web/core/components/base-layouts/layout-switcher.tsx index a02745fdaf7..2ad2e758d5b 100644 --- a/apps/web/core/components/base-layouts/layout-switcher.tsx +++ b/apps/web/core/components/base-layouts/layout-switcher.tsx @@ -1,6 +1,7 @@ -import React from "react"; +import { useTranslation } from "@plane/i18n"; import { Tooltip } from "@plane/propel/tooltip"; import type { TBaseLayoutType } from "@plane/types"; +import { cn } from "@plane/utils"; import { usePlatformOS } from "@/hooks/use-platform-os"; import { BASE_LAYOUTS } from "./constants"; @@ -13,6 +14,7 @@ type Props = { export function LayoutSwitcher(props: Props) { const { layouts, onChange, selectedLayout } = props; const { isMobile } = usePlatformOS(); + const { t } = useTranslation(); const handleOnChange = (layoutKey: TBaseLayoutType) => { if (selectedLayout !== layoutKey) { @@ -21,21 +23,29 @@ export function LayoutSwitcher(props: Props) { }; return ( -
+
{BASE_LAYOUTS.filter((l) => (layouts ? layouts.includes(l.key) : true)).map((layout) => { const Icon = layout.icon; return ( - + diff --git a/apps/web/core/components/workspace/sidebar/projects-list-item.tsx b/apps/web/core/components/workspace/sidebar/projects-list-item.tsx index 5009fa3c2dd..b8e1cd6b225 100644 --- a/apps/web/core/components/workspace/sidebar/projects-list-item.tsx +++ b/apps/web/core/components/workspace/sidebar/projects-list-item.tsx @@ -441,8 +441,10 @@ export const SidebarProjectsListItem = observer(function SidebarProjectsListItem size="sm" icon={ChevronRightIcon} onClick={() => setIsProjectListOpen(!isProjectListOpen)} - className={cn("hidden group-hover/project-item:inline-flex text-placeholder transition-transform", { + className={cn("hidden group-hover/project-item:inline-flex text-placeholder", { "inline-flex": isMenuActive, + })} + iconClassName={cn("transition-transform", { "rotate-90": isProjectListOpen, })} aria-label={t( diff --git a/apps/web/core/components/workspace/sidebar/projects-list.tsx b/apps/web/core/components/workspace/sidebar/projects-list.tsx index e3bc20cb622..cc2d24f6895 100644 --- a/apps/web/core/components/workspace/sidebar/projects-list.tsx +++ b/apps/web/core/components/workspace/sidebar/projects-list.tsx @@ -9,6 +9,7 @@ import { Disclosure, Transition } from "@headlessui/react"; import { EUserPermissions, EUserPermissionsLevel, PROJECT_TRACKER_ELEMENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { ChevronRightIcon } from "@plane/propel/icons"; +import { IconButton } from "@plane/propel/icon-button"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import { Tooltip } from "@plane/propel/tooltip"; import { Loader } from "@plane/ui"; @@ -178,39 +179,37 @@ export const SidebarProjectsList = observer(function SidebarProjectsList() { > {t("projects")} -
+
{isAuthorizedUser && ( - + /> )} - toggleListDisclosure(!isAllProjectsListOpen)} + className="text-placeholder" + iconClassName={cn("transition-transform", { + "rotate-90": isAllProjectsListOpen, + })} aria-label={t( isAllProjectsListOpen ? "aria_labels.projects_sidebar.close_projects_menu" : "aria_labels.projects_sidebar.open_projects_menu" )} - > - - + />
- + { diff --git a/packages/propel/src/charts/bar-chart/root.tsx b/packages/propel/src/charts/bar-chart/root.tsx index a770c1b8594..2435d831869 100644 --- a/packages/propel/src/charts/bar-chart/root.tsx +++ b/packages/propel/src/charts/bar-chart/root.tsx @@ -127,7 +127,7 @@ export const BarChart = React.memo(function BarChart - + { diff --git a/packages/propel/src/charts/line-chart/root.tsx b/packages/propel/src/charts/line-chart/root.tsx index 7a2abfe7670..a4f1592d5b3 100644 --- a/packages/propel/src/charts/line-chart/root.tsx +++ b/packages/propel/src/charts/line-chart/root.tsx @@ -98,7 +98,7 @@ export const LineChart = React.memo(function LineChart - + { diff --git a/packages/propel/src/charts/scatter-chart/root.tsx b/packages/propel/src/charts/scatter-chart/root.tsx index 6e6ff3acf12..fa82677516a 100644 --- a/packages/propel/src/charts/scatter-chart/root.tsx +++ b/packages/propel/src/charts/scatter-chart/root.tsx @@ -82,7 +82,7 @@ export const ScatterChart = React.memo(function ScatterChart - + { diff --git a/packages/propel/src/charts/tree-map/root.tsx b/packages/propel/src/charts/tree-map/root.tsx index 8267f891bbe..fab38a4cce7 100644 --- a/packages/propel/src/charts/tree-map/root.tsx +++ b/packages/propel/src/charts/tree-map/root.tsx @@ -16,7 +16,7 @@ export const TreeMapChart = React.memo(function TreeMapChart(props: TreeMapChart data={data} nameKey="name" dataKey="value" - stroke="currentColor" + stroke="transparent" className="bg-layer-1 cursor-pointer" content={} animationEasing="ease-out" diff --git a/packages/propel/src/icon-button/helper.tsx b/packages/propel/src/icon-button/helper.tsx index 7a97fa462fa..ddae1dd45f8 100644 --- a/packages/propel/src/icon-button/helper.tsx +++ b/packages/propel/src/icon-button/helper.tsx @@ -38,6 +38,7 @@ type IconButtonPropsWithChildren = React.ButtonHTMLAttributes VariantProps & { icon: React.FC<{ className?: string }>; loading?: boolean; + iconClassName?: string; }; export type IconButtonProps = Omit; diff --git a/packages/propel/src/icon-button/icon-button.tsx b/packages/propel/src/icon-button/icon-button.tsx index 5f7b0a14e89..2d032de1fd9 100644 --- a/packages/propel/src/icon-button/icon-button.tsx +++ b/packages/propel/src/icon-button/icon-button.tsx @@ -15,6 +15,7 @@ const IconButton = React.forwardRef(function IconButton( loading = false, disabled = false, icon: Icon, + iconClassName = "", ...rest } = props; @@ -27,11 +28,14 @@ const IconButton = React.forwardRef(function IconButton( {...rest} > ); diff --git a/packages/propel/src/tabs/tabs.tsx b/packages/propel/src/tabs/tabs.tsx index b64b024c0ae..98d1a2d53f4 100644 --- a/packages/propel/src/tabs/tabs.tsx +++ b/packages/propel/src/tabs/tabs.tsx @@ -2,20 +2,29 @@ import * as React from "react"; import { Tabs as TabsPrimitive } from "@base-ui-components/react/tabs"; import { cn } from "../utils/classname"; -type BackgroundVariant = "layer-1" | "layer-2" | "layer-3" | "layer-transparent"; +type TabsVariant = "contained"; + +type TabsContextType = { + variant?: TabsVariant; +}; + +const TabsContext = React.createContext(undefined); type TabsCompound = React.ForwardRefExoticComponent< - React.ComponentProps & React.RefAttributes> + React.ComponentProps & { + variant?: TabsVariant; + } & React.RefAttributes> > & { List: React.ForwardRefExoticComponent< React.ComponentProps & { - background?: BackgroundVariant; + background?: TabsVariant; } & React.RefAttributes> >; Trigger: React.ForwardRefExoticComponent< - React.ComponentProps & { size?: "sm" | "md" | "lg" } & React.RefAttributes< - React.ElementRef - > + React.ComponentProps & { + size?: "sm" | "md" | "lg"; + variant?: TabsVariant; + } & React.RefAttributes> >; Content: React.ForwardRefExoticComponent< React.ComponentProps & React.RefAttributes> @@ -24,26 +33,28 @@ type TabsCompound = React.ForwardRefExoticComponent< }; const TabsRoot = React.forwardRef(function TabsRoot( - { className, ...props }: React.ComponentProps, + { className, variant, ...props }: React.ComponentProps & { variant?: TabsVariant }, ref: React.ForwardedRef> ) { return ( - + + + ); }); const TabsList = React.forwardRef(function TabsList( { className, - background = "layer-2", + background = "contained", ...props }: React.ComponentProps & { - background?: BackgroundVariant; + background?: TabsVariant; }, ref: React.ForwardedRef> ) { @@ -51,12 +62,9 @@ const TabsList = React.forwardRef(function TabsList( & { size?: "sm" | "md" | "lg" }, + { + className, + size = "md", + ...props + }: React.ComponentProps & { size?: "sm" | "md" | "lg"; variant?: TabsVariant }, ref: React.ForwardedRef> ) { return ( Date: Thu, 18 Dec 2025 20:04:10 +0530 Subject: [PATCH 2/2] fix: update tooltip content in LayoutSwitcher component to use correct label --- apps/web/core/components/base-layouts/layout-switcher.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/core/components/base-layouts/layout-switcher.tsx b/apps/web/core/components/base-layouts/layout-switcher.tsx index 2ad2e758d5b..45d30ac4444 100644 --- a/apps/web/core/components/base-layouts/layout-switcher.tsx +++ b/apps/web/core/components/base-layouts/layout-switcher.tsx @@ -27,7 +27,7 @@ export function LayoutSwitcher(props: Props) { {BASE_LAYOUTS.filter((l) => (layouts ? layouts.includes(l.key) : true)).map((layout) => { const Icon = layout.icon; return ( - +