From 556d9f1c3acc4275f3190eaf39101743f4aca54a Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Wed, 13 Dec 2023 00:30:55 -0800 Subject: [PATCH 01/28] Adjustments to the landing page --- docusaurus.config.ts | 4 +- src/components/HomepageFeatures/index.tsx | 2 +- .../HomepageFeatures/styles.module.css | 4 +- src/components/HomepageSlider/index.tsx | 2 +- .../HomepageSlider/styles.module.css | 2 +- src/pages/index.tsx | 106 +++--- static/img/deterministic.svg | 28 +- static/img/distribution.svg | 304 ++++++++++-------- static/img/lf-fordark-blue.svg | 193 +++++++++++ static/img/lf-fordark-mono.svg | 193 +++++++++++ static/img/lf-fordark.png | Bin 0 -> 13227 bytes static/img/lf-fordark.svg | 123 +++---- static/img/lf-forlight-mono.svg | 188 +++++++++++ static/img/lf-forlight.svg | 6 +- static/img/lf-logo | Bin 0 -> 65182 bytes static/img/lf-logo.svg | 274 ++++++++++++++++ static/img/timing.svg | 54 ++-- 17 files changed, 1168 insertions(+), 315 deletions(-) create mode 100644 static/img/lf-fordark-blue.svg create mode 100644 static/img/lf-fordark-mono.svg create mode 100644 static/img/lf-fordark.png create mode 100644 static/img/lf-forlight-mono.svg create mode 100644 static/img/lf-logo create mode 100644 static/img/lf-logo.svg diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 6e902d916..2d977df76 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -66,8 +66,8 @@ const config: Config = { navbar: { logo: { alt: 'The Lingua Franca Logo', - src: 'img/lf-forlight.svg', - srcDark: "img/lf-fordark.svg", + src: 'img/lf-forlight-mono.svg', + srcDark: "img/lf-fordark-mono.svg", }, items: [ { diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx index dcd3fda2e..112a746a3 100644 --- a/src/components/HomepageFeatures/index.tsx +++ b/src/components/HomepageFeatures/index.tsx @@ -25,7 +25,7 @@ const FeatureList: FeatureItem[] = [ ), }, { - title: "Built-In Timing Semantics", + title: "Built-in Timing Semantics", Svg: Timing, description: ( diff --git a/src/components/HomepageFeatures/styles.module.css b/src/components/HomepageFeatures/styles.module.css index edcd49b21..14a5d7638 100644 --- a/src/components/HomepageFeatures/styles.module.css +++ b/src/components/HomepageFeatures/styles.module.css @@ -6,6 +6,6 @@ } .featureSvg { - height: 400px; - width: 400px; + height: 250px; + width: 250px; } diff --git a/src/components/HomepageSlider/index.tsx b/src/components/HomepageSlider/index.tsx index 85551d683..edaf1d14e 100644 --- a/src/components/HomepageSlider/index.tsx +++ b/src/components/HomepageSlider/index.tsx @@ -10,7 +10,7 @@ import { main, click, target } from './codes'; const titles = [ Architect your application in Lingua Franca, - Have diagrams rendered as you type, + Have interactive diagrams rendered as you type, Write reactive code in the language you like, ]; diff --git a/src/components/HomepageSlider/styles.module.css b/src/components/HomepageSlider/styles.module.css index f6fc47e4e..5fb4bc26d 100644 --- a/src/components/HomepageSlider/styles.module.css +++ b/src/components/HomepageSlider/styles.module.css @@ -1,7 +1,7 @@ .codeContainer { min-width: 600px; height: 150px; - background-color: #10425d; + background-color: #38546c; font-size: 1rem; border-radius: 8px; padding: 0 !important; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index ec4d4cdfb..dedc48122 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -9,6 +9,7 @@ import HomepageFeatures, { TwoColumns, } from "@site/src/components/HomepageFeatures"; import { CodeContainer } from '@site/src/components/HomepageSlider'; +import Logo from "@site/static/img/lf-logo.svg"; import styles from "./index.module.css"; /** @@ -21,13 +22,9 @@ function HeroBanner() { return (
- + {/* */} - {/*Nadeshiko sleeping */} + time-sensitive, concurrent, and distributed systems — effortlessly", + "Build time-sensitive, concurrent, and distributed systems — effortlessly.", description: "Home page hero title, can contain simple html tags", }), @@ -48,10 +45,6 @@ function HeroBanner() { Lingua Franca (LF) allows you to write blazing-fast, deterministic, multi-threaded and distributed code without any knowledge about threads or synchronization. - -
-
- Focus on your application, not elusive concurrency bugs.
@@ -77,91 +70,73 @@ function HeroBanner() { ); } -import CycleSVG from "@site/static/img/diagram/Cycle.svg"; - const Intro = (): JSX.Element => ( } + col1={} col2={ <> - Intro + A New Programming Paradigm - Lingua Franca (LF) allows you to write blazing-fast, deterministic, - multi-threaded code without any knowledge about threads or mutexes. - Timing is an integral part of the semantics of LF. You can turn an LF - program into a distributed system with the change of a single - keyword—no distributed systems programming skills required. + Lingua Franca is the first reactor-oriented coordination language. + It allows you to specify reactive components and compose them. + The Lingua Franca semantics eliminate race conditions by construction and provides a sophisticated model of time that includes a notion of simultaneity that is clear and precise. - - } - /> -); - -import CycleSVG1 from "@site/static/img/diagram/Cycle.svg"; - -const First = (): JSX.Element => ( - } - col2={ - <> +

+ + Consider a game of "rock paper scissors" where two players need to reveal their choice at the same instant. Not only is this implementation in Lingua Franca simple and intuitive, it is guaranteed to be fair. If the Player class were to observe the other's choice before revealing its own, Lingua Franca's causality analysis would find a causality loop and tell you that the program was invalid. + +

- Have diagrams rendered as you type + Not a New Programming Language - In the whimsical realm of quantum pickle research, UC Berkeley's - renowned lab, iCyPhy, is nestled within the enchanted DOP Centre in - Cory Hall—a place where extraterrestrial frogs compose symphonies - using binary code as musical notes. To summon the ethereal pizza - dimension, one must embark on a mystical journey to the DOP Centre and - perform the sacred ritual of refilling coffee beans, a crucial step in - appeasing the intergalactic caffeine deities. Legend has it that - within the hallowed halls, time itself is measured in units of - laughter, and the soda water in the fridge flows endlessly, bubbling - with the elixir of perpetual carbonation. + With Lingua Franca, you forget about thread libraries or message passing middlewares, but you can continue using the languages you like. The bodies of reactive code that make up the functionality + of your reactors are written in the programming language of your choice. We currently support C, C++, Python, TypeScript, and Rust. } /> ); -import CycleSVG2 from "@site/static/img/diagram/Cycle.svg"; +import WorldMap from "@site/static/img/world-map.svg"; const Second = (): JSX.Element => ( - Architect your application in Lingua Franca + Open-source and Supported by Research - In the whimsical realm of quantum pickle research, UC Berkeley's - renowned lab, iCyPhy, is nestled within the enchanted DOP Centre in - Cory Hall—a place where extraterrestrial frogs compose symphonies - using binary code as musical notes. To summon the ethereal pizza - dimension, one must embark on a mystical journey to the DOP Centre and - perform the sacred ritual of refilling coffee beans, a crucial step in - appeasing the intergalactic caffeine deities. Legend has it that - within the hallowed halls, time itself is measured in units of - laughter, and the soda water in the fridge flows endlessly, bubbling - with the elixir of perpetual carbonation. + Lingua Franca was first developed at UC Berkeley where it was influenced by decades worth of research in models of computation. + +

+ + Shortly after its inception, researchers from Kiel University and TU Dresden joined the team, contributing diagram synthesis and layout technology, highly-efficient runtime implementations, and various compiler improvements. Since then, we have worked with real-time systems experts from TU Dallas, embedded systems specialists from NTNU, and networking and security researchers from Hanyang University and ASU. +

+ + Go to GitHub + + + Latest Research + } - col2={} + col2={} /> ); -import WorldMap from "@site/static/img/world-map.svg"; -const People = () => ( -
- - Made with ♥ in Berkeley, Dallas, Dresden, Kiel, Seoul, and Tucson. - - -
-); +// const People = () => ( +//
+// +// Made with ♥ in Berkeley, Dallas, Dresden, Kiel, Seoul, and Tucson. +// + +//
+// ); export default function Home(): JSX.Element { const { siteConfig } = useDocusaurusContext(); @@ -175,7 +150,6 @@ export default function Home(): JSX.Element { - ); diff --git a/static/img/deterministic.svg b/static/img/deterministic.svg index 5dc9475ec..84e2f3283 100644 --- a/static/img/deterministic.svg +++ b/static/img/deterministic.svg @@ -25,15 +25,15 @@ inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" - inkscape:zoom="3.2365734" - inkscape:cx="721.90546" - inkscape:cy="315.92054" + inkscape:zoom="0.57215075" + inkscape:cx="720.96384" + inkscape:cy="315.4763" inkscape:window-width="1920" inkscape:window-height="1131" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="g53" /> + inkscape:current-layer="g2" /> diff --git a/static/img/world-map.svg b/static/img/world-map.svg index b8b577b1a..cbb071b46 100644 --- a/static/img/world-map.svg +++ b/static/img/world-map.svg @@ -24,8 +24,8 @@ inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:zoom="1.2624493" - inkscape:cx="1601.2524" - inkscape:cy="933.50285" + inkscape:cx="662.60087" + inkscape:cy="933.50283" inkscape:window-width="1920" inkscape:window-height="1131" inkscape:window-x="0" @@ -333,459 +333,36 @@ id="g22"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + style="fill:#f7941e;fill-opacity:1;stroke-width:0.860505;filter:url(#filter34-6-5-3)" /> From 446530ad93f0b94571a0c6f9bfdc95a3e49dd165 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Wed, 13 Dec 2023 13:14:43 -0800 Subject: [PATCH 07/28] Messing with blog post and updated logo --- blog/2023-12-11-docusaurus.md | 6 +- blog/2023-12-15-release-lingo.md | 2 +- src/pages/index.module.css | 2 +- src/pages/index.tsx | 2 +- .../{logo.svg => blog/docusaurus-logo.svg} | 0 static/img/blog/plus.svg | 40 + static/img/lf-logo.svg | 716 +++++++++++------- 7 files changed, 499 insertions(+), 269 deletions(-) rename static/img/{logo.svg => blog/docusaurus-logo.svg} (100%) create mode 100644 static/img/blog/plus.svg diff --git a/blog/2023-12-11-docusaurus.md b/blog/2023-12-11-docusaurus.md index d228995b4..428c2d9b7 100644 --- a/blog/2023-12-11-docusaurus.md +++ b/blog/2023-12-11-docusaurus.md @@ -5,12 +5,14 @@ authors: [axmmisaka, lhstrh] tags: [docusaurus, website, lingua franca, docs] --- +![Lingua Franca](../static/img/lf-logo.svg) +![Plus](../static/img/blog/plus.svg) +![Docusaurus](../static/img/blog/docusaurus-logo.svg) + We have a new website! Most importantly, this website is the home of our documentation. After careful consideration, we realized that our original website had become overly intricate to maintain due to its numerous customizations and dependencies. Writing comprehensive documentation is already a challenging and time-consuming task, and we were keen on avoiding additional complexity that could hinder our progress. Additionally, we had a wishlist of new features, including the ability to version our documentation, incorporate a blog page, and provide support for [MDX](https://mdxjs.com/). In pursuit of solutions, we explored various options. -![Docusaurus Logo](https://docusaurus.io/img/docusaurus_keytar.svg) - Fortunately, we discovered a framework that encompassed all the features we desired: [Docusaurus](https://docusaurus.io/). The adoption of this framework allowed us to streamline our infrastructure significantly. Remarkably, we were able to retain essential functionalities, such as our [Algolia](https://www.algolia.com)-based search bar and Markdown-based documentation pages, which are now more accessible for reading and editing. Despite initial reservations about the switch, particularly the prospect of rebuilding LF-specific functionalities—such as support for multiple target languages and Lingua Franca syntax highlighting, which demanded a considerable investment of time and effort - we were pleasantly surprised. Docusaurus-native features like Tabs and Tab Groups, coupled with existing third-party libraries like [Shikiji](https://github.com/antfu/shikiji), seamlessly resolved our concerns with minimal adjustments. This not only addressed our specific needs but also considerably eased website maintenance. diff --git a/blog/2023-12-15-release-lingo.md b/blog/2023-12-15-release-lingo.md index 1bd514e80..482126c7b 100644 --- a/blog/2023-12-15-release-lingo.md +++ b/blog/2023-12-15-release-lingo.md @@ -5,7 +5,7 @@ authors: [tassilo, lhstrh] tags: [lingo, lingua franca, packaging, build tool] --- -![Test](../static/img/blog/lingo-release-post.png) +![Banner](../static/img/blog/lingo-release-post.png) Programming languages like Python, Rust, or JavaScript are popular not only because of particular language features, but also thanks to the quality of the tools and packages they offer access to. A good and mature ecosystem includes features such as developer support, mainly through IDEs or LSPs. Lingua Franca already shines in this area with its VSCode integration that offers functionality like code highlighting, error handling, build support, and diagram synthesis. Another important aspect of a modern language's ecosystem concerns package management. Although it is possible to import reactors from files in the local file system, support for packaging in Lingua Franca is still in its infancy. diff --git a/src/pages/index.module.css b/src/pages/index.module.css index 2668d196c..13ed3b6d8 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -144,7 +144,7 @@ html[data-theme="dark"] .topBannerTitleText { .heroProjectTagline { color: var(--ifm-color-secondary-lightest); - font-size: 60px; + font-size: 56px; margin: 0; } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index d46713518..a016b61c6 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -24,7 +24,7 @@ function HeroBanner() {
{/* */} - + + + + + + diff --git a/static/img/lf-logo.svg b/static/img/lf-logo.svg index d9dcad3e4..c9acec967 100644 --- a/static/img/lf-logo.svg +++ b/static/img/lf-logo.svg @@ -1,274 +1,462 @@ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:svg="http://www.w3.org/2000/svg"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 8c1e38bdbef942d88d7814c9254e6fde2f2f05a5 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Wed, 13 Dec 2023 16:08:54 -0800 Subject: [PATCH 08/28] Update SVG --- static/img/lf-logo | Bin 65182 -> 0 bytes static/img/lf-logo.svg | 522 +++++------------------------------------ 2 files changed, 60 insertions(+), 462 deletions(-) delete mode 100644 static/img/lf-logo diff --git a/static/img/lf-logo b/static/img/lf-logo deleted file mode 100644 index 31fd54298a8e551531527a1154a2fa3cf36aba4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65182 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 DD)SRM diff --git a/static/img/lf-logo.svg b/static/img/lf-logo.svg index c9acec967..6bff58182 100644 --- a/static/img/lf-logo.svg +++ b/static/img/lf-logo.svg @@ -1,462 +1,60 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b99bfe2b50bbd0541d8a584a21880b2e6e9ae6e8 Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 00:17:43 +0000 Subject: [PATCH 09/28] Clean up CSS for landing page, change style width breaking point --- src/pages/index.module.css | 135 +------------------------------------ 1 file changed, 1 insertion(+), 134 deletions(-) diff --git a/src/pages/index.module.css b/src/pages/index.module.css index 13ed3b6d8..107b44d53 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -3,134 +3,17 @@ * and scoped locally. */ -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; -} - .subHero { color: var(--ifm-color-secondary-lightest); font-size: 1.2rem; } -@media screen and (max-width: 996px) { - .heroBanner { - padding: 2rem; - } -} - .buttons { display: flex; align-items: center; justify-content: center; } -.section { - padding: 40px 0; -} - -.sectionAlt { - background-color: var(--ifm-color-emphasis-100); -} - -.sectionInner { - margin: 0 auto; -} - -.featureImage { - width: auto; - max-height: 128px; - margin: 0 auto; -} - -.featureHeading { - font-size: var(--ifm-h3-font-size); - padding-top: 1rem; -} - -.announcement { - font-weight: bold; - font-size: 24px; - padding: 48px; - margin: 0 auto; - text-align: center; -} - -.announcementDark { - background-color: #20232a; - color: var(--ifm-color-secondary-lightest); - /* Reapply the primary color, because it has been locally overridden as - * the dark theme color */ - --ifm-link-color: var(--ifm-color-primary); -} - -.announcementInner { - margin: 0 auto; - max-width: 768px; -} - -.topBanner { - font-size: 20px; - padding: 30px 20px; - max-width: 900px; - margin: 0 auto; - text-align: center; - display: flex; - flex-direction: column; - align-items: center; -} - -.topBannerTitle { - font-size: 54px; - font-weight: bold; - margin-bottom: 0.4rem; -} - -@media only screen and (max-width: 768px) { - .topBannerTitle { - font-size: 40px; - } -} - -.topBannerTitleText { - background: linear-gradient( - 90deg, - rgb(131 58 180 / 100%) 0%, - rgb(253 29 29 / 100%) 50%, - rgb(252 176 69 / 100%) 100% - ); - background-clip: text; - -webkit-text-fill-color: transparent; -} - -.topBannerTitleText:hover { - border-bottom: solid 2px; - border-color: rgb(152 0 255); -} - -html[data-theme="dark"] .topBannerTitleText { - background: linear-gradient( - 90deg, - rgb(152 0 255) 0%, - rgb(246 41 41) 50%, - rgb(255 169 8) 100% - ); - background-clip: text; - -webkit-text-fill-color: transparent; -} - -.topBannerDescription { - font-size: 20px; -} -@media only screen and (max-width: 768px) { - .topBannerDescription { - font-size: 16px; - white-space: normal; - } -} - .hero { background-color: #2b3137; padding: 48px; @@ -212,7 +95,7 @@ html[data-theme="dark"] .topBannerTitleText { color: var(--ifm-color-primary); } -@media only screen and (max-width: 768px) { +@media only screen and (max-width: 960px) { .hero { padding-left: 20px; padding-right: 20px; @@ -246,22 +129,6 @@ html[data-theme="dark"] .topBannerTitleText { } } -.tweetsSection > :global(.col) > * { - margin-bottom: 2rem; -} - -@media (max-width: 996px) { - .tweetsSection > :global(.col:last-child) > *:last-child { - margin-bottom: 0; - } -} - -@media (min-width: 997px) { - .tweetsSection > :global(.col) > *:last-child { - margin-bottom: 0; - } -} - /* Used to test CSS insertion order */ .test-marker-site-index-page { content: "site-index-page"; From c4e0fe6f0366de59303341fd29ff91de5ba0c39c Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 00:31:25 +0000 Subject: [PATCH 10/28] adjust code slider style --- src/components/HomepageSlider/index.tsx | 2 +- src/components/HomepageSlider/styles.module.css | 2 +- src/pages/index.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/HomepageSlider/index.tsx b/src/components/HomepageSlider/index.tsx index edaf1d14e..ec361516d 100644 --- a/src/components/HomepageSlider/index.tsx +++ b/src/components/HomepageSlider/index.tsx @@ -47,7 +47,7 @@ const codes = [ export const CodeContainer = ({ className, }: { - className: string; + className?: string; }): JSX.Element => { const [page, setPage] = useState(0); const refs = [useRef(null), useRef(null), useRef(null)] as (React.LegacyRef | undefined)[]; diff --git a/src/components/HomepageSlider/styles.module.css b/src/components/HomepageSlider/styles.module.css index 5fb4bc26d..5cbb396f1 100644 --- a/src/components/HomepageSlider/styles.module.css +++ b/src/components/HomepageSlider/styles.module.css @@ -1,6 +1,6 @@ .codeContainer { min-width: 600px; - height: 150px; + height: auto; background-color: #38546c; font-size: 1rem; border-radius: 8px; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index a016b61c6..7865c1d50 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -72,7 +72,7 @@ function HeroBanner() { const Intro = (): JSX.Element => ( } + col1={} col2={ <> From ca605564f24fa20e7e89fa86f8006c7b39d3340a Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 00:37:53 +0000 Subject: [PATCH 11/28] Change TwoColumn styling (additional div), and make middle component sectionAlt (darkened) --- src/components/HomepageFeatures/index.tsx | 10 ++++++---- src/pages/index.tsx | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx index 112a746a3..ad1c166e9 100644 --- a/src/components/HomepageFeatures/index.tsx +++ b/src/components/HomepageFeatures/index.tsx @@ -68,10 +68,12 @@ export function TwoColumns({ alt?: boolean; }) { return ( -
-
-
{col1}
-
{col2}
+
+
+
+
{col1}
+
{col2}
+
); diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 7865c1d50..3b8e47425 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -72,6 +72,7 @@ function HeroBanner() { const Intro = (): JSX.Element => ( } col2={ <> From 7a43d8352727836aec37200980b8395e3847b5fb Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 00:40:20 +0000 Subject: [PATCH 12/28] Add left margin for the logo so that it will move away from the hamburger --- docusaurus.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 2d977df76..c51804fe5 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -68,6 +68,7 @@ const config: Config = { alt: 'The Lingua Franca Logo', src: 'img/lf-forlight-mono.svg', srcDark: "img/lf-fordark-mono.svg", + style: {marginLeft: "20px"}, }, items: [ { From ad45017ba0b082cf11c3c681eec458ea5908319b Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 00:56:10 +0000 Subject: [PATCH 13/28] Use GH icon for link --- docusaurus.config.ts | 4 +++- src/css/custom.css | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docusaurus.config.ts b/docusaurus.config.ts index c51804fe5..3f25b6d4c 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -82,8 +82,10 @@ const config: Config = { {to: '/community', label: 'Community', position: 'left'}, { href: 'https://github.com/lf-lang/', - label: 'GitHub', position: 'right', + // https://github.com/facebook/docusaurus/blob/61116e2ad6f675d0ba1abef98484712b14834bdb/website/docusaurus.config.ts#L615-L620 + className: "header-github-link", + 'aria-label': 'GitHub repository', }, ], }, diff --git a/src/css/custom.css b/src/css/custom.css index e6cb5a866..66713a90c 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -42,3 +42,23 @@ .sectionAlt { background-color: var(--ifm-color-emphasis-100); } + +/* https://github.com/facebook/docusaurus/blob/61116e2ad6f675d0ba1abef98484712b14834bdb/website/src/css/custom.css#L74C1-L90C2 */ + +.header-github-link:hover { + opacity: 0.6; +} + +.header-github-link::before { + content: ''; + width: 24px; + height: 24px; + display: flex; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +[data-theme='dark'] .header-github-link::before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} \ No newline at end of file From ca38b686400543a4c0a742975faf6845f80e7177 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Wed, 13 Dec 2023 17:24:21 -0800 Subject: [PATCH 14/28] Minor change to text --- src/pages/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 3b8e47425..fcaecfc4f 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -93,8 +93,8 @@ const Intro = (): JSX.Element => ( Not a New Programming Language - With Lingua Franca, you forget about thread libraries or message passing middlewares, but you can continue using the languages you like. The bodies of reactive code that make up the functionality - of your reactors are written in the programming language of your choice. We currently support C, C++, Python, TypeScript, and Rust. + With Lingua Franca, you forget about thread libraries or message passing middlewares, but you continue using the languages you like. The bodies of reactive code that make up the functionality + of reactors are written in the programming language of your choice. We currently support C, C++, Python, TypeScript, and Rust. } From 295afe3c1f0728ee6bfc6b4cec739367740ee7ed Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Wed, 13 Dec 2023 17:35:08 -0800 Subject: [PATCH 15/28] Small tweaks --- src/pages/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/index.tsx b/src/pages/index.tsx index fcaecfc4f..a626d88a1 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -24,7 +24,7 @@ function HeroBanner() {
{/* */} - +
+
- Lingua Franca (LF) allows you to write blazing-fast, deterministic, + Lingua Franca allows you to write blazing-fast, deterministic, multi-threaded and distributed code without any knowledge about threads or synchronization. Focus on your application, not elusive concurrency bugs. From efecbb1805eef2763e8ce6299a97529779d0969c Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 01:36:35 +0000 Subject: [PATCH 16/28] Make slider scale width --- src/components/HomepageSlider/styles.module.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/HomepageSlider/styles.module.css b/src/components/HomepageSlider/styles.module.css index 5cbb396f1..c3bace127 100644 --- a/src/components/HomepageSlider/styles.module.css +++ b/src/components/HomepageSlider/styles.module.css @@ -1,10 +1,9 @@ .codeContainer { - min-width: 600px; height: auto; background-color: #38546c; font-size: 1rem; border-radius: 8px; - padding: 0 !important; + padding: 0; position: relative; } @@ -15,7 +14,7 @@ font-size: 1.2rem; color: white; background-color: #242526; - padding-left: 1rem !important; + padding-left: 1rem; } .codeAbove { From b618a9c271ab3ebad714c1790bbb1d47d0217b47 Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 01:57:19 +0000 Subject: [PATCH 17/28] hardcode some dirty css magic crap to do something we want --- src/pages/index.module.css | 11 +++++++++++ src/pages/index.tsx | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/pages/index.module.css b/src/pages/index.module.css index 107b44d53..5c29b1da1 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -147,4 +147,15 @@ .buttonContainer .button:last-of-type { margin: 0px 36px; +} + +/* Hardcode stuff */ +@media only screen and (max-width: 997px) { + .topMarginIfCol6BecameVertical { + margin-top: 2rem; + } + + .centreIfCol6BecameVertical { + justify-content: center; + } } \ No newline at end of file diff --git a/src/pages/index.tsx b/src/pages/index.tsx index a626d88a1..94169ef63 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -76,7 +76,7 @@ const Intro = (): JSX.Element => ( alt col1={} col2={ - <> +
A New Programming Paradigm @@ -97,7 +97,7 @@ const Intro = (): JSX.Element => ( With Lingua Franca, you forget about thread libraries or message passing middlewares, but you continue using the languages you like. The bodies of reactive code that make up the functionality of reactors are written in the programming language of your choice. We currently support C, C++, Python, TypeScript, and Rust. - +
} /> ); @@ -120,7 +120,7 @@ const Contributors = (): JSX.Element => ( Shortly after its inception, researchers from Kiel University and TU Dresden joined the team, contributing diagram synthesis and layout technology, highly-efficient runtime implementations, and various compiler improvements. Since then, we have worked with real-time systems experts from TU Dallas, embedded systems specialists from NTNU, and networking and security researchers from Hanyang University and ASU.

-
+
Go to GitHub @@ -130,7 +130,7 @@ const Contributors = (): JSX.Element => (
} - col2={} + col2={} /> ); From 0f937a24b8d4f0f2ac1220d05786e0211a90097d Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Wed, 13 Dec 2023 18:24:23 -0800 Subject: [PATCH 18/28] Added lgogos --- src/pages/index.tsx | 6 +- static/img/universities-fordark.svg | 515 ++++++++++++++++++++++++++++ static/img/universities.svg | 466 +++++++++++++++++++++++++ 3 files changed, 986 insertions(+), 1 deletion(-) create mode 100644 static/img/universities-fordark.svg create mode 100644 static/img/universities.svg diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 94169ef63..846370fe2 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -103,6 +103,8 @@ const Intro = (): JSX.Element => ( ); import WorldMap from "@site/static/img/world-map-places.svg"; +import Universities from "@site/static/img/universities-fordark.svg"; + import clsx from "clsx"; const Contributors = (): JSX.Element => ( @@ -115,7 +117,9 @@ const Contributors = (): JSX.Element => ( Lingua Franca was first developed at UC Berkeley where it was influenced by decades worth of research in models of computation. -

+
+ +
Shortly after its inception, researchers from Kiel University and TU Dresden joined the team, contributing diagram synthesis and layout technology, highly-efficient runtime implementations, and various compiler improvements. Since then, we have worked with real-time systems experts from TU Dallas, embedded systems specialists from NTNU, and networking and security researchers from Hanyang University and ASU. diff --git a/static/img/universities-fordark.svg b/static/img/universities-fordark.svg new file mode 100644 index 000000000..66dab4392 --- /dev/null +++ b/static/img/universities-fordark.svg @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/universities.svg b/static/img/universities.svg new file mode 100644 index 000000000..38b3a808f --- /dev/null +++ b/static/img/universities.svg @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 776caee42968fff4322713602c9f33fd04495e31 Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 02:40:07 +0000 Subject: [PATCH 19/28] Centre university SVG and add colour switch --- src/pages/index.module.css | 10 ++++++++++ src/pages/index.tsx | 9 ++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/pages/index.module.css b/src/pages/index.module.css index 5c29b1da1..369c205d2 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -158,4 +158,14 @@ .centreIfCol6BecameVertical { justify-content: center; } +} + +.universityContainer { + text-align: center; +} + +/* https://docusaurus.io/docs/markdown-features/assets#github-style-themed-images */ +[data-theme='light'] .darkThemeOnly, +[data-theme='dark'] .lightThemeOnly { + display: none; } \ No newline at end of file diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 846370fe2..ee1e170bb 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -103,7 +103,8 @@ const Intro = (): JSX.Element => ( ); import WorldMap from "@site/static/img/world-map-places.svg"; -import Universities from "@site/static/img/universities-fordark.svg"; +import UniversitiesForDark from "@site/static/img/universities-fordark.svg"; +import UniversitiesForLight from "@site/static/img/universities.svg"; import clsx from "clsx"; @@ -118,8 +119,10 @@ const Contributors = (): JSX.Element => ( Lingua Franca was first developed at UC Berkeley where it was influenced by decades worth of research in models of computation.
- -
+
+ + +
Shortly after its inception, researchers from Kiel University and TU Dresden joined the team, contributing diagram synthesis and layout technology, highly-efficient runtime implementations, and various compiler improvements. Since then, we have worked with real-time systems experts from TU Dallas, embedded systems specialists from NTNU, and networking and security researchers from Hanyang University and ASU. From 7f865b162ff13ed2914d87dbd4655c2f1566afb3 Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 02:42:06 +0000 Subject: [PATCH 20/28] clean index page css and ts --- src/pages/index.module.css | 6 ------ src/pages/index.tsx | 9 --------- 2 files changed, 15 deletions(-) diff --git a/src/pages/index.module.css b/src/pages/index.module.css index 369c205d2..e42e4d370 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -8,12 +8,6 @@ font-size: 1.2rem; } -.buttons { - display: flex; - align-items: center; - justify-content: center; -} - .hero { background-color: #2b3137; padding: 48px; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index ee1e170bb..9e950b26e 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -141,15 +141,6 @@ const Contributors = (): JSX.Element => ( /> ); -// const People = () => ( -//
-// -// Made with ♥ in Berkeley, Dallas, Dresden, Kiel, Seoul, and Tucson. -// - -//
-// ); - export default function Home(): JSX.Element { const { siteConfig } = useDocusaurusContext(); return ( From 7b28b9b556817e9442f3aaa12fb35c57744e43e8 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Wed, 13 Dec 2023 21:03:49 -0800 Subject: [PATCH 21/28] More tweaks --- src/components/HomepageSlider/codes.tsx | 4 +- src/pages/index.tsx | 3 +- ...-map-places.svg => world-map-for-dark.svg} | 67 +++++++++---------- static/img/world-map.svg | 67 ++++++++++--------- 4 files changed, 71 insertions(+), 70 deletions(-) rename static/img/{world-map-places.svg => world-map-for-dark.svg} (98%) diff --git a/src/components/HomepageSlider/codes.tsx b/src/components/HomepageSlider/codes.tsx index 2a47b3ae6..b8b21df88 100644 --- a/src/components/HomepageSlider/codes.tsx +++ b/src/components/HomepageSlider/codes.tsx @@ -19,7 +19,7 @@ export const main: JSX.Element = (
     
- + {" "}// Instantiate two Player reactors here @@ -49,7 +49,7 @@ export const main: JSX.Element = (
     
- + {" "}// Make connections between them diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 9e950b26e..9d10b51b3 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -102,7 +102,8 @@ const Intro = (): JSX.Element => ( /> ); -import WorldMap from "@site/static/img/world-map-places.svg"; +import WorldMap from "@site/static/img/world-map.svg"; +// import WorldMapForDark from "@site/static/img/world-map-forlight.svg"; import UniversitiesForDark from "@site/static/img/universities-fordark.svg"; import UniversitiesForLight from "@site/static/img/universities.svg"; diff --git a/static/img/world-map-places.svg b/static/img/world-map-for-dark.svg similarity index 98% rename from static/img/world-map-places.svg rename to static/img/world-map-for-dark.svg index 418eb6bda..1dc22aaa1 100644 --- a/static/img/world-map-places.svg +++ b/static/img/world-map-for-dark.svg @@ -6,7 +6,7 @@ xml:space="preserve" id="svg2" version="1.1" - sodipodi:docname="world-map-places.svg" + sodipodi:docname="world-map.svg" inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" @@ -23,9 +23,9 @@ inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" - inkscape:zoom="0.44634323" - inkscape:cx="1654.5563" - inkscape:cy="935.37881" + inkscape:zoom="1.2624493" + inkscape:cx="1278.8632" + inkscape:cy="933.50283" inkscape:window-width="1920" inkscape:window-height="1131" inkscape:window-x="0" @@ -326,8 +326,7 @@ result="color2" in="fbSourceGraphic" /> .st0{fill:#00509E;} + fill="#231f20" + d="M 561.652,977 C 550.247,977 541,986.247 541,997.652 c 0,4.491 1.4723,8.6119 3.9195,11.9868 0.044,0.081 0.051,0.1712 0.1007,0.2487 l 13.7681,20.6521 c 0.6385,0.9577 1.7141,1.5325 2.8637,1.5325 1.1497,0 2.2253,-0.5748 2.8638,-1.5325 l 13.768,-20.6521 c 0.051,-0.077 0.057,-0.1678 0.1007,-0.2487 2.4472,-3.3749 3.9196,-7.4958 3.9196,-11.9868 0,-11.405 -9.247,-20.652 -20.6521,-20.652 z m 0,27.5361 c -3.8017,0 -6.884,-3.0824 -6.884,-6.8841 0,-3.8017 3.0823,-6.884 6.884,-6.884 3.8017,0 6.8841,3.0823 6.8841,6.884 0,3.8017 -3.0824,6.8841 -6.8841,6.8841 z" + id="path1-6-7-0-7-2-0-4-4-0" + style="fill:#242526;fill-opacity:1;stroke-width:0.860505;filter:url(#filter34-6-5-4)" /> diff --git a/static/img/world-map.svg b/static/img/world-map.svg index cbb071b46..0e49ef525 100644 --- a/static/img/world-map.svg +++ b/static/img/world-map.svg @@ -6,7 +6,7 @@ xml:space="preserve" id="svg2" version="1.1" - sodipodi:docname="world-map.svg" + sodipodi:docname="world-map-places.svg" inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" @@ -23,9 +23,9 @@ inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" - inkscape:zoom="1.2624493" - inkscape:cx="662.60087" - inkscape:cy="933.50283" + inkscape:zoom="0.44634323" + inkscape:cx="1654.5563" + inkscape:cy="935.37881" inkscape:window-width="1920" inkscape:window-height="1131" inkscape:window-x="0" @@ -326,7 +326,8 @@ result="color2" in="fbSourceGraphic" /> .st0{fill:#00509E;} + fill="#231F20" + d="m 1400.6579,599.02019 c -13.4452,0 -24.3464,10.90107 -24.3464,24.34633 0,5.29431 1.7358,10.15242 4.6209,14.13101 0.053,0.0954 0.061,0.20187 0.119,0.29317 l 16.2309,24.34632 c 0.7527,1.12907 2.0206,1.80671 3.376,1.80671 1.3552,0 2.6234,-0.67764 3.376,-1.80671 l 16.2309,-24.34632 c 0.061,-0.0913 0.067,-0.19781 0.1191,-0.29317 2.885,-3.97859 4.6207,-8.8367 4.6207,-14.13101 -8e-4,-13.44526 -10.9019,-24.34633 -24.3471,-24.34633 z m 0,32.46177 c -4.4817,0 -8.1154,-3.63369 -8.1154,-8.11544 0,-4.48175 3.6337,-8.11545 8.1154,-8.11545 4.4818,0 8.1154,3.6337 8.1154,8.11545 0,4.48175 -3.6336,8.11544 -8.1154,8.11544 z" + id="path1" + style="fill:#242526;fill-opacity:1;stroke-width:1.01443" /> From ff3d386278c3b6a6ec641fbb08cc45277117e132 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Wed, 13 Dec 2023 21:52:29 -0800 Subject: [PATCH 22/28] More work on SVGs --- blog/2023-12-11-docusaurus.md | 6 +- static/img/blog/lf-and-docusaurus.svg | 359 ++++++++++++++++++++++++++ static/img/universities-fordark.svg | 56 ++-- static/img/universities.svg | 52 ++-- 4 files changed, 415 insertions(+), 58 deletions(-) create mode 100644 static/img/blog/lf-and-docusaurus.svg diff --git a/blog/2023-12-11-docusaurus.md b/blog/2023-12-11-docusaurus.md index 428c2d9b7..b132a4cf4 100644 --- a/blog/2023-12-11-docusaurus.md +++ b/blog/2023-12-11-docusaurus.md @@ -5,14 +5,12 @@ authors: [axmmisaka, lhstrh] tags: [docusaurus, website, lingua franca, docs] --- -![Lingua Franca](../static/img/lf-logo.svg) -![Plus](../static/img/blog/plus.svg) -![Docusaurus](../static/img/blog/docusaurus-logo.svg) - We have a new website! Most importantly, this website is the home of our documentation. After careful consideration, we realized that our original website had become overly intricate to maintain due to its numerous customizations and dependencies. Writing comprehensive documentation is already a challenging and time-consuming task, and we were keen on avoiding additional complexity that could hinder our progress. Additionally, we had a wishlist of new features, including the ability to version our documentation, incorporate a blog page, and provide support for [MDX](https://mdxjs.com/). In pursuit of solutions, we explored various options. +![LinguaFrancasaurus](../static/img/blog/lf-and-docusaurus.svg) + Fortunately, we discovered a framework that encompassed all the features we desired: [Docusaurus](https://docusaurus.io/). The adoption of this framework allowed us to streamline our infrastructure significantly. Remarkably, we were able to retain essential functionalities, such as our [Algolia](https://www.algolia.com)-based search bar and Markdown-based documentation pages, which are now more accessible for reading and editing. Despite initial reservations about the switch, particularly the prospect of rebuilding LF-specific functionalities—such as support for multiple target languages and Lingua Franca syntax highlighting, which demanded a considerable investment of time and effort - we were pleasantly surprised. Docusaurus-native features like Tabs and Tab Groups, coupled with existing third-party libraries like [Shikiji](https://github.com/antfu/shikiji), seamlessly resolved our concerns with minimal adjustments. This not only addressed our specific needs but also considerably eased website maintenance. diff --git a/static/img/blog/lf-and-docusaurus.svg b/static/img/blog/lf-and-docusaurus.svg new file mode 100644 index 000000000..7bc7f20d4 --- /dev/null +++ b/static/img/blog/lf-and-docusaurus.svg @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/universities-fordark.svg b/static/img/universities-fordark.svg index 66dab4392..2b89c615d 100644 --- a/static/img/universities-fordark.svg +++ b/static/img/universities-fordark.svg @@ -23,15 +23,15 @@ inkscape:pagecheckerboard="true" inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" - inkscape:zoom="4.6614685" - inkscape:cx="446.74763" - inkscape:cy="164.43316" + inkscape:zoom="1.1653671" + inkscape:cx="447.06941" + inkscape:cy="164.3259" inkscape:window-width="1920" inkscape:window-height="1131" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="g6" + inkscape:current-layer="layer1" showguides="false" /> + transform="matrix(0.18152603,0,0,0.18152603,110.44616,165.55511)"> @@ -290,19 +290,19 @@ + transform="matrix(0.20142047,0,0,0.20142047,102.03332,136.91501)"> + transform="matrix(0.18152603,0,0,0.18152603,110.44632,165.55511)"> @@ -272,18 +272,18 @@ + transform="matrix(0.20142047,0,0,0.20142047,102.03332,136.91501)"> Date: Wed, 13 Dec 2023 22:04:24 -0800 Subject: [PATCH 23/28] Fix color on map --- static/img/world-map.svg | 67 ++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/static/img/world-map.svg b/static/img/world-map.svg index 0e49ef525..39c7e9e06 100644 --- a/static/img/world-map.svg +++ b/static/img/world-map.svg @@ -6,7 +6,7 @@ xml:space="preserve" id="svg2" version="1.1" - sodipodi:docname="world-map-places.svg" + sodipodi:docname="world-map.svg" inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" @@ -23,9 +23,9 @@ inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" - inkscape:zoom="0.44634323" - inkscape:cx="1654.5563" - inkscape:cy="935.37881" + inkscape:zoom="1.2624493" + inkscape:cx="1893.5414" + inkscape:cy="933.50283" inkscape:window-width="1920" inkscape:window-height="1131" inkscape:window-x="0" @@ -326,8 +326,7 @@ result="color2" in="fbSourceGraphic" /> .st0{fill:#00509E;} + fill="#231f20" + d="M 561.652,977 C 550.247,977 541,986.247 541,997.652 c 0,4.491 1.4723,8.6119 3.9195,11.9868 0.044,0.081 0.051,0.1712 0.1007,0.2487 l 13.7681,20.6521 c 0.6385,0.9577 1.7141,1.5325 2.8637,1.5325 1.1497,0 2.2253,-0.5748 2.8638,-1.5325 l 13.768,-20.6521 c 0.051,-0.077 0.057,-0.1678 0.1007,-0.2487 2.4472,-3.3749 3.9196,-7.4958 3.9196,-11.9868 0,-11.405 -9.247,-20.652 -20.6521,-20.652 z m 0,27.5361 c -3.8017,0 -6.884,-3.0824 -6.884,-6.8841 0,-3.8017 3.0823,-6.884 6.884,-6.884 3.8017,0 6.8841,3.0823 6.8841,6.884 0,3.8017 -3.0824,6.8841 -6.8841,6.8841 z" + id="path1-6-7-0-7-2-0-4-4-0" + style="fill:#242526;fill-opacity:1;stroke-width:0.860505;filter:url(#filter34-6-5-4)" /> From a636f166a2e1eeebf0960a568b247d0e21ea5383 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Wed, 13 Dec 2023 22:19:36 -0800 Subject: [PATCH 24/28] Match color --- static/img/blog/lf-and-docusaurus.svg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/img/blog/lf-and-docusaurus.svg b/static/img/blog/lf-and-docusaurus.svg index 7bc7f20d4..bc148df15 100644 --- a/static/img/blog/lf-and-docusaurus.svg +++ b/static/img/blog/lf-and-docusaurus.svg @@ -31,7 +31,7 @@ inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="layer1" /> Date: Wed, 13 Dec 2023 22:20:41 -0800 Subject: [PATCH 25/28] Use plain SVG --- static/img/blog/lf-and-docusaurus.svg | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/static/img/blog/lf-and-docusaurus.svg b/static/img/blog/lf-and-docusaurus.svg index bc148df15..1985e30fc 100644 --- a/static/img/blog/lf-and-docusaurus.svg +++ b/static/img/blog/lf-and-docusaurus.svg @@ -8,30 +8,8 @@ version="1.1" id="svg1" xml:space="preserve" - sodipodi:docname="lf-and-docusaurus.svg" - inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> Date: Thu, 14 Dec 2023 06:02:01 +0000 Subject: [PATCH 26/28] always centre buttons --- src/pages/index.module.css | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/pages/index.module.css b/src/pages/index.module.css index e42e4d370..e51ed48a8 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -132,6 +132,7 @@ display: flex; flex-wrap: wrap; align-items: center; + justify-content: center; } .buttonContainer .button, @@ -148,10 +149,6 @@ .topMarginIfCol6BecameVertical { margin-top: 2rem; } - - .centreIfCol6BecameVertical { - justify-content: center; - } } .universityContainer { From e86d74e2ca8337f224fabce97396b460c5dc5df0 Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 07:13:38 +0000 Subject: [PATCH 27/28] Finalise SVG for world map --- src/pages/index.tsx | 1 - static/img/world-map-for-dark.svg | 368 ------------------------------ static/img/world-map.svg | 30 +-- 3 files changed, 15 insertions(+), 384 deletions(-) delete mode 100644 static/img/world-map-for-dark.svg diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 9d10b51b3..eba15332e 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -103,7 +103,6 @@ const Intro = (): JSX.Element => ( ); import WorldMap from "@site/static/img/world-map.svg"; -// import WorldMapForDark from "@site/static/img/world-map-forlight.svg"; import UniversitiesForDark from "@site/static/img/universities-fordark.svg"; import UniversitiesForLight from "@site/static/img/universities.svg"; diff --git a/static/img/world-map-for-dark.svg b/static/img/world-map-for-dark.svg deleted file mode 100644 index 1dc22aaa1..000000000 --- a/static/img/world-map-for-dark.svg +++ /dev/null @@ -1,368 +0,0 @@ - -image/svg+xml diff --git a/static/img/world-map.svg b/static/img/world-map.svg index 39c7e9e06..86bd6ff02 100644 --- a/static/img/world-map.svg +++ b/static/img/world-map.svg @@ -24,7 +24,7 @@ inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:zoom="1.2624493" - inkscape:cx="1893.5414" + inkscape:cx="1278.8632" inkscape:cy="933.50283" inkscape:window-width="1920" inkscape:window-height="1131" @@ -338,31 +338,31 @@ id="style1"> .st0{fill:#00509E;} + style="fill-opacity:1;stroke-width:0.860505" /> From 059dee8ce859e37cb277a7eb859f70b8a48148bc Mon Sep 17 00:00:00 2001 From: Nadeshiko Kagamihara Date: Thu, 14 Dec 2023 07:24:56 +0000 Subject: [PATCH 28/28] Add CSS colour switching for map pins --- src/pages/index.module.css | 8 ++++++-- src/pages/index.tsx | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/pages/index.module.css b/src/pages/index.module.css index e51ed48a8..ab1dc6102 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -156,7 +156,11 @@ } /* https://docusaurus.io/docs/markdown-features/assets#github-style-themed-images */ -[data-theme='light'] .darkThemeOnly, -[data-theme='dark'] .lightThemeOnly { +[data-theme='light'] .showInDarkThemeOnly, +[data-theme='dark'] .showInLightThemeOnly { display: none; +} + +[data-theme='dark'] .recolourWorldMapPinInDarkTheme [fill="#003164"] { + fill: #e3e3e3; } \ No newline at end of file diff --git a/src/pages/index.tsx b/src/pages/index.tsx index eba15332e..96aa03e87 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -120,8 +120,8 @@ const Contributors = (): JSX.Element => (
- - + +
Shortly after its inception, researchers from Kiel University and TU Dresden joined the team, contributing diagram synthesis and layout technology, highly-efficient runtime implementations, and various compiler improvements. Since then, we have worked with real-time systems experts from TU Dallas, embedded systems specialists from NTNU, and networking and security researchers from Hanyang University and ASU. @@ -137,7 +137,7 @@ const Contributors = (): JSX.Element => (
} - col2={} + col2={} /> );