aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-04-05 02:24:02 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-04-05 02:45:58 +0200
commit35fff3bf1e33c1366bce66e00c16b74d603881ad (patch)
tree51d53f13fa35072ee5cb1c6a73a3ceb5cc0783cb
parentAdd blog (diff)
downloadblog-35fff3bf1e33c1366bce66e00c16b74d603881ad.tar.gz
blog-35fff3bf1e33c1366bce66e00c16b74d603881ad.tar.zst
blog-35fff3bf1e33c1366bce66e00c16b74d603881ad.zip
First post
-rw-r--r--.prettierignore3
-rw-r--r--blog/2024-03-25-first-post.mdx17
-rw-r--r--blog/2024-04-05/FontFeaturesToggle.module.css49
-rw-r--r--blog/2024-04-05/FontFeaturesToggle.tsx86
-rw-r--r--blog/2024-04-05/VariableAxisProvider.tsx68
-rw-r--r--blog/2024-04-05/VariableAxisSettings.module.css112
-rw-r--r--blog/2024-04-05/VariableAxisSettings.tsx184
-rw-r--r--blog/2024-04-05/VariableAxisSettingsWithFontFeaturesPreview.tsx28
-rw-r--r--blog/2024-04-05/VariableAxisSettingsWithFontFeaturesToggle.module.css39
-rw-r--r--blog/2024-04-05/VariableAxisSettingsWithFontFeaturesToggle.tsx44
-rw-r--r--blog/2024-04-05/VariableAxisSettingsWithToggle.module.css10
-rw-r--r--blog/2024-04-05/VariableAxisSettingsWithToggle.tsx28
-rw-r--r--blog/2024-04-05/recursive-v1.064-opentype_features.pngbin0 -> 595384 bytes
-rw-r--r--blog/2024-04-05/recursive-v1.064-opentype_features.png.license6
-rw-r--r--blog/2024-04-05/variable-css-font-features.mdx322
-rw-r--r--docusaurus.config.ts19
-rw-r--r--package.json37
-rw-r--r--src/components/landing/sections/Contact.module.css2
-rw-r--r--src/css/custom.css32
-rw-r--r--src/plugins/responsiveLoaderPlugin.ts1
-rw-r--r--yarn.lock631
21 files changed, 1414 insertions, 304 deletions
diff --git a/.prettierignore b/.prettierignore
index 4bec27b..4f92f13 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -9,3 +9,6 @@ build/
9node_modules/ 9node_modules/
10.pnp.cjs 10.pnp.cjs
11.pnp.loader.mjs 11.pnp.loader.mjs
12
13# See https://github.com/orgs/mdx-js/discussions/2067
14*.mdx
diff --git a/blog/2024-03-25-first-post.mdx b/blog/2024-03-25-first-post.mdx
deleted file mode 100644
index e612116..0000000
--- a/blog/2024-03-25-first-post.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
1---
2SPDX-FileCopyrightText: 2024 Kristóf Marussy
3SPDX-License-Identifier: CC-BY-4.0
4tags: [css]
5authors: kris
6slug: first-post
7---
8
9# First post
10
11## Section
12
13### Subsection
14
15#### Subsubsection
16
17Testing.
diff --git a/blog/2024-04-05/FontFeaturesToggle.module.css b/blog/2024-04-05/FontFeaturesToggle.module.css
new file mode 100644
index 0000000..45c43c8
--- /dev/null
+++ b/blog/2024-04-05/FontFeaturesToggle.module.css
@@ -0,0 +1,49 @@
1/*
2 * SPDX-FileCopyrightText: 2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7.container {
8 display: flex;
9 flex-direction: row;
10 flex-wrap: wrap;
11 column-gap: 1ch;
12 row-gap: 0;
13 padding-left: 2ch;
14 --mono: 1;
15}
16
17.prefix {
18 margin-left: -2ch;
19}
20
21.property {
22 color: var(--prism-property-color);
23}
24
25.punctuation {
26 color: var(--prism-punctuation-color);
27}
28
29.string {
30 color: var(--prism-string-color);
31}
32
33.number {
34 color: var(--prism-number-color);
35}
36
37.feature {
38 display: flex;
39 flex: 0;
40 flex-direction: row;
41 flex-wrap: nowrap;
42}
43
44.checkbox {
45 display: flex;
46 align-items: center;
47 justify-content: center;
48 width: 3ch;
49}
diff --git a/blog/2024-04-05/FontFeaturesToggle.tsx b/blog/2024-04-05/FontFeaturesToggle.tsx
new file mode 100644
index 0000000..9424748
--- /dev/null
+++ b/blog/2024-04-05/FontFeaturesToggle.tsx
@@ -0,0 +1,86 @@
1/*
2 * SPDX-FileCopyrightText: 2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import clsx from 'clsx';
8import { useId } from 'react';
9
10import styles from './FontFeaturesToggle.module.css';
11
12export const featureNames = ['ss02', 'ss05', 'ss10', 'ss12', 'titl'] as const;
13
14export type FontFeature = (typeof featureNames)[number];
15
16export type FontFeaturesState = Record<FontFeature, boolean>;
17
18export interface FontFeaturesProps {}
19
20function FontFeatureToggle({
21 name,
22 value,
23 setValue,
24 last,
25}: {
26 name: string;
27 value: boolean;
28 setValue?: ((newValue: boolean) => void) | undefined;
29 last: boolean;
30}) {
31 const id = useId();
32 const toggle = () => setValue?.(!value);
33
34 return (
35 <div className={styles.feature}>
36 <label htmlFor={id} className={styles.string}>
37 '{name}'
38 </label>{' '}
39 <div className={styles.checkbox}>
40 <input
41 type="checkbox"
42 id={id}
43 checked={value}
44 disabled={setValue === undefined}
45 onClick={toggle}
46 />{' '}
47 </div>
48 <div onClick={toggle} className={styles.number}>
49 {value ? '1' : '0'}
50 </div>
51 <div className={clsx(styles.punctuation, styles.comma)}>
52 {last ? ';' : ','}
53 </div>
54 </div>
55 );
56}
57
58export default function FontFeaturesToggle({
59 features,
60 setFeatures,
61}: {
62 features: FontFeaturesState;
63 setFeatures?: ((newFeatures: Partial<FontFeaturesState>) => void) | undefined;
64}) {
65 return (
66 <div className={styles.container}>
67 <div className={styles.prefix}>
68 <span className={styles.property}>font-feature-settings</span>
69 <span className={styles.punctuation}>:</span>
70 </div>
71 {featureNames.map((name, i) => (
72 <FontFeatureToggle
73 key={name}
74 name={name}
75 value={features[name]}
76 setValue={
77 setFeatures === undefined
78 ? undefined
79 : (newValue) => setFeatures({ [name]: newValue })
80 }
81 last={i === featureNames.length - 1}
82 />
83 ))}
84 </div>
85 );
86}
diff --git a/blog/2024-04-05/VariableAxisProvider.tsx b/blog/2024-04-05/VariableAxisProvider.tsx
new file mode 100644
index 0000000..bc864b4
--- /dev/null
+++ b/blog/2024-04-05/VariableAxisProvider.tsx
@@ -0,0 +1,68 @@
1/*
2 * SPDX-FileCopyrightText: 2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import { createContext, useCallback, useContext, useState } from 'react';
8
9export interface VariableAxisValue {
10 text: string;
11 wght: number;
12 slnt: number;
13 mono: number;
14 casl: number;
15 crsv: number;
16}
17
18export interface VariableAxisContextValue {
19 axes: VariableAxisValue;
20 setAxes(newValue: Partial<VariableAxisValue>): void;
21}
22
23const VariableAxisContext = createContext<VariableAxisContextValue | undefined>(
24 undefined,
25);
26
27export function useVariableAxes(): VariableAxisContextValue {
28 const value = useContext(VariableAxisContext);
29 if (value === undefined) {
30 throw new Error(
31 'useVariableAxisContext called outside of VariableAxisProvider',
32 );
33 }
34 return value;
35}
36
37export default function VariableAxisProvider({
38 children,
39}: {
40 children: React.ReactNode;
41}): JSX.Element {
42 const [state, setState] = useState<VariableAxisValue>({
43 text: 'Qagl0@',
44 wght: 400,
45 slnt: 0,
46 mono: 0,
47 casl: 0,
48 crsv: 0.5,
49 });
50 const setAxes = useCallback(
51 (newValue: Partial<VariableAxisValue>) => {
52 setState({
53 ...state,
54 ...newValue,
55 });
56 },
57 [state],
58 );
59 const value: VariableAxisContextValue = {
60 axes: state,
61 setAxes,
62 };
63 return (
64 <VariableAxisContext.Provider value={value}>
65 {children}
66 </VariableAxisContext.Provider>
67 );
68}
diff --git a/blog/2024-04-05/VariableAxisSettings.module.css b/blog/2024-04-05/VariableAxisSettings.module.css
new file mode 100644
index 0000000..b37dbd5
--- /dev/null
+++ b/blog/2024-04-05/VariableAxisSettings.module.css
@@ -0,0 +1,112 @@
1/*
2 * SPDX-FileCopyrightText: 2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7.container {
8 display: flex;
9 margin-bottom: var(--ifm-leading);
10 gap: 1rem;
11 flex-wrap: wrap;
12}
13
14.editor__container {
15 flex-grow: 1;
16 position: relative;
17 overflow: hidden;
18 font-size: 3rem;
19}
20
21.editor,
22.editor__spacer {
23 padding: 0 0.25rem;
24}
25
26.editor__spacer {
27 visibility: hidden;
28 /* Leave space for the bottom border of the editing area. */
29 margin-bottom: 1px;
30 /* 'titl' takes up a bit more space in proportional font. */
31 font-feature-settings: 'titl' !important;
32}
33
34.editor__spacer--2 {
35 margin-top: calc(-1em * var(--ifm-line-height-base) + 1px);
36 --mono: 1;
37}
38
39.editor {
40 position: absolute;
41 top: 50%;
42 left: 50%;
43 transform: translate(-50%, -50%);
44 border-bottom: 1px solid var(--ifm-color-emphasis-600);
45}
46
47[data-theme='dark'] .editor {
48 border-bottom-color: var(--ifm-color-emphasis-400);
49}
50
51.editor:focus {
52 background: var(--ifm-code-background);
53 border-bottom-color: var(--ifm-font-color-base);
54}
55
56.code {
57 flex-grow: 1000;
58 padding: var(--ifm-pre-padding);
59 border-radius: var(--ifm-code-border-radius);
60 container-type: inline-size;
61 flex-basis: calc(2 * var(--ifm-pre-padding) + 360px);
62 box-shadow: var(--ifm-global-shadow-lw);
63}
64
65.sliders {
66 max-width: 100%;
67 display: grid;
68 grid-template-columns: max-content 1fr 5ch;
69 column-gap: 0.5em;
70}
71
72.label {
73 color: var(--prism-variable-color);
74 --mono: 1;
75}
76
77.label--property {
78 color: var(--prism-property-color);
79}
80
81.slider {
82 min-width: 0;
83}
84
85.label::after {
86 content: ':';
87 color: var(--prism-punctuation-color);
88}
89
90.value {
91 color: var(--prism-number-color);
92 --mono: 1;
93}
94
95.value::after {
96 content: ';';
97 color: var(--prism-punctuation-color);
98}
99
100@container (max-width: 360px) {
101 .sliders {
102 grid-template-columns: 1fr 5ch;
103 }
104
105 .label {
106 grid-column: 1 / span 2;
107 }
108}
109
110.no-features {
111 font-feature-settings: normal !important;
112}
diff --git a/blog/2024-04-05/VariableAxisSettings.tsx b/blog/2024-04-05/VariableAxisSettings.tsx
new file mode 100644
index 0000000..b288767
--- /dev/null
+++ b/blog/2024-04-05/VariableAxisSettings.tsx
@@ -0,0 +1,184 @@
1/*
2 * SPDX-FileCopyrightText: 2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import clsx from 'clsx';
8import { useEffect, useId, useState } from 'react';
9import { usePrismTheme } from '@docusaurus/theme-common';
10
11import {
12 type VariableAxisValue,
13 useVariableAxes,
14} from './VariableAxisProvider';
15import styles from './VariableAxisSettings.module.css';
16
17function PreviewEditor({
18 editorClassName,
19}: {
20 editorClassName?: string | undefined;
21}) {
22 const {
23 axes: { text, wght, slnt, mono, casl, crsv },
24 setAxes,
25 } = useVariableAxes();
26 const [editor, setEditor] = useState<HTMLDivElement | null>(null);
27 useEffect(() => {
28 if (editor !== null && editor.textContent !== text) {
29 editor.textContent = text;
30 }
31 }, [editor, text]);
32
33 return (
34 <div className={styles.editor__container}>
35 <div aria-hidden="true" className={styles.editor__spacer}>
36 {text}
37 </div>
38 <div
39 aria-hidden="true"
40 className={clsx(styles.editor__spacer, styles['editor__spacer--2'])}
41 >
42 {text}
43 </div>
44 <div
45 contentEditable
46 suppressContentEditableWarning
47 spellCheck={false}
48 onInput={(event) => setAxes({ text: event.currentTarget.textContent })}
49 ref={setEditor}
50 className={clsx(styles.editor, editorClassName)}
51 style={
52 {
53 fontWeight: wght,
54 '--slnt': slnt,
55 '--mono': mono,
56 '--casl': casl,
57 '--crsv': crsv,
58 } as React.CSSProperties
59 }
60 />
61 </div>
62 );
63}
64
65const highlightingTypes = [
66 'function',
67 'number',
68 'property',
69 'punctuation',
70 'string',
71 'variable',
72];
73
74function CodeBlockBox({ children }: { children: React.ReactNode }) {
75 const theme = usePrismTheme();
76
77 const customProps: Record<string, string> = {};
78 theme.styles.forEach((style) => {
79 const color = style.style.color;
80 if (color === undefined || style.languages !== undefined) {
81 return;
82 }
83 style.types.forEach((type) => {
84 if (highlightingTypes.indexOf(type) >= 0) {
85 customProps[`--prism-${type}-color`] = color;
86 }
87 });
88 });
89
90 return (
91 <div
92 className={styles.code}
93 style={{
94 backgroundColor: theme.plain.backgroundColor,
95 color: theme.plain.color,
96 ...customProps,
97 }}
98 >
99 {children}
100 </div>
101 );
102}
103
104function VariableAxisSliders() {
105 return (
106 <div className={styles.sliders}>
107 <VariableAxisSlider
108 axis="wght"
109 label="font-weight"
110 min={300}
111 max={1000}
112 step={10}
113 />
114 <VariableAxisSlider axis="slnt" min={-15} max={0} step={1} />
115 <VariableAxisSlider axis="mono" min={0} max={1} step={0.01} />
116 <VariableAxisSlider axis="casl" min={0} max={1} step={0.01} />
117 <VariableAxisSlider axis="crsv" min={0} max={1} step={0.5} />
118 </div>
119 );
120}
121
122function VariableAxisSlider({
123 axis,
124 label,
125 min,
126 max,
127 step,
128}: {
129 axis: keyof VariableAxisValue;
130 label?: string;
131 min: number;
132 max: number;
133 step: number;
134}) {
135 const id = useId();
136 const { axes, setAxes } = useVariableAxes();
137 return (
138 <>
139 <label
140 className={clsx(styles.label, {
141 [styles['label--property']]: label !== undefined,
142 })}
143 htmlFor={id}
144 >
145 {label ?? `--${axis}`}
146 </label>
147 <input
148 id={id}
149 type="range"
150 min={min}
151 max={max}
152 step={step}
153 value={axes[axis]}
154 onChange={(event) => setAxes({ [axis]: Number(event.target.value) })}
155 className={styles.slider}
156 />
157 <div className={styles.value}>{axes[axis]}</div>
158 </>
159 );
160}
161
162export default function VariableAxisSettings({
163 editorClassName,
164 features,
165 children,
166}: {
167 editorClassName?: string | undefined;
168 features?: boolean;
169 children?: React.ReactNode;
170}) {
171 return (
172 <div className={styles.container}>
173 <PreviewEditor
174 editorClassName={clsx(editorClassName, {
175 [styles['no-features']]: !features,
176 })}
177 />
178 <CodeBlockBox>
179 <VariableAxisSliders />
180 {children}
181 </CodeBlockBox>
182 </div>
183 );
184}
diff --git a/blog/2024-04-05/VariableAxisSettingsWithFontFeaturesPreview.tsx b/blog/2024-04-05/VariableAxisSettingsWithFontFeaturesPreview.tsx
new file mode 100644
index 0000000..af99e6e
--- /dev/null
+++ b/blog/2024-04-05/VariableAxisSettingsWithFontFeaturesPreview.tsx
@@ -0,0 +1,28 @@
1/*
2 * SPDX-FileCopyrightText: 2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import FontFeaturesToggle from './FontFeaturesToggle';
8import { useVariableAxes } from './VariableAxisProvider';
9import VariableAxisSettings from './VariableAxisSettings';
10
11export default function VariableAxisSettingsWithFontFeaturesToggle() {
12 const {
13 axes: { casl, mono },
14 } = useVariableAxes();
15 return (
16 <VariableAxisSettings features>
17 <FontFeaturesToggle
18 features={{
19 ss02: casl < 0.001,
20 ss05: true,
21 ss10: mono > 0.501,
22 ss12: mono > 0.501,
23 titl: casl >= 0.001,
24 }}
25 />
26 </VariableAxisSettings>
27 );
28}
diff --git a/blog/2024-04-05/VariableAxisSettingsWithFontFeaturesToggle.module.css b/blog/2024-04-05/VariableAxisSettingsWithFontFeaturesToggle.module.css
new file mode 100644
index 0000000..337c243
--- /dev/null
+++ b/blog/2024-04-05/VariableAxisSettingsWithFontFeaturesToggle.module.css
@@ -0,0 +1,39 @@
1/*
2 * SPDX-FileCopyrightText: 2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7.features {
8 --ss02: 0;
9 --ss05: 0;
10 --ss10: 0;
11 --ss12: 0;
12 --titl: 0;
13 font-feature-settings:
14 'ss02' var(--ss02),
15 'ss05' var(--ss05),
16 'ss10' var(--ss10),
17 'ss12' var(--ss12),
18 'titl' var(--titl) !important;
19}
20
21.ss02 {
22 --ss02: 1;
23}
24
25.ss05 {
26 --ss05: 1;
27}
28
29.ss10 {
30 --ss10: 1;
31}
32
33.ss12 {
34 --ss12: 1;
35}
36
37.titl {
38 --titl: 1;
39}
diff --git a/blog/2024-04-05/VariableAxisSettingsWithFontFeaturesToggle.tsx b/blog/2024-04-05/VariableAxisSettingsWithFontFeaturesToggle.tsx
new file mode 100644
index 0000000..9234a7c
--- /dev/null
+++ b/blog/2024-04-05/VariableAxisSettingsWithFontFeaturesToggle.tsx
@@ -0,0 +1,44 @@
1/*
2 * SPDX-FileCopyrightText: 2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import clsx from 'clsx';
8import { useState } from 'react';
9
10import FontFeaturesToggle, {
11 featureNames,
12 type FontFeaturesState,
13} from './FontFeaturesToggle';
14import VariableAxisSettings from './VariableAxisSettings';
15import styles from './VariableAxisSettingsWithFontFeaturesToggle.module.css';
16
17export default function VariableAxisSettingsWithFontFeaturesToggle() {
18 const [state, setState] = useState<FontFeaturesState>({
19 ss02: false,
20 ss05: false,
21 ss10: false,
22 ss12: false,
23 titl: false,
24 });
25
26 return (
27 <VariableAxisSettings
28 editorClassName={clsx(
29 styles.features,
30 featureNames.map((name) => ({ [styles[name]]: state[name] })),
31 )}
32 >
33 <FontFeaturesToggle
34 features={state}
35 setFeatures={(newFeatures) =>
36 setState({
37 ...state,
38 ...newFeatures,
39 })
40 }
41 />
42 </VariableAxisSettings>
43 );
44}
diff --git a/blog/2024-04-05/VariableAxisSettingsWithToggle.module.css b/blog/2024-04-05/VariableAxisSettingsWithToggle.module.css
new file mode 100644
index 0000000..0ec27d6
--- /dev/null
+++ b/blog/2024-04-05/VariableAxisSettingsWithToggle.module.css
@@ -0,0 +1,10 @@
1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7.checkbox__container {
8 margin-top: 0.25rem;
9 color: var(--ifm-font-color-base);
10}
diff --git a/blog/2024-04-05/VariableAxisSettingsWithToggle.tsx b/blog/2024-04-05/VariableAxisSettingsWithToggle.tsx
new file mode 100644
index 0000000..c04bec9
--- /dev/null
+++ b/blog/2024-04-05/VariableAxisSettingsWithToggle.tsx
@@ -0,0 +1,28 @@
1/*
2 * SPDX-FileCopyrightText: 2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import { useId, useState } from 'react';
8
9import VariableAxisSettings from './VariableAxisSettings';
10import styles from './VariableAxisSettingsWithToggle.module.css';
11
12export default function VariableAxisSettingsWithToggle() {
13 const id = useId();
14 const [features, setFeatures] = useState(true);
15 return (
16 <VariableAxisSettings features={features}>
17 <div className={styles.checkbox__container}>
18 <input
19 type="checkbox"
20 id={id}
21 checked={features}
22 onChange={() => setFeatures(!features)}
23 />
24 <label htmlFor={id}>Toggle font features automatically</label>
25 </div>
26 </VariableAxisSettings>
27 );
28}
diff --git a/blog/2024-04-05/recursive-v1.064-opentype_features.png b/blog/2024-04-05/recursive-v1.064-opentype_features.png
new file mode 100644
index 0000000..8936132
--- /dev/null
+++ b/blog/2024-04-05/recursive-v1.064-opentype_features.png
Binary files differ
diff --git a/blog/2024-04-05/recursive-v1.064-opentype_features.png.license b/blog/2024-04-05/recursive-v1.064-opentype_features.png.license
new file mode 100644
index 0000000..275e240
--- /dev/null
+++ b/blog/2024-04-05/recursive-v1.064-opentype_features.png.license
@@ -0,0 +1,6 @@
1Copyright 2020 The Recursive Project Authors (https://github.com/arrowtype/recursive)
2
3SPDX-License-Identifier: OFL-1.1
4
5This file was downloaded from
6https://github.com/arrowtype/recursive/blob/6d491202cea5cf6a493ef710cbef2527b9b08939/specimens/repo-artwork/recursive-v1.064-opentype_features.png
diff --git a/blog/2024-04-05/variable-css-font-features.mdx b/blog/2024-04-05/variable-css-font-features.mdx
new file mode 100644
index 0000000..b6b640d
--- /dev/null
+++ b/blog/2024-04-05/variable-css-font-features.mdx
@@ -0,0 +1,322 @@
1---
2SPDX-FileCopyrightText: 2024 Kristóf Marussy
3SPDX-License-Identifier: CC-BY-4.0
4slug: variable-css-font-features
5title: Variable CSS font features
6description: How to set up and use font variation axes in CSS, create a custom subset with OpenType font features, and make the font features switch based on variation settings automatically.
7tags:
8 - css
9 - design
10 - frontend
11authors: kris
12---
13
14import Tabs from '@theme/Tabs';
15import TabItem from '@theme/TabItem';
16
17import { LicenseLink, MITLicenseLink } from '../../src/components/licenses';
18
19export { default as default } from './VariableAxisProvider';
20import VariableAxisSettings from './VariableAxisSettings';
21import VariableAxisSettingsWithFontFeaturesPreview from './VariableAxisSettingsWithFontFeaturesPreview';
22import VariableAxisSettingsWithFontFeaturesToggle from './VariableAxisSettingsWithFontFeaturesToggle';
23import VariableAxisSettingsWithToggle from './VariableAxisSettingsWithToggle';
24
25As the first post on my blog, I decided to write something a bit more practical than "Hello World!" In particular, I'll show you how I **styled the text on this website.**
26
27I selected [Recursive] as the font family for this site, which is an open source font available under the <LicenseLink to="https://openfontlicense.org/">OFL-1.1</LicenseLink>. It is a [variable font](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide), which means it defines a number of 'variation axes' (parameters) to seamlessly change the shape of the letters. This saved me a lot of headache about selecting a matching font for headings or for code, since all is included in a single font family.
28
29[Recursive]: https://www.recurisve.design/
30
31In this post, I'll explain how I set up and use the **variation axes** of the font in CSS, how I created a custom subset with OpenType **font features,** and how I made the font features **automatically switch on and off** based on the variation axes' settings.
32
33You can play around with the settings below to get a feel for the effect. You can also edit the text if you want, but I selected the most interesting characters already.
34
35<VariableAxisSettingsWithToggle />
36
37{/* truncate */}
38
39I tried to make the post helpful for beginners and add a bit of exposition about using variable fonts. [Click here if you're only interested in the punchline!](#automatic-feature-switching)
40
41You can grab [Recursive][recursive] from [Fontsource][fontsource] via the [`@fontsource-variable/recursive`](https://www.npmjs.com/package/@fontsource-variable/recursive) npm package.
42We will [create our own subsets](#intermission-font-subsetting) from the original font files later to play with some advanced features.
43The font comes in relatively heavy at almost 307 kB for the basic latin subset.
44I decided to splurge and use it anyway, because it covers all the font styles I'd possibly need for this website -- it still beats loading 12 separate web fonts of 30 kB each, for example :smirk:.
45
46[fontsource]: https://fontsource.org/fonts/recursive
47
48## Variation axes
49
50Recursive defines **5 variation axes:**
51
52- The `"wght"` axis controls the weight of the text.
53 We don't have to do anything special to use this axis, because it is mapped to the `font-weight` CSS property by browsers automatically.
54- The `"slnt"` axis controls the slant of the font[^oblique].
55 I couldn't get the browser to map this to `font-style: italic` properly, so we'll have to take care of this axis manually[^italic].
56- The `"MONO"` axis blends the font between proportional and monospaced. Browsers don't support this out of the box.
57- The `"CASL"` axis blends the font between serious and casual. Browsers don't support this out of the box either.
58- The `"CRSV"` axis is the most interesting. At 0, you get normal letters, while at 1 you get <span style={/** @type {import('react').CSSProperties} */ ({ '--crsv': 1 })}>cursive</span> ones. At 0.5, you get **automatic switching:** normal letters for upright type and italic ones for text slanted more than 14 degrees[^slant].
59
60[^oblique]: It goes in the direction opposite to the [`font-style: oblique`][font-style-prop] property.
61
62[^italic]: The mapping of `font-style` to variable axes looks [quite complicated](https://github.com/w3c/csswg-drafts/issues/514): the [font matching algorithm](https://www.w3.org/TR/css-fonts-4/#font-style-matching) for `font-style: italic` will fall back to setting `"slnt" -14` (the default angle for [`font-style: oblique`][font-style-prop]) if the variable font has no `"ital"` axis. This is just off the mark for us, because we can only take advantage of the `"CRSV" 0.5` auto-switching for slants **bigger** than 14 degrees :disappointed:.
63
64[font-style-prop]: https://www.w3.org/TR/css-fonts-4/#font-style-prop
65
66[^slant]: Actually the slant will still be -14 degrees (the maximum), but the letters will be italic instead of just slanted.
67
68The preview below illustrates the variation axes in action. Don't worry about the custom CSS properties; we'll get to the CSS for achieving this in the next section.
69
70<VariableAxisSettings />
71
72### Custom properties
73
74I generate this static site with [Docusaurus][docusaurus], which uses the [Infima](https://infima.dev/) design system for styling. Therefore, I had to integrate the Recursive font with Infima's CSS. However, the CSS techniques in this post should apply to other design systems or just plain CSS as well.
75
76[docusaurus]: https://docusaurus.io/
77
78The [Recursive] documentation recommends using [CSS custom properties](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties) to take advantage of the `"slnt"`, `"MONO"`, `"CASL"`, and `"CRSV"` axes. This trick is originally from [Pixel Ambacht](https://pixelambacht.nl/2019/fixing-variable-font-inheritance/). We can apply it like this:
79
80```css
81:root {
82 --ifm-font-family-base: 'Recursive Variable', sans-serif;
83 --ifm-font-family-monospace: var(--ifm-font-family-base);
84 --slnt: 0;
85 --mono: 0;
86 --casl: 0;
87 --crsv: 0.5;
88}
89
90* {
91 font-variation-settings:
92 'slnt' var(--slnt),
93 'MONO' var(--mono),
94 'CASL' var(--casl),
95 'CRSV' var(--crsv) !important;
96}
97```
98
99Both the base font family (`--ifm-font-family-base`) and the monospace font family (`--ifm-font-family-monospace`) of Infima should be set to Recursive. We'll blend between proportional and monospace text with the `--mono` custom property later.
100
101We set `"CRSV"` to 0.5 by default to take advantage of the auto-switching behavior for italic text. Thus, we'll be able to format italic text with just the `--slnt` custom property.
102
103:::info
104
105There is an issue here with CSS cascading and shorthand properties. Infima occasionally uses the `font` CSS shorthand property to set font size and weight. This overwrites `font-variation-settings` and erases our customizations unless we make them `!important`.
106
107:::
108
109### Styling text
110
111In the absence of support for `font-style: italic`, we have to map the `<i>` and `<em>` HTML tags to slanted type manually:
112
113```css
114i, em { --slnt: -15; }
115```
116
117Make sure to format anything you also want to have italic with both `--slnt: -15` and `font-style: italic` so that the text gets properly displayed even if the browser loads a [fallback font](https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display).
118
119We also make `<code>` and `<kbd>` fully monospaced:
120
121```css
122code, kbd { --mono: 1; }
123```
124
125Similarly to the [Recursive] documentation, I decided to use the fully casual style for large headings (`<h1>`, `<h2>`). For smaller headings (`<h3>`), I use a blend between the normal and casual styles, because the fully casual one looked a bit too complex at a small point size:
126
127```css
128h1, h2, .markdown > h3 { --casl: 1; }
129h3, .markdown > h4 { --casl: 0.5; }
130```
131
132:::info
133
134Docusarus shifts the sizes of headings up by one for text generated from Markdown. Thus, we need for the `.markdown > h3` and `.markdown > h4` styles.
135
136:::
137
138## Font features
139
140Some letters now look a little awkward: the two-story letter '<span style={/** @type {import('react').CSSProperties} */ ({ '--casl': 0.01 })}>g</span>' can be hard to read in small body text. Also, the '@' gets squished horizontally in monospace text way too much. There's even a [GitHub issue](https://github.com/arrowtype/recursive/issues/509) for that in the Recursive repository!
141
142Luckily, Recursive has a number of **OpenType font features** that can change the shape of the characters. You can take a look at them in Recursive's [README page](https://github.com/arrowtype/recursive?tab=readme-ov-file#opentype-features). I also reproduced the image below, but it's a bit large, so you'll need to click to reveal it.
143
144import recursiveFeatures from './recursive-v1.064-opentype_features.png?placeholder=true&sizes[]=360&sizes[]=559&sizes[]=930&sizes[]=1504&rl';
145import recursiveFeaturesOriginal from './recursive-v1.064-opentype_features.png?url';
146
147<details>
148<summary>OpenType font features of Recursive</summary>
149
150<div
151 style={{
152 backgroundImage: `url("${recursiveFeatures.placeholder}")`,
153 backgroundSize: 'cover',
154 width: '100%',
155 aspectRatio: `${recursiveFeatures.width} / ${recursiveFeatures.height}`,
156 }}
157>
158 <a href={recursiveFeaturesOriginal} target="_blank">
159 <img
160 src={recursiveFeatures.src}
161 srcSet={recursiveFeatures.srcSet}
162 width={recursiveFeatures.width}
163 height={recursiveFeatures.height}
164 loading="lazy"
165 sizes="(min-width: 1440px) 704px, (min-width: 1140px) 559px, (min-width: 996px) calc(58.333vw - 66px), calc(100vw - 66px)"
166 alt="Table of OpenType font features of Recursive"
167 style={{ width: '100%', height: 'auto' }}
168 />
169 </a>
170</div>
171
172Image from [Recursive][recursive] is <LicenseLink to="https://openfontlicense.org/">OFL-1.1</LicenseLink>.
173
174</details>
175
176### Intermission: font subsetting
177
178If you're using Recursive from [Fontsource][fontsource] or even Google fonts :cold_sweat:, the OpenType font features won't work at all: they've been stripped away from the web font files to make them smaller. There's an open [GitHub issue](https://github.com/fontsource/fontsource/issues/39) in the Fontsource repository to preserve some features, but the problem is highly non-trivial at their scale.
179
180We can solve this problem by grabbing the full [Recursive_VF_1.085.ttf](https://github.com/arrowtype/recursive/blob/6d491202cea5cf6a493ef710cbef2527b9b08939/fonts/ArrowType-Recursive-1.085/Recursive_Desktop/Recursive_VF_1.085.ttf) ourselves and creating our own web font. The full font comes in at a whopping 2.4 MB, so I recommend creating a subset with only the glyphs you use.
181
182We can use the [pyftsubset](https://fonttools.readthedocs.io/en/latest/subset/index.html) tool from the [fonttols](https://github.com/fonttools/fonttools) Python package to create our own web font subset like this:
183
184```
185pyftsubset Recursive_VF_1.085.ttf
186 --unicodes=U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD \
187 --output-file=recursive-latin.woff2 \
188 --flavor=woff2 \
189 --layout-features+=ss02,ss05,ss10,ss12,titl \
190 --desubroutinize \
191 --obfuscate-names
192```
193
194I copied the list of `--unicodes` to include in the basic latin subset from [Fontsource](https://github.com/fontsource/font-files/blob/fd9fe9317a4ab7042845961a60b1cace22dc14d6/fonts/variable/recursive/full.css#L38).
195
196You can specify the OpenType features (in addition to the standard ones) to include in the output font after `--layout-features+=`.
197
198We're creating a WOFF2 web font for maximum compression, which has [over 97% browser support](https://caniuse.com/woff2). The `--desubroutinize` option should also help with compression.
199
200:::warning
201
202The [SIL Open Font License 1.1](https://openfontlicense.org/) has an infamous [Reserved Font Name&nbsp;(RFN)](https://openfontlicense.org/ofl-reserved-font-names/) clause. If you create a Modified Version of a font that has an RFN, you must also change its name. SIL considers a subset a Modified Version.
203
204The `--obfuscate-names` option should take care of changing the font name in the font file. If you use a font that declares an RFN, you must also make sure not to refer to it with its original name outside the font file, e.g., in your CSS files.
205
206Recursive doesn't declare any RFN, so we can keep referring to our custom subset as 'Recursive' without getting into any trouble. :relieved:
207
208:::
209
210Now we can include our custom subset in our CSS:
211
212```css
213@font-face {
214 font-family: 'Recursive Variable';
215 font-style: oblique 0deg 15deg;
216 font-display: swap;
217 font-weight: 300 1000;
218 src: url(recursive-latin.woff2) format('woff2-variations');
219 unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
220 U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
221 U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
222}
223```
224
225For this website, I actually wrote a [small Python script](https://git.marussy.com/blog/tree/scripts/subset_fonts.py) to generate the font subsets. I also use a [template](https://git.marussy.com/blog/tree/scripts/fonts.css.jinja2) for generating the corresponding CSS. Both files can be found in the [Git repository](https://git.marussy.com/blog/) of this website with <MITLicenseLink />.
226
227### Selecting features
228
229I decided to take the features `ss02`, `ss05`, `ss10`, `ss12`, and `titl` for a spin. You can also try them yourself below.
230
231<VariableAxisSettingsWithFontFeaturesToggle />
232
233After a bit of experimentation, I decided to use the features in the following way:
234
235* The simplified look of the letter 'g' with the `ss02` feature is suitable for body text, but I prefer the two-story '<span style={/** @type {import('react').CSSProperties} */ ({'--casl': 0.01})}>g</span>' for headings.
236* The `ss05` feature does nothing for proportional text, but makes the letter `l` more similar to that in my favorite coding font, [Fira Code](https://github.com/tonsky/FiraCode) in monospace text. We can safely set this for all text.
237* The `ss10` (dotted zero) and `ss12` (simplified `@`) features affect proportional text, too, so we shouldn't set them for all text. But, for me, they make text more readable once the monospace letter shapes kick in after `--mono: 0.5`.
238* The alternative '<span style={/** @type {import('react').CSSProperties} */ ({'--casl': 0.01})}>Q</span>' with `titl` is nice for headings, but I prefer the default 'Q' with descender for body text.
239
240### Automatic feature switching
241
242Introducing CSS custom properties for these font features -- like we did for the [variable axes](#custom-properties) -- would be a major pain when writing CSS by hand.
243
244We can take some inspiration from the behavior of the `"CRSV"` axis: let's set the font feature _automatically_ based on the value of some variable axis!
245
246My headings use the `"CASL"` axis, so I decided to switch `ss02` off and `titl` on if `--casl` is larger than 0.
247For `ss10` and `ss12`, `--mono` larger than 0.5 gives a natural switching point, since this is where the other monospace letter shapes appear as well.
248
249In short, we want something like
250
251```math
252\begin{aligned}
253\texttt{ss02} &= \begin{cases}
2541 & \text{if $\texttt{casl} = 0$,} \\
2550 & \text{if $\texttt{casl} > 0$,}
256\end{cases} \\
257\texttt{titl} &= \begin{cases}
2580 & \text{if $\texttt{casl} = 0$,} \\
2591 & \text{if $\texttt{casl} > 0$,}
260\end{cases} \\
261\texttt{ss10} = \texttt{ss12} &= \begin{cases}
2620 & \text{if $\texttt{mono} \le 0.5$,} \\
2631 & \text{if $\texttt{mono} > 0.5$.}
264\end{cases}
265\end{aligned}
266```
267
268We will use [`calc()`](https://developer.mozilla.org/en-US/docs/Web/CSS/calc) to determine the values of [`font-feature-settings`](https://developer.mozilla.org/en-US/docs/Web/CSS/font-feature-settings).
269However, looking through the list of [CSS math function](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Functions#math_functions), we find few options for creating discontinuous expressions. The [`round()`](https://developer.mozilla.org/en-US/docs/Web/CSS/round) function sounds promising, but it isn't supported by Chromium.
270
271The trick is to replace our expressions with _continuous_ ones that we can build from widely supported CSS functions [`min()`](https://developer.mozilla.org/en-US/docs/Web/CSS/min) and [`clamp()`](https://developer.mozilla.org/en-US/docs/Web/CSS/clamp):
272
273<Tabs>
274 <TabItem value="code" label="Code" default>
275 ```css
276 * {
277 font-feature-settings:
278 'ss02' calc(min(var(--casl) * 1000, 1)),
279 'ss05' 1,
280 'ss10' calc(clamp(0, var(--mono) * 1000 - 500, 1)),
281 'ss12' calc(clamp(0, var(--mono) * 1000 - 500, 1)),
282 'titl' calc(1 - min(var(--casl) * 1000, 1)) !important;
283 }
284 ```
285 </TabItem>
286 <TabItem value="math" label="Math">
287 ```math
288 \begin{aligned}
289 \texttt{ss02} = 1 - \mathit{min}(1000 \cdot \texttt{casl}, 1) &= \begin{cases}
290 1 & \text{if $\texttt{casl} = 0$,} \\
291 1 - 1000 \cdot \texttt{casl} & \text{if $0 < \texttt{casl} \le 0.001$,} \\
292 0 & \text{if $\texttt{casl} > 0.001$,}
293 \end{cases} \\
294 \texttt{titl} = \mathit{min}(1000 \cdot \texttt{casl}, 1) &= \begin{cases}
295 0 & \text{if $\texttt{casl} = 0$,} \\
296 1000 \cdot \texttt{casl} & \text{if $0 < \texttt{casl} \le 0.001$,} \\
297 1 & \text{if $\texttt{casl} > 0.001$,}
298 \end{cases} \\
299 \texttt{ss10} = \texttt{ss12} = \mathit{clamp}(0, 1000 \cdot \texttt{mono} - 500, 1) &= \begin{cases}
300 0 & \text{if $\texttt{mono} \le 0.5$,} \\
301 1000 \cdot \texttt{mono} - 500 & \text{if $0.5 < \texttt{mono} \le 0.501$,} \\
302 1 & \text{if $\texttt{mono} > 0.501$.}
303 \end{cases}
304 \end{aligned}
305 ```
306
307 Each CSS expression agrees with the desired discontinous expression everywhere except a tiny interval of width 0.001 around the decision boundary. We position the intervals so that commonly used variable axis values (like 0, 1, and 0.5) don't cause any problems.
308 </TabItem>
309</Tabs>
310
311This works as long as we only set `--casl` and `--mono` with up to 0.001 precision. Values like 0.0005 or 0.5005 will likely cause problems, because they try to set a non-integer value for a font feature. In my testing, this made both Chromium and Firefox to ignore the `font-feature-settings` rule completely.
312
313In practice, we hardly set a value with more than 0.1 precision, because very slight changes in the letter shapes are barely perceptible.
314
315You can set the variables axes below with up to 0.01 precision:
316
317<VariableAxisSettingsWithFontFeaturesPreview />
318
319## Conclusion
320
321I've shown you how to set variable axes and font features for the [Recursive][recursive] font with some CSS custom property and function magic.
322I also managed to include every Markdown feature and the kitchen sink in this post to try out [Docusarus][docusaurus] as a static site generator. \ No newline at end of file
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 57e8a8e..602053d 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -11,9 +11,15 @@ import type { Options as ClassicThemeOptions } from '@docusaurus/theme-classic';
11import type { UserThemeConfig } from '@docusaurus/theme-common'; 11import type { UserThemeConfig } from '@docusaurus/theme-common';
12import type { Config } from '@docusaurus/types'; 12import type { Config } from '@docusaurus/types';
13import { Config as SwcConfig } from '@swc/core'; 13import { Config as SwcConfig } from '@swc/core';
14import { themes } from 'prism-react-renderer';
15import rehypeKatex from 'rehype-katex';
16import remarkMath from 'remark-math';
14import smartypants from 'remark-smartypants'; 17import smartypants from 'remark-smartypants';
15 18
16const remarkPlugins = [[smartypants, { dashes: 'oldschool' }]]; 19const markdownOptions = {
20 remarkPlugins: [remarkMath, [smartypants, { dashes: 'oldschool' }]],
21 rehypePlugins: [[rehypeKatex, { trust: true }]],
22};
17 23
18export default { 24export default {
19 title: 'Kristóf Marussy', 25 title: 'Kristóf Marussy',
@@ -26,7 +32,7 @@ export default {
26 { 32 {
27 routeBasePath: '/', 33 routeBasePath: '/',
28 archiveBasePath: 'blog', 34 archiveBasePath: 'blog',
29 remarkPlugins, 35 ...markdownOptions,
30 feedOptions: { 36 feedOptions: {
31 type: 'all', 37 type: 'all',
32 title: 'Kristóf Marussy', 38 title: 'Kristóf Marussy',
@@ -36,9 +42,7 @@ export default {
36 ], 42 ],
37 [ 43 [
38 '@docusaurus/plugin-content-pages', 44 '@docusaurus/plugin-content-pages',
39 { 45 markdownOptions satisfies PagesOptions,
40 remarkPlugins,
41 } satisfies PagesOptions,
42 ], 46 ],
43 '@docusaurus/plugin-sitemap', 47 '@docusaurus/plugin-sitemap',
44 './src/plugins/compressionPlugin.ts', 48 './src/plugins/compressionPlugin.ts',
@@ -59,6 +63,11 @@ export default {
59 colorMode: { 63 colorMode: {
60 respectPrefersColorScheme: true, 64 respectPrefersColorScheme: true,
61 }, 65 },
66 prism: {
67 additionalLanguages: ['bash', 'java', 'shell-session'],
68 theme: themes.oneLight,
69 darkTheme: themes.oneDark,
70 },
62 navbar: { 71 navbar: {
63 title: 'Kristóf Marussy', 72 title: 'Kristóf Marussy',
64 hideOnScroll: true, 73 hideOnScroll: true,
diff --git a/package.json b/package.json
index d4fd289..b4c0eb3 100644
--- a/package.json
+++ b/package.json
@@ -26,39 +26,44 @@
26 }, 26 },
27 "packageManager": "yarn@4.1.1", 27 "packageManager": "yarn@4.1.1",
28 "dependencies": { 28 "dependencies": {
29 "@docusaurus/core": "^3.1.1", 29 "@docusaurus/core": "^3.2.1",
30 "@docusaurus/plugin-content-blog": "^3.1.1", 30 "@docusaurus/plugin-content-blog": "^3.2.1",
31 "@docusaurus/plugin-content-pages": "^3.1.1", 31 "@docusaurus/plugin-content-pages": "^3.2.1",
32 "@docusaurus/plugin-sitemap": "^3.1.1", 32 "@docusaurus/plugin-sitemap": "^3.2.1",
33 "@docusaurus/theme-classic": "^3.1.1", 33 "@docusaurus/theme-classic": "^3.2.1",
34 "@docusaurus/theme-common": "^3.1.1", 34 "@docusaurus/theme-common": "^3.2.1",
35 "@docusaurus/utils": "^3.1.1", 35 "@docusaurus/utils": "^3.2.1",
36 "@mdx-js/react": "^3.0.1", 36 "@mdx-js/react": "^3.0.1",
37 "@phosphor-icons/react": "2.0.15", 37 "@phosphor-icons/react": "2.1.4",
38 "@swc/core": "^1.4.8", 38 "@swc/core": "^1.4.12",
39 "clsx": "^2.1.0", 39 "clsx": "^2.1.0",
40 "compression-webpack-plugin": "^11.1.0", 40 "compression-webpack-plugin": "^11.1.0",
41 "katex": "^0.16.10",
42 "prism-react-renderer": "^2.3.1",
41 "prop-types": "^15.8.1", 43 "prop-types": "^15.8.1",
42 "react": "^18.2.0", 44 "react": "^18.2.0",
43 "react-dom": "^18.2.0", 45 "react-dom": "^18.2.0",
46 "rehype-katex": "^7.0.0",
47 "remark-math": "^6.0.0",
44 "remark-smartypants": "^2.1.0", 48 "remark-smartypants": "^2.1.0",
45 "responsive-loader": "^3.1.2", 49 "responsive-loader": "^3.1.2",
46 "sharp": "^0.33.3", 50 "sharp": "^0.33.3",
47 "simple-icons": "^11.9.0", 51 "simple-icons": "^11.11.0",
48 "swc-loader": "^0.2.6", 52 "swc-loader": "^0.2.6",
49 "terser-webpack-plugin": "^5.3.10", 53 "terser-webpack-plugin": "^5.3.10",
50 "webpack": "^5.91.0" 54 "webpack": "^5.91.0"
51 }, 55 },
52 "devDependencies": { 56 "devDependencies": {
53 "@docusaurus/module-type-aliases": "^3.1.1", 57 "@docusaurus/module-type-aliases": "^3.2.1",
54 "@docusaurus/tsconfig": "^3.1.1", 58 "@docusaurus/tsconfig": "^3.2.1",
55 "@docusaurus/types": "^3.1.1", 59 "@docusaurus/types": "^3.2.1",
56 "@types/babel__core": "^7.20.5", 60 "@types/babel__core": "^7.20.5",
57 "@types/node": "^20.11.30", 61 "@types/katex": "^0.16.7",
58 "@types/react": "^18.2.69", 62 "@types/node": "^20.12.4",
63 "@types/react": "^18.2.74",
59 "cross-env": "^7.0.3", 64 "cross-env": "^7.0.3",
60 "prettier": "^3.2.5", 65 "prettier": "^3.2.5",
61 "typescript": "^5.4.3" 66 "typescript": "^5.4.4"
62 }, 67 },
63 "browserslist": { 68 "browserslist": {
64 "production": [ 69 "production": [
diff --git a/src/components/landing/sections/Contact.module.css b/src/components/landing/sections/Contact.module.css
index cfe1455..77d1861 100644
--- a/src/components/landing/sections/Contact.module.css
+++ b/src/components/landing/sections/Contact.module.css
@@ -102,8 +102,8 @@
102 102
103.contact__description { 103.contact__description {
104 margin: 0; 104 margin: 0;
105 font-style: italic;
105 --slnt: -15; 106 --slnt: -15;
106 --crsv: 1;
107 font-size: 0.875rem; 107 font-size: 0.875rem;
108 --marussy-contact-color: var(--marussy-contact-muted-color-or-hover); 108 --marussy-contact-color: var(--marussy-contact-muted-color-or-hover);
109 color: var(--marussy-contact-muted-color-or-hover); 109 color: var(--marussy-contact-muted-color-or-hover);
diff --git a/src/css/custom.css b/src/css/custom.css
index bd6e179..61e8879 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -10,6 +10,8 @@
10 * work well for content-centric websites. 10 * work well for content-centric websites.
11 */ 11 */
12 12
13@import 'katex/dist/katex.css';
14
13@import './fonts.css'; 15@import './fonts.css';
14@import './sr-only.css'; 16@import './sr-only.css';
15 17
@@ -29,7 +31,7 @@
29 --mono: 0; 31 --mono: 0;
30 --casl: 0; 32 --casl: 0;
31 --slnt: 0; 33 --slnt: 0;
32 --crsv: 0; 34 --crsv: 0.5;
33 --marussy-heading-tracking: -0.032em; 35 --marussy-heading-tracking: -0.032em;
34 --marussy-button-tracking: -0.026em; 36 --marussy-button-tracking: -0.026em;
35} 37}
@@ -59,25 +61,20 @@
59 font-feature-settings: 61 font-feature-settings:
60 /* Use single-story g in body text. */ 62 /* Use single-story g in body text. */
61 'ss02' calc(1 - min(var(--casl) * 1000, 1)), 63 'ss02' calc(1 - min(var(--casl) * 1000, 1)),
62 /* Simplified l in code. */ 'ss05' 64 /* Simplified l in code. */ 'ss05' 1,
63 calc(1 - min(1000 - var(--mono) * 1000, 1)),
64 /* Dotted zero in code. */ 'ss10' 65 /* Dotted zero in code. */ 'ss10'
65 calc(1 - min(1000 - var(--mono) * 1000, 1)), 66 calc(clamp(0, var(--mono) * 1000 - 500, 1)),
66 /* Simplified @ in code. */ 'ss12' 67 /* Simplified @ in code. */ 'ss12'
67 calc(1 - min(1000 - var(--mono) * 1000, 1)), 68 calc(clamp(0, var(--mono) * 1000 - 500, 1)),
68 /* No descender for Q in titles. */ 'titl' calc(min(var(--casl) * 1000, 1)), 69 /* No descender for Q in titles. */ 'titl' calc(min(var(--casl) * 1000, 1)) !important;
69 /* Enable italic ligatures. */ 'liga' !important;
70} 70}
71 71
72i, 72i,
73em { 73em {
74 font-style: normal;
75 --slnt: -15; 74 --slnt: -15;
76 --crsv: 1;
77} 75}
78 76
79code, 77code,
80pre,
81kbd { 78kbd {
82 --mono: 1; 79 --mono: 1;
83} 80}
@@ -113,3 +110,18 @@ h3 {
113.hero__subtitle { 110.hero__subtitle {
114 font-weight: 500; 111 font-weight: 500;
115} 112}
113
114.footnotes {
115 margin-top: 3rem;
116 padding-top: var(--ifm-hr-margin-vertical);
117 border-top: var(--ifm-hr-height) solid var(--ifm-hr-background-color);
118}
119
120.markdown > .footnotes ol,
121.markdown > .footnotes li:last-of-type :last-of-type {
122 margin-bottom: 0;
123}
124
125.katex-display {
126 overflow-y: auto;
127}
diff --git a/src/plugins/responsiveLoaderPlugin.ts b/src/plugins/responsiveLoaderPlugin.ts
index b4600e5..6334c4c 100644
--- a/src/plugins/responsiveLoaderPlugin.ts
+++ b/src/plugins/responsiveLoaderPlugin.ts
@@ -22,6 +22,7 @@ export default function responsiveLoaderPlugin(): Plugin {
22 rules: [ 22 rules: [
23 { 23 {
24 test: /\.(png|jpe?g)$/, 24 test: /\.(png|jpe?g)$/,
25 resourceQuery: /[?&]rl$/,
25 use: [ 26 use: [
26 { 27 {
27 loader: 'responsive-loader', 28 loader: 'responsive-loader',
diff --git a/yarn.lock b/yarn.lock
index 7d43d9d..fb7f765 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -327,7 +327,7 @@ __metadata:
327 languageName: node 327 languageName: node
328 linkType: hard 328 linkType: hard
329 329
330"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.7, @babel/parser@npm:^7.23.6": 330"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.6":
331 version: 7.23.6 331 version: 7.23.6
332 resolution: "@babel/parser@npm:7.23.6" 332 resolution: "@babel/parser@npm:7.23.6"
333 bin: 333 bin:
@@ -1474,9 +1474,9 @@ __metadata:
1474 languageName: node 1474 languageName: node
1475 linkType: hard 1475 linkType: hard
1476 1476
1477"@docusaurus/core@npm:3.1.1, @docusaurus/core@npm:^3.1.1": 1477"@docusaurus/core@npm:3.2.1, @docusaurus/core@npm:^3.2.1":
1478 version: 3.1.1 1478 version: 3.2.1
1479 resolution: "@docusaurus/core@npm:3.1.1" 1479 resolution: "@docusaurus/core@npm:3.2.1"
1480 dependencies: 1480 dependencies:
1481 "@babel/core": "npm:^7.23.3" 1481 "@babel/core": "npm:^7.23.3"
1482 "@babel/generator": "npm:^7.23.3" 1482 "@babel/generator": "npm:^7.23.3"
@@ -1488,14 +1488,13 @@ __metadata:
1488 "@babel/runtime": "npm:^7.22.6" 1488 "@babel/runtime": "npm:^7.22.6"
1489 "@babel/runtime-corejs3": "npm:^7.22.6" 1489 "@babel/runtime-corejs3": "npm:^7.22.6"
1490 "@babel/traverse": "npm:^7.22.8" 1490 "@babel/traverse": "npm:^7.22.8"
1491 "@docusaurus/cssnano-preset": "npm:3.1.1" 1491 "@docusaurus/cssnano-preset": "npm:3.2.1"
1492 "@docusaurus/logger": "npm:3.1.1" 1492 "@docusaurus/logger": "npm:3.2.1"
1493 "@docusaurus/mdx-loader": "npm:3.1.1" 1493 "@docusaurus/mdx-loader": "npm:3.2.1"
1494 "@docusaurus/react-loadable": "npm:5.5.2" 1494 "@docusaurus/react-loadable": "npm:5.5.2"
1495 "@docusaurus/utils": "npm:3.1.1" 1495 "@docusaurus/utils": "npm:3.2.1"
1496 "@docusaurus/utils-common": "npm:3.1.1" 1496 "@docusaurus/utils-common": "npm:3.2.1"
1497 "@docusaurus/utils-validation": "npm:3.1.1" 1497 "@docusaurus/utils-validation": "npm:3.2.1"
1498 "@slorber/static-site-generator-webpack-plugin": "npm:^4.0.7"
1499 "@svgr/webpack": "npm:^6.5.1" 1498 "@svgr/webpack": "npm:^6.5.1"
1500 autoprefixer: "npm:^10.4.14" 1499 autoprefixer: "npm:^10.4.14"
1501 babel-loader: "npm:^9.1.3" 1500 babel-loader: "npm:^9.1.3"
@@ -1516,6 +1515,7 @@ __metadata:
1516 detect-port: "npm:^1.5.1" 1515 detect-port: "npm:^1.5.1"
1517 escape-html: "npm:^1.0.3" 1516 escape-html: "npm:^1.0.3"
1518 eta: "npm:^2.2.0" 1517 eta: "npm:^2.2.0"
1518 eval: "npm:^0.1.8"
1519 file-loader: "npm:^6.2.0" 1519 file-loader: "npm:^6.2.0"
1520 fs-extra: "npm:^11.1.1" 1520 fs-extra: "npm:^11.1.1"
1521 html-minifier-terser: "npm:^7.2.0" 1521 html-minifier-terser: "npm:^7.2.0"
@@ -1524,6 +1524,7 @@ __metadata:
1524 leven: "npm:^3.1.0" 1524 leven: "npm:^3.1.0"
1525 lodash: "npm:^4.17.21" 1525 lodash: "npm:^4.17.21"
1526 mini-css-extract-plugin: "npm:^2.7.6" 1526 mini-css-extract-plugin: "npm:^2.7.6"
1527 p-map: "npm:^4.0.0"
1527 postcss: "npm:^8.4.26" 1528 postcss: "npm:^8.4.26"
1528 postcss-loader: "npm:^7.3.3" 1529 postcss-loader: "npm:^7.3.3"
1529 prompts: "npm:^2.4.2" 1530 prompts: "npm:^2.4.2"
@@ -1552,41 +1553,39 @@ __metadata:
1552 react-dom: ^18.0.0 1553 react-dom: ^18.0.0
1553 bin: 1554 bin:
1554 docusaurus: bin/docusaurus.mjs 1555 docusaurus: bin/docusaurus.mjs
1555 checksum: 10c0/7e7310258fd60bde11eb94a6240c469ddeaf7e55ec35e2f23878a201f25971b016cfd334c2bf0a7a6aa9340bbfedf781b4d875905519597439b88b2b32a54d73 1556 checksum: 10c0/f80d56027cf9ca3110eb75c6b416328f083c8ff99cc579e9f389783333b2934286c5748894dff27ead5678b6c3c11ce5db009690c248b130dad26678b68a2730
1556 languageName: node 1557 languageName: node
1557 linkType: hard 1558 linkType: hard
1558 1559
1559"@docusaurus/cssnano-preset@npm:3.1.1": 1560"@docusaurus/cssnano-preset@npm:3.2.1":
1560 version: 3.1.1 1561 version: 3.2.1
1561 resolution: "@docusaurus/cssnano-preset@npm:3.1.1" 1562 resolution: "@docusaurus/cssnano-preset@npm:3.2.1"
1562 dependencies: 1563 dependencies:
1563 cssnano-preset-advanced: "npm:^5.3.10" 1564 cssnano-preset-advanced: "npm:^5.3.10"
1564 postcss: "npm:^8.4.26" 1565 postcss: "npm:^8.4.26"
1565 postcss-sort-media-queries: "npm:^4.4.1" 1566 postcss-sort-media-queries: "npm:^4.4.1"
1566 tslib: "npm:^2.6.0" 1567 tslib: "npm:^2.6.0"
1567 checksum: 10c0/8f3e2f495cb5420437478b6c6b9d83f509f8f17ab06db124ee751749d35f56408d2bad48b56439bc42c02e7faf49b12920bc1e078bbe28143e423ac10d421478 1568 checksum: 10c0/b06c7f8ddcc6e265b09f34f205fc65402514ea9b01e5223b0820ba6df9d68b6778e8ef594262b5aa8d2f0f05728d20cb2539d33bc94c08057131b28b4e3448b6
1568 languageName: node 1569 languageName: node
1569 linkType: hard 1570 linkType: hard
1570 1571
1571"@docusaurus/logger@npm:3.1.1": 1572"@docusaurus/logger@npm:3.2.1":
1572 version: 3.1.1 1573 version: 3.2.1
1573 resolution: "@docusaurus/logger@npm:3.1.1" 1574 resolution: "@docusaurus/logger@npm:3.2.1"
1574 dependencies: 1575 dependencies:
1575 chalk: "npm:^4.1.2" 1576 chalk: "npm:^4.1.2"
1576 tslib: "npm:^2.6.0" 1577 tslib: "npm:^2.6.0"
1577 checksum: 10c0/a70814e8a54b800aadd2c76f34411c9ab4b0907287ae3cee775c7ebb15c797f5807d3a25bd30519361654e667a81c496c8e0229cce989ba92028f76fde73f9e4 1578 checksum: 10c0/3b7c9418f9ca570bfcb16690394ff83551db60646cd3c883442d6ce05a88ea27bab70ba4ffe0160a299b03a2d471472668760e429be8f5255f39ec3edab9308b
1578 languageName: node 1579 languageName: node
1579 linkType: hard 1580 linkType: hard
1580 1581
1581"@docusaurus/mdx-loader@npm:3.1.1": 1582"@docusaurus/mdx-loader@npm:3.2.1":
1582 version: 3.1.1 1583 version: 3.2.1
1583 resolution: "@docusaurus/mdx-loader@npm:3.1.1" 1584 resolution: "@docusaurus/mdx-loader@npm:3.2.1"
1584 dependencies: 1585 dependencies:
1585 "@babel/parser": "npm:^7.22.7" 1586 "@docusaurus/logger": "npm:3.2.1"
1586 "@babel/traverse": "npm:^7.22.8" 1587 "@docusaurus/utils": "npm:3.2.1"
1587 "@docusaurus/logger": "npm:3.1.1" 1588 "@docusaurus/utils-validation": "npm:3.2.1"
1588 "@docusaurus/utils": "npm:3.1.1"
1589 "@docusaurus/utils-validation": "npm:3.1.1"
1590 "@mdx-js/mdx": "npm:^3.0.0" 1589 "@mdx-js/mdx": "npm:^3.0.0"
1591 "@slorber/remark-comment": "npm:^1.0.0" 1590 "@slorber/remark-comment": "npm:^1.0.0"
1592 escape-html: "npm:^1.0.3" 1591 escape-html: "npm:^1.0.3"
@@ -1611,16 +1610,16 @@ __metadata:
1611 peerDependencies: 1610 peerDependencies:
1612 react: ^18.0.0 1611 react: ^18.0.0
1613 react-dom: ^18.0.0 1612 react-dom: ^18.0.0
1614 checksum: 10c0/b73185dd2a77edfc2a0e840ac339ed90cf66a359861b1e79cfdf678737c26d20a96a186511cf8eac2c17bdb336bec7fa2028341c8c28d862410778ef855c433e 1613 checksum: 10c0/0e392229fb7d340f4c7b368f4b6669d2f4b586fd7ee97cef08a81026ba91f800c120b00afb3cd8cfa3318a1947984ba4bda27aee0eee4f01d2434c210ffdc91b
1615 languageName: node 1614 languageName: node
1616 linkType: hard 1615 linkType: hard
1617 1616
1618"@docusaurus/module-type-aliases@npm:3.1.1, @docusaurus/module-type-aliases@npm:^3.1.1": 1617"@docusaurus/module-type-aliases@npm:3.2.1, @docusaurus/module-type-aliases@npm:^3.2.1":
1619 version: 3.1.1 1618 version: 3.2.1
1620 resolution: "@docusaurus/module-type-aliases@npm:3.1.1" 1619 resolution: "@docusaurus/module-type-aliases@npm:3.2.1"
1621 dependencies: 1620 dependencies:
1622 "@docusaurus/react-loadable": "npm:5.5.2" 1621 "@docusaurus/react-loadable": "npm:5.5.2"
1623 "@docusaurus/types": "npm:3.1.1" 1622 "@docusaurus/types": "npm:3.2.1"
1624 "@types/history": "npm:^4.7.11" 1623 "@types/history": "npm:^4.7.11"
1625 "@types/react": "npm:*" 1624 "@types/react": "npm:*"
1626 "@types/react-router-config": "npm:*" 1625 "@types/react-router-config": "npm:*"
@@ -1630,21 +1629,21 @@ __metadata:
1630 peerDependencies: 1629 peerDependencies:
1631 react: "*" 1630 react: "*"
1632 react-dom: "*" 1631 react-dom: "*"
1633 checksum: 10c0/d3b79548b995b99db19cbff69b9b83493d901c080582e76a44237336e8409177cb2628f9e0eaa4c6cc336278e52c89e89aca84e41c1870b96c0d642868570d96 1632 checksum: 10c0/fbf7a9ac5832f45e6afa8356cbe33bc979dce1ae9bc3791056261a5d7b1ad1220ecd7b07d1d7cc6b5b2d8d2b437fb31b4ea7df2ec40aad48f245832ca1b067dd
1634 languageName: node 1633 languageName: node
1635 linkType: hard 1634 linkType: hard
1636 1635
1637"@docusaurus/plugin-content-blog@npm:3.1.1, @docusaurus/plugin-content-blog@npm:^3.1.1": 1636"@docusaurus/plugin-content-blog@npm:3.2.1, @docusaurus/plugin-content-blog@npm:^3.2.1":
1638 version: 3.1.1 1637 version: 3.2.1
1639 resolution: "@docusaurus/plugin-content-blog@npm:3.1.1" 1638 resolution: "@docusaurus/plugin-content-blog@npm:3.2.1"
1640 dependencies: 1639 dependencies:
1641 "@docusaurus/core": "npm:3.1.1" 1640 "@docusaurus/core": "npm:3.2.1"
1642 "@docusaurus/logger": "npm:3.1.1" 1641 "@docusaurus/logger": "npm:3.2.1"
1643 "@docusaurus/mdx-loader": "npm:3.1.1" 1642 "@docusaurus/mdx-loader": "npm:3.2.1"
1644 "@docusaurus/types": "npm:3.1.1" 1643 "@docusaurus/types": "npm:3.2.1"
1645 "@docusaurus/utils": "npm:3.1.1" 1644 "@docusaurus/utils": "npm:3.2.1"
1646 "@docusaurus/utils-common": "npm:3.1.1" 1645 "@docusaurus/utils-common": "npm:3.2.1"
1647 "@docusaurus/utils-validation": "npm:3.1.1" 1646 "@docusaurus/utils-validation": "npm:3.2.1"
1648 cheerio: "npm:^1.0.0-rc.12" 1647 cheerio: "npm:^1.0.0-rc.12"
1649 feed: "npm:^4.2.2" 1648 feed: "npm:^4.2.2"
1650 fs-extra: "npm:^11.1.1" 1649 fs-extra: "npm:^11.1.1"
@@ -1658,21 +1657,22 @@ __metadata:
1658 peerDependencies: 1657 peerDependencies:
1659 react: ^18.0.0 1658 react: ^18.0.0
1660 react-dom: ^18.0.0 1659 react-dom: ^18.0.0
1661 checksum: 10c0/43e21c9f307fa5f93a2ae39db2b2cbe4f6a6397159984dc8a55eca6820bf6c0d8149dc10fc6b047cb14c19e28b4fa3dbe3231f353c617e76d5d06b3e9d882a4a 1660 checksum: 10c0/0d918a4e6a447488f9649cb01029cf040653e0d18122df360663a53ccb83f9f342f28597b80514ba9cac9d84d1bbf02d9679fe57d2832b36c59bcf1364977f41
1662 languageName: node 1661 languageName: node
1663 linkType: hard 1662 linkType: hard
1664 1663
1665"@docusaurus/plugin-content-docs@npm:3.1.1": 1664"@docusaurus/plugin-content-docs@npm:3.2.1":
1666 version: 3.1.1 1665 version: 3.2.1
1667 resolution: "@docusaurus/plugin-content-docs@npm:3.1.1" 1666 resolution: "@docusaurus/plugin-content-docs@npm:3.2.1"
1668 dependencies: 1667 dependencies:
1669 "@docusaurus/core": "npm:3.1.1" 1668 "@docusaurus/core": "npm:3.2.1"
1670 "@docusaurus/logger": "npm:3.1.1" 1669 "@docusaurus/logger": "npm:3.2.1"
1671 "@docusaurus/mdx-loader": "npm:3.1.1" 1670 "@docusaurus/mdx-loader": "npm:3.2.1"
1672 "@docusaurus/module-type-aliases": "npm:3.1.1" 1671 "@docusaurus/module-type-aliases": "npm:3.2.1"
1673 "@docusaurus/types": "npm:3.1.1" 1672 "@docusaurus/types": "npm:3.2.1"
1674 "@docusaurus/utils": "npm:3.1.1" 1673 "@docusaurus/utils": "npm:3.2.1"
1675 "@docusaurus/utils-validation": "npm:3.1.1" 1674 "@docusaurus/utils-common": "npm:3.2.1"
1675 "@docusaurus/utils-validation": "npm:3.2.1"
1676 "@types/react-router-config": "npm:^5.0.7" 1676 "@types/react-router-config": "npm:^5.0.7"
1677 combine-promises: "npm:^1.1.0" 1677 combine-promises: "npm:^1.1.0"
1678 fs-extra: "npm:^11.1.1" 1678 fs-extra: "npm:^11.1.1"
@@ -1684,46 +1684,46 @@ __metadata:
1684 peerDependencies: 1684 peerDependencies:
1685 react: ^18.0.0 1685 react: ^18.0.0
1686 react-dom: ^18.0.0 1686 react-dom: ^18.0.0
1687 checksum: 10c0/affb37111782ad3f79ce1e8964cf57c1b4d44bb5525d37d06a188a7615a0d94af5140e93f6d65b8f1365e8b6347a9dd0436f510083bd97a5f4b7a3df799d3b9c 1687 checksum: 10c0/1f6412e92623d967d2104e68bd4f59e5c596b4f9726e582fce691d76be4491694f7e8dcbbb700232798f635ebb5a54f37a568b00f4eb91fe79ffc5ef8dcda09b
1688 languageName: node 1688 languageName: node
1689 linkType: hard 1689 linkType: hard
1690 1690
1691"@docusaurus/plugin-content-pages@npm:3.1.1, @docusaurus/plugin-content-pages@npm:^3.1.1": 1691"@docusaurus/plugin-content-pages@npm:3.2.1, @docusaurus/plugin-content-pages@npm:^3.2.1":
1692 version: 3.1.1 1692 version: 3.2.1
1693 resolution: "@docusaurus/plugin-content-pages@npm:3.1.1" 1693 resolution: "@docusaurus/plugin-content-pages@npm:3.2.1"
1694 dependencies: 1694 dependencies:
1695 "@docusaurus/core": "npm:3.1.1" 1695 "@docusaurus/core": "npm:3.2.1"
1696 "@docusaurus/mdx-loader": "npm:3.1.1" 1696 "@docusaurus/mdx-loader": "npm:3.2.1"
1697 "@docusaurus/types": "npm:3.1.1" 1697 "@docusaurus/types": "npm:3.2.1"
1698 "@docusaurus/utils": "npm:3.1.1" 1698 "@docusaurus/utils": "npm:3.2.1"
1699 "@docusaurus/utils-validation": "npm:3.1.1" 1699 "@docusaurus/utils-validation": "npm:3.2.1"
1700 fs-extra: "npm:^11.1.1" 1700 fs-extra: "npm:^11.1.1"
1701 tslib: "npm:^2.6.0" 1701 tslib: "npm:^2.6.0"
1702 webpack: "npm:^5.88.1" 1702 webpack: "npm:^5.88.1"
1703 peerDependencies: 1703 peerDependencies:
1704 react: ^18.0.0 1704 react: ^18.0.0
1705 react-dom: ^18.0.0 1705 react-dom: ^18.0.0
1706 checksum: 10c0/ce5bb432429449c4abe5a33fdb69e5e3435587f40f9981c42ef8888eb2c99a78879e45eca4155acfc3ba91eaa3f5e7ebdfff5bba2f59cb1755feaff6ff64dad5 1706 checksum: 10c0/cca2ec8d44d3a8d7db39ad728bcb60595feec51e56be14ef7755945421e22ac3faf39fcd3440497b072d282cb0616547da092e2ae46660eae1d4f8dfb268c182
1707 languageName: node 1707 languageName: node
1708 linkType: hard 1708 linkType: hard
1709 1709
1710"@docusaurus/plugin-sitemap@npm:^3.1.1": 1710"@docusaurus/plugin-sitemap@npm:^3.2.1":
1711 version: 3.1.1 1711 version: 3.2.1
1712 resolution: "@docusaurus/plugin-sitemap@npm:3.1.1" 1712 resolution: "@docusaurus/plugin-sitemap@npm:3.2.1"
1713 dependencies: 1713 dependencies:
1714 "@docusaurus/core": "npm:3.1.1" 1714 "@docusaurus/core": "npm:3.2.1"
1715 "@docusaurus/logger": "npm:3.1.1" 1715 "@docusaurus/logger": "npm:3.2.1"
1716 "@docusaurus/types": "npm:3.1.1" 1716 "@docusaurus/types": "npm:3.2.1"
1717 "@docusaurus/utils": "npm:3.1.1" 1717 "@docusaurus/utils": "npm:3.2.1"
1718 "@docusaurus/utils-common": "npm:3.1.1" 1718 "@docusaurus/utils-common": "npm:3.2.1"
1719 "@docusaurus/utils-validation": "npm:3.1.1" 1719 "@docusaurus/utils-validation": "npm:3.2.1"
1720 fs-extra: "npm:^11.1.1" 1720 fs-extra: "npm:^11.1.1"
1721 sitemap: "npm:^7.1.1" 1721 sitemap: "npm:^7.1.1"
1722 tslib: "npm:^2.6.0" 1722 tslib: "npm:^2.6.0"
1723 peerDependencies: 1723 peerDependencies:
1724 react: ^18.0.0 1724 react: ^18.0.0
1725 react-dom: ^18.0.0 1725 react-dom: ^18.0.0
1726 checksum: 10c0/3e9557d9824c30e321a831aecb897429112e5857f5659a933aa6389259d22d7574e31a54eb93cd89250672c1605115397332e333e6aae663df47dd98c5234f8d 1726 checksum: 10c0/24856320dcc039d5081d5c39834111aaa044880b98173c1193a5bef2556ccacf829e3623d48936142073daa58dac8d4220a6e0fa8756897fec811c580f03d491
1727 languageName: node 1727 languageName: node
1728 linkType: hard 1728 linkType: hard
1729 1729
@@ -1739,22 +1739,22 @@ __metadata:
1739 languageName: node 1739 languageName: node
1740 linkType: hard 1740 linkType: hard
1741 1741
1742"@docusaurus/theme-classic@npm:^3.1.1": 1742"@docusaurus/theme-classic@npm:^3.2.1":
1743 version: 3.1.1 1743 version: 3.2.1
1744 resolution: "@docusaurus/theme-classic@npm:3.1.1" 1744 resolution: "@docusaurus/theme-classic@npm:3.2.1"
1745 dependencies: 1745 dependencies:
1746 "@docusaurus/core": "npm:3.1.1" 1746 "@docusaurus/core": "npm:3.2.1"
1747 "@docusaurus/mdx-loader": "npm:3.1.1" 1747 "@docusaurus/mdx-loader": "npm:3.2.1"
1748 "@docusaurus/module-type-aliases": "npm:3.1.1" 1748 "@docusaurus/module-type-aliases": "npm:3.2.1"
1749 "@docusaurus/plugin-content-blog": "npm:3.1.1" 1749 "@docusaurus/plugin-content-blog": "npm:3.2.1"
1750 "@docusaurus/plugin-content-docs": "npm:3.1.1" 1750 "@docusaurus/plugin-content-docs": "npm:3.2.1"
1751 "@docusaurus/plugin-content-pages": "npm:3.1.1" 1751 "@docusaurus/plugin-content-pages": "npm:3.2.1"
1752 "@docusaurus/theme-common": "npm:3.1.1" 1752 "@docusaurus/theme-common": "npm:3.2.1"
1753 "@docusaurus/theme-translations": "npm:3.1.1" 1753 "@docusaurus/theme-translations": "npm:3.2.1"
1754 "@docusaurus/types": "npm:3.1.1" 1754 "@docusaurus/types": "npm:3.2.1"
1755 "@docusaurus/utils": "npm:3.1.1" 1755 "@docusaurus/utils": "npm:3.2.1"
1756 "@docusaurus/utils-common": "npm:3.1.1" 1756 "@docusaurus/utils-common": "npm:3.2.1"
1757 "@docusaurus/utils-validation": "npm:3.1.1" 1757 "@docusaurus/utils-validation": "npm:3.2.1"
1758 "@mdx-js/react": "npm:^3.0.0" 1758 "@mdx-js/react": "npm:^3.0.0"
1759 clsx: "npm:^2.0.0" 1759 clsx: "npm:^2.0.0"
1760 copy-text-to-clipboard: "npm:^3.2.0" 1760 copy-text-to-clipboard: "npm:^3.2.0"
@@ -1771,21 +1771,21 @@ __metadata:
1771 peerDependencies: 1771 peerDependencies:
1772 react: ^18.0.0 1772 react: ^18.0.0
1773 react-dom: ^18.0.0 1773 react-dom: ^18.0.0
1774 checksum: 10c0/6c55ead986d092ccbf1109560596367951466965d9334a06326dbc589fd5013b2e8743ee47a0763dd5517011a4367be10413f2808cf5bf8ce2f21a20ffc56e3c 1774 checksum: 10c0/bbd137d895fd4fa08bd389012721257766b7d9218249b8a45e92b376ab76f9dd39e5d8d747872fc8a4c0f47d2a7a5f30d838a9c1d331282f7c4f8795dd1abc5c
1775 languageName: node 1775 languageName: node
1776 linkType: hard 1776 linkType: hard
1777 1777
1778"@docusaurus/theme-common@npm:3.1.1, @docusaurus/theme-common@npm:^3.1.1": 1778"@docusaurus/theme-common@npm:3.2.1, @docusaurus/theme-common@npm:^3.2.1":
1779 version: 3.1.1 1779 version: 3.2.1
1780 resolution: "@docusaurus/theme-common@npm:3.1.1" 1780 resolution: "@docusaurus/theme-common@npm:3.2.1"
1781 dependencies: 1781 dependencies:
1782 "@docusaurus/mdx-loader": "npm:3.1.1" 1782 "@docusaurus/mdx-loader": "npm:3.2.1"
1783 "@docusaurus/module-type-aliases": "npm:3.1.1" 1783 "@docusaurus/module-type-aliases": "npm:3.2.1"
1784 "@docusaurus/plugin-content-blog": "npm:3.1.1" 1784 "@docusaurus/plugin-content-blog": "npm:3.2.1"
1785 "@docusaurus/plugin-content-docs": "npm:3.1.1" 1785 "@docusaurus/plugin-content-docs": "npm:3.2.1"
1786 "@docusaurus/plugin-content-pages": "npm:3.1.1" 1786 "@docusaurus/plugin-content-pages": "npm:3.2.1"
1787 "@docusaurus/utils": "npm:3.1.1" 1787 "@docusaurus/utils": "npm:3.2.1"
1788 "@docusaurus/utils-common": "npm:3.1.1" 1788 "@docusaurus/utils-common": "npm:3.2.1"
1789 "@types/history": "npm:^4.7.11" 1789 "@types/history": "npm:^4.7.11"
1790 "@types/react": "npm:*" 1790 "@types/react": "npm:*"
1791 "@types/react-router-config": "npm:*" 1791 "@types/react-router-config": "npm:*"
@@ -1797,30 +1797,30 @@ __metadata:
1797 peerDependencies: 1797 peerDependencies:
1798 react: ^18.0.0 1798 react: ^18.0.0
1799 react-dom: ^18.0.0 1799 react-dom: ^18.0.0
1800 checksum: 10c0/13fb9d9fc4e68e7ead1da92d1f3949b8f0b3a108430a37f895ab98f0ba199f606697d4a7c37d6649acd9391bd834a7658546c2505972185f76ff1f10b9cda9f8 1800 checksum: 10c0/f9da0e73740a6eb94ef6972d2f29fbe69f8924e10a034987c06ba3b64a898b4c52b2e618813d101c2a2608eb7d449eba672ceecad0449c5c8fde54b46255e0f3
1801 languageName: node 1801 languageName: node
1802 linkType: hard 1802 linkType: hard
1803 1803
1804"@docusaurus/theme-translations@npm:3.1.1": 1804"@docusaurus/theme-translations@npm:3.2.1":
1805 version: 3.1.1 1805 version: 3.2.1
1806 resolution: "@docusaurus/theme-translations@npm:3.1.1" 1806 resolution: "@docusaurus/theme-translations@npm:3.2.1"
1807 dependencies: 1807 dependencies:
1808 fs-extra: "npm:^11.1.1" 1808 fs-extra: "npm:^11.1.1"
1809 tslib: "npm:^2.6.0" 1809 tslib: "npm:^2.6.0"
1810 checksum: 10c0/8f118d6c8b1db719cd62bef0aceec6b1ebd1b0d00960a99360a0b7e337fddb689ca0f1a0f580b25fa4bbfce83966b6f9ddb6b607a105337f1d6388b4a1522e5f 1810 checksum: 10c0/b364cf03ba353b7188533539935578c5f7be942a0164fe878bf92bb21bb53a5a36ba3ee9f1dc18ae1a6f7d93b765e57d067ee663c1c749302a92eb5fe17311cf
1811 languageName: node 1811 languageName: node
1812 linkType: hard 1812 linkType: hard
1813 1813
1814"@docusaurus/tsconfig@npm:^3.1.1": 1814"@docusaurus/tsconfig@npm:^3.2.1":
1815 version: 3.1.1 1815 version: 3.2.1
1816 resolution: "@docusaurus/tsconfig@npm:3.1.1" 1816 resolution: "@docusaurus/tsconfig@npm:3.2.1"
1817 checksum: 10c0/5325ae169c19e155bdaf5b3e5da7ef6d3300a8f24e6271d76c4ae1671c2e385c4d60df72640c8ddd9f640213eeadeb59a16c60fe60b4fe34f70f66da9fa59186 1817 checksum: 10c0/6dc9d908d26b44bc02065437d6bdc29be278b6a6660565e53d0d38c72d8fd4a8ddaf77602652ed7f0fe518498ea85b9949b81c62b7773b96089bafc647b3abfd
1818 languageName: node 1818 languageName: node
1819 linkType: hard 1819 linkType: hard
1820 1820
1821"@docusaurus/types@npm:3.1.1, @docusaurus/types@npm:^3.1.1": 1821"@docusaurus/types@npm:3.2.1, @docusaurus/types@npm:^3.2.1":
1822 version: 3.1.1 1822 version: 3.2.1
1823 resolution: "@docusaurus/types@npm:3.1.1" 1823 resolution: "@docusaurus/types@npm:3.2.1"
1824 dependencies: 1824 dependencies:
1825 "@mdx-js/mdx": "npm:^3.0.0" 1825 "@mdx-js/mdx": "npm:^3.0.0"
1826 "@types/history": "npm:^4.7.11" 1826 "@types/history": "npm:^4.7.11"
@@ -1834,13 +1834,13 @@ __metadata:
1834 peerDependencies: 1834 peerDependencies:
1835 react: ^18.0.0 1835 react: ^18.0.0
1836 react-dom: ^18.0.0 1836 react-dom: ^18.0.0
1837 checksum: 10c0/7322d1f1c19f4c869fe29af58cb8d1fc59b6a7173fc9a019ed75c70a850a89701a0ec77cd3e12c0979f86c18078430f62f72f30cbebad1e19802c5c7f2bed079 1837 checksum: 10c0/ea48d186a2f5a130dcc254147568343c884212e2951c8f34fa0aad123fc70d2da010c0ef8a7e223162d5d0e9a91f14fc7902ce25f9e5c2eed954b47d621ebf4f
1838 languageName: node 1838 languageName: node
1839 linkType: hard 1839 linkType: hard
1840 1840
1841"@docusaurus/utils-common@npm:3.1.1": 1841"@docusaurus/utils-common@npm:3.2.1":
1842 version: 3.1.1 1842 version: 3.2.1
1843 resolution: "@docusaurus/utils-common@npm:3.1.1" 1843 resolution: "@docusaurus/utils-common@npm:3.2.1"
1844 dependencies: 1844 dependencies:
1845 tslib: "npm:^2.6.0" 1845 tslib: "npm:^2.6.0"
1846 peerDependencies: 1846 peerDependencies:
@@ -1848,28 +1848,30 @@ __metadata:
1848 peerDependenciesMeta: 1848 peerDependenciesMeta:
1849 "@docusaurus/types": 1849 "@docusaurus/types":
1850 optional: true 1850 optional: true
1851 checksum: 10c0/b483b4626c521e01a4b8ef1e65636e3a99eedae29177f9ee1052268bd5f5f56e12e9a89563792719f3493909e2afc91a1f36532e3e7e290fc933be1e5fed7d01 1851 checksum: 10c0/64a47fd93b6e1b82da6a5e833ece380c474383430466a228263682396763b31dc901ffccfde393450fb9b0e6f6e7f7b98b70afb2c2cf37369ebb0cc2ca12db7c
1852 languageName: node 1852 languageName: node
1853 linkType: hard 1853 linkType: hard
1854 1854
1855"@docusaurus/utils-validation@npm:3.1.1": 1855"@docusaurus/utils-validation@npm:3.2.1":
1856 version: 3.1.1 1856 version: 3.2.1
1857 resolution: "@docusaurus/utils-validation@npm:3.1.1" 1857 resolution: "@docusaurus/utils-validation@npm:3.2.1"
1858 dependencies: 1858 dependencies:
1859 "@docusaurus/logger": "npm:3.1.1" 1859 "@docusaurus/logger": "npm:3.2.1"
1860 "@docusaurus/utils": "npm:3.1.1" 1860 "@docusaurus/utils": "npm:3.2.1"
1861 "@docusaurus/utils-common": "npm:3.2.1"
1861 joi: "npm:^17.9.2" 1862 joi: "npm:^17.9.2"
1862 js-yaml: "npm:^4.1.0" 1863 js-yaml: "npm:^4.1.0"
1863 tslib: "npm:^2.6.0" 1864 tslib: "npm:^2.6.0"
1864 checksum: 10c0/7075de973c06b0a87ba6ec73ce4f3e79cd1d572823b65f6ebb974459b34353e72a085feaf1358c4841e9ccebc1426c5489dc28e694a47fe177f6270e6979d563 1865 checksum: 10c0/79dd6f85f0a8050ca35da28c7cc86d55c475718eda3bb4cfe5f17cca0da609592157149bab6d2704fdbeaaa2a108834879b28649d590a56fe6b83f1077ccd066
1865 languageName: node 1866 languageName: node
1866 linkType: hard 1867 linkType: hard
1867 1868
1868"@docusaurus/utils@npm:3.1.1, @docusaurus/utils@npm:^3.1.1": 1869"@docusaurus/utils@npm:3.2.1, @docusaurus/utils@npm:^3.2.1":
1869 version: 3.1.1 1870 version: 3.2.1
1870 resolution: "@docusaurus/utils@npm:3.1.1" 1871 resolution: "@docusaurus/utils@npm:3.2.1"
1871 dependencies: 1872 dependencies:
1872 "@docusaurus/logger": "npm:3.1.1" 1873 "@docusaurus/logger": "npm:3.2.1"
1874 "@docusaurus/utils-common": "npm:3.2.1"
1873 "@svgr/webpack": "npm:^6.5.1" 1875 "@svgr/webpack": "npm:^6.5.1"
1874 escape-string-regexp: "npm:^4.0.0" 1876 escape-string-regexp: "npm:^4.0.0"
1875 file-loader: "npm:^6.2.0" 1877 file-loader: "npm:^6.2.0"
@@ -1881,6 +1883,7 @@ __metadata:
1881 js-yaml: "npm:^4.1.0" 1883 js-yaml: "npm:^4.1.0"
1882 lodash: "npm:^4.17.21" 1884 lodash: "npm:^4.17.21"
1883 micromatch: "npm:^4.0.5" 1885 micromatch: "npm:^4.0.5"
1886 prompts: "npm:^2.4.2"
1884 resolve-pathname: "npm:^3.0.0" 1887 resolve-pathname: "npm:^3.0.0"
1885 shelljs: "npm:^0.8.5" 1888 shelljs: "npm:^0.8.5"
1886 tslib: "npm:^2.6.0" 1889 tslib: "npm:^2.6.0"
@@ -1891,7 +1894,7 @@ __metadata:
1891 peerDependenciesMeta: 1894 peerDependenciesMeta:
1892 "@docusaurus/types": 1895 "@docusaurus/types":
1893 optional: true 1896 optional: true
1894 checksum: 10c0/063219351c630be7f16b51aa989f4dd479bb3f941ff44f7b857d4713d954e4c64626e17404eb11b3bd6ef218bd5a4a1412b9c42a30c53fd9748bb04a0aa31faf 1897 checksum: 10c0/02e8caff070060d138a2c06e07af988c9905997084b77d1373dbde7dca7122b3cc90979a4c68e5cccc234eb62ba459bca6bb4be5b56d00272d8cf1c5842ff4b6
1895 languageName: node 1898 languageName: node
1896 linkType: hard 1899 linkType: hard
1897 1900
@@ -2270,13 +2273,13 @@ __metadata:
2270 languageName: node 2273 languageName: node
2271 linkType: hard 2274 linkType: hard
2272 2275
2273"@phosphor-icons/react@npm:2.0.15": 2276"@phosphor-icons/react@npm:2.1.4":
2274 version: 2.0.15 2277 version: 2.1.4
2275 resolution: "@phosphor-icons/react@npm:2.0.15" 2278 resolution: "@phosphor-icons/react@npm:2.1.4"
2276 peerDependencies: 2279 peerDependencies:
2277 react: ">= 16.8" 2280 react: ">= 16.8"
2278 react-dom: ">= 16.8" 2281 react-dom: ">= 16.8"
2279 checksum: 10c0/b7e60e1adb4440e5fa2930d780ff693ed1540da363354ed005e8d8690b3a94f40e5c3cd62c411b8bbcd847d623e4722bdb1d8a9a372cb9474a087d4794adad78 2282 checksum: 10c0/29f4e8c4ccd4c79051bbb0054766b40a32129876c1ee1fcc9d1a2b857e8eec9aa184bdb02498757c24345d843d849e5b033cfd8b1c5c4df70c1dc7b503328df7
2280 languageName: node 2283 languageName: node
2281 linkType: hard 2284 linkType: hard
2282 2285
@@ -2376,17 +2379,6 @@ __metadata:
2376 languageName: node 2379 languageName: node
2377 linkType: hard 2380 linkType: hard
2378 2381
2379"@slorber/static-site-generator-webpack-plugin@npm:^4.0.7":
2380 version: 4.0.7
2381 resolution: "@slorber/static-site-generator-webpack-plugin@npm:4.0.7"
2382 dependencies:
2383 eval: "npm:^0.1.8"
2384 p-map: "npm:^4.0.0"
2385 webpack-sources: "npm:^3.2.2"
2386 checksum: 10c0/6ba8abc2d99e8c513bb955502f9cd219c78b2c7b9b76668bf05067cf369cfa838089b52ee51c957e1e6e8442f9dd4f2bbd8df706a3c3388e9a0d41b09a895f97
2387 languageName: node
2388 linkType: hard
2389
2390"@svgr/babel-plugin-add-jsx-attribute@npm:^6.5.1": 2382"@svgr/babel-plugin-add-jsx-attribute@npm:^6.5.1":
2391 version: 6.5.1 2383 version: 6.5.1
2392 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.5.1" 2384 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:6.5.1"
@@ -2543,90 +2535,90 @@ __metadata:
2543 languageName: node 2535 languageName: node
2544 linkType: hard 2536 linkType: hard
2545 2537
2546"@swc/core-darwin-arm64@npm:1.4.8": 2538"@swc/core-darwin-arm64@npm:1.4.12":
2547 version: 1.4.8 2539 version: 1.4.12
2548 resolution: "@swc/core-darwin-arm64@npm:1.4.8" 2540 resolution: "@swc/core-darwin-arm64@npm:1.4.12"
2549 conditions: os=darwin & cpu=arm64 2541 conditions: os=darwin & cpu=arm64
2550 languageName: node 2542 languageName: node
2551 linkType: hard 2543 linkType: hard
2552 2544
2553"@swc/core-darwin-x64@npm:1.4.8": 2545"@swc/core-darwin-x64@npm:1.4.12":
2554 version: 1.4.8 2546 version: 1.4.12
2555 resolution: "@swc/core-darwin-x64@npm:1.4.8" 2547 resolution: "@swc/core-darwin-x64@npm:1.4.12"
2556 conditions: os=darwin & cpu=x64 2548 conditions: os=darwin & cpu=x64
2557 languageName: node 2549 languageName: node
2558 linkType: hard 2550 linkType: hard
2559 2551
2560"@swc/core-linux-arm-gnueabihf@npm:1.4.8": 2552"@swc/core-linux-arm-gnueabihf@npm:1.4.12":
2561 version: 1.4.8 2553 version: 1.4.12
2562 resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.8" 2554 resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.12"
2563 conditions: os=linux & cpu=arm 2555 conditions: os=linux & cpu=arm
2564 languageName: node 2556 languageName: node
2565 linkType: hard 2557 linkType: hard
2566 2558
2567"@swc/core-linux-arm64-gnu@npm:1.4.8": 2559"@swc/core-linux-arm64-gnu@npm:1.4.12":
2568 version: 1.4.8 2560 version: 1.4.12
2569 resolution: "@swc/core-linux-arm64-gnu@npm:1.4.8" 2561 resolution: "@swc/core-linux-arm64-gnu@npm:1.4.12"
2570 conditions: os=linux & cpu=arm64 & libc=glibc 2562 conditions: os=linux & cpu=arm64 & libc=glibc
2571 languageName: node 2563 languageName: node
2572 linkType: hard 2564 linkType: hard
2573 2565
2574"@swc/core-linux-arm64-musl@npm:1.4.8": 2566"@swc/core-linux-arm64-musl@npm:1.4.12":
2575 version: 1.4.8 2567 version: 1.4.12
2576 resolution: "@swc/core-linux-arm64-musl@npm:1.4.8" 2568 resolution: "@swc/core-linux-arm64-musl@npm:1.4.12"
2577 conditions: os=linux & cpu=arm64 & libc=musl 2569 conditions: os=linux & cpu=arm64 & libc=musl
2578 languageName: node 2570 languageName: node
2579 linkType: hard 2571 linkType: hard
2580 2572
2581"@swc/core-linux-x64-gnu@npm:1.4.8": 2573"@swc/core-linux-x64-gnu@npm:1.4.12":
2582 version: 1.4.8 2574 version: 1.4.12
2583 resolution: "@swc/core-linux-x64-gnu@npm:1.4.8" 2575 resolution: "@swc/core-linux-x64-gnu@npm:1.4.12"
2584 conditions: os=linux & cpu=x64 & libc=glibc 2576 conditions: os=linux & cpu=x64 & libc=glibc
2585 languageName: node 2577 languageName: node
2586 linkType: hard 2578 linkType: hard
2587 2579
2588"@swc/core-linux-x64-musl@npm:1.4.8": 2580"@swc/core-linux-x64-musl@npm:1.4.12":
2589 version: 1.4.8 2581 version: 1.4.12
2590 resolution: "@swc/core-linux-x64-musl@npm:1.4.8" 2582 resolution: "@swc/core-linux-x64-musl@npm:1.4.12"
2591 conditions: os=linux & cpu=x64 & libc=musl 2583 conditions: os=linux & cpu=x64 & libc=musl
2592 languageName: node 2584 languageName: node
2593 linkType: hard 2585 linkType: hard
2594 2586
2595"@swc/core-win32-arm64-msvc@npm:1.4.8": 2587"@swc/core-win32-arm64-msvc@npm:1.4.12":
2596 version: 1.4.8 2588 version: 1.4.12
2597 resolution: "@swc/core-win32-arm64-msvc@npm:1.4.8" 2589 resolution: "@swc/core-win32-arm64-msvc@npm:1.4.12"
2598 conditions: os=win32 & cpu=arm64 2590 conditions: os=win32 & cpu=arm64
2599 languageName: node 2591 languageName: node
2600 linkType: hard 2592 linkType: hard
2601 2593
2602"@swc/core-win32-ia32-msvc@npm:1.4.8": 2594"@swc/core-win32-ia32-msvc@npm:1.4.12":
2603 version: 1.4.8 2595 version: 1.4.12
2604 resolution: "@swc/core-win32-ia32-msvc@npm:1.4.8" 2596 resolution: "@swc/core-win32-ia32-msvc@npm:1.4.12"
2605 conditions: os=win32 & cpu=ia32 2597 conditions: os=win32 & cpu=ia32
2606 languageName: node 2598 languageName: node
2607 linkType: hard 2599 linkType: hard
2608 2600
2609"@swc/core-win32-x64-msvc@npm:1.4.8": 2601"@swc/core-win32-x64-msvc@npm:1.4.12":
2610 version: 1.4.8 2602 version: 1.4.12
2611 resolution: "@swc/core-win32-x64-msvc@npm:1.4.8" 2603 resolution: "@swc/core-win32-x64-msvc@npm:1.4.12"
2612 conditions: os=win32 & cpu=x64 2604 conditions: os=win32 & cpu=x64
2613 languageName: node 2605 languageName: node
2614 linkType: hard 2606 linkType: hard
2615 2607
2616"@swc/core@npm:^1.4.8": 2608"@swc/core@npm:^1.4.12":
2617 version: 1.4.8 2609 version: 1.4.12
2618 resolution: "@swc/core@npm:1.4.8" 2610 resolution: "@swc/core@npm:1.4.12"
2619 dependencies: 2611 dependencies:
2620 "@swc/core-darwin-arm64": "npm:1.4.8" 2612 "@swc/core-darwin-arm64": "npm:1.4.12"
2621 "@swc/core-darwin-x64": "npm:1.4.8" 2613 "@swc/core-darwin-x64": "npm:1.4.12"
2622 "@swc/core-linux-arm-gnueabihf": "npm:1.4.8" 2614 "@swc/core-linux-arm-gnueabihf": "npm:1.4.12"
2623 "@swc/core-linux-arm64-gnu": "npm:1.4.8" 2615 "@swc/core-linux-arm64-gnu": "npm:1.4.12"
2624 "@swc/core-linux-arm64-musl": "npm:1.4.8" 2616 "@swc/core-linux-arm64-musl": "npm:1.4.12"
2625 "@swc/core-linux-x64-gnu": "npm:1.4.8" 2617 "@swc/core-linux-x64-gnu": "npm:1.4.12"
2626 "@swc/core-linux-x64-musl": "npm:1.4.8" 2618 "@swc/core-linux-x64-musl": "npm:1.4.12"
2627 "@swc/core-win32-arm64-msvc": "npm:1.4.8" 2619 "@swc/core-win32-arm64-msvc": "npm:1.4.12"
2628 "@swc/core-win32-ia32-msvc": "npm:1.4.8" 2620 "@swc/core-win32-ia32-msvc": "npm:1.4.12"
2629 "@swc/core-win32-x64-msvc": "npm:1.4.8" 2621 "@swc/core-win32-x64-msvc": "npm:1.4.12"
2630 "@swc/counter": "npm:^0.1.2" 2622 "@swc/counter": "npm:^0.1.2"
2631 "@swc/types": "npm:^0.1.5" 2623 "@swc/types": "npm:^0.1.5"
2632 peerDependencies: 2624 peerDependencies:
@@ -2655,7 +2647,7 @@ __metadata:
2655 peerDependenciesMeta: 2647 peerDependenciesMeta:
2656 "@swc/helpers": 2648 "@swc/helpers":
2657 optional: true 2649 optional: true
2658 checksum: 10c0/da9079e66d7de696bef2445ba5ba20c7be80b9132f56b7912f2359edab3caa02d334204e4663458771b1995e5556c0629de9427b55587cbac27de6b259c61932 2650 checksum: 10c0/e1517e3fa3f4ef25120785f393c73b43c97d4335f588f55d7bc43d42b9832ed6cd50be4b0cb17721cf56701cb9960fb1dabcaebac3fb10e2e1165049a12326b9
2659 languageName: node 2651 languageName: node
2660 linkType: hard 2652 linkType: hard
2661 2653
@@ -2931,6 +2923,13 @@ __metadata:
2931 languageName: node 2923 languageName: node
2932 linkType: hard 2924 linkType: hard
2933 2925
2926"@types/katex@npm:^0.16.0, @types/katex@npm:^0.16.7":
2927 version: 0.16.7
2928 resolution: "@types/katex@npm:0.16.7"
2929 checksum: 10c0/68dcb9f68a90513ec78ca0196a142e15c2a2c270b1520d752bafd47a99207115085a64087b50140359017d7e9c870b3c68e7e4d36668c9e348a9ef0c48919b5a
2930 languageName: node
2931 linkType: hard
2932
2934"@types/mdast@npm:^4.0.0": 2933"@types/mdast@npm:^4.0.0":
2935 version: 4.0.2 2934 version: 4.0.2
2936 resolution: "@types/mdast@npm:4.0.2" 2935 resolution: "@types/mdast@npm:4.0.2"
@@ -2977,12 +2976,12 @@ __metadata:
2977 languageName: node 2976 languageName: node
2978 linkType: hard 2977 linkType: hard
2979 2978
2980"@types/node@npm:*, @types/node@npm:^20.11.30": 2979"@types/node@npm:*, @types/node@npm:^20.12.4":
2981 version: 20.11.30 2980 version: 20.12.4
2982 resolution: "@types/node@npm:20.11.30" 2981 resolution: "@types/node@npm:20.12.4"
2983 dependencies: 2982 dependencies:
2984 undici-types: "npm:~5.26.4" 2983 undici-types: "npm:~5.26.4"
2985 checksum: 10c0/867cfaf969c6d8850d8d7304e7ab739898a50ecb1395b61ff2335644f5f48d7a46fbc4a14cee967aed65ec134b61a746edae70d1f32f11321ccf29165e3bc4e6 2984 checksum: 10c0/9b142fcd839a48c348d6b9acfc753dfa4b3fb1f3e23ed67e8952bee9b2dfdaffdddfbcf0e4701557b88631591a5f9968433910027532ef847759f8682e27ffe7
2986 languageName: node 2985 languageName: node
2987 linkType: hard 2986 linkType: hard
2988 2987
@@ -3069,14 +3068,13 @@ __metadata:
3069 languageName: node 3068 languageName: node
3070 linkType: hard 3069 linkType: hard
3071 3070
3072"@types/react@npm:*, @types/react@npm:^18.2.69": 3071"@types/react@npm:*, @types/react@npm:^18.2.74":
3073 version: 18.2.69 3072 version: 18.2.74
3074 resolution: "@types/react@npm:18.2.69" 3073 resolution: "@types/react@npm:18.2.74"
3075 dependencies: 3074 dependencies:
3076 "@types/prop-types": "npm:*" 3075 "@types/prop-types": "npm:*"
3077 "@types/scheduler": "npm:*"
3078 csstype: "npm:^3.0.2" 3076 csstype: "npm:^3.0.2"
3079 checksum: 10c0/239b947ed8576a271057a6f571d0967098074b101a2bece244e88093dc8fb2f020872c463b8e78b2049334ba99158f6eef5960e51f73a389f86eee39b835d846 3077 checksum: 10c0/347e38b4c5dc20d50ff71bf04b7caaef490e5ff695e74a0088a13fbb2a0c5d125a5ecfd142adfa30f0176da0e2734942c91ba61d95ce269c43b3265bd7379361
3080 languageName: node 3078 languageName: node
3081 linkType: hard 3079 linkType: hard
3082 3080
@@ -3096,13 +3094,6 @@ __metadata:
3096 languageName: node 3094 languageName: node
3097 linkType: hard 3095 linkType: hard
3098 3096
3099"@types/scheduler@npm:*":
3100 version: 0.16.5
3101 resolution: "@types/scheduler@npm:0.16.5"
3102 checksum: 10c0/625b63cd5dcaf6fb88fe03aa7c797f28cb121f03584126d4811b2d03f39bc3e238ce52cf7685ad8adfe8445d679934e6be47347723a6771ca2058c01f0c33760
3103 languageName: node
3104 linkType: hard
3105
3106"@types/send@npm:*": 3097"@types/send@npm:*":
3107 version: 0.17.3 3098 version: 0.17.3
3108 resolution: "@types/send@npm:0.17.3" 3099 resolution: "@types/send@npm:0.17.3"
@@ -3990,9 +3981,9 @@ __metadata:
3990 linkType: hard 3981 linkType: hard
3991 3982
3992"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001565": 3983"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001565":
3993 version: 1.0.30001599 3984 version: 1.0.30001605
3994 resolution: "caniuse-lite@npm:1.0.30001599" 3985 resolution: "caniuse-lite@npm:1.0.30001605"
3995 checksum: 10c0/8b3b9610b5be88533a3c8d0770d6896f7b1a9fee3dbeb7339e4ee119a514c81e5e07a628a5a289a6541ca291ac78a9402f5a99cf6012139e91f379083488a8eb 3986 checksum: 10c0/ceb96a0ecfdaee6510c00aebaaa63db20aaeafab03450d4e3b214e009cb632f87385a70c299cdd1ca4c17e1473883d8fa2051c5b2d083a454338c0c779b25cbc
3996 languageName: node 3987 languageName: node
3997 linkType: hard 3988 linkType: hard
3998 3989
@@ -6176,6 +6167,43 @@ __metadata:
6176 languageName: node 6167 languageName: node
6177 linkType: hard 6168 linkType: hard
6178 6169
6170"hast-util-from-dom@npm:^5.0.0":
6171 version: 5.0.0
6172 resolution: "hast-util-from-dom@npm:5.0.0"
6173 dependencies:
6174 "@types/hast": "npm:^3.0.0"
6175 hastscript: "npm:^8.0.0"
6176 web-namespaces: "npm:^2.0.0"
6177 checksum: 10c0/1b0a9d65eb8f8cd3616559190bb6db271b7b4f72a13c5dc16abac264b6f7145beb408fbaa497d1b5c725d55392b951972d8313802bfe90ccac33f888ec34c63c
6178 languageName: node
6179 linkType: hard
6180
6181"hast-util-from-html-isomorphic@npm:^2.0.0":
6182 version: 2.0.0
6183 resolution: "hast-util-from-html-isomorphic@npm:2.0.0"
6184 dependencies:
6185 "@types/hast": "npm:^3.0.0"
6186 hast-util-from-dom: "npm:^5.0.0"
6187 hast-util-from-html: "npm:^2.0.0"
6188 unist-util-remove-position: "npm:^5.0.0"
6189 checksum: 10c0/fc68d9245e794483a802d5c85a9f6c25959e00db78cc796411efc965134f3206f9cc9fa38134572ea781ad74663e801f1f83202007b208e27a770855566a62b6
6190 languageName: node
6191 linkType: hard
6192
6193"hast-util-from-html@npm:^2.0.0":
6194 version: 2.0.1
6195 resolution: "hast-util-from-html@npm:2.0.1"
6196 dependencies:
6197 "@types/hast": "npm:^3.0.0"
6198 devlop: "npm:^1.1.0"
6199 hast-util-from-parse5: "npm:^8.0.0"
6200 parse5: "npm:^7.0.0"
6201 vfile: "npm:^6.0.0"
6202 vfile-message: "npm:^4.0.0"
6203 checksum: 10c0/856ceec209940ac4f9db52bf6338b97fb11f27e6d5b930f89676bc16ee282c06f9ff2a17254280803aefdf740507cf3004f181d0286b04dda11907852decbe77
6204 languageName: node
6205 linkType: hard
6206
6179"hast-util-from-parse5@npm:^8.0.0": 6207"hast-util-from-parse5@npm:^8.0.0":
6180 version: 8.0.1 6208 version: 8.0.1
6181 resolution: "hast-util-from-parse5@npm:8.0.1" 6209 resolution: "hast-util-from-parse5@npm:8.0.1"
@@ -6192,6 +6220,15 @@ __metadata:
6192 languageName: node 6220 languageName: node
6193 linkType: hard 6221 linkType: hard
6194 6222
6223"hast-util-is-element@npm:^3.0.0":
6224 version: 3.0.0
6225 resolution: "hast-util-is-element@npm:3.0.0"
6226 dependencies:
6227 "@types/hast": "npm:^3.0.0"
6228 checksum: 10c0/f5361e4c9859c587ca8eb0d8343492f3077ccaa0f58a44cd09f35d5038f94d65152288dcd0c19336ef2c9491ec4d4e45fde2176b05293437021570aa0bc3613b
6229 languageName: node
6230 linkType: hard
6231
6195"hast-util-parse-selector@npm:^4.0.0": 6232"hast-util-parse-selector@npm:^4.0.0":
6196 version: 4.0.0 6233 version: 4.0.0
6197 resolution: "hast-util-parse-selector@npm:4.0.0" 6234 resolution: "hast-util-parse-selector@npm:4.0.0"
@@ -6278,6 +6315,18 @@ __metadata:
6278 languageName: node 6315 languageName: node
6279 linkType: hard 6316 linkType: hard
6280 6317
6318"hast-util-to-text@npm:^4.0.0":
6319 version: 4.0.0
6320 resolution: "hast-util-to-text@npm:4.0.0"
6321 dependencies:
6322 "@types/hast": "npm:^3.0.0"
6323 "@types/unist": "npm:^3.0.0"
6324 hast-util-is-element: "npm:^3.0.0"
6325 unist-util-find-after: "npm:^5.0.0"
6326 checksum: 10c0/868f6b871b12db496e49f07470b87415ef77a3b439d4fce007a1e42c438f8320d76c5231b37e54f4188bce2af1e24c76728d86ee4cf076245ec86d3b6820dbe2
6327 languageName: node
6328 linkType: hard
6329
6281"hast-util-whitespace@npm:^3.0.0": 6330"hast-util-whitespace@npm:^3.0.0":
6282 version: 3.0.0 6331 version: 3.0.0
6283 resolution: "hast-util-whitespace@npm:3.0.0" 6332 resolution: "hast-util-whitespace@npm:3.0.0"
@@ -7192,6 +7241,17 @@ __metadata:
7192 languageName: node 7241 languageName: node
7193 linkType: hard 7242 linkType: hard
7194 7243
7244"katex@npm:^0.16.0, katex@npm:^0.16.10":
7245 version: 0.16.10
7246 resolution: "katex@npm:0.16.10"
7247 dependencies:
7248 commander: "npm:^8.3.0"
7249 bin:
7250 katex: cli.js
7251 checksum: 10c0/b465213157e5245bbb31ff6563c33ae81807c06d6f2246325b3a2397497e8929a34eebbb262f5e0991ec00fbc0cc85f388246e6dfc38ec86c28d3e481cb70afa
7252 languageName: node
7253 linkType: hard
7254
7195"keyv@npm:^4.5.3": 7255"keyv@npm:^4.5.3":
7196 version: 4.5.4 7256 version: 4.5.4
7197 resolution: "keyv@npm:4.5.4" 7257 resolution: "keyv@npm:4.5.4"
@@ -7496,36 +7556,41 @@ __metadata:
7496 version: 0.0.0-use.local 7556 version: 0.0.0-use.local
7497 resolution: "marussy.com@workspace:." 7557 resolution: "marussy.com@workspace:."
7498 dependencies: 7558 dependencies:
7499 "@docusaurus/core": "npm:^3.1.1" 7559 "@docusaurus/core": "npm:^3.2.1"
7500 "@docusaurus/module-type-aliases": "npm:^3.1.1" 7560 "@docusaurus/module-type-aliases": "npm:^3.2.1"
7501 "@docusaurus/plugin-content-blog": "npm:^3.1.1" 7561 "@docusaurus/plugin-content-blog": "npm:^3.2.1"
7502 "@docusaurus/plugin-content-pages": "npm:^3.1.1" 7562 "@docusaurus/plugin-content-pages": "npm:^3.2.1"
7503 "@docusaurus/plugin-sitemap": "npm:^3.1.1" 7563 "@docusaurus/plugin-sitemap": "npm:^3.2.1"
7504 "@docusaurus/theme-classic": "npm:^3.1.1" 7564 "@docusaurus/theme-classic": "npm:^3.2.1"
7505 "@docusaurus/theme-common": "npm:^3.1.1" 7565 "@docusaurus/theme-common": "npm:^3.2.1"
7506 "@docusaurus/tsconfig": "npm:^3.1.1" 7566 "@docusaurus/tsconfig": "npm:^3.2.1"
7507 "@docusaurus/types": "npm:^3.1.1" 7567 "@docusaurus/types": "npm:^3.2.1"
7508 "@docusaurus/utils": "npm:^3.1.1" 7568 "@docusaurus/utils": "npm:^3.2.1"
7509 "@mdx-js/react": "npm:^3.0.1" 7569 "@mdx-js/react": "npm:^3.0.1"
7510 "@phosphor-icons/react": "npm:2.0.15" 7570 "@phosphor-icons/react": "npm:2.1.4"
7511 "@swc/core": "npm:^1.4.8" 7571 "@swc/core": "npm:^1.4.12"
7512 "@types/babel__core": "npm:^7.20.5" 7572 "@types/babel__core": "npm:^7.20.5"
7513 "@types/node": "npm:^20.11.30" 7573 "@types/katex": "npm:^0.16.7"
7514 "@types/react": "npm:^18.2.69" 7574 "@types/node": "npm:^20.12.4"
7575 "@types/react": "npm:^18.2.74"
7515 clsx: "npm:^2.1.0" 7576 clsx: "npm:^2.1.0"
7516 compression-webpack-plugin: "npm:^11.1.0" 7577 compression-webpack-plugin: "npm:^11.1.0"
7517 cross-env: "npm:^7.0.3" 7578 cross-env: "npm:^7.0.3"
7579 katex: "npm:^0.16.10"
7518 prettier: "npm:^3.2.5" 7580 prettier: "npm:^3.2.5"
7581 prism-react-renderer: "npm:^2.3.1"
7519 prop-types: "npm:^15.8.1" 7582 prop-types: "npm:^15.8.1"
7520 react: "npm:^18.2.0" 7583 react: "npm:^18.2.0"
7521 react-dom: "npm:^18.2.0" 7584 react-dom: "npm:^18.2.0"
7585 rehype-katex: "npm:^7.0.0"
7586 remark-math: "npm:^6.0.0"
7522 remark-smartypants: "npm:^2.1.0" 7587 remark-smartypants: "npm:^2.1.0"
7523 responsive-loader: "npm:^3.1.2" 7588 responsive-loader: "npm:^3.1.2"
7524 sharp: "npm:^0.33.3" 7589 sharp: "npm:^0.33.3"
7525 simple-icons: "npm:^11.9.0" 7590 simple-icons: "npm:^11.11.0"
7526 swc-loader: "npm:^0.2.6" 7591 swc-loader: "npm:^0.2.6"
7527 terser-webpack-plugin: "npm:^5.3.10" 7592 terser-webpack-plugin: "npm:^5.3.10"
7528 typescript: "npm:^5.4.3" 7593 typescript: "npm:^5.4.4"
7529 webpack: "npm:^5.91.0" 7594 webpack: "npm:^5.91.0"
7530 languageName: unknown 7595 languageName: unknown
7531 linkType: soft 7596 linkType: soft
@@ -7669,6 +7734,21 @@ __metadata:
7669 languageName: node 7734 languageName: node
7670 linkType: hard 7735 linkType: hard
7671 7736
7737"mdast-util-math@npm:^3.0.0":
7738 version: 3.0.0
7739 resolution: "mdast-util-math@npm:3.0.0"
7740 dependencies:
7741 "@types/hast": "npm:^3.0.0"
7742 "@types/mdast": "npm:^4.0.0"
7743 devlop: "npm:^1.0.0"
7744 longest-streak: "npm:^3.0.0"
7745 mdast-util-from-markdown: "npm:^2.0.0"
7746 mdast-util-to-markdown: "npm:^2.1.0"
7747 unist-util-remove-position: "npm:^5.0.0"
7748 checksum: 10c0/d4e839e38719f26872ed78aac18339805a892f1b56585a9cb8668f34e221b4f0660b9dfe49ec96dbbe79fd1b63b648608a64046d8286bcd2f9d576e80b48a0a1
7749 languageName: node
7750 linkType: hard
7751
7672"mdast-util-mdx-expression@npm:^2.0.0": 7752"mdast-util-mdx-expression@npm:^2.0.0":
7673 version: 2.0.0 7753 version: 2.0.0
7674 resolution: "mdast-util-mdx-expression@npm:2.0.0" 7754 resolution: "mdast-util-mdx-expression@npm:2.0.0"
@@ -7757,7 +7837,7 @@ __metadata:
7757 languageName: node 7837 languageName: node
7758 linkType: hard 7838 linkType: hard
7759 7839
7760"mdast-util-to-markdown@npm:^2.0.0": 7840"mdast-util-to-markdown@npm:^2.0.0, mdast-util-to-markdown@npm:^2.1.0":
7761 version: 2.1.0 7841 version: 2.1.0
7762 resolution: "mdast-util-to-markdown@npm:2.1.0" 7842 resolution: "mdast-util-to-markdown@npm:2.1.0"
7763 dependencies: 7843 dependencies:
@@ -7977,6 +8057,21 @@ __metadata:
7977 languageName: node 8057 languageName: node
7978 linkType: hard 8058 linkType: hard
7979 8059
8060"micromark-extension-math@npm:^3.0.0":
8061 version: 3.0.0
8062 resolution: "micromark-extension-math@npm:3.0.0"
8063 dependencies:
8064 "@types/katex": "npm:^0.16.0"
8065 devlop: "npm:^1.0.0"
8066 katex: "npm:^0.16.0"
8067 micromark-factory-space: "npm:^2.0.0"
8068 micromark-util-character: "npm:^2.0.0"
8069 micromark-util-symbol: "npm:^2.0.0"
8070 micromark-util-types: "npm:^2.0.0"
8071 checksum: 10c0/2f0d11d2860e0f062a89c959b07fd36fed91dfd67684ae667c4eb70c7ac4a35aadb183d22e855c959ef1dc9036fd9d42d575658bacbfd5f48cdfa4cc568444ea
8072 languageName: node
8073 linkType: hard
8074
7980"micromark-extension-mdx-expression@npm:^3.0.0": 8075"micromark-extension-mdx-expression@npm:^3.0.0":
7981 version: 3.0.0 8076 version: 3.0.0
7982 resolution: "micromark-extension-mdx-expression@npm:3.0.0" 8077 resolution: "micromark-extension-mdx-expression@npm:3.0.0"
@@ -9659,7 +9754,7 @@ __metadata:
9659 languageName: node 9754 languageName: node
9660 linkType: hard 9755 linkType: hard
9661 9756
9662"prism-react-renderer@npm:^2.3.0": 9757"prism-react-renderer@npm:^2.3.0, prism-react-renderer@npm:^2.3.1":
9663 version: 2.3.1 9758 version: 2.3.1
9664 resolution: "prism-react-renderer@npm:2.3.1" 9759 resolution: "prism-react-renderer@npm:2.3.1"
9665 dependencies: 9760 dependencies:
@@ -10129,6 +10224,21 @@ __metadata:
10129 languageName: node 10224 languageName: node
10130 linkType: hard 10225 linkType: hard
10131 10226
10227"rehype-katex@npm:^7.0.0":
10228 version: 7.0.0
10229 resolution: "rehype-katex@npm:7.0.0"
10230 dependencies:
10231 "@types/hast": "npm:^3.0.0"
10232 "@types/katex": "npm:^0.16.0"
10233 hast-util-from-html-isomorphic: "npm:^2.0.0"
10234 hast-util-to-text: "npm:^4.0.0"
10235 katex: "npm:^0.16.0"
10236 unist-util-visit-parents: "npm:^6.0.0"
10237 vfile: "npm:^6.0.0"
10238 checksum: 10c0/4986d5db673576df0274464eafecef7c999fb72bf16e8df92454c68bf063b005010ab5465c64dacfbc1767ed6446dd03768917df7b9983f5e60711bce78b9880
10239 languageName: node
10240 linkType: hard
10241
10132"rehype-raw@npm:^7.0.0": 10242"rehype-raw@npm:^7.0.0":
10133 version: 7.0.0 10243 version: 7.0.0
10134 resolution: "rehype-raw@npm:7.0.0" 10244 resolution: "rehype-raw@npm:7.0.0"
@@ -10196,6 +10306,18 @@ __metadata:
10196 languageName: node 10306 languageName: node
10197 linkType: hard 10307 linkType: hard
10198 10308
10309"remark-math@npm:^6.0.0":
10310 version: 6.0.0
10311 resolution: "remark-math@npm:6.0.0"
10312 dependencies:
10313 "@types/mdast": "npm:^4.0.0"
10314 mdast-util-math: "npm:^3.0.0"
10315 micromark-extension-math: "npm:^3.0.0"
10316 unified: "npm:^11.0.0"
10317 checksum: 10c0/859613c4db194bb6b3c9c063661dc52b8ceda9c5cf3256b42f73d93eb8f38a6d634eb5f976fe094425f6f1035aaf329eb49ada314feb3b2b1073326b6d3aaa02
10318 languageName: node
10319 linkType: hard
10320
10199"remark-mdx@npm:^3.0.0": 10321"remark-mdx@npm:^3.0.0":
10200 version: 3.0.0 10322 version: 3.0.0
10201 resolution: "remark-mdx@npm:3.0.0" 10323 resolution: "remark-mdx@npm:3.0.0"
@@ -10588,18 +10710,7 @@ __metadata:
10588 languageName: node 10710 languageName: node
10589 linkType: hard 10711 linkType: hard
10590 10712
10591"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.4": 10713"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.4, semver@npm:^7.6.0":
10592 version: 7.5.4
10593 resolution: "semver@npm:7.5.4"
10594 dependencies:
10595 lru-cache: "npm:^6.0.0"
10596 bin:
10597 semver: bin/semver.js
10598 checksum: 10c0/5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e
10599 languageName: node
10600 linkType: hard
10601
10602"semver@npm:^7.6.0":
10603 version: 7.6.0 10714 version: 7.6.0
10604 resolution: "semver@npm:7.6.0" 10715 resolution: "semver@npm:7.6.0"
10605 dependencies: 10716 dependencies:
@@ -10862,10 +10973,10 @@ __metadata:
10862 languageName: node 10973 languageName: node
10863 linkType: hard 10974 linkType: hard
10864 10975
10865"simple-icons@npm:^11.9.0": 10976"simple-icons@npm:^11.11.0":
10866 version: 11.9.0 10977 version: 11.11.0
10867 resolution: "simple-icons@npm:11.9.0" 10978 resolution: "simple-icons@npm:11.11.0"
10868 checksum: 10c0/4d0acbf8b0e2134fd55f363e8c8bfd4339f9c0a5458d1e8d4381f1d8517b48787ba1d257ce968763c8b671f7853b190c248e4612188ec34d169e58a24fc8abd4 10979 checksum: 10c0/e119604ad73640dc10c05a4beba9d100cfe4001d16d608f6ed916c53dea0e10a6940c272178994ff32f56b570d463281d16590fc1a0cce51b3b7f0dc03902c68
10869 languageName: node 10980 languageName: node
10870 linkType: hard 10981 linkType: hard
10871 10982
@@ -11469,23 +11580,23 @@ __metadata:
11469 languageName: node 11580 languageName: node
11470 linkType: hard 11581 linkType: hard
11471 11582
11472"typescript@npm:^5.4.3": 11583"typescript@npm:^5.4.4":
11473 version: 5.4.3 11584 version: 5.4.4
11474 resolution: "typescript@npm:5.4.3" 11585 resolution: "typescript@npm:5.4.4"
11475 bin: 11586 bin:
11476 tsc: bin/tsc 11587 tsc: bin/tsc
11477 tsserver: bin/tsserver 11588 tsserver: bin/tsserver
11478 checksum: 10c0/22443a8760c3668e256c0b34b6b45c359ef6cecc10c42558806177a7d500ab1a7d7aac1f976d712e26989ddf6731d2fbdd3212b7c73290a45127c1c43ba2005a 11589 checksum: 10c0/4d8de0291204ed61ca97ad0cba2ce064e09c4988ca1c451c787e4653ba76296ba35177a52694e8a00cf4ef899d0ee83338663b926d8b7d55167ff0ba81549999
11479 languageName: node 11590 languageName: node
11480 linkType: hard 11591 linkType: hard
11481 11592
11482"typescript@patch:typescript@npm%3A^5.4.3#optional!builtin<compat/typescript>": 11593"typescript@patch:typescript@npm%3A^5.4.4#optional!builtin<compat/typescript>":
11483 version: 5.4.3 11594 version: 5.4.4
11484 resolution: "typescript@patch:typescript@npm%3A5.4.3#optional!builtin<compat/typescript>::version=5.4.3&hash=5adc0c" 11595 resolution: "typescript@patch:typescript@npm%3A5.4.4#optional!builtin<compat/typescript>::version=5.4.4&hash=5adc0c"
11485 bin: 11596 bin:
11486 tsc: bin/tsc 11597 tsc: bin/tsc
11487 tsserver: bin/tsserver 11598 tsserver: bin/tsserver
11488 checksum: 10c0/6e51f8b7e6ec55b897b9e56b67e864fe8f44e30f4a14357aad5dc0f7432db2f01efc0522df0b6c36d361c51f2dc3dcac5c832efd96a404cfabf884e915d38828 11599 checksum: 10c0/1fa41b9964a9ff0ed913b339c90b46031b2d2da3cb1a192af516610733f7f1d5f7f9754a8e22b9ac7076d3d8aedd2c4f84db3f113bad060eac3a95962443a1bf
11489 languageName: node 11600 languageName: node
11490 linkType: hard 11601 linkType: hard
11491 11602
@@ -11598,6 +11709,16 @@ __metadata:
11598 languageName: node 11709 languageName: node
11599 linkType: hard 11710 linkType: hard
11600 11711
11712"unist-util-find-after@npm:^5.0.0":
11713 version: 5.0.0
11714 resolution: "unist-util-find-after@npm:5.0.0"
11715 dependencies:
11716 "@types/unist": "npm:^3.0.0"
11717 unist-util-is: "npm:^6.0.0"
11718 checksum: 10c0/a7cea473c4384df8de867c456b797ff1221b20f822e1af673ff5812ed505358b36f47f3b084ac14c3622cb879ed833b71b288e8aa71025352a2aab4c2925a6eb
11719 languageName: node
11720 linkType: hard
11721
11601"unist-util-is@npm:^5.0.0": 11722"unist-util-is@npm:^5.0.0":
11602 version: 5.2.1 11723 version: 5.2.1
11603 resolution: "unist-util-is@npm:5.2.1" 11724 resolution: "unist-util-is@npm:5.2.1"
@@ -12029,7 +12150,7 @@ __metadata:
12029 languageName: node 12150 languageName: node
12030 linkType: hard 12151 linkType: hard
12031 12152
12032"webpack-sources@npm:^3.2.2, webpack-sources@npm:^3.2.3": 12153"webpack-sources@npm:^3.2.3":
12033 version: 3.2.3 12154 version: 3.2.3
12034 resolution: "webpack-sources@npm:3.2.3" 12155 resolution: "webpack-sources@npm:3.2.3"
12035 checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e 12156 checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e