aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-03-15 18:01:48 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-03-15 19:19:33 +0100
commit0a16f36b8afc23f335c1146d6ea53329f9e27df7 (patch)
tree91a204a8f44f605042a8498a96f68dd02a5f1705 /src
parentchore(deps): bump dependencies (diff)
downloadblog-0a16f36b8afc23f335c1146d6ea53329f9e27df7.tar.gz
blog-0a16f36b8afc23f335c1146d6ea53329f9e27df7.tar.zst
blog-0a16f36b8afc23f335c1146d6ea53329f9e27df7.zip
Add landing page sections and update resume
Diffstat (limited to 'src')
-rw-r--r--src/components/ActiveSectionProvider.tsx67
-rw-r--r--src/components/TrackActiveSection.tsx47
-rw-r--r--src/components/icons.tsx76
-rw-r--r--src/components/icons/mtmt.ts17
-rw-r--r--src/components/landing/Section.tsx14
-rw-r--r--src/components/landing/Subtitle.tsx9
-rw-r--r--src/components/landing/sections/Hero.tsx4
-rw-r--r--src/components/landing/sections/Publications.module.css76
-rw-r--r--src/components/landing/sections/Publications.tsx275
-rw-r--r--src/components/landing/sections/Research.module.css101
-rw-r--r--src/components/landing/sections/Research.tsx92
-rw-r--r--src/components/landing/sections/Resume.module.css53
-rw-r--r--src/components/landing/sections/Resume.tsx858
-rw-r--r--src/components/landing/sections/Software.module.css5
-rw-r--r--src/components/landing/sections/Software.tsx15
-rw-r--r--src/pages/index.tsx18
-rw-r--r--src/theme/NavbarItem/NavbarNavLink.jsx88
-rw-r--r--src/theme/Root.tsx18
18 files changed, 1421 insertions, 412 deletions
diff --git a/src/components/ActiveSectionProvider.tsx b/src/components/ActiveSectionProvider.tsx
new file mode 100644
index 0000000..022dbad
--- /dev/null
+++ b/src/components/ActiveSectionProvider.tsx
@@ -0,0 +1,67 @@
1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import { useLocation } from '@docusaurus/router';
8import {
9 type ReactNode,
10 createContext,
11 useCallback,
12 useContext,
13 useRef,
14 useState,
15} from 'react';
16
17export interface ActiveSection {
18 hash: string | undefined;
19 setHash: (hash: string | undefined) => void;
20}
21
22const ActiveSectionContext = createContext<ActiveSection | undefined>(
23 undefined,
24);
25
26export function useActiveSection(): ActiveSection {
27 const value = useContext(ActiveSectionContext);
28 if (value === undefined) {
29 throw new Error(
30 'useActiveSection is only valid inside ActiveSectionProvider',
31 );
32 }
33 return value;
34}
35
36export default function ActiveSectionProvider({
37 children,
38}: {
39 children: ReactNode;
40}) {
41 const location = useLocation();
42 const [hash, setHashState] = useState<string | undefined>();
43 const lastHashRef = useRef<string | undefined>();
44 const setHash = useCallback(
45 (hash: string | undefined) => {
46 if (hash === lastHashRef.current) {
47 return;
48 }
49 // Passing `undefined` to `hash` will give contraol pack to react-router.
50 const newURL = `${location.pathname}${location.search}${
51 hash ?? location.hash
52 }`;
53 // Update the history entry without informing react-router so Docusaurus
54 // doesn't scroll to the top of the element. See
55 // https://github.com/facebook/docusaurus/blob/ca3dba5e5eab0f8b8a9b3388e2b2e637fe3a19a7/packages/docusaurus/src/client/ClientLifecyclesDispatcher.tsx#L30-L39
56 window.history.replaceState(null, null, newURL);
57 setHashState(hash);
58 lastHashRef.current = hash;
59 },
60 [location, setHashState],
61 );
62 return (
63 <ActiveSectionContext.Provider value={{ hash, setHash }}>
64 {children}
65 </ActiveSectionContext.Provider>
66 );
67}
diff --git a/src/components/TrackActiveSection.tsx b/src/components/TrackActiveSection.tsx
new file mode 100644
index 0000000..bb1b2ee
--- /dev/null
+++ b/src/components/TrackActiveSection.tsx
@@ -0,0 +1,47 @@
1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import { type ReactNode, useEffect, useCallback, useRef } from 'react';
8
9import { useActiveSection } from './ActiveSectionProvider';
10
11export default function TrackActiveSection({
12 children,
13}: {
14 children: ReactNode;
15}) {
16 const { setHash } = useActiveSection();
17 const elementRef = useRef<HTMLDivElement | null>(null);
18 const callback = useCallback(() => {
19 const { current: element } = elementRef;
20 if (!element) {
21 return;
22 }
23 const currentID = Array.from(element.children)
24 .reverse()
25 .find((child) => child.getBoundingClientRect().top <= 60)?.id;
26 const currentHash =
27 currentID === undefined || currentID === '' ? '' : `#${currentID}`;
28 setHash(currentHash);
29 }, [setHash]);
30 const setElement = useCallback(
31 (element: HTMLDivElement | null) => {
32 elementRef.current = element;
33 if (element) {
34 callback();
35 } else {
36 setHash(undefined);
37 }
38 },
39 [setHash],
40 );
41 useEffect(() => {
42 window.addEventListener('scroll', callback);
43 return () => window.removeEventListener('scroll', callback);
44 });
45
46 return <div ref={setElement}>{children}</div>;
47}
diff --git a/src/components/icons.tsx b/src/components/icons.tsx
index 402b622..1411218 100644
--- a/src/components/icons.tsx
+++ b/src/components/icons.tsx
@@ -1,15 +1,37 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy 2 * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy
3 * 3 *
4 * SPDX-License-Identifier: MIT 4 * SPDX-License-Identifier: MIT
5 */ 5 */
6 6
7import { useId } from 'react'; 7import { useId } from 'react';
8import { siGithub, siGooglescholar, siLinkedin, siOrcid } from 'simple-icons'; 8import {
9 siCreativecommons,
10 siDblp,
11 siGithub,
12 siGooglescholar,
13 siLinkedin,
14 siOrcid,
15 siScopus,
16} from 'simple-icons';
9 17
10import fediverse from './icons/fediverse'; 18import fediverse from './icons/fediverse';
19import mtmt from './icons/mtmt';
11 20
12export function Icon({ path, alt }: { path: string; alt: string }) { 21export interface IconProps {
22 hidden?: boolean;
23 className?: string;
24 alt?: string;
25}
26
27export function Icon({
28 path,
29 alt,
30 hidden,
31 className,
32}: IconProps & {
33 path: string;
34}) {
13 const titleId = useId(); 35 const titleId = useId();
14 36
15 return ( 37 return (
@@ -18,37 +40,55 @@ export function Icon({ path, alt }: { path: string; alt: string }) {
18 version="1.1" 40 version="1.1"
19 xmlns="http://www.w3.org/2000/svg" 41 xmlns="http://www.w3.org/2000/svg"
20 role="img" 42 role="img"
21 aria-labelledby={titleId} 43 {...(hidden ? { 'aria-hidden': true } : { 'aria-labelledby': titleId })}
22 viewBox="0 0 24 24" 44 viewBox="0 0 24 24"
23 width="24" 45 width="24"
24 height="24" 46 height="24"
47 {...(className ? { className } : {})}
25 > 48 >
26 <path fill="currentColor" d={path} /> 49 <path fill="currentColor" d={path} />
27 </svg> 50 </svg>
28 <span className="sr-only" id={titleId}> 51 {!hidden && (
29 {alt} 52 <span className="sr-only" id={titleId}>
30 </span> 53 {alt}
54 </span>
55 )}
31 </> 56 </>
32 ); 57 );
33} 58}
34 59
60export interface SimpleIcon {
61 path: string;
62 title: string;
63}
64
35export function SimpleIcon({ 65export function SimpleIcon({
36 icon: { path, title }, 66 icon: { path, title },
37}: { 67 ...props
38 icon: { 68}: IconProps & {
39 path: string; 69 icon: SimpleIcon;
40 title: string;
41 };
42}) { 70}) {
43 return <Icon path={path} alt={title} />; 71 return <Icon path={path} {...{ ...props, alt: props.alt ?? title }} />;
44} 72}
45 73
46export const FediverseIcon = () => <SimpleIcon icon={fediverse} />; 74function makeSimpleIcon(icon: SimpleIcon): (props: IconProps) => JSX.Element {
75 return (props) => <SimpleIcon icon={icon} {...props} />;
76}
77
78export const CreativeCommonsIcon = makeSimpleIcon(siCreativecommons);
79
80export const DBLPIcon = makeSimpleIcon(siDblp);
81
82export const FediverseIcon = makeSimpleIcon(fediverse);
83
84export const GithubIcon = makeSimpleIcon(siGithub);
85
86export const GoogleScholarIcon = makeSimpleIcon(siGooglescholar);
47 87
48export const GithubIcon = () => <SimpleIcon icon={siGithub} />; 88export const LinkedInIcon = makeSimpleIcon(siLinkedin);
49 89
50export const GoogleScholarIcon = () => <SimpleIcon icon={siGooglescholar} />; 90export const MTMTIcon = makeSimpleIcon(mtmt);
51 91
52export const LinkedInIcon = () => <SimpleIcon icon={siLinkedin} />; 92export const OrcidIcon = makeSimpleIcon(siOrcid);
53 93
54export const OrcidIcon = () => <SimpleIcon icon={siOrcid} />; 94export const ScopusIcon = makeSimpleIcon(siScopus);
diff --git a/src/components/icons/mtmt.ts b/src/components/icons/mtmt.ts
new file mode 100644
index 0000000..7dc3cc4
--- /dev/null
+++ b/src/components/icons/mtmt.ts
@@ -0,0 +1,17 @@
1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy <kristof@marussy.com>
3 *
4 * SPDX-License-Identifier: CC0-1.0
5 *
6 * Icon for MTMT (Hungarian Science Bibliography) was obtained by tracing
7 * the logo of MTMT (https://m2.mtmt.hu/frontend/resources/loadingscreen/m2logo.png).
8 * The font of the logo was replaced with Noto Sans Medium for a very close
9 * non-proprietary match. Standard caveats for using brand logos as icons
10 * (e.g., https://github.com/simple-icons/simple-icons/blob/master/DISCLAIMER.md)
11 * apply, but the SVG data itself is release under CC0-1.0.
12 */
13
14export default {
15 path: 'M0 0v24h24V0Zm.5.5h23v23H.5Zm16.106 2.921-.44 1.353-.937.475v.57h.89v3.538c0 .522.083.93.25 1.222.174.293.407.499.7.618.293.118.613.178.962.178.229 0 .455-.024.676-.072.23-.04.416-.09.558-.154v-.95a2.644 2.644 0 0 1-.451.12 3.769 3.769 0 0 1-.51.035c-.278 0-.503-.083-.677-.25-.166-.166-.25-.423-.25-.771V5.819h1.829v-.961h-1.828V3.42ZM7.857 4.74c-.38 0-.74.079-1.08.237-.34.159-.606.404-.796.736h-.07l-.179-.854h-.997v6.398h1.258V8.027c0-.728.111-1.286.333-1.674.23-.387.645-.581 1.246-.581.807 0 1.211.494 1.211 1.484v4h1.247V7.814c0-.657.122-1.16.367-1.508.246-.356.653-.534 1.223-.534.8 0 1.2.494 1.2 1.484v4h1.257V7.09c0-.823-.182-1.42-.546-1.792-.364-.372-.906-.558-1.626-.558a2.74 2.74 0 0 0-1.151.25 1.86 1.86 0 0 0-.855.783h-.095c-.309-.689-.958-1.033-1.947-1.033Zm8.749 7.886-.44 1.354-.937.474v.57h.89v3.538c0 .522.083.93.25 1.223.174.292.407.498.7.617.293.118.613.178.962.178.229 0 .455-.024.676-.071.23-.04.416-.091.558-.155v-.95a2.637 2.637 0 0 1-.451.12 3.769 3.769 0 0 1-.51.035c-.278 0-.503-.083-.677-.25-.166-.166-.25-.423-.25-.771v-3.514h1.829v-.961h-1.828v-1.437zm-8.749 1.318c-.38 0-.74.08-1.08.237-.34.159-.606.404-.796.736h-.07l-.179-.854h-.997v6.398h1.258v-3.229c0-.728.111-1.286.333-1.674.23-.387.645-.581 1.246-.581.807 0 1.211.494 1.211 1.484v4h1.247v-3.442c0-.657.122-1.16.367-1.508.246-.356.653-.534 1.223-.534.8 0 1.2.494 1.2 1.484v4h1.257v-4.167c0-.823-.182-1.42-.546-1.792-.364-.372-.906-.558-1.626-.558a2.74 2.74 0 0 0-1.151.25 1.86 1.86 0 0 0-.855.783h-.095c-.309-.689-.958-1.033-1.947-1.033z',
16 title: 'MTMT',
17};
diff --git a/src/components/landing/Section.tsx b/src/components/landing/Section.tsx
index f44272d..caec6b6 100644
--- a/src/components/landing/Section.tsx
+++ b/src/components/landing/Section.tsx
@@ -4,21 +4,33 @@
4 * SPDX-License-Identifier: MIT 4 * SPDX-License-Identifier: MIT
5 */ 5 */
6 6
7import useBrokenLinks from '@docusaurus/useBrokenLinks';
7import type { ReactNode } from 'react'; 8import type { ReactNode } from 'react';
8 9
9import styles from './Section.module.css'; 10import styles from './Section.module.css';
10 11
11export default function Section({ 12export default function Section({
12 title, 13 title,
14 id,
13 children, 15 children,
14}: { 16}: {
15 title: string; 17 title: string;
18 id: string;
16 children?: ReactNode; 19 children?: ReactNode;
17}) { 20}) {
21 // Make sure the section anchors are not reported as broken.
22 // See https://docusaurus.io/blog/releases/3.1#broken-anchors-checker and
23 // https://github.com/facebook/docusaurus/issues/9721#issuecomment-1882898840
24 useBrokenLinks().collectAnchor(id);
25
18 return ( 26 return (
19 <section className={styles.section}> 27 <section id={id} className={styles.section}>
20 <h2 className={styles.section__title}>{title}</h2> 28 <h2 className={styles.section__title}>{title}</h2>
21 {children} 29 {children}
22 </section> 30 </section>
23 ); 31 );
24} 32}
33
34Section.defaultProps = {
35 children: undefined,
36};
diff --git a/src/components/landing/Subtitle.tsx b/src/components/landing/Subtitle.tsx
index d514f71..862ea3c 100644
--- a/src/components/landing/Subtitle.tsx
+++ b/src/components/landing/Subtitle.tsx
@@ -12,13 +12,18 @@ export default function Subtitle({
12 icon, 12 icon,
13 children, 13 children,
14}: { 14}: {
15 icon: string; 15 icon?: string;
16 children?: ReactNode; 16 children?: ReactNode;
17}) { 17}) {
18 return ( 18 return (
19 <h3 className={styles.subtitle}> 19 <h3 className={styles.subtitle}>
20 {icon !== undefined && <>{icon}&nbsp;</>} 20 {icon !== undefined && <span aria-hidden="true">{icon}&nbsp;</span>}
21 {children} 21 {children}
22 </h3> 22 </h3>
23 ); 23 );
24} 24}
25
26Subtitle.defaultProps = {
27 icon: undefined,
28 children: undefined,
29};
diff --git a/src/components/landing/sections/Hero.tsx b/src/components/landing/sections/Hero.tsx
index a56deb1..35f5bd9 100644
--- a/src/components/landing/sections/Hero.tsx
+++ b/src/components/landing/sections/Hero.tsx
@@ -1,5 +1,5 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy 2 * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy
3 * 3 *
4 * SPDX-License-Identifier: MIT 4 * SPDX-License-Identifier: MIT
5 */ 5 */
@@ -66,7 +66,7 @@ export default function Hero({ avatar }: { avatar: string }) {
66 )} 66 )}
67 > 67 >
68 Read my CV 68 Read my CV
69 </a> 69 </a>{' '}
70 <a 70 <a
71 href="#contact" 71 href="#contact"
72 className={clsx( 72 className={clsx(
diff --git a/src/components/landing/sections/Publications.module.css b/src/components/landing/sections/Publications.module.css
new file mode 100644
index 0000000..c9a39ba
--- /dev/null
+++ b/src/components/landing/sections/Publications.module.css
@@ -0,0 +1,76 @@
1/*
2 * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7.publications__item {
8 margin-top: 1rem;
9}
10
11.link {
12 white-space: nowrap;
13}
14
15.link--license {
16 --ifm-link-color: var(--ifm-color-secondary-contrast-foreground);
17 --ifm-link-hover-color: var(--ifm-link-color);
18}
19
20[data-theme='dark'] .link--license {
21 --ifm-link-color: var(--ifm-color-emphasis-500);
22}
23
24.link--lower {
25 text-transform: lowercase;
26}
27
28.link__icon {
29 vertical-align: text-top;
30 width: 1em;
31 height: 1em;
32 margin-right: 0.125rem;
33}
34
35.elsewhere {
36 display: flex;
37 flex-direction: row;
38 align-items: center;
39 flex-wrap: wrap;
40 column-gap: 0.25rem;
41}
42
43.elsewhere__text {
44 margin: 0;
45}
46
47.elsewhere__list {
48 display: flex;
49 margin: 0;
50 padding: 0;
51}
52
53.elsewhere__item {
54 display: flex;
55 align-items: center;
56 margin: 0;
57 list-style-type: none;
58}
59
60.elsewhere__icon {
61 display: flex;
62 padding: 0.375rem;
63 --ifm-link-color: var(--ifm-color-secondary-contrast-foreground);
64 --ifm-link-hover-color: var(--ifm-color-emphasis-700);
65 --ifm-link-text-decoration: none;
66}
67
68[data-theme='dark'] .elsewhere__icon {
69 --ifm-link-color: var(--ifm-color-secondary);
70 --ifm-link-hover-color: var(--ifm-color-secondary-dark);
71}
72
73.elsewhere__icon svg {
74 width: 1.75rem;
75 height: 1.75rem;
76}
diff --git a/src/components/landing/sections/Publications.tsx b/src/components/landing/sections/Publications.tsx
new file mode 100644
index 0000000..e343c42
--- /dev/null
+++ b/src/components/landing/sections/Publications.tsx
@@ -0,0 +1,275 @@
1/*
2 * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import {
8 ArrowSquareOut,
9 Certificate,
10 File,
11 Lock,
12 Package,
13 Play,
14} from '@phosphor-icons/react';
15import clsx from 'clsx';
16
17import {
18 CreativeCommonsIcon,
19 DBLPIcon,
20 GoogleScholarIcon,
21 MTMTIcon,
22 OrcidIcon,
23 ScopusIcon,
24} from '@site/src/components/icons';
25import Section from '@site/src/components/landing/Section';
26import Subtitle from '@site/src/components/landing/Subtitle';
27import styles from './Publications.module.css';
28
29function DOILink({ doi }: { doi: string }) {
30 return (
31 <a
32 href={`https://doi.org/${doi}`}
33 className={clsx(styles.link, styles['link--lower'])}
34 >
35 <ArrowSquareOut
36 weight="bold"
37 aria-hidden="true"
38 className={styles.link__icon}
39 />
40 DOI
41 </a>
42 );
43}
44
45function PDFLink({ filename }: { filename: string }) {
46 return (
47 <a
48 href={`/papers/${filename}.pdf`}
49 className={clsx(styles.link, styles['link--lower'])}
50 >
51 <File weight="bold" aria-hidden="true" className={styles.link__icon} />
52 PDF
53 </a>
54 );
55}
56
57function ArtifactLink({ doi }: { doi: string }) {
58 return (
59 <a
60 href={`https://doi.org/${doi}`}
61 className={clsx(styles.link, styles['link--lower'])}
62 >
63 <Package weight="bold" aria-hidden="true" className={styles.link__icon} />
64 Artifact
65 </a>
66 );
67}
68
69function ArxivLink({ arxivID }: { arxivID: string }) {
70 return (
71 <a href={`https://arxiv.org/abs/${arxivID}`} className={styles.link}>
72 <ArrowSquareOut
73 weight="bold"
74 aria-hidden="true"
75 className={styles.link__icon}
76 />
77 arXiv
78 </a>
79 );
80}
81
82function VideoLink({ url }: { url: string }) {
83 return (
84 <a href={url} className={clsx(styles.link, styles['link--lower'])}>
85 <Play weight="bold" aria-hidden="true" className={styles.link__icon} />
86 Video
87 </a>
88 );
89}
90
91function ClosedAccess({ publisher, url }: { publisher: string; url: string }) {
92 return (
93 <a
94 href={url}
95 rel="nofollow"
96 className={clsx(styles.link, styles['link--license'])}
97 >
98 <Lock weight="bold" aria-hidden="true" className={styles.link__icon} />
99 <span className="sr-only">Closed Access: </span>
100 {publisher}
101 </a>
102 );
103}
104
105function OpenAccess({ license }: { license: string }) {
106 const url = `https://creativecommons.org/licenses/${license}/4.0/`;
107 return (
108 <a href={url} className={clsx(styles.link, styles['link--license'])}>
109 <CreativeCommonsIcon className={styles.link__icon} hidden />
110 <span className="sr-only">Open Access: </span>
111 CC-{license.toUpperCase()}-4.0
112 </a>
113 );
114}
115
116function ArtifactLicense({ license, url }: { license: string; url: string }) {
117 return (
118 <a href={url} className={clsx(styles.link, styles['link--license'])}>
119 <Certificate
120 weight="bold"
121 aria-hidden="true"
122 className={styles.link__icon}
123 />
124 <span className="sr-only">Artifact license: </span>
125 {license}
126 </a>
127 );
128}
129
130export default function Publications() {
131 return (
132 <Section id="publications" title="Publications">
133 <div className="container">
134 <section>
135 <Subtitle icon="📌">Selected publications</Subtitle>
136 <ul>
137 <li className={styles.publications__item}>
138 <b>Kristóf Marussy</b>, Attila Ficsor, Oszkár Semeráth, Dániel
139 Varró (2024). Refinery: Graph Solver as a Service. In&nbsp;
140 <i>
141 International Conference on Software Engineering (ICSE) 2024
142 </i>
143 . <PDFLink filename="icse24" />{' '}
144 <VideoLink url="https://www.youtube.com/watch?v=Qy_3udNsWsM" />{' '}
145 <OpenAccess license="by" />
146 </li>
147 <li className={styles.publications__item}>
148 Máté Földiák, <b>Kristóf Marussy</b>, Dániel Varró, István Majzik
149 (2022). System architecture synthesis for performability by logic
150 solvers. In&nbsp;
151 <i>
152 International Conference on Model Driven Engineering Languages
153 and Systems (MODELS) 2022,
154 </i>{' '}
155 pp.&nbsp;433&ndash;45. <DOILink doi="10.1145/3550355.3552448" />{' '}
156 <PDFLink filename="models22" />{' '}
157 <ClosedAccess
158 publisher="ACM"
159 url="https://authors.acm.org/journals/rights-permissions"
160 />{' '}
161 <ArtifactLink doi="10.5281/zenodo.6974248" />{' '}
162 <ArtifactLicense
163 license="EPL-2.0"
164 url="https://www.eclipse.org/legal/epl-v20.html"
165 />
166 </li>
167 <li className={styles.publications__item}>
168 Boqi Chen, <b>Kristóf Marussy</b>, Sebastian Pilarski, Oszkár
169 Semeráth, Dániel Varró (2022). Consistent Scene Graph Generation
170 by Constraint Optimization. In&nbsp;
171 <i>
172 International Conference on Automated Software Engineering (ASE)
173 2022
174 </i>
175 . <DOILink doi="10.1145/3551349.3560433" />{' '}
176 <PDFLink filename="ase22" /> <OpenAccess license="by" />
177 </li>
178 <li className={styles.publications__item}>
179 <b>Kristóf Marussy</b>, Oszkár Semeráth, Dániel Varró (2022).{' '}
180 Automated Generation of Consistent Graph Models With Multiplicity
181 Reasoning. <i>IEEE Transactions on Software Engineering,</i>{' '}
182 volume 48, issue 5. <DOILink doi="10.1109/TSE.2020.3025732 " />{' '}
183 <PDFLink filename="tse22" /> <OpenAccess license="by" />
184 </li>
185 <li className={styles.publications__item}>
186 Márton Búr, <b>Kristóf Marussy</b>, Brett H.&nbsp;Meyer, Dániel
187 Varró (2021). Worst-case Execution Time Calculation for
188 Query-based Monitors by Witness Generation.{' '}
189 <i>ACM Transactions on Embedded Computing Systems,</i> volume 20,
190 issue 6. <DOILink doi="10.1145/3239372.3239412" />{' '}
191 <ArxivLink arxivID="2102.03116" /> <PDFLink filename="tecs21" />{' '}
192 <OpenAccess license="by" />
193 </li>
194 <li className={styles.publications__item}>
195 <b>Kristóf Marussy</b>, Oszkár Semeráth, Aren A.&nbsp;Babikian,
196 Dániel Varró (2020). A Specification Language for Consistent Model
197 Generation based on Partial Models.{' '}
198 <i>Journal of Object Technology,</i> volume 19,
199 pp.&nbsp;3:1&ndash;22. <DOILink doi="10.5381/jot.2020.19.3.a12" />{' '}
200 <PDFLink filename="jot20" />{' '}
201 <VideoLink url="https://www.youtube.com/watch?v=ggTbv_s5t2A" />{' '}
202 <OpenAccess license="by-nd" />
203 </li>
204 <li className={styles.publications__item}>
205 <b>Kristóf Marussy</b> and Oszkár Semeráth (2018). Incremental
206 View Model Synchronization Using Partial Models. In&nbsp;
207 <i>
208 International Conference on Model Driven Engineering Languages
209 and Systems (MODELS) 2018,
210 </i>{' '}
211 pp.&nbsp;323&ndash;333. <DOILink doi="10.1145/3239372.3239412" />{' '}
212 <PDFLink filename="models18" />{' '}
213 <ClosedAccess
214 publisher="ACM"
215 url="https://authors.acm.org/journals/rights-permissions"
216 />{' '}
217 <ArtifactLink doi="10.5281/zenodo.1318156" />{' '}
218 <ArtifactLicense
219 license="EPL-1.0"
220 url="https://www.eclipse.org/legal/epl-v10.html"
221 />
222 </li>
223 </ul>
224 </section>
225 <div className={styles.elsewhere}>
226 <p className={styles.elsewhere__text}>
227 See the full list of my publications at
228 </p>
229 <ul className={styles.elsewhere__list}>
230 <li className={styles.elsewhere__item}>
231 <a
232 href="https://orcid.org/0000-0002-9135-8256"
233 className={styles.elsewhere__icon}
234 >
235 <OrcidIcon />
236 </a>
237 </li>
238 <li className={styles.elsewhere__item}>
239 <a
240 href="https://dblp.org/pid/130/6479.html"
241 className={styles.elsewhere__icon}
242 >
243 <DBLPIcon />
244 </a>
245 </li>
246 <li className={styles.elsewhere__item}>
247 <a
248 href="https://scholar.google.com/citations?user=E9CKNYoAAAAJ"
249 className={styles.elsewhere__icon}
250 >
251 <GoogleScholarIcon />
252 </a>
253 </li>
254 <li className={styles.elsewhere__item}>
255 <a
256 href="https://www.scopus.com/authid/detail.uri?authorId=55860043200"
257 className={styles.elsewhere__icon}
258 >
259 <ScopusIcon />
260 </a>
261 </li>
262 <li className={styles.elsewhere__item}>
263 <a
264 href="https://m2.mtmt.hu/gui2/?type=authors&mode=browse&sel=authors10062709"
265 className={styles.elsewhere__icon}
266 >
267 <MTMTIcon />
268 </a>
269 </li>
270 </ul>
271 </div>
272 </div>
273 </Section>
274 );
275}
diff --git a/src/components/landing/sections/Research.module.css b/src/components/landing/sections/Research.module.css
new file mode 100644
index 0000000..c5c87a4
--- /dev/null
+++ b/src/components/landing/sections/Research.module.css
@@ -0,0 +1,101 @@
1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7.topics {
8 margin-top: 1.5rem;
9}
10
11.topic {
12 container-type: inline-size;
13}
14
15.topic__contents {
16 display: flex;
17 flex-direction: column;
18 align-items: center;
19}
20
21.topic__icon {
22 display: flex;
23 justify-content: center;
24 align-items: center;
25}
26
27.topic__icon--system {
28 color: #f5a614;
29}
30
31[data-theme='dark'] .topic__icon--system {
32 color: #e6ac5b;
33}
34
35.topic__icon--verification {
36 color: #1eae4e;
37}
38
39[data-theme='dark'] .topic__icon--verification {
40 color: #63c177;
41}
42
43.topic__icon--reasoning {
44 color: #af3b6e;
45}
46
47[data-theme='dark'] .topic__icon--reasoning {
48 color: #d67a9d;
49}
50
51.topic__icon--graph {
52 color: #038a99;
53}
54
55[data-theme='dark'] .topic__icon--graph {
56 color: #56b6c2;
57}
58
59.topic__text {
60 flex-grow: 1;
61}
62
63.topic__title {
64 margin-top: 1rem;
65 text-align: center;
66 --casl: 0;
67}
68
69.topic__description {
70 margin: 0;
71}
72
73@container (min-width: 450px) {
74 .topic .topic__contents {
75 margin: 0.625rem 0;
76 flex-direction: row;
77 gap: 1rem;
78 }
79
80 .topic .topic__title {
81 margin-top: 0;
82 text-align: left;
83 }
84
85 .topic:nth-of-type(2n) .topic__contents {
86 flex-direction: row-reverse;
87 }
88
89 .topic:nth-of-type(2n) .topic__title,
90 .topic:nth-of-type(2n) .topic__description {
91 text-align: right;
92 }
93
94 .topic:first-of-type .topic__contents {
95 margin-top: 0;
96 }
97
98 .topic:last-of-type .topic__contents {
99 margin-top: 0;
100 }
101}
diff --git a/src/components/landing/sections/Research.tsx b/src/components/landing/sections/Research.tsx
new file mode 100644
index 0000000..b6e5954
--- /dev/null
+++ b/src/components/landing/sections/Research.tsx
@@ -0,0 +1,92 @@
1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import clsx from 'clsx';
8import type { ReactNode } from 'react';
9
10import {
11 type Icon,
12 Gear,
13 Graph,
14 MagicWand,
15 ShieldCheck,
16} from '@phosphor-icons/react';
17
18import Section from '@site/src/components/landing/Section';
19
20import styles from './Research.module.css';
21
22function Topic({
23 title,
24 style,
25 Icon,
26 children,
27}: {
28 title: string;
29 style: string;
30 Icon: Icon;
31 children: ReactNode;
32}) {
33 return (
34 <div className={clsx('col', 'col-3', styles.topic)}>
35 <div className={styles.topic__contents}>
36 <div className={clsx(styles.topic__icon, style)}>
37 <Icon aria-hidden="true" size={128} weight="light" />
38 </div>
39 <div className={styles.topic__text}>
40 <h3 className={styles.topic__title}>{title}</h3>
41 <p className={styles.topic__description}>{children}</p>
42 </div>
43 </div>
44 </div>
45 );
46}
47
48export default function Research() {
49 return (
50 <Section id="research" title="Research">
51 <div className={clsx('container', styles.topics)}>
52 <div className="row">
53 <Topic
54 title="Critical systems"
55 Icon={Gear}
56 style={styles['topic__icon--system']}
57 >
58 Cyber-physical systems especially in&nbsp;the railway, automotive,
59 and aerospace domains with stringent correctness and relability
60 requirements
61 </Topic>
62 <Topic
63 title="Formal verification"
64 Icon={ShieldCheck}
65 style={styles['topic__icon--verification']}
66 >
67 Proving the safety and reliability of critical system designs and
68 software components in a mathematically precise way
69 </Topic>
70 <Topic
71 title="Automated reasoning"
72 Icon={MagicWand}
73 style={styles['topic__icon--reasoning']}
74 >
75 Integrating logical and numerical solvers with intelligent
76 heuristics to&nbsp;answer challenging analysis questions and
77 synthesize reliable system designs
78 </Topic>
79 <Topic
80 title="Graph generation"
81 Icon={Graph}
82 style={styles['topic__icon--graph']}
83 >
84 Efficient graph-based information processing for system modeling,
85 testing data-driven systems, and knowledge representation in
86 autonomous systems
87 </Topic>
88 </div>
89 </div>
90 </Section>
91 );
92}
diff --git a/src/components/landing/sections/Resume.module.css b/src/components/landing/sections/Resume.module.css
index 246ebec..fb576a1 100644
--- a/src/components/landing/sections/Resume.module.css
+++ b/src/components/landing/sections/Resume.module.css
@@ -1,9 +1,41 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy 2 * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy
3 * 3 *
4 * SPDX-License-Identifier: MIT 4 * SPDX-License-Identifier: MIT
5 */ 5 */
6 6
7.resume {
8 display: flow-root;
9 margin: 0 calc(var(--ifm-spacing-horizontal) * -1);
10}
11
12.resume__section {
13 width: 50%;
14 /* Floats don't let margins to merge, so we merge them manually. */
15 margin-bottom: -1rem;
16 padding: 0 var(--ifm-spacing-horizontal);
17}
18
19.resume__section:nth-of-type(2n + 1) {
20 float: left;
21 clear: left;
22}
23
24.resume__section:nth-of-type(2n) {
25 float: right;
26 clear: right;
27}
28
29@media (max-width: 996px) {
30 .resume__section {
31 width: 100%;
32 /* No need to merge margins any more. */
33 margin-bottom: 0;
34 float: none !important;
35 clear: none !important;
36 }
37}
38
7.cv { 39.cv {
8 position: relative; 40 position: relative;
9} 41}
@@ -36,6 +68,10 @@
36 border-radius: 100em; 68 border-radius: 100em;
37} 69}
38 70
71.cv__item--no-title::before {
72 top: 0.25rem;
73}
74
39[data-theme='dark'] .cv__item::before { 75[data-theme='dark'] .cv__item::before {
40 background: var(--ifm-background-color); 76 background: var(--ifm-background-color);
41} 77}
@@ -84,13 +120,13 @@
84 --ifm-link-hover-color: var(--ifm-color-primary-light); 120 --ifm-link-hover-color: var(--ifm-color-primary-light);
85} 121}
86 122
87.cv__awarddesc { 123.cv__muted {
88 font-size: 0.875rem; 124 font-size: 0.875rem;
89 color: var(--ifm-color-emphasis-800); 125 color: var(--ifm-color-secondary-contrast-foreground);
90} 126}
91 127
92[data-theme='dark'] .cv__awarddesc { 128[data-theme='dark'] .cv__muted {
93 color: var(--ifm-color-emphasis-600); 129 color: var(--ifm-color-emphasis-500);
94} 130}
95 131
96.cv__activities { 132.cv__activities {
@@ -106,6 +142,13 @@
106 margin: 0; 142 margin: 0;
107} 143}
108 144
145.thesis-rights__icon {
146 vertical-align: text-top;
147 width: 1em;
148 height: 1em;
149 margin-right: 0.125rem;
150}
151
109.thesis-links { 152.thesis-links {
110 display: flex; 153 display: flex;
111 column-gap: 0.5rem; 154 column-gap: 0.5rem;
diff --git a/src/components/landing/sections/Resume.tsx b/src/components/landing/sections/Resume.tsx
index 40ceeb0..fe97434 100644
--- a/src/components/landing/sections/Resume.tsx
+++ b/src/components/landing/sections/Resume.tsx
@@ -1,9 +1,10 @@
1/* 1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy 2 * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy
3 * 3 *
4 * SPDX-License-Identifier: MIT AND CC-BY-4.0 4 * SPDX-License-Identifier: MIT AND CC-BY-4.0
5 */ 5 */
6 6
7import { Lock } from '@phosphor-icons/react';
7import clsx from 'clsx'; 8import clsx from 'clsx';
8 9
9import Section from '@site/src/components/landing/Section'; 10import Section from '@site/src/components/landing/Section';
@@ -11,386 +12,487 @@ import Subtitle from '@site/src/components/landing/Subtitle';
11 12
12import styles from './Resume.module.css'; 13import styles from './Resume.module.css';
13 14
15function ResumeSection({ children }: { children?: React.ReactNode }) {
16 return <div className={styles.resume__section}>{children}</div>;
17}
18
19function Education() {
20 return (
21 <ResumeSection>
22 <Subtitle icon="🎓">Education</Subtitle>
23 <ul className={styles.cv}>
24 <li className={styles.cv__item}>
25 <h4 className={styles.cv__title}>Doctor of Philosophy (PhD)</h4>
26 <p className={styles.cv__times}>
27 <span className={styles.cv__time}>2018&ndash;2023</span>
28 </p>
29 <p>
30 <i>Budapest Unversity of Technology and Economics</i>
31 </p>
32 <p>
33 Thesis:{' '}
34 <a href="/thesis.pdf">
35 <b>
36 Abstraction Techniques for the Analysis and Synthesis of
37 Critical Cyber-Physical System Architectures
38 </b>
39 </a>
40 </p>
41 <p className={styles.cv__muted}>
42 <Lock
43 weight="bold"
44 aria-hidden="true"
45 className={styles['thesis-rights__icon']}
46 />
47 Some poritions exclusively licensed to their original publishers
48 </p>
49 <div className={styles['thesis-links']}>
50 <a
51 href="/thesis.pdf"
52 className={clsx(
53 'button',
54 'button--primary',
55 styles['thesis-links__link'],
56 )}
57 >
58 Read now
59 </a>
60 <a
61 href="/thesis-booklet-en.pdf"
62 className={clsx(
63 'button',
64 'button--secondary',
65 styles['thesis-links__link'],
66 )}
67 >
68 Extended abstract
69 </a>
70 <a
71 href="http://hdl.handle.net/10890/41832"
72 className={styles['thesis-links__link']}
73 >
74 Also available via HDL.NET
75 </a>
76 </div>
77 </li>
78 <li className={styles.cv__item}>
79 <h4 className={styles.cv__title}>Master of Science (MSc)</h4>
80 <p className={styles.cv__times}>
81 <span className={styles.cv__time}>2016&ndash;2018</span>
82 </p>
83 <p>
84 <i>Budapest Unversity of Technology and Economics</i>
85 </p>
86 </li>
87 <li className={styles.cv__item}>
88 <h4 className={styles.cv__title}>Bachleor of Science (BSc)</h4>
89 <p className={styles.cv__times}>
90 <span className={styles.cv__time}>2012&ndash;2016</span>
91 </p>
92 <p>
93 <i>Budapest Unversity of Technology and Economics</i>
94 </p>
95 </li>
96 </ul>
97 </ResumeSection>
98 );
99}
100
101function Experience() {
102 return (
103 <ResumeSection>
104 <Subtitle icon="👨‍💼">Professional experience</Subtitle>
105 <ul className={styles.cv}>
106 <li className={styles.cv__item}>
107 <h4 className={styles.cv__title}>Research fellow</h4>
108 <p className={styles.cv__times}>
109 <span className={styles.cv__time}>2024&ndash;</span>
110 </p>
111 </li>
112 <li className={styles.cv__item}>
113 <h4 className={styles.cv__title}>Assistant research fellow</h4>
114 <p className={styles.cv__times}>
115 <span className={styles.cv__time}>2020&ndash;2023</span>
116 </p>
117 <p>
118 <i>
119 Department of Measurement and Information Systems, Budapest
120 University of Technology and Economics, Hungary
121 </i>
122 </p>
123 <ul className={styles.cv__activities}>
124 <li className={styles.cv__activity}>
125 Performing research and developing tools to address challenges in
126 the development of critical systems motivated by case studies and
127 collaborations with industry partners
128 </li>
129 <li className={styles.cv__activity}>
130 Created reliability models for{' '}
131 <i>distributed railway interlocking systems</i> in a{' '}
132 <a href="https://projektek.bme.hu/index.php?site=3_0_0&i=28">
133 Hungarian national project
134 </a>{' '}
135 with{' '}
136 <a href="https://www.prolan.hu/" rel="nofollow">
137 Prolan Zrt.
138 </a>
139 </li>
140 <li className={styles.cv__activity}>
141 Formally verified a <i>critical automotive subsystem</i> in a{' '}
142 <a href="https://projektek.bme.hu/index.php?site=3_1_0&i=18">
143 Hungarian national project
144 </a>{' '}
145 with{' '}
146 <a href="https://www.thyssenkrupp.hu/en" rel="nofollow">
147 thyssenkrupp Ltd.
148 </a>
149 </li>
150 </ul>
151 </li>
152 <li className={styles.cv__item}>
153 <h4 className={styles.cv__title}>Assistant research fellow</h4>
154 <p className={styles.cv__times}>
155 <span className={styles.cv__time}>2018&ndash;2019</span>
156 </p>
157 <p>
158 <i>
159 <a href="https://web.archive.org/web/20200919160859/https://lendulet.inf.mit.bme.hu/">
160 MTA-BME <span lang="hu">Lendület</span> Cyber-Physical Systems
161 Research Group
162 </a>
163 </i>
164 </p>
165 </li>
166 <li className={styles.cv__item}>
167 <h4 className={styles.cv__title}>Research trainee</h4>
168 <p className={styles.cv__times}>
169 <span className={styles.cv__time}>2014-2015</span>
170 </p>
171 <p>
172 <i>
173 <a href="https://web.archive.org/web/20150925191035/http://biointelligence.hu/">
174 BioIntelligence Research Group,
175 </a>{' '}
176 <a href="https://semmelweis.hu/genomikai-medicina/en/">
177 Institute of Genomic Medicine and Rare Disorders,
178 </a>{' '}
179 <a href="https://semmelweis.hu/en/">Semmelweis University,</a>{' '}
180 Budapest, Hungary
181 </i>
182 </p>
183 </li>
184 </ul>
185 </ResumeSection>
186 );
187}
188
189function Awards() {
190 return (
191 <ResumeSection>
192 <Subtitle icon="🏅">Scholarships and awards</Subtitle>
193 <ul className={styles.cv}>
194 <li className={styles.cv__item}>
195 <h4 className={styles.cv__title}>
196 <a href="https://www.unkp.gov.hu/">
197 New National Excellence Programme (<span lang="hu">ÚNKP</span>)
198 </a>
199 </h4>
200 <p className={styles.cv__times}>
201 <span className={styles.cv__time}>2016 (MSc)</span>{' '}
202 <span className={styles.cv__time}>2018 (PhD student)</span>{' '}
203 <span className={styles.cv__time}>2021 (PhD candidate)</span>{' '}
204 <span className={styles.cv__time}>2023 (postdoc)</span>{' '}
205 </p>
206 <p className={styles.cv__muted}>
207 Awarded by the{' '}
208 <a href="https://web.archive.org/web/20230531162207/https://nkfih.gov.hu/english/nrdi-fund/new-national-excellence-programme-unkp-23-3/call-for-applications">
209 National Research, Development and Innovation Office (NRDI)
210 </a>{' '}
211 of Hungary to around 700 recipients per year
212 </p>
213 </li>
214 <li className={styles.cv__item}>
215 <h4 className={styles.cv__title}>
216 <a href="https://www.mit.bme.hu/events/2023/11/14/schnell-alapitvany-palyazati-felhivasok-2023">
217 2023 Josef Heim Award
218 </a>
219 </h4>
220 <p className={styles.cv__muted}>
221 Awarded by the{' '}
222 <a href="https://www.mit.bme.hu/general/alapitvany">
223 László Schell Foundation
224 </a>{' '}
225 to 1 member of the{' '}
226 <i>Department of Measurement and Information Systems</i> per year
227 for exceptional work in innovation
228 </p>
229 </li>
230 <li className={styles.cv__item}>
231 <h4 className={styles.cv__title}>
232 <a href="https://2021.splashcon.org/track/splash-2021-Artifacts#Chairs-Report">
233 OOPSLA 2021 Distinguished Artifact Reviewer
234 </a>
235 </h4>
236 </li>
237 <li className={styles.cv__item}>
238 <h4 className={styles.cv__title}>
239 <a href="https://www.mit.bme.hu/node/10575">
240 2020 László Schnell Award
241 </a>
242 </h4>
243 </li>
244 </ul>
245 </ResumeSection>
246 );
247}
248
249function Visits() {
250 return (
251 <ResumeSection>
252 <Subtitle icon="🏕️">Research visits</Subtitle>
253 <ul className={styles.cv}>
254 <li className={styles.cv__item}>
255 <h4 className={styles.cv__title}>Graduate research trainee</h4>
256 <p className={styles.cv__times}>
257 <span className={styles.cv__time}>May&ndash;June 2019</span>{' '}
258 <span className={styles.cv__time}>October 2020</span>
259 </p>
260 <p>
261 <i>
262 <a href="https://web.archive.org/web/20201124184148/https://www.mcgill.ca/ece/daniel-varro">
263 Department of Electrical and Computer Engineering,
264 </a>{' '}
265 <a href="https://www.mcgill.ca/">McGill Univeristy,</a>{' '}
266 </i>
267 Montreal, Canada
268 </p>
269 </li>
270 <li className={styles.cv__item}>
271 <h4 className={styles.cv__title}>Visting researcher</h4>
272 <p className={styles.cv__times}>
273 <span className={styles.cv__time}>March 2019</span>{' '}
274 </p>
275 <p>
276 <i>
277 <a href="https://web.archive.org/web/20190430204608/https://people.disim.univaq.it/cortelle/">
278 Department of Computer Science and Engineering, and Mathematics,
279 </a>{' '}
280 <a href="https://www.univaq.it/en/index.php?&lang_s=en">
281 University of L'Aquila,
282 </a>{' '}
283 </i>
284 Italy
285 </p>
286 </li>
287 </ul>
288 </ResumeSection>
289 );
290}
291
292function Teaching() {
293 return (
294 <ResumeSection>
295 <Subtitle icon="👨‍🏫">Teaching and mentoring</Subtitle>
296 <ul className={styles.cv}>
297 <li className={styles.cv__item}>
298 <h4 className={styles.cv__title}>
299 Course coordinator of{' '}
300 <a href="https://portal.vik.bme.hu/kepzes/targyak/VIMIMB11/hu/">
301 Critical Systems Laboratory
302 </a>
303 </h4>
304 <p className={styles.cv__times}>
305 <span className={styles.cv__time}>2024&ndash;</span>
306 </p>
307 </li>
308 <li className={styles.cv__item}>
309 <h4 className={styles.cv__title}>Teaching assistant</h4>
310 <p className={styles.cv__times}>
311 <span className={styles.cv__time}>2014&ndash;2023</span>
312 </p>
313 <ul className={styles.cv__activities}>
314 <li className={styles.cv__activity}>
315 Courses at the{' '}
316 <a href="https://mit.bme.hu">
317 Deparment of Measurement and Information Systems
318 </a>{' '}
319 and the{' '}
320 <a href="https://cs.bme.hu">
321 Deparment of Computer Science and Information Theory
322 </a>
323 </li>
324 <li className={styles.cv__activity}>
325 Including practice and lab sessions in the{' '}
326 <a href="https://imsc.vik.bme.hu/">IMsc programme</a> of BME for
327 talented BSc students
328 </li>
329 </ul>
330 </li>
331 <li className={styles.cv__item}>
332 <h4 className={styles.cv__title}>
333 Supervised BSc and MSc{' '}
334 <a href="https://diplomaterv.vik.bme.hu/hu/Supervisors/Marussy-Kristof">
335 thesis works
336 </a>
337 </h4>
338 <p className={styles.cv__times}>
339 <span className={styles.cv__time}>7 &times; BSc</span>{' '}
340 <span className={styles.cv__time}>4 &times; MSc</span>{' '}
341 <span className={styles.cv__time}>
342 1 &times; MSc{' '}
343 <a href="https://www.unkp.gov.hu/" lang="hu">
344 ÚNKP
345 </a>{' '}
346 student research
347 </span>
348 </p>
349 </li>
350 <li className={styles.cv__item}>
351 <h4 className={styles.cv__title}>
352 Supervised{' '}
353 <a href="https://tdk.bme.hu/Browse/Users/Marussy-Kristof">
354 Scientific Students' Association
355 </a>{' '}
356 research
357 </h4>
358 <p className={styles.cv__times}>
359 <span className={styles.cv__time}>5 &times; 🥇</span>{' '}
360 <span className={styles.cv__time}>4 &times; 🥈</span>{' '}
361 <span className={styles.cv__time}>1 &times; 🥉</span>{' '}
362 <span className={styles.cv__time}>1 &times; merit</span>
363 at university level
364 </p>
365 <p className={styles.cv__times}>
366 <span className={styles.cv__time}>1 &times; 🥈</span>{' '}
367 <span className={styles.cv__time}>1 &times; merit</span>
368 at national level
369 </p>
370 </li>
371 </ul>
372 </ResumeSection>
373 );
374}
375
376function Service() {
377 return (
378 <ResumeSection>
379 <Subtitle icon="📔">Academic service</Subtitle>
380 <ul className={styles.cv}>
381 <li className={styles.cv__item}>
382 <h4 className={styles.cv__title}>Program Committe member</h4>
383 <p className={styles.cv__times}>
384 <span className={styles.cv__time}>
385 <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee">
386 LLM4MDE &rsquo;24
387 </a>
388 </span>
389 </p>
390 </li>
391 <li className={styles.cv__item}>
392 <h4 className={styles.cv__title}>Extended Review Committe member</h4>
393 <p className={styles.cv__times}>
394 <span className={styles.cv__time}>
395 <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee">
396 OOPSLA &rsquo;23
397 </a>
398 </span>{' '}
399 <span className={styles.cv__time}>
400 <a href="https://2023.ecoop.org/committee/ecoop-2023-research-papers-extended-review-committee">
401 ECOOP &rsquo;23
402 </a>{' '}
403 and{' '}
404 <a href="https://2022.ecoop.org/committee/ecoop-2022-papers-extended-review-committee-">
405 &rsquo;22
406 </a>
407 </span>
408 </p>
409 </li>
410 <li className={styles.cv__item}>
411 <h4 className={styles.cv__title}>
412 Artifact Evaluation Committe member
413 </h4>
414 <p className={styles.cv__times}>
415 <span className={styles.cv__time}>
416 <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee">
417 OOPSLA &rsquo;23
418 </a>{' '}
419 and{' '}
420 <a href="https://2021.splashcon.org/track/splash-2021-Artifacts">
421 &rsquo;21
422 </a>
423 </span>{' '}
424 <span className={styles.cv__time}>
425 <a href="https://2023.ecoop.org/committee/ecoop-2023-artifact-evaluation-artifact-evaluation-committee">
426 ECOOP &rsquo;23
427 </a>{' '}
428 and{' '}
429 <a href="https://2022.ecoop.org/committee/ecoop-2022-artifacts-artifact-evaluation-committee">
430 &rsquo;22
431 </a>
432 </span>{' '}
433 <span className={styles.cv__time}>
434 <a href="https://web.archive.org/web/20230209015023/https://fase-conf.github.io/">
435 FASE &rsquo;24
436 </a>{' '}
437 and{' '}
438 <a href="https://web.archive.org/web/20230209015023/https://fase-conf.github.io/">
439 &rsquo;23
440 </a>
441 </span>{' '}
442 <span className={styles.cv__time}>
443 <a href="https://www.etaps.org/user-profile/archive/53-etaps-2022/491-esop-2022-artifact-evaluation.html">
444 ESOP &rsquo;22
445 </a>
446 </span>{' '}
447 </p>
448 </li>
449 <li className={styles.cv__item}>
450 <h4 className={styles.cv__title}>Reviewing for journals</h4>
451 <ul className={styles.cv__activities}>
452 <li
453 className={clsx(
454 styles.cv__activity,
455 styles['cv__activity--tight'],
456 )}
457 >
458 <a
459 href="https://www.sciencedirect.com/journal/science-of-computer-programming"
460 rel="nofollow"
461 >
462 Science of Computer Programming
463 </a>
464 </li>
465 <li
466 className={clsx(
467 styles.cv__activity,
468 styles['cv__activity--tight'],
469 )}
470 >
471 <a
472 href="https://www.sciencedirect.com/journal/journal-of-logical-and-algebraic-methods-in-programming"
473 rel="nofollow"
474 >
475 Journal of Logical and Algebraic Methods in Programming
476 </a>
477 </li>
478 </ul>
479 </li>
480 </ul>
481 </ResumeSection>
482 );
483}
484
14export default function Resume() { 485export default function Resume() {
15 return ( 486 return (
16 <Section title="Resume"> 487 <Section id="resume" title="Resume">
17 <div className="container"> 488 <div className="container">
18 <div className="row"> 489 <div className={styles.resume}>
19 <div className="col col-6"> 490 <Education />
20 <Subtitle icon="🎓">Education</Subtitle> 491 <Experience />
21 <ul className={styles.cv}> 492 <Awards />
22 <li className={styles.cv__item}> 493 <Visits />
23 <h4 className={styles.cv__title}>Doctor of Philosophy (PhD)</h4> 494 <Teaching />
24 <p className={styles.cv__times}> 495 <Service />
25 <span className={styles.cv__time}>2018&ndash;2023</span>
26 </p>
27 <p>
28 <i>Budapest Unversity of Technology and Economics</i>
29 </p>
30 <p>
31 Thesis:{' '}
32 <a href="/thesis.pdf">
33 <b>
34 Abstraction Techniques for the Analysis and Synthesis of
35 Critical Cyber-Physical System Architectures
36 </b>
37 </a>
38 </p>
39 <div className={styles['thesis-links']}>
40 <a
41 href="/thesis.pdf"
42 className={clsx(
43 'button',
44 'button--primary',
45 styles['thesis-links__link'],
46 )}
47 >
48 Read now
49 </a>
50 <a
51 href="/thesis-booklet-en.pdf"
52 className={clsx(
53 'button',
54 'button--secondary',
55 styles['thesis-links__link'],
56 )}
57 >
58 Extended abstract
59 </a>
60 <a
61 href="http://hdl.handle.net/10890/41832"
62 className={styles['thesis-links__link']}
63 >
64 Also available via HDL.NET
65 </a>
66 </div>
67 </li>
68 <li className={styles.cv__item}>
69 <h4 className={styles.cv__title}>Master of Science (MSc)</h4>
70 <p className={styles.cv__times}>
71 <span className={styles.cv__time}>2016&ndash;2018</span>
72 </p>
73 <p>
74 <i>Budapest Unversity of Technology and Economics</i>
75 </p>
76 </li>
77 <li className={styles.cv__item}>
78 <h4 className={styles.cv__title}>Bachleor of Science (BSc)</h4>
79 <p className={styles.cv__times}>
80 <span className={styles.cv__time}>2012&ndash;2016</span>
81 </p>
82 <p>
83 <i>Budapest Unversity of Technology and Economics</i>
84 </p>
85 </li>
86 </ul>
87 <Subtitle icon="🏅">Scholarships and awards</Subtitle>
88 <ul className={styles.cv}>
89 <li className={styles.cv__item}>
90 <h4 className={styles.cv__title}>
91 <a href="https://www.unkp.gov.hu/">
92 New National Excellence Programme (
93 <span lang="hu">ÚNKP</span>)
94 </a>
95 </h4>
96 <p className={styles.cv__times}>
97 <span className={styles.cv__time}>2016 (MSc)</span>{' '}
98 <span className={styles.cv__time}>2018 (PhD student)</span>{' '}
99 <span className={styles.cv__time}>2021 (PhD candidate)</span>{' '}
100 <span className={styles.cv__time}>2023 (postdoc)</span>{' '}
101 </p>
102 <p className={styles.cv__awarddesc}>
103 Awarded by the{' '}
104 <a href="https://web.archive.org/web/20230531162207/https://nkfih.gov.hu/english/nrdi-fund/new-national-excellence-programme-unkp-23-3/call-for-applications">
105 National Research, Development and Innovation Office (NRDI)
106 </a>{' '}
107 of Hungary to around 700 recipents per year
108 </p>
109 </li>
110 <li className={styles.cv__item}>
111 <h4 className={styles.cv__title}>
112 <a href="https://2021.splashcon.org/track/splash-2021-Artifacts#Chairs-Report">
113 OOPSLA 2021 Distinguished Artifact Reviewer
114 </a>
115 </h4>
116 </li>
117 <li className={styles.cv__item}>
118 <h4 className={styles.cv__title}>
119 <a href="https://www.mit.bme.hu/node/10575">
120 2020 László Schnell Award
121 </a>
122 </h4>
123 <p className={styles.cv__awarddesc}>
124 Awarded by the{' '}
125 <a href="https://www.mit.bme.hu/general/alapitvany">
126 László Schell Foundation
127 </a>{' '}
128 to 1 member of the{' '}
129 <i>Department of Measurement and Information Systems</i> per
130 year for exceptional research work
131 </p>
132 </li>
133 </ul>
134 <Subtitle icon="👨‍🏫">Teaching and mentoring</Subtitle>
135 <ul className={styles.cv}>
136 <li className={styles.cv__item}>
137 <h4 className={styles.cv__title}>Teaching assistant</h4>
138 <p className={styles.cv__times}>
139 <span className={styles.cv__time}>2014&ndash;</span>
140 </p>
141 <ul className={styles.cv__activities}>
142 <li className={styles.cv__activity}>
143 Courses at the{' '}
144 <a href="https://mit.bme.hu">
145 Deparment of Measurement and Information Systems
146 </a>{' '}
147 and the{' '}
148 <a href="https://cs.bme.hu">
149 Deparment of Computer Science and Information Theory
150 </a>
151 </li>
152 <li className={styles.cv__activity}>
153 Including practice and lab sessions in the{' '}
154 <a href="https://imsc.vik.bme.hu/">IMsc programme</a> of BME
155 for talented BSc students
156 </li>
157 </ul>
158 </li>
159 <li className={styles.cv__item}>
160 <h4 className={styles.cv__title}>
161 Supervised BSc and MSc{' '}
162 <a href="https://diplomaterv.vik.bme.hu/hu/Supervisors/Marussy-Kristof">
163 thesis works
164 </a>
165 </h4>
166 <p className={styles.cv__times}>
167 <span className={styles.cv__time}>7 &times; BSc</span>{' '}
168 <span className={styles.cv__time}>4 &times; MSc</span>{' '}
169 <span className={styles.cv__time}>
170 1 &times; MSc{' '}
171 <a href="https://www.unkp.gov.hu/" lang="hu">
172 ÚNKP research
173 </a>
174 </span>
175 </p>
176 </li>
177 <li className={styles.cv__item}>
178 <h4 className={styles.cv__title}>
179 Supervised{' '}
180 <a href="https://tdk.bme.hu/Browse/Users/Marussy-Kristof">
181 Scientific Students' Association
182 </a>{' '}
183 research
184 </h4>
185 <p className={styles.cv__times}>
186 <span className={styles.cv__time}>5 &times; 🥇</span>{' '}
187 <span className={styles.cv__time}>4 &times; 🥈</span>{' '}
188 <span className={styles.cv__time}>1 &times; 🥉</span>{' '}
189 <span className={styles.cv__time}>1 &times; merit</span>
190 at university level
191 </p>
192 <p className={styles.cv__times}>
193 <span className={styles.cv__time}>1 &times; 🥈</span>{' '}
194 <span className={styles.cv__time}>1 &times; merit</span>
195 at national level
196 </p>
197 </li>
198 </ul>
199 </div>
200 <div className="col col-6">
201 <Subtitle icon="👨‍💼">Professional experience</Subtitle>
202 <ul className={styles.cv}>
203 <li className={styles.cv__item}>
204 <h4 className={styles.cv__title}>Assistant research fellow</h4>
205 <p className={styles.cv__times}>
206 <span className={styles.cv__time}>2020&ndash;2023</span>
207 </p>
208 <p>
209 <i>
210 Department of Measurement and Information Systems, Budapest
211 Unversity of Technology and Economics, Hungary
212 </i>
213 </p>
214 <ul className={styles.cv__activities}>
215 <li className={styles.cv__activity}>
216 Performing research and developing tools to address
217 challanges in the development of critical systems motivated
218 by case studies and collaborations with industry partners
219 </li>
220 <li className={styles.cv__activity}>
221 Created reliability models for{' '}
222 <i>distributed railway interlocking systems</i> in a{' '}
223 <a href="https://projektek.bme.hu/index.php?site=3_0_0&i=28">
224 Hungarian national project
225 </a>{' '}
226 with <a href="https://www.prolan.hu/">Prolan Zrt.</a>
227 </li>
228 <li className={styles.cv__activity}>
229 Participated in the formal verification of a{' '}
230 <i>critical automotive subsystem</i> in a{' '}
231 <a href="https://projektek.bme.hu/index.php?site=3_1_0&i=18">
232 Hungarian national project
233 </a>{' '}
234 with{' '}
235 <a href="https://www.thyssenkrupp.hu/en">
236 thyssenkrupp Ltd.
237 </a>
238 </li>
239 </ul>
240 </li>
241 <li className={styles.cv__item}>
242 <h4 className={styles.cv__title}>Assistant research fellow</h4>
243 <p className={styles.cv__times}>
244 <span className={styles.cv__time}>2018&ndash;2019</span>
245 </p>
246 <p>
247 <i>
248 <a href="https://web.archive.org/web/20200919160859/https://lendulet.inf.mit.bme.hu/">
249 MTA-BME <span lang="hu">Lendület</span> Cyber-Physical
250 Systems Research Group
251 </a>
252 </i>
253 </p>
254 </li>
255 <li className={styles.cv__item}>
256 <h4 className={styles.cv__title}>Research trainee</h4>
257 <p className={styles.cv__times}>
258 <span className={styles.cv__time}>2014-2015</span>
259 </p>
260 <p>
261 <i>
262 <a href="https://web.archive.org/web/20150925191035/http://biointelligence.hu/">
263 BioIntelligence Research Group,
264 </a>{' '}
265 <a href="https://semmelweis.hu/genomikai-medicina/en/">
266 Institute of Genomic Medicine and Rare Disorders,
267 </a>{' '}
268 <a href="https://semmelweis.hu/en/">
269 Semmelweis University,
270 </a>{' '}
271 Budapest, Hungary
272 </i>
273 </p>
274 </li>
275 </ul>
276 <Subtitle icon="🏕️">Research visits</Subtitle>
277 <ul className={styles.cv}>
278 <li className={styles.cv__item}>
279 <h4 className={styles.cv__title}>Graduate research trainee</h4>
280 <p className={styles.cv__times}>
281 <span className={styles.cv__time}>May&ndash;June 2019</span>{' '}
282 <span className={styles.cv__time}>October 2020</span>
283 </p>
284 <p>
285 <i>
286 <a href="https://web.archive.org/web/20201124184148/https://www.mcgill.ca/ece/daniel-varro">
287 Department of Electrical and Computer Engineering,
288 </a>{' '}
289 <a href="https://www.mcgill.ca/">McGill Univeristy,</a>{' '}
290 </i>
291 Montreal, Canada
292 </p>
293 </li>
294 <li className={styles.cv__item}>
295 <h4 className={styles.cv__title}>Visting researcher</h4>
296 <p className={styles.cv__times}>
297 <span className={styles.cv__time}>March 2019</span>{' '}
298 </p>
299 <p>
300 <i>
301 <a href="https://web.archive.org/web/20190430204608/https://people.disim.univaq.it/cortelle/">
302 Department of Computer Science and Engineering, and
303 Mathematics,
304 </a>{' '}
305 <a href="https://www.univaq.it/en/index.php?&lang_s=en">
306 University of L'Aquila,
307 </a>{' '}
308 </i>
309 Italy
310 </p>
311 </li>
312 </ul>
313 <Subtitle icon="📔">Academic service</Subtitle>
314 <ul className={styles.cv}>
315 <li className={styles.cv__item}>
316 <h4 className={styles.cv__title}>
317 Extended Review Committe member
318 </h4>
319 <p className={styles.cv__times}>
320 <span className={styles.cv__time}>
321 <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee">
322 OOPSLA &rsquo;23
323 </a>
324 </span>{' '}
325 <span className={styles.cv__time}>
326 <a href="https://2023.ecoop.org/committee/ecoop-2023-research-papers-extended-review-committee">
327 ECOOP &rsquo;23
328 </a>{' '}
329 and{' '}
330 <a href="https://2022.ecoop.org/committee/ecoop-2022-papers-extended-review-committee-">
331 &rsquo;22
332 </a>
333 </span>
334 </p>
335 </li>
336 <li className={styles.cv__item}>
337 <h4 className={styles.cv__title}>
338 Artifact Evaluation Committe member
339 </h4>
340 <p className={styles.cv__times}>
341 <span className={styles.cv__time}>
342 <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee">
343 OOPSLA &rsquo;23
344 </a>{' '}
345 and{' '}
346 <a href="https://2021.splashcon.org/track/splash-2021-Artifacts">
347 &rsquo;21
348 </a>
349 </span>{' '}
350 <span className={styles.cv__time}>
351 <a href="https://2023.ecoop.org/committee/ecoop-2023-artifact-evaluation-artifact-evaluation-committee">
352 ECOOP &rsquo;23
353 </a>{' '}
354 and{' '}
355 <a href="https://2022.ecoop.org/committee/ecoop-2022-artifacts-artifact-evaluation-committee">
356 &rsquo;22
357 </a>
358 </span>{' '}
359 <span className={styles.cv__time}>
360 <a href="https://web.archive.org/web/20230209015023/https://fase-conf.github.io/">
361 FASE &rsquo;23
362 </a>
363 </span>{' '}
364 <span className={styles.cv__time}>
365 <a href="https://www.etaps.org/user-profile/archive/53-etaps-2022/491-esop-2022-artifact-evaluation.html">
366 ESOP &rsquo;22
367 </a>
368 </span>{' '}
369 </p>
370 </li>
371 <li className={styles.cv__item}>
372 <h4 className={styles.cv__title}>Reviewing for journals</h4>
373 <ul className={styles.cv__activities}>
374 <li
375 className={clsx(
376 styles.cv__activity,
377 styles['cv__activity--tight'],
378 )}
379 >
380 Science of Computer Programming
381 </li>
382 <li
383 className={clsx(
384 styles.cv__activity,
385 styles['cv__activity--tight'],
386 )}
387 >
388 Journal of Logical and Algebraic Methods in Programming
389 </li>
390 </ul>
391 </li>
392 </ul>
393 </div>
394 </div> 496 </div>
395 </div> 497 </div>
396 </Section> 498 </Section>
diff --git a/src/components/landing/sections/Software.module.css b/src/components/landing/sections/Software.module.css
new file mode 100644
index 0000000..1d0db4d
--- /dev/null
+++ b/src/components/landing/sections/Software.module.css
@@ -0,0 +1,5 @@
1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
diff --git a/src/components/landing/sections/Software.tsx b/src/components/landing/sections/Software.tsx
new file mode 100644
index 0000000..8a421b5
--- /dev/null
+++ b/src/components/landing/sections/Software.tsx
@@ -0,0 +1,15 @@
1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import clsx from 'clsx';
8
9import Section from '@site/src/components/landing/Section';
10
11import styles from './Software.module.css';
12
13export default function Software() {
14 return <Section id="software" title="Software"></Section>;
15}
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index b8e986d..1a2b114 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -7,20 +7,26 @@
7import Layout from '@theme/Layout'; 7import Layout from '@theme/Layout';
8 8
9import Hero from '@site/src/components/landing/sections/Hero'; 9import Hero from '@site/src/components/landing/sections/Hero';
10import Publications from '@site/src/components/landing/sections/Publications';
11import Research from '@site/src/components/landing/sections/Research';
10import Resume from '@site/src/components/landing/sections/Resume'; 12import Resume from '@site/src/components/landing/sections/Resume';
13import Software from '@site/src/components/landing/sections/Software';
11import Section from '@site/src/components/landing/Section'; 14import Section from '@site/src/components/landing/Section';
15import TrackActiveSection from '@site/src/components/TrackActiveSection';
12 16
13import avatar from './avatar.jpg'; 17import avatar from './avatar.jpg';
14 18
15export default function Home() { 19export default function Home() {
16 return ( 20 return (
17 <Layout> 21 <Layout>
18 <Hero avatar={avatar} /> 22 <TrackActiveSection>
19 <Section title="Research" /> 23 <Hero avatar={avatar} />
20 <Section title="Publications" /> 24 <Research />
21 <Section title="Software" /> 25 <Publications />
22 <Resume /> 26 <Software />
23 <Section title="Contact" /> 27 <Resume />
28 <Section id="contact" title="Contact" />
29 </TrackActiveSection>
24 </Layout> 30 </Layout>
25 ); 31 );
26} 32}
diff --git a/src/theme/NavbarItem/NavbarNavLink.jsx b/src/theme/NavbarItem/NavbarNavLink.jsx
new file mode 100644
index 0000000..cb151ea
--- /dev/null
+++ b/src/theme/NavbarItem/NavbarNavLink.jsx
@@ -0,0 +1,88 @@
1/*
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 * Copyright (c) 2023 Kristóf Marussy <kristof@marussy.com>
4 *
5 * SPDX-License-Identifier: MIT
6 *
7 * This file was derived from
8 * https://github.com/facebook/docusaurus/blob/c745021b01a8b88d34e1d772278d7171ad8acdf5/packages/docusaurus-theme-classic/src/theme/NavbarItem/NavbarNavLink.tsx
9 * via the `swizzle` mechanism of Docusaurus.
10 *
11 * It was modified to correctly track the change of the active anchor
12 * when `setHash` from `@site/src/components/ActiveSectionProvider` is called.
13 */
14
15import React from 'react';
16import Link from '@docusaurus/Link';
17import useBaseUrl from '@docusaurus/useBaseUrl';
18import isInternalUrl from '@docusaurus/isInternalUrl';
19import { isRegexpStringMatch } from '@docusaurus/theme-common';
20import IconExternalLink from '@theme/Icon/ExternalLink';
21import { useActiveSection } from '@site/src/components/ActiveSectionProvider';
22export default function NavbarNavLink({
23 activeBasePath,
24 activeBaseRegex,
25 to,
26 href,
27 label,
28 html,
29 isDropdownLink,
30 prependBaseUrlToHref,
31 ...props
32}) {
33 const { hash: activeSectionHash } = useActiveSection();
34 // TODO all this seems hacky
35 // {to: 'version'} should probably be forbidden, in favor of {to: '/version'}
36 const toUrl = useBaseUrl(to);
37 // Check whether the target URL has a hash.
38 const hashMatch = toUrl?.match(/#.+$/);
39 const activeBaseUrl = useBaseUrl(activeBasePath);
40 const normalizedHref = useBaseUrl(href, { forcePrependBaseUrl: true });
41 const isExternalLink = label && href && !isInternalUrl(href);
42 // Link content is set through html XOR label
43 const linkContentProps = html
44 ? { dangerouslySetInnerHTML: { __html: html } }
45 : {
46 children: (
47 <>
48 {label}
49 {isExternalLink && (
50 <IconExternalLink
51 {...(isDropdownLink && { width: 12, height: 12 })}
52 />
53 )}
54 </>
55 ),
56 };
57 if (href) {
58 return (
59 <Link
60 href={prependBaseUrlToHref ? normalizedHref : href}
61 {...props}
62 {...linkContentProps}
63 />
64 );
65 }
66 return (
67 <Link
68 to={toUrl}
69 isNavLink
70 {...((activeBasePath || activeBaseRegex || hashMatch) && {
71 isActive: (_match, location) => {
72 if (activeBaseRegex) {
73 return isRegexpStringMatch(activeBaseRegex, location.pathname);
74 }
75 if (activeBaseUrl) {
76 return location.pathname.startsWith(activeBaseUrl);
77 }
78 // Make sure to only highlight links with a hash when hash also matches.
79 return (
80 !hashMatch || hashMatch[0] === (activeSectionHash ?? location.hash)
81 );
82 },
83 })}
84 {...props}
85 {...linkContentProps}
86 />
87 );
88}
diff --git a/src/theme/Root.tsx b/src/theme/Root.tsx
new file mode 100644
index 0000000..9459e9f
--- /dev/null
+++ b/src/theme/Root.tsx
@@ -0,0 +1,18 @@
1/*
2 * SPDX-FileCopyrightText: 2023 Kristóf Marussy
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7import type { Props } from '@theme/Root';
8import Root from '@theme-original/Root';
9
10import ActiveSectionProvider from '@site/src/components/ActiveSectionProvider';
11
12export default function RootWrapper(props: Props) {
13 return (
14 <ActiveSectionProvider>
15 <Root {...props} />
16 </ActiveSectionProvider>
17 );
18}