diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..d033ad9
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,54 @@
+# AGENTS.md
+
+Monorepo for **Known** (知学情), an exam-score analysis app for students. Three independent platform apps that share no
+code:
+
+- `Web/` — marketing/landing site (Vite, plain HTML/CSS/JS, no framework). Most active work.
+- `Android/` — Kotlin + Jetpack Compose (Material 3), Gradle Kotlin DSL, `mobile` + `wear` modules.
+- `HarmonyOS/` — ArkTS app for DevEco Studio (hvigor build).
+
+## Git workflow
+
+- Default branch is `main`. Feature work happens on per-platform branches: `dev_web`, `dev_android`, `dev_harmony`,
+ `dev_wear`. Currently checked out: `dev_web`.
+- All Git commits require explicit human confirmation before running.
+- Pushes to `main` touching `Web/**` trigger `.github/workflows/static.yml`, which deploys the **raw `Web/` directory**
+ to GitHub Pages — there is no build step, so `src/`/`css/` edits go live as-is after the push. `vite build` output
+ (`dist/`) is not deployed.
+
+## Web (`Web/`)
+
+Commands (run in `Web/`):
+
+- `npm run dev` — Vite dev server. Vite is only a dev server/build tool here; the site itself is static HTML.
+- `npm run build` / `npm run preview`
+- No tests, no lint, no typecheck. Only Prettier for formatting (`.prettierrc`: single quotes, printWidth 80, tabWidth
+ 2).
+
+Gotchas:
+
+- `src/script.js` is the real UI logic (theme, language, particles, changelog timeline).
+- `src/main.js` is leftover WebStorm counter boilerplate. Its top-level
+ `setupCounter(document.getElementById('counter-value'))` throws at load because no `#counter-value` element exists,
+ which also prevents its `DOMContentLoaded` handler from registering. Don't build on it.
+- All UI strings are in `assets/values/translations.json` (locales `zh`, `zh-tw`, `en`, `en-GB`), applied via
+ `data-i18n` attributes. Theme/lang dropdown state persists in `localStorage`.
+- The changelog section is fetched live from the GitHub API (`Melendez1209/Known`: releases, then commits fallback) — it
+ is not stored in the repo.
+- `404.html` also loads `src/i18n.js` and shares the same translations file.
+
+## Android (`Android/`)
+
+- Jetpack Compose + Material 3, Gradle Kotlin DSL, modules `mobile` and `wear`. Build with `gradlew.bat`/`./gradlew`;
+ developed in Android Studio.
+
+## HarmonyOS (`HarmonyOS/`)
+
+- DevEco Studio project (ArkTS, hvigor). Requires the DevEco toolchain.
+
+## Project conventions (from `CONTRIBUTING.md`)
+
+- Audience is minors — never add porn/violence/gambling/drugs content anywhere in the repo.
+- Use **CRLF** line endings and leave a blank line at the end of every file.
+- Code comments in standard English; a space before and after `//`, no trailing full stop.
+- Android: run Android Studio's code cleanup on changed files before committing.
diff --git a/Web/assets/svg/download.svg b/Web/assets/svg/download.svg
new file mode 100644
index 0000000..659e516
--- /dev/null
+++ b/Web/assets/svg/download.svg
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Web/assets/svg/opensource.svg b/Web/assets/svg/opensource.svg
new file mode 100644
index 0000000..8fb2247
--- /dev/null
+++ b/Web/assets/svg/opensource.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </> opensource.js
+
+ // free for everyone
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Web/assets/values/translations.json b/Web/assets/values/translations.json
index bdf0421..e6b20a6 100644
--- a/Web/assets/values/translations.json
+++ b/Web/assets/values/translations.json
@@ -9,6 +9,7 @@
"nav.download": "下载",
"nav.changelog": "更新日志",
"nav.about": "关于",
+ "nav.openSource": "开源地址",
"theme.light": "浅色模式",
"theme.dark": "深色模式",
"theme.system": "跟随系统",
@@ -58,6 +59,7 @@
"nav.download": "下載",
"nav.changelog": "更新日誌",
"nav.about": "關於",
+ "nav.openSource": "開源地址",
"theme.light": "淺色模式",
"theme.dark": "深色模式",
"theme.system": "跟隨系統",
@@ -107,6 +109,7 @@
"nav.download": "Download",
"nav.changelog": "Changelog",
"nav.about": "About",
+ "nav.openSource": "Open Source",
"theme.light": "Light Mode",
"theme.dark": "Dark Mode",
"theme.system": "Follow System",
@@ -156,6 +159,7 @@
"nav.download": "Download",
"nav.changelog": "Changelog",
"nav.about": "About",
+ "nav.openSource": "Open Source",
"theme.light": "Light Mode",
"theme.dark": "Dark Mode",
"theme.system": "Follow System",
@@ -195,4 +199,4 @@
"about.description": "Known is an app developed by a middle school student (now a freshman in high school) in Beijing to help students better analyse their test scores and stay motivated. We hope Known can be your right-hand man on your way to learning.",
"footer.copyright": "Open-sourced under MIT License."
}
-}
\ No newline at end of file
+}
diff --git a/Web/css/index.css b/Web/css/index.css
index d713263..14d8282 100644
--- a/Web/css/index.css
+++ b/Web/css/index.css
@@ -1,9 +1,9 @@
:root {
- --primary-color: #A54BCF;
- --secondary-color: #006E2B;
+ --primary-color: #a54bcf;
+ --secondary-color: #006e2b;
--background-color: #f8f5fb;
--text-color: #2c3e50;
- --gradient-secondary: #C78AE6;
+ --gradient-secondary: #c78ae6;
--card-background: white;
--nav-background: white;
--shadow-color: rgba(165, 75, 207, 0.1);
@@ -13,7 +13,7 @@
--border-color: #ddd;
}
-[data-theme="dark"] {
+[data-theme='dark'] {
--background-color: #1a1a2e;
--text-color: #e0e0e0;
--card-background: #16213e;
@@ -33,10 +33,11 @@
html {
scroll-behavior: smooth;
+ scroll-snap-type: y mandatory;
}
body {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
line-height: 1.6;
color: var(--text-color);
background-color: var(--background-color);
@@ -46,28 +47,53 @@ body {
/* ===== Navigation ===== */
nav {
position: fixed;
- top: 0;
+ top: 1rem;
left: 0;
right: 0;
+ margin: 0 auto;
z-index: 1000;
+ width: calc(100% - 2rem);
+ max-width: 1100px;
background: rgba(255, 255, 255, 0.85);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
- border-bottom: 1px solid rgba(165, 75, 207, 0.1);
- padding: 0.5rem 2rem;
+ border: 1px solid rgba(165, 75, 207, 0.1);
+ border-radius: 999px;
+ padding: 0.5rem 1.5rem;
display: flex;
justify-content: space-between;
align-items: center;
height: 60px;
+ box-shadow: 0 8px 30px var(--shadow-color);
transition: all 0.3s ease;
}
-[data-theme="dark"] nav {
+[data-theme='dark'] nav {
background: rgba(22, 33, 62, 0.85);
}
nav.scrolled {
- box-shadow: 0 2px 20px rgba(165, 75, 207, 0.15);
+ box-shadow: 0 10px 40px var(--shadow-color-hover);
+}
+
+nav.about-active {
+ max-width: 780px;
+}
+
+nav.about-active ul {
+ position: static;
+ transform: none;
+}
+
+.logo.logo-fixed {
+ position: fixed;
+ z-index: 1001;
+ margin: 0;
+ transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+.logo.logo-about-large {
+ transform: scale(3);
}
.logo img {
@@ -75,7 +101,18 @@ nav.scrolled {
vertical-align: middle;
}
+.nav-controls {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ height: 100%;
+}
+
nav ul {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
display: flex;
list-style: none;
gap: 2rem;
@@ -134,7 +171,30 @@ nav a.active {
.theme-dropdown,
.lang-dropdown {
+ position: absolute;
top: calc(100% + 0.5rem);
+ right: 0;
+ z-index: 1000;
+ min-width: 180px;
+ padding: 0.5rem;
+ gap: 0.2rem;
+ display: flex;
+ flex-direction: column;
+ border-radius: 12px;
+ background: rgba(255, 255, 255, 0.85);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ border: 1px solid rgba(165, 75, 207, 0.1);
+ box-shadow: 0 8px 30px var(--shadow-color);
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(-10px) scale(0.95);
+ transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
+}
+
+[data-theme='dark'] .theme-dropdown,
+[data-theme='dark'] .lang-dropdown {
+ background: rgba(22, 33, 62, 0.85);
}
.theme-selector,
@@ -146,13 +206,15 @@ nav a.active {
}
/* ===== Main Content ===== */
-main {
- margin-top: 60px;
-}
-
-section {
+main section {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
padding: 5rem 10%;
position: relative;
+ scroll-snap-align: start;
+ scroll-snap-stop: always;
}
/* ===== Hero Section ===== */
@@ -160,7 +222,11 @@ section {
text-align: center;
padding-top: 6rem;
padding-bottom: 10rem;
- background: linear-gradient(135deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
color: white;
min-height: 100vh;
display: flex;
@@ -385,7 +451,11 @@ section {
text-align: center;
font-size: 2.8rem;
margin-bottom: 1rem;
- background: linear-gradient(135deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
@@ -399,7 +469,11 @@ section {
transform: translateX(-50%);
width: 80px;
height: 4px;
- background: linear-gradient(135deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
border-radius: 2px;
}
@@ -430,7 +504,11 @@ section {
left: 0;
width: 100%;
height: 3px;
- background: linear-gradient(90deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 90deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
transform: scaleX(0);
transform-origin: left;
transition: transform 0.4s ease;
@@ -449,7 +527,11 @@ section {
width: 70px;
height: 70px;
margin: 0 auto 1.5rem;
- background: linear-gradient(135deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
border-radius: 20px;
display: flex;
align-items: center;
@@ -481,25 +563,62 @@ section {
/* ===== Download Section ===== */
#download {
text-align: center;
- background: linear-gradient(180deg, var(--background-color), rgba(165, 75, 207, 0.05));
+ background: linear-gradient(
+ 180deg,
+ var(--background-color),
+ rgba(165, 75, 207, 0.05)
+ );
position: relative;
}
#download h2 {
font-size: 2.8rem;
margin-bottom: 1rem;
- background: linear-gradient(135deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
+.download-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: clamp(2rem, 5vw, 4rem);
+ width: 100%;
+ max-width: 1000px;
+ margin: 0 auto;
+ flex-wrap: wrap;
+}
+
+.download-content {
+ flex: 1 1 320px;
+ max-width: 440px;
+ text-align: left;
+}
+
+.download-art {
+ flex: 1 1 320px;
+ max-width: 460px;
+ min-width: 280px;
+}
+
+.download-art svg {
+ width: 100%;
+ height: auto;
+ display: block;
+}
+
.download-options {
display: flex;
gap: 2rem;
- justify-content: center;
+ justify-content: flex-start;
flex-wrap: wrap;
- margin: 3rem 0;
+ margin: 2rem 0 0;
}
.download-button {
@@ -526,7 +645,11 @@ section {
left: 0;
width: 100%;
height: 100%;
- background: linear-gradient(135deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
opacity: 0;
transition: opacity 0.4s ease;
z-index: 0;
@@ -567,18 +690,20 @@ section {
.download-button .version-text {
position: absolute;
- left: 50%;
- transform: translateX(-50%);
- top: calc(50% - 0.5em - 0.5em);
- font-size: 0.9rem;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.1rem;
opacity: 0;
+ transform: translateY(10px);
transition: all 0.3s ease;
color: white;
}
.download-button:hover .version-text {
- top: calc(50% - 0.5em);
opacity: 1;
+ transform: translateY(0);
}
.download-button:hover span:not(.version-text) {
@@ -586,10 +711,52 @@ section {
}
/* ===== Open Source Section ===== */
+.open-source-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: clamp(2rem, 5vw, 4rem);
+ width: 100%;
+ max-width: 1000px;
+ margin: 0 auto;
+ flex-wrap: wrap;
+}
+
+.open-source-content {
+ flex: 1 1 320px;
+ max-width: 440px;
+ text-align: left;
+}
+
+.open-source-content h2 {
+ font-size: 2.8rem;
+ margin-bottom: 1.5rem;
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.open-source-art {
+ flex: 1 1 320px;
+ max-width: 460px;
+ min-width: 280px;
+}
+
+.open-source-art svg {
+ width: 100%;
+ height: auto;
+ display: block;
+}
+
.open-source-link {
display: flex;
gap: 1.5rem;
- justify-content: center;
+ justify-content: flex-start;
margin-top: 2rem;
}
@@ -627,7 +794,11 @@ section {
text-align: center;
font-size: 2.8rem;
margin-bottom: 2rem;
- background: linear-gradient(135deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
@@ -654,7 +825,11 @@ section {
position: absolute;
top: 16px;
height: 2px;
- background: linear-gradient(90deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 90deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
border-radius: 1px;
opacity: 0.3;
z-index: 0;
@@ -737,7 +912,11 @@ section {
.timeline-version {
display: inline-block;
padding: 0.25rem 0.75rem;
- background: linear-gradient(135deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
color: white;
border-radius: 20px;
font-size: 0.85rem;
@@ -836,15 +1015,45 @@ section {
/* ===== About Section ===== */
#about {
- text-align: center;
position: relative;
overflow: hidden;
+ padding-bottom: 12rem;
+}
+
+.about-container {
+ display: flex;
+ align-items: stretch;
+ justify-content: center;
+ gap: clamp(2rem, 5vw, 4rem);
+ width: 100%;
+ max-width: 1000px;
+ margin: 0 auto;
+ flex-wrap: wrap;
+}
+
+.about-logo-column {
+ flex: 1 1 320px;
+ max-width: 460px;
+ min-width: 280px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.about-content {
+ flex: 1 1 320px;
+ max-width: 440px;
+ text-align: left;
}
#about h2 {
font-size: 2.8rem;
margin-bottom: 1.5rem;
- background: linear-gradient(135deg, var(--primary-color), var(--gradient-secondary));
+ background: linear-gradient(
+ 135deg,
+ var(--primary-color),
+ var(--gradient-secondary)
+ );
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
@@ -854,7 +1063,7 @@ section {
font-size: 1.15rem;
line-height: 1.9;
max-width: 700px;
- margin: 0 auto 2rem;
+ margin: 0;
color: var(--text-color);
opacity: 0.85;
}
@@ -867,6 +1076,7 @@ footer {
color: var(--text-color);
opacity: 0.7;
font-size: 0.9rem;
+ scroll-snap-align: end;
}
/* ===== Theme Selector ===== */
@@ -874,32 +1084,14 @@ footer {
position: relative;
}
-.theme-dropdown {
- position: absolute;
- top: 100%;
- right: 0;
- background: var(--card-background);
- border-radius: 12px;
- box-shadow: 0 8px 30px var(--shadow-color);
- padding: 0.5rem;
- z-index: 1000;
- min-width: 180px;
- gap: 0.2rem;
- display: flex;
- flex-direction: column;
- opacity: 0;
- visibility: hidden;
- transform: translateY(-10px) scale(0.95);
- transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
.theme-selector:hover .theme-dropdown {
opacity: 1;
visibility: visible;
transform: translateY(0) scale(1);
}
-.theme-dropdown button {
+.theme-dropdown button,
+.lang-dropdown button {
display: flex;
align-items: center;
gap: 0.8rem;
@@ -912,26 +1104,50 @@ footer {
transition: all 0.2s ease;
border-radius: 8px;
font-size: 0.9rem;
+ line-height: 1.4;
+ text-align: left;
white-space: nowrap;
}
-.theme-dropdown button:hover {
+.theme-dropdown button:hover,
+.lang-dropdown button:hover {
background: var(--shadow-color);
}
.theme-dropdown button i {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 1.2rem;
+ height: 1.2rem;
+ font-size: 0.9rem;
+ line-height: 1;
+ flex-shrink: 0;
+}
+
+.lang-dropdown button::before {
+ content: '';
width: 1.2rem;
text-align: center;
+ line-height: 1;
flex-shrink: 0;
}
-.theme-dropdown button[data-selected="true"] {
+.theme-dropdown button[data-selected='true'],
+.lang-dropdown button[data-selected='true'] {
color: var(--primary-color);
background: var(--shadow-color);
font-weight: 600;
}
-.theme-selector button {
+.lang-dropdown button[data-selected='true']::before {
+ content: '\f00c';
+ font-family: 'Font Awesome 6 Free', serif;
+ font-weight: 900;
+ color: var(--primary-color);
+}
+
+.theme-toggle {
background: none;
border: none;
color: var(--text-color);
@@ -941,7 +1157,7 @@ footer {
transition: color 0.3s ease;
}
-.theme-selector button:hover {
+.theme-toggle:hover {
color: var(--primary-color);
}
@@ -949,20 +1165,20 @@ footer {
display: none;
}
-[data-theme="system"] .system-icon {
+[data-theme='system'] .system-icon {
display: inline-block;
}
-[data-theme="system"] .light-icon,
-[data-theme="system"] .dark-icon {
+[data-theme='system'] .light-icon,
+[data-theme='system'] .dark-icon {
display: none;
}
-[data-theme="dark"] .dark-icon {
+[data-theme='dark'] .dark-icon {
display: none;
}
-[data-theme="light"] .light-icon {
+[data-theme='light'] .light-icon {
display: none;
}
@@ -971,71 +1187,12 @@ footer {
position: relative;
}
-.lang-dropdown {
- position: absolute;
- top: 100%;
- right: 0;
- background: var(--card-background);
- border-radius: 12px;
- box-shadow: 0 8px 30px var(--shadow-color);
- padding: 0.5rem;
- z-index: 1000;
- min-width: 180px;
- gap: 0.2rem;
- display: flex;
- flex-direction: column;
- opacity: 0;
- visibility: hidden;
- transform: translateY(-10px) scale(0.95);
- transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
.lang-selector:hover .lang-dropdown {
opacity: 1;
visibility: visible;
transform: translateY(0) scale(1);
}
-.lang-dropdown button {
- display: flex;
- align-items: center;
- gap: 0.8rem;
- width: 100%;
- padding: 0.7rem 1rem;
- border: none;
- background: none;
- color: var(--text-color);
- cursor: pointer;
- transition: all 0.2s ease;
- border-radius: 8px;
- font-size: 0.9rem;
- white-space: nowrap;
-}
-
-.lang-dropdown button:hover {
- background: var(--shadow-color);
-}
-
-.lang-dropdown button::before {
- content: '';
- width: 1.2rem;
- text-align: center;
- flex-shrink: 0;
-}
-
-.lang-dropdown button[data-selected="true"]::before {
- content: '\f00c';
- font-family: 'Font Awesome 6 Free', serif;
- font-weight: 900;
- color: var(--primary-color);
-}
-
-.lang-dropdown button[data-selected="true"] {
- color: var(--primary-color);
- background: var(--shadow-color);
- font-weight: 600;
-}
-
.lang-toggle {
background: none;
border: none;
@@ -1052,6 +1209,10 @@ footer {
/* ===== Responsive ===== */
@media (max-width: 768px) {
+ nav {
+ width: calc(100% - 1rem);
+ }
+
nav ul {
display: none;
}
@@ -1075,6 +1236,20 @@ footer {
gap: 1rem;
}
+ .download-container {
+ flex-direction: column;
+ gap: 2rem;
+ }
+
+ .download-content {
+ max-width: none;
+ text-align: center;
+ }
+
+ .download-art {
+ max-width: 340px;
+ }
+
.download-button {
width: 100%;
max-width: 300px;
@@ -1093,6 +1268,34 @@ footer {
padding: 1rem;
}
+ .open-source-container {
+ flex-direction: column;
+ gap: 2rem;
+ }
+
+ .about-container {
+ flex-direction: column;
+ gap: 2rem;
+ }
+
+ .about-content {
+ max-width: none;
+ text-align: center;
+ }
+
+ .open-source-content {
+ max-width: none;
+ text-align: center;
+ }
+
+ .open-source-link {
+ justify-content: center;
+ }
+
+ .open-source-art {
+ max-width: 380px;
+ }
+
section {
padding: 3rem 5%;
}
@@ -1100,6 +1303,7 @@ footer {
#features h2,
#download h2,
#changelog h2,
+ .open-source-content h2,
#about h2 {
font-size: 2rem;
}
diff --git a/Web/index.html b/Web/index.html
index 5e86bbc..c07fc10 100644
--- a/Web/index.html
+++ b/Web/index.html
@@ -1,19 +1,25 @@
-
+
-
-
+
+
Known
-
-
-
+
+
+
@@ -23,15 +29,30 @@
@@ -80,10 +101,16 @@
Known
-
Your Intelligent Learning Assistant
+
+ Your Intelligent Learning Assistant
+
@@ -102,66 +129,42 @@
Grade Analysis
- Intelligent analysis of test scores and tracking of learning progress.
+
+ Intelligent analysis of test scores and tracking of learning
+ progress.
+
-
-
-
-
+
+
+
+
-
- Known is an app developed by a junior high
- school student (now a senior in high
- school) in Beijing to help students better analyze their test scores and stay motivated. We hope Known can
- be your right hand on your study journey.
+
+
+
+
+
+ Known is an app developed by a junior high school student (now a
+ senior in high school) in Beijing to help students better analyze
+ their test scores and stay motivated. We hope Known can be your
+ right hand on your study journey.
+
+
+
diff --git a/Web/package-lock.json b/Web/package-lock.json
index 13fc49e..5bae81a 100644
--- a/Web/package-lock.json
+++ b/Web/package-lock.json
@@ -1,89 +1,87 @@
{
- "name": "Web",
+ "name": "Known",
"version": "1.2.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "Web",
+ "name": "Known",
"version": "1.2.2",
"devDependencies": {
"prettier": "^3.3.1",
- "vite": "^6.4.3"
+ "vite": "8.0.16"
}
},
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz",
- "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/@emnapi/core": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
+ "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
"dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.1",
+ "tslib": "^2.4.0"
}
},
- "node_modules/@esbuild/android-arm": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz",
- "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@emnapi/runtime": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
"dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "tslib": "^2.4.0"
}
},
- "node_modules/@esbuild/android-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz",
- "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
"dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "tslib": "^2.4.0"
}
},
- "node_modules/@esbuild/android-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz",
- "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz",
+ "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==",
"dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "android"
- ],
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.3"
+ },
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || ^22.13.0 || >=23.5.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3",
+ "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3"
}
},
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz",
- "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==",
+ "node_modules/@oxc-project/types": {
+ "version": "0.133.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz",
+ "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz",
+ "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==",
"cpu": [
"arm64"
],
@@ -91,18 +89,18 @@
"license": "MIT",
"optional": true,
"os": [
- "darwin"
+ "android"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz",
- "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==",
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz",
+ "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==",
"cpu": [
- "x64"
+ "arm64"
],
"dev": true,
"license": "MIT",
@@ -111,30 +109,30 @@
"darwin"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz",
- "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==",
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz",
+ "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==",
"cpu": [
- "arm64"
+ "x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
- "freebsd"
+ "darwin"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz",
- "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==",
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz",
+ "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==",
"cpu": [
"x64"
],
@@ -145,13 +143,13 @@
"freebsd"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/linux-arm": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz",
- "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==",
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz",
+ "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==",
"cpu": [
"arm"
],
@@ -162,149 +160,133 @@
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz",
- "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==",
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz",
+ "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==",
"cpu": [
"arm64"
],
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz",
- "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==",
- "cpu": [
- "ia32"
+ "libc": [
+ "glibc"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz",
- "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==",
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz",
+ "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==",
"cpu": [
- "loong64"
+ "arm64"
],
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz",
- "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==",
- "cpu": [
- "mips64el"
+ "libc": [
+ "musl"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz",
- "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==",
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz",
+ "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==",
"cpu": [
"ppc64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz",
- "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==",
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz",
+ "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==",
"cpu": [
- "riscv64"
+ "s390x"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz",
- "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==",
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz",
+ "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==",
"cpu": [
- "s390x"
+ "x64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/linux-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz",
- "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==",
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz",
+ "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==",
"cpu": [
"x64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz",
- "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==",
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz",
+ "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==",
"cpu": [
"arm64"
],
@@ -312,33 +294,35 @@
"license": "MIT",
"optional": true,
"os": [
- "netbsd"
+ "openharmony"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz",
- "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==",
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz",
+ "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==",
"cpu": [
- "x64"
+ "wasm32"
],
"dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "netbsd"
- ],
+ "dependencies": {
+ "@emnapi/core": "1.10.0",
+ "@emnapi/runtime": "1.10.0",
+ "@napi-rs/wasm-runtime": "^1.1.4"
+ },
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz",
- "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==",
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz",
+ "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==",
"cpu": [
"arm64"
],
@@ -346,16 +330,16 @@
"license": "MIT",
"optional": true,
"os": [
- "openbsd"
+ "win32"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz",
- "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==",
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz",
+ "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==",
"cpu": [
"x64"
],
@@ -363,355 +347,260 @@
"license": "MIT",
"optional": true,
"os": [
- "openbsd"
+ "win32"
],
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz",
- "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
+ "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
"dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "tslib": "^2.4.0"
}
},
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz",
- "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": ">=8"
}
},
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz",
- "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
"engines": {
- "node": ">=18"
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
}
},
- "node_modules/@esbuild/win32-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz",
- "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
+ "hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
- "win32"
+ "darwin"
],
"engines": {
- "node": ">=18"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
- "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==",
- "cpu": [
- "arm"
- ],
+ "node_modules/lightningcss": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
"dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz",
- "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.33.0",
+ "lightningcss-darwin-arm64": "1.33.0",
+ "lightningcss-darwin-x64": "1.33.0",
+ "lightningcss-freebsd-x64": "1.33.0",
+ "lightningcss-linux-arm-gnueabihf": "1.33.0",
+ "lightningcss-linux-arm64-gnu": "1.33.0",
+ "lightningcss-linux-arm64-musl": "1.33.0",
+ "lightningcss-linux-x64-gnu": "1.33.0",
+ "lightningcss-linux-x64-musl": "1.33.0",
+ "lightningcss-win32-arm64-msvc": "1.33.0",
+ "lightningcss-win32-x64-msvc": "1.33.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+ "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
"cpu": [
"arm64"
],
"dev": true,
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"android"
- ]
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz",
- "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==",
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+ "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
"cpu": [
"arm64"
],
"dev": true,
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"darwin"
- ]
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz",
- "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==",
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+ "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
"cpu": [
"x64"
],
"dev": true,
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz",
- "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==",
- "cpu": [
- "arm64"
],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz",
- "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==",
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+ "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
"cpu": [
"x64"
],
"dev": true,
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz",
- "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "libc": [
- "glibc"
],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz",
- "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==",
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+ "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
"cpu": [
"arm"
],
"dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz",
- "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "glibc"
],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz",
- "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==",
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+ "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
"cpu": [
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz",
- "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz",
- "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz",
- "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
"libc": [
"glibc"
],
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz",
- "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "libc": [
- "musl"
],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz",
- "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz",
- "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==",
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+ "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
"cpu": [
- "riscv64"
+ "arm64"
],
"dev": true,
"libc": [
"musl"
],
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz",
- "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==",
- "cpu": [
- "s390x"
],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz",
- "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==",
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+ "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
"cpu": [
"x64"
],
@@ -719,16 +608,23 @@
"libc": [
"glibc"
],
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"linux"
- ]
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz",
- "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==",
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+ "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
"cpu": [
"x64"
],
@@ -736,175 +632,59 @@
"libc": [
"musl"
],
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"linux"
- ]
- },
- "node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz",
- "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==",
- "cpu": [
- "x64"
],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ]
- },
- "node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz",
- "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ]
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz",
- "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==",
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+ "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
"cpu": [
"arm64"
],
"dev": true,
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz",
- "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==",
- "cpu": [
- "ia32"
],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
},
- "node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz",
- "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==",
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+ "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
"cpu": [
"x64"
],
"dev": true,
- "license": "MIT",
+ "license": "MPL-2.0",
"optional": true,
"os": [
"win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz",
- "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==",
- "cpu": [
- "x64"
],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@types/estree": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
- "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/esbuild": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz",
- "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
"engines": {
- "node": ">=18"
+ "node": ">= 12.0.0"
},
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.2",
- "@esbuild/android-arm": "0.25.2",
- "@esbuild/android-arm64": "0.25.2",
- "@esbuild/android-x64": "0.25.2",
- "@esbuild/darwin-arm64": "0.25.2",
- "@esbuild/darwin-x64": "0.25.2",
- "@esbuild/freebsd-arm64": "0.25.2",
- "@esbuild/freebsd-x64": "0.25.2",
- "@esbuild/linux-arm": "0.25.2",
- "@esbuild/linux-arm64": "0.25.2",
- "@esbuild/linux-ia32": "0.25.2",
- "@esbuild/linux-loong64": "0.25.2",
- "@esbuild/linux-mips64el": "0.25.2",
- "@esbuild/linux-ppc64": "0.25.2",
- "@esbuild/linux-riscv64": "0.25.2",
- "@esbuild/linux-s390x": "0.25.2",
- "@esbuild/linux-x64": "0.25.2",
- "@esbuild/netbsd-arm64": "0.25.2",
- "@esbuild/netbsd-x64": "0.25.2",
- "@esbuild/openbsd-arm64": "0.25.2",
- "@esbuild/openbsd-x64": "0.25.2",
- "@esbuild/sunos-x64": "0.25.2",
- "@esbuild/win32-arm64": "0.25.2",
- "@esbuild/win32-ia32": "0.25.2",
- "@esbuild/win32-x64": "0.25.2"
- }
- },
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
"node_modules/nanoid": {
@@ -947,9 +727,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz",
- "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==",
+ "version": "8.5.25",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz",
+ "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==",
"dev": true,
"funding": [
{
@@ -991,49 +771,38 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/rollup": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz",
- "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==",
+ "node_modules/rolldown": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz",
+ "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.9"
+ "@oxc-project/types": "=0.133.0",
+ "@rolldown/pluginutils": "^1.0.0"
},
"bin": {
- "rollup": "dist/bin/rollup"
+ "rolldown": "bin/cli.mjs"
},
"engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
+ "node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.62.2",
- "@rollup/rollup-android-arm64": "4.62.2",
- "@rollup/rollup-darwin-arm64": "4.62.2",
- "@rollup/rollup-darwin-x64": "4.62.2",
- "@rollup/rollup-freebsd-arm64": "4.62.2",
- "@rollup/rollup-freebsd-x64": "4.62.2",
- "@rollup/rollup-linux-arm-gnueabihf": "4.62.2",
- "@rollup/rollup-linux-arm-musleabihf": "4.62.2",
- "@rollup/rollup-linux-arm64-gnu": "4.62.2",
- "@rollup/rollup-linux-arm64-musl": "4.62.2",
- "@rollup/rollup-linux-loong64-gnu": "4.62.2",
- "@rollup/rollup-linux-loong64-musl": "4.62.2",
- "@rollup/rollup-linux-ppc64-gnu": "4.62.2",
- "@rollup/rollup-linux-ppc64-musl": "4.62.2",
- "@rollup/rollup-linux-riscv64-gnu": "4.62.2",
- "@rollup/rollup-linux-riscv64-musl": "4.62.2",
- "@rollup/rollup-linux-s390x-gnu": "4.62.2",
- "@rollup/rollup-linux-x64-gnu": "4.62.2",
- "@rollup/rollup-linux-x64-musl": "4.62.2",
- "@rollup/rollup-openbsd-x64": "4.62.2",
- "@rollup/rollup-openharmony-arm64": "4.62.2",
- "@rollup/rollup-win32-arm64-msvc": "4.62.2",
- "@rollup/rollup-win32-ia32-msvc": "4.62.2",
- "@rollup/rollup-win32-x64-gnu": "4.62.2",
- "@rollup/rollup-win32-x64-msvc": "4.62.2",
- "fsevents": "~2.3.2"
+ "@rolldown/binding-android-arm64": "1.0.3",
+ "@rolldown/binding-darwin-arm64": "1.0.3",
+ "@rolldown/binding-darwin-x64": "1.0.3",
+ "@rolldown/binding-freebsd-x64": "1.0.3",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.3",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.3",
+ "@rolldown/binding-linux-arm64-musl": "1.0.3",
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.3",
+ "@rolldown/binding-linux-s390x-gnu": "1.0.3",
+ "@rolldown/binding-linux-x64-gnu": "1.0.3",
+ "@rolldown/binding-linux-x64-musl": "1.0.3",
+ "@rolldown/binding-openharmony-arm64": "1.0.3",
+ "@rolldown/binding-wasm32-wasi": "1.0.3",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.3",
+ "@rolldown/binding-win32-x64-msvc": "1.0.3"
}
},
"node_modules/source-map-js": {
@@ -1047,14 +816,14 @@
}
},
"node_modules/tinyglobby": {
- "version": "0.2.15",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
- "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
- "picomatch": "^4.0.3"
+ "picomatch": "^4.0.4"
},
"engines": {
"node": ">=12.0.0"
@@ -1063,25 +832,32 @@
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD",
+ "optional": true
+ },
"node_modules/vite": {
- "version": "6.4.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz",
- "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==",
+ "version": "8.0.16",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz",
+ "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "esbuild": "^0.25.0",
- "fdir": "^6.4.4",
- "picomatch": "^4.0.2",
- "postcss": "^8.5.3",
- "rollup": "^4.34.9",
- "tinyglobby": "^0.2.13"
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.4",
+ "postcss": "^8.5.15",
+ "rolldown": "1.0.3",
+ "tinyglobby": "^0.2.17"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
- "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ "node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
@@ -1090,14 +866,15 @@
"fsevents": "~2.3.3"
},
"peerDependencies": {
- "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.1.18",
+ "esbuild": "^0.27.0 || ^0.28.0",
"jiti": ">=1.21.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "sass-embedded": "*",
- "stylus": "*",
- "sugarss": "*",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
"terser": "^5.16.0",
"tsx": "^4.8.1",
"yaml": "^2.4.2"
@@ -1106,13 +883,16 @@
"@types/node": {
"optional": true
},
- "jiti": {
+ "@vitejs/devtools": {
"optional": true
},
- "less": {
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
"optional": true
},
- "lightningcss": {
+ "less": {
"optional": true
},
"sass": {
diff --git a/Web/package.json b/Web/package.json
index b3334a3..5d2a017 100644
--- a/Web/package.json
+++ b/Web/package.json
@@ -10,6 +10,6 @@
},
"devDependencies": {
"prettier": "^3.3.1",
- "vite": "^6.4.3"
+ "vite": "8.0.16"
}
}
diff --git a/Web/src/script.js b/Web/src/script.js
index 6b57e0e..d94355f 100644
--- a/Web/src/script.js
+++ b/Web/src/script.js
@@ -105,6 +105,19 @@ document.addEventListener('DOMContentLoaded', () => {
}
createParticles();
+ // ===== SVG Illustrations (loaded inline to inherit theme variables) =====
+ document.querySelectorAll('[data-svg]').forEach((container) => {
+ fetch(container.dataset.svg)
+ .then((res) => {
+ if (!res.ok) throw new Error(`Failed to load ${container.dataset.svg}`);
+ return res.text();
+ })
+ .then((svgText) => {
+ container.innerHTML = svgText;
+ })
+ .catch((err) => console.error('Failed to load SVG:', err));
+ });
+
// ===== Scroll Reveal (Intersection Observer) =====
const revealElements = document.querySelectorAll('.scroll-reveal');
@@ -162,6 +175,123 @@ document.addEventListener('DOMContentLoaded', () => {
}
}
+ // ===== Floating Logo: Fly to About description =====
+ const aboutSection = document.getElementById('about');
+ const aboutLogoColumn =
+ aboutSection && aboutSection.querySelector('.about-logo-column');
+ const aboutContent =
+ aboutSection && aboutSection.querySelector('.about-content');
+ const logo = document.querySelector('.logo');
+ const LOGO_FLY_DURATION = 600;
+ let logoFlying = false;
+ let logoTrackReady = false;
+
+ function isAboutActive() {
+ if (!aboutSection) return false;
+ const scrollY = window.scrollY + 100;
+ const top = aboutSection.offsetTop;
+ return scrollY >= top && scrollY < top + aboutSection.offsetHeight;
+ }
+
+ function aboutTargetViewport() {
+ const colRect = aboutLogoColumn.getBoundingClientRect();
+ const contentRect = aboutContent.getBoundingClientRect();
+ return {
+ left: colRect.left + colRect.width / 2 - logo.offsetWidth / 2,
+ top: contentRect.top + contentRect.height / 2 - logo.offsetHeight / 2,
+ };
+ }
+
+ function logoSlotViewport() {
+ const navRect = nav.getBoundingClientRect();
+ const padLeft = parseFloat(getComputedStyle(nav).paddingLeft) || 0;
+ return {
+ left: navRect.left + padLeft,
+ top: navRect.top + (navRect.height - logo.offsetHeight) / 2,
+ };
+ }
+
+ function cancelLogoAnimations() {
+ logo.getAnimations().forEach((anim) => anim.cancel());
+ }
+
+ function flyLogoToAbout() {
+ if (!logo || logoFlying) return;
+ cancelLogoAnimations();
+ logoFlying = true;
+ logoTrackReady = false;
+ nav.classList.add('about-active');
+ document.body.appendChild(logo);
+ logo.classList.add('logo-fixed');
+ logo.classList.add('logo-about-large');
+ const slot = logoSlotViewport();
+ const target = aboutTargetViewport();
+ logo.style.left = slot.left + 'px';
+ logo.style.top = slot.top + 'px';
+ const anim = logo.animate(
+ [
+ { left: slot.left + 'px', top: slot.top + 'px' },
+ { left: target.left + 'px', top: target.top + 'px' },
+ ],
+ {
+ duration: LOGO_FLY_DURATION,
+ easing: 'cubic-bezier(0.16, 1, 0.3, 1)',
+ fill: 'both',
+ },
+ );
+ anim.onfinish = () => {
+ anim.cancel();
+ logoTrackReady = true;
+ logo.style.left = target.left + 'px';
+ logo.style.top = target.top + 'px';
+ };
+ }
+
+ function flyLogoBack() {
+ if (!logo || !logoFlying) return;
+ cancelLogoAnimations();
+ logoFlying = false;
+ logoTrackReady = false;
+ logo.classList.remove('logo-about-large');
+ const currentLeft = parseFloat(logo.style.left) || 0;
+ const currentTop = parseFloat(logo.style.top) || 0;
+ const slot = logoSlotViewport();
+ const anim = logo.animate(
+ [
+ { left: currentLeft + 'px', top: currentTop + 'px' },
+ { left: slot.left + 'px', top: slot.top + 'px' },
+ ],
+ {
+ duration: LOGO_FLY_DURATION,
+ easing: 'cubic-bezier(0.16, 1, 0.3, 1)',
+ fill: 'both',
+ },
+ );
+ anim.onfinish = () => {
+ anim.cancel();
+ nav.prepend(logo);
+ nav.classList.remove('about-active');
+ logo.classList.remove('logo-fixed');
+ logo.style.left = '';
+ logo.style.top = '';
+ };
+ }
+
+ function updateAboutLogo() {
+ if (!aboutSection || !aboutLogoColumn || !aboutContent || !logo) return;
+ if (isAboutActive()) {
+ if (!logoFlying) {
+ flyLogoToAbout();
+ } else if (logoTrackReady) {
+ const target = aboutTargetViewport();
+ logo.style.left = target.left + 'px';
+ logo.style.top = target.top + 'px';
+ }
+ } else if (logoFlying) {
+ flyLogoBack();
+ }
+ }
+
// ===== Parallax Effect for Hero =====
const hero = document.querySelector('.hero');
@@ -186,9 +316,8 @@ document.addEventListener('DOMContentLoaded', () => {
const targetId = link.getAttribute('href');
const targetSection = document.querySelector(targetId);
if (targetSection) {
- const offsetTop = targetSection.offsetTop - 60;
window.scrollTo({
- top: offsetTop,
+ top: targetSection.offsetTop,
behavior: 'smooth',
});
}
@@ -202,9 +331,8 @@ document.addEventListener('DOMContentLoaded', () => {
const targetId = btn.getAttribute('href');
const targetSection = document.querySelector(targetId);
if (targetSection) {
- const offsetTop = targetSection.offsetTop - 60;
window.scrollTo({
- top: offsetTop,
+ top: targetSection.offsetTop,
behavior: 'smooth',
});
}
@@ -220,6 +348,7 @@ document.addEventListener('DOMContentLoaded', () => {
updateActiveNav();
updateNavStyle();
updateParallax();
+ updateAboutLogo();
ticking = false;
});
ticking = true;
@@ -229,6 +358,17 @@ document.addEventListener('DOMContentLoaded', () => {
// Initial calls
updateActiveNav();
updateNavStyle();
+ updateAboutLogo();
+
+ window.addEventListener('resize', () => {
+ if (logoFlying) {
+ cancelLogoAnimations();
+ logoTrackReady = true;
+ const target = aboutTargetViewport();
+ logo.style.left = target.left + 'px';
+ logo.style.top = target.top + 'px';
+ }
+ });
// ===== Changelog: Fetch from GitHub =====
const GITHUB_REPO = 'Melendez1209/Known';
@@ -364,7 +504,7 @@ document.addEventListener('DOMContentLoaded', () => {
}
});
},
- { threshold: 0.15 }
+ { threshold: 0.15 },
);
sectionObserver.observe(changelogSection);
}