header height adjust
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user