[
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n/src/assets/css/app.css\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"typescript.tsdk\": \"node_modules\\\\typescript\\\\lib\"\n}"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 Muhammad Faqih Muntashir\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Fama - Portfolio Website Template\n\nTailwindCSS based personal branding template. Built with react and framer-motion.\n\nThis project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).\n\n![Preview](https://cdn.dribbble.com/users/3490149/screenshots/14749044/media/a28226282decfdb8571c551e69feb706.png)\n\n## Live Demo\n\nI'm currently using this template for my portfolio website, you can check it how it looks live by\nyourself at https://itsfaqih.vercel.app/\n\n## Available Scripts\n\nIn the project directory, you can run:\n\n### `yarn start`\n\nRuns the app in the development mode. Open http://localhost:3000 to view it in the browser.\n\nThe page will reload if you make edits. You will also see any lint errors in the console.\n\n### `yarn watch:style`\n\nRuns the postcss-cli to compile the TailwindCSS styles in watch mode.\n\n### `yarn dev`\n\nRuns both `yarn start` and `yarn watch:style` concurrently.\n\n### `yarn build:style`\n\nCompile the TailwindCSS styles for production.\n\n### `yarn test`\n\nLaunches the test runner in the interactive watch mode. See the section about\n[running tests](https://create-react-app.dev/docs/running-tests/) for more information.\n\n### `yarn build`\n\nBuilds the app for production to the `build` folder. It correctly bundles React in production mode\nand optimizes the build for the best performance.\n\nThe build is minified and the filenames include the hashes. Your app is ready to be deployed!\n\nSee the section about [deployment](https://create-react-app.dev/docs/deployment/) for more\ninformation.\n\n### `yarn eject`\n\n**Note: this is a one-way operation. Once you `eject`, you can’t go back!**\n\nIf you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time.\nThis command will remove the single build dependency from your project.\n\nInstead, it will copy all the configuration files and the transitive dependencies (webpack, Babel,\nESLint, etc) right into your project so you have full control over them. All of the commands except\n`eject` will still work, but they will point to the copied scripts so you can tweak them. At this\npoint you’re on your own.\n\nYou don’t have to ever use `eject`. The curated feature set is suitable for small and middle\ndeployments, and you shouldn’t feel obligated to use this feature. However we understand that this\ntool wouldn’t be useful if you couldn’t customize it when you are ready for it.\n\n## Learn More\n\nYou can learn more in the\n[Create React App documentation](https://create-react-app.dev/docs/getting-started/).\n\nTo learn React, check out the [React documentation](https://reactjs.org/).\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"personal-branding-template\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@headlessui/react\": \"^0.2.0\",\n    \"@testing-library/jest-dom\": \"^5.11.4\",\n    \"@testing-library/react\": \"^11.1.0\",\n    \"@testing-library/user-event\": \"^12.1.10\",\n    \"@types/body-scroll-lock\": \"^2.6.1\",\n    \"@types/jest\": \"^26.0.15\",\n    \"@types/node\": \"^12.0.0\",\n    \"@types/react\": \"^16.9.53\",\n    \"@types/react-dom\": \"^16.9.8\",\n    \"body-scroll-lock\": \"^3.1.5\",\n    \"classnames\": \"^2.2.6\",\n    \"framer-motion\": \"^2.9.4\",\n    \"react\": \"^17.0.1\",\n    \"react-dom\": \"^17.0.1\",\n    \"react-intersection-observer\": \"^8.30.3\",\n    \"react-scripts\": \"4.0.0\",\n    \"typescript\": \"^4.0.3\",\n    \"web-vitals\": \"^0.2.4\"\n  },\n  \"scripts\": {\n    \"watch:style\": \"postcss ./src/assets/css/styles.css -o ./src/assets/css/app.css -w\",\n    \"build:style\": \"postcss ./src/assets/css/styles.css -o ./src/assets/css/app.css --env production\",\n    \"start\": \"react-scripts start\",\n    \"dev\": \"concurrently \\\"yarn watch:style\\\" \\\"yarn start\\\"\",\n    \"build\": \"yarn build:style && react-scripts build\",\n    \"test\": \"react-scripts test\",\n    \"eject\": \"react-scripts eject\"\n  },\n  \"eslintConfig\": {\n    \"extends\": [\n      \"react-app\",\n      \"react-app/jest\"\n    ]\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  },\n  \"devDependencies\": {\n    \"@iconify/icons-logos\": \"^1.0.12\",\n    \"@iconify/react\": \"^1.1.3\",\n    \"@types/classnames\": \"^2.2.11\",\n    \"autoprefixer\": \"^10.0.2\",\n    \"concurrently\": \"^5.3.0\",\n    \"postcss\": \"^8.1.7\",\n    \"postcss-cli\": \"^8.3.0\",\n    \"postcss-import\": \"^13.0.0\",\n    \"tailwindcss\": \"^2.0.1\"\n  }\n}\n"
  },
  {
    "path": "postcss.config.js",
    "content": "module.exports = {\n  plugins: [require('postcss-import'), require('tailwindcss'), require('autoprefixer')],\n};\n"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <meta name=\"theme-color\" content=\"#ffffff\" />\n    <meta name=\"title\" content=\"Faqih Muntashir\">\n    <meta\n      name=\"description\"\n      content=\"Professional Fullstack Developer\"\n    />\n    <link rel=\"apple-touch-icon\" href=\"%PUBLIC_URL%/logo192.png\" />\n    <!--\n      manifest.json provides metadata used when your web app is installed on a\n      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n    -->\n    <link rel=\"manifest\" href=\"%PUBLIC_URL%/manifest.json\" />\n    <link rel=\"stylesheet\" href=\"https://rsms.me/inter/inter.css\">\n    <!--\n      Notice the use of %PUBLIC_URL% in the tags above.\n      It will be replaced with the URL of the `public` folder during the build.\n      Only files inside the `public` folder can be referenced from the HTML.\n\n      Unlike \"/favicon.ico\" or \"favicon.ico\", \"%PUBLIC_URL%/favicon.ico\" will\n      work correctly both with client-side routing and a non-root public URL.\n      Learn how to configure a non-root public URL by running `npm run build`.\n    -->\n    <title>Faqih Muntashir's Portfolio</title>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\"root\" class=\"overflow-x-hidden\"></div>\n    <!--\n      This HTML file is a template.\n      If you open it directly in the browser, you will see an empty page.\n\n      You can add webfonts, meta tags, or analytics to this file.\n      The build step will place the bundled scripts into the <body> tag.\n\n      To begin the development, run `npm start` or `yarn start`.\n      To create a production bundle, use `npm run build` or `yarn build`.\n    -->\n  </body>\n</html>\n"
  },
  {
    "path": "public/manifest.json",
    "content": "{\n  \"short_name\": \"itsfaqih Portfolio\",\n  \"name\": \"Faqih Muntashir's Portfolio\",\n  \"icons\": [],\n  \"start_url\": \".\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#ffffff\",\n  \"background_color\": \"#ffffff\"\n}\n"
  },
  {
    "path": "public/robots.txt",
    "content": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n"
  },
  {
    "path": "src/App.test.tsx",
    "content": "import React from 'react';\nimport { render, screen } from '@testing-library/react';\nimport App from './App';\n\ntest('renders learn react link', () => {\n  render(<App />);\n  const linkElement = screen.getByText(/learn react/i);\n  expect(linkElement).toBeInTheDocument();\n});\n"
  },
  {
    "path": "src/App.tsx",
    "content": "import React from 'react';\nimport 'assets/css/app.css';\nimport Home from 'pages/Home';\nimport { LanguageContext } from 'contexts';\nimport { useState } from 'react';\n\nfunction App() {\n  const [languange, setLanguage] = useState<'en' | 'id'>('en');\n\n  const changeLanguage = (lang: 'en' | 'id') => setLanguage(lang);\n\n  return (\n    <LanguageContext.Provider value={{ value: languange, change: changeLanguage }}>\n      <Home />\n    </LanguageContext.Provider>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "src/assets/css/styles.css",
    "content": "@import 'tailwindcss/base';\n@import 'tailwindcss/components';\n@import 'tailwindcss/utilities';\n\n@layer utilities {\n  @variants hover, focus-within {\n    .filter-none {\n      filter: none;\n    }\n    .filter-grayscale {\n      filter: grayscale(100%);\n    }\n  }\n}"
  },
  {
    "path": "src/components/animations/FadeIn.tsx",
    "content": "import { HTMLMotionProps, motion, Variants } from 'framer-motion';\nimport React from 'react';\n\ninterface Props extends HTMLMotionProps<'div'> {\n  delay?: number;\n  duration?: number;\n}\n\nexport default function FadeIn({ children, delay = 0, duration = 0.5, animate, ...props }: Props) {\n  const variants: Variants = {\n    show: (i: number = 1) => ({\n      opacity: 1,\n      transition: {\n        delay: i * delay,\n        duration: duration,\n      },\n    }),\n    hidden: {\n      opacity: 0,\n    },\n  };\n\n  return (\n    <motion.div {...props} variants={variants} initial=\"hidden\" animate={animate}>\n      {children}\n    </motion.div>\n  );\n}\n"
  },
  {
    "path": "src/components/animations/FromDirection.tsx",
    "content": "import React, { useState } from 'react';\nimport { motion, HTMLMotionProps, Variants } from 'framer-motion';\nimport classNames from 'classnames';\nimport { useRef } from 'react';\n\ninterface Props extends HTMLMotionProps<'div'> {\n  from:\n    | 'left'\n    | 'top'\n    | 'right'\n    | 'bottom'\n    | 'top-left'\n    | 'top-right'\n    | 'bottom-left'\n    | 'bottom-right';\n  delay?: number;\n  duration?: number;\n  innerClassName?: string;\n}\n\nexport default function FromDirection({\n  children,\n  from,\n  delay = 0,\n  duration = 0.6,\n  className,\n  innerClassName,\n  onAnimationComplete,\n  ...props\n}: Props) {\n  const [overflow, setOverflow] = useState<string | null>('overflow-hidden');\n  const variants: Variants = {\n    show: (i: number = 1) => ({\n      y: 0,\n      x: 0,\n      transition: {\n        duration: duration,\n        delay: i * delay,\n      },\n    }),\n    hidden: {\n      ...(from.includes('top') && { y: '-100%' }),\n      ...(from.includes('bottom') && { y: '100%' }),\n      ...(from.includes('left') && { x: '-100%' }),\n      ...(from.includes('right') && { x: '100%' }),\n    },\n  };\n\n  const ref = useRef<HTMLDivElement>(null);\n\n  return (\n    <div className={classNames(overflow, className)}>\n      <motion.div\n        variants={variants}\n        initial=\"hidden\"\n        animate=\"show\"\n        onAnimationComplete={() => {\n          if (onAnimationComplete) {\n            onAnimationComplete();\n          }\n          setOverflow(null);\n          if (ref.current !== null) {\n            ref.current.style.transform = '';\n          }\n        }}\n        className={innerClassName}\n        ref={ref}\n        {...props}\n      >\n        {children}\n      </motion.div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/animations/Highlighter.tsx",
    "content": "import React from 'react';\nimport { motion, Variants, SVGMotionProps } from 'framer-motion';\nimport classNames from 'classnames';\n\ninterface Props extends SVGMotionProps<SVGElement> {\n  rad: number;\n  delay?: number;\n}\n\nexport default function Highlighter({ className, rad, delay = 0, ...props }: Props) {\n  const variants: Variants = {\n    show: (i: number = 1) => ({\n      width: '100%',\n      transition: {\n        type: 'tween',\n        delay: i * delay,\n        duration: 0.7,\n      },\n    }),\n    hidden: {\n      width: 0,\n    },\n  };\n\n  return (\n    <svg\n      className={classNames('absolute w-full-2 text-indigo-200 -z-10 -left-1', className)}\n      fill=\"currentColor\"\n    >\n      <motion.rect\n        height=\"100%\"\n        rx={rad}\n        ry={rad}\n        variants={variants}\n        initial=\"hidden\"\n        animate=\"show\"\n        {...props}\n      />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/animations/Letter.tsx",
    "content": "import React from 'react';\nimport { motion, Variants, HTMLMotionProps } from 'framer-motion';\n\ninterface Props extends HTMLMotionProps<'div'> {\n  text: string;\n  delay?: number;\n  duration?: number;\n}\n\nexport default function Letter({ text, delay = 0, duration = 0.05, ...props }: Props) {\n  const letters = Array.from(text);\n\n  const container: Variants = {\n    hidden: {\n      opacity: 0,\n    },\n    show: (i: number = 1) => ({\n      opacity: 1,\n      transition: { staggerChildren: duration, delayChildren: i * delay },\n    }),\n  };\n\n  const child: Variants = {\n    show: {\n      y: 0,\n      transition: {\n        type: 'spring',\n        damping: 15,\n      },\n    },\n    hidden: {\n      y: '100%',\n    },\n  };\n\n  return (\n    <motion.div\n      className=\"flex overflow-hidden\"\n      variants={container}\n      initial=\"hidden\"\n      animate=\"show\"\n      {...props}\n    >\n      {letters.map((letter, index) => (\n        <motion.span key={index} variants={child}>\n          {letter === ' ' ? '\\u00A0' : letter}\n        </motion.span>\n      ))}\n    </motion.div>\n  );\n}\n"
  },
  {
    "path": "src/components/animations/Reveal.tsx",
    "content": "import React, { useState } from 'react';\nimport { motion, HTMLMotionProps, Variants } from 'framer-motion';\nimport classNames from 'classnames';\n\ninterface Props extends HTMLMotionProps<'div'> {\n  duration?: number;\n  delay?: number;\n  from: 'left' | 'top' | 'right' | 'bottom';\n}\n\nexport default function Reveal({\n  children,\n  duration,\n  from,\n  delay = 0.6,\n  className,\n  ...props\n}: Props) {\n  const [animatedFinish, setAnimatedFinish] = useState(false);\n  const variants: Variants = {\n    show: (i: number = 1) => ({\n      ...(from === 'right' && { x: '-100%' }),\n      ...(from === 'left' && { x: '100%' }),\n      ...(from === 'bottom' && { y: '-100%' }),\n      ...(from === 'top' && { y: '100%' }),\n      transition: {\n        delay: i * delay,\n        duration: duration,\n      },\n    }),\n    hidden: {\n      x: 0,\n      y: 0,\n    },\n  };\n\n  return (\n    <div className={classNames('overflow-hidden relative', className)}>\n      {children}\n      <motion.div\n        className={classNames('absolute top-0 left-0 w-full h-full', {\n          'bg-indigo-500': !animatedFinish,\n        })}\n        variants={variants}\n        initial=\"hidden\"\n        animate=\"show\"\n        {...props}\n        onAnimationComplete={() => setAnimatedFinish(true)}\n      />\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/animations/StaggerChildren.tsx",
    "content": "import { HTMLMotionProps, motion, Variants } from 'framer-motion';\nimport React from 'react';\n\ninterface Props extends HTMLMotionProps<'div'> {\n  duration?: number;\n  delay?: number;\n}\n\nexport default function StaggerChildren({ children, duration = 0.5, delay = 0, ...props }: Props) {\n  const variants: Variants = {\n    hidden: {\n      opacity: 0,\n    },\n    show: (i: number = 1) => ({\n      opacity: 1,\n      transition: {\n        delay: delay,\n        staggerChildren: duration,\n        delayChildren: i * delay,\n      },\n    }),\n  };\n\n  return (\n    <motion.div variants={variants} initial=\"hidden\" animate=\"show\" {...props}>\n      {children}\n    </motion.div>\n  );\n}\n"
  },
  {
    "path": "src/components/animations/index.tsx",
    "content": "import Letter from 'components/animations/Letter';\nimport Highlighter from 'components/animations/Highlighter';\nimport FromDirection from 'components/animations/FromDirection';\nimport Reveal from 'components/animations/Reveal';\nimport FadeIn from 'components/animations/FadeIn';\nimport StaggerChildren from 'components/animations/StaggerChildren';\n\nconst Animated = { Letter, Highlighter, FromDirection, Reveal, FadeIn, StaggerChildren };\n\nexport default Animated;\n"
  },
  {
    "path": "src/components/atoms/Avatar/index.tsx",
    "content": "import React from 'react';\nimport classNames from 'classnames';\n\ninterface Props {\n  src: string;\n  alt: string;\n  className?: string;\n}\n\nexport default function Avatar({ src, alt, className }: Props) {\n  return (\n    <img\n      src={src}\n      alt={alt}\n      width=\"auto\"\n      height=\"auto\"\n      className={classNames(\n        'object-cover border-4 border-indigo-400 rounded-3xl w-28 h-28 md:w-60 md:h-60 shadow-xl',\n        className\n      )}\n    />\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/Container/index.tsx",
    "content": "import React from 'react';\nimport classNames from 'classnames';\ninterface Props {\n  children?: React.ReactNode;\n  className?: string;\n  fluid?: boolean;\n}\n\nexport default function Container({ children, className, fluid }: Props) {\n  return (\n    <div\n      className={classNames(\n        {\n          'max-w-md px-6 mx-auto sm:px-0 sm:max-w-lg md:max-w-2xl lg:max-w-4xl xl:max-w-5xl': !fluid,\n          'px-3 sm:px-6': fluid,\n        },\n        className\n      )}\n    >\n      {children}\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/ContentText/index.tsx",
    "content": "import React, { ReactNode } from 'react';\nimport classNames from 'classnames';\n\ninterface Props {\n  children: ReactNode;\n  className?: string;\n}\n\nexport default function ContentText({ children, className }: Props) {\n  return (\n    <p className={classNames('text-center text-gray-700 leading-extra-loose', className)}>\n      {children}\n    </p>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/ContentTitle/index.tsx",
    "content": "import React, { ReactNode } from 'react';\nimport classNames from 'classnames';\n\ninterface Props {\n  children: ReactNode;\n  className?: string;\n}\n\nexport default function ContentTitle({ children, className }: Props) {\n  return <h3 className={classNames('text-lg font-bold text-gray-800', className)}>{children}</h3>;\n}\n"
  },
  {
    "path": "src/components/atoms/FullRoundButton/index.tsx",
    "content": "import React from 'react';\nimport classNames from 'classnames';\nimport { motion } from 'framer-motion';\nimport FullRoundButtonProps from 'components/atoms/FullRoundButton/types';\nimport { useState } from 'react';\nimport { useEffect } from 'react';\n\nexport default function FullRoundButton({\n  children,\n  label,\n  as = 'button',\n  href = '',\n  className,\n  animationComplete,\n  active = false,\n  onClick\n}: FullRoundButtonProps) {\n  const [animationFinish, setAnimationFinish] = useState(false);\n  const classes = classNames(\n    'flex items-center justify-center w-12 h-12 rounded-full focus:outline-none focus:ring-2 ring-indigo-500 ring-offset-2',\n    className,\n    {\n      'shadow-lg': animationComplete,\n      'scale-75': animationComplete === false,\n      'transition-all transform duration-500': animationComplete != null && !animationFinish,\n      'bg-indigo-500 hover:bg-indigo-600 text-white': !active,\n      'bg-white text-indigo-600': active\n    }\n  );\n\n  useEffect(() => {\n    if (animationComplete) {\n      setTimeout(() => {\n        setAnimationFinish(true);\n      }, 500);\n    }\n  }, [animationComplete]);\n\n  if (as === 'button') {\n    return (\n      <motion.button whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.8 }} className={classes} onClick={onClick}>\n        {children}\n        <span className=\"sr-only\">{label}</span>\n      </motion.button>\n    );\n  }\n  return (\n    <motion.a href={href} whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }} className={classes} onClick={onClick}>\n      {children}\n      <span className=\"sr-only\">{label}</span>\n    </motion.a>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/FullRoundButton/types.ts",
    "content": "import { ReactNode } from 'react';\n\nexport default interface FullRoundButtonProps {\n  children?: ReactNode;\n  label?: string;\n  as?: 'button' | 'a';\n  href?: string;\n  className?: string;\n  animationComplete?: boolean;\n  active?: boolean;\n  onClick?: (params: any) => any;\n}\n"
  },
  {
    "path": "src/components/atoms/HeaderText/index.tsx",
    "content": "import React, { ReactNode } from 'react';\nimport classNames from 'classnames';\n\ninterface Props {\n  children: ReactNode;\n  className?: string;\n  tag?: 'div' | 'h2';\n}\n\nexport default function HeaderText({ children, className, tag = 'div' }: Props) {\n  if (tag === 'div') {\n    return (\n      <div className={classNames('text-3xl font-bold leading-normal text-gray-800', className)}>\n        {children}\n      </div>\n    );\n  }\n  return (\n    <h2 className={classNames('text-3xl font-bold leading-normal text-gray-800', className)}>\n      {children}\n    </h2>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/HighlightedText/index.tsx",
    "content": "import React from 'react';\nimport classNames from 'classnames';\nimport HighlightedTextProps from 'components/atoms/HighlightedText/types';\n\nexport default function HighlightedText({\n  children,\n  as = 'span',\n  href,\n  className,\n}: HighlightedTextProps) {\n  const classes = classNames('px-3 bg-white rounded-full shadow-md focus:outline-none focus:ring-2 ring-indigo-500', className);\n  if (as === 'span') {\n    return (\n      <span className={classes}>\n        {children}\n      </span>\n    );\n  }\n  return (\n    <a href={href} className={classes}>\n      {children}\n    </a>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/HighlightedText/types.tsx",
    "content": "import { ReactNode } from \"react\";\n\nexport default interface HighlightedTextProps {\n  children: ReactNode;\n  as?: 'a' | 'span';\n  href?: string;\n  className?: string;\n}"
  },
  {
    "path": "src/components/atoms/MenuItem/index.tsx",
    "content": "import React from 'react';\nimport { ReactNode } from 'react';\nimport classNames from 'classnames';\n\ninterface Props {\n  children: ReactNode;\n  active: boolean;\n}\n\nexport default function MenuItem({ children, active }: Props) {\n  return (\n    <span className=\"relative\">\n      {children}\n      <svg\n        className={classNames(\n          '-left-1 bottom-0.5 -z-10 absolute w-0 h-3.5 text-indigo-800 transition-all',\n          { 'w-full-2': active }\n        )}\n        fill=\"currentColor\"\n      >\n        <rect width=\"100%\" height=\"100%\" rx={6} ry={6}></rect>\n      </svg>\n    </span>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/Overlay/index.tsx",
    "content": "import React from 'react';\nimport classNames from 'classnames';\nimport { disableBodyScroll, clearAllBodyScrollLocks } from 'body-scroll-lock';\nimport { RefObject } from 'react';\n\ninterface Props {\n  contentRef: RefObject<HTMLElement | Element>;\n  classOnOpen: string;\n  classOnClose: string;\n  open?: boolean;\n  animationFinish?: boolean;\n  useAnimationFinish?: boolean;\n  className?: string;\n}\n\nexport default function Overlay({\n  contentRef,\n  classOnOpen,\n  classOnClose,\n  open = false,\n  animationFinish = false,\n  className,\n}: Props) {\n  if (open) {\n    if (contentRef.current) disableBodyScroll(contentRef.current as HTMLElement);\n  } else clearAllBodyScrollLocks();\n  \n  return (\n    <svg\n      className={classNames(\n        'h-full top-0 right-0 transition-all duration-1000 z-10',\n        {\n          [classOnClose]: !open,\n          [classOnOpen]: open,\n          fixed: animationFinish,\n          hidden: !animationFinish,\n        },\n        className\n      )}\n      fill=\"currentColor\"\n    >\n      <rect width=\"100%\" height=\"100%\" />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/RoundedButton/index.tsx",
    "content": "import React, { ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { motion } from 'framer-motion';\n\ninterface Props {\n  children: ReactNode;\n  as?: 'button' | 'a';\n  href?: string;\n  className?: string;\n}\n\nexport default function RoundedButton({ children, as = 'button', href = '', className }: Props) {\n  const classes = classNames(\n    'flex items-center justify-center h-12 px-12 shadow-lg hover:shadow-none transition-shadow text-sm text-white hover:bg-indigo-600 bg-indigo-500 font-bold rounded-full transform focus:outline-none focus:ring-2 ring-indigo-500 ring-offset-2',\n    className\n  );\n\n  if (as === 'button') {\n    return (\n      <motion.button whileHover={{ translateY: 10 }} whileTap={{ scale: 0.8 }} className={classes}>\n        {children}\n      </motion.button>\n    );\n  }\n\n  return (\n    <motion.a\n      href={href}\n      whileHover={{ translateY: 10 }}\n      whileTap={{ scale: 0.8 }}\n      className={classes}\n    >\n      {children}\n    </motion.a>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/TextBox/index.tsx",
    "content": "import React from 'react';\nimport classNames from 'classnames';\nimport TextBoxProps from 'components/atoms/TextBox/types';\n\nexport default function TextBox({ placeholder, className, value, onChange }: TextBoxProps) {\n  return (\n    <input\n      type=\"text\"\n      className={classNames('py-2.5 placeholder-gray-500 bg-transparent', className)}\n      value={value}\n      placeholder={placeholder}\n      onChange={onChange}\n    />\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/TextBox/types.ts",
    "content": "export default interface TextBoxProps {\n  placeholder?: string;\n  className?: string;\n  value?: string;\n  onChange?: (param: any) => any;\n}\n"
  },
  {
    "path": "src/components/atoms/TextButton/index.tsx",
    "content": "import React from 'react';\nimport classNames from 'classnames';\nimport { ReactNode } from 'react';\n\ninterface Props {\n  children: ReactNode;\n  className?: string;\n  onClick?: (params: any) => any;\n}\n\nexport default function TextButton({ children, className, onClick }: Props) {\n  return (\n    <button\n      onClick={onClick}\n      className={classNames(\n        'inline-flex items-center text-gray-600 focus:outline-none focus:ring-2 ring-indigo-500 rounded-lg ring-offset-2',\n        className\n      )}\n    >\n      {children}\n    </button>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/TextSelectOption/index.tsx",
    "content": "import React, { ReactNode } from 'react';\nimport classNames from 'classnames';\nimport Icons from 'components/icons';\n\ninterface Props {\n  children: ReactNode;\n  active: boolean;\n  selected: boolean;\n  onClick: (any: any) => any;\n}\n\nexport default function TextSelectOption({ children, active, selected, onClick }: Props) {\n  return (\n    <li\n      className={classNames('py-4 px-8 sm:py-2 sm:px-4 w-60 sm:w-32 flex items-center cursor-pointer hover:bg-indigo-50', {\n        'bg-indigo-50': active,\n      })}\n      onClick={onClick}\n    >\n      {children}\n      {selected && <Icons.CheckRounded className=\"absolute text-indigo-500 w-7 h-7 sm:w-4 sm:h-4 right-4\" />}\n    </li>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/TitleLine/index.tsx",
    "content": "import React from 'react';\nimport { motion, SVGMotionProps, Variants } from 'framer-motion';\nimport classNames from 'classnames';\n\nexport default function TitleLine({ className, ...props }: SVGMotionProps<SVGElement>) {\n  const variants: Variants = {\n    show: {\n      width: '100%',\n    },\n    hidden: {\n      width: 0,\n    },\n  };\n\n  return (\n    <svg className={classNames('w-20 h-1 text-indigo-600 mt-3', className)} fill=\"currentColor\">\n      <motion.rect variants={variants} initial=\"hidden\" animate=\"show\" height=\"100%\" {...props} />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/atoms/index.tsx",
    "content": "import Avatar from 'components/atoms/Avatar';\nimport HeaderText from 'components/atoms/HeaderText';\nimport TextButton from 'components/atoms/TextButton';\nimport TextSelectOption from 'components/atoms/TextSelectOption';\nimport FullRoundButton from 'components/atoms/FullRoundButton';\nimport RoundedButton from 'components/atoms/RoundedButton';\nimport HighlightedText from 'components/atoms/HighlightedText';\nimport ContentTitle from 'components/atoms/ContentTitle';\nimport TextBox from 'components/atoms/TextBox';\nimport ContentText from 'components/atoms/ContentText';\nimport Container from 'components/atoms/Container';\nimport TitleLine from 'components/atoms/TitleLine';\nimport MenuItem from 'components/atoms/MenuItem';\nimport Overlay from 'components/atoms/Overlay';\n\nexport {\n  Avatar,\n  HeaderText,\n  TextButton,\n  TextSelectOption,\n  FullRoundButton,\n  RoundedButton,\n  HighlightedText,\n  ContentTitle,\n  TextBox,\n  ContentText,\n  Container,\n  TitleLine,\n  MenuItem,\n  Overlay\n};\n"
  },
  {
    "path": "src/components/decorations/Bullets.tsx",
    "content": "import React from 'react';\n\nexport default function Bullets({ className }: { className?: string }) {\n  return (\n    <svg\n      className={className}\n      viewBox=\"0 0 192 192\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M10 5C10 7.76142 7.76142 10 5 10C2.23858 10 0 7.76142 0 5C0 2.23858 2.23858 0 5 0C7.76142 0 10 2.23858 10 5Z\" />\n      <path d=\"M10 109C10 111.761 7.76142 114 5 114C2.23858 114 0 111.761 0 109C0 106.239 2.23858 104 5 104C7.76142 104 10 106.239 10 109Z\" />\n      <path d=\"M10 57C10 59.7614 7.76142 62 5 62C2.23858 62 0 59.7614 0 57C0 54.2386 2.23858 52 5 52C7.76142 52 10 54.2386 10 57Z\" />\n      <path d=\"M10 161C10 163.761 7.76142 166 5 166C2.23858 166 0 163.761 0 161C0 158.239 2.23858 156 5 156C7.76142 156 10 158.239 10 161Z\" />\n      <path d=\"M10 31C10 33.7614 7.76142 36 5 36C2.23858 36 0 33.7614 0 31C0 28.2386 2.23858 26 5 26C7.76142 26 10 28.2386 10 31Z\" />\n      <path d=\"M10 135C10 137.761 7.76142 140 5 140C2.23858 140 0 137.761 0 135C0 132.239 2.23858 130 5 130C7.76142 130 10 132.239 10 135Z\" />\n      <path d=\"M10 83C10 85.7614 7.76142 88 5 88C2.23858 88 0 85.7614 0 83C0 80.2386 2.23858 78 5 78C7.76142 78 10 80.2386 10 83Z\" />\n      <path d=\"M10 187C10 189.761 7.76142 192 5 192C2.23858 192 0 189.761 0 187C0 184.239 2.23858 182 5 182C7.76142 182 10 184.239 10 187Z\" />\n      <path d=\"M114 5C114 7.76142 111.761 10 109 10C106.239 10 104 7.76142 104 5C104 2.23858 106.239 0 109 0C111.761 0 114 2.23858 114 5Z\" />\n      <path d=\"M114 109C114 111.761 111.761 114 109 114C106.239 114 104 111.761 104 109C104 106.239 106.239 104 109 104C111.761 104 114 106.239 114 109Z\" />\n      <path d=\"M114 57C114 59.7614 111.761 62 109 62C106.239 62 104 59.7614 104 57C104 54.2386 106.239 52 109 52C111.761 52 114 54.2386 114 57Z\" />\n      <path d=\"M114 161C114 163.761 111.761 166 109 166C106.239 166 104 163.761 104 161C104 158.239 106.239 156 109 156C111.761 156 114 158.239 114 161Z\" />\n      <path d=\"M114 31C114 33.7614 111.761 36 109 36C106.239 36 104 33.7614 104 31C104 28.2386 106.239 26 109 26C111.761 26 114 28.2386 114 31Z\" />\n      <path d=\"M114 135C114 137.761 111.761 140 109 140C106.239 140 104 137.761 104 135C104 132.239 106.239 130 109 130C111.761 130 114 132.239 114 135Z\" />\n      <path d=\"M114 83C114 85.7614 111.761 88 109 88C106.239 88 104 85.7614 104 83C104 80.2386 106.239 78 109 78C111.761 78 114 80.2386 114 83Z\" />\n      <path d=\"M114 187C114 189.761 111.761 192 109 192C106.239 192 104 189.761 104 187C104 184.239 106.239 182 109 182C111.761 182 114 184.239 114 187Z\" />\n      <path d=\"M36 5C36 7.76142 33.7614 10 31 10C28.2386 10 26 7.76142 26 5C26 2.23858 28.2386 0 31 0C33.7614 0 36 2.23858 36 5Z\" />\n      <path d=\"M36 109C36 111.761 33.7614 114 31 114C28.2386 114 26 111.761 26 109C26 106.239 28.2386 104 31 104C33.7614 104 36 106.239 36 109Z\" />\n      <path d=\"M36 57C36 59.7614 33.7614 62 31 62C28.2386 62 26 59.7614 26 57C26 54.2386 28.2386 52 31 52C33.7614 52 36 54.2386 36 57Z\" />\n      <path d=\"M36 161C36 163.761 33.7614 166 31 166C28.2386 166 26 163.761 26 161C26 158.239 28.2386 156 31 156C33.7614 156 36 158.239 36 161Z\" />\n      <path d=\"M36 31C36 33.7614 33.7614 36 31 36C28.2386 36 26 33.7614 26 31C26 28.2386 28.2386 26 31 26C33.7614 26 36 28.2386 36 31Z\" />\n      <path d=\"M36 135C36 137.761 33.7614 140 31 140C28.2386 140 26 137.761 26 135C26 132.239 28.2386 130 31 130C33.7614 130 36 132.239 36 135Z\" />\n      <path d=\"M36 83C36 85.7614 33.7614 88 31 88C28.2386 88 26 85.7614 26 83C26 80.2386 28.2386 78 31 78C33.7614 78 36 80.2386 36 83Z\" />\n      <path d=\"M36 187C36 189.761 33.7614 192 31 192C28.2386 192 26 189.761 26 187C26 184.239 28.2386 182 31 182C33.7614 182 36 184.239 36 187Z\" />\n      <path d=\"M140 5C140 7.76142 137.761 10 135 10C132.239 10 130 7.76142 130 5C130 2.23858 132.239 0 135 0C137.761 0 140 2.23858 140 5Z\" />\n      <path d=\"M140 109C140 111.761 137.761 114 135 114C132.239 114 130 111.761 130 109C130 106.239 132.239 104 135 104C137.761 104 140 106.239 140 109Z\" />\n      <path d=\"M140 57C140 59.7614 137.761 62 135 62C132.239 62 130 59.7614 130 57C130 54.2386 132.239 52 135 52C137.761 52 140 54.2386 140 57Z\" />\n      <path d=\"M140 161C140 163.761 137.761 166 135 166C132.239 166 130 163.761 130 161C130 158.239 132.239 156 135 156C137.761 156 140 158.239 140 161Z\" />\n      <path d=\"M140 31C140 33.7614 137.761 36 135 36C132.239 36 130 33.7614 130 31C130 28.2386 132.239 26 135 26C137.761 26 140 28.2386 140 31Z\" />\n      <path d=\"M140 135C140 137.761 137.761 140 135 140C132.239 140 130 137.761 130 135C130 132.239 132.239 130 135 130C137.761 130 140 132.239 140 135Z\" />\n      <path d=\"M140 83C140 85.7614 137.761 88 135 88C132.239 88 130 85.7614 130 83C130 80.2386 132.239 78 135 78C137.761 78 140 80.2386 140 83Z\" />\n      <path d=\"M140 187C140 189.761 137.761 192 135 192C132.239 192 130 189.761 130 187C130 184.239 132.239 182 135 182C137.761 182 140 184.239 140 187Z\" />\n      <path d=\"M62 5C62 7.76142 59.7614 10 57 10C54.2386 10 52 7.76142 52 5C52 2.23858 54.2386 0 57 0C59.7614 0 62 2.23858 62 5Z\" />\n      <path d=\"M62 109C62 111.761 59.7614 114 57 114C54.2386 114 52 111.761 52 109C52 106.239 54.2386 104 57 104C59.7614 104 62 106.239 62 109Z\" />\n      <path d=\"M62 57C62 59.7614 59.7614 62 57 62C54.2386 62 52 59.7614 52 57C52 54.2386 54.2386 52 57 52C59.7614 52 62 54.2386 62 57Z\" />\n      <path d=\"M62 161C62 163.761 59.7614 166 57 166C54.2386 166 52 163.761 52 161C52 158.239 54.2386 156 57 156C59.7614 156 62 158.239 62 161Z\" />\n      <path d=\"M62 31C62 33.7614 59.7614 36 57 36C54.2386 36 52 33.7614 52 31C52 28.2386 54.2386 26 57 26C59.7614 26 62 28.2386 62 31Z\" />\n      <path d=\"M62 135C62 137.761 59.7614 140 57 140C54.2386 140 52 137.761 52 135C52 132.239 54.2386 130 57 130C59.7614 130 62 132.239 62 135Z\" />\n      <path d=\"M62 83C62 85.7614 59.7614 88 57 88C54.2386 88 52 85.7614 52 83C52 80.2386 54.2386 78 57 78C59.7614 78 62 80.2386 62 83Z\" />\n      <path d=\"M62 187C62 189.761 59.7614 192 57 192C54.2386 192 52 189.761 52 187C52 184.239 54.2386 182 57 182C59.7614 182 62 184.239 62 187Z\" />\n      <path d=\"M166 5C166 7.76142 163.761 10 161 10C158.239 10 156 7.76142 156 5C156 2.23858 158.239 0 161 0C163.761 0 166 2.23858 166 5Z\" />\n      <path d=\"M166 109C166 111.761 163.761 114 161 114C158.239 114 156 111.761 156 109C156 106.239 158.239 104 161 104C163.761 104 166 106.239 166 109Z\" />\n      <path d=\"M166 57C166 59.7614 163.761 62 161 62C158.239 62 156 59.7614 156 57C156 54.2386 158.239 52 161 52C163.761 52 166 54.2386 166 57Z\" />\n      <path d=\"M166 161C166 163.761 163.761 166 161 166C158.239 166 156 163.761 156 161C156 158.239 158.239 156 161 156C163.761 156 166 158.239 166 161Z\" />\n      <path d=\"M166 31C166 33.7614 163.761 36 161 36C158.239 36 156 33.7614 156 31C156 28.2386 158.239 26 161 26C163.761 26 166 28.2386 166 31Z\" />\n      <path d=\"M166 135C166 137.761 163.761 140 161 140C158.239 140 156 137.761 156 135C156 132.239 158.239 130 161 130C163.761 130 166 132.239 166 135Z\" />\n      <path d=\"M166 83C166 85.7614 163.761 88 161 88C158.239 88 156 85.7614 156 83C156 80.2386 158.239 78 161 78C163.761 78 166 80.2386 166 83Z\" />\n      <path d=\"M166 187C166 189.761 163.761 192 161 192C158.239 192 156 189.761 156 187C156 184.239 158.239 182 161 182C163.761 182 166 184.239 166 187Z\" />\n      <path d=\"M88 5C88 7.76142 85.7614 10 83 10C80.2386 10 78 7.76142 78 5C78 2.23858 80.2386 0 83 0C85.7614 0 88 2.23858 88 5Z\" />\n      <path d=\"M88 109C88 111.761 85.7614 114 83 114C80.2386 114 78 111.761 78 109C78 106.239 80.2386 104 83 104C85.7614 104 88 106.239 88 109Z\" />\n      <path d=\"M88 57C88 59.7614 85.7614 62 83 62C80.2386 62 78 59.7614 78 57C78 54.2386 80.2386 52 83 52C85.7614 52 88 54.2386 88 57Z\" />\n      <path d=\"M88 161C88 163.761 85.7614 166 83 166C80.2386 166 78 163.761 78 161C78 158.239 80.2386 156 83 156C85.7614 156 88 158.239 88 161Z\" />\n      <path d=\"M88 31C88 33.7614 85.7614 36 83 36C80.2386 36 78 33.7614 78 31C78 28.2386 80.2386 26 83 26C85.7614 26 88 28.2386 88 31Z\" />\n      <path d=\"M88 135C88 137.761 85.7614 140 83 140C80.2386 140 78 137.761 78 135C78 132.239 80.2386 130 83 130C85.7614 130 88 132.239 88 135Z\" />\n      <path d=\"M88 83C88 85.7614 85.7614 88 83 88C80.2386 88 78 85.7614 78 83C78 80.2386 80.2386 78 83 78C85.7614 78 88 80.2386 88 83Z\" />\n      <path d=\"M88 187C88 189.761 85.7614 192 83 192C80.2386 192 78 189.761 78 187C78 184.239 80.2386 182 83 182C85.7614 182 88 184.239 88 187Z\" />\n      <path d=\"M192 5C192 7.76142 189.761 10 187 10C184.239 10 182 7.76142 182 5C182 2.23858 184.239 0 187 0C189.761 0 192 2.23858 192 5Z\" />\n      <path d=\"M192 109C192 111.761 189.761 114 187 114C184.239 114 182 111.761 182 109C182 106.239 184.239 104 187 104C189.761 104 192 106.239 192 109Z\" />\n      <path d=\"M192 57C192 59.7614 189.761 62 187 62C184.239 62 182 59.7614 182 57C182 54.2386 184.239 52 187 52C189.761 52 192 54.2386 192 57Z\" />\n      <path d=\"M192 161C192 163.761 189.761 166 187 166C184.239 166 182 163.761 182 161C182 158.239 184.239 156 187 156C189.761 156 192 158.239 192 161Z\" />\n      <path d=\"M192 31C192 33.7614 189.761 36 187 36C184.239 36 182 33.7614 182 31C182 28.2386 184.239 26 187 26C189.761 26 192 28.2386 192 31Z\" />\n      <path d=\"M192 135C192 137.761 189.761 140 187 140C184.239 140 182 137.761 182 135C182 132.239 184.239 130 187 130C189.761 130 192 132.239 192 135Z\" />\n      <path d=\"M192 83C192 85.7614 189.761 88 187 88C184.239 88 182 85.7614 182 83C182 80.2386 184.239 78 187 78C189.761 78 192 80.2386 192 83Z\" />\n      <path d=\"M192 187C192 189.761 189.761 192 187 192C184.239 192 182 189.761 182 187C182 184.239 184.239 182 187 182C189.761 182 192 184.239 192 187Z\" />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/decorations/Stripes.tsx",
    "content": "import React from 'react';\n\nexport default function Stripes({ className }: { className?: string }) {\n  return (\n    <svg\n      className={className}\n      viewBox=\"0 0 199 197\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M0 27.1806V33.5152L33.8184 0H27.4264L0 27.1806ZM53.8795 0L0 53.3965V59.7311L60.2714 0H53.8795ZM78.3504 0L0 77.648V83.9827L84.7423 0H78.3504ZM104.966 0L0 104.025V110.36L111.358 0H104.966ZM130.401 0L0 129.232V135.567L136.793 0H130.401ZM154.445 0L0 153.061V159.395L160.837 0H154.445ZM181.175 0L0 179.551V185.886L187.567 0H181.175ZM198.331 9.47616L9.11099 197H15.5029L198.331 15.8108V9.47616ZM198.331 31.8572L31.6945 197H38.0864L198.331 38.1919V31.8572Z\"\n      />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "src/components/decorations/index.tsx",
    "content": "import Bullets from 'components/decorations/Bullets';\nimport Stripes from 'components/decorations/Stripes';\n\nconst Decorations = {\n  Bullets,\n  Stripes\n};\n\nexport default Decorations;\n"
  },
  {
    "path": "src/components/icons/index.tsx",
    "content": "import React from 'react';\n\nconst Dribbble = ({ className }: { className?: string }) => (\n  <svg className={className} viewBox=\"0 0 100 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n    <path\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      d=\"M50 0C22.397 0 0 22.397 0 50C0 77.603 22.397 100 50 100C77.5488 100 100 77.603 100 50C100 22.397 77.5488 0 50 0ZM83.026 23.0477C88.9913 30.3145 92.5705 39.5879 92.679 49.6204C91.269 49.3492 77.1692 46.4751 62.961 48.2646C62.6356 47.5597 62.3644 46.8004 62.0391 46.0412C61.1714 43.9805 60.1952 41.8655 59.2191 39.859C74.9458 33.4599 82.1041 24.2408 83.026 23.0477ZM50 7.37527C60.846 7.37527 70.7701 11.4425 78.308 18.1128C77.5488 19.1974 71.0954 27.82 55.9111 33.5141C48.9154 20.6616 41.1605 10.141 39.9675 8.5141C43.167 7.75488 46.5293 7.37527 50 7.37527ZM31.833 11.3883C32.9718 12.9067 40.564 23.4816 47.6681 36.0629C27.7115 41.3774 10.0868 41.269 8.18872 41.269C10.9544 28.0369 19.9024 17.0282 31.833 11.3883ZM7.26681 50.0542C7.26681 49.6204 7.26681 49.1866 7.26681 48.7527C9.11063 48.8069 29.8265 49.0781 51.1388 42.679C52.3861 45.0651 53.5249 47.5054 54.6095 49.9458C54.0672 50.1085 53.4707 50.2712 52.9284 50.4338C30.9111 57.538 19.1974 76.9523 18.2213 78.5792C11.4425 71.0412 7.26681 61.0087 7.26681 50.0542ZM50 92.7332C40.1302 92.7332 31.0195 89.3709 23.8069 83.731C24.5662 82.1584 33.243 65.4555 57.321 57.0499C57.4295 56.9957 57.4837 56.9957 57.5922 56.9414C63.6117 72.5054 66.0521 85.5748 66.7028 89.3167C61.551 91.5401 55.9111 92.7332 50 92.7332ZM73.807 85.4122C73.3731 82.8091 71.0955 70.3362 65.5098 54.9892C78.9046 52.8742 90.6182 56.3449 92.0824 56.833C90.2386 68.7093 83.4056 78.9588 73.807 85.4122Z\"\n      fill=\"#EA4C89\"\n    />\n  </svg>\n);\n\nconst Github = ({ className }: { className?: string }) => (\n  <svg className={className} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n    <path\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      d=\"M20 0C8.95 0 0 8.95 0 20C0 28.85 5.725 36.325 13.675 38.975C14.675 39.15 15.05 38.55 15.05 38.025C15.05 37.55 15.025 35.975 15.025 34.3C10 35.225 8.7 33.075 8.3 31.95C8.075 31.375 7.1 29.6 6.25 29.125C5.55 28.75 4.55 27.825 6.225 27.8C7.8 27.775 8.925 29.25 9.3 29.85C11.1 32.875 13.975 32.025 15.125 31.5C15.3 30.2 15.825 29.325 16.4 28.825C11.95 28.325 7.3 26.6 7.3 18.95C7.3 16.775 8.075 14.975 9.35 13.575C9.15 13.075 8.45 11.025 9.55 8.275C9.55 8.275 11.225 7.75 15.05 10.325C16.65 9.875 18.35 9.65 20.05 9.65C21.75 9.65 23.45 9.875 25.05 10.325C28.875 7.725 30.55 8.275 30.55 8.275C31.65 11.025 30.95 13.075 30.75 13.575C32.025 14.975 32.8 16.75 32.8 18.95C32.8 26.625 28.125 28.325 23.675 28.825C24.4 29.45 25.025 30.65 25.025 32.525C25.025 35.2 25 37.35 25 38.025C25 38.55 25.375 39.175 26.375 38.975C34.275 36.325 40 28.825 40 20C40 8.95 31.05 0 20 0Z\"\n      fill=\"#1B1F23\"\n    />\n  </svg>\n);\n\nconst Facebook = ({ className }: { className?: string }) => (\n  <svg className={className} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n    <path\n      d=\"M30.0001 3.33325H25.0001C22.7899 3.33325 20.6703 4.21123 19.1075 5.77403C17.5447 7.33683 16.6667 9.45645 16.6667 11.6666V16.6666H11.6667V23.3333H16.6667V36.6666H23.3334V23.3333H28.3334L30.0001 16.6666H23.3334V11.6666C23.3334 11.2246 23.509 10.8006 23.8216 10.4881C24.1341 10.1755 24.5581 9.99992 25.0001 9.99992H30.0001V3.33325Z\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    />\n  </svg>\n);\n\nconst Twitter = ({ className }: { className?: string }) => (\n  <svg className={className} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n    <path\n      d=\"M38.3333 4.99991C36.7373 6.12571 34.9702 6.98676 33.1 7.54991C32.0962 6.39577 30.7622 5.57773 29.2784 5.20646C27.7945 4.83518 26.2325 4.92857 24.8035 5.474C23.3744 6.01943 22.1474 6.99058 21.2883 8.25611C20.4292 9.52163 19.9795 11.0205 20 12.5499V14.2166C17.071 14.2925 14.1688 13.6429 11.5517 12.3257C8.93456 11.0084 6.68385 9.06431 4.99999 6.66658C4.99999 6.66658 -1.66668 21.6666 13.3333 28.3332C9.90087 30.6632 5.81192 31.8315 1.66666 31.6666C16.6667 39.9999 35 31.6666 35 12.4999C34.9985 12.0357 34.9538 11.5726 34.8667 11.1166C36.5677 9.43907 37.768 7.3211 38.3333 4.99991V4.99991Z\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    />\n  </svg>\n);\n\nconst Instagram = ({ className }: { className?: string }) => (\n  <svg className={className} viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n    <path\n      d=\"M28.3333 3.33325H11.6666C7.06427 3.33325 3.33331 7.06421 3.33331 11.6666V28.3333C3.33331 32.9356 7.06427 36.6666 11.6666 36.6666H28.3333C32.9357 36.6666 36.6666 32.9356 36.6666 28.3333V11.6666C36.6666 7.06421 32.9357 3.33325 28.3333 3.33325Z\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    />\n    <path\n      d=\"M26.6668 18.95C26.8725 20.3371 26.6356 21.7537 25.9897 22.9984C25.3439 24.243 24.3221 25.2524 23.0695 25.8828C21.817 26.5132 20.3976 26.7327 19.0131 26.5099C17.6287 26.2871 16.3497 25.6335 15.3582 24.6419C14.3667 23.6504 13.713 22.3715 13.4903 20.987C13.2675 19.6026 13.4869 18.1832 14.1174 16.9306C14.7478 15.6781 15.7571 14.6562 17.0018 14.0104C18.2464 13.3646 19.6631 13.1277 21.0501 13.3333C22.465 13.5432 23.7749 14.2025 24.7863 15.2139C25.7977 16.2253 26.457 17.5351 26.6668 18.95Z\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    />\n    <path\n      d=\"M29.1667 10.8333H29.1833\"\n      stroke=\"currentColor\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    />\n  </svg>\n);\n\nconst CheckRounded = ({ className }: { className?: string }) => (\n  <svg\n    className={className}\n    xmlns=\"http://www.w3.org/2000/svg\"\n    viewBox=\"0 0 20 20\"\n    fill=\"currentColor\"\n  >\n    <path\n      fillRule=\"evenodd\"\n      d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n      clipRule=\"evenodd\"\n    />\n  </svg>\n);\n\nconst Menu = ({ className }: { className?: string }) => (\n  <svg\n    className={className}\n    xmlns=\"http://www.w3.org/2000/svg\"\n    fill=\"none\"\n    viewBox=\"0 0 24 24\"\n    stroke=\"currentColor\"\n  >\n    <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16m-7 6h7\" />\n  </svg>\n);\n\nconst Close = ({ className }: { className?: string }) => (\n  <svg\n    className={className}\n    xmlns=\"http://www.w3.org/2000/svg\"\n    fill=\"none\"\n    viewBox=\"0 0 24 24\"\n    stroke=\"currentColor\"\n  >\n    <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n  </svg>\n);\n\nconst Icons = {\n  Dribbble,\n  Github,\n  Facebook,\n  Twitter,\n  Instagram,\n  CheckRounded,\n  Menu,\n  Close,\n};\n\nexport default Icons;\n"
  },
  {
    "path": "src/components/molecules/BlogPost/index.tsx",
    "content": "import { ContentTitle } from 'components/atoms';\nimport { LanguageContext } from 'contexts';\nimport React, { useContext } from 'react';\nimport BlogsProps from 'components/molecules/BlogPost/types';\nimport classNames from 'classnames';\n\nexport default function BlogPost({ data, className }: BlogsProps) {\n  const { title, date, url } = data;\n  const language = useContext(LanguageContext);\n  const formattedDate = new Intl.DateTimeFormat(language.value === 'en' ? 'en-US' : 'id-ID', {\n    year: 'numeric',\n    month: 'long',\n    day: 'numeric',\n  }).format(date);\n\n  return (\n    <article className={classNames(className, 'focus-within:ring-2 ring-indigo-500 ring-offset-8 rounded-lg')}>\n      <a href={url} className=\"relative inline-block rounded-lg group focus:outline-none\">\n        <ContentTitle>{title}</ContentTitle>\n        <svg className=\"-left-1 bottom-0.5 -z-10 absolute w-0 h-2 text-indigo-200 transition-all group-focus:w-full-2 group-hover:w-full-2\" fill=\"currentColor\">\n          <rect width=\"100%\" height=\"100%\" rx={4} ry={4}></rect>\n        </svg>\n      </a>\n      <span className=\"block mt-3 text-gray-700\">{formattedDate}</span>\n    </article>\n  );\n}\n"
  },
  {
    "path": "src/components/molecules/BlogPost/types.ts",
    "content": "export default interface BlogsProps {\n  data: BlogsPostProps;\n  className?: string;\n}\n\nexport interface BlogsPostProps {\n  title: string;\n  date: Date;\n  url: string;\n}\n"
  },
  {
    "path": "src/components/molecules/HighlightedTextIcon/index.tsx",
    "content": "import { HighlightedText } from 'components/atoms';\nimport HighlightedTextProps from 'components/atoms/HighlightedText/types';\nimport React, { ReactElement } from 'react';\nimport classNames from 'classnames';\n\ninterface Props extends HighlightedTextProps {\n  icon: ReactElement;\n}\n\nexport default function HighlightedTextIcon({ icon, children, className, ...props }: Props) {\n  const Icon = React.cloneElement(icon, { className: 'w-7 h-7 pr-2 self-center' });\n\n  return (\n    <HighlightedText\n      {...props}\n      className={classNames(\n        'inline-flex items-baseline text-gray-800 font-medium transition-all transform hover:-translate-y-1 hover:shadow-xl',\n        className\n      )}\n    >\n      {Icon}\n      {children}\n    </HighlightedText>\n  );\n}\n"
  },
  {
    "path": "src/components/molecules/MainMenu/index.tsx",
    "content": "import { Menu } from '@headlessui/react';\nimport { MenuButton } from 'components/molecules';\nimport React from 'react';\nimport Animated from 'components/animations';\nimport { AnimatePresence } from 'framer-motion';\nimport { useContext } from 'react';\nimport { LanguageContext } from 'contexts';\nimport { MenuItem, Overlay } from 'components/atoms';\nimport { useRef } from 'react';\n\ninterface Props {\n  animationFinish?: boolean;\n  sections: { about: string; projects: string; blogs: string; skills: string; contact: string };\n}\n\nexport default function MainMenu({ animationFinish, sections }: Props) {\n  const language = useContext(LanguageContext);\n  const menu = useRef<HTMLDivElement>(null);\n\n  return (\n    <div className=\"self-center ml-auto sm:ml-0\">\n      <Menu>\n        {({ open }) => (\n          <>\n            <Menu.Button as=\"div\" className=\"relative z-20\">\n              <MenuButton isOpen={open} animationComplete={animationFinish} />\n            </Menu.Button>\n            <Overlay contentRef={menu} open={open} animationFinish={animationFinish} classOnOpen=\"w-full\" classOnClose=\"w-0\" className=\"text-indigo-600\"/>\n            <AnimatePresence initial={false}>\n              {open && (\n                <Menu.Items\n                  className=\"fixed top-0 left-0 z-10 flex items-center justify-center w-full h-full text-4xl font-bold text-white focus:outline-none\"\n                  static\n                >\n                  <div className=\"grid gap-x-32 gap-y-10\" ref={menu}>\n                    <Menu.Item as=\"a\" href=\"#about\">\n                      {({ active }: { active: boolean }) => (\n                        <Animated.FromDirection\n                          from=\"bottom\"\n                          animate=\"show\"\n                          exit={{ opacity: 0 }}\n                          custom={1}\n                          delay={0.2}\n                        >\n                          <MenuItem active={active}>{sections.about}</MenuItem>\n                        </Animated.FromDirection>\n                      )}\n                    </Menu.Item>\n                    <Menu.Item as=\"a\" href=\"#projects\">\n                      {({ active }: { active: boolean }) => (\n                        <Animated.FromDirection\n                          from=\"bottom\"\n                          animate=\"show\"\n                          exit={{ opacity: 0 }}\n                          custom={2}\n                          delay={0.2}\n                        >\n                          <MenuItem active={active}>{sections.projects}</MenuItem>\n                        </Animated.FromDirection>\n                      )}\n                    </Menu.Item>\n                    <Menu.Item as=\"a\" href=\"#blogs\">\n                      {({ active }: { active: boolean }) => (\n                        <Animated.FromDirection\n                          from=\"bottom\"\n                          animate=\"show\"\n                          exit={{ opacity: 0 }}\n                          custom={3}\n                          delay={0.2}\n                        >\n                          <MenuItem active={active}>{sections.blogs}</MenuItem>\n                        </Animated.FromDirection>\n                      )}\n                    </Menu.Item>\n                    <Menu.Item as=\"a\" href=\"#skills\">\n                      {({ active }: { active: boolean }) => (\n                        <Animated.FromDirection\n                          from=\"bottom\"\n                          animate=\"show\"\n                          exit={{ opacity: 0 }}\n                          custom={4}\n                          delay={0.2}\n                        >\n                          <MenuItem active={active}>{sections.skills}</MenuItem>\n                        </Animated.FromDirection>\n                      )}\n                    </Menu.Item>\n                    <Menu.Item as=\"a\" href=\"#contact\">\n                      {({ active }: { active: boolean }) => (\n                        <Animated.FromDirection\n                          from=\"bottom\"\n                          animate=\"show\"\n                          exit={{ opacity: 0 }}\n                          custom={5}\n                          delay={0.2}\n                        >\n                          <MenuItem active={active}>\n                            {language.value === 'en' ? 'Contact' : 'Kontak'}\n                          </MenuItem>\n                        </Animated.FromDirection>\n                      )}\n                    </Menu.Item>\n                  </div>\n                </Menu.Items>\n              )}\n            </AnimatePresence>\n          </>\n        )}\n      </Menu>\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/molecules/MenuButton/index.tsx",
    "content": "import { FullRoundButton } from 'components/atoms';\nimport FullRoundButtonProps from 'components/atoms/FullRoundButton/types';\nimport Icons from 'components/icons';\nimport React from 'react';\n\ninterface Props extends FullRoundButtonProps {\n  isOpen?: boolean;\n}\n\nexport default function MenuButton({ isOpen = false, onClick, ...props }: Props) {\n  return (\n    <FullRoundButton active={isOpen} {...props} label=\"Menu\" onClick={onClick}>\n      {isOpen ? <Icons.Close className=\"w-6 h-6\" /> : <Icons.Menu className=\"w-6 h-6\" />}\n    </FullRoundButton>\n  );\n}\n"
  },
  {
    "path": "src/components/molecules/ProjectCard/index.tsx",
    "content": "import { ContentTitle } from 'components/atoms';\nimport Icons from 'components/icons';\nimport { LanguageContext } from 'contexts';\nimport React, { useContext } from 'react';\nimport classNames from 'classnames';\nimport ProjectCardProps from 'components/molecules/ProjectCard/types';\n\nexport default function ProjectCard({ data, className }: ProjectCardProps) {\n  const language = useContext(LanguageContext);\n  const { title, description, type, url } = data;\n\n  return (\n    <article\n      className={classNames('flex flex-col bg-white rounded-xl shadow py-4 px-6', className)}\n    >\n      <ContentTitle>{title}</ContentTitle>\n      <p className=\"mt-2 mb-8 text-sm text-gray-700\">{description}</p>\n      <div className=\"flex items-center justify-between mt-auto\">\n        {type === 'dribbble' ? (\n          <Icons.Dribbble className=\"w-7 h-7\" />\n        ) : (\n          <Icons.Github className=\"w-7 h-7\" />\n        )}\n        <a className=\"font-medium text-indigo-400 rounded-lg hover:text-indigo-500 focus:outline-none focus:ring-2 ring-indigo-500 ring-offset-2 focus:text-indigo-500\" href={url}>\n          {language.value === 'en' ? 'Details' : 'Lihat'}\n        </a>\n      </div>\n    </article>\n  );\n}\n"
  },
  {
    "path": "src/components/molecules/ProjectCard/types.ts",
    "content": "export default interface ProjectCardProps {\n  data: ProjectCardDataProps;\n  className: string;\n}\n\nexport interface ProjectCardDataProps {\n  title: string;\n  description: string;\n  type: 'github' | 'dribbble';\n  url: string;\n}\n"
  },
  {
    "path": "src/components/molecules/SearchBox/index.tsx",
    "content": "import { TextBox } from 'components/atoms';\nimport TextBoxProps from 'components/atoms/TextBox/types';\nimport React, { useContext } from 'react';\nimport classNames from 'classnames';\nimport { LanguageContext } from 'contexts';\n\nexport default function SearchBox({ className }: TextBoxProps) {\n  const language = useContext(LanguageContext);\n\n  return (\n    <div\n      className={classNames('focus-within:ring-2 ring-indigo-500 focus-within:shadow-xl focus-within:bg-white transition-all transform focus-within:scale-110 flex items-center overflow-hidden bg-gray-200 rounded-xl', className)}\n    >\n      <svg\n        className=\"w-4 h-4 mx-4 text-gray-500\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        stroke=\"currentColor\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          strokeWidth={2}\n          d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n        />\n      </svg>\n      <TextBox\n        className=\"flex-1 focus:outline-none\"\n        placeholder={language.value === 'en' ? 'Search...' : 'Cari sesuatu...'}\n      />\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/molecules/SectionTitle/index.tsx",
    "content": "import { HeaderText, TitleLine } from 'components/atoms';\nimport React, { ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { SVGMotionProps } from 'framer-motion';\n\ninterface Props {\n  children: ReactNode;\n  variant?: SectionVariants;\n  lineProps?: SVGMotionProps<SVGElement>;\n}\n\nexport enum SectionVariants {\n  LEFT = 'left',\n  CENTER = 'center',\n}\n\nexport default function SectionTitle({\n  children,\n  variant = SectionVariants.LEFT,\n  lineProps,\n}: Props) {\n  return (\n    <HeaderText\n      className={classNames('flex flex-col items-center', {\n        'lg:flex-row': variant === SectionVariants.LEFT,\n      })}\n    >\n      {children}\n      <TitleLine\n        className={classNames({\n          'lg:ml-6 lg:mt-0': variant === SectionVariants.LEFT,\n        })}\n        {...lineProps}\n      />\n    </HeaderText>\n  );\n}\n"
  },
  {
    "path": "src/components/molecules/TextIconButton/index.tsx",
    "content": "import { TextButton } from 'components/atoms';\nimport React, { ReactElement } from 'react';\nimport classNames from 'classnames';\n\ninterface Props {\n  text: string;\n  icon: ReactElement;\n  className?: string;\n  onClick: (params: any) => any;\n}\n\nexport default function TextIconButton({ text, icon, className, onClick }: Props) {\n  const Icon = React.cloneElement(icon, { className: classNames('w-4 h-4', icon.props.className) });\n  return (\n    <TextButton className={className} onClick={onClick}>\n      <span className=\"pr-2\">{text}</span>\n      {Icon}\n    </TextButton>\n  );\n}\n"
  },
  {
    "path": "src/components/molecules/TextSelect/index.tsx",
    "content": "import React, { Fragment } from 'react';\nimport { Listbox, Transition } from '@headlessui/react';\nimport { TextSelectOption } from 'components/atoms';\nimport TextSelectProps from 'components/molecules/TextSelect/types';\nimport classNames from 'classnames';\n\nexport default function TextSelect({ options, state, className }: TextSelectProps) {\n  const [selectedOption, setSelectedOption] = state;\n\n  return (\n    <Listbox as=\"div\" className={className} value={selectedOption} onChange={setSelectedOption}>\n      {({ open }) => (\n        <>\n          <Listbox.Button className=\"flex items-center px-4 py-2 text-gray-700 bg-white rounded-lg focus:outline-none focus:ring-2 ring-indigo-500\">\n            {selectedOption.label}\n            <svg\n              className={classNames('w-4 h-4 ml-2 transition-transform transform', {\n                'rotate-180': open,\n              })}\n              xmlns=\"http://www.w3.org/2000/svg\"\n              fill=\"none\"\n              viewBox=\"0 0 24 24\"\n              stroke=\"currentColor\"\n            >\n              <path\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n                strokeWidth={2}\n                d=\"M19 9l-7 7-7-7\"\n              />\n            </svg>\n          </Listbox.Button>\n          <Transition\n            show={open}\n            enter=\"duration-100 ease-out\"\n            enterFrom=\"scale-90 opacity-0\"\n            enterTo=\"scale-110 opacity-100\"\n            leave=\"duration-75 ease-out\"\n            leaveFrom=\"scale-110 opacity-100\"\n            leaveTo=\"scale-90 opacity-0\"\n            className=\"fixed z-20 transition duration-150 transform -translate-x-1/2 -translate-y-1/2 sm:translate-x-0 sm:translate-y-0 sm:mt-4 sm:absolute left-1/2 top-1/2 sm:left-auto sm:top-auto\"\n          >\n            <Listbox.Options\n              static\n              className=\"overflow-hidden text-3xl bg-white shadow-md rounded-xl focus:outline-none focus:ring-2 ring-indigo-500 sm:text-base\"\n            >\n              {options.map(option => (\n                <Listbox.Option as={Fragment} key={option.value} value={option}>\n                  {({ active, selected }) => (\n                    <TextSelectOption\n                      active={active}\n                      selected={selected}\n                      onClick={() => setSelectedOption(option)}\n                    >\n                      {option.label}\n                    </TextSelectOption>\n                  )}\n                </Listbox.Option>\n              ))}\n            </Listbox.Options>\n          </Transition>\n        </>\n      )}\n    </Listbox>\n  );\n}\n"
  },
  {
    "path": "src/components/molecules/TextSelect/types.tsx",
    "content": "export default interface TextSelectProps {\n  options: TextSelectOptionProps[];\n  state: [TextSelectOptionProps, (any: any) => void];\n  className?: string;\n}\n\nexport interface TextSelectOptionProps {\n  value: string | number;\n  label: string;\n}\n"
  },
  {
    "path": "src/components/molecules/index.tsx",
    "content": "import TextIconButton from 'components/molecules/TextIconButton';\nimport TextSelect from 'components/molecules/TextSelect';\nimport MenuButton from 'components/molecules/MenuButton';\nimport SectionTitle from 'components/molecules/SectionTitle';\nimport HighlightedTextIcon from 'components/molecules/HighlightedTextIcon';\nimport SearchBox from 'components/molecules/SearchBox';\nimport BlogPost from 'components/molecules/BlogPost';\nimport MainMenu from 'components/molecules/MainMenu';\n\nexport {\n  TextIconButton,\n  TextSelect,\n  MenuButton,\n  SectionTitle,\n  HighlightedTextIcon,\n  SearchBox,\n  BlogPost,\n  MainMenu,\n};\n"
  },
  {
    "path": "src/components/organisms/About/index.tsx",
    "content": "import Animated from 'components/animations';\nimport { ContentText, RoundedButton } from 'components/atoms';\nimport { SectionTitle } from 'components/molecules';\nimport { LanguageContext } from 'contexts';\nimport React, { useContext } from 'react';\nimport AboutSectionProps from 'components/organisms/About/types';\nimport { useAnimation } from 'framer-motion';\nimport { useEffect } from 'react';\nimport { useInView } from 'react-intersection-observer';\nimport { forwardRef } from 'react';\n\nconst About = forwardRef<HTMLElement | undefined, AboutSectionProps>(\n  ({ title, content, className }: AboutSectionProps, ref) => {\n    const controls = useAnimation();\n    const [refView, inView] = useInView({\n      threshold: 0.5,\n    });\n    const language = useContext(LanguageContext);\n\n    useEffect(() => {\n      if (inView) {\n        controls.start('show');\n      }\n    }, [controls, inView]);\n\n    return (\n      <section\n        id=\"about\"\n        className={className}\n        ref={section => {\n          refView(section);\n          if (ref) {\n            if (typeof ref === 'function') {\n              ref(section);\n            } else {\n              ref.current = section;\n            }\n          }\n        }}\n      >\n        <SectionTitle\n          lineProps={{\n            animate: controls,\n            custom: 1,\n            transition: {\n              delay: 1,\n            },\n          }}\n        >\n          <Animated.Letter text={title} animate={controls} custom={0} delay={1} />\n        </SectionTitle>\n        <div className=\"grid grid-rows-2 mt-6 lg:grid-cols-3 lg:grid-rows-1\">\n          <Animated.FromDirection\n            className=\"lg:col-span-2\"\n            from=\"left\"\n            animate={controls}\n            custom={0}\n            delay={1}\n          >\n            <Animated.Reveal from=\"left\" animate={controls} custom={1} delay={1}>\n              <ContentText className=\"lg:text-left\">{content.text}</ContentText>\n            </Animated.Reveal>\n          </Animated.FromDirection>\n          <div className=\"mx-auto mt-6 lg:mr-0 lg:ml-auto lg:mt-0\">\n            <Animated.FromDirection from=\"bottom\" animate={controls} custom={1} delay={1}>\n              <RoundedButton as=\"a\" href=\"./#\">\n                {language.value === 'en' ? 'Download' : 'Unduh'} Resume\n              </RoundedButton>\n            </Animated.FromDirection>\n          </div>\n        </div>\n      </section>\n    );\n  }\n);\n\nexport default About;\n"
  },
  {
    "path": "src/components/organisms/About/types.ts",
    "content": "import { ReactNode } from 'react';\n\nexport default interface AboutSectionProps {\n  title: string;\n  content: AboutSectionContentProps;\n  className?: string;\n}\n\nexport interface AboutSectionContentProps {\n  text: ReactNode;\n}\n"
  },
  {
    "path": "src/components/organisms/Blogs/index.tsx",
    "content": "import Animated from 'components/animations';\nimport { RoundedButton } from 'components/atoms';\nimport { SectionTitle, BlogPost } from 'components/molecules';\nimport { LanguageContext } from 'contexts';\nimport { useAnimation } from 'framer-motion';\nimport React, { forwardRef, useContext, useEffect } from 'react';\nimport { useInView } from 'react-intersection-observer';\nimport BlogsSectionProps from './types';\n\nconst Blogs = forwardRef<HTMLElement | undefined, BlogsSectionProps>(\n  ({ title, content, className }: BlogsSectionProps, ref) => {\n    const controls = useAnimation();\n    const [refView, inView] = useInView({\n      threshold: 0.45,\n    });\n    const language = useContext(LanguageContext);\n    const { items } = content;\n\n    useEffect(() => {\n      if (inView) {\n        controls.start('show');\n      }\n    }, [controls, inView]);\n\n    return (\n      <section\n        id=\"blogs\"\n        className={className}\n        ref={section => {\n          refView(section);\n          if (ref) {\n            if (typeof ref === 'function') {\n              ref(section);\n            } else {\n              ref.current = section;\n            }\n          }\n        }}\n      >\n        <div className=\"flex items-center justify-between\">\n          <SectionTitle\n            lineProps={{\n              animate: controls,\n              custom: 1,\n              transition: {\n                delay: 1,\n              },\n            }}\n          >\n            <Animated.Letter text={title} animate={controls} custom={0} delay={1} />\n          </SectionTitle>\n          <Animated.FromDirection from=\"bottom\" animate={controls} custom={0.5} delay={1}>\n            <RoundedButton as=\"a\" href=\"https://medium.com/@itsfaqih\">\n              {language.value === 'en' ? 'More article' : 'Artikel lainnya'}\n            </RoundedButton>\n          </Animated.FromDirection>\n        </div>\n        <div className=\"grid grid-cols-1 mt-10 md:mt-8 md:grid-cols-2 md:gap-x-20 gap-y-10 md:gap-y-16\">\n          {items.map((item, index) => (\n            <Animated.FromDirection\n              key={index}\n              from=\"left\"\n              animate={controls}\n              custom={index + 1}\n              delay={0.4}\n            >\n              <Animated.Reveal from=\"left\" animate={controls} custom={index + 3} delay={0.4}>\n                <BlogPost data={item} />\n              </Animated.Reveal>\n            </Animated.FromDirection>\n          ))}\n        </div>\n      </section>\n    );\n  }\n);\n\nexport default Blogs;\n"
  },
  {
    "path": "src/components/organisms/Blogs/types.ts",
    "content": "import { BlogsPostProps } from 'components/molecules/BlogPost/types';\n\nexport default interface BlogsSectionProps {\n  title: string;\n  content: BlogsSectionContentProps;\n  className?: string;\n}\n\nexport interface BlogsSectionContentProps {\n  items: BlogsPostProps[];\n}\n"
  },
  {
    "path": "src/components/organisms/Contact/index.tsx",
    "content": "import { FullRoundButton } from 'components/atoms';\nimport Icons from 'components/icons';\nimport React, { useEffect } from 'react';\nimport ContactSectionProps from 'components/organisms/Contact/types';\nimport Animated from 'components/animations';\nimport { useAnimation } from 'framer-motion';\nimport { useInView } from 'react-intersection-observer';\nimport { forwardRef } from 'react';\n\nconst Contact = forwardRef<HTMLElement | undefined, ContactSectionProps>(\n  ({ title, content }: ContactSectionProps, ref) => {\n    const { email, socials } = content;\n    const controls = useAnimation();\n    const [refView, inView] = useInView({\n      threshold: 0.4,\n    });\n\n    useEffect(() => {\n      if (inView) {\n        controls.start('show');\n      }\n    }, [controls, inView]);\n\n    return (\n      <section\n        id=\"contact\"\n        ref={section => {\n          refView(section);\n          if (ref) {\n            if (typeof ref === 'function') {\n              ref(section);\n            } else {\n              ref.current = section;\n            }\n          }\n        }}\n      >\n        <h2 className=\"flex justify-center text-3xl font-bold text-gray-600 md:justify-start\">\n          <Animated.Letter text={title} animate={controls} custom={0} delay={0.6} />\n        </h2>\n        <div className=\"flex flex-col items-center md:flex-row md:justify-between\">\n          <a\n            href={`mailto:${email}`}\n            className=\"relative mt-6 text-4xl font-bold text-gray-800 rounded-lg focus:outline-none focus:ring-2 ring-indigo-500 ring-offset-8\"\n          >\n            <Animated.Letter text={email} animate={controls} custom={1} delay={0.6} />\n            <Animated.Highlighter\n              className=\"h-4 bottom-0.5\"\n              rad={8}\n              animate={controls}\n              custom={2}\n              delay={0.6}\n            />\n          </a>\n          <div className=\"flex items-center mt-8 md:mt-0\">\n            <Animated.FromDirection from=\"bottom\" animate={controls} custom={2.2} delay={0.6}>\n              <FullRoundButton as=\"a\" href={socials.facebook} label=\"Facebook\">\n                <Icons.Facebook className=\"w-6\" />\n              </FullRoundButton>\n            </Animated.FromDirection>\n            <Animated.FromDirection from=\"bottom\" animate={controls} custom={2.4} delay={0.6}>\n              <FullRoundButton as=\"a\" href={socials.twitter} className=\"mx-6\" label=\"Twitter\">\n                <Icons.Twitter className=\"w-6\" />\n              </FullRoundButton>\n            </Animated.FromDirection>\n            <Animated.FromDirection from=\"bottom\" animate={controls} custom={2.6} delay={0.6}>\n              <FullRoundButton as=\"a\" href={socials.instagram} label=\"Instagram\">\n                <Icons.Instagram className=\"w-6\" />\n              </FullRoundButton>\n            </Animated.FromDirection>\n          </div>\n        </div>\n      </section>\n    );\n  }\n);\n\nexport default Contact;\n"
  },
  {
    "path": "src/components/organisms/Contact/types.ts",
    "content": "export default interface ContactSectionProps {\n  title: string;\n  content: ContactSectionContentProps;\n}\n\nexport interface ContactSectionContentProps {\n  email: string;\n  socials: {\n    facebook: string;\n    twitter: string;\n    instagram: string;\n  };\n}\n"
  },
  {
    "path": "src/components/organisms/Header/index.tsx",
    "content": "import Animated from 'components/animations';\nimport { Avatar, HeaderText } from 'components/atoms';\nimport Decorations from 'components/decorations';\nimport { TextIconButton } from 'components/molecules';\nimport HeaderProps from 'components/organisms/Header/types';\nimport { LanguageContext } from 'contexts';\nimport React, { useContext } from 'react';\n\nexport default function Header({ data, text, lowerSectionRef }: HeaderProps) {\n  const languange = useContext(LanguageContext);\n  const { profilePicture, name, job } = data;\n  const { headerText } = text;\n  const { greetings, intro, preTitle } = headerText;\n\n  return (\n    <header className=\"flex justify-center\">\n      <div className=\"grid grid-rows-3 md:grid-cols-2 md:h-60\">\n        <div className=\"relative col-start-1 row-span-3 justify-self-center\">\n          <Animated.FromDirection\n            from=\"top\"\n            delay={2.2}\n            duration={1}\n            className=\"absolute -top-6 md:-top-10 -left-6 md:-left-10 -z-10\"\n          >\n            <Decorations.Stripes className=\"w-24 h-24 text-indigo-300 md:w-40 md:h-40\" />\n          </Animated.FromDirection>\n          <Animated.FromDirection from=\"right\" custom={1} delay={0.3} duration={0.8}>\n            <Animated.Reveal from=\"right\" className=\"rounded-3xl\" delay={0.8} duration={1.2}>\n              <Avatar src={profilePicture} alt=\"Profile Picture\" />\n            </Animated.Reveal>\n          </Animated.FromDirection>\n        </div>\n        <HeaderText className=\"flex flex-col items-center mt-6 md:items-start md:row-start-2 md:col-start-2 md:self-center md:mt-0\">\n          <Animated.Letter text={`${greetings} 👋`} custom={0} delay={0.3} />\n          <Animated.Letter text={`${intro} ${name}`} custom={2} delay={0.3} />\n          <div className=\"relative inline-flex\">\n            <Animated.Letter\n              text={`${preTitle ? `${preTitle} ` : ''}${job}`}\n              custom={4}\n              delay={0.3}\n            />\n            <Animated.Highlighter className=\"h-3 bottom-1.5\" rad={6} custom={8} delay={0.3} />\n          </div>\n        </HeaderText>\n        <Animated.FromDirection\n          from=\"top\"\n          custom={8}\n          delay={0.3}\n          className=\"mx-auto mt-6 md:-ml-0 md:mr-auto md:mt-auto md:col-start-2 md:row-start-3\"\n        >\n          <TextIconButton\n            className=\"group\"\n            onClick={() => lowerSectionRef?.current?.scrollIntoView({ behavior: 'smooth' })}\n            text={languange.value === 'en' ? 'Scroll down' : 'Scroll ke bawah'}\n            icon={\n              <svg\n                className=\"transition-all transform group-hover:translate-y-1\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                fill=\"none\"\n                viewBox=\"0 0 24 24\"\n                stroke=\"currentColor\"\n              >\n                <path\n                  strokeLinecap=\"round\"\n                  strokeLinejoin=\"round\"\n                  strokeWidth={2}\n                  d=\"M19 14l-7 7m0 0l-7-7m7 7V3\"\n                />\n              </svg>\n            }\n          />\n        </Animated.FromDirection>\n      </div>\n    </header>\n  );\n}\n"
  },
  {
    "path": "src/components/organisms/Header/types.ts",
    "content": "import { MutableRefObject } from \"react\";\n\nexport default interface HeaderProps {\n  data: HeaderDataProps;\n  text: HeaderTextProps;\n  lowerSectionRef?: MutableRefObject<HTMLElement | undefined>;\n}\n\nexport interface HeaderDataProps {\n  profilePicture: string;\n  name: string;\n  job: string;\n}\n\nexport interface HeaderTextProps {\n  headerText: {\n    greetings: string;\n    intro: string;\n    preTitle: string;\n  };\n}\n"
  },
  {
    "path": "src/components/organisms/Navigation/index.tsx",
    "content": "import Animated from 'components/animations';\nimport { MainMenu, TextSelect } from 'components/molecules';\nimport { TextSelectOptionProps } from 'components/molecules/TextSelect/types';\nimport { LocaleProps } from 'contexts/language';\nimport React from 'react';\nimport { useState } from 'react';\nimport classNames from 'classnames';\nimport { Container } from 'components/atoms';\n\ninterface Props {\n  locale: LocaleProps;\n  sections: { about: string; projects: string; blogs: string; skills: string; contact: string };\n  className?: string;\n}\n\nexport default function Navigation({ locale, sections, className }: Props) {\n  const [animationFinish, setAnimationFinish] = useState(false);\n  const languageOptions: TextSelectOptionProps[] = [\n    { label: 'English', value: 'en' },\n    { label: 'Indonesia', value: 'id' },\n  ];\n\n  const selectedLanguage =\n    languageOptions.find(option => option.value === locale.value) || languageOptions[0];\n\n  const setSelectedLanguage = (option: TextSelectOptionProps) => {\n    if (option.value === 'en' || option.value === 'id') {\n      locale.change(option.value);\n    }\n  };\n  \n  return (\n    <nav>\n      <Animated.FromDirection\n        from=\"top\"\n        className={classNames('w-full', className)}\n        duration={1}\n        onAnimationComplete={() => setAnimationFinish(true)}\n      >\n        <Container className=\"flex\">\n          <div className=\"flex self-center flex-1 pr-8\">\n            <div className=\"sm:ml-auto\">\n              <TextSelect\n                state={[selectedLanguage, setSelectedLanguage]}\n                options={languageOptions}\n              />\n            </div>\n          </div>\n          <MainMenu sections={sections} animationFinish={animationFinish} />\n        </Container>\n      </Animated.FromDirection>\n    </nav>\n  );\n}\n"
  },
  {
    "path": "src/components/organisms/Projects/index.tsx",
    "content": "import { SectionTitle } from 'components/molecules';\nimport React, { useContext, useEffect } from 'react';\nimport { SectionVariants } from 'components/molecules/SectionTitle';\nimport { RoundedButton } from 'components/atoms';\nimport { LanguageContext } from 'contexts';\nimport ProjectCard from 'components/molecules/ProjectCard';\nimport Decorations from 'components/decorations';\nimport ProjectsSectionProps from 'components/organisms/Projects/types';\nimport { useAnimation } from 'framer-motion';\nimport { useInView } from 'react-intersection-observer';\nimport Animated from 'components/animations';\nimport { forwardRef } from 'react';\n\nconst Projects = forwardRef<HTMLElement | undefined, ProjectsSectionProps>(\n  ({ title, content, className }: ProjectsSectionProps, ref) => {\n    const controls = useAnimation();\n    const [refView, inView] = useInView({\n      threshold: 0.4,\n    });\n    const language = useContext(LanguageContext);\n    const { items } = content;\n\n    const bulletsClasses = 'w-32 h-32 text-indigo-300 md:w-40 md:h-40';\n\n    useEffect(() => {\n      if (inView) {\n        controls.start('show');\n      }\n    }, [controls, inView]);\n\n    return (\n      <section\n        id=\"projects\"\n        className={className}\n        ref={section => {\n          refView(section);\n          if (ref) {\n            if (typeof ref === 'function') {\n              ref(section);\n            } else {\n              ref.current = section;\n            }\n          }\n        }}\n      >\n        <SectionTitle\n          variant={SectionVariants.CENTER}\n          lineProps={{\n            animate: controls,\n            custom: 1,\n            transition: {\n              delay: 1,\n            },\n          }}\n        >\n          <Animated.Letter text={title} animate={controls} custom={0} delay={1} />\n        </SectionTitle>\n        <div className=\"relative grid grid-cols-1 gap-8 mt-6 sm:grid-cols-2 lg:grid-cols-3\">\n          <Animated.FromDirection\n            from=\"top\"\n            animate={controls}\n            custom={1}\n            delay={1}\n            className=\"absolute -top-8 -left-12 md:-top-9 md:-left-16 -z-10\"\n          >\n            <Decorations.Bullets className={bulletsClasses} />\n          </Animated.FromDirection>\n          <Animated.FromDirection\n            from=\"bottom\"\n            animate={controls}\n            custom={1}\n            delay={1}\n            className=\"absolute -bottom-8 -right-12 md:-bottom-9 md:-right-16 -z-10\"\n          >\n            <Decorations.Bullets className={bulletsClasses} />\n          </Animated.FromDirection>\n          {items.map((item, index) => (\n            <Animated.FadeIn key={index} animate={controls} custom={index} delay={0.2}>\n              <ProjectCard\n                data={item}\n                className=\"h-full transition-all transform hover:shadow-lg hover:scale-110 focus-within:scale-110 focus-within:shadow-lg\"\n              />\n            </Animated.FadeIn>\n          ))}\n        </div>\n\n        <Animated.FromDirection className=\"flex justify-center mt-8\" from=\"bottom\" animate={controls} custom={2} delay={1}>\n          <RoundedButton as=\"a\" href=\"https://github.com/itsfaqih\">\n            {language.value === 'en' ? 'See more' : 'Lihat Selengkapnya'}\n          </RoundedButton>\n        </Animated.FromDirection>\n      </section>\n    );\n  }\n);\n\nexport default Projects;\n"
  },
  {
    "path": "src/components/organisms/Projects/types.ts",
    "content": "import { ProjectCardDataProps } from 'components/molecules/ProjectCard/types';\n\nexport default interface ProjectsSectionProps {\n  title: string;\n  content: ProjectsSectionContentProps;\n  className?: string;\n}\n\nexport interface ProjectsSectionContentProps {\n  items: ProjectCardDataProps[];\n}\n"
  },
  {
    "path": "src/components/organisms/Skills/index.tsx",
    "content": "import Animated from 'components/animations';\nimport { ContentText } from 'components/atoms';\nimport { SectionTitle } from 'components/molecules';\nimport { SectionVariants } from 'components/molecules/SectionTitle';\nimport { useAnimation } from 'framer-motion';\nimport React, { useEffect } from 'react';\nimport { forwardRef } from 'react';\nimport { useInView } from 'react-intersection-observer';\nimport SkillsSectionProps from './types';\n\nconst Skills = forwardRef<HTMLElement | undefined, SkillsSectionProps>(\n  ({ title, content, className }: SkillsSectionProps, ref) => {\n    const { text, items } = content;\n    const upperSkills = items.slice(0, items.length / 2);\n    const lowerSkills = items.slice(items.length / 2);\n\n    const skillIconsClasses =\n      'mx-5 transition-all transform hover:scale-125 hover:filter-none filter-grayscale focus-within:filter-none focus-within:scale-125';\n\n    const controls = useAnimation();\n    const [refView, inView] = useInView({\n      threshold: 0.5,\n    });\n\n    useEffect(() => {\n      if (inView) {\n        controls.start('show');\n      }\n    }, [controls, inView]);\n\n    return (\n      <section\n        id=\"skills\"\n        className={className}\n        ref={section => {\n          refView(section);\n          if (ref) {\n            if (typeof ref === 'function') {\n              ref(section);\n            } else {\n              ref.current = section;\n            }\n          }\n        }}\n      >\n        <SectionTitle\n          variant={SectionVariants.CENTER}\n          lineProps={{\n            animate: controls,\n            custom: 1,\n            transition: {\n              delay: 1,\n            },\n          }}\n        >\n          <Animated.Letter text={title} animate={controls} custom={0} delay={1} />\n        </SectionTitle>\n        <Animated.FromDirection\n          className=\"mx-auto mt-6 lg:w-2/3\"\n          from=\"left\"\n          animate={controls}\n          custom={0}\n          delay={1}\n        >\n          <Animated.Reveal from=\"left\" animate={controls} custom={1} delay={1}>\n            <ContentText className=\"text-center\">{text}</ContentText>\n          </Animated.Reveal>\n        </Animated.FromDirection>\n        <div className=\"flex items-center justify-center mt-8\">\n          {upperSkills.map((SkillItem, index) => (\n            <Animated.FromDirection\n              key={index}\n              from=\"bottom\"\n              animate={controls}\n              custom={index + 2}\n              delay={0.3}\n            >\n              <div className={skillIconsClasses}>{SkillItem}</div>\n            </Animated.FromDirection>\n          ))}\n        </div>\n        <div className=\"flex items-center justify-center mt-6\">\n          {lowerSkills.map((SkillItem, index) => (\n            <Animated.FromDirection\n              key={index}\n              from=\"bottom\"\n              animate={controls}\n              custom={index + 5}\n              delay={0.3}\n            >\n              <div className={skillIconsClasses}>{SkillItem}</div>\n            </Animated.FromDirection>\n          ))}\n        </div>\n      </section>\n    );\n  }\n);\n\nexport default Skills;\n"
  },
  {
    "path": "src/components/organisms/Skills/types.ts",
    "content": "import { ReactNode } from 'react';\n\nexport default interface SkillsSectionProps {\n  title: string;\n  content: SkillsSectionContentProps;\n  className?: string;\n}\n\nexport interface SkillsSectionContentProps {\n  text: ReactNode;\n  items: ReactNode[];\n}\n"
  },
  {
    "path": "src/components/organisms/index.tsx",
    "content": "import Header from 'components/organisms/Header';\nimport About from 'components/organisms/About';\nimport Projects from 'components/organisms/Projects';\nimport Blogs from 'components/organisms/Blogs';\nimport Skills from 'components/organisms/Skills';\nimport Contact from 'components/organisms/Contact';\nimport Navigation from 'components/organisms/Navigation';\n\nexport { Header, About, Projects, Blogs, Skills, Contact, Navigation };\n"
  },
  {
    "path": "src/components/templates/Landing/index.tsx",
    "content": "import { Container } from 'components/atoms';\nimport { About, Blogs, Contact, Header, Navigation, Projects, Skills } from 'components/organisms';\nimport { AboutSectionContentProps } from 'components/organisms/About/types';\nimport { BlogsSectionContentProps } from 'components/organisms/Blogs/types';\nimport { ContactSectionContentProps } from 'components/organisms/Contact/types';\nimport HeaderProps from 'components/organisms/Header/types';\nimport { ProjectsSectionContentProps } from 'components/organisms/Projects/types';\nimport { SkillsSectionContentProps } from 'components/organisms/Skills/types';\nimport { LocaleProps } from 'contexts/language';\nimport React from 'react';\nimport { useRef } from 'react';\n\ninterface Props {\n  data: {\n    header: HeaderProps;\n    about: AboutSectionContentProps;\n    projects: ProjectsSectionContentProps;\n    blogs: BlogsSectionContentProps;\n    skills: SkillsSectionContentProps;\n    contact: ContactSectionContentProps;\n  };\n  locale: LocaleProps;\n  sections: { about: string; projects: string; blogs: string; skills: string; contact: string };\n}\n\nexport default function Landing({ data, locale, sections }: Props) {\n  const { header, about, projects, blogs, skills, contact } = data;\n  const lowerSectionRef = useRef();\n\n  return (\n    <>\n      <Navigation className=\"fixed z-10 top-8\" locale={locale} sections={sections} />\n      <Container className=\"pt-32\">\n        <div className=\"flex flex-wrap\">\n          <main className=\"w-full mt-12\">\n            <Header data={header.data} text={header.text} lowerSectionRef={lowerSectionRef} />\n            <About\n              title={sections.about}\n              content={{\n                text: about.text,\n              }}\n              className=\"pt-32 mt-24\"\n              ref={lowerSectionRef}\n            />\n            <Projects\n              title={sections.projects}\n              content={{\n                items: projects.items,\n              }}\n              className=\"pt-12 mt-40\"\n            />\n            <Blogs\n              title={sections.blogs}\n              content={{ items: blogs.items }}\n              className=\"mt-12 pt-28\"\n            />\n            <Skills\n              title={sections.skills}\n              content={{ text: skills.text, items: skills.items }}\n              className=\"pt-24 mt-28\"\n            />\n          </main>\n          <footer className=\"w-full pt-20 pb-16 mt-32\">\n            <Contact\n              title={sections.contact}\n              content={{\n                email: contact.email,\n                socials: contact.socials,\n              }}\n            />\n          </footer>\n        </div>\n      </Container>\n    </>\n  );\n}\n"
  },
  {
    "path": "src/components/templates/index.tsx",
    "content": "import Landing from 'components/templates/Landing';\n\nexport { Landing };"
  },
  {
    "path": "src/contexts/index.ts",
    "content": "import LanguageContext from 'contexts/language';\n\nexport { LanguageContext };\n"
  },
  {
    "path": "src/contexts/language.ts",
    "content": "import { createContext } from 'react';\n\nexport interface LocaleProps {\n  value: 'en' | 'id';\n  change: (lang: 'en' | 'id') => void;\n}\n\nconst LanguageContext = createContext<LocaleProps>({\n  value: 'en',\n  change: lang => {},\n});\n\nexport default LanguageContext;\n"
  },
  {
    "path": "src/data/blogs.ts",
    "content": "import { BlogsPostProps } from 'components/molecules/BlogPost/types';\n\nconst blogs: BlogsPostProps[] = [\n  {\n    title: 'Membuat Otentikasi JWT dengan PHP Native',\n    date: new Date('2020-11-16'),\n    url: 'https://medium.com/@itsfaqih/membuat-otentikasi-jwt-dengan-php-native-a9d080953358',\n  },\n  {\n    title: 'Apa itu JWT (JSON Web Token)?',\n    date: new Date('2020-11-14'),\n    url: 'https://medium.com/@itsfaqih/apa-itu-jwt-json-web-token-63407936da10',\n  },\n  {\n    title: 'Penerapan Sistem Grid Responsive dengan Flexbox',\n    date: new Date('2020-06-13'),\n    url:\n      'https://medium.com/@itsfaqih/penerapan-sistem-grid-responsive-dengan-flexbox-c479c84be129',\n  },\n  {\n    title: 'Memahami Satuan Persen (%) dalam CSS',\n    date: new Date('2020-06-11'),\n    url: 'https://medium.com/@itsfaqih/memahami-satuan-persen-dalam-css-12479cba1c32',\n  },\n];\n\nexport default blogs;\n"
  },
  {
    "path": "src/data/contact.ts",
    "content": "import { ContactSectionContentProps } from 'components/organisms/Contact/types';\n\nconst contact: ContactSectionContentProps = {\n  email: 'itsfaqih@gmail.com',\n  socials: {\n    facebook: 'https://facebook.com/itsfaqih',\n    twitter: 'https://twitter.com/itsfaqih_',\n    instagram: 'https://instagram.com/itsfaqih',\n  },\n};\n\nexport default contact;\n"
  },
  {
    "path": "src/data/header.ts",
    "content": "import { HeaderDataProps } from 'components/organisms/Header/types';\n\nconst header: HeaderDataProps = {\n  name: 'Faqih Muntashir',\n  profilePicture: './img/person.jpg',\n  job: 'Fullstack Developer',\n};\n\nexport default header;\n"
  },
  {
    "path": "src/data/index.ts",
    "content": "import header from 'data/header';\nimport projects from 'data/projects';\nimport blogs from 'data/blogs';\nimport skills from 'data/skills';\nimport contact from 'data/contact';\n\nexport { header, projects, blogs, skills, contact };\n"
  },
  {
    "path": "src/data/projects.ts",
    "content": "import { ProjectCardDataProps } from \"components/molecules/ProjectCard/types\";\n\nconst projects: ProjectCardDataProps[] = [\n  {\n    title: 'usePagination',\n    description: 'Simple client side pagination hooks for react.',\n    type: 'github',\n    url: 'https://github.com/itsfaqih/usepagination',\n  },\n  {\n    title: 'larareactia',\n    description:\n      'Laravel SPA + React + Inertia.js + TailwindCSS starter template with authentication.',\n    type: 'github',\n    url: 'https://github.com/itsfaqih/larareactia',\n  },\n  {\n    title: 'Overflow',\n    description: 'TailwindCSS Admin Dashboard Template.',\n    type: 'dribbble',\n    url: 'https://dribbble.com/shots/11877395-Overflow-TailwindCSS-Admin-Dashboard-Template',\n  },\n  {\n    title: 'kos-manager',\n    description: 'Lodgement management application. Developed with Laravel, Inertiajs, and React.',\n    type: 'github',\n    url: 'http://github.com/itsfaqih/kos-manager',\n  },\n  {\n    title: 'Nyx',\n    description: 'TailwindCSS Landing Page Template.',\n    type: 'dribbble',\n    url: 'https://dribbble.com/shots/11712756-Nyx-TailwindCSS-Landing-Page-Template',\n  },\n  {\n    title: 'flexbox-tutorial',\n    description: 'CSS layouting using flexbox tutorial.',\n    type: 'github',\n    url: 'http://github.com/itsfaqih/flexbox-tutorial',\n  },\n];\n\nexport default projects;\n"
  },
  {
    "path": "src/data/skills.tsx",
    "content": "import React from 'react';\nimport { Icon } from '@iconify/react';\nimport reactIcon from '@iconify/icons-logos/react';\nimport tailwindcssIcon from '@iconify/icons-logos/tailwindcss-icon';\nimport laravelIcon from '@iconify/icons-logos/laravel';\nimport codeigniterIcon from '@iconify/icons-logos/codeigniter';\nimport postCssIcon from '@iconify/icons-logos/postcss';\nimport bootstrapIcon from '@iconify/icons-logos/bootstrap';\nimport nextjsIcon from '@iconify/icons-logos/nextjs';\n\nconst skills = [\n  <a href=\"https://reactjs.org\" className=\"focus:outline-none\">\n    <Icon className=\"text-5xl\" icon={reactIcon} />\n  </a>,\n  <a href=\"https://tailwindcss.com\" className=\"focus:outline-none\">\n    <Icon className=\"text-4xl\" icon={tailwindcssIcon} />\n  </a>,\n  <a href=\"https://laravel.com\" className=\"focus:outline-none\">\n    <Icon className=\"text-5xl\" icon={laravelIcon} />\n  </a>,\n  <a href=\"https://codeigniter.com\" className=\"focus:outline-none\">\n    <Icon className=\"text-6xl\" icon={codeigniterIcon} />\n  </a>,\n  <a href=\"https://postcss.org\" className=\"focus:outline-none\">\n    <Icon className=\"text-5xl\" icon={postCssIcon} />\n  </a>,\n  <a href=\"https://getboostrap.com\" className=\"focus:outline-none\">\n    <Icon className=\"text-5xl\" icon={bootstrapIcon} />\n  </a>,\n  <a href=\"https://nextjs.org\" className=\"focus:outline-none\">\n    <Icon className=\"text-5xl\" icon={nextjsIcon} />\n  </a>,\n];\n\nexport default skills;\n"
  },
  {
    "path": "src/index.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>,\n  document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"
  },
  {
    "path": "src/localization/en/about.tsx",
    "content": "import React from 'react';\nimport { Icon } from '@iconify/react';\nimport { HighlightedTextIcon } from 'components/molecules';\nimport { AboutSectionContentProps } from 'components/organisms/About/types';\nimport reactIcon from '@iconify/icons-logos/react';\nimport tailwindcssIcon from '@iconify/icons-logos/tailwindcss-icon';\n\nconst Text = () => (\n  <>\n    I’m currently working as a freelance{' '}\n    <span className=\"font-bold text-gray-800\">fullstack developer</span> and{' '}\n    <span className=\"font-bold text-gray-800\">UI/UX designer</span>. I enjoy building web apps using\n    <HighlightedTextIcon\n      as=\"a\"\n      href=\"https://tailwindcss.com\"\n      className=\"mx-2\"\n      icon={<Icon icon={tailwindcssIcon} />}\n    >\n      TailwindCSS\n    </HighlightedTextIcon>{' '}\n    and{' '}\n    <HighlightedTextIcon\n      as=\"a\"\n      href=\"https://reactjs.org\"\n      className=\"mx-2\"\n      icon={<Icon icon={reactIcon} />}\n    >\n      React\n    </HighlightedTextIcon>\n    . I'm also an active student in University of AMIKOM Yogyakarta.\n  </>\n);\n\nconst about: AboutSectionContentProps = {\n  text: <Text />,\n};\n\nexport default about;\n"
  },
  {
    "path": "src/localization/en/header.ts",
    "content": "import { HeaderTextProps } from 'components/organisms/Header/types';\n\nconst header: HeaderTextProps = {\n  headerText: {\n    greetings: 'Hello',\n    intro: \"I'm\",\n    preTitle: 'a',\n  }\n};\n\nexport default header;\n"
  },
  {
    "path": "src/localization/en/index.ts",
    "content": "import header from 'localization/en/header';\nimport about from 'localization/en/about';\nimport sections from 'localization/en/sections';\nimport skills from 'localization/en/skills';\n\nexport { header, about, sections, skills };\n"
  },
  {
    "path": "src/localization/en/sections.ts",
    "content": "const section = {\n  about: 'About me',\n  projects: 'Projects',\n  blogs: 'Blogs',\n  skills: 'Skills',\n  contact: 'Get in touch 🤙',\n};\n\nexport default section;\n"
  },
  {
    "path": "src/localization/en/skills.tsx",
    "content": "import React from 'react';\nimport { Icon } from '@iconify/react';\nimport phpIcon from '@iconify/icons-logos/php';\nimport javascriptIcon from '@iconify/icons-logos/javascript';\nimport { HighlightedTextIcon } from 'components/molecules';\n\nconst Text = () => (\n  <>\n    I’ve spent about two years on improving my skills in{' '}\n    <span className=\"font-bold text-gray-800\">website development</span> using{' '}\n    <HighlightedTextIcon\n      as=\"a\"\n      href=\"https://php.net\"\n      className=\"mx-2\"\n      icon={<Icon icon={phpIcon} />}\n    >\n      PHP\n    </HighlightedTextIcon>{' '}\n    and{' '}\n    <HighlightedTextIcon className=\"mx-2\" icon={<Icon icon={javascriptIcon} />}>\n      Javascript\n    </HighlightedTextIcon>{' '}\n    that I’m now pretty confident in building apps using these tools:\n  </>\n);\n\nconst skills = {\n  text: <Text />,\n};\n\nexport default skills;\n"
  },
  {
    "path": "src/localization/id/about.tsx",
    "content": "import React from 'react';\nimport { HighlightedTextIcon } from 'components/molecules';\nimport { AboutSectionContentProps } from 'components/organisms/About/types';\n\nconst Text = () => (\n  <>\n    Saat ini saya sedang bekerja sebagai freelance{' '}\n    <span className=\"font-bold text-gray-800\">fullstack developer</span> dan{' '}\n    <span className=\"font-bold text-gray-800\">UI/UX designer</span>, saya sangat suka menggunakan\n    <HighlightedTextIcon\n      as=\"a\"\n      href=\"https://tailwindcss.com\"\n      className=\"mx-2\"\n      icon={\n        <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 54 33\">\n          <g clipPath=\"url(#prefix__clip0)\">\n            <path\n              fill=\"#14B4C6\"\n              fillRule=\"evenodd\"\n              d=\"M27 0c-7.2 0-11.7 3.6-13.5 10.8 2.7-3.6 5.85-4.95 9.45-4.05 2.054.513 3.522 2.004 5.147 3.653C30.744 13.09 33.808 16.2 40.5 16.2c7.2 0 11.7-3.6 13.5-10.8-2.7 3.6-5.85 4.95-9.45 4.05-2.054-.513-3.522-2.004-5.147-3.653C36.756 3.11 33.692 0 27 0zM13.5 16.2C6.3 16.2 1.8 19.8 0 27c2.7-3.6 5.85-4.95 9.45-4.05 2.054.514 3.522 2.004 5.147 3.653C17.244 29.29 20.308 32.4 27 32.4c7.2 0 11.7-3.6 13.5-10.8-2.7 3.6-5.85 4.95-9.45 4.05-2.054-.513-3.522-2.004-5.147-3.653C23.256 19.31 20.192 16.2 13.5 16.2z\"\n              clipRule=\"evenodd\"\n            />\n          </g>\n          <defs>\n            <clipPath id=\"prefix__clip0\">\n              <path fill=\"#fff\" d=\"M0 0h54v32.4H0z\" />\n            </clipPath>\n          </defs>\n        </svg>\n      }\n    >\n      TailwindCSS\n    </HighlightedTextIcon>{' '}\n    dan{' '}\n    <HighlightedTextIcon\n      as=\"a\"\n      href=\"https://reactjs.org\"\n      className=\"mx-2\"\n      icon={\n        <svg\n          width=\"30\"\n          height=\"27\"\n          viewBox=\"0 0 30 27\"\n          fill=\"none\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n        >\n          <g clipPath=\"url(#clip0)\">\n            <path\n              d=\"M24.6652 8.75216C24.3461 8.64133 24.0243 8.53842 23.7 8.44342C23.7539 8.22175 23.8039 7.99921 23.85 7.77579C24.5804 4.18696 24.103 1.29478 22.47 0.342155C20.9048 -0.570886 18.3457 0.381738 15.7604 2.65774C15.5057 2.88205 15.257 3.11294 15.0143 3.35044C14.8517 3.19211 14.6865 3.0373 14.5187 2.886C11.8083 0.454306 9.0913 -0.569567 7.46087 0.383057C5.89957 1.29874 5.43652 4.01807 6.0913 7.41954C6.15826 7.75644 6.23217 8.09157 6.31304 8.42495C5.93087 8.53578 5.55913 8.6532 5.20435 8.77855C2.02826 9.90006 0 11.6549 0 13.4757C0 15.3559 2.17826 17.2427 5.48609 18.384C5.75391 18.4772 6.02435 18.5634 6.29739 18.6426C6.2087 19.0006 6.13043 19.3612 6.06261 19.7245C5.43391 23.0666 5.92435 25.7213 7.48435 26.6317C9.09391 27.5711 11.7965 26.6053 14.43 24.2778C14.6387 24.0949 14.8474 23.9005 15.0561 23.6946C15.3187 23.9524 15.5883 24.2022 15.8648 24.4441C18.4161 26.6633 20.9335 27.5579 22.4909 26.6475C24.1017 25.7041 24.6248 22.8528 23.9452 19.3841C23.893 19.1202 23.833 18.8502 23.7652 18.574C23.9548 18.5177 24.1409 18.4592 24.3235 18.3985C27.763 17.2453 30 15.3809 30 13.4757C30 11.647 27.9065 9.88027 24.6652 8.75216ZM16.6043 3.63676C18.8191 1.68665 20.8891 0.918743 21.8348 1.46762C22.8391 2.05345 23.2278 4.41654 22.5965 7.51586C22.5557 7.71817 22.5109 7.91917 22.4622 8.11884C21.1402 7.81573 19.7999 7.60152 18.45 7.4776C17.6765 6.3537 16.8289 5.28385 15.913 4.27536C16.1374 4.05721 16.367 3.84435 16.6017 3.63676H16.6043ZM8.85652 15.0287C9.1287 15.5599 9.41261 16.0833 9.70826 16.5988C10.01 17.1265 10.3239 17.6468 10.65 18.1597C9.72128 18.0581 8.79832 17.9084 7.88478 17.7111C8.15087 16.8442 8.47696 15.943 8.85783 15.03L8.85652 15.0287ZM8.85652 11.9808C8.48348 11.0862 8.16522 10.2062 7.90435 9.35514C8.7587 9.16118 9.67174 9.00285 10.6226 8.88278C10.3043 9.38417 9.99783 9.89434 9.70304 10.4133C9.40739 10.9288 9.12478 11.4513 8.85522 11.9808H8.85652ZM9.53739 13.506C9.93217 12.6748 10.3583 11.8594 10.8157 11.0598C11.2696 10.2594 11.7539 9.47872 12.2687 8.71786C13.1609 8.64925 14.0752 8.6123 15 8.6123C15.9287 8.6123 16.8443 8.64925 17.7365 8.71786C18.2452 9.47872 18.727 10.2572 19.1817 11.0532C19.6391 11.8502 20.0704 12.6616 20.4757 13.4876C20.0757 14.3214 19.6461 15.1404 19.187 15.9443C18.7322 16.743 18.2522 17.5259 17.747 18.2929C16.8574 18.3589 15.9378 18.3906 15 18.3906C14.0661 18.3906 13.1583 18.3615 12.2843 18.3035C11.7661 17.5382 11.2774 16.754 10.8183 15.9509C10.3609 15.1505 9.93391 14.3351 9.53739 13.5047V13.506ZM20.2983 16.5935C20.5991 16.0631 20.8887 15.5265 21.167 14.9838C21.5481 15.8557 21.8842 16.7471 22.1739 17.6543C21.2502 17.864 20.3163 18.0247 19.3761 18.1359C19.6926 17.6275 19.9996 17.1129 20.297 16.5922L20.2983 16.5935ZM21.1539 11.9821C20.8774 11.4508 20.5904 10.9248 20.293 10.4041C19.9991 9.89214 19.6948 9.38637 19.38 8.88674C20.3361 9.00945 21.253 9.17174 22.1152 9.37097C21.8384 10.2576 21.5176 11.1295 21.1539 11.9834V11.9821ZM15.013 5.20555C15.6373 5.89365 16.2267 6.61321 16.7791 7.36149C15.5983 7.30431 14.4165 7.30431 13.2339 7.36149C13.817 6.58303 14.4143 5.85999 15.0143 5.20555H15.013ZM8.10522 1.50457C9.10957 0.917424 11.327 1.75526 13.667 3.8571C13.817 3.99168 13.967 4.13154 14.117 4.27668C13.1958 5.28532 12.3417 6.35464 11.5604 7.4776C10.2145 7.59982 8.87779 7.81005 7.5587 8.10696C7.48217 7.79734 7.41348 7.48508 7.35261 7.17017V7.17281C6.78783 4.25689 7.16217 2.05873 8.10522 1.50721V1.50457ZM6.63913 17.3944C6.3913 17.3223 6.14522 17.2444 5.90087 17.1608C4.62965 16.7563 3.44292 16.1185 2.4 15.2794C2.10155 15.0718 1.84836 14.8046 1.6561 14.4941C1.46383 14.1836 1.33656 13.8366 1.28217 13.4744C1.28217 12.37 2.91 10.9609 5.62565 10.0043C5.96739 9.88291 6.31174 9.77296 6.6587 9.67444C7.06165 10.9828 7.54967 12.2628 8.11957 13.506C7.54246 14.7674 7.04834 16.0659 6.64044 17.3931L6.63913 17.3944ZM13.5861 23.3054C12.6048 24.2159 11.4663 24.936 10.2274 25.4297C9.90105 25.5879 9.5461 25.6769 9.18447 25.6909C8.82283 25.705 8.46218 25.6439 8.12478 25.5115C7.17913 24.9573 6.78522 22.8278 7.3213 19.9699C7.38565 19.6313 7.4587 19.2952 7.54044 18.9619C8.87349 19.2512 10.2244 19.4487 11.5839 19.553C12.3715 20.682 13.2317 21.7574 14.1587 22.7724C13.9726 22.9544 13.7822 23.1317 13.5874 23.3041L13.5861 23.3054ZM15.0496 21.8382C14.4417 21.1759 13.8365 20.4423 13.2443 19.6532C13.8183 19.6761 14.4035 19.6875 15 19.6875C15.6113 19.6875 16.2148 19.6744 16.8104 19.648C16.2608 20.408 15.6731 21.139 15.0496 21.8382ZM22.8326 23.6419C22.805 24.0072 22.7036 24.3629 22.5346 24.6869C22.3657 25.011 22.1328 25.2966 21.8504 25.526C20.9048 26.0802 18.883 25.3597 16.7022 23.4624C16.4526 23.246 16.2013 23.0147 15.9483 22.7684C16.8575 21.7503 17.6976 20.6712 18.463 19.5385C19.8301 19.4218 21.1877 19.2102 22.5261 18.9051C22.587 19.1549 22.6409 19.3995 22.6878 19.6387C22.9781 20.9533 23.0268 22.3108 22.8313 23.6432L22.8326 23.6419ZM23.9204 17.1674C23.7548 17.2229 23.5865 17.2756 23.4143 17.3258C22.9951 16.0112 22.4878 14.7271 21.8961 13.4823C22.466 12.2544 22.954 10.9893 23.357 9.69555C23.6622 9.78395 23.9609 9.88027 24.2478 9.97923C27.0261 10.945 28.7191 12.3753 28.7191 13.4757C28.7191 14.65 26.8891 16.1726 23.9191 17.1674H23.9204Z\"\n              fill=\"#61DAFB\"\n            />\n            <path\n              d=\"M15 10.7652C15.53 10.7652 16.0481 10.9242 16.4887 11.2221C16.9293 11.52 17.2727 11.9434 17.4754 12.4388C17.6781 12.9341 17.731 13.4792 17.6275 14.0049C17.5239 14.5307 17.2684 15.0136 16.8935 15.3925C16.5186 15.7714 16.0409 16.0293 15.5211 16.1336C15.0012 16.2379 14.4624 16.1838 13.9729 15.9783C13.4834 15.7728 13.0652 15.425 12.7711 14.979C12.477 14.533 12.3204 14.0087 12.3209 13.4726C12.3219 12.7545 12.6046 12.0662 13.1069 11.5589C13.6093 11.0515 14.2901 10.7665 15 10.7665\"\n              fill=\"#61DAFB\"\n            />\n          </g>\n          <defs>\n            <clipPath id=\"clip0\">\n              <rect width=\"30\" height=\"27\" fill=\"white\" />\n            </clipPath>\n          </defs>\n        </svg>\n      }\n    >\n      React\n    </HighlightedTextIcon>\n    . Saya juga seorang mahasiswa di Universitas AMIKOM Yogyakarta.\n  </>\n);\n\nconst about: AboutSectionContentProps = {\n  text: <Text />,\n};\n\nexport default about;\n"
  },
  {
    "path": "src/localization/id/header.ts",
    "content": "import { HeaderTextProps } from 'components/organisms/Header/types';\n\nconst header: HeaderTextProps = {\n  headerText: {\n    greetings: 'Halo',\n    intro: 'Saya',\n    preTitle: '',\n  },\n};\n\nexport default header;\n"
  },
  {
    "path": "src/localization/id/index.ts",
    "content": "import header from 'localization/id/header';\nimport about from 'localization/id/about';\nimport sections from 'localization/id/sections';\nimport skills from 'localization/id/skills';\n\nexport { header, about, sections, skills };\n"
  },
  {
    "path": "src/localization/id/sections.ts",
    "content": "const section = {\n  about: 'Tentang saya',\n  projects: 'Proyek',\n  blogs: 'Blog',\n  skills: 'Kemampuan',\n  contact: 'Hubungi saya 🤙',\n};\n\nexport default section;\n"
  },
  {
    "path": "src/localization/id/skills.tsx",
    "content": "import React from 'react';\nimport { Icon } from '@iconify/react';\nimport phpIcon from '@iconify/icons-logos/php';\nimport javascriptIcon from '@iconify/icons-logos/javascript';\nimport { HighlightedTextIcon } from 'components/molecules';\n\nconst Text = () => (\n  <>\n    Saya sudah berpengalaman selama dua tahun mendalami{' '}\n    <span className=\"font-bold text-gray-800\">pengembangan website</span> menggunakan{' '}\n    <HighlightedTextIcon\n      as=\"a\"\n      href=\"https://php.net\"\n      className=\"mx-2\"\n      icon={<Icon icon={phpIcon} style={{ fontSize: '24px' }} />}\n    >\n      PHP\n    </HighlightedTextIcon>{' '}\n    dan{' '}\n    <HighlightedTextIcon\n      className=\"mx-2\"\n      icon={<Icon icon={javascriptIcon} style={{ fontSize: '24px' }} />}\n    >\n      Javascript\n    </HighlightedTextIcon>{' '}\n    hingga saya cukup percaya diri untuk membangun aplikasi menggunakan:\n  </>\n);\n\nconst skills = {\n  text: <Text />,\n};\n\nexport default skills;\n"
  },
  {
    "path": "src/pages/Home/index.tsx",
    "content": "import { Landing } from 'components/templates';\nimport LanguageContext from 'contexts/language';\nimport {\n  header as headerData,\n  projects as projectsData,\n  blogs as blogsData,\n  skills as skillsData,\n  contact as contactData\n} from 'data';\nimport {\n  sections as sectionsEn,\n  header as headerEn,\n  about as aboutEn,\n  skills as skillsEn,\n} from 'localization/en';\nimport {\n  sections as sectionsId,\n  header as headerId,\n  about as aboutId,\n  skills as skillsId,\n} from 'localization/id';\nimport React, { useContext } from 'react';\n\nexport default function Home() {\n  const languange = useContext(LanguageContext);\n\n  let locale;\n\n  if (languange.value === 'en') {\n    locale = {\n      sections: sectionsEn,\n      header: headerEn,\n      about: aboutEn,\n      skills: skillsEn,\n    };\n  } else {\n    locale = {\n      sections: sectionsId,\n      header: headerId,\n      about: aboutId,\n      skills: skillsId,\n    };\n  }\n\n  return (\n    <Landing\n      sections={locale.sections}\n      data={{\n        header: {\n          data: headerData,\n          text: locale.header,\n        },\n        about: {\n          text: locale.about.text,\n        },\n        projects: {\n          items: projectsData,\n        },\n        blogs: {\n          items: blogsData,\n        },\n        skills: {\n          text: locale.skills.text,\n          items: skillsData,\n        },\n        contact: contactData\n      }}\n      locale={{ value: languange.value, change: languange.change }}\n    />\n  );\n}\n"
  },
  {
    "path": "src/react-app-env.d.ts",
    "content": "/// <reference types=\"react-scripts\" />\n"
  },
  {
    "path": "src/reportWebVitals.ts",
    "content": "import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n  if (onPerfEntry && onPerfEntry instanceof Function) {\n    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n      getCLS(onPerfEntry);  \n      getFID(onPerfEntry);\n      getFCP(onPerfEntry);\n      getLCP(onPerfEntry);\n      getTTFB(onPerfEntry);\n    });\n  }\n}\n\nexport default reportWebVitals;\n"
  },
  {
    "path": "src/setupTests.ts",
    "content": "// jest-dom adds custom jest matchers for asserting on DOM nodes.\n// allows you to do things like:\n// expect(element).toHaveTextContent(/react/i)\n// learn more: https://github.com/testing-library/jest-dom\nimport '@testing-library/jest-dom';\n"
  },
  {
    "path": "tailwind.config.js",
    "content": "const colors = require('tailwindcss/colors');\nconst defaultTheme = require('tailwindcss/defaultTheme');\n\nmodule.exports = {\n  purge: ['./src/**/*.tsx', './public/**/*.html'],\n  darkMode: false, // or 'media' or 'class'\n  theme: {\n    colors: {\n      indigo: colors.indigo,\n      gray: colors.coolGray,\n      yellow: colors.yellow,\n      white: colors.white,\n      transparent: 'transparent',\n    },\n    fontFamily: {\n      sans: ['Inter var', ...defaultTheme.fontFamily.sans],\n    },\n    extend: {\n      spacing: {\n        'full-2': 'calc(100% + 0.5rem)',\n      },\n      lineHeight: {\n        'extra-loose': '2.5',\n      },\n      zIndex: {\n        '-10': '-10',\n      },\n      scale: {\n        '999': '99'\n      }\n    },\n  },\n  variants: {\n    extend: {\n      scale: ['focus-within'],\n      width: ['group-hover', 'group-focus'],\n      translate: ['group-hover'],\n    },\n  },\n  plugins: [],\n};\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react\",\n    \"baseUrl\": \"./src\"\n  },\n  \"include\": [\"src\"]\n}\n"
  }
]