App router migration

This commit is contained in:
Jakob Kordež
2023-06-05 13:25:50 +00:00
committed by Žiga Kralj
parent 9c7530a4e4
commit a943909a88
37 changed files with 892 additions and 943 deletions

1
.env
View File

@ -1,2 +1,3 @@
NEXT_PUBLIC_PLAUSIBLE_DOMAIN="rklub.vegova.si"
NEXT_PUBLIC_PLAUSIBLE_HOST="https://stats.kralj.io"
NEXT_PUBLIC_GUILD_ID="733765085138255984"

View File

@ -1,3 +1,6 @@
{
"extends": "next/core-web-vitals"
"extends": "next/core-web-vitals",
"rules": {
"no-unused-vars": "warn"
}
}

View File

@ -18,15 +18,15 @@
"@types/react": "18.0.26",
"@types/react-dom": "18.0.10",
"bulma": "^0.9.4",
"contentlayer": "^0.3.0",
"contentlayer": "^0.3.2",
"eslint": "8.32.0",
"eslint-config-next": "13.1.2",
"exifr": "^7.1.3",
"next": "^13.4.1",
"next-contentlayer": "^0.3.0",
"eslint-config-next": "^13.4.2",
"exifreader": "^4.12.0",
"next": "^13.4.4",
"next-contentlayer": "^0.3.2",
"next-plausible": "^3.7.2",
"react": "18.2.0",
"react-dom": "18.2.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"rehype-autolink-headings": "^6.1.1",
"rehype-pretty-code": "^0.9.3",
"rehype-slug": "^5.1.0",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 792 B

View File

@ -1,12 +0,0 @@
# Allow all crawlers
User-agent: *
Allow: /
# Disallow
Disallow: /files/
Disallow: /analitika/
Disallow: /log/
Disallow: /ura/
# Sitemap
Sitemap: https://rklub.vegova.si/sitemap.xml

View File

@ -1,53 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>https://rklub.vegova.si/</loc>
<lastmod>2023-05-11T09:06:00+00:00</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://rklub.vegova.si/blog</loc>
<lastmod>2023-05-11T09:06:00+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://rklub.vegova.si/galerija</loc>
<lastmod>2023-05-11T09:06:00+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://rklub.vegova.si/tecaj</loc>
<lastmod>2023-05-11T09:06:00+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://rklub.vegova.si/blog/izpit-2023-izid</loc>
<lastmod>2023-05-11T09:06:00+00:00</lastmod>
<priority>0.64</priority>
</url>
<url>
<loc>https://rklub.vegova.si/blog/informativni-dnevi-2023</loc>
<lastmod>2023-05-11T09:06:00+00:00</lastmod>
<priority>0.64</priority>
</url>
<url>
<loc>https://rklub.vegova.si/blog/izpit-2023</loc>
<lastmod>2023-05-11T09:06:00+00:00</lastmod>
<priority>0.64</priority>
</url>
<url>
<loc>https://rklub.vegova.si/blog/new-website</loc>
<lastmod>2023-05-11T09:06:00+00:00</lastmod>
<priority>0.64</priority>
</url>
<url>
<loc>https://rklub.vegova.si/blog/tecaj-2023</loc>
<lastmod>2023-05-11T09:06:00+00:00</lastmod>
<priority>0.64</priority>
</url>
</urlset>

BIN
src/app/apple-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,112 @@
import { notFound } from "next/navigation";
import { allBlogs } from "contentlayer/generated";
import { useMDXComponent } from "next-contentlayer/hooks";
import { Metadata } from "next";
import { DiscordInvite } from "@/components/discord_invite";
import ModalImage from "@/components/modal_image";
export function generateStaticParams() {
return allBlogs.map((post) => ({ slug: post.slug }));
}
interface BlogPageProps {
params: {
slug: string;
};
}
export function generateMetadata({ params }: BlogPageProps): Metadata {
const post = allBlogs.find((post) => post.slug === params.slug);
if (!post) return {};
return {
title: post.title,
description: post.summary,
authors: post.authors.map((author) => ({ name: author })),
openGraph: {
title: post.title,
description: post.summary,
url: `https://rklub.vegova.si/blog/${post.slug}`,
type: "article",
},
};
}
function BlogImage(props: any) {
return (
<div className="mb-4 is-flex">
<div className="mx-auto blog-img">
<ModalImage
image={props.src}
alt={props.alt}
height={800}
width={800}
{...props}
/>
</div>
</div>
);
}
function Paragraph(props: any) {
return <div className="mb-4" {...props} />;
}
const components = {
p: Paragraph,
img: BlogImage,
DiscordInvite,
};
export default function Blog({ params }: BlogPageProps) {
const post = allBlogs.find((post) => post.slug === params.slug);
if (!post) {
notFound();
}
const Component = useMDXComponent(post.body.code);
return (
<div className="container blog-container">
<section className="section">
<div className="content">
<div className="article-header is-flex is-align-items-center mb-5">
<div>
<h2 className="m-0">{post.title}</h2>
<p className="has-text-grey">{buildAuthorList(post.authors)}</p>
</div>
<span className="tag is-primary is-medium ml-auto has-text-weight-semibold">
{new Date(post.publishedAt).toLocaleDateString("sl")}
</span>
</div>
<article>
<Component components={components} />
</article>
</div>
</section>
</div>
);
}
function buildAuthorList(authors: string[]) {
let authorCount = authors.length;
let authorsString = "Avtor";
if (authorCount == 2) {
authorsString += "ja";
} else if (authorCount > 2) {
authorsString += "ji";
}
authorsString += ": " + authors[0];
for (let i = 1; i < authorCount - 1; i++) {
authorsString += ", " + authors[i];
}
if (authorCount > 1) {
authorsString += " in " + authors[authorCount - 1];
}
return authorsString;
}

42
src/app/blog/page.tsx Normal file
View File

@ -0,0 +1,42 @@
import { Metadata } from "next";
import Link from "next/link";
import { allBlogs } from "contentlayer/generated";
export const metadata: Metadata = {
title: "Blog",
description: "Blog Radiokluba Vegova",
};
export default function BlogPage() {
return (
<div className="container">
<section className="section">
<div className="content">
<h2 className="mb-5">Blog</h2>
{allBlogs
.sort((a, b) => {
const dateA = new Date(a.publishedAt).valueOf();
const dateB = new Date(b.publishedAt).valueOf();
if (dateA !== dateB) {
return dateB - dateA;
}
return a.title.localeCompare(b.title);
})
.map((post) => (
<Link
key={post.slug}
className="is-block mb-4"
href={`/blog/${post.slug}`}
>
<p className="is-size-5 m-0 has-text-weight-medium">
{post.title}
</p>
<p className="is-size-6 has-text-grey">{post.summary}</p>
</Link>
))}
</div>
</section>
</div>
);
}

45
src/app/discord/page.tsx Normal file
View File

@ -0,0 +1,45 @@
"use client";
import { faDiscord } from "@fortawesome/free-brands-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useState } from "react";
const guild_id = process.env.NEXT_PUBLIC_GUILD_ID;
export default function DiscordRedirect() {
const router = useRouter();
const [href, setHref] = useState();
fetch(`https://discord.com/api/guilds/${guild_id}/widget.json`)
.then((res) => res.json())
.then((json) => {
const invite = json.instant_invite;
setHref(invite);
router.replace(invite);
});
return (
<div className="container">
<section className="section">
<div className="has-text-centered">
<FontAwesomeIcon
icon={faDiscord}
size="6x"
style={{ color: "#5865f2" }}
/>
<h2 className="is-size-3 has-text-weight-semibold">Prosim počakaj</h2>
<p className="is-size-4">
V kratkem boš preusmerjen na naš Discord strežnik
</p>
{href && (
<p className="pt-2">
Če preusmeritev ne uspe, <Link href={href}>klikni sem</Link>.
</p>
)}
</div>
</section>
</div>
);
}

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

47
src/app/galerija/page.tsx Normal file
View File

@ -0,0 +1,47 @@
import ModalImage from "@/components/modal_image";
import fs from "fs/promises";
import path from "path";
import { Metadata } from "next";
import ExifReader from "exifreader";
export const metadata: Metadata = {
title: "Galerija",
description: "Galerija Radiokluba Vegova",
};
export default async function Gallery() {
const idir = path.join(process.cwd(), "/public/images/gallery/");
const dirs = await fs.readdir(idir);
const desc = await Promise.all(
dirs.map((dir) =>
ExifReader.load(path.join(idir, dir)).then(
(exif) => exif?.ImageDescription?.description
)
)
);
const images = dirs.map((dir, i) => ({
src: dir,
alt: desc[i] ?? "",
}));
return (
<div className="container">
<section className="section">
<div className="content">
<h2>Galerija</h2>
<div className="galerija">
{images.map((img) => (
<ModalImage
key={img.src}
image={"/images/gallery/" + img.src}
alt={img.alt}
/>
))}
</div>
</div>
</section>
</div>
);
}

BIN
src/app/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

61
src/app/layout.tsx Normal file
View File

@ -0,0 +1,61 @@
import "@/styles/globals.scss";
import { config } from "@fortawesome/fontawesome-svg-core";
import "@fortawesome/fontawesome-svg-core/styles.css";
config.autoAddCss = false;
import Header from "@/components/header";
import { Metadata } from "next";
import PlausibleProvider from "next-plausible";
import Footer from "@/components/footer";
export const metadata: Metadata = {
title: {
default: "Radioklub Vegova",
template: "%s - Radioklub Vegova",
},
description: "Domača stran Radiokluba Vegova",
metadataBase: new URL("https://rklub.vegova.si"),
openGraph: {
title: "Radioklub Vegova",
description: "Domača stran Radiokluba Vegova",
url: "https://rklub.vegova.si",
locale: "sl_SI",
type: "website",
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
},
},
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="sl">
<body>
<PlausibleProvider
domain={PLAUSIBLE_DOMAIN}
customDomain={PLAUSIBLE_HOST}
trackLocalhost={true}
>
<Header />
<main>{children}</main>
<Footer />
</PlausibleProvider>
</body>
</html>
);
}
const PLAUSIBLE_DOMAIN = process.env.NEXT_PUBLIC_PLAUSIBLE_DOMAIN!;
const PLAUSIBLE_HOST = process.env.NEXT_PUBLIC_PLAUSIBLE_HOST!;

52
src/app/page.tsx Normal file
View File

@ -0,0 +1,52 @@
import Image from "next/image";
import { DiscordInvite } from "@/components/discord_invite";
export default function Home() {
return (
<div className="container">
<section className="section">
<div className="content">
<h2>Dobrodošel, radioamater!</h2>
<div className="columns">
<div className="column">
<p>
Pozdravljeni na spletni strani Radiokluba Vegova, dijaške
radioamaterske skupnosti na Vegovi v Ljubljani. Osnovno
poslanstvo kluba je spoznavanje in navduševanje dijakov z
aktivnostmi radioamaterstva, k lažjemu vstopu v novo dejavnost
pa pripomorejo znano šolsko okolje, sošolci, s katerimi se člani
videvajo dnevno in interaktivno študijsko gradivo, ki se hkrati
uporablja pri poučevanju.
</p>
<p>
Tečaj&nbsp;&ndash; priprave na radioamaterski izpit&nbsp;&ndash;
izvajamo letno. Da se ga lahko udeležijo vsi kandidati, ne glede
na njihov urnik, predavamo v večernih urah na daljavo prek
platforme Discord. Po opravljenem tečaju na šoli organiziramo
izpit, kar članom omogoči pridobitev radioamaterskega
dovoljenja.
</p>
<p>
Na šoli imamo lastno klubsko sobo, namenjeno srečanjem, druženju
in hrambi opreme, za razne aktivnosti pa so nam na voljo tudi
druge učilnice.
</p>
<DiscordInvite />
</div>
<div className="column">
<Image
src="/images/gallery/srecanje_1.jpg"
alt="Radioklub"
height={612}
width={816}
/>
</div>
</div>
</div>
</section>
</div>
);
}

13
src/app/robots.ts Normal file
View File

@ -0,0 +1,13 @@
import { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: "*",
allow: "/",
disallow: ["/log/", "/ura/"],
},
sitemap: "https://rklub.vegova.si/sitemap.xml",
host: "https://rklub.vegova.si",
};
}

18
src/app/sitemap.ts Normal file
View File

@ -0,0 +1,18 @@
import { allBlogs } from "contentlayer/generated";
import { MetadataRoute } from "next";
export default function sitemap(): MetadataRoute.Sitemap {
const host = "https://rklub.vegova.si";
const pages = ["", "/blog", "/galerija", "/tecaj"].map((url) => ({
url: `${host}${url}`,
lastModified: new Date(),
}));
const posts = allBlogs.map((post) => ({
url: `${host}/blog/${post.slug}`,
lastModified: new Date(post.publishedAt),
}));
return [...pages, ...posts];
}

222
src/app/tecaj/page.tsx Normal file
View File

@ -0,0 +1,222 @@
"use client";
import Link from "next/link";
import Image from "next/image";
import {
faDownload,
faExpand,
faFilePdf,
faList,
} from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Metadata } from "next";
import { useRef } from "react";
export const metadata: Metadata = {
title: "Tečaj",
description: "Radioamaterski tečaj za razred A",
};
export default function Tecaj() {
const iFrameRef = useRef<HTMLIFrameElement>(null);
return (
<div className="container">
<section className="section">
<div className="content">
<div className="buttons are-medium is-flex is-justify-content-end">
<button
className="button is-light"
onClick={() => iFrameRef.current?.requestFullscreen()}
>
<span className="icon">
<FontAwesomeIcon icon={faExpand} />
</span>
<span>Celozaslonski način</span>
</button>
<Link
href="/prosojnice/prosojnice.pdf"
className="button is-primary"
>
<span className="icon">
<FontAwesomeIcon icon={faDownload} />
</span>
<span>Prenesi PDF</span>
</Link>
</div>
<iframe
ref={iFrameRef}
className="presentation"
src="/prosojnice/index.html"
/>
<h2>Uporabne povezave</h2>
<div className="buttons are-medium">
{uporabnePovezave.map((p, i) => (
<Link
href={p.href}
key={i}
className={`button ${p.isPrimary ? "is-primary" : "is-light"}`}
>
{p.icon && (
<span className="icon">
<FontAwesomeIcon icon={p.icon} />
</span>
)}
<span>{p.title}</span>
</Link>
))}
</div>
<h2>Kazalo poglavij</h2>
<div className="columns is-multiline">
{poglavja.map((p, i) => (
<div
key={i}
className="column is-half-tablet is-one-third-desktop"
>
<div className="card">
<div className="card-image">
<figure className="image is-2by1 m-0">
<Image
src={p.image}
alt={p.title}
height={500}
width={500}
/>
</figure>
</div>
<div className="card-content">
<p className="title is-size-4">{p.title}</p>
<div className="content">{p.children}</div>
</div>
<footer className="card-footer has-background-light">
<button
className="card-footer-item button is-light"
onClick={() => {
const iframe = iFrameRef?.current;
if (!iframe) return;
iframe.src = `/prosojnice/index.html${p.href}`;
iframe.scrollIntoView({ behavior: "smooth" });
}}
>
Na poglavje
</button>
</footer>
</div>
</div>
))}
</div>
</div>
</section>
</div>
);
}
const uporabnePovezave = [
{
title: "Vaje za izpit",
href: "https://izpit.jkob.cc/",
isPrimary: true,
},
{
title: "Priročnik za radioamaterje",
href: "/files/prirocnik_2019.pdf",
icon: faFilePdf,
},
{
title: "Etika in operaterski postopki",
href: "/files/etika_junij_2021.pdf",
icon: faFilePdf,
},
{
title: "Seznam zasedenih klicnih znakov",
href: "https://www.akos-rs.si/registri/seznam-registrov/radioamaterji",
},
{
title: "Kriteriji za izpit",
href: "/files/kriteriji.pdf",
icon: faFilePdf,
},
];
const poglavja = [
{
title: "1. Radioamaterji in radijske komunikacije",
image: "/images/tecaj/poglavje1.jpg",
href: "#1-radioamaterji-in-radijske-komunikacije",
children: [
"Zgodovina, razvoj in pomen radioamaterstva",
"Mednarodna radioamaterska organizacija - IARU",
"Zveza radioamaterjev Slovenije - ZRS",
],
},
{
title: "2. Radijske komunikacije",
image: "/images/tecaj/itu.webp",
href: "#2-radijske-komunikacije",
children: [
"Osnovni pojmi o radijskih komunikacijah",
"Radioamaterska razdelitev sveta",
"Mednarodna razdelitev radijskih frekvenc",
],
},
{
title: "3. Predpisi za amaterske radijske komunikacije",
image: "/prosojnice/images/cept.jpg",
href: "#3-predpisi-za-amaterske-radijske-komunikacije",
children: [
"Mednarodni predpisi",
"Slovenski predpisi",
"CEPT licenca",
"Priporočili CEPT T/R 61-01 in T/R 61-02",
],
},
{
title: "4. Pravila in praksa v amaterskih radijskih komunikacijah",
image: "/prosojnice/images/logs.jpg",
href: "#4-pravila-in-praksa-v-amaterskih-radijskih-komunikacijah",
children: [
"Vspostavljanje amaterskih radijskih zvez",
"Amaterske zveze v telegrafiji in telefoniji",
"Amaterske digitalne komunikacije",
"Dnevnik dela radijske postaje",
"QSL kartica",
"…",
],
},
{
title: "5. Elektrotehnika",
image: "/prosojnice/images/web_19.jpg",
href: "#5-elektrotehnika",
children: [
"Električni tok, napetost in upornost",
"Ohmov zakon in moč",
"Tuljave in kondenzatorji",
"Filtri",
"Polprevodniki",
"Elektronske cevi",
"Mikrofoni in zvočnik",
"Ojačevalniki",
"Napajalniki",
],
},
{
title: "6. Radiotehnika",
image: "/images/tecaj/poglavje6.jpg",
href: "#6-radiotehnika",
children: [
"Radijski valovi in prenos",
"Radijski oddajniki",
"Radijski sprejemniki",
"Valovanje",
"Razširjanje radijskih valov",
"Antene",
"Napajanje anten",
"Motnje",
"Meritve in merilni inštrumenti",
"Nevarnosti pri delu z električnim tokom",
],
},
];

View File

@ -1,23 +0,0 @@
import Link from "next/link";
import { IconProp } from "@fortawesome/fontawesome-svg-core";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
interface ButtonProps {
href: string;
icon?: IconProp;
text: string;
className: string;
}
export default function Button(props: ButtonProps) {
return (
<Link href={props.href} className={props.className + " button"}>
{props.icon && (
<span className="icon">
<FontAwesomeIcon icon={props.icon} />
</span>
)}
<span>{props.text}</span>
</Link>
);
}

View File

@ -1,37 +1,13 @@
"use client";
import { faDiscord } from "@fortawesome/free-brands-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import Link from "next/link";
import styles from "@/styles/DiscordInvite.module.scss";
import { create } from "zustand";
interface Invite {
href: string | null | undefined;
setHref: (href: string | null | undefined) => void;
}
const useState = create<Invite>((set) => ({
href: undefined,
setHref: (href: string | null | undefined) => set({ href }),
}));
export function DiscordInvite() {
const { href, setHref } = useState();
if (href === undefined) {
setHref(null);
fetch("https://discord.com/api/guilds/733765085138255984/widget.json")
.then((res) => res.json())
.then((json) => setHref(json.instant_invite));
}
return (
<Link
href={href ?? ""}
className={`button ${styles.discord} ${
href == undefined ? "is-loading" : ""
}`}
>
<Link href="/discord" className={`button ${styles.discord}`}>
<span className="icon">
<FontAwesomeIcon icon={faDiscord} />
</span>

View File

@ -1,6 +1,8 @@
"use client";
import Image from "next/image";
import Link from "next/link";
import { useRouter } from "next/router";
import { usePathname } from "next/navigation";
import { useState } from "react";
const navItems = [
@ -13,8 +15,8 @@ const navItems = [
export default function Header() {
const [navbar, setNavbar] = useState<boolean>(false);
let pathname = useRouter().pathname;
if (pathname.startsWith("/blog/")) pathname = "/blog";
let pathname = usePathname();
if (pathname?.startsWith("/blog/")) pathname = "/blog";
const close = () => setNavbar(false);
@ -25,12 +27,7 @@ export default function Header() {
<div className="is-flex is-align-items-center">
<Link href="/">
<figure className="image">
<Image
src="/images/RKV_logo_64.png"
alt="RKV Logo"
width={64}
height={64}
/>
<Image src="/icon.png" alt="RKV Logo" width={64} height={64} />
</figure>
</Link>
<Link href="/" className="ml-4">

View File

@ -1,21 +0,0 @@
import Head from "next/head";
import Header from "./header";
interface LayoutProps {
children: React.ReactNode;
}
export default function Layout({ children }: LayoutProps) {
return (
<>
<Head>
<title>Radioklub Vegova</title>
<meta name="description" content="Radioklub Vegova" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
</Head>
<Header />
<main>{children}</main>
</>
);
}

View File

@ -1,3 +1,5 @@
"use client";
import {
faArrowLeft,
faDownload,

View File

@ -1,5 +0,0 @@
export interface Category {
id: number;
title: string;
questions: number[][];
}

View File

@ -1,7 +0,0 @@
export interface Question {
id: number;
question: string;
image?: string;
answers?: string[];
correct?: number;
}

View File

@ -1,36 +0,0 @@
import "@/styles/globals.scss";
import type { AppProps } from "next/app";
import { config } from "@fortawesome/fontawesome-svg-core";
import "@fortawesome/fontawesome-svg-core/styles.css";
config.autoAddCss = false;
import "reveal.js/dist/reveal.css";
import Layout from "@/components/layout";
import PlausibleProvider from "next-plausible";
const PLAUSIBLE_DOMAIN = process.env.NEXT_PUBLIC_PLAUSIBLE_DOMAIN;
const PLAUSIBLE_HOST = process.env.NEXT_PUBLIC_PLAUSIBLE_HOST;
export default function App({ Component, pageProps }: AppProps) {
let component = (
<Layout>
<Component {...pageProps} />
</Layout>
);
if (PLAUSIBLE_DOMAIN) {
component = (
<PlausibleProvider
domain={PLAUSIBLE_DOMAIN}
customDomain={PLAUSIBLE_HOST}
trackLocalhost={true}
>
{component}
</PlausibleProvider>
);
}
return component;
}

View File

@ -1,18 +0,0 @@
import Footer from "@/components/footer";
import { Html, Head, Main, NextScript } from "next/document";
export default function Document() {
return (
<Html lang="sl">
<Head>
<link rel="icon" href="/images/RKV_logo_128.png" />
</Head>
<body>
<Main />
<Footer />
<NextScript />
</body>
</Html>
);
}

View File

@ -1,110 +0,0 @@
import { notFound } from "next/navigation";
import { allBlogs } from "contentlayer/generated";
import { useMDXComponent } from "next-contentlayer/hooks";
import { GetStaticPaths, GetStaticProps } from "next";
import { DiscordInvite } from "@/components/discord_invite";
import ModalImage from "@/components/modal_image";
import Head from "next/head";
function BlogImage(props: any) {
return (
<div className="mb-4 is-flex">
<div className="mx-auto blog-img">
<ModalImage
image={props.src}
alt={props.alt}
height={800}
width={800}
{...props}
/>
</div>
</div>
);
}
function Paragraph(props: any) {
return <div className="mb-4" {...props} />;
}
const components = {
p: Paragraph,
img: BlogImage,
DiscordInvite,
};
export default function Blog({ slug }: { slug: string }) {
const post = allBlogs.find((post) => post.slug === slug);
if (!post) {
notFound();
}
const Component = useMDXComponent(post.body.code);
return (
<>
<Head>
<title>{`${post.title} - Radioklub Vegova`}</title>
</Head>
<div className="container blog-container">
<section className="section">
<div className="content">
<div className="article-header is-flex is-align-items-center mb-5">
<div>
<h2 className="m-0">{post.title}</h2>
<p className="has-text-grey">{buildAuthorList(post.authors)}</p>
</div>
<span className="tag is-primary is-medium ml-auto has-text-weight-semibold">
{new Date(post.publishedAt).toLocaleDateString("sl")}
</span>
</div>
<article>
<Component components={components} />
</article>
</div>
</section>
</div>
</>
);
}
export const getStaticPaths: GetStaticPaths = async () => {
return {
paths: allBlogs.map((post) => ({ params: { slug: post.slug } })),
fallback: false, // can also be true or 'blocking'
};
};
export const getStaticProps: GetStaticProps = async ({ params }) => {
if (!params?.slug) {
return {
props: {},
};
}
return {
props: { slug: params.slug },
};
};
function buildAuthorList(authors: string[]) {
let authorCount = authors.length;
let authorsString = "Avtor";
if (authorCount == 2) {
authorsString += "ja";
} else if (authorCount > 2) {
authorsString += "ji";
}
authorsString += ": " + authors[0];
for (let i = 1; i < authorCount - 1; i++) {
authorsString += ", " + authors[i];
}
if (authorCount > 1) {
authorsString += " in " + authors[authorCount - 1];
}
return authorsString;
}

View File

@ -1,43 +0,0 @@
import Head from "next/head";
import Link from "next/link";
import { allBlogs } from "contentlayer/generated";
export default function BlogPage() {
return (
<>
<Head>
<title>Blog - Radioklub Vegova</title>
</Head>
<div className="container">
<section className="section">
<div className="content">
<h2 className="mb-5">Blog</h2>
{allBlogs
.sort((a, b) => {
const dateA = new Date(a.publishedAt).valueOf();
const dateB = new Date(b.publishedAt).valueOf();
if (dateA !== dateB) {
return dateB - dateA;
}
return a.title.localeCompare(b.title);
})
.map((post) => (
<Link
key={post.slug}
className="is-block mb-4"
href={`/blog/${post.slug}`}
>
<p className="is-size-5 m-0 has-text-weight-medium">
{post.title}
</p>
<p className="is-size-6 has-text-grey">{post.summary}</p>
</Link>
))}
</div>
</section>
</div>
</>
);
}

View File

@ -1,58 +0,0 @@
import ModalImage from "@/components/modal_image";
import Head from "next/head";
import fs from "fs/promises";
import path from "path";
import { GetStaticProps } from "next";
import exifr from "exifr";
interface GalleryProps {
images: { src: string; alt: string }[];
}
export default function Gallery({ images }: GalleryProps) {
return (
<>
<Head>
<title>Galerija - Radioklub Vegova</title>
<meta name="description" content="Galerija Radiokluba Vegova" />
</Head>
<div className="container">
<section className="section">
<div className="content">
<h2>Galerija</h2>
<div className="galerija">
{images.map((img) => (
<ModalImage
key={img.src}
image={"/images/gallery/" + img.src}
alt={img.alt}
/>
))}
</div>
</div>
</section>
</div>
</>
);
}
export const getStaticProps: GetStaticProps = async () => {
const props = { images: [] } as GalleryProps;
try {
const idir = path.join(process.cwd(), "/public/images/gallery/");
const dirs = await fs.readdir(idir);
const desc = await Promise.all(
dirs.map((dir) => exifr.parse(path.join(idir, dir), ["ImageDescription"]))
);
props.images = dirs.map((dir, i) => ({
src: dir,
alt: desc[i]?.ImageDescription ?? "",
}));
} catch (error) {}
return { props };
};

View File

@ -1,60 +0,0 @@
import Head from "next/head";
import Image from "next/image";
import { DiscordInvite } from "@/components/discord_invite";
import Link from "next/link";
export default function Home() {
return (
<>
<Head>
<meta name="description" content="Domača stran Radiokluba Vegova" />
</Head>
<div className="container">
<section className="section">
<div className="content">
<h2>Dobrodošel, radioamater!</h2>
<div className="columns">
<div className="column">
<p>
Pozdravljeni na spletni strani Radiokluba Vegova, dijaške
radioamaterske skupnosti na Vegovi v Ljubljani. Osnovno
poslanstvo kluba je spoznavanje in navduševanje dijakov z
aktivnostmi radioamaterstva, k lažjemu vstopu v novo dejavnost
pa pripomorejo znano šolsko okolje, sošolci, s katerimi se
člani videvajo dnevno in interaktivno študijsko gradivo, ki se
hkrati uporablja pri poučevanju.
</p>
<p>
Tečaj&nbsp;&ndash; priprave na radioamaterski
izpit&nbsp;&ndash; izvajamo letno. Da se ga lahko udeležijo
vsi kandidati, ne glede na njihov urnik, predavamo v večernih
urah na daljavo prek platforme Discord. Po opravljenem tečaju
na šoli organiziramo izpit, kar članom omogoči pridobitev
radioamaterskega dovoljenja.
</p>
<p>
Na šoli imamo lastno klubsko sobo, namenjeno srečanjem,
druženju in hrambi opreme, za razne aktivnosti pa so nam na
voljo tudi druge učilnice.
</p>
<DiscordInvite />
</div>
<div className="column">
<Image
src="/images/gallery/srecanje_1.jpg"
alt="Radioklub"
height={612}
width={816}
/>
</div>
</div>
</div>
</section>
</div>
</>
);
}

View File

@ -1,216 +0,0 @@
import Head from "next/head";
import Image from "next/image";
import {
faDownload,
faExpand,
faFilePdf,
faList,
} from "@fortawesome/free-solid-svg-icons";
import Button from "@/components/button";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
export default function Tecaj() {
return (
<>
<Head>
<title>Tečaj - Radioklub Vegova</title>
<meta name="description" content="Radioamaterski tečaj za razred A" />
</Head>
<div className="container">
<section className="section">
<div className="content">
<div className="buttons are-medium is-flex is-justify-content-end">
<button
className="button is-light"
onClick={() => {
const iframe = document.querySelector(
".presentation"
) as HTMLIFrameElement;
iframe.requestFullscreen();
}}
>
<span className="icon">
<FontAwesomeIcon icon={faExpand} />
</span>
<span>Celozaslonski način</span>
</button>
<Button
href="/prosojnice/prosojnice.pdf"
className="is-primary"
text="Prenesi PDF"
icon={faDownload}
/>
</div>
<iframe className="presentation" src="/prosojnice/index.html" />
<h2>Uporabne povezave</h2>
<div className="buttons are-medium">
<Button
href="https://izpit.jkob.cc/"
className="is-primary"
text="Vaje za izpit"
/>
<Button
href="/files/prirocnik_2019.pdf"
className="is-light"
text="Priročnik za radioamaterje"
icon={faFilePdf}
/>
<Button
href="/files/etika_junij_2021.pdf"
className="is-light"
text="Etika in operaterski postopki"
icon={faFilePdf}
/>
<Button
href="https://www.akos-rs.si/registri/seznam-registrov/radioamaterji"
className="is-light"
text="Seznam zasedenih klicnih znakov"
icon={faList}
/>
<Button
href="/files/kriteriji.pdf"
className="is-light"
text="Kriteriji za izpit"
icon={faFilePdf}
/>
</div>
<h2>Kazalo poglavij</h2>
<div className="columns is-multiline">
<Card
title="1. Radioamaterji in radijske komunikacije"
image="/images/tecaj/poglavje1.jpg"
href="#1-radioamaterji-in-radijske-komunikacije"
>
<ul>
<li>Zgodovina, razvoj in pomen radioamaterstva</li>
<li>Mednarodna radioamaterska organizacija - IARU</li>
<li>Zveza radioamaterjev Slovenije - ZRS</li>
</ul>
</Card>
<Card
title="2. Radijske komunikacije"
image="/images/tecaj/itu.webp"
href="#2-radijske-komunikacije"
>
<ul>
<li>Osnovni pojmi o radijskih komunikacijah</li>
<li>Radioamaterska razdelitev sveta</li>
<li>Mednarodna razdelitev radijskih frekvenc</li>
</ul>
</Card>
<Card
title="3. Predpisi za amaterske radijske komunikacije"
image="/prosojnice/images/cept.jpg"
href="#3-predpisi-za-amaterske-radijske-komunikacije"
>
<ul>
<li>Mednarodni predpisi</li>
<li>Slovenski predpisi</li>
<li>CEPT licenca</li>
<li>Priporočili CEPT T/R 61-01 in T/R 61-02</li>
</ul>
</Card>
<Card
title="4. Pravila in praksa v amaterskih radijskih komunikacijah"
image="/prosojnice/images/logs.jpg"
href="#4-pravila-in-praksa-v-amaterskih-radijskih-komunikacijah"
>
<ul>
<li>Vspostavljanje amaterskih radijskih zvez</li>
<li>Amaterske zveze v telegrafiji in telefoniji</li>
<li>Amaterske digitalne komunikacije</li>
<li>Dnevnik dela radijske postaje</li>
<li>QSL kartica</li>
<li>&hellip;</li>
</ul>
</Card>
<Card
title="5. Elektrotehnika"
image="/prosojnice/images/web_19.jpg"
href="#5-elektrotehnika"
>
<ul>
<li>Električni tok, napetost in upornost</li>
<li>Ohmov zakon in moč</li>
<li>Tuljave in kondenzatorji</li>
<li>Filtri</li>
<li>Polprevodniki</li>
<li>Elektronske cevi</li>
<li>Mikrofoni in zvočnik</li>
<li>Ojačevalniki</li>
<li>Napajalniki</li>
</ul>
</Card>
<Card
title="6. Radiotehnika"
image="/images/tecaj/poglavje6.jpg"
href="#6-radiotehnika"
>
<ul>
<li>Radijski valovi in prenos</li>
<li>Radijski oddajniki</li>
<li>Radijski sprejemniki</li>
<li>Valovanje</li>
<li>Razširjanje radijskih valov</li>
<li>Antene</li>
<li>Napajanje anten</li>
<li>Motnje</li>
<li>Meritve in merilni inštrumenti</li>
<li>Nevarnosti pri delu z električnim tokom</li>
</ul>
</Card>
</div>
</div>
</section>
</div>
</>
);
}
interface CardProps {
title: string;
href: string;
image: string;
children: React.ReactNode;
}
function Card({ title, href, image, children }: CardProps) {
return (
<div className="column is-half-tablet is-one-third-desktop">
<div className="card">
<div className="card-image">
<figure className="image is-2by1 m-0">
<Image src={image} alt={title} height={500} width={500} />
</figure>
</div>
<div className="card-content">
<p className="title is-size-4">{title}</p>
<div className="content">{children}</div>
</div>
<footer className="card-footer has-background-light">
<button
className="card-footer-item button is-light"
onClick={() => {
const iframe = document.querySelector(
".presentation"
) as HTMLIFrameElement;
iframe.src = `/prosojnice/index.html${href}`;
iframe.scrollIntoView({ behavior: "smooth" });
}}
>
Na poglavje
</button>
</footer>
</div>
</div>
);
}

View File

@ -1,9 +1,19 @@
.discord {
background-color: #5865f2;
color: white;
font-weight: 500;
&:hover {
background-color: #454fbf;
transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
&:hover,
&:active,
&:focus {
background-color: hsl(235, 86.1%, 71.8%);
background-color: hsl(
235,
calc(var(--saturation-factor, 1) * 86.1%),
71.8%
);
color: white;
}
}

View File

@ -1,40 +0,0 @@
import { Category } from "@/interfaces/category";
import { Question } from "@/interfaces/question";
interface QuestionFile {
questions: Question[];
categories: Category[];
}
let json: QuestionFile | null = null;
const openFile = async (): Promise<QuestionFile> => {
if (json) return json;
json = JSON.parse(await fetch("/questions.json").then((res) => res.text()));
return json!;
};
export const getQuestions = async (): Promise<Question[]> => {
const file = await openFile();
return file.questions.map((question: any) => ({
id: question.id,
question: question.question,
image: question.image,
answers: question.answers,
correct: question.correct,
}));
// .filter((question: Question) => question.correct != null);
};
export const getCategories = async (): Promise<Category[]> => {
const file = await openFile();
return file.categories.map((category: any) => ({
id: category.id,
title: category.title,
questions: category.questions,
}));
};

View File

@ -18,13 +18,19 @@
"paths": {
"@/*": ["./src/*"],
"contentlayer/generated": ["./.contentlayer/generated"]
}
},
"plugins": [
{
"name": "next"
}
]
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".contentlayer/generated"
".contentlayer/generated",
".next/types/**/*.ts"
],
"exclude": ["node_modules"]
}

430
yarn.lock
View File

@ -16,29 +16,29 @@
dependencies:
regenerator-runtime "^0.13.11"
"@contentlayer/cli@0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@contentlayer/cli/-/cli-0.3.0.tgz#59ef411f3405cb58524962f043e54e42104969db"
integrity sha512-Mqb6NlIKINt2qsPKft+o8m5tJhJXVgVSd0zP1BH+CQRmvR/zwTT3maz1bDCPHBYGKgGCQKtvgM66IjvH+dmC6Q==
"@contentlayer/cli@0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@contentlayer/cli/-/cli-0.3.2.tgz#9b891373cd800a249fe8acfd4b4dc76ff4f50dcc"
integrity sha512-KLzB2z3Klbl4bU7VTJ8EaY1d17GCBFtwgvtNAVLOqUJ4LRw46+jT+qBMk8gyy7R1xDNF2H1a/yGYs8t8rlFVmg==
dependencies:
"@contentlayer/core" "0.3.0"
"@contentlayer/utils" "0.3.0"
clipanion "^3.2.0-rc.14"
"@contentlayer/core" "0.3.2"
"@contentlayer/utils" "0.3.2"
clipanion "^3.2.0"
typanion "^3.12.1"
"@contentlayer/client@0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@contentlayer/client/-/client-0.3.0.tgz#a5d1f3c598697383b93beff53489918c57e93faa"
integrity sha512-yzDYiZtqOJwWrsykieA1LMnhKbaYcJhAy7s8Xs7zU5wFfyBTO258gvmK5dVi4LuzmOOPVMJn6FpEofT/RAKVtg==
"@contentlayer/client@0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@contentlayer/client/-/client-0.3.2.tgz#cd1ed466cc14fe07d6934438d182ddd16b105d97"
integrity sha512-5m7IFd0Z8qRBAOnAYwWcf/SFe1SmtHmeV1kO4pldEuD8J/5sxKeefdGHLNnH3sxlGfeJhEdDnymJtppg8v0D8w==
dependencies:
"@contentlayer/core" "0.3.0"
"@contentlayer/core" "0.3.2"
"@contentlayer/core@0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@contentlayer/core/-/core-0.3.0.tgz#67c6cf5fdcacdef9e957bb14fb90510fe671cd82"
integrity sha512-5cL4W0nK9kNqxgBkIgauUko0SRAHf8oPoxRhdsSPQ7FSCgZGz2crMeSJOFmj3a3govh863/mKhXfkoUJBoDgnA==
"@contentlayer/core@0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@contentlayer/core/-/core-0.3.2.tgz#c628b9e66c5fec07cbe10d144c75155353a391bf"
integrity sha512-5ZLzS3s4Lp5Tlw+U4kUUK9frYmi8sc970spJSvLSxtOTDHDE7xemGT9HSj0V4DcmIkY9TT7pCmMFRfpEv7IC6Q==
dependencies:
"@contentlayer/utils" "0.3.0"
"@contentlayer/utils" "0.3.2"
camel-case "^4.1.2"
comment-json "^4.2.3"
esbuild "0.17.x"
@ -49,58 +49,59 @@
remark-parse "^10.0.1"
remark-rehype "^10.1.0"
source-map-support "^0.5.21"
type-fest "^3.5.2"
type-fest "^3.7.1"
unified "^10.1.2"
"@contentlayer/source-files@0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@contentlayer/source-files/-/source-files-0.3.0.tgz#84cd220a664c34568396ce5cbbe1dadf880fa9ed"
integrity sha512-6crNuRdWGYFec0Kn/DpbrzpOu8bttFmOmOpX1HIYQz4iPisg+8biybLBiNU7Y6aCUjEZLOnM7AaHpMFvhrYWsw==
"@contentlayer/source-files@0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@contentlayer/source-files/-/source-files-0.3.2.tgz#310ed23d401ea1eba3f6e4fa0172ae29c901ded2"
integrity sha512-VYUaUbT3Hg3fSEEKpjDdfGEkw4bl4BaLHJWf5sulrkBtjdyNJ3RwUdnsqN3i+bibhcYF4ZvnFme4xtHBuEChmw==
dependencies:
"@contentlayer/core" "0.3.0"
"@contentlayer/utils" "0.3.0"
"@contentlayer/core" "0.3.2"
"@contentlayer/utils" "0.3.2"
chokidar "^3.5.3"
fast-glob "^3.2.12"
gray-matter "^4.0.3"
imagescript "^1.2.15"
imagescript "^1.2.16"
micromatch "^4.0.5"
ts-pattern "^4.1.3"
ts-pattern "^4.2.2"
unified "^10.1.2"
yaml "^1.10.2"
zod "^3.20.2"
zod "^3.21.4"
"@contentlayer/source-remote-files@0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@contentlayer/source-remote-files/-/source-remote-files-0.3.0.tgz#c081acd2692d46ca7bc332b2dc921c36d8ee65f5"
integrity sha512-4PnaK5cfQiduMUEO6nzqsD4ttD5RG4ffcyeSp5MLhpU0DTEZcfGXFRO777ddEI8PZ0/NJuhfz9MGbdO90QYlsw==
"@contentlayer/source-remote-files@0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@contentlayer/source-remote-files/-/source-remote-files-0.3.2.tgz#a607aa85e1b2a67192bf2e552f68e20204c7bfbe"
integrity sha512-BuABBHemn/UzhARsQh2XH13VUeb5HoRI3NkJeCGEMSnstzI72Dcc6krELwG3cTFYmgb95TV8NuIZKcrz8IsX6A==
dependencies:
"@contentlayer/core" "0.3.0"
"@contentlayer/source-files" "0.3.0"
"@contentlayer/utils" "0.3.0"
"@contentlayer/core" "0.3.2"
"@contentlayer/source-files" "0.3.2"
"@contentlayer/utils" "0.3.2"
"@contentlayer/utils@0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@contentlayer/utils/-/utils-0.3.0.tgz#6846e47a0998ecd144515c597d930cb52da0806e"
integrity sha512-GJF8Z67bf8KJbMqtZgt3G/m4Um93XrcryMJ+2Q1SUBRCEDuMcm8iLPaSbMQ0+gjxyW0GWHnR1oM+qyzaWTPgdg==
"@contentlayer/utils@0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@contentlayer/utils/-/utils-0.3.2.tgz#3a24d8fc2f0928a510a646615e536deb4def5439"
integrity sha512-qQdL3PN3zKl7monHe3EXlXgq7/raApWWJ7+2n0C81ESiwdM1ZFuHU+pOIkl5JWhotTkqAqYdSvFuM+MAXF8XFg==
dependencies:
"@effect-ts/core" "^0.60.2"
"@effect-ts/otel" "^0.14.0"
"@effect-ts/otel-exporter-trace-otlp-grpc" "^0.14.0"
"@effect-ts/otel-sdk-trace-node" "^0.14.0"
"@js-temporal/polyfill" "^0.4.3"
"@opentelemetry/api" "~1.1.0"
"@opentelemetry/core" "~1.5.0"
"@opentelemetry/exporter-trace-otlp-grpc" "~0.31.0"
"@opentelemetry/resources" "~1.5.0"
"@opentelemetry/sdk-trace-base" "~1.5.0"
"@opentelemetry/sdk-trace-node" "~1.5.0"
"@opentelemetry/semantic-conventions" "~1.5.0"
"@opentelemetry/api" "^1.1.0"
"@opentelemetry/core" "^1.5.0"
"@opentelemetry/exporter-trace-otlp-grpc" "^0.31.0"
"@opentelemetry/resources" "^1.5.0"
"@opentelemetry/sdk-trace-base" "^1.5.0"
"@opentelemetry/sdk-trace-node" "^1.5.0"
"@opentelemetry/semantic-conventions" "^1.5.0"
chokidar "^3.5.3"
hash-wasm "^4.9.0"
inflection "^2.0.1"
oo-ascii-tree "^1.73.0"
ts-pattern "^4.1.3"
type-fest "^3.5.2"
memfs "^3.5.1"
oo-ascii-tree "^1.80.0"
ts-pattern "^4.2.2"
type-fest "^3.7.1"
"@effect-ts/core@^0.60.2":
version "0.60.5"
@ -395,62 +396,62 @@
unist-util-visit "^4.0.0"
vfile "^5.0.0"
"@next/env@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.1.tgz#57322da2630b6bb6d7204577b0a18f6f9324db0c"
integrity sha512-eD6WCBMFjLFooLM19SIhSkWBHtaFrZFfg2Cxnyl3vS3DAdFRfnx5TY2RxlkuKXdIRCC0ySbtK9JXXt8qLCqzZg==
"@next/env@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.4.tgz#46b620f6bef97fe67a1566bf570dbb791d40c50a"
integrity sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==
"@next/eslint-plugin-next@13.1.2":
version "13.1.2"
resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.1.2.tgz"
integrity sha512-WGaNVvIYphdriesP6r7jq/8l7u38tzotnVQuxc1RYKLqYYApSsrebti3OCPoT3Gx0pw2smPIFHH98RzcsgW5GQ==
"@next/eslint-plugin-next@13.4.2":
version "13.4.2"
resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.2.tgz#ce32730d6282af3151a07de6e865397dc6d3dbdf"
integrity sha512-ZeFWgrxwckxTpYM+ANeUL9E7LOGPbZKmI94LJIjbDU69iEIgqd4WD0l2pVbOJMr/+vgoZmJ9Dx1m0WJ7WScXHA==
dependencies:
glob "7.1.7"
"@next/swc-darwin-arm64@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.1.tgz#3748040d2dd0d89d3cdcc897f96aeda5130eed8f"
integrity sha512-eF8ARHtYfnoYtDa6xFHriUKA/Mfj/cCbmKb3NofeKhMccs65G6/loZ15a6wYCCx4rPAd6x4t1WmVYtri7EdeBg==
"@next/swc-darwin-arm64@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz#8c14083c2478e2a9a8d140cce5900f76b75667ff"
integrity sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==
"@next/swc-darwin-x64@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.1.tgz#c59fc270005f17e04eb7eab4fd68793d0e3409a4"
integrity sha512-7cmDgF9tGWTgn5Gw+vP17miJbH4wcraMHDCOHTYWkO/VeKT73dUWG23TNRLfgtCNSPgH4V5B4uLHoZTanx9bAw==
"@next/swc-darwin-x64@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz#5fe01c65c80fcb833c8789fd70f074ea99893864"
integrity sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==
"@next/swc-linux-arm64-gnu@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.1.tgz#1aef371bcef5d832d7f7e3aec3e68cfb98282393"
integrity sha512-qwJqmCri2ie8aTtE5gjTSr8S6O8B67KCYgVZhv9gKH44yvc/zXbAY8u23QGULsYOyh1islWE5sWfQNLOj9iryg==
"@next/swc-linux-arm64-gnu@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz#f2e071f38e8a6cdadf507cc5d28956f73360d064"
integrity sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==
"@next/swc-linux-arm64-musl@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.1.tgz#2522927cb0af6918405a49f5a1d1687d6847f3ec"
integrity sha512-qcC54tWNGDv/VVIFkazxhqH1Bnagjfs4enzELVRlUOoJPD2BGJTPI7z08pQPbbgxLtRiu8gl2mXvpB8WlOkMeA==
"@next/swc-linux-arm64-musl@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz#23bf75c544e54562bc24ec1be036e4bd9cf89e2c"
integrity sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==
"@next/swc-linux-x64-gnu@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.1.tgz#5ec9418a35510048a5ceb79ed300463e1a9b312d"
integrity sha512-9TeWFlpLsBosZ+tsm/rWBaMwt5It9tPH8m3nawZqFUUrZyGRfGcI67js774vtx0k3rL9qbyY6+3pw9BCVpaYUA==
"@next/swc-linux-x64-gnu@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz#bd42590950a01957952206f89cf5622e7c9e4196"
integrity sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==
"@next/swc-linux-x64-musl@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.1.tgz#3478b9c89b75c1d0e7def9f35a9a77cb15d1a115"
integrity sha512-sNDGaWmSqTS4QRUzw61wl4mVPeSqNIr1OOjLlQTRuyInxMxtqImRqdvzDvFTlDfdeUMU/DZhWGYoHrXLlZXe6A==
"@next/swc-linux-x64-musl@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz#907d81feb1abec3daec0ecb61e3f39b56e7aeafe"
integrity sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==
"@next/swc-win32-arm64-msvc@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.1.tgz#efe53d48ff51d2485eabb910ab7caee78425fc01"
integrity sha512-+CXZC7u1iXdLRudecoUYbhbsXpglYv8KFYsFxKBPn7kg+bk7eJo738wAA4jXIl8grTF2mPdmO93JOQym+BlYGA==
"@next/swc-win32-arm64-msvc@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz#1d754d2bb10bdf9907c0acc83711438697c3b5fe"
integrity sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==
"@next/swc-win32-ia32-msvc@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.1.tgz#952cdf1c53df46a90d5151d99310195d2c384e55"
integrity sha512-vIoXVVc7UYO68VwVMDKwJC2+HqAZQtCYiVlApyKEeIPIQpz2gpufzGxk1z3/gwrJt/kJ5CDZjlhYDCzd3hdz+g==
"@next/swc-win32-ia32-msvc@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz#77b2c7f7534b675d46e46301869e08d504d23956"
integrity sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==
"@next/swc-win32-x64-msvc@13.4.1":
version "13.4.1"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.1.tgz#447b7dcee5f5d4824cdff331a4ec34b13d0b449d"
integrity sha512-n8V5ImLQZibKTu10UUdI3nIeTLkliEXe628qxqW9v8My3BAH2a7H0SaCqkV2OgqFnn8sG1wxKYw9/SNJ632kSA==
"@next/swc-win32-x64-msvc@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz#faab69239f8a9d0be7cd473e65f5a07735ef7b0e"
integrity sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@ -485,24 +486,31 @@
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.0.tgz#2c91791a9ba6ca0a0f4aaac5e45d58df13639ac8"
integrity sha512-IgMK9i3sFGNUqPMbjABm0G26g0QCKCUBfglhQ7rQq6WcxbKfEHRcmwsoER4hZcuYqJgkYn2OeuoJIv7Jsftp7g==
"@opentelemetry/api@~1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.1.0.tgz#563539048255bbe1a5f4f586a4a10a1bb737f44a"
integrity sha512-hf+3bwuBwtXsugA2ULBc95qxrOqP2pOekLz34BJhcAKawt94vfeNyUKpYc0lZQ/3sCP6LqRa7UAdHA7i5UODzQ==
"@opentelemetry/api@^1.1.0":
version "1.4.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f"
integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==
"@opentelemetry/context-async-hooks@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.5.0.tgz#4955313e7f0ec0fe17c813328a2a7f39f262c0fa"
integrity sha512-mhBPP0BU0RaH2HB8U4MDd5OjWA1y7SoLOovCT0iEpJAltaq2z04uxRJVzIs91vkpNnV0utUZowQQD3KElgU+VA==
"@opentelemetry/context-async-hooks@1.13.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.13.0.tgz#b697317c1670eaa9b1c23201d09dd29250dcc8fa"
integrity sha512-pS5fU4lrRjOIPZQqA2V1SUM9QUFXbO+8flubAiy6ntLjnAjJJUdRFOUOxK6v86ZHI2p2S8A0vD0BTu95FZYvjA==
"@opentelemetry/core@1.5.0", "@opentelemetry/core@~1.5.0":
"@opentelemetry/core@1.13.0", "@opentelemetry/core@^1.5.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.13.0.tgz#7cdcb4176d260d279b0aa31456c4ce2ba7f410aa"
integrity sha512-2dBX3Sj99H96uwJKvc2w9NOiNgbvAO6mOFJFramNkKfS9O4Um+VWgpnlAazoYjT6kUJ1MP70KQ5ngD4ed+4NUw==
dependencies:
"@opentelemetry/semantic-conventions" "1.13.0"
"@opentelemetry/core@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.5.0.tgz#717bceee15d4c69d4c7321c1fe0f5a562b60eb81"
integrity sha512-B3DIMkQN0DANrr7XrMLS4pR6d2o/jqT09x4nZJz6wSJ9SHr4eQIqeFBNeEUQG1I+AuOcH2UbJtgFm7fKxLqd+w==
dependencies:
"@opentelemetry/semantic-conventions" "1.5.0"
"@opentelemetry/exporter-trace-otlp-grpc@~0.31.0":
"@opentelemetry/exporter-trace-otlp-grpc@^0.31.0":
version "0.31.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.31.0.tgz#64b2f4c08e3f54015522e9eeeb0613f7d853e1e8"
integrity sha512-WapHtHPLOFObRMvtfRJX/EBRZS4YLpRY8E/OtIQmmAqwImDMAnMVF9fAjP6DSE/thOIN3Ot0/PLK5zFZUVV8SA==
@ -543,21 +551,29 @@
"@opentelemetry/sdk-metrics-base" "0.31.0"
"@opentelemetry/sdk-trace-base" "1.5.0"
"@opentelemetry/propagator-b3@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.5.0.tgz#7fc1876f11e0a92fc93185d14e0dae99f42bb135"
integrity sha512-38iGIScgU9OLhoPKAV3p2rEf4RmmQC/Lo4LvpQ6TaSQrRht/oDgnpsPJnmNQLFboklmukKataJO+FhAieOc7mg==
"@opentelemetry/propagator-b3@1.13.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.13.0.tgz#30a19a24e61ae8dbc26c2d7d7d3423d804d48f07"
integrity sha512-HOo91EI4UbuG8xQVLFziTzrcIn0MJQhy8m9jorh8aonb94jFVFi3CFNIiAnIGOabmnshJLOABxpYXsiPB8Xnzg==
dependencies:
"@opentelemetry/core" "1.5.0"
"@opentelemetry/core" "1.13.0"
"@opentelemetry/propagator-jaeger@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.5.0.tgz#b4ccffc0fa59f94ea67e0884c543d39bbbd1c18d"
integrity sha512-aSUH5RDEZj+lmy4PbXAJ26E+yJcZloyPUBWgqYX+JBS4NnbriIznCF/tXV5s/RUXeVABibi/+yAZndv+2XBg4w==
"@opentelemetry/propagator-jaeger@1.13.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.13.0.tgz#94a79d5301409d49b149227ee5568fcf6b21f9fe"
integrity sha512-IV9TO+u1Jzm9mUDAD3gyXf89eyvgEJUY1t+GB5QmS4wjVeWrSMUtD0JjH3yG9SNqkrQOqOGJq7YUSSetW+Lf5Q==
dependencies:
"@opentelemetry/core" "1.5.0"
"@opentelemetry/core" "1.13.0"
"@opentelemetry/resources@1.5.0", "@opentelemetry/resources@~1.5.0":
"@opentelemetry/resources@1.13.0", "@opentelemetry/resources@^1.5.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.13.0.tgz#436b33ea950004e66fce6575f2776a05faca7f8e"
integrity sha512-euqjOkiN6xhjE//0vQYGvbStxoD/WWQRhDiO0OTLlnLBO9Yw2Gd/VoSx2H+svsebjzYk5OxLuREBmcdw6rbUNg==
dependencies:
"@opentelemetry/core" "1.13.0"
"@opentelemetry/semantic-conventions" "1.13.0"
"@opentelemetry/resources@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.5.0.tgz#ce7fbdaec3494e41bc279ddbed3c478ee2570b03"
integrity sha512-YeEfC6IY54U3xL3P2+UAiom+r50ZF2jM0J47RV5uTFGF19Xjd5zazSwDPgmxtAd6DwLX0/5S5iqrsH4nEXMYoA==
@ -575,7 +591,16 @@
"@opentelemetry/resources" "1.5.0"
lodash.merge "4.6.2"
"@opentelemetry/sdk-trace-base@1.5.0", "@opentelemetry/sdk-trace-base@~1.5.0":
"@opentelemetry/sdk-trace-base@1.13.0", "@opentelemetry/sdk-trace-base@^1.5.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.13.0.tgz#096cc2759430d880c5d886e009df2605097403dc"
integrity sha512-moTiQtc0uPR1hQLt6gLDJH9IIkeBhgRb71OKjNHZPE1VF45fHtD6nBDi5J/DkTHTwYP5X3kBJLa3xN7ub6J4eg==
dependencies:
"@opentelemetry/core" "1.13.0"
"@opentelemetry/resources" "1.13.0"
"@opentelemetry/semantic-conventions" "1.13.0"
"@opentelemetry/sdk-trace-base@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.5.0.tgz#259439009fff5637e7a379ece7446ce5beb84b77"
integrity sha512-6lx7YDf67HSQYuWnvq3XgSrWikDJLiGCbrpUP6UWJ5Z47HLcJvwZPRH+cQGJu1DFS3dT2cV3GpAR75/OofPNHQ==
@ -584,19 +609,24 @@
"@opentelemetry/resources" "1.5.0"
"@opentelemetry/semantic-conventions" "1.5.0"
"@opentelemetry/sdk-trace-node@~1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.5.0.tgz#8a6af64b8e6fb970b998844f99349e654327a60d"
integrity sha512-MzS+urf2KufpwgaHbGcUgccHr6paxI98lHFMgJAkK6w76AmPYavsxSwjiVPrchy/24d2J9svDirSgui3NNZo8g==
"@opentelemetry/sdk-trace-node@^1.5.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.13.0.tgz#baadf62218ca69e37486debfbcf15b2563f75979"
integrity sha512-FXA85lXKTsnbOflA/TBuBf2pmhD3c8uDjNjG0YqK+ap8UayfALmfJhf+aG1yBOUHevCY0JXJ4/xtbXExxpsMog==
dependencies:
"@opentelemetry/context-async-hooks" "1.5.0"
"@opentelemetry/core" "1.5.0"
"@opentelemetry/propagator-b3" "1.5.0"
"@opentelemetry/propagator-jaeger" "1.5.0"
"@opentelemetry/sdk-trace-base" "1.5.0"
"@opentelemetry/context-async-hooks" "1.13.0"
"@opentelemetry/core" "1.13.0"
"@opentelemetry/propagator-b3" "1.13.0"
"@opentelemetry/propagator-jaeger" "1.13.0"
"@opentelemetry/sdk-trace-base" "1.13.0"
semver "^7.3.5"
"@opentelemetry/semantic-conventions@1.5.0", "@opentelemetry/semantic-conventions@~1.5.0":
"@opentelemetry/semantic-conventions@1.13.0", "@opentelemetry/semantic-conventions@^1.5.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.13.0.tgz#0290398b3eaebc6029c348988a78c3b688fe9219"
integrity sha512-LMGqfSZkaMQXqewO0o1wvWr/2fQdCh4a3Sqlxka/UsJCe0cfLulh6x2aqnKLnsrSGiCq5rSCwvINd152i0nCqw==
"@opentelemetry/semantic-conventions@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.5.0.tgz#cea9792bfcf556c87ded17c6ac729348697bb632"
integrity sha512-wlYG/U6ddW1ilXslnDLLQYJ8nd97W8JJTTfwkGhubx6dzW6SUkd+N4/MzTjjyZlrHQunxHtkHFvVpUKiROvFDw==
@ -833,6 +863,11 @@
"@typescript-eslint/types" "5.48.2"
eslint-visitor-keys "^3.3.0"
"@xmldom/xmldom@^0.7.8":
version "0.7.10"
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.10.tgz#b1f4a7dc63ac35b2750847644d5dacf5b4ead12f"
integrity sha512-hb9QhOg5MGmpVkFcoZ9XJMe1em5gd0e2eqqjK87O1dwULedXsnY/Zg/Ju6lcohA+t6jVkmKpe7I1etqhvdRdrQ==
acorn-jsx@^5.0.0, acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
@ -1134,10 +1169,10 @@ client-only@0.0.1:
resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz"
integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
clipanion@^3.2.0-rc.14:
version "3.2.0-rc.15"
resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-3.2.0-rc.15.tgz#74545d91162713170fc19fceb9b24f5e3e21e5bb"
integrity sha512-nK4V2d8WDAGWzWhm96c3Ieo6GV/+IfuzDcS5kDwfTnY8zZ8hVvZ9PMyIYwlvYaeZGQ+JfxKVnPx+RHgBHQugag==
clipanion@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-3.2.0.tgz#ea55ce3fe27becb4ddd4915df6fb3de0f9e79a5c"
integrity sha512-XaPQiJQZKbyaaDbv5yR/cAt/ORfZfENkr4wGQj+Go/Uf/65ofTQBCPirgWFeJctZW24V3mxrFiEnEmqBflrJYA==
dependencies:
typanion "^3.8.0"
@ -1199,17 +1234,17 @@ concat-map@0.0.1:
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
contentlayer@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/contentlayer/-/contentlayer-0.3.0.tgz#98c9a0b6aba50c807695cc94434eab4541b1e2bc"
integrity sha512-3LEF5HMHjSytlT8SErC3U59Pt2LP80a6Z2f/0mSIPeA4xty0LNChyHqzALySSM0osAEz32RY56Fifk5P+2dCIA==
contentlayer@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/contentlayer/-/contentlayer-0.3.2.tgz#9d31db0bdca72c19226bce2d187f50fdc5e70a4b"
integrity sha512-fQN3l/KvUW+nIvXiaShpOCvXX4alNbvfo56vnVxHVm6vKP10bb/IRhjMXPXZzr+5hmCaeep9wMpCAvOKB6NJHA==
dependencies:
"@contentlayer/cli" "0.3.0"
"@contentlayer/client" "0.3.0"
"@contentlayer/core" "0.3.0"
"@contentlayer/source-files" "0.3.0"
"@contentlayer/source-remote-files" "0.3.0"
"@contentlayer/utils" "0.3.0"
"@contentlayer/cli" "0.3.2"
"@contentlayer/client" "0.3.2"
"@contentlayer/core" "0.3.2"
"@contentlayer/source-files" "0.3.2"
"@contentlayer/source-remote-files" "0.3.2"
"@contentlayer/utils" "0.3.2"
core-util-is@^1.0.3:
version "1.0.3"
@ -1497,12 +1532,12 @@ escape-string-regexp@^5.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8"
integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
eslint-config-next@13.1.2:
version "13.1.2"
resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.1.2.tgz"
integrity sha512-zdRAQOr8v69ZwJRtBrGqAqm160ONqKxU/pV1FB1KlgfyqveGsLZmlQ7l31otwtw763901J7xdiTVkj2y3YxXZA==
eslint-config-next@^13.4.2:
version "13.4.2"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.4.2.tgz#6ee5c53b6f56bddd6346d14c22713b71da7e7b51"
integrity sha512-zjLJ9B9bbeWSo5q+iHfdt8gVYyT+y2BpWDfjR6XMBtFRSMKRGjllDKxnuKBV1q2Y/QpwLM2PXHJTMRyblCmRAg==
dependencies:
"@next/eslint-plugin-next" "13.1.2"
"@next/eslint-plugin-next" "13.4.2"
"@rushstack/eslint-patch" "^1.1.3"
"@typescript-eslint/parser" "^5.42.0"
eslint-import-resolver-node "^0.3.6"
@ -1775,10 +1810,12 @@ esutils@^2.0.2:
resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
exifr@^7.1.3:
version "7.1.3"
resolved "https://registry.yarnpkg.com/exifr/-/exifr-7.1.3.tgz#f6218012c36dbb7d843222011b27f065fddbab6f"
integrity sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==
exifreader@^4.12.0:
version "4.12.0"
resolved "https://registry.yarnpkg.com/exifreader/-/exifreader-4.12.0.tgz#e3857f39f54b73b84549e9a9e114f292e85bb87a"
integrity sha512-aRSmNyw2c6f6qPK4jmC56W/5XePDN7LVwt8tQjgMchxoY3MCxqEToegirKdS7A3CYCWAOPehfypMZWGWxtLhzw==
optionalDependencies:
"@xmldom/xmldom" "^0.7.8"
expand-template@^2.0.3:
version "2.0.3"
@ -1904,6 +1941,11 @@ fs-constants@^1.0.0:
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
fs-monkey@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3"
integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
@ -2276,10 +2318,10 @@ ignore@^5.2.0:
resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz"
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
imagescript@^1.2.15:
version "1.2.15"
resolved "https://registry.yarnpkg.com/imagescript/-/imagescript-1.2.15.tgz#478f096be59e8b41f65f2b44d2c955171395bd2c"
integrity sha512-um9tWylwZrK2T7hzMlajRB6sGEgjYQYFm5jKommOV/v2ANpLozyVBGhe3ZeYxCO1lLh/QZqpGq7u6qOyUrh8DQ==
imagescript@^1.2.16:
version "1.2.16"
resolved "https://registry.yarnpkg.com/imagescript/-/imagescript-1.2.16.tgz#2272f535816bdcbaec9da4448de5c89a488756bd"
integrity sha512-hhy8OVNymU+cYYj8IwCbdNlXJRoMr4HRd7+efkH32eBVfybVU/5SbzDYf3ZSiiF9ye/ghfBrI/ujec/nwl+fOQ==
immutable@^4.0.0:
version "4.2.2"
@ -2950,6 +2992,13 @@ mdx-bundler@^9.2.1:
uuid "^8.3.2"
vfile "^5.3.2"
memfs@^3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.1.tgz#f0cd1e2bfaef58f6fe09bfb9c2288f07fea099ec"
integrity sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==
dependencies:
fs-monkey "^1.0.3"
merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
@ -3384,25 +3433,25 @@ natural-compare@^1.4.0:
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
next-contentlayer@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/next-contentlayer/-/next-contentlayer-0.3.0.tgz#f9e815e78a1fbd2172aa94d0593c359f589c6a15"
integrity sha512-vt+RaD3nIgZ6oXadtZH19a1mpxvGEoiifdtmXqBSz4rHMRcMA1YZCuSWyj+P9uX7MDmIL6JT6QSp+hvTBMaxiw==
next-contentlayer@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/next-contentlayer/-/next-contentlayer-0.3.2.tgz#0954a700c25f359d1e4555924222528b5ff58b46"
integrity sha512-pihb/VtBq30eV+WpaWakWVtA1DWKzfXeaL7l/vR4MvrTO8UtZaX9H6wY0oSOqrmy674BRjXiQ03PbEOE5D6/iA==
dependencies:
"@contentlayer/core" "0.3.0"
"@contentlayer/utils" "0.3.0"
"@contentlayer/core" "0.3.2"
"@contentlayer/utils" "0.3.2"
next-plausible@^3.7.2:
version "3.7.2"
resolved "https://registry.yarnpkg.com/next-plausible/-/next-plausible-3.7.2.tgz#33eae204a00ad01b7851b319e115eab8e0815fa6"
integrity sha512-9PqFiVtD1kZO5gHFYTcgilHhg2WhMzD6I4NK/RUh9DGavD1N11IhNAvyGLFmvB3f4FtHC9IoAsauYDtQBt+riA==
next@^13.4.1:
version "13.4.1"
resolved "https://registry.yarnpkg.com/next/-/next-13.4.1.tgz#8d23f94c81b3f9cc8b34165ad528457e5befd726"
integrity sha512-JBw2kAIyhKDpjhEWvNVoFeIzNp9xNxg8wrthDOtMctfn3EpqGCmW0FSviNyGgOSOSn6zDaX48pmvbdf6X2W9xA==
next@^13.4.4:
version "13.4.4"
resolved "https://registry.yarnpkg.com/next/-/next-13.4.4.tgz#d1027c8d77f4c51be0b39f671b4820db03c93e60"
integrity sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==
dependencies:
"@next/env" "13.4.1"
"@next/env" "13.4.4"
"@swc/helpers" "0.5.1"
busboy "1.6.0"
caniuse-lite "^1.0.30001406"
@ -3410,15 +3459,15 @@ next@^13.4.1:
styled-jsx "5.1.1"
zod "3.21.4"
optionalDependencies:
"@next/swc-darwin-arm64" "13.4.1"
"@next/swc-darwin-x64" "13.4.1"
"@next/swc-linux-arm64-gnu" "13.4.1"
"@next/swc-linux-arm64-musl" "13.4.1"
"@next/swc-linux-x64-gnu" "13.4.1"
"@next/swc-linux-x64-musl" "13.4.1"
"@next/swc-win32-arm64-msvc" "13.4.1"
"@next/swc-win32-ia32-msvc" "13.4.1"
"@next/swc-win32-x64-msvc" "13.4.1"
"@next/swc-darwin-arm64" "13.4.4"
"@next/swc-darwin-x64" "13.4.4"
"@next/swc-linux-arm64-gnu" "13.4.4"
"@next/swc-linux-arm64-musl" "13.4.4"
"@next/swc-linux-x64-gnu" "13.4.4"
"@next/swc-linux-x64-musl" "13.4.4"
"@next/swc-win32-arm64-msvc" "13.4.4"
"@next/swc-win32-ia32-msvc" "13.4.4"
"@next/swc-win32-x64-msvc" "13.4.4"
no-case@^3.0.4:
version "3.0.4"
@ -3534,10 +3583,10 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
oo-ascii-tree@^1.73.0:
version "1.74.0"
resolved "https://registry.yarnpkg.com/oo-ascii-tree/-/oo-ascii-tree-1.74.0.tgz#3581e4f95ff9de13660943e504eaddaa58bf08c0"
integrity sha512-tV5BBZhFvALFKY/DMVILN5jDznPRZte0Yoj1hPmbAVGL4VSpsEXx0ZrP8fnFZKbAOyCwWq+PV26n7S5+cP86Xw==
oo-ascii-tree@^1.80.0:
version "1.81.0"
resolved "https://registry.yarnpkg.com/oo-ascii-tree/-/oo-ascii-tree-1.81.0.tgz#e10a4e725ea697794f27d0dc0768493a809da032"
integrity sha512-rfGg7tBvwiNrdP5MqVUGt/4Kwiy9y7Y6G3z6Nue5hhd0pHiAAyDVJ/GcwfW3cjMDrWlJ/itg+QuXREA1yfwynA==
open@^8.4.0:
version "8.4.0"
@ -3773,9 +3822,9 @@ rc@^1.2.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
react-dom@18.2.0:
react-dom@^18.2.0:
version "18.2.0"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
dependencies:
loose-envify "^1.1.0"
@ -3786,9 +3835,9 @@ react-is@^16.13.1:
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react@18.2.0:
react@^18.2.0:
version "18.2.0"
resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
dependencies:
loose-envify "^1.1.0"
@ -4348,10 +4397,10 @@ trough@^2.0.0:
resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876"
integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==
ts-pattern@^4.1.3:
version "4.1.3"
resolved "https://registry.yarnpkg.com/ts-pattern/-/ts-pattern-4.1.3.tgz#8036392a31c42cc3580608024f0a6d298b6438c9"
integrity sha512-8beXMWTGEv1JfDjSxfNhe4uT5jKYdhmEUKzt4gZW9dmHlquq3b+IbEyA7vX9LjBfzHmvKnM4HiomAUCyaW2Pew==
ts-pattern@^4.2.2:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ts-pattern/-/ts-pattern-4.3.0.tgz#7a995b39342f1b00d1507c2d2f3b90ea16e178a6"
integrity sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==
tsconfig-paths@^3.14.1:
version "3.14.1"
@ -4414,10 +4463,10 @@ type-fest@^1.0.2:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1"
integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==
type-fest@^3.5.2:
version "3.5.5"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.5.5.tgz#43e96a3c6306e46cfd36e85c57a03fb7e2b34b48"
integrity sha512-Nudle2CLcCaf9/1bVQunwzX1/ZH4Z6mvP8hkWWZCbKrxtnN52QwD5Xn/mo68aofQhGU4be1GlEC6LQCTKGXkRw==
type-fest@^3.7.1:
version "3.10.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.10.0.tgz#d75f17a22be8816aea6315ab2739fe1c0c211863"
integrity sha512-hmAPf1datm+gt3c2mvu0sJyhFy6lTkIGf0GzyaZWxRLnabQfPUqg6tF95RPg6sLxKI7nFLGdFxBcf2/7+GXI+A==
typed-array-length@^1.0.4:
version "1.0.4"
@ -4687,16 +4736,11 @@ yocto-queue@^0.1.0:
resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
zod@3.21.4:
zod@3.21.4, zod@^3.21.4:
version "3.21.4"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db"
integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==
zod@^3.20.2:
version "3.20.2"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.2.tgz#068606642c8f51b3333981f91c0a8ab37dfc2807"
integrity sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==
zustand@^4.3.2:
version "4.3.2"
resolved "https://registry.npmjs.org/zustand/-/zustand-4.3.2.tgz"