diff --git a/.gitignore b/.gitignore index c87c9b3..d1b2b7f 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,8 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +.vscode + +# artifacts +analyze diff --git a/app/[slug]/page.tsx b/app/[slug]/page.tsx new file mode 100644 index 0000000..9e0f124 --- /dev/null +++ b/app/[slug]/page.tsx @@ -0,0 +1,27 @@ +import { LoadablePage } from '@/containers/LoadablePage' +import { prepareAnimatableContent } from '@/utils/prepareAnimatableContent' + +export default function Home() { + const content = ` +
+
+

About Me

+

Hi, my name is Mauro Colella. I am a senior software developer with over twenty years of activity in the IT industry. I develop tailored solutions for great companies that offer great products and services.

+

I specialize in web applications and full-stack development. From architecture through DevOps and data engineering, all the way to user and application interfaces, integrations, and complex visualizations. I am fluent with a broad range of technologies: + T-shaped with a passion. And I am certified for this with multiple providers and vendors including Google, Oracle and more.

+

I have been successfully freelancing my services for over ten years, with a strong focus on customer needs in both B2B and the general market.

+

I am European, I trained in Switzerland, and I reside in Asia.

+

When I am not in front of the computer, my interests range from being a dad to learning about art, design, motion graphics, architecture and much more.

+

For me, command of information technology is a means to empower people to share and access information. It is first and foremost a means to enable and facilitate intercommunication.

+

I‘d like to welcome you to my website. I hope you enjoy your visit, and I am looking forward to developing for you a platform that enables you to truly achieve and exceed every one of your professional targets and ambitions.

+

It sounds simple but this is what I do.

+

I make it simple. For you.

+
+
+ ` + + return +} diff --git a/app/head.tsx b/app/head.tsx new file mode 100644 index 0000000..b308914 --- /dev/null +++ b/app/head.tsx @@ -0,0 +1,10 @@ +export default function Head() { + return ( + <> + Create Next App + + + + + ) +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..9149c53 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,13 @@ +import type { AppProps } from 'next/app' + +// import 'node_modules/normalize.css/normalize.css' +import '../styles/globals.scss' +import { DefaultLayout } from '@/containers/DefaultLayout' + +export default function RootLayout({ children }: { + children: React.ReactNode; +}) { + return + {children} + +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..54ba648 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,32 @@ +import { LoadablePage } from '@/containers/LoadablePage' +import { prepareAnimatableContent } from '@/utils/prepareAnimatableContent' + +export default function Home() { + const content = ` +
+
+

Lorem Ipsum Daily

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut sed orci ut justo rutrum sodales vitae a leo. Mauris nisl velit, fermentum et sapien vel, semper pharetra nulla. Ut vulputate, turpis at interdum pulvinar, libero dolor euismod nisi, at finibus odio ante ut lacus. Sed vulputate magna sed velit pulvinar, fringilla eleifend lacus hendrerit. Proin lacinia lorem nec dolor sagittis, vitae ultrices erat accumsan. Curabitur sapien dui, interdum ac imperdiet vitae, vehicula eu nisi. Vestibulum et sapien eros. Duis ex odio, molestie at lorem at, accumsan rutrum sem. In in purus in nibh gravida porta. Donec ultricies, nulla a auctor aliquam, velit purus interdum odio, quis ullamcorper ex diam sed nisi. +

+

+ Vestibulum sodales justo ac enim posuere, quis volutpat massa dapibus. Curabitur eget enim ac metus feugiat condimentum. Integer vestibulum elit ut erat luctus, at scelerisque elit aliquet. Nunc pellentesque, metus vel auctor volutpat, nulla sapien efficitur nulla, quis viverra ligula turpis nec purus. Fusce augue nisi, blandit non diam sit amet, laoreet placerat neque. Aliquam elementum suscipit nunc sit amet scelerisque. Suspendisse porta diam libero, et egestas magna tempus eget. Quisque eu fringilla est. Pellentesque ex nisi, aliquet eget tellus sed, congue vulputate mauris. Praesent in finibus ante, nec aliquam libero. Fusce quis est tempus, efficitur neque et, ullamcorper arcu. Morbi nec viverra lacus. Aliquam ut eros a nisi sagittis varius quis nec sapien. In porttitor ornare mattis. Cras vitae mi nibh. Sed id risus euismod, ornare orci non, ultrices tellus. +

+

+ Aliquam scelerisque, elit et imperdiet accumsan, lacus nisi ullamcorper turpis, vitae consectetur neque massa in ante. Pellentesque auctor vehicula elit, vel sagittis magna ullamcorper vitae. Nulla molestie tortor nec cursus cursus. Morbi porta gravida pretium. Donec est lectus, faucibus nec dictum vitae, dictum non ante. Ut ac dolor auctor, aliquet metus laoreet, cursus orci. Etiam ac facilisis orci, in consectetur lacus. Quisque vehicula facilisis aliquam. Donec tincidunt nunc quis justo gravida, ut commodo nisi eleifend. Etiam non porttitor lectus. Curabitur faucibus arcu in ex malesuada tincidunt. Cras lobortis at magna nec aliquam. Pellentesque et tortor at metus egestas finibus. Vestibulum maximus mollis lacus eu malesuada. In non tortor sem. +

+

+ Maecenas nec tellus vestibulum, gravida orci porta, pellentesque neque. Mauris tempus eros at ligula congue fermentum. Morbi sed purus felis. Suspendisse eu venenatis massa, tempor rutrum nunc. Nam venenatis cursus finibus. Nulla sit amet posuere elit. Proin bibendum quam libero, non porttitor lectus lobortis et. +

+

+ Mauris vitae est nisi. Donec quis turpis ullamcorper, aliquet nisi nec, tincidunt lacus. Morbi aliquet efficitur lectus, quis posuere mi tristique sit amet. Mauris vulputate est augue, in vulputate elit vulputate vitae. Curabitur eleifend augue ac blandit mattis. In faucibus porta scelerisque. Praesent condimentum sapien leo, nec porttitor odio luctus at. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer quis mattis dolor. Quisque sed dolor ut leo pretium fermentum. Pellentesque iaculis mollis venenatis. Aliquam quis neque ultrices, feugiat mauris id, pulvinar nibh. Nunc interdum, massa in iaculis venenatis, risus augue iaculis arcu, non gravida nisl ante quis nibh. In sit amet massa vitae turpis egestas tempus eu eu sapien. Phasellus varius faucibus quam vel dictum. +

+
+
+ ` + + return +} diff --git a/lib/components/Logo.tsx b/lib/components/Logo.tsx index 5185ac8..c0e3dab 100644 --- a/lib/components/Logo.tsx +++ b/lib/components/Logo.tsx @@ -1,20 +1,62 @@ -export const Logo: React.FC<{ styles?: Record}> = ({ styles }) => ( - - +import { motion } from 'framer-motion' + +const draw = { + hidden: { pathLength: 0, stroke: 'rgb(255, 255, 255, 1)' }, + visible: (i: number) => { + return { + pathLength: 1, + stroke: 'rgb(0, 0, 0, 0)', + transition: { + pathLength: { type: 'spring', duration: 3, bounce: 0, ease: 'easeIn' }, + stroke: { delay: 1.5, duration: 1 }, + } + } + } +} + +const drawGradient = { + hidden: { stopOpacity: 0 }, + visible: (i: number) => { + return { + stopOpacity: 1, + transition: { + stopOpacity: { delay: 1.5, duration: 1 } + } + } + } +} + +export const Logo: React.FC<{ className?: string }> = ({ className }) => ( + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - + ) diff --git a/lib/components/Navigation.tsx b/lib/components/Navigation.tsx new file mode 100644 index 0000000..b614410 --- /dev/null +++ b/lib/components/Navigation.tsx @@ -0,0 +1,48 @@ +import { useState } from 'react' +import { motion } from 'framer-motion' +import Link from 'next/link' +import styles from '../../styles/Navigation.module.scss' + +export const Navigation: React.FC = () => { + const [selected, setSelected] = useState(0) + + return +} diff --git a/lib/containers/DefaultLayout.tsx b/lib/containers/DefaultLayout.tsx new file mode 100644 index 0000000..94e8638 --- /dev/null +++ b/lib/containers/DefaultLayout.tsx @@ -0,0 +1,18 @@ +import React from 'react' +import styles from '../../styles/PageLayout.module.scss' + +import { PT_Sans } from '@next/font/google' +import { TransitionLayout } from './TransitionLayout' +const ptSans = PT_Sans({ subsets: ['latin'], weight: ['400', '700'] }) + +export const DefaultLayout: React.FC = ({ children }) => { + return ( + + + + {children} + + + + ) +} diff --git a/lib/containers/LoadablePage.tsx b/lib/containers/LoadablePage.tsx new file mode 100644 index 0000000..89e7d3c --- /dev/null +++ b/lib/containers/LoadablePage.tsx @@ -0,0 +1,48 @@ +'use client' + +import { motion } from 'framer-motion' +import { prepareAnimatableContent } from 'lib/utils/prepareAnimatableContent' +import asReact, { HTMLReactParserOptions, Element, domToReact } from 'html-react-parser' +import { useState } from 'react' + +const variants = { + visible: { color: '#222' }, + hidden: { color: '#fff' }, +} + +const parserOptions: HTMLReactParserOptions = { + replace: domNode => { + if (domNode instanceof Element && domNode.attribs.class === 'character-animatable') { + + return + {domToReact(domNode.children)} + + } + } +} + +type LoadablePageProps = { + rawContent: string, + wrappedContent?: string, +} + +export const LoadablePage: React.FC = ({ rawContent, wrappedContent }) => { + const [animationComplete, setAnimationComplete] = useState(false) + + return <>{wrappedContent && !animationComplete ? + { setAnimationComplete(true) }}> + {asReact(wrappedContent, parserOptions)} + : +
} +} diff --git a/lib/containers/TransitionLayout.tsx b/lib/containers/TransitionLayout.tsx new file mode 100644 index 0000000..4de9a72 --- /dev/null +++ b/lib/containers/TransitionLayout.tsx @@ -0,0 +1,52 @@ +'use client' + +import React from 'react' +import { AnimatePresence, motion } from 'framer-motion' +import Link from 'next/link' +import { v4 as uuidv4 } from 'uuid' + +import styles from '../../styles/PageLayout.module.scss' +import { Logo } from '@/components/Logo' +import { Navigation } from '@/components/Navigation' + +export const TransitionLayout: React.FC = ({ children }) => { + return +
+ +
+ +
+
+ + + +
+ {children} +
+ + +
+} diff --git a/lib/utils/prepareAnimatableContent.tsx b/lib/utils/prepareAnimatableContent.tsx new file mode 100644 index 0000000..dcc241b --- /dev/null +++ b/lib/utils/prepareAnimatableContent.tsx @@ -0,0 +1,24 @@ +import * as cheerio from 'cheerio/lib/slim' + +export const prepareAnimatableContent = (input: string): string => { + const $ = cheerio.load(input, null, false) + + $.root() + .find('*') + .contents() + .filter(function () { + return this.nodeType === 3 + }) + .each(function() { + let output = '' + for(let character of $(this).text().split('')) { + output += character !== ' ' ? `${character}` : character + } + + $(this).replaceWith($(output)) + }) + + return $.root().html() as string +} + + diff --git a/next.config.js b/next.config.js index a843cbe..4042728 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,13 @@ +const withBundleAnalyzer = require('@next/bundle-analyzer')({ + enabled: process.env.ANALYZE === 'true', +}) + /** @type {import('next').NextConfig} */ const nextConfig = { - reactStrictMode: true, + experimental: { + appDir: true, + }, + reactStrictMode: false, } -module.exports = nextConfig +module.exports = withBundleAnalyzer(nextConfig) diff --git a/package.json b/package.json index d62b232..630bbbd 100644 --- a/package.json +++ b/package.json @@ -10,17 +10,25 @@ }, "dependencies": { "@next/font": "13.0.7", - "@types/node": "18.11.17", - "@types/react": "18.0.26", - "@types/react-dom": "18.0.9", + "cheerio": "1.0.0-rc.12", "eslint": "8.30.0", "eslint-config-next": "13.0.7", + "framer-motion": "^8.0.2", + "html-react-parser": "^3.0.4", "next": "13.0.7", "normalize.css": "^8.0.1", "react": "18.2.0", "react-dom": "18.2.0", "sass": "^1.57.1", - "typescript": "4.9.4" + "typescript": "4.9.4", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@next/bundle-analyzer": "^13.1.0", + "@types/node": "18.11.17", + "@types/react": "18.0.26", + "@types/react-dom": "18.0.9", + "@types/uuid": "^9.0.0" }, "packageManager": "^pnpm@7.18.2" } diff --git a/pages/_app.tsx b/pages/_app.tsx deleted file mode 100644 index 6efc3e2..0000000 --- a/pages/_app.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import 'node_modules/normalize.css/normalize.css' -import '../styles/globals.scss' -import type { AppProps } from 'next/app' -import { PT_Sans } from '@next/font/google' -const ptSans = PT_Sans({ subsets: ['latin'], weight: ['400', '700'] }) - -export default function App({ Component, pageProps }: AppProps) { - return <> - - - -} diff --git a/pages/_document.tsx b/pages/_document.tsx deleted file mode 100644 index 54e8bf3..0000000 --- a/pages/_document.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Html, Head, Main, NextScript } from 'next/document' - -export default function Document() { - return ( - - - -
- - - - ) -} diff --git a/pages/api/hello.ts b/pages/api/index.ts similarity index 75% rename from pages/api/hello.ts rename to pages/api/index.ts index f8bcc7e..f23abf5 100644 --- a/pages/api/hello.ts +++ b/pages/api/index.ts @@ -1,13 +1,11 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction import type { NextApiRequest, NextApiResponse } from 'next' -type Data = { - name: string -} +type Data = '' export default function handler( req: NextApiRequest, res: NextApiResponse ) { - res.status(200).json({ name: 'John Doe' }) + res.status(404).send('') } diff --git a/pages/index.tsx b/pages/index.tsx deleted file mode 100644 index 95e3200..0000000 --- a/pages/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import Head from 'next/head' -import Image from 'next/image' -import { Logo } from '../lib/components/Logo' -import styles from '../styles/Home.module.scss' - -export default function Home() { - return ( - <> - - Create Next App - - - - -
-

About Me

-

About Me

-

About Me

-

About Me

-
About Me
-
About Me
-
-
-

- -

-

Mauro Colella

-

About Me

-

Hi, my name is Mauro Colella. I am a senior software developer with over twenty years of activity in the IT industry. I develop tailored solutions for great companies that offer great services and products.

-

I specialize in web applications and full-stack development. From architecture through DevOps and data engineering, all the way to user and application interfaces, integrations, and complex visualizations. I am fluent with a broad range of technologies: - T-shaped with a passion. And I am certified for this with multiple providers and vendors including Google, Oracle and more.

-

I have been successfully freelancing my services for over ten years, with a strong focus on customer needs in both B2B and the general market.

-

I am European, I trained in Switzerland, and I reside in Asia.

-

When I am not in front of the computer, my interests range from being a dad to learning about art, design, motion graphics, architecture and much more.

-

For me, command of information technology is a means to empower people to share and access information. It is first and foremost a means to enable and facilitate intercommunication.

-

I‘d like to welcome you to my website. I hope you enjoy your visit, and I am looking forward to developing for you a platform that enables you to truly achieve and exceed every one of your professional targets and ambitions.

-

It sounds simple but this is what I do.

-

I make it simple. For you.

-
-
- - ) -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f4ea5f6..22fa12c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,50 +1,77 @@ lockfileVersion: 5.4 specifiers: + '@next/bundle-analyzer': ^13.1.0 '@next/font': 13.0.7 '@types/node': 18.11.17 '@types/react': 18.0.26 '@types/react-dom': 18.0.9 + '@types/uuid': ^9.0.0 + cheerio: 1.0.0-rc.12 eslint: 8.30.0 eslint-config-next: 13.0.7 + framer-motion: ^8.0.2 + html-react-parser: ^3.0.4 next: 13.0.7 normalize.css: ^8.0.1 react: 18.2.0 react-dom: 18.2.0 sass: ^1.57.1 typescript: 4.9.4 + uuid: ^9.0.0 dependencies: '@next/font': 13.0.7 - '@types/node': 18.11.17 - '@types/react': 18.0.26 - '@types/react-dom': 18.0.9 + cheerio: 1.0.0-rc.12 eslint: 8.30.0 eslint-config-next: 13.0.7_lzzuuodtsqwxnvqeq4g4likcqa + framer-motion: 8.0.2_biqbaboplfbrettd7655fr4n2y + html-react-parser: 3.0.6_react@18.2.0 next: 13.0.7_3duxcpitbtplz62feflag7fwby normalize.css: 8.0.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 sass: 1.57.1 typescript: 4.9.4 + uuid: 9.0.0 + +devDependencies: + '@next/bundle-analyzer': 13.1.1 + '@types/node': 18.11.17 + '@types/react': 18.0.26 + '@types/react-dom': 18.0.9 + '@types/uuid': 9.0.0 packages: - /@babel/runtime-corejs3/7.20.6: - resolution: {integrity: sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==} + /@babel/runtime-corejs3/7.20.7: + resolution: {integrity: sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.26.1 + core-js-pure: 3.27.0 regenerator-runtime: 0.13.11 dev: false - /@babel/runtime/7.20.6: - resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==} + /@babel/runtime/7.20.7: + resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: false + /@emotion/is-prop-valid/0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false + optional: true + + /@emotion/memoize/0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + dev: false + optional: true + /@eslint/eslintrc/1.4.0: resolution: {integrity: sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -82,6 +109,62 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: false + /@motionone/animation/10.15.1: + resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} + dependencies: + '@motionone/easing': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.4.0 + dev: false + + /@motionone/dom/10.15.3: + resolution: {integrity: sha512-FQ7a2zMBXc1UeU8CG9G3yDpst55fbb0+C9A0VGfwOITitBCzigKZnXRgsRSWWR+FW57GSc13eGQxtYB0lKG0Ng==} + dependencies: + '@motionone/animation': 10.15.1 + '@motionone/generators': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.4.0 + dev: false + + /@motionone/easing/10.15.1: + resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} + dependencies: + '@motionone/utils': 10.15.1 + tslib: 2.4.0 + dev: false + + /@motionone/generators/10.15.1: + resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} + dependencies: + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.4.0 + dev: false + + /@motionone/types/10.15.1: + resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} + dev: false + + /@motionone/utils/10.15.1: + resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==} + dependencies: + '@motionone/types': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.4.0 + dev: false + + /@next/bundle-analyzer/13.1.1: + resolution: {integrity: sha512-zxC/MOj7gDjvQffHT4QZqcPe1Ny+e6o3wethCZn3liSElMA+kxgEopbziTUXdrvJcd/porq+3Itc8P+gxE/xog==} + dependencies: + webpack-bundle-analyzer: 4.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + /@next/env/13.0.7: resolution: {integrity: sha512-ZBclBRB7DbkSswXgbJ+muF5RxfgmAuQKAWL8tcm86aZmoiL1ZainxQK0hMcMYdh+IYG8UObAKV2wKB5O+6P4ng==} dev: false @@ -246,6 +329,10 @@ packages: tslib: 2.4.1 dev: false + /@polka/url/1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: true + /@rushstack/eslint-patch/1.2.0: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} dev: false @@ -262,17 +349,17 @@ packages: /@types/node/18.11.17: resolution: {integrity: sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==} - dev: false + dev: true /@types/prop-types/15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - dev: false + dev: true /@types/react-dom/18.0.9: resolution: {integrity: sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==} dependencies: '@types/react': 18.0.26 - dev: false + dev: true /@types/react/18.0.26: resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==} @@ -280,11 +367,15 @@ packages: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 csstype: 3.1.1 - dev: false + dev: true /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - dev: false + dev: true + + /@types/uuid/9.0.0: + resolution: {integrity: sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==} + dev: true /@typescript-eslint/parser/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: resolution: {integrity: sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==} @@ -356,11 +447,15 @@ packages: acorn: 8.8.1 dev: false + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn/8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} hasBin: true - dev: false /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -381,7 +476,6 @@ packages: engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: false /anymatch/3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -399,8 +493,8 @@ packages: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} engines: {node: '>=6.0'} dependencies: - '@babel/runtime': 7.20.6 - '@babel/runtime-corejs3': 7.20.6 + '@babel/runtime': 7.20.7 + '@babel/runtime-corejs3': 7.20.7 dev: false /array-includes/3.1.6: @@ -471,6 +565,10 @@ packages: engines: {node: '>=8'} dev: false + /boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -497,8 +595,8 @@ packages: engines: {node: '>=6'} dev: false - /caniuse-lite/1.0.30001439: - resolution: {integrity: sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==} + /caniuse-lite/1.0.30001441: + resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==} dev: false /chalk/4.1.2: @@ -507,6 +605,29 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + + /cheerio-select/2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + dev: false + + /cheerio/1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.0.1 + htmlparser2: 8.0.1 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 dev: false /chokidar/3.5.3: @@ -533,18 +654,21 @@ packages: engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: false /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false + + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: false - /core-js-pure/3.26.1: - resolution: {integrity: sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==} + /core-js-pure/3.27.0: + resolution: {integrity: sha512-fJml7FM6v1HI3Gkg5/Ifc/7Y2qXcJxaDwSROeZGAZfNykSTvUk94WT55TYzJ2lFHK0voSr/d4nOVChLuNCWNpA==} requiresBuild: true dev: false @@ -557,9 +681,24 @@ packages: which: 2.0.2 dev: false + /css-select/5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.0.1 + nth-check: 2.1.1 + dev: false + + /css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + /csstype/3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - dev: false + dev: true /damerau-levenshtein/1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -637,6 +776,37 @@ packages: esutils: 2.0.3 dev: false + /dom-serializer/2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 + dev: false + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler/5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils/3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + + /duplexer/0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + /emoji-regex/9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: false @@ -649,6 +819,11 @@ packages: tapable: 2.2.1 dev: false + /entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + dev: false + /es-abstract/1.20.5: resolution: {integrity: sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==} engines: {node: '>= 0.4'} @@ -821,7 +996,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.20.6 + '@babel/runtime': 7.20.7 aria-query: 4.2.2 array-includes: 3.1.6 ast-types-flow: 0.0.7 @@ -1042,6 +1217,21 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: false + /framer-motion/8.0.2_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-xuIiQchVh/cLqUzzu5/8ok4o0nkwYPyIRtkDl8wDvrQUNRhSfRaZu1MMdzN0TjpBtG66oP03PSLO7Qtu1YqPrA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@motionone/dom': 10.15.3 + hey-listen: 1.0.8 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.0 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: false @@ -1180,6 +1370,13 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: false + /gzip-size/6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + /has-bigints/1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: false @@ -1187,7 +1384,6 @@ packages: /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: false /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} @@ -1214,13 +1410,45 @@ packages: function-bind: 1.1.1 dev: false + /hey-listen/1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + dev: false + + /html-dom-parser/3.1.2: + resolution: {integrity: sha512-mLTtl3pVn3HnqZSZzW3xVs/mJAKrG1yIw3wlp+9bdoZHHLaBRvELdpfShiPVLyjPypq1Fugv2KMDoGHW4lVXnw==} + dependencies: + domhandler: 5.0.3 + htmlparser2: 8.0.1 + dev: false + + /html-react-parser/3.0.6_react@18.2.0: + resolution: {integrity: sha512-kFh/qJkz4KJudCcILfI1hQKXTheRyMREXuL/WbWYUAsMsu0EOwV4nO5jA3ecu1LUNpCcebkNcBECxqpswBDlLw==} + peerDependencies: + react: 0.14 || 15 || 16 || 17 || 18 + dependencies: + domhandler: 5.0.3 + html-dom-parser: 3.1.2 + react: 18.2.0 + react-property: 2.0.0 + style-to-js: 1.1.2 + dev: false + + /htmlparser2/8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + entities: 4.4.0 + dev: false + /ignore/5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: false - /immutable/4.1.0: - resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} + /immutable/4.2.1: + resolution: {integrity: sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ==} dev: false /import-fresh/3.3.0: @@ -1247,6 +1475,10 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false + /inline-style-parser/0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + /internal-slot/1.0.4: resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} engines: {node: '>= 0.4'} @@ -1447,6 +1679,10 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: false + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + /loose-envify/1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -1484,6 +1720,11 @@ packages: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} dev: false + /mrmime/1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: false @@ -1526,7 +1767,7 @@ packages: dependencies: '@next/env': 13.0.7 '@swc/helpers': 0.4.14 - caniuse-lite: 1.0.30001439 + caniuse-lite: 1.0.30001441 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -1560,6 +1801,12 @@ packages: resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} dev: false + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1633,6 +1880,11 @@ packages: is-wsl: 2.2.0 dev: false + /opener/1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -1666,6 +1918,19 @@ packages: callsites: 3.1.0 dev: false + /parse5-htmlparser2-tree-adapter/7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + dev: false + + /parse5/7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.4.0 + dev: false + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1744,6 +2009,10 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false + /react-property/2.0.0: + resolution: {integrity: sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==} + dev: false + /react/18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -1831,7 +2100,7 @@ packages: hasBin: true dependencies: chokidar: 3.5.3 - immutable: 4.1.0 + immutable: 4.2.1 source-map-js: 1.0.2 dev: false @@ -1874,6 +2143,15 @@ packages: object-inspect: 1.12.2 dev: false + /sirv/1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.21 + mrmime: 1.0.1 + totalist: 1.1.0 + dev: true + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -1935,6 +2213,18 @@ packages: engines: {node: '>=8'} dev: false + /style-to-js/1.1.2: + resolution: {integrity: sha512-aMG8jJpEF0SCGbQFY8W8CT+EjQ9ubp35FOZG3prWkNjxW/a1bEeSod0tkWiP+6iiOCDIIrQykUDkPY5LbNF87g==} + dependencies: + style-to-object: 0.4.0 + dev: false + + /style-to-object/0.4.0: + resolution: {integrity: sha512-dAjq2m87tPn/TcYTeqMhXJRhu96WYWcxMFQxs3Y9jfYpq2jG+38u4tj0Lst6DOiYXmDuNxVJ2b1Z2uPC6wTEeg==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + /styled-jsx/5.1.0_react@18.2.0: resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==} engines: {node: '>= 12.0.0'} @@ -1957,7 +2247,6 @@ packages: engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - dev: false /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -1995,6 +2284,11 @@ packages: is-number: 7.0.0 dev: false + /totalist/1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + dev: true + /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -2008,6 +2302,10 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: false + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: false + /tslib/2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: false @@ -2055,6 +2353,30 @@ packages: punycode: 2.1.1 dev: false + /uuid/9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: false + + /webpack-bundle-analyzer/4.7.0: + resolution: {integrity: sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + acorn: 8.8.1 + acorn-walk: 8.2.0 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -2082,6 +2404,19 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: false + /ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: false diff --git a/styles/Home.module.scss b/styles/Home.module.scss deleted file mode 100644 index c10a6ec..0000000 --- a/styles/Home.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -.main { - margin: auto; - max-width: 1200px; - padding: 1rem; - overflow: hidden; -} diff --git a/styles/Navigation.module.scss b/styles/Navigation.module.scss new file mode 100644 index 0000000..e60962c --- /dev/null +++ b/styles/Navigation.module.scss @@ -0,0 +1,53 @@ +@import 'media'; + +.nav { + background-color: #fff; + border-bottom: 1px solid #ddd; + box-shadow: 0px 0px 24px 0px rgb(127 127 127 / 5%); + height: 3.25rem; + width: 100%; + + &__menu { + align-items: center; + display: flex; + flex-direction: row; + height: 100%; + list-style-type: none; + margin: auto; + padding: 0; + + @include md { + justify-content: flex-end; + } + } + + &__cell { + height: 100%; + min-width: 20%; + position: relative; + + &-selected { + a { + color: #0099cc; + } + } + } + + &__link { + align-items: center; + display: flex; + flex-direction: column; + font-weight: 700; + height: 100%; + justify-content: center; + text-decoration: none; + } + + &__underline { + background-color: #0099cc; + bottom: -1px; + height: 4px; + position: absolute; + width: 100%; + } +} diff --git a/styles/PageLayout.module.scss b/styles/PageLayout.module.scss new file mode 100644 index 0000000..901d7c1 --- /dev/null +++ b/styles/PageLayout.module.scss @@ -0,0 +1,85 @@ +@import 'media'; + +.body { + background-color: #fff; + color: #111; + overflow-x: hidden; + position: relative; +} + +.header { + align-items: flex-end; + display: flex; + height: calc(38.2vh - 3.25rem); + overflow: hidden; + position: relative; + top: 0; + width: 100%; + z-index: 2; +} + +.header__banner { + background-color: #111; + height: 100%; + width: 100%; + z-index: 1; +} + +.logo_wrapper { + display: flex; + position: absolute; + z-index: 2; +} + +.logo { + fill: #fff; + height: 100%; + width: 100vw; +} + +.nav_wrapper { + position: absolute; + width: 100%; + z-index: 3; +} + +.main { + margin-right: auto; + max-width: 1200px; + overflow: hidden; + padding: 1rem; + padding-bottom: calc(38.2vh + 2rem); + padding-top: calc(3.25rem + 2rem); + + @include lg { + width: 61.80%; + } +} + +.aside { + background: #111; + display: flex; + height: 100%; + opacity: 0; + position: absolute; + right: 0; + bottom: 0; + transform: translate3d(0, 0, 0); + transition: ease-in 0.4s opacity; + width: 38.2%; + z-index: 1; + + @include lg { + opacity: 1; + } +} + +.footer { + background-color: #fff; + border-top: 1px solid #ddd; + bottom: 0; + height: 38.2vh; + position: absolute; + z-index: 3; + width: 100%; +} diff --git a/styles/globals.scss b/styles/globals.scss index fcd0e98..ff0c955 100644 --- a/styles/globals.scss +++ b/styles/globals.scss @@ -1,12 +1,12 @@ $baseFontSize: 16; -@import 'fluid-type'; +@import 'normalize.css/normalize'; @import 'typebase'; +@import 'fluid-type'; html { @include fluid-type(font-size, 800px, 1200px, 16px, 22px); } - article, div, header, @@ -15,3 +15,20 @@ main, section { box-sizing: border-box; } + +h2 { + color: #222; +} + +a { + color: #333; + transition: 0.3s color ease; + + &:hover { + color:#0099cc; + } + + &:active { + color: #00aadd; + } +} diff --git a/styles/media.scss b/styles/media.scss new file mode 100644 index 0000000..81c4339 --- /dev/null +++ b/styles/media.scss @@ -0,0 +1,39 @@ +// Small tablets and large smartphones (landscape view) +$screen-sm-min: 576px; + +// Small tablets (portrait view) +$screen-md-min: 768px; + +// Tablets and small desktops +$screen-lg-min: 992px; + +// Large tablets and desktops +$screen-xl-min: 1200px; + +// Small devices +@mixin sm { + @media (min-width: #{$screen-sm-min}) { + @content; + } +} + +// Medium devices +@mixin md { + @media (min-width: #{$screen-md-min}) { + @content; + } +} + +// Large devices +@mixin lg { + @media (min-width: #{$screen-lg-min}) { + @content; + } +} + +// Extra large devices +@mixin xl { + @media (min-width: #{$screen-xl-min}) { + @content; + } +} diff --git a/tsconfig.json b/tsconfig.json index 99710e8..18f7814 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -13,8 +17,32 @@ "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", - "incremental": true + "incremental": true, + "baseUrl": ".", + "paths": { + "@/containers/*": [ + "lib/containers/*" + ], + "@/components/*": [ + "lib/components/*" + ], + "@/utils/*": [ + "lib/utils/*" + ] + }, + "plugins": [ + { + "name": "next" + } + ] }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] }