79390101

Date: 2025-01-27 08:33:28
Score: 1.5
Natty:
Report link

You can achieve your desired functionality in ChakraUi using Tabs and animation from framer-motion. Here is the minimal example:

import { Box, Tabs, TabList, Tab, TabPanels, TabPanel, Text, Flex } from "@chakra-ui/react";
    import { motion } from "framer-motion";
    import { useState, useRef } from "react";
    
    const MotionBox = motion(Box);
    
    const TabComponent = () => {
      
      const categories = [
        {
          name: "Category 1",
          subcategories: ["OIL", "MEAT", "JAPANESE TASTE"],
          content: ["Content for oil", "Content for meat", "Content for Japanese taste"]
        },
        {
          name: "Category 2",
          subcategories: ["Subcategory 2.1", "Subcategory 2.2", "Subcategory 2.3"],
          content: ["Content for 2.1", "Content for 2.2", "Content for 2.3"]
        }
      ];
    
      const [selectedCategoryIndex, setSelectedCategoryIndex] = useState(0);
      const [selectedSubcategoryIndex, setSelectedSubcategoryIndex] = useState(0);
      const contentRef = useRef(null);
    
      const onCategoryChange = (index) => {
        setSelectedCategoryIndex(index);
        setSelectedSubcategoryIndex(0);  // Reset subcategory when changing categories
      };
    
      const onSubcategoryChange = (index) => {
        setSelectedSubcategoryIndex(index);
        if (contentRef.current) {
          contentRef.current.scrollIntoView({ behavior: "smooth", block: "start" });
        }
      };
    
      return (
        <Tabs index={selectedCategoryIndex} onChange={onCategoryChange} variant="soft-rounded" colorScheme="teal">
          {/* Main Categories */}
          <TabList>
            {categories.map((category, index) => (
              <Tab key={index}>{category.name}</Tab>
            ))}
          </TabList>
    
          <TabPanels>
            {categories.map((category, index) => (
              <TabPanel key={index}>
                <Flex direction="column">
                  {/* Subcategories */}
                  <TabList>
                    {category.subcategories.map((sub, idx) => (
                      <Tab key={idx} onClick={() => onSubcategoryChange(idx)}>
                        {sub}
                      </Tab>
                    ))}
                  </TabList>
    
                  {/* Subcategory Content */}
                  <TabPanels>
                    {category.subcategories.map((sub, idx) => (
                      <TabPanel key={idx}>
                        <MotionBox
                          ref={contentRef}
                          initial={{ opacity: 0, x: 100 }}
                          animate={{ opacity: 1, x: 0 }}
                          exit={{ opacity: 0, x: -100 }}
                          transition={{ duration: 0.5 }}
                        >
                          <Text>{category.content[idx]}</Text>
                        </MotionBox>
                      </TabPanel>
                    ))}
                  </TabPanels>
                </Flex>
              </TabPanel>
            ))}
          </TabPanels>
        </Tabs>
      );
    };
    
    export default TabComponent;

And about scroll can you provide more clarity for what you want scroll to.

Reasons:
  • RegEx Blacklisted phrase (2.5): can you provide
  • Long answer (-1):
  • Has code block (-0.5):
  • Low reputation (0.5):
Posted by: Raja Jahanzaib