Prettier and a new readme

This commit is contained in:
skidoodle 2022-08-26 21:27:32 +02:00
parent 146b35d1d3
commit f21d8f8086
16 changed files with 352 additions and 2594 deletions

View file

@ -1,2 +1,29 @@
# albert.lol # Portfolio v3
Built with Next.js ♥
An awesome portfolio built with [Next.js](https://nextjs.org/) and [Tailwind CSS](https://tailwindcss.com/)
## Installation
Clone the repository
```
git clone https://github.com/skidoodle/albert.lol
```
Install the dependencies with [yarn](https://yarnpkg.com/)
```
yarn
```
## Usage
```
yarn dev
```
Go to `localhost:3000` :)
## License
[MIT](https://choosealicense.com/licenses/mit/)

View file

@ -1,32 +1,43 @@
import Link from 'next/link' import Link from "next/link";
import toast from 'react-hot-toast' import toast from "react-hot-toast";
import copy from 'copy-to-clipboard' import copy from "copy-to-clipboard";
type Icon = { type Icon = {
children: any, children: any;
reference: string, reference: string;
copyValue?: boolean, copyValue?: boolean;
} };
const notify = () => { const notify = () => {
toast.remove(), toast.remove(),
toast.success('Copied to clipboard', { toast.success("Copied to clipboard", {
style: { style: {
background: '#0f1012', background: "#0f1012",
color: '#fff', color: "#fff",
fontSize: '1em' fontSize: "1em",
} },
} });
)} };
export const Icon = ({ children, reference, copyValue }: Icon) => { export const Icon = ({ children, reference, copyValue }: Icon) => {
if(copyValue) { if (copyValue) {
return <a className={`cursor-pointer`} onClick={ () => { notify(), copy(reference) }} >{ children }</a>
}
return ( return (
<Link href={ reference }> <a
<a target='_blank' className={`cursor-pointer`}>{ children }</a> className={`cursor-pointer`}
</Link> onClick={() => {
) notify(), copy(reference);
} }}
>
{children}
</a>
);
}
return (
<Link href={reference}>
<a target="_blank" className={`cursor-pointer`}>
{children}
</a>
</Link>
);
};

View file

@ -1,39 +1,45 @@
import { IconType } from 'react-icons/lib' import { IconType } from "react-icons/lib";
import { FaDiscord, FaEnvelope, FaGithub, FaInstagram, FaSteam } from 'react-icons/fa' import {
FaDiscord,
FaEnvelope,
FaGithub,
FaInstagram,
FaSteam,
} from "react-icons/fa";
type Socials = { type Socials = {
id: number, id: number;
ref: string ref: string;
icon: IconType, icon: IconType;
copyValue?: boolean, copyValue?: boolean;
} };
export const socials: Array<Socials> = [ export const socials: Array<Socials> = [
{ {
id: 1, id: 1,
ref: 'https://github.com/skidoodle', ref: "https://github.com/skidoodle",
icon: FaGithub, icon: FaGithub,
}, },
{ {
id: 2, id: 2,
ref: 'https://steamcommunity.com/id/_albert', ref: "https://steamcommunity.com/id/_albert",
icon: FaSteam, icon: FaSteam,
}, },
{ {
id: 3, id: 3,
ref: 'contact@albert.lol', ref: "contact@albert.lol",
icon: FaEnvelope, icon: FaEnvelope,
copyValue: true, copyValue: true,
}, },
{ {
id: 4, id: 4,
ref: 'https://www.instagram.com/albertadam_/', ref: "https://www.instagram.com/albertadam_/",
icon: FaInstagram, icon: FaInstagram,
}, },
{ {
id: 5, id: 5,
ref: 'albert#8838', ref: "albert#8838",
icon: FaDiscord, icon: FaDiscord,
copyValue: true, copyValue: true,
} },
] ];

View file

@ -1,7 +1,7 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
reactStrictMode: true, reactStrictMode: true,
swcMinify: true swcMinify: true,
} };
module.exports = nextConfig module.exports = nextConfig;

2308
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"name": "portfolio", "name": "portfolio",
"version": "2.0", "version": "3.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",

View file

@ -1,15 +1,15 @@
import 'styles/globals.scss' import "styles/globals.scss";
import Head from 'next/head' import Head from "next/head";
import { AppProps } from 'next/app' import { AppProps } from "next/app";
export default function({ Component, pageProps }: AppProps) { export default function ({ Component, pageProps }: AppProps) {
return ( return (
<> <>
<Head> <Head>
<title>albert</title> <title>albert</title>
</Head> </Head>
<Component {...pageProps} /> <Component {...pageProps} />
</> </>
) );
} }

View file

@ -1,25 +1,25 @@
import Document, { Html, Head, Main, NextScript } from 'next/document' import Document, { Html, Head, Main, NextScript } from "next/document";
class AppDocument extends Document { class AppDocument extends Document {
render() { render() {
return ( return (
<Html lang='en'> <Html lang="en">
<Head> <Head>
<link rel='preconnect' href='https://vitals.vercel-insights.com' /> <link rel="preconnect" href="https://vitals.vercel-insights.com" />
<meta name='title' content='albert' /> <meta name="title" content="albert" />
<meta name='og:title' content='albert' /> <meta name="og:title" content="albert" />
<meta name='description' content='system administrator' /> <meta name="description" content="system administrator" />
<meta name='og:description' content='system administrator' /> <meta name="og:description" content="system administrator" />
<meta name='theme-color' content='#000000' /> <meta name="theme-color" content="#000000" />
<meta property='og:image' content='/favicon.ico' /> <meta property="og:image" content="/favicon.ico" />
</Head> </Head>
<body> <body>
<Main /> <Main />
<NextScript /> <NextScript />
</body> </body>
</Html> </Html>
) );
} }
} }
export default AppDocument export default AppDocument;

View file

@ -1,41 +1,43 @@
import { GetServerSideProps } from 'next' import { GetServerSideProps } from "next";
import FadeIn from 'react-fade-in' import FadeIn from "react-fade-in";
type ErrorPage = { type ErrorPage = {
statusCode: number, statusCode: number;
message: string message: string;
};
export default function ({ statusCode, message }: ErrorPage) {
return (
<FadeIn>
<div className="flex flex-col justify-center items-center h-[90vh]">
<div>
<h1 className="font-semibold text-2xl inline-block mr-[1.7rem] pr-[1.5rem] border-r-[1px] border-white">
{statusCode}
</h1>
<div className="inline-block text-left">
<h2 className="text-lg font-extralight">{message}</h2>
</div>
</div>
</div>
</FadeIn>
);
} }
export default function({ statusCode, message }: ErrorPage) { export const getServerSideProps: GetServerSideProps = async (props) => {
return ( const { res, err }: any = props;
<FadeIn>
<div className='flex flex-col justify-center items-center h-[90vh]'>
<div>
<h1 className='font-semibold text-2xl inline-block mr-[1.7rem] pr-[1.5rem] border-r-[1px] border-white'>{ statusCode }</h1>
<div className='inline-block text-left'>
<h2 className='text-lg font-extralight'>{ message }</h2>
</div>
</div>
</div>
</FadeIn>
)
}
export const getServerSideProps: GetServerSideProps = async(props) => { const statusCode = res ? res.statusCode : err ? err.statusCode : 404;
const { res, err }: any = props
const statusCode = res ? res.statusCode : err ? err.statusCode : 404 let entries: any = {
404: "Az oldal nem található",
400: "Érvénytelen kérelem",
500: "Szerveroldali hiba",
};
const message = entries[statusCode];
let entries: any = { return {
404: 'Az oldal nem található', props: {
400: 'Érvénytelen kérelem', statusCode,
500: 'Szerveroldali hiba' message,
} },
const message = entries[statusCode] };
};
return {
props: {
statusCode,
message
}
}
}

View file

@ -1,44 +1,47 @@
import { NextApiRequest, NextApiResponse } from 'next' import { NextApiRequest, NextApiResponse } from "next";
import aws from 'aws-sdk' import aws from "aws-sdk";
const { BUCKET, ACCESS_KEY, SECRET_KEY, ENDPOINT, REGION } = process.env const { BUCKET, ACCESS_KEY, SECRET_KEY, ENDPOINT, REGION } = process.env;
export default async function(req: NextApiRequest, res: NextApiResponse) { export default async function (req: NextApiRequest, res: NextApiResponse) {
aws.config.s3 = ({ aws.config.s3 = {
accessKeyId: ACCESS_KEY, accessKeyId: ACCESS_KEY,
secretAccessKey: SECRET_KEY, secretAccessKey: SECRET_KEY,
region: REGION, region: REGION,
endpoint: ENDPOINT, endpoint: ENDPOINT,
signatureVersion: 'v4' signatureVersion: "v4",
}) };
let isTruncated: boolean | undefined = true let isTruncated: boolean | undefined = true;
let startAfter let startAfter;
let objects = 0 let objects = 0;
let size = 0 let size = 0;
const s3 = new aws.S3() const s3 = new aws.S3();
while(isTruncated) { while (isTruncated) {
let params: any = { Bucket: BUCKET } let params: any = { Bucket: BUCKET };
if(startAfter) {
params.StartAfter = startAfter
}
const data = await s3.listObjectsV2(params).promise()
data.Contents?.forEach((object: any) => { if (startAfter) {
objects++ params.StartAfter = startAfter;
size += object.Size! / 1024 / 1024 / 1024
})
isTruncated = data.IsTruncated
if (isTruncated) {
startAfter = data.Contents!.slice(-1)[0].Key;
}
} }
res.setHeader('Cache-Control', 'public, s-maxage=10, stale-while-revalidate=59'); const data = await s3.listObjectsV2(params).promise();
res.json({ object: objects, size: Number(size.toFixed(2)) })
} data.Contents?.forEach((object: any) => {
objects++;
size += object.Size! / 1024 / 1024 / 1024;
});
isTruncated = data.IsTruncated;
if (isTruncated) {
startAfter = data.Contents!.slice(-1)[0].Key;
}
}
res.setHeader(
"Cache-Control",
"public, s-maxage=10, stale-while-revalidate=59"
);
res.json({ object: objects, size: Number(size.toFixed(2)) });
}

View file

@ -1,26 +1,28 @@
import { NextApiRequest, NextApiResponse } from 'next' import { NextApiRequest, NextApiResponse } from "next";
export default async function(req: NextApiRequest, res: NextApiResponse) { export default async function (req: NextApiRequest, res: NextApiResponse) {
const { LASTFM_USERNAME, LASTFM_API } = process.env const { LASTFM_USERNAME, LASTFM_API } = process.env;
const { recenttracks: response } = await fetch(`https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=${LASTFM_USERNAME}&api_key=${LASTFM_API}&format=json&limit=1`).then((res) => res.json()) const { recenttracks: response } = await fetch(
`https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=${LASTFM_USERNAME}&api_key=${LASTFM_API}&format=json&limit=1`
).then((res) => res.json());
const { track } = response const { track } = response;
const { artist, name, url, image } = track[0] const { artist, name, url, image } = track[0];
let nowplaying = Boolean(track[0]['@attr']?.nowplaying) let nowplaying = Boolean(track[0]["@attr"]?.nowplaying);
if(nowplaying) { if (nowplaying) {
return res.status(200).json({ return res.status(200).json({
nowplaying, nowplaying,
song: { song: {
artist: artist['#text'], artist: artist["#text"],
title: name, title: name,
url: url, url: url,
image: image[2]['#text'], image: image[2]["#text"],
} },
}) });
} }
return res.status(200).json({ nowplaying }) return res.status(200).json({ nowplaying });
} }

View file

@ -1,66 +1,81 @@
import Image from 'next/image' import Image from "next/image";
import Link from 'next/link' import Link from "next/link";
import React from 'react' import React from "react";
import useSWR from 'swr' import useSWR from "swr";
import FadeIn from 'react-fade-in' import FadeIn from "react-fade-in";
import { socials } from 'components/data/socials' import { socials } from "components/data/socials";
import { Icon } from 'components/Icon' import { Icon } from "components/Icon";
import { Toaster } from 'react-hot-toast' import { Toaster } from "react-hot-toast";
import { FaSpotify } from 'react-icons/fa' import { FaSpotify } from "react-icons/fa";
import profilePic from '../public/profile.webp' import profilePic from "../public/profile.webp";
const fetcher = (url: RequestInfo) => fetch(url).then(r => r.json()) const fetcher = (url: RequestInfo) => fetch(url).then((r) => r.json());
export default function() { export default function () {
const { data: spotify } = useSWR('/api/spotify', fetcher, { refreshInterval: 1000 }) const { data: spotify } = useSWR("/api/spotify", fetcher, {
if(!spotify) return refreshInterval: 1000,
return ( });
<FadeIn> if (!spotify) return;
<div className='px-8 w-11/12 m-auto rounded-lg max-w-4xl'> return (
<div className='flex flex-col justify-center items-center mt-40 md:mt-48 lg:mt-64'> <FadeIn>
<Image src={profilePic} alt='Profile Picture' className="rounded-full text-center" height={150} width={150}/> <div className="px-8 w-11/12 m-auto rounded-lg max-w-4xl">
<div className="flex flex-col justify-center items-center mt-40 md:mt-48 lg:mt-64">
<Image
src={profilePic}
alt="Profile Picture"
className="rounded-full text-center"
height={150}
width={150}
/>
<h1 className='text-4xl font-bold mt-1'>albert</h1> <h1 className="text-4xl font-bold mt-1">albert</h1>
<p className='text-[#9ca3af] text-xl flex flex-wrap items-center justify-center whitespace-pre-wrap'> <p className="text-[#9ca3af] text-xl flex flex-wrap items-center justify-center whitespace-pre-wrap">
{ Math.floor((new Date().getTime() - new Date('2004-07-22').getTime()) / (1000 * 60 * 60 * 24 * 365.25)) } {Math.floor(
yrs old <b className='font-semibold'>system administrator</b> and student from Hungary (new Date().getTime() - new Date("2004-07-22").getTime()) /
</p> (1000 * 60 * 60 * 24 * 365.25)
</div> )}
yrs old <b className="font-semibold">system administrator</b> and
student from Hungary
</p>
</div>
<hr className='border-t-[#727277] w-4/5 md:w-2/5 m-auto mt-5 md:mt-8'/> <hr className="border-t-[#727277] w-4/5 md:w-2/5 m-auto mt-5 md:mt-8" />
<div className='mt-3 flex justify-center items-center'> <div className="mt-3 flex justify-center items-center">
<FaSpotify className='text-[#32a866]' />&nbsp; <FaSpotify className="text-[#32a866]" />
&nbsp;
<p className="font-semibold">
Listening to
{spotify.song ? (
<Link href={`${spotify.song.url}`}>
<a target="_blank" className="text-[#32a866]">
{" "}
{spotify.song.title || "nothing"}
</a>
</Link>
) : (
<a className="text-[#32a866]"> nothing</a>
)}
</p>
</div>
<p className='font-semibold'>Listening to <div className="flex justify-between items-center text-3xl mt-11 md:mt-16 max-w-sm m-auto">
{ {socials.map((social) => (
spotify.song <Icon
? <Link href={`${spotify.song.url}`}> key={social.id}
<a target='_blank' className='text-[#32a866]'> { spotify.song.title || 'nothing' }</a> reference={social.ref}
</Link> copyValue={social.copyValue}
>
{React.createElement(social.icon)}
</Icon>
))}
</div>
</div>
: <a className='text-[#32a866]'> nothing</a> <Toaster />
} </FadeIn>
</p> );
</div>
<div className='flex justify-between items-center text-3xl mt-11 md:mt-16 max-w-sm m-auto'>
{ socials.map(social => (
<Icon
key={ social.id }
reference={ social.ref }
copyValue={ social.copyValue }
>
{ React.createElement(social.icon) }
</Icon>
))}
</div>
</div>
<Toaster />
</FadeIn>
)
} }

View file

@ -3,29 +3,29 @@
@tailwind utilities; @tailwind utilities;
@layer base { @layer base {
html { html {
scrollbar-width: thin; scrollbar-width: thin;
scrollbar-color: #8a58e0 transparent; scrollbar-color: #8a58e0 transparent;
} }
body { body {
background-color: #000; background-color: #000;
color: #fff; color: #fff;
} }
} }
@layer components { @layer components {
::selection { ::selection {
background-color: #8039e2; background-color: #8039e2;
color: #fff; color: #fff;
} }
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 3px; width: 3px;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
background-color: #8a58e0; background-color: #8a58e0;
border-radius: 10px; border-radius: 10px;
} }
} }

View file

@ -1,11 +1,11 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
module.exports = { module.exports = {
content: [ content: [
'./pages/**/*.{js,ts,jsx,tsx}', "./pages/**/*.{js,ts,jsx,tsx}",
'./components/**/*.{js,ts,jsx,tsx}' "./components/**/*.{js,ts,jsx,tsx}",
], ],
theme: { theme: {
extend: {}, extend: {},
}, },
plugins: [], plugins: [],
} };

View file

@ -18,4 +18,4 @@
}, },
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"] "exclude": ["node_modules"]
} }

View file

@ -181,9 +181,9 @@ available-typed-arrays@^1.0.5:
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
aws-sdk@^2.1194.0: aws-sdk@^2.1194.0:
version "2.1194.0" version "2.1204.0"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1194.0.tgz#6a820684fa3f58ea40caf90d302414a23df7c308" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1204.0.tgz#6e0c5d0b4b50ff122b66772bb0ab5453009e6106"
integrity sha512-wbgib7r7sHPkZIhqSMduueKYqe+DrFyxsKnUKHj6hdNcRKqEeqzvKp4olWmFs/3z3qU8+g78kBXr9rujvko1ug== integrity sha512-H3dRQBdgzAfZ/e/dfiW44fhQrgAuCfIzWhI5y5J9122caI4uZY6TEUd003UXP4nXq2eMfuPWg0bA/mPwbj8RkA==
dependencies: dependencies:
buffer "4.9.2" buffer "4.9.2"
events "1.1.1" events "1.1.1"
@ -246,9 +246,9 @@ camelcase-css@^2.0.1:
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373: caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373:
version "1.0.30001376" version "1.0.30001383"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001376.tgz#af2450833e5a06873fbb030a9556ca9461a2736d" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001383.tgz#aecf317ccd940690725ae3ae4f28293c5fb8050e"
integrity sha512-I27WhtOQ3X3v3it9gNs/oTpoE5KpwmqKR5oKPA8M0G7uMXh9Ty81Q904HpKUrM30ei7zfcL5jE7AXefgbOfMig== integrity sha512-swMpEoTp5vDoGBZsYZX7L7nXHe6dsHxi9o6/LKf/f0LukVtnrxly5GVb/fWdCDTqi/yw6Km6tiJ0pmBacm0gbg==
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
version "3.5.3" version "3.5.3"
@ -320,9 +320,9 @@ dlv@^1.1.3:
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
electron-to-chromium@^1.4.202: electron-to-chromium@^1.4.202:
version "1.4.219" version "1.4.232"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.219.tgz#a7a672304b6aa4f376918d3f63a47f2c3906009a" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.232.tgz#67a0a874b0057662244230d18d3a9847c135a9d9"
integrity sha512-zoQJsXOUw0ZA0YxbjkmzBumAJRtr6je5JySuL/bAoFs0DuLiLJ+5FzRF7/ZayihxR2QcewlRZVm5QZdUhwjOgA== integrity sha512-nd+FW8xHjM+PxNWG44nKnwHaBDdVpJUZuI2sS2JJPt/QpdombnmoCRWEEQNnzaktdIQhsNWdD+dlqxwO8Bn99g==
es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0:
version "1.20.1" version "1.20.1"
@ -466,9 +466,9 @@ glob-parent@^6.0.2:
is-glob "^4.0.3" is-glob "^4.0.3"
goober@^2.1.10: goober@^2.1.10:
version "2.1.10" version "2.1.11"
resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.10.tgz#058def43ba1e3b06f973dbb372a4978aa42f1049" resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.11.tgz#bbd71f90d2df725397340f808dbe7acc3118e610"
integrity sha512-7PpuQMH10jaTWm33sQgBQvz45pHR8N4l3Cu3WMGEWmHShAcTuuP7I+5/DwKo39fwti5A80WAjvqgz6SSlgWmGA== integrity sha512-5SS2lmxbhqH0u9ABEWq7WPU69a4i2pYcHeCxqaNq6Cw3mnrF0ghWNM4tEGid4dKy8XNIAUbuThuozDHHKJVh3A==
has-bigints@^1.0.1, has-bigints@^1.0.2: has-bigints@^1.0.1, has-bigints@^1.0.2:
version "1.0.2" version "1.0.2"
@ -769,9 +769,9 @@ object-keys@^1.1.1:
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
object.assign@^4.1.2: object.assign@^4.1.2:
version "4.1.3" version "4.1.4"
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.3.tgz#d36b7700ddf0019abb6b1df1bb13f6445f79051f" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
integrity sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA== integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
dependencies: dependencies:
call-bind "^1.0.2" call-bind "^1.0.2"
define-properties "^1.1.4" define-properties "^1.1.4"
@ -962,9 +962,9 @@ safe-buffer@^5.1.2:
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
sass@^1.54.4: sass@^1.54.4:
version "1.54.4" version "1.54.5"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.4.tgz#803ff2fef5525f1dd01670c3915b4b68b6cba72d" resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.5.tgz#93708f5560784f6ff2eab8542ade021a4a947b3a"
integrity sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA== integrity sha512-p7DTOzxkUPa/63FU0R3KApkRHwcVZYC0PLnLm5iyZACyp15qSi32x7zVUhRdABAATmkALqgGrjCJAcWvobmhHw==
dependencies: dependencies:
chokidar ">=3.0.0 <4.0.0" chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0" immutable "^4.0.0"