From fbd41d395916176dde11bb0e417f1210f34eb4ab Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sat, 23 Mar 2024 18:02:45 +0100 Subject: Add blog Site structure follows SEO tips from https://johnnyreilly.com/how-we-fixed-my-seo * The blog pages have as simple of an URL as possible. To this end, the home page of the site is actually the first index page of the blog. * Customize the blog index page BlogListPage component to show the landing page as the first index page. * Rename /archive to /blog to avoid a dated feel. * Remove the date from post URLs using the slug property. --- blog/2024-03-25-first-post.mdx | 17 ++ blog/authors.yml | 10 + docusaurus.config.ts | 37 ++- i18n/en/code.json | 289 +++++++++++++++++++++ i18n/en/code.json.license | 6 + .../en/docusaurus-plugin-content-blog/options.json | 14 + .../options.json.license | 5 + i18n/en/docusaurus-theme-classic/footer.json | 22 ++ .../docusaurus-theme-classic/footer.json.license | 5 + i18n/en/docusaurus-theme-classic/navbar.json | 30 +++ .../docusaurus-theme-classic/navbar.json.license | 5 + package.json | 6 +- src/components/ActiveSectionProvider.tsx | 2 +- src/components/Landing.tsx | 31 +++ src/components/landing/sections/Blog.module.css | 28 ++ src/components/landing/sections/Blog.tsx | 95 +++++++ src/components/landing/sections/Hero.module.css | 10 +- src/css/custom.css | 8 +- src/pages/index.tsx | 28 -- src/plugins/compressionPlugin.ts | 10 +- src/theme/BlogListPage.tsx | 18 ++ src/theme/BlogSidebar/Desktop.module.css | 53 ++++ src/theme/BlogSidebar/Desktop.tsx | 55 ++++ src/theme/Footer/Copyright.jsx | 49 ---- src/theme/Footer/Copyright.tsx | 50 ++++ src/theme/NavbarItem/NavbarNavLink.jsx | 89 ------- src/theme/NavbarItem/NavbarNavLink.tsx | 91 +++++++ src/theme/PaginatorNavLink.tsx | 17 ++ src/theme/Root.tsx | 11 + src/theme/SiteMetadata.jsx | 28 -- third-party | 2 +- yarn.lock | 233 +++++++++-------- 32 files changed, 1030 insertions(+), 324 deletions(-) create mode 100644 blog/2024-03-25-first-post.mdx create mode 100644 blog/authors.yml create mode 100644 i18n/en/code.json create mode 100644 i18n/en/code.json.license create mode 100644 i18n/en/docusaurus-plugin-content-blog/options.json create mode 100644 i18n/en/docusaurus-plugin-content-blog/options.json.license create mode 100644 i18n/en/docusaurus-theme-classic/footer.json create mode 100644 i18n/en/docusaurus-theme-classic/footer.json.license create mode 100644 i18n/en/docusaurus-theme-classic/navbar.json create mode 100644 i18n/en/docusaurus-theme-classic/navbar.json.license create mode 100644 src/components/Landing.tsx create mode 100644 src/components/landing/sections/Blog.module.css create mode 100644 src/components/landing/sections/Blog.tsx delete mode 100644 src/pages/index.tsx create mode 100644 src/theme/BlogListPage.tsx create mode 100644 src/theme/BlogSidebar/Desktop.module.css create mode 100644 src/theme/BlogSidebar/Desktop.tsx delete mode 100644 src/theme/Footer/Copyright.jsx create mode 100644 src/theme/Footer/Copyright.tsx delete mode 100644 src/theme/NavbarItem/NavbarNavLink.jsx create mode 100644 src/theme/NavbarItem/NavbarNavLink.tsx create mode 100644 src/theme/PaginatorNavLink.tsx delete mode 100644 src/theme/SiteMetadata.jsx diff --git a/blog/2024-03-25-first-post.mdx b/blog/2024-03-25-first-post.mdx new file mode 100644 index 0000000..e612116 --- /dev/null +++ b/blog/2024-03-25-first-post.mdx @@ -0,0 +1,17 @@ +--- +SPDX-FileCopyrightText: 2024 Kristóf Marussy +SPDX-License-Identifier: CC-BY-4.0 +tags: [css] +authors: kris +slug: first-post +--- + +# First post + +## Section + +### Subsection + +#### Subsubsection + +Testing. diff --git a/blog/authors.yml b/blog/authors.yml new file mode 100644 index 0000000..12a86d9 --- /dev/null +++ b/blog/authors.yml @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2024 Kristóf Marussy +# +# SPDX-License-Identifier: CC-BY-4.0 + +kris: + name: Kristóf Marussy + title: Software engineering researcher, developer + url: https://marussy.com + image_url: 'https://marussy.com/profile.webp' + email: kristof@marussy.com diff --git a/docusaurus.config.ts b/docusaurus.config.ts index f19513a..57e8a8e 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -1,27 +1,44 @@ /* * Copyright (c) Facebook, Inc. and its affiliates. - * Copyright (c) 2023 Kristóf Marussy + * Copyright (c) 2023-2024 Kristóf Marussy * * SPDX-License-Identifier: MIT */ -import type { PluginOptions as ClassicThemeOptions } from '@docusaurus/theme-classic'; +import type { Options as BlogOptions } from '@docusaurus/plugin-content-blog'; +import type { Options as PagesOptions } from '@docusaurus/plugin-content-pages'; +import type { Options as ClassicThemeOptions } from '@docusaurus/theme-classic'; import type { UserThemeConfig } from '@docusaurus/theme-common'; import type { Config } from '@docusaurus/types'; import { Config as SwcConfig } from '@swc/core'; import smartypants from 'remark-smartypants'; +const remarkPlugins = [[smartypants, { dashes: 'oldschool' }]]; + export default { title: 'Kristóf Marussy', url: 'https://marussy.com', baseUrl: '/', staticDirectories: ['third-party/static', 'static'], plugins: [ + [ + '@docusaurus/plugin-content-blog', + { + routeBasePath: '/', + archiveBasePath: 'blog', + remarkPlugins, + feedOptions: { + type: 'all', + title: 'Kristóf Marussy', + description: "Kristóf Marussy's Blog", + }, + } satisfies BlogOptions, + ], [ '@docusaurus/plugin-content-pages', { - remarkPlugins: [[smartypants, { dashes: 'oldschool' }]], - }, + remarkPlugins, + } satisfies PagesOptions, ], '@docusaurus/plugin-sitemap', './src/plugins/compressionPlugin.ts', @@ -70,8 +87,8 @@ export default { ], }, { - label: 'CV', - to: 'pathname:///cv.pdf', + label: 'Blog', + to: '/blog', }, ], }, @@ -84,6 +101,14 @@ export default { label: 'About', to: '/', }, + { + label: 'Blog', + to: '/blog', + }, + { + label: 'Tags', + to: '/tags', + }, ], }, ], diff --git a/i18n/en/code.json b/i18n/en/code.json new file mode 100644 index 0000000..3bd3ef2 --- /dev/null +++ b/i18n/en/code.json @@ -0,0 +1,289 @@ +{ + "theme.blog.archive.title": { + "message": "Blog", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "All the posts I ever wrote", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Blog recent posts navigation", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.ErrorPageContent.title": { + "message": "This page crashed.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Scroll back to top", + "description": "The ARIA label for the back to top button" + }, + "theme.colorToggle.ariaLabel": { + "message": "Switch between dark and light mode (currently {mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "dark mode", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "light mode", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Breadcrumbs", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription": { + "message": "{count} items", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.common.headingLinkTitle": { + "message": "Direct link to {heading}", + "description": "Title for link to heading" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versions", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.tags.tagsListLabel": { + "message": "Tags:", + "description": "The label alongside a tag list" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Blog list page navigation", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Newer Entries", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Older Entries", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Blog post page navigation", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Newer Post", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Older Post", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "One post|{count} posts", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} tagged with \"{tagName}\"", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "View All Tags", + "description": "The label of the link targeting the tag list page" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Docs pages", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Previous", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Next", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "One doc tagged|{count} docs tagged", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} with \"{tagName}\"", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "Version: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "This is unreleased documentation for {siteTitle} {versionLabel} version.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "latest version", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "Edit this page", + "description": "The link label to edit the current page" + }, + "theme.lastUpdated.atDate": { + "message": " on {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " by {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Last updated{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.NotFound.title": { + "message": "Page Not Found", + "description": "The title of the 404 page" + }, + "theme.admonition.caution": { + "message": "caution", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "danger", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "info", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "note", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "tip", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "warning", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Close", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.CodeBlock.copied": { + "message": "Copied", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "Copy code to clipboard", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "Copy", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Toggle word wrap", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Expand sidebar category '{label}'", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Collapse sidebar category '{label}'", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.NavBar.navAriaLabel": { + "message": "Main", + "description": "The ARIA label for the main navigation" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Languages", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "On this page", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.NotFound.p1": { + "message": "We could not find what you were looking for.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Please contact the owner of the site that linked you to the original URL and let them know their link is broken.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.blog.post.readMore": { + "message": "Read More", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "Read more about {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "One min read|{readingTime} min read", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.breadcrumbs.home": { + "message": "Home page", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Collapse sidebar", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Collapse sidebar", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Docs sidebar", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Close navigation bar", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Back to main menu", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Toggle navigation bar", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Expand sidebar", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Try again", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "Skip to main content", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "Tags", + "description": "The title of the tag list page" + }, + "theme.unlistedContent.title": { + "message": "Unlisted page", + "description": "The unlisted content banner title" + }, + "theme.unlistedContent.message": { + "message": "This page is unlisted. Search engines will not index it, and only users having a direct link can access it.", + "description": "The unlisted content banner message" + } +} diff --git a/i18n/en/code.json.license b/i18n/en/code.json.license new file mode 100644 index 0000000..4ef929e --- /dev/null +++ b/i18n/en/code.json.license @@ -0,0 +1,6 @@ +Copyright (c) Facebook, Inc. and its affiliates. +Copyright (c) 2024 Kristóf Marussy + +SPDX-License-Identifier: MIT + +Parts of this file are automatically generated by `yarn write-translations`. diff --git a/i18n/en/docusaurus-plugin-content-blog/options.json b/i18n/en/docusaurus-plugin-content-blog/options.json new file mode 100644 index 0000000..9239ff7 --- /dev/null +++ b/i18n/en/docusaurus-plugin-content-blog/options.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "Blog", + "description": "The title for the blog used in SEO" + }, + "description": { + "message": "Blog", + "description": "The description for the blog used in SEO" + }, + "sidebar.title": { + "message": "Recent posts", + "description": "The label for the left sidebar" + } +} diff --git a/i18n/en/docusaurus-plugin-content-blog/options.json.license b/i18n/en/docusaurus-plugin-content-blog/options.json.license new file mode 100644 index 0000000..cb0715d --- /dev/null +++ b/i18n/en/docusaurus-plugin-content-blog/options.json.license @@ -0,0 +1,5 @@ +SPDX-FileCopyrightText: 2024 Kristóf Marussy + +SPDX-License-Identifier: MIT + +Parts of this file are automatically generated by `yarn write-translations`. diff --git a/i18n/en/docusaurus-theme-classic/footer.json b/i18n/en/docusaurus-theme-classic/footer.json new file mode 100644 index 0000000..6d3d635 --- /dev/null +++ b/i18n/en/docusaurus-theme-classic/footer.json @@ -0,0 +1,22 @@ +{ + "link.title.Pages": { + "message": "Pages", + "description": "The title of the footer links column with title=Pages in the footer" + }, + "link.item.label.About": { + "message": "About", + "description": "The label of footer link with label=About linking to /" + }, + "link.item.label.Blog": { + "message": "Blog", + "description": "The label of footer link with label=Blog linking to /blog" + }, + "link.item.label.Tags": { + "message": "Tags", + "description": "The label of footer link with label=Tags linking to /tags" + }, + "copyright": { + "message": "Built with ❤︎ and Docusaurus.", + "description": "The footer copyright" + } +} diff --git a/i18n/en/docusaurus-theme-classic/footer.json.license b/i18n/en/docusaurus-theme-classic/footer.json.license new file mode 100644 index 0000000..cb0715d --- /dev/null +++ b/i18n/en/docusaurus-theme-classic/footer.json.license @@ -0,0 +1,5 @@ +SPDX-FileCopyrightText: 2024 Kristóf Marussy + +SPDX-License-Identifier: MIT + +Parts of this file are automatically generated by `yarn write-translations`. diff --git a/i18n/en/docusaurus-theme-classic/navbar.json b/i18n/en/docusaurus-theme-classic/navbar.json new file mode 100644 index 0000000..be85568 --- /dev/null +++ b/i18n/en/docusaurus-theme-classic/navbar.json @@ -0,0 +1,30 @@ +{ + "title": { + "message": "Kristóf Marussy", + "description": "The title in the navbar" + }, + "item.label.About": { + "message": "About", + "description": "Navbar item with label About" + }, + "item.label.Blog": { + "message": "Blog", + "description": "Navbar item with label Blog" + }, + "item.label.Research": { + "message": "Research", + "description": "Navbar item with label Research" + }, + "item.label.Publications": { + "message": "Publications", + "description": "Navbar item with label Publications" + }, + "item.label.Resume": { + "message": "Resume", + "description": "Navbar item with label Resume" + }, + "item.label.Contact": { + "message": "Contact", + "description": "Navbar item with label Contact" + } +} diff --git a/i18n/en/docusaurus-theme-classic/navbar.json.license b/i18n/en/docusaurus-theme-classic/navbar.json.license new file mode 100644 index 0000000..cb0715d --- /dev/null +++ b/i18n/en/docusaurus-theme-classic/navbar.json.license @@ -0,0 +1,5 @@ +SPDX-FileCopyrightText: 2024 Kristóf Marussy + +SPDX-License-Identifier: MIT + +Parts of this file are automatically generated by `yarn write-translations`. diff --git a/package.json b/package.json index fc56b75..d4fd289 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@docusaurus/theme-common": "^3.1.1", "@docusaurus/utils": "^3.1.1", "@mdx-js/react": "^3.0.1", - "@phosphor-icons/react": "2.1.3", + "@phosphor-icons/react": "2.0.15", "@swc/core": "^1.4.8", "clsx": "^2.1.0", "compression-webpack-plugin": "^11.1.0", @@ -43,7 +43,7 @@ "react-dom": "^18.2.0", "remark-smartypants": "^2.1.0", "responsive-loader": "^3.1.2", - "sharp": "^0.33.2", + "sharp": "^0.33.3", "simple-icons": "^11.9.0", "swc-loader": "^0.2.6", "terser-webpack-plugin": "^5.3.10", @@ -55,7 +55,7 @@ "@docusaurus/types": "^3.1.1", "@types/babel__core": "^7.20.5", "@types/node": "^20.11.30", - "@types/react": "^18.2.67", + "@types/react": "^18.2.69", "cross-env": "^7.0.3", "prettier": "^3.2.5", "typescript": "^5.4.3" diff --git a/src/components/ActiveSectionProvider.tsx b/src/components/ActiveSectionProvider.tsx index 022dbad..0d491ac 100644 --- a/src/components/ActiveSectionProvider.tsx +++ b/src/components/ActiveSectionProvider.tsx @@ -46,7 +46,7 @@ export default function ActiveSectionProvider({ if (hash === lastHashRef.current) { return; } - // Passing `undefined` to `hash` will give contraol pack to react-router. + // Passing `undefined` to `hash` will give control back to react-router. const newURL = `${location.pathname}${location.search}${ hash ?? location.hash }`; diff --git a/src/components/Landing.tsx b/src/components/Landing.tsx new file mode 100644 index 0000000..5eac99b --- /dev/null +++ b/src/components/Landing.tsx @@ -0,0 +1,31 @@ +/* + * SPDX-FileCopyrightText: 2023 Kristóf Marussy + * + * SPDX-License-Identifier: MIT + */ + +import type { Props } from '@theme/BlogListPage'; +import Layout from '@theme/Layout'; + +import Blog from './landing/sections/Blog'; +import Contact from './landing/sections/Contact'; +import Hero from './landing/sections/Hero'; +import Publications from './landing/sections/Publications'; +import Research from './landing/sections/Research'; +import Resume from './landing/sections/Resume'; +import TrackActiveSection from './TrackActiveSection'; + +export default function Home(props: Props) { + return ( + + + + + + + + + + + ); +} diff --git a/src/components/landing/sections/Blog.module.css b/src/components/landing/sections/Blog.module.css new file mode 100644 index 0000000..6a38a97 --- /dev/null +++ b/src/components/landing/sections/Blog.module.css @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2024 Kristóf Marussy + * + * SPDX-License-Identifier: MIT + */ + +.row { + margin-bottom: var(--ifm-paragraph-margin-bottom); +} + +.recent-posts { + margin-bottom: 0; + font-size: var(--ifm-h3-font-size); + font-weight: var(--ifm-font-weight-bold); + --casl: 0.5; + letter-spacing: var(--marussy-heading-tracking); +} + +.date { + font-size: 1rem; + font-weight: var(--ifm-font-weight-normal); + --casl: 0; + letter-spacing: 0; +} + +.prev::after { + content: ' »'; +} diff --git a/src/components/landing/sections/Blog.tsx b/src/components/landing/sections/Blog.tsx new file mode 100644 index 0000000..3ac87db --- /dev/null +++ b/src/components/landing/sections/Blog.tsx @@ -0,0 +1,95 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) 2024 Kristóf Marussy + * + * SPDX-License-Identifier: MIT + */ + +import Link from '@docusaurus/Link'; +import type { Props } from '@theme/BlogListPage'; +import type { Content } from '@theme/BlogPostPage'; +import Translate from '@docusaurus/Translate'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import clsx from 'clsx'; + +import Section from '@site/src/components/landing/Section'; +import Subtitle from '@site/src/components/landing/Subtitle'; + +import styles from './Blog.module.css'; +import React from 'react'; + +const columnLength = 5; + +function Column({ + items, +}: { + items: { readonly content: Content }[]; +}): React.ReactNode { + // Date time format based on + // https://github.com/facebook/docusaurus/blob/6f17d5493877ba38d8b4e0b0d468f44401375c30/packages/docusaurus-theme-common/src/utils/IntlUtils.ts + const { + i18n: { currentLocale, localeConfigs }, + } = useDocusaurusContext(); + const calendar = localeConfigs[currentLocale]!.calendar; + const dateTimeFormat = new Intl.DateTimeFormat(currentLocale, { + calendar, + day: 'numeric', + month: 'long', + year: 'numeric', + timeZone: 'UTC', + }); + + if (items.length === 0) { + return null; + } + + return ( +
+
    + {items.map(({ content }) => ( +
  • + + {content.metadata.title} + {' '} + + on {dateTimeFormat.format(new Date(content.metadata.date))} + +
  • + ))} +
+
+ ); +} + +export default function Blog(props: Props) { + const { + items, + metadata: { nextPage }, + } = props; + const columnLength = Math.max(1, Math.ceil(items.length / 2)); + return ( +
+
+
+ Recent posts +
+
+ + +
+ {nextPage && ( +

+ + + Older Entries + + +

+ )} +
+
+ ); +} diff --git a/src/components/landing/sections/Hero.module.css b/src/components/landing/sections/Hero.module.css index 67e7d54..0d0e16e 100644 --- a/src/components/landing/sections/Hero.module.css +++ b/src/components/landing/sections/Hero.module.css @@ -11,7 +11,7 @@ --ifm-link-hover-color: var(--ifm-link-color); } -@media (max-width: 996px) { +@media (max-width: 576px) { .hero { padding-top: 2rem; padding-bottom: 0; @@ -65,11 +65,17 @@ font-family: var(--ifm-heading-font-family); font-weight: var(--ifm-heading-font-weight); --casl: 1; - font-size: 2.5rem; + font-size: 3rem; letter-spacing: var(--marussy-heading-tracking); white-space: pre; } +@media (max-width: 576px) { + .introduction__name { + font-size: 2.5rem; + } +} + .cta { display: flex; flex-direction: row; diff --git a/src/css/custom.css b/src/css/custom.css index c2cda19..bd6e179 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -84,11 +84,13 @@ kbd { h1, h2, +.markdown > h3, .button { --casl: 1; } -h3 { +h3, +.markdown > h4 { --casl: 0.5; } @@ -107,3 +109,7 @@ h3 { --casl: 0; --mono: 1; } + +.hero__subtitle { + font-weight: 500; +} diff --git a/src/pages/index.tsx b/src/pages/index.tsx deleted file mode 100644 index 60f86ca..0000000 --- a/src/pages/index.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 Kristóf Marussy - * - * SPDX-License-Identifier: MIT - */ - -import Layout from '@theme/Layout'; - -import Contact from '@site/src/components/landing/sections/Contact'; -import Hero from '@site/src/components/landing/sections/Hero'; -import Publications from '@site/src/components/landing/sections/Publications'; -import Research from '@site/src/components/landing/sections/Research'; -import Resume from '@site/src/components/landing/sections/Resume'; -import TrackActiveSection from '@site/src/components/TrackActiveSection'; - -export default function Home() { - return ( - - - - - - - - - - ); -} diff --git a/src/plugins/compressionPlugin.ts b/src/plugins/compressionPlugin.ts index 7b9feeb..a5bc402 100644 --- a/src/plugins/compressionPlugin.ts +++ b/src/plugins/compressionPlugin.ts @@ -20,10 +20,9 @@ const test = /\.(js|css|svg|txt)$/; export default function compressionPlugin(): Plugin { return { name: 'marussy-compression-plugin', - configureWebpack: (_config, isServer) => - isServer - ? {} - : { + configureWebpack: ({ mode }) => + mode === 'production' + ? { plugins: [ new CompressionPlugin({ test, @@ -39,6 +38,7 @@ export default function compressionPlugin(): Plugin { minRatio, }), ], - }, + } + : {}, }; } diff --git a/src/theme/BlogListPage.tsx b/src/theme/BlogListPage.tsx new file mode 100644 index 0000000..b8c7e01 --- /dev/null +++ b/src/theme/BlogListPage.tsx @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2024 Kristóf Marussy + * + * SPDX-License-Identifier: MIT + */ + +import React from 'react'; +import type { Props } from '@theme/BlogListPage'; +import BlogListPage from '@theme-original/BlogListPage'; + +import Landing from '@site/src/components/Landing'; + +export default function BlogListPageWrapper(props: Props) { + if (props.metadata.permalink === '/') { + return ; + } + return ; +} diff --git a/src/theme/BlogSidebar/Desktop.module.css b/src/theme/BlogSidebar/Desktop.module.css new file mode 100644 index 0000000..4bac5ba --- /dev/null +++ b/src/theme/BlogSidebar/Desktop.module.css @@ -0,0 +1,53 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) 2024 Kristóf Marussy + * + * SPDX-License-Identifier: MIT + * + * This file was derived from + * https://github.com/facebook/docusaurus/blob/6f17d5493877ba38d8b4e0b0d468f44401375c30/packages/docusaurus-theme-classic/src/theme/BlogSidebar/Desktop/styles.module.css + * via the `swizzle` mechanism of Docusaurus. + * + * It was modified to change the sidebar title styling. + */ + +.sidebar { + max-height: calc(100vh - (var(--ifm-navbar-height) + 2rem)); + overflow-y: auto; + position: sticky; + top: calc(var(--ifm-navbar-height) + 2rem); +} + +.sidebarItemTitle { + font-size: 1.5rem; + font-weight: var(--ifm-font-weight-bold); + --casl: 1; + letter-spacing: var(--marussy-heading-tracking); +} + +.sidebarItemList { + font-size: 0.9rem; +} + +.sidebarItem { + margin-top: 0.7rem; +} + +.sidebarItemLink { + color: var(--ifm-font-color-base); + display: block; +} + +.sidebarItemLink:hover { + text-decoration: none; +} + +.sidebarItemLinkActive { + color: var(--ifm-color-primary) !important; +} + +@media (max-width: 996px) { + .sidebar { + display: none; + } +} diff --git a/src/theme/BlogSidebar/Desktop.tsx b/src/theme/BlogSidebar/Desktop.tsx new file mode 100644 index 0000000..d06f239 --- /dev/null +++ b/src/theme/BlogSidebar/Desktop.tsx @@ -0,0 +1,55 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) 2024 Kristóf Marussy + * + * SPDX-License-Identifier: MIT + * + * This file was derived from + * https://github.com/facebook/docusaurus/blob/6f17d5493877ba38d8b4e0b0d468f44401375c30/packages/docusaurus-theme-classic/src/theme/BlogSidebar/Desktop/index.tsx + * via the `swizzle` mechanism of Docusaurus. + * + * It was modified to change the sidebar title styling. + */ + +import Link from '@docusaurus/Link'; +import { translate } from '@docusaurus/Translate'; +import { useVisibleBlogSidebarItems } from '@docusaurus/theme-common/internal'; +import type { Props } from '@theme/BlogSidebar/Desktop'; +import React from 'react'; +import clsx from 'clsx'; + +import styles from './Desktop.module.css'; + +export default function BlogSidebarDesktop({ sidebar }: Props) { + const items = useVisibleBlogSidebarItems(sidebar.items); + return ( + + ); +} diff --git a/src/theme/Footer/Copyright.jsx b/src/theme/Footer/Copyright.jsx deleted file mode 100644 index 648bd42..0000000 --- a/src/theme/Footer/Copyright.jsx +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * Copyright (c) 2024 Kristóf Marussy - * - * SPDX-License-Identifier: MIT - * - * This file was derived from - * https://github.com/facebook/docusaurus/blob/c745021b01a8b88d34e1d772278d7171ad8acdf5/packages/docusaurus-theme-classic/src/theme/Footer/Copyright/index.tsx - * via the `swizzle` mechanism of Docusaurus. - * - * It was modified to embed JSX content directly in the footer. - */ - -import Link from '@docusaurus/Link'; -import clsx from 'clsx'; -import React from 'react'; - -import { CCLicenseLink, LicenseLink } from '@site/src/components/licenses'; - -import styles from './Copyright.module.css'; - -export default function FooterCopyright({ copyright }) { - return ( -
- Most content on this site is{' '} - - CC-BY-4.0 - - . The{' '} - - code for this site - {' '} - is{' '} - - MIT - - .
- -
- ); -} diff --git a/src/theme/Footer/Copyright.tsx b/src/theme/Footer/Copyright.tsx new file mode 100644 index 0000000..3125c05 --- /dev/null +++ b/src/theme/Footer/Copyright.tsx @@ -0,0 +1,50 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) 2024 Kristóf Marussy + * + * SPDX-License-Identifier: MIT + * + * This file was derived from + * https://github.com/facebook/docusaurus/blob/cc0bceab9c1678303f6237f5526753edc1b12fc3/packages/docusaurus-theme-classic/src/theme/Footer/Copyright/index.tsx + * via the `swizzle` mechanism of Docusaurus. + * + * It was modified to embed JSX content directly in the footer. + */ + +import Link from '@docusaurus/Link'; +import type { Props } from '@theme/Footer/Copyright'; +import clsx from 'clsx'; +import React from 'react'; + +import { CCLicenseLink, LicenseLink } from '@site/src/components/licenses'; + +import styles from './Copyright.module.css'; + +export default function FooterCopyright({ copyright }: Props) { + return ( +
+ Most content on this site is{' '} + + CC-BY-4.0 + + . The{' '} + + code for this site + {' '} + is{' '} + + MIT + + .
+ +
+ ); +} diff --git a/src/theme/NavbarItem/NavbarNavLink.jsx b/src/theme/NavbarItem/NavbarNavLink.jsx deleted file mode 100644 index 81de931..0000000 --- a/src/theme/NavbarItem/NavbarNavLink.jsx +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * Copyright (c) 2023 Kristóf Marussy - * - * SPDX-License-Identifier: MIT - * - * This file was derived from - * https://github.com/facebook/docusaurus/blob/c745021b01a8b88d34e1d772278d7171ad8acdf5/packages/docusaurus-theme-classic/src/theme/NavbarItem/NavbarNavLink.tsx - * via the `swizzle` mechanism of Docusaurus. - * - * It was modified to correctly track the change of the active anchor - * when `setHash` from `@site/src/components/ActiveSectionProvider` is called. - */ - -import React from 'react'; -import Link from '@docusaurus/Link'; -import useBaseUrl from '@docusaurus/useBaseUrl'; -import isInternalUrl from '@docusaurus/isInternalUrl'; -import { isRegexpStringMatch } from '@docusaurus/theme-common'; -import IconExternalLink from '@theme/Icon/ExternalLink'; -import { useActiveSection } from '@site/src/components/ActiveSectionProvider'; - -export default function NavbarNavLink({ - activeBasePath, - activeBaseRegex, - to, - href, - label, - html, - isDropdownLink, - prependBaseUrlToHref, - ...props -}) { - const { hash: activeSectionHash } = useActiveSection(); - // TODO all this seems hacky - // {to: 'version'} should probably be forbidden, in favor of {to: '/version'} - const toUrl = useBaseUrl(to); - // Check whether the target URL has a hash. - const hashMatch = toUrl?.match(/#.+$/); - const activeBaseUrl = useBaseUrl(activeBasePath); - const normalizedHref = useBaseUrl(href, { forcePrependBaseUrl: true }); - const isExternalLink = label && href && !isInternalUrl(href); - // Link content is set through html XOR label - const linkContentProps = html - ? { dangerouslySetInnerHTML: { __html: html } } - : { - children: ( - <> - {label} - {isExternalLink && ( - - )} - - ), - }; - if (href) { - return ( - - ); - } - return ( - { - if (activeBaseRegex) { - return isRegexpStringMatch(activeBaseRegex, location.pathname); - } - if (activeBaseUrl) { - return location.pathname.startsWith(activeBaseUrl); - } - // Make sure to only highlight links with a hash when hash also matches. - return ( - !hashMatch || hashMatch[0] === (activeSectionHash ?? location.hash) - ); - }, - })} - {...props} - {...linkContentProps} - /> - ); -} diff --git a/src/theme/NavbarItem/NavbarNavLink.tsx b/src/theme/NavbarItem/NavbarNavLink.tsx new file mode 100644 index 0000000..a9d7b04 --- /dev/null +++ b/src/theme/NavbarItem/NavbarNavLink.tsx @@ -0,0 +1,91 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * Copyright (c) 2023 Kristóf Marussy + * + * SPDX-License-Identifier: MIT + * + * This file was derived from + * https://github.com/facebook/docusaurus/blob/c745021b01a8b88d34e1d772278d7171ad8acdf5/packages/docusaurus-theme-classic/src/theme/NavbarItem/NavbarNavLink.tsx + * via the `swizzle` mechanism of Docusaurus. + * + * It was modified to correctly track the change of the active anchor + * when `setHash` from `@site/src/components/ActiveSectionProvider` is called. + */ + +import React from 'react'; +import Link from '@docusaurus/Link'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import isInternalUrl from '@docusaurus/isInternalUrl'; +import { isRegexpStringMatch } from '@docusaurus/theme-common'; +import IconExternalLink from '@theme/Icon/ExternalLink'; +import type { Props } from '@theme/NavbarItem/NavbarNavLink'; + +import { useActiveSection } from '@site/src/components/ActiveSectionProvider'; + +export default function NavbarNavLink({ + activeBasePath, + activeBaseRegex, + to, + href, + label, + html, + isDropdownLink, + prependBaseUrlToHref, + ...props +}: Props) { + const { hash: activeSectionHash } = useActiveSection(); + // TODO all this seems hacky + // {to: 'version'} should probably be forbidden, in favor of {to: '/version'} + const toUrl = useBaseUrl(to); + // Check whether the target URL has a hash. + const hashMatch = toUrl?.match(/#.+$/); + const activeBaseUrl = useBaseUrl(activeBasePath); + const normalizedHref = useBaseUrl(href, { forcePrependBaseUrl: true }); + const isExternalLink = label && href && !isInternalUrl(href); + // Link content is set through html XOR label + const linkContentProps = html + ? { dangerouslySetInnerHTML: { __html: html } } + : { + children: ( + <> + {label} + {isExternalLink && ( + + )} + + ), + }; + if (href) { + return ( + + ); + } + return ( + { + if (activeBaseRegex) { + return isRegexpStringMatch(activeBaseRegex, location.pathname); + } + if (activeBaseUrl) { + return location.pathname.startsWith(activeBaseUrl); + } + // Make sure to only highlight links with a hash when hash also matches. + return ( + !hashMatch || hashMatch[0] === (activeSectionHash ?? location.hash) + ); + }, + })} + {...props} + {...linkContentProps} + /> + ); +} diff --git a/src/theme/PaginatorNavLink.tsx b/src/theme/PaginatorNavLink.tsx new file mode 100644 index 0000000..d0f03f7 --- /dev/null +++ b/src/theme/PaginatorNavLink.tsx @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2024 Kristóf Marussy + * + * SPDX-License-Identifier: MIT + */ + +import React from 'react'; +import type { Props } from '@theme/PaginatorNavLink'; +import PaginatorNavLink from '@theme-original/PaginatorNavLink'; + +export default function PaginatorNavLinkWrapper(props: Props) { + const modifiedProps = { ...props }; + if (modifiedProps.permalink === '/') { + modifiedProps.permalink = '/#blog'; + } + return ; +} diff --git a/src/theme/Root.tsx b/src/theme/Root.tsx index 9459e9f..32462bb 100644 --- a/src/theme/Root.tsx +++ b/src/theme/Root.tsx @@ -4,14 +4,25 @@ * SPDX-License-Identifier: MIT */ +import Head from '@docusaurus/Head'; import type { Props } from '@theme/Root'; import Root from '@theme-original/Root'; import ActiveSectionProvider from '@site/src/components/ActiveSectionProvider'; +import fontURL from '@site/src/fonts/recursive-latin.woff2?url'; export default function RootWrapper(props: Props) { return ( + + + ); diff --git a/src/theme/SiteMetadata.jsx b/src/theme/SiteMetadata.jsx deleted file mode 100644 index 1639677..0000000 --- a/src/theme/SiteMetadata.jsx +++ /dev/null @@ -1,28 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2024 Kristóf Marussy - * - * SPDX-License-Identifier: MIT - */ - -import Head from '@docusaurus/Head'; - -import SiteMetadata from '@theme-original/SiteMetadata'; - -import fontURL from '@site/src/fonts/recursive-latin.woff2?url'; - -export default function SiteMetadataWrapper(props) { - return ( - <> - - - - - - ); -} diff --git a/third-party b/third-party index 21568f2..432b24c 160000 --- a/third-party +++ b/third-party @@ -1 +1 @@ -Subproject commit 21568f2c77a591823103044a2f9e36e04732d8ba +Subproject commit 432b24cad20c076a9fdf267c4aafe76577a8c4c4 diff --git a/yarn.lock b/yarn.lock index b957685..7d43d9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1895,12 +1895,12 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^0.45.0": - version: 0.45.0 - resolution: "@emnapi/runtime@npm:0.45.0" +"@emnapi/runtime@npm:^1.1.0": + version: 1.1.0 + resolution: "@emnapi/runtime@npm:1.1.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/c83052b05efb7147c256bfbb69214c9642fef1dce8d7d901e0314a7b2d2dcd14e1cd75502c6565004847e552658e9913a7e58889c7dca92e240173032f1db5d5 + checksum: 10c0/2f8bbcc75e490d92dba65341ba1275e651ad552ecbf4371ef4f156d9a69a216918ece671057b7c7c057e8b410b28946fafcb03cfb9cf0baed5f78cf32468aa67 languageName: node linkType: hard @@ -1920,11 +1920,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-darwin-arm64@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-darwin-arm64@npm:0.33.2" +"@img/sharp-darwin-arm64@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-darwin-arm64@npm:0.33.3" dependencies: - "@img/sharp-libvips-darwin-arm64": "npm:1.0.1" + "@img/sharp-libvips-darwin-arm64": "npm:1.0.2" dependenciesMeta: "@img/sharp-libvips-darwin-arm64": optional: true @@ -1932,11 +1932,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-darwin-x64@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-darwin-x64@npm:0.33.2" +"@img/sharp-darwin-x64@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-darwin-x64@npm:0.33.3" dependencies: - "@img/sharp-libvips-darwin-x64": "npm:1.0.1" + "@img/sharp-libvips-darwin-x64": "npm:1.0.2" dependenciesMeta: "@img/sharp-libvips-darwin-x64": optional: true @@ -1944,67 +1944,67 @@ __metadata: languageName: node linkType: hard -"@img/sharp-libvips-darwin-arm64@npm:1.0.1": - version: 1.0.1 - resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.1" +"@img/sharp-libvips-darwin-arm64@npm:1.0.2": + version: 1.0.2 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@img/sharp-libvips-darwin-x64@npm:1.0.1": - version: 1.0.1 - resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.1" +"@img/sharp-libvips-darwin-x64@npm:1.0.2": + version: 1.0.2 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@img/sharp-libvips-linux-arm64@npm:1.0.1": - version: 1.0.1 - resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.1" +"@img/sharp-libvips-linux-arm64@npm:1.0.2": + version: 1.0.2 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-arm@npm:1.0.1": - version: 1.0.1 - resolution: "@img/sharp-libvips-linux-arm@npm:1.0.1" +"@img/sharp-libvips-linux-arm@npm:1.0.2": + version: 1.0.2 + resolution: "@img/sharp-libvips-linux-arm@npm:1.0.2" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-s390x@npm:1.0.1": - version: 1.0.1 - resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.1" +"@img/sharp-libvips-linux-s390x@npm:1.0.2": + version: 1.0.2 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-x64@npm:1.0.1": - version: 1.0.1 - resolution: "@img/sharp-libvips-linux-x64@npm:1.0.1" +"@img/sharp-libvips-linux-x64@npm:1.0.2": + version: 1.0.2 + resolution: "@img/sharp-libvips-linux-x64@npm:1.0.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.1": - version: 1.0.1 - resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.1" +"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.2": + version: 1.0.2 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@img/sharp-libvips-linuxmusl-x64@npm:1.0.1": - version: 1.0.1 - resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.1" +"@img/sharp-libvips-linuxmusl-x64@npm:1.0.2": + version: 1.0.2 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@img/sharp-linux-arm64@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-linux-arm64@npm:0.33.2" +"@img/sharp-linux-arm64@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-linux-arm64@npm:0.33.3" dependencies: - "@img/sharp-libvips-linux-arm64": "npm:1.0.1" + "@img/sharp-libvips-linux-arm64": "npm:1.0.2" dependenciesMeta: "@img/sharp-libvips-linux-arm64": optional: true @@ -2012,11 +2012,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-arm@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-linux-arm@npm:0.33.2" +"@img/sharp-linux-arm@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-linux-arm@npm:0.33.3" dependencies: - "@img/sharp-libvips-linux-arm": "npm:1.0.1" + "@img/sharp-libvips-linux-arm": "npm:1.0.2" dependenciesMeta: "@img/sharp-libvips-linux-arm": optional: true @@ -2024,11 +2024,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-s390x@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-linux-s390x@npm:0.33.2" +"@img/sharp-linux-s390x@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-linux-s390x@npm:0.33.3" dependencies: - "@img/sharp-libvips-linux-s390x": "npm:1.0.1" + "@img/sharp-libvips-linux-s390x": "npm:1.0.2" dependenciesMeta: "@img/sharp-libvips-linux-s390x": optional: true @@ -2036,11 +2036,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-x64@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-linux-x64@npm:0.33.2" +"@img/sharp-linux-x64@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-linux-x64@npm:0.33.3" dependencies: - "@img/sharp-libvips-linux-x64": "npm:1.0.1" + "@img/sharp-libvips-linux-x64": "npm:1.0.2" dependenciesMeta: "@img/sharp-libvips-linux-x64": optional: true @@ -2048,11 +2048,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-arm64@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.2" +"@img/sharp-linuxmusl-arm64@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.3" dependencies: - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.1" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.2" dependenciesMeta: "@img/sharp-libvips-linuxmusl-arm64": optional: true @@ -2060,11 +2060,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-x64@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-linuxmusl-x64@npm:0.33.2" +"@img/sharp-linuxmusl-x64@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-linuxmusl-x64@npm:0.33.3" dependencies: - "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.1" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.2" dependenciesMeta: "@img/sharp-libvips-linuxmusl-x64": optional: true @@ -2072,25 +2072,25 @@ __metadata: languageName: node linkType: hard -"@img/sharp-wasm32@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-wasm32@npm:0.33.2" +"@img/sharp-wasm32@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-wasm32@npm:0.33.3" dependencies: - "@emnapi/runtime": "npm:^0.45.0" + "@emnapi/runtime": "npm:^1.1.0" conditions: cpu=wasm32 languageName: node linkType: hard -"@img/sharp-win32-ia32@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-win32-ia32@npm:0.33.2" +"@img/sharp-win32-ia32@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-win32-ia32@npm:0.33.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@img/sharp-win32-x64@npm:0.33.2": - version: 0.33.2 - resolution: "@img/sharp-win32-x64@npm:0.33.2" +"@img/sharp-win32-x64@npm:0.33.3": + version: 0.33.3 + resolution: "@img/sharp-win32-x64@npm:0.33.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2270,13 +2270,13 @@ __metadata: languageName: node linkType: hard -"@phosphor-icons/react@npm:2.1.3": - version: 2.1.3 - resolution: "@phosphor-icons/react@npm:2.1.3" +"@phosphor-icons/react@npm:2.0.15": + version: 2.0.15 + resolution: "@phosphor-icons/react@npm:2.0.15" peerDependencies: react: ">= 16.8" react-dom: ">= 16.8" - checksum: 10c0/be64fdeeb101911c13c0e9897f00072e55f2eb50c317dd75ae09afca787640d29f18d5a1d006829344128656b2fa7cf165d55c2d3092b94fb26f0a58abbfb0c9 + checksum: 10c0/b7e60e1adb4440e5fa2930d780ff693ed1540da363354ed005e8d8690b3a94f40e5c3cd62c411b8bbcd847d623e4722bdb1d8a9a372cb9474a087d4794adad78 languageName: node linkType: hard @@ -3069,14 +3069,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^18.2.67": - version: 18.2.67 - resolution: "@types/react@npm:18.2.67" +"@types/react@npm:*, @types/react@npm:^18.2.69": + version: 18.2.69 + resolution: "@types/react@npm:18.2.69" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/d8c49476ca8c96cbbcd8b1fd1bf881396dbf548fdadb0b6463d0bb262e5013e0a239994842d09e74f9c21dcaf620555bc1f1485f8578b0498af87bc06291f5a2 + checksum: 10c0/239b947ed8576a271057a6f571d0967098074b101a2bece244e88093dc8fb2f020872c463b8e78b2049334ba99158f6eef5960e51f73a389f86eee39b835d846 languageName: node linkType: hard @@ -4943,10 +4943,10 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.2": - version: 2.0.2 - resolution: "detect-libc@npm:2.0.2" - checksum: 10c0/a9f4ffcd2701525c589617d98afe5a5d0676c8ea82bcc4ed6f3747241b79f781d36437c59a5e855254c864d36a3e9f8276568b6b531c28d6e53b093a15703f11 +"detect-libc@npm:^2.0.3": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 languageName: node linkType: hard @@ -7507,11 +7507,11 @@ __metadata: "@docusaurus/types": "npm:^3.1.1" "@docusaurus/utils": "npm:^3.1.1" "@mdx-js/react": "npm:^3.0.1" - "@phosphor-icons/react": "npm:2.1.3" + "@phosphor-icons/react": "npm:2.0.15" "@swc/core": "npm:^1.4.8" "@types/babel__core": "npm:^7.20.5" "@types/node": "npm:^20.11.30" - "@types/react": "npm:^18.2.67" + "@types/react": "npm:^18.2.69" clsx: "npm:^2.1.0" compression-webpack-plugin: "npm:^11.1.0" cross-env: "npm:^7.0.3" @@ -7521,7 +7521,7 @@ __metadata: react-dom: "npm:^18.2.0" remark-smartypants: "npm:^2.1.0" responsive-loader: "npm:^3.1.2" - sharp: "npm:^0.33.2" + sharp: "npm:^0.33.3" simple-icons: "npm:^11.9.0" swc-loader: "npm:^0.2.6" terser-webpack-plugin: "npm:^5.3.10" @@ -10599,6 +10599,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.0": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 10c0/fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53 + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -10721,32 +10732,32 @@ __metadata: languageName: node linkType: hard -"sharp@npm:^0.33.2": - version: 0.33.2 - resolution: "sharp@npm:0.33.2" - dependencies: - "@img/sharp-darwin-arm64": "npm:0.33.2" - "@img/sharp-darwin-x64": "npm:0.33.2" - "@img/sharp-libvips-darwin-arm64": "npm:1.0.1" - "@img/sharp-libvips-darwin-x64": "npm:1.0.1" - "@img/sharp-libvips-linux-arm": "npm:1.0.1" - "@img/sharp-libvips-linux-arm64": "npm:1.0.1" - "@img/sharp-libvips-linux-s390x": "npm:1.0.1" - "@img/sharp-libvips-linux-x64": "npm:1.0.1" - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.1" - "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.1" - "@img/sharp-linux-arm": "npm:0.33.2" - "@img/sharp-linux-arm64": "npm:0.33.2" - "@img/sharp-linux-s390x": "npm:0.33.2" - "@img/sharp-linux-x64": "npm:0.33.2" - "@img/sharp-linuxmusl-arm64": "npm:0.33.2" - "@img/sharp-linuxmusl-x64": "npm:0.33.2" - "@img/sharp-wasm32": "npm:0.33.2" - "@img/sharp-win32-ia32": "npm:0.33.2" - "@img/sharp-win32-x64": "npm:0.33.2" +"sharp@npm:^0.33.3": + version: 0.33.3 + resolution: "sharp@npm:0.33.3" + dependencies: + "@img/sharp-darwin-arm64": "npm:0.33.3" + "@img/sharp-darwin-x64": "npm:0.33.3" + "@img/sharp-libvips-darwin-arm64": "npm:1.0.2" + "@img/sharp-libvips-darwin-x64": "npm:1.0.2" + "@img/sharp-libvips-linux-arm": "npm:1.0.2" + "@img/sharp-libvips-linux-arm64": "npm:1.0.2" + "@img/sharp-libvips-linux-s390x": "npm:1.0.2" + "@img/sharp-libvips-linux-x64": "npm:1.0.2" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.2" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.2" + "@img/sharp-linux-arm": "npm:0.33.3" + "@img/sharp-linux-arm64": "npm:0.33.3" + "@img/sharp-linux-s390x": "npm:0.33.3" + "@img/sharp-linux-x64": "npm:0.33.3" + "@img/sharp-linuxmusl-arm64": "npm:0.33.3" + "@img/sharp-linuxmusl-x64": "npm:0.33.3" + "@img/sharp-wasm32": "npm:0.33.3" + "@img/sharp-win32-ia32": "npm:0.33.3" + "@img/sharp-win32-x64": "npm:0.33.3" color: "npm:^4.2.3" - detect-libc: "npm:^2.0.2" - semver: "npm:^7.5.4" + detect-libc: "npm:^2.0.3" + semver: "npm:^7.6.0" dependenciesMeta: "@img/sharp-darwin-arm64": optional: true @@ -10786,7 +10797,7 @@ __metadata: optional: true "@img/sharp-win32-x64": optional: true - checksum: 10c0/4727fcf5e3e680f2f837f897c9fcff765a43a60c802ccb7064ab939b06318695e0d5d900039adb104370c1e675743bba16a514632193cbee64eae522270adc48 + checksum: 10c0/12f5203426595b4e64c807162a6d52358b591d25fbb414a51fe38861584759fba38485be951ed98d15be3dfe21f2def5336f78ca35bf8bbd22d88cc78ca03f2a languageName: node linkType: hard -- cgit v1.2.3-54-g00ecf