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 3d4735b6574..e1e985e1d4d 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx @@ -11,7 +11,7 @@ import { useRouter } from "next/navigation"; import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { EmptyStateDetailed } from "@plane/propel/empty-state"; -import { Tabs } from "@plane/propel/tabs"; +import { Tab, Tabs, TabsList, TabsPanel } from "@makeplane/propel/components/tabs"; // components import { cn } from "@plane/utils"; import AnalyticsFilterActions from "@/components/analytics/analytics-filter-actions"; @@ -73,45 +73,32 @@ function AnalyticsPage({ params }: Route.ComponentProps) { <> {workspaceProjectIds.length > 0 || loader === "init-loader" ? (
- +
- + {ANALYTICS_TABS.map((tab) => ( - { - if (!tab.isDisabled) { - handleTabChange(tab.key); - } - }} - > - {tab.label} - + ))} - +
- {ANALYTICS_TABS.map((tab) => ( - - - - ))} + {/* Grid wrapper: Propel's TabsPanel omits className, so the single mounted panel + gets its fill height from a one-row grid instead. */} +
+ {ANALYTICS_TABS.map((tab) => ( + + + + ))} +
diff --git a/apps/web/core/components/core/image-picker-popover.tsx b/apps/web/core/components/core/image-picker-popover.tsx index be049801d85..7b235890cc6 100644 --- a/apps/web/core/components/core/image-picker-popover.tsx +++ b/apps/web/core/components/core/image-picker-popover.tsx @@ -14,9 +14,9 @@ import useSWR from "swr"; import { Popover } from "@headlessui/react"; // plane imports import { Input, InputGroup } from "@makeplane/propel/components/input"; +import { Tab, Tabs, TabsList, TabsPanel } from "@makeplane/propel/components/tabs"; import { ACCEPTED_COVER_IMAGE_MIME_TYPES_FOR_REACT_DROPZONE, MAX_FILE_SIZE } from "@plane/constants"; import { useOutsideClickDetector } from "@plane/hooks"; -import { Tabs } from "@plane/propel/tabs"; import { Button, getButtonStyling } from "@plane/propel/button"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import { EFileAssetType } from "@plane/types"; @@ -204,175 +204,183 @@ function ImagePickerPopoverComponent
- - - {enabledTabs.map((tab) => ( - - {tab.title} - - ))} - - -
- - {(unsplashImages || !unsplashError) && ( - <> -
- } - render={({ field: { value, ref } }) => ( - - { - if (e.key === "Enter") { - e.preventDefault(); - setSearchParams(formData.search); - } - }} - value={value} - onChange={(e) => setFormData({ ...formData, search: e.target.value })} - ref={ref} - placeholder="Search for images" + {/* Row wrapper: published Tabs omits className, so fill height comes from stretch. */} +
+ +
+ {/* Published TabsList is inline-flex; stretch it to the previous full-width bar. */} +
+ + {enabledTabs.map((tab) => ( + + ))} + +
+ {/* Grid wrapper: published TabsPanel omits className, so fill height comes from a one-row grid. */} +
+ +
+ {(unsplashImages || !unsplashError) && ( + <> +
+ } + render={({ field: { value, ref } }) => ( + + { + if (e.key === "Enter") { + e.preventDefault(); + setSearchParams(formData.search); + } + }} + value={value} + onChange={(e) => setFormData({ ...formData, search: e.target.value })} + ref={ref} + placeholder="Search for images" + /> + + )} /> - - )} - /> - + +
+ {unsplashImages ? ( + unsplashImages.length > 0 ? ( +
+ {unsplashImages.map((image) => ( +
{ + setIsOpen(false); + onChange(image.urls.regular); + }} + > + {image.alt_description} +
+ ))} +
+ ) : ( +

No images found.

+ ) + ) : ( + + + + + + + + + + + )} + + )} +
+
+ +
+ {Object.values(STATIC_COVER_IMAGES).map((imageUrl, index) => ( +
handleStaticImageSelect(imageUrl)} + > + {`Cover +
+ ))}
- {unsplashImages ? ( - unsplashImages.length > 0 ? ( -
- {unsplashImages.map((image) => ( -
{ - setIsOpen(false); - onChange(image.urls.regular); - }} - > + + +
+
+
+ + {image !== null || (value && value !== "") ? ( + <> {image.alt_description} + + ) : ( +
+ + {isDragActive ? "Drop image here to upload" : "Drag & drop image here"} +
- ))} -
- ) : ( -

No images found.

- ) - ) : ( - - - - - - - - - - - )} - - )} - - -
- {Object.values(STATIC_COVER_IMAGES).map((imageUrl, index) => ( -
handleStaticImageSelect(imageUrl)} - > - {`Cover -
- ))} -
-
- -
-
-
- - {image !== null || (value && value !== "") ? ( - <> - image - - ) : ( -
- - {isDragActive ? "Drop image here to upload" : "Drag & drop image here"} - + )} + +
+
+ {fileRejections.length > 0 && ( +

+ {fileRejections[0].errors[0].code === "file-too-large" + ? "The image size cannot exceed 5 MB." + : "Please upload a file in a valid format."} +

)} - -
-
- {fileRejections.length > 0 && ( -

- {fileRejections[0].errors[0].code === "file-too-large" - ? "The image size cannot exceed 5 MB." - : "Please upload a file in a valid format."} -

- )} - -

File formats supported- .jpeg, .jpg, .png, .webp

+

File formats supported- .jpeg, .jpg, .png, .webp

-
- - -
+
+ + +
+
+
- -
- +
+ +
)} diff --git a/apps/web/core/components/pages/navigation-pane/root.tsx b/apps/web/core/components/pages/navigation-pane/root.tsx index de15206e04e..c88cb72f1de 100644 --- a/apps/web/core/components/pages/navigation-pane/root.tsx +++ b/apps/web/core/components/pages/navigation-pane/root.tsx @@ -10,7 +10,7 @@ import { useRouter, useSearchParams } from "next/navigation"; import { ArrowRightCircle } from "lucide-react"; // plane imports import { useTranslation } from "@plane/i18n"; -import { Tabs } from "@plane/propel/tabs"; +import { Tabs } from "@makeplane/propel/components/tabs"; import { Tooltip } from "@makeplane/propel/components/tooltip"; // hooks import { useQueryParams } from "@/hooks/use-query-params"; @@ -110,10 +110,16 @@ export const PageNavigationPaneRoot = observer(function PageNavigationPaneRoot(p {ActiveExtension ? ( ) : showNavigationTabs ? ( - - - - + // Row wrapper: Propel's Tabs root omits className, so it takes its full height by + // stretching as a flex item. +
+ +
+ + +
+
+
) : null}
diff --git a/apps/web/core/components/pages/navigation-pane/tab-panels/root.tsx b/apps/web/core/components/pages/navigation-pane/tab-panels/root.tsx index 5cb85bdb63d..2566ad77744 100644 --- a/apps/web/core/components/pages/navigation-pane/tab-panels/root.tsx +++ b/apps/web/core/components/pages/navigation-pane/tab-panels/root.tsx @@ -4,6 +4,8 @@ * See the LICENSE file for details. */ +// plane imports +import { TabsPanel } from "@makeplane/propel/components/tabs"; // components import type { TPageRootHandlers } from "@/components/pages/editor/page-root"; // store @@ -12,7 +14,6 @@ import type { TPageInstance } from "@/store/pages/base-page"; import { PageNavigationPaneAssetsTabPanel } from "./assets"; import { PageNavigationPaneInfoTabPanel } from "./info/root"; import { PageNavigationPaneOutlineTabPanel } from "./outline"; -import { Tabs } from "@plane/propel/tabs"; import { ORDERED_PAGE_NAVIGATION_TABS_LIST } from "."; type Props = { @@ -24,14 +25,16 @@ export function PageNavigationPaneTabPanelsRoot(props: Props) { const { page, versionHistory } = props; return ( - <> + // Grid wrapper: Propel's TabsPanel omits className, so the single mounted panel gets its + // fill height from a one-row grid instead. +
{ORDERED_PAGE_NAVIGATION_TABS_LIST.map((tab) => ( - + {tab.key === "outline" && } {tab.key === "info" && } {tab.key === "assets" && } - + ))} - +
); } diff --git a/apps/web/core/components/pages/navigation-pane/tabs-list.tsx b/apps/web/core/components/pages/navigation-pane/tabs-list.tsx index 6621667aab1..afc7cbf0d1a 100644 --- a/apps/web/core/components/pages/navigation-pane/tabs-list.tsx +++ b/apps/web/core/components/pages/navigation-pane/tabs-list.tsx @@ -5,8 +5,8 @@ */ // plane imports +import { Tab, TabsList } from "@makeplane/propel/components/tabs"; import { useTranslation } from "@plane/i18n"; -import { Tabs } from "@plane/propel/tabs"; // plane web components import { ORDERED_PAGE_NAVIGATION_TABS_LIST } from "@/components/pages/navigation-pane/tab-panels"; @@ -16,14 +16,11 @@ export function PageNavigationPaneTabsList() { return (
- + {ORDERED_PAGE_NAVIGATION_TABS_LIST.map((tab) => ( - - {t(tab.i18n_label)} - + ))} - - +
); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7e8251a913..c1091fa51f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -876,7 +876,7 @@ importers: version: 2.2.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@makeplane/propel': specifier: 'catalog:' - version: 0.2.0(@date-fns/tz@1.4.1)(@types/react@19.2.17)(date-fns@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tailwindcss@4.1.17) + version: 0.3.0(@date-fns/tz@1.4.1)(@types/react@19.2.17)(date-fns@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tailwindcss@4.1.17) '@plane/constants': specifier: workspace:* version: link:../../packages/constants