header height adjust

This commit is contained in:
2025-11-02 18:43:04 +08:00
parent eb6ed870a7
commit 0ef384d5d2
2 changed files with 46 additions and 10 deletions

View File

@@ -1,15 +1,12 @@
import { Box, Flex, Image, VStack, Text, Link } from '@chakra-ui/react'; import { Box, Flex, Image, VStack, Text, Link } from '@chakra-ui/react';
import { GiHamburgerMenu } from "react-icons/gi"; import { GiHamburgerMenu } from "react-icons/gi";
import { colors } from '../colors'; import { colors } from '../colors';
import { useState } from 'react'; import { useState, useRef, useLayoutEffect } from 'react';
import { import {
DrawerBackdrop,
DrawerBody, DrawerBody,
DrawerCloseTrigger, DrawerCloseTrigger,
DrawerContent, DrawerContent,
DrawerHeader,
DrawerRoot, DrawerRoot,
DrawerTitle,
} from '@/components/ui/drawer'; } from '@/components/ui/drawer';
interface HeaderProps { interface HeaderProps {
@@ -18,6 +15,14 @@ interface HeaderProps {
function Header({ showMenu = false }: HeaderProps) { function Header({ showMenu = false }: HeaderProps) {
const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [isDrawerOpen, setIsDrawerOpen] = useState(false);
const [headerHeight, setHeaderHeight] = useState(0);
const headerRef = useRef<HTMLDivElement>(null);
useLayoutEffect(() => {
if (headerRef.current) {
setHeaderHeight(headerRef.current.offsetHeight);
}
}, []);
const menuItems = [ const menuItems = [
{ label: '40+常見健康問題', href: '#health-issues' }, { label: '40+常見健康問題', href: '#health-issues' },
@@ -28,7 +33,15 @@ function Header({ showMenu = false }: HeaderProps) {
return ( return (
<> <>
<Box bg={colors.topBarColor} py={4} w="full"> <Box
ref={headerRef}
bg={colors.topBarColor}
py={4}
w="full"
position="sticky"
top={0}
zIndex={1000}
>
<Flex alignItems={'center'} justifyContent={'center'} direction="column" position="relative" w="full"> <Flex alignItems={'center'} justifyContent={'center'} direction="column" position="relative" w="full">
<Image src="/images/header_logo.webp" alt="Logo" width="150px" /> <Image src="/images/header_logo.webp" alt="Logo" width="150px" />
{showMenu && ( {showMenu && (
@@ -52,13 +65,28 @@ function Header({ showMenu = false }: HeaderProps) {
</Box> </Box>
<DrawerRoot open={isDrawerOpen} onOpenChange={(e) => setIsDrawerOpen(e.open)} placement="end"> <DrawerRoot open={isDrawerOpen} onOpenChange={(e) => setIsDrawerOpen(e.open)} placement="end">
<DrawerBackdrop />
<DrawerContent <DrawerContent
bgColor={'#92C100'} bgColor={'#92C100'}
width={{ base: "100%", sm: "100%", md: "400px" }}
maxWidth={{ base: "100%", sm: "100%", md: "400px" }}
margin={0}
padding={0}
positionerProps={{
style: {
top: `${headerHeight}px`,
right: 0,
bottom: 0,
height: `calc(100vh - ${headerHeight}px)`
},
zIndex: 1100,
}}
> >
<DrawerCloseTrigger /> <DrawerCloseTrigger />
<DrawerBody> <DrawerBody
padding={0}
margin={0}
>
<VStack align="stretch" gap={4} mt={4}> <VStack align="stretch" gap={4} mt={4}>
{menuItems.map((item, index) => ( {menuItems.map((item, index) => (
<Link <Link

View File

@@ -6,16 +6,24 @@ interface DrawerContentProps extends ChakraDrawer.ContentProps {
portalled?: boolean portalled?: boolean
portalRef?: React.RefObject<HTMLElement> portalRef?: React.RefObject<HTMLElement>
offset?: ChakraDrawer.ContentProps["padding"] offset?: ChakraDrawer.ContentProps["padding"]
positionerProps?: React.ComponentProps<typeof ChakraDrawer.Positioner>
} }
export const DrawerContent = React.forwardRef< export const DrawerContent = React.forwardRef<
HTMLDivElement, HTMLDivElement,
DrawerContentProps DrawerContentProps
>(function DrawerContent(props, ref) { >(function DrawerContent(props, ref) {
const { children, portalled = true, portalRef, offset, ...rest } = props const {
children,
portalled = true,
portalRef,
offset,
positionerProps,
...rest
} = props
return ( return (
<Portal disabled={!portalled} container={portalRef}> <Portal disabled={!portalled} container={portalRef}>
<ChakraDrawer.Positioner padding={offset}> <ChakraDrawer.Positioner padding={offset} {...positionerProps}>
<ChakraDrawer.Content ref={ref} {...rest} asChild={false}> <ChakraDrawer.Content ref={ref} {...rest} asChild={false}>
{children} {children}
</ChakraDrawer.Content> </ChakraDrawer.Content>