From ecd43b030774155d993eb69a2d9afc46e41db3af Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Tue, 23 Jun 2026 14:35:38 +0330 Subject: [PATCH] shadow fix in about --- src/components/tab/TabContainer.tsx | 226 ++++++++++++---------------- 1 file changed, 99 insertions(+), 127 deletions(-) diff --git a/src/components/tab/TabContainer.tsx b/src/components/tab/TabContainer.tsx index 96d9fc2..4936ccf 100644 --- a/src/components/tab/TabContainer.tsx +++ b/src/components/tab/TabContainer.tsx @@ -1,139 +1,111 @@ -'use client'; +"use client"; -import React, { ReactElement, ReactNode, useCallback, useState } from 'react' -import HorizontalScrollView from '../listview/HorizontalScrollView' -import { TabHeader, TabItemProps } from './TabHeader'; -import clsx from 'clsx'; -import TabHeaderRenderer from './TabHeaderRenderer'; -import Image from 'next/image'; -import { glassSurfaceNav } from '@/lib/styles/glassSurface'; +import { glassSurfaceNav } from "@/lib/styles/glassSurface"; +import clsx from "clsx"; +import Image from "next/image"; +import React, { ReactElement, ReactNode, useCallback, useState } from "react"; +import HorizontalScrollView from "../listview/HorizontalScrollView"; +import { TabHeader, TabItemProps } from "./TabHeader"; +import TabHeaderRenderer from "./TabHeaderRenderer"; type Props = { - itemRenderer?: (child: ReactNode, index: number) => ReactElement; - children: ReactNode; - className?: TabContainerClassName; - changeType?: TabContainerRenderType; - defaultIndex?: number; - selectedTab?: number; - onTabChange?: (index: number) => void; -} & Omit, 'className'>; + itemRenderer?: (child: ReactNode, index: number) => ReactElement; + children: ReactNode; + className?: TabContainerClassName; + changeType?: TabContainerRenderType; + defaultIndex?: number; + selectedTab?: number; + onTabChange?: (index: number) => void; +} & Omit, "className">; export enum TabContainerRenderType { - RENDERER, - VISIBILITY, + RENDERER, + VISIBILITY, } export type TabContainerClassName = { - wrapper?: string; - scrollView?: string; - header?: string; - headerDeactive?: string; - headerActive?: string; - icon?: string; - iconDeactive?: string; - iconActive?: string; - title?: string; - titleDeactive?: string; - titleActive?: string -} + wrapper?: string; + scrollView?: string; + header?: string; + headerDeactive?: string; + headerActive?: string; + icon?: string; + iconDeactive?: string; + iconActive?: string; + title?: string; + titleDeactive?: string; + titleActive?: string; +}; export const TabContainerClassNames: TabContainerClassName = { - wrapper: 'h-full', - scrollView: glassSurfaceNav('h-[72px] gradient-border !pt-3 !pb-2 w-full overflow-y-hidden justify-center rounded-[32px] inline-flex items-center gap-10'), - header: '', - headerDeactive: '', - headerActive: '', - icon: 'text-xs transition-all duration-150', - iconDeactive: 'stroke-disabled-text', - iconActive: 'stroke-primary dark:stroke-foreground', - title: 'text-xs transition-all duration-150', - titleDeactive: 'text-disabled-text', - titleActive: 'text-primary dark:text-foreground' + wrapper: "h-full", + scrollView: glassSurfaceNav("h-[72px] gradient-border !pt-3 !pb-2 w-full overflow-y-hidden justify-center rounded-[32px] inline-flex items-center gap-10 !shadow-none"), + header: "", + headerDeactive: "", + headerActive: "", + icon: "text-xs transition-all duration-150", + iconDeactive: "stroke-disabled-text", + iconActive: "stroke-primary dark:stroke-foreground", + title: "text-xs transition-all duration-150", + titleDeactive: "text-disabled-text", + titleActive: "text-primary dark:text-foreground", +}; + +function TabContainer({ + className = TabContainerClassNames, + changeType = TabContainerRenderType.RENDERER, + defaultIndex = 0, + selectedTab: controlledSelectedTab, + onTabChange, + itemRenderer, + children, + ...restProps +}: Props) { + const [internalSelectedTab, setInternalSelectedTab] = useState(defaultIndex); + const selectedTab = controlledSelectedTab !== undefined ? controlledSelectedTab : internalSelectedTab; + + const updateTab = useCallback( + (index: number) => { + if (onTabChange) { + onTabChange(index); + } else { + setInternalSelectedTab(index); + } + }, + [onTabChange], + ); + + const items = React.Children.toArray(children).filter((child): child is ReactElement => React.isValidElement(child) && child.type === TabHeader); + + return ( +
+ + {items.map((item, index) => { + const { title, imageSrc, icon }: TabItemProps = item.props; + return ( + updateTab(index)}> + {imageSrc && category image} + {icon && {icon}} +
{title}
+
+ ); + })} +
+ + {changeType === TabContainerRenderType.RENDERER &&
{items[selectedTab]?.props?.viewRenderer ??
}
} + {changeType === TabContainerRenderType.VISIBILITY && ( + <> + {items.map((item, index) => { + return ( +
+ {item.props.viewRenderer} +
+ ); + })} + + )} +
+ ); } -function TabContainer({ className = TabContainerClassNames, changeType = TabContainerRenderType.RENDERER, defaultIndex = 0, selectedTab: controlledSelectedTab, onTabChange, itemRenderer, children, ...restProps }: Props) { - - const [internalSelectedTab, setInternalSelectedTab] = useState(defaultIndex); - const selectedTab = controlledSelectedTab !== undefined ? controlledSelectedTab : internalSelectedTab; - - const updateTab = useCallback((index: number) => { - if (onTabChange) { - onTabChange(index); - } else { - setInternalSelectedTab(index); - } - }, [onTabChange]); - - const items = React.Children.toArray(children).filter( - (child): child is ReactElement => - React.isValidElement(child) && child.type === TabHeader - ); - - return ( -
- - {items.map((item, index) => { - const { title, imageSrc, icon }: TabItemProps = item.props; - return ( - updateTab(index)} - > - {imageSrc && - category image - } - {icon && - - {icon} - - } -
- {title} -
-
- ) - })} -
- - {changeType === TabContainerRenderType.RENDERER && -
- {items[selectedTab]?.props?.viewRenderer ??
} -
- } - {changeType === TabContainerRenderType.VISIBILITY && - <> - {items.map((item, index) => { - return ( -
- {item.props.viewRenderer} -
- ) - })} - - } -
- ) -} - -export default TabContainer \ No newline at end of file +export default TabContainer;