Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/wicked-pears-like.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"website": patch
---

Improve the landing page to clearly show what the company does
43 changes: 43 additions & 0 deletions assets/arrows/down_arrow.svg
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe https://github.com/unplugin/unplugin-icons could be used like we did in another project we did

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions src/components/Orbiter.astro
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,26 @@
revolve var(--speed) linear infinite,
hide var(--speed) linear infinite;
animation-delay: calc(var(--speed) * -1 * (var(--sibling-index) - 1) / var(--sibling-count));
position: relative;
}

:global(.orbit):hover > :global(*) {
animation-play-state: paused;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! I didn't know that this can be done like this.

}

:global(.orbit) > :global(*):hover::after {
content: attr(data-label);
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
font-size: 0.9rem;
color: white;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use --color-white variable

background: rgba(0, 0, 0, 0.6);
padding: 0.2rem 0.5rem;
border-radius: 0.5rem;
white-space: nowrap;
pointer-events: none;
}

@container (width > 40rem) {
Expand Down
1 change: 1 addition & 0 deletions src/content.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const productsCollection = defineCollection({
z.object({
title: z.string(),
summary: z.string(),
buttonText: z.string(),
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

buttonText is a very generic label. What is the button going to be used for? Always use descriptive naming.

}),
),
});
Expand Down
1 change: 1 addition & 0 deletions src/content/products/de/criteriacatalog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: Criteria Catalog
summary: Der Criteria Catalog ist ein flexibles und anpassbares System zur Verwaltung von Kriterien für verschiedene Anwendungen.
buttonText: Mehr erfahren
---

Der Criteria Catalog ist ein flexibles und anpassbares System zur Verwaltung von Kriterien für verschiedene Anwendungen. Es ermöglicht die einfache Erstellung, Bearbeitung und Organisation von Kriterien, die in verschiedenen Kontexten verwendet werden können. Durch seine modulare Struktur kann der Criteria Catalog leicht erweitert und angepasst werden, um spezifische Anforderungen zu erfüllen. Ideal für Prüfungsorganisationen, Bildungsinstitutionen und Unternehmen, die ein effektives Kriteriensystem benötigen. Der Criteria Catalog unterstützt verschiedene Formate und Standards, um eine breite Anwendbarkeit zu gewährleisten. Mit seiner benutzerfreundlichen Oberfläche und leistungsstarken Funktionen ist er ein unverzichtbares Werkzeug für die Verwaltung von Kriterien in modernen Anwendungen.
1 change: 1 addition & 0 deletions src/content/products/de/sparkium.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: Sparkium
summary: Sparkium ist ein modernes Datenschema für die Speicherung von eLearning-Inhalten.
buttonText: Schema anzeigen
---

Sparkium ist ein modernes Datenschema für die Speicherung von eLearning-Inhalten. Dadurch das es auf textbasierten Formaten wie Markdown basiert und ein strukturiertes Dateisystem verwendet, ist es zugänglich, leicht zu bearbeiten und versionierbar.
Expand Down
1 change: 1 addition & 0 deletions src/content/products/de/sparklink.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: SparkLink
summary: SparkLink synchronizes eLearning content between sources like Git and LMS such as Moodle.
buttonText: Demo ausprobieren
---

Mit SparkLink können Sie eLearning-Inhalte zwischen Quellen wie Git und Lernmanagementsystemen (LMS) wie Moodle synchronisieren. Dies erleichtert die Verwaltung von Kursmaterialien.
Expand Down
3 changes: 2 additions & 1 deletion src/content/products/en/criteriacatalog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: Criteria Catalog
title: "Criteria Catalog 🗂️"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why the English people are allowed to see emojis but the German speaking people arent?

summary: The Criteria Catalog is a flexible and customizable system for managing criteria across a variety of use cases.
buttonText: Learn More
---

The Criteria Catalog is a flexible and customizable system for managing criteria across different applications. It enables easy creation, editing, and organization of criteria that can be used in multiple contexts. Thanks to its modular structure, the Criteria Catalog can be easily extended and adapted to meet specific requirements. It is ideal for examination boards, educational institutions, and companies that need an effective criteria management system. The Criteria Catalog supports various formats and standards to ensure broad applicability. With its user‑friendly interface and powerful features, it is an essential tool for managing criteria in modern applications.
3 changes: 2 additions & 1 deletion src/content/products/en/sparkium.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: Sparkium
title: "Sparkium 🧩"
summary: Sparkium is a modern data schema for storing eLearning content.
buttonText: View Schema
---

With Sparkium, you can store eLearning content in a modern data schema. Based on text-based formats like Markdown and using a structured file system, it is accessible, easy to edit, and versionable.
3 changes: 2 additions & 1 deletion src/content/products/en/sparklink.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: SparkLink
title: "SparkLink 🔁"
summary: SparkLink synchronizes eLearning content between sources like Git and LMS such as Moodle.
buttonText: Try Demo
---

With SparkLink, you can synchronize eLearning content between sources like Git and learning management systems (LMS) such as Moodle. This helps in managing course materials.
1 change: 1 addition & 0 deletions src/layouts/Shell.css
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
--color-white-97: hsl(from var(--color-white) h s calc(l * 0.97));
--color-white: #f9f9f9;
--color-black: #333333;
--color-transition: #555;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You see the other colors are defined in another style. Please adapt.


--size-font-quot: 3rem;
--size-font-huge: 1.5rem;
Expand Down
9 changes: 5 additions & 4 deletions src/layouts/sections/Grid.astro
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@ const { ...attributes } = Astro.props;
background-position:
0px 0px,
0px 0px;
background-image:
radial-gradient(60% 100% at 25% 75%, rgb(from var(--color-primary) r g b / 0.3) 0%, transparent 100%),
radial-gradient(60% 100% at 75% 25%, rgb(from var(--color-secondary) r g b / 0.3) 0%, transparent 100%);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should revert to the previous backgrounds. In my opinion it doesn't look good. Suddenly we also have rounded corners and a box shadow, we haven't introduced anywhere else.

The gradient is spread to much so it becomes pixelated and blurry.
image

}

.wrapper {
Expand All @@ -39,7 +36,11 @@ const { ...attributes } = Astro.props;
box-sizing: border-box;
width: 100%;
background-color: rgb(from var(--color-white) r g b / 0.5);
border: var(--border-massive);
border-radius: 16px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
border: 1px solid rgba(255, 255, 255, 0.4);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert this. This is not necessary to change now.

border-radius: var(--size-border-radius-large);
padding: var(--size-gap-large);
}
Expand Down
2 changes: 1 addition & 1 deletion src/layouts/sections/Spotlight.astro
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const { ...attributes } = Astro.props;

<style>
.wrapper {
background-color: rgb(from var(--color-white) r g b / 0.5);
background-color: rgb(from var(--color-white) r g b / 0.4);
border: var(--border-massive);
border-radius: var(--size-border-radius-large);
gap: var(--size-gap);
Expand Down
2 changes: 1 addition & 1 deletion src/pages/[...locale]/[products]/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const products = i18nProps(collection, {
<p slot="description">{product.data.summary}</p>
<Fragment slot="actions">
<a href={product.translatedPath} class="button primary">
{messages.action({ product: product.data.title })}
{messages.action({ product: product.data.title.replace(/(\p{Extended_Pictographic}\uFE0F?)$/gu, "") })}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this hack is necessary?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because I added emoji in the product.data.title, and I think the emojis don't need to be displayed in the buttons so I used regex to remove the emoji from the title.
I added emoji because the previous product display consists only of text and buttons, which looks a bit “empty.”

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I suggest not to add the emoji to the title by default, but create another data field in the frontmatter for the emoji itself. When you want to add the emoji you can add it then.

</a>
</Fragment>
</Card>
Expand Down
111 changes: 78 additions & 33 deletions src/pages/[...locale]/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,11 @@ import Contact from "../../layouts/groups/Contact.astro";
export const getStaticPaths = generateGetStaticIndexPaths("[...locale]");

const messages = useI18n("src/pages/[...locale]/index.astro", {
spotlightTitle: "Empowers and Connects",
spotlightContent: "Join us in our mission to empower and connect the EdTech space with our products.",
spotlightActionConnect: "Connect",
spotlightActionEmpower: "Empower",
spotlightTitle: "Intelligent plugins in the field of education",
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does the word plugin mean here? Why are they intelligent? I think we should revert to the previous one.

Copy link
Copy Markdown
Contributor Author

@yixuanwu4 yixuanwu4 Sep 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we can come up with a better one but in my opinion the previous one is a bit confusing to read and understand, the words "empower" and "connect" are not so straightforward.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe:

  • Radiating knowledge
  • Transmits knowledge
  • Transports knowledge

spotlightContent:
"We are committed to developing innovative tools that empower educators, students, and developers in the field of educational technology.",
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's too long. Maybe try to optimize the existing one the make the message more clear? It can also be shortened:

"Join our mission to empower and connect the EdTech space, by ..."?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this sentence "Join our mission to empower and connect the EdTech space" doesn't convey a clear message to people and might cause confusion

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is your proposal then?

spotlightActionConnect: "Connect With Us",
spotlightActionEmpower: "Explore Products",
spotlightActionEmpowerLink: "/products",
empowerTitle: "Products that empower",
connectTitle: "Connect with us",
Expand All @@ -55,6 +56,9 @@ const products = i18nProps(collection, {
<Spotlight id="spotlight">
<h1 slot="title">{messages.spotlightTitle}</h1>
<p slot="content">{messages.spotlightContent}</p>
<p slot="content" id="transition">
Our products make education smarter, simpler, and more connected. Scroll down to see how ↓
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this makes the screen unnecessary cluttered and doesn't brings any value for the understanding.

</p>
<Fragment slot="actions">
<a href={messages.spotlightActionEmpowerLink} class="button primary">{messages.spotlightActionEmpower}</a>
<a href="#connect" class="button">{messages.spotlightActionConnect}</a>
Expand All @@ -63,15 +67,15 @@ const products = i18nProps(collection, {
<Image slot="host" alt="Our logo as the orbiters host" src={LogoSquare} />
<Fragment slot="orbits">
<div class="orbit">
<div>🎓</div>
<div>📚</div>
<div>💻</div>
<div>☁️</div>
<div>🧠</div>
<div>💬</div>
<div>🚀</div>
<div>💡</div>
<div>🧑‍🏫</div>
<div data-label="Education">🎓</div>
<div data-label="Books">📚</div>
<div data-label="Coding">💻</div>
<div data-label="Cloud">☁️</div>
<div data-label="Intelligence">🧠</div>
<div data-label="Message">💬</div>
<div data-label="Speed Up">🚀</div>
<div data-label="Solutions">💡</div>
<div data-label="Teaching">🧑‍🏫</div>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like this, but also the other orbit should get labels and it should be translated to german. I think to make it translatable there needs to be a well thought out solution. Just using nanostores i18n is wrong for this use case as it is content.

</div>
<div class="orbit">
<Image alt="Logo of Moodle" src={MoodleLogo} />
Expand All @@ -96,7 +100,7 @@ const products = i18nProps(collection, {
<h3>{product.data.title}</h3>
<p>{product.data.summary}</p>
<a href={product.translatedPath} class="button primary">
{messages.spotlightActionEmpower}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've the message spotlightActionEmpower is not used anymore, please remove it above.

{product.data.buttonText}
</a>
</article>
))
Expand Down Expand Up @@ -137,6 +141,9 @@ const products = i18nProps(collection, {
display: flex;
flex-direction: column;
gap: 1rem;
background-image:
radial-gradient(60% 100% at 75% 25%, rgb(from var(--color-primary) r g b / 0.3) 0%, transparent 100%),
radial-gradient(60% 100% at 25% 75%, rgb(from var(--color-secondary) r g b / 0.3) 0%, transparent 100%);
}

#spotlight,
Expand All @@ -147,27 +154,17 @@ const products = i18nProps(collection, {
justify-content: center;
min-height: 100vh;
background-size: 100% 100%;
background-position:
0px 0px,
0px 0px;
}

#spotlight {
background-image:
radial-gradient(60% 100% at 75% 25%, rgb(from var(--color-primary) r g b / 0.3) 0%, transparent 100%),
radial-gradient(60% 100% at 25% 75%, rgb(from var(--color-secondary) r g b / 0.3) 0%, transparent 100%);
background-image: rgba(255, 255, 255, 0.8);
border-radius: 16px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
border: 1px solid rgba(255, 255, 255, 0.4);
}

#empower {
background-image:
radial-gradient(60% 100% at 25% 75%, rgb(from var(--color-primary) r g b / 0.3) 0%, transparent 100%),
radial-gradient(60% 100% at 75% 25%, rgb(from var(--color-secondary) r g b / 0.3) 0%, transparent 100%);
}

#connect {
background-image:
radial-gradient(60% 100% at 75% 75%, rgb(from var(--color-primary) r g b / 0.3) 0%, transparent 100%),
radial-gradient(60% 100% at 25% 25%, rgb(from var(--color-secondary) r g b / 0.3) 0%, transparent 100%);
#transition {
font-size: var(--size-font-small);
color: var(--color-transition);
}

#empower article {
Expand All @@ -178,4 +175,52 @@ const products = i18nProps(collection, {
width: fit-content;
}
}

#scroll-button {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make a separate component out of it (like Orbiter).

position: fixed;
bottom: var(--size-gap);
right: var(--size-gap-small);
cursor: pointer;
display: flex;
border: none;
animation: bounce 2s infinite;
background-color: transparent;
padding: var(--size-gap-large);
}

#scroll-button img {
height: 4rem;
transition: transform 0.3s ease;
}

#scroll-button:hover img {
transform: scale(1.5);
}

@keyframes bounce {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(var(--size-gap-small));
}
}
</style>

<script>
const scrollButton = document.getElementById("scroll-button")!;

const grids = Array.from(document.querySelectorAll<HTMLElement>("#empower, #connect"));
scrollButton.addEventListener("click", () => {
const scrollY = window.scrollY;
const nextGrid = grids.find((grid) => grid.offsetTop > scrollY);

if (nextGrid) {
nextGrid.scrollIntoView({
behavior: "smooth",
block: "center",
});
}
});
</script>