diff --git a/client/src/App.tsx b/client/src/App.tsx
index 153fb034..e8e8fec8 100644
--- a/client/src/App.tsx
+++ b/client/src/App.tsx
@@ -262,7 +262,6 @@ function App() {
return (
+
+ );
+};
+
+const LeanLogo: React.FC = () =>
+
+
+
+
+const NavBarLean: React.FC = () => {
+ const outItems: NavItem[] = [
+ { title: "Playground", url: "https://live.lean-lang.org/", blank: true, active: true },
+ {
+ title: "Reservoir",
+ url: "https://reservoir.lean-lang.org/",
+ blank: true,
+ },
+ ];
+
+ const rightItems: NavItem[] = [
+ {
+ title:
,
+ alt: "Github",
+ url: "https://github.com/leanprover/lean4",
+ blank: true,
+ },
+ ];
+
+ const leftItems: NavItem[] = [
+ { title: "Install", url: "https://lean-lang.org/install" },
+ { title: "Learn", url: "https://lean-lang.org/learn" },
+ { title: "Community", url: "https://lean-lang.org/community" },
+ { title: "Use Cases", url: "https://lean-lang.org/use-cases" },
+ { title: "FRO", url: "https://lean-lang.org/fro" },
+ ];
+
+ const menuItems = [
+ { title: "Home", url: "https://lean-lang.org/fro" },
+ { title: "About", url: "https://lean-lang.org/fro/about" },
+ { title: "Team", url: "https://lean-lang.org/fro/team" },
+ { title: "Roadmap", url: "https://lean-lang.org/fro/roadmap" },
+ { title: "Contact", url: "https://lean-lang.org/fro/contact" },
+
+ ];
+
+ return (
+
+ );
+};
+
+const MathLibIniciativeLogo = () =>
+
+
+const NavBarMathLib: React.FC = () => {
+ const outItems: NavItem[] = [
+ { title: "Lean", url: "https://lean-lang.org/", blank: true },
+ { title: "Mathlib Community", url: "https://leanprover-community.github.io/", blank: true },
+ { title: "Playground", url: "https://live.lean-lang.org/?from=lean", blank: true, active: true },
+ { title: "Reservoir", url: "https://reservoir.lean-lang.org/", blank: true },
+ ];
+
+ const rightItems: NavItem[] = [
+ {
+ title: ,
+ alt: "Github",
+ url: "https://github.com/leanprover/lean4",
+ blank: true,
+ }
+ ];
+
+ const leftItems: NavItem[] = [
+ { title: "About", url: "https://mathlib-initiative.org/about" },
+ { title: "Roadmap", url: "https://mathlib-initiative.org/roadmap" },
+ { title: "Team", url: "https://mathlib-initiative.org/team" },
+ { title: "Careers", url: "https://mathlib-initiative.org/careers" },
+ { title: "Support Us", url: "https://mathlib-initiative.org/support" },
+ { title: "Contact", url: "https://mathlib-initiative.org/contact" },
+ ];
+
+ const menuItems = [
+ { title: "Home", url: "https://lean-lang.org/fro" },
+ { title: "About", url: "https://lean-lang.org/fro/about" },
+ { title: "Team", url: "https://lean-lang.org/fro/team" },
+ { title: "Roadmap", url: "https://lean-lang.org/fro/roadmap" },
+ { title: "Contact", url: "https://lean-lang.org/fro/contact" },
+
+ ];
+
+ return (
+
+ );
+};
+
+
+const NavBarComp: React.FC = () => {
+ let navBar = useNavBar()
+
+ return (!navBar.hideNavBar && <>
+ {navBar.requiresNavBar === 1 && }
+ {navBar.requiresNavBar === 2 && }
+ >)
+
+}
+
+export {NavBarLean, NavBarMathLib, NavBarComp};
\ No newline at end of file
diff --git a/client/src/assets/github.svg b/client/src/assets/github.svg
new file mode 100644
index 00000000..f6d5e36d
--- /dev/null
+++ b/client/src/assets/github.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/client/src/assets/mathlib_initiative_logo.svg b/client/src/assets/mathlib_initiative_logo.svg
new file mode 100644
index 00000000..3a3d05e1
--- /dev/null
+++ b/client/src/assets/mathlib_initiative_logo.svg
@@ -0,0 +1,19 @@
+
diff --git a/client/src/assets/moon-outline.svg b/client/src/assets/moon-outline.svg
new file mode 100644
index 00000000..ab165af5
--- /dev/null
+++ b/client/src/assets/moon-outline.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/context/NavBarContext.tsx b/client/src/context/NavBarContext.tsx
new file mode 100644
index 00000000..9db49b58
--- /dev/null
+++ b/client/src/context/NavBarContext.tsx
@@ -0,0 +1,48 @@
+import React, { createContext, useContext, useEffect, useState } from "react";
+
+type NavBarContextType = {
+ requiresNavBar: number;
+ setRequiresNavBar: React.Dispatch>;
+ hideNavBar: boolean;
+ setHideNavBar: React.Dispatch>;
+};
+
+const NavBarContext = createContext(undefined);
+
+export const NavBarProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
+ const [requiresNavBar, setRequiresNavBar] = useState(0);
+
+ const [hideNavBar, setHideNavBar] = useState(() => {
+ const stored = localStorage.getItem("hideNavBar");
+ return stored ? stored === "true" : false;
+ });
+
+ useEffect(() => {
+ const params = new URLSearchParams(window.location.search);
+ const fromParam = params.get("from");
+ if (fromParam === "mathlib") setRequiresNavBar(1);
+ else if (fromParam === "lean") setRequiresNavBar(2);
+ else setRequiresNavBar(0);
+
+ const hideParam = params.get("hide");
+ if (hideParam) setHideNavBar(hideParam === "true");
+ }, []);
+
+ useEffect(() => {
+ localStorage.setItem("hideNavBar", hideNavBar.toString());
+ }, [hideNavBar]);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useNavBar = () => {
+ const ctx = useContext(NavBarContext);
+ if (!ctx) throw new Error("useNavBar must be used inside a NavBarProvider");
+ return ctx;
+};
diff --git a/client/src/css/Nav.css b/client/src/css/Nav.css
new file mode 100644
index 00000000..72bff5ab
--- /dev/null
+++ b/client/src/css/Nav.css
@@ -0,0 +1,348 @@
+.site-header {
+ --font-primary: 'Open Sans', Arial, sans-serif;
+ --z-header: 1000;
+ --color-bg-translucent: rgba(249, 251, 253, 0.81);
+ --transition-base: 0.3s;
+ --nav-padding-y: var(--space-6);
+ --space-6: 1.5rem;
+ --space-8: 2rem;
+ --color-border-nav: #E4EBF3;
+ --color-text: #333;
+ --gap-sm: var(--space-2);
+ --radius-md: 0.5rem;
+ --color-bg: #F9FBFD;
+ --space-1: 0.25rem;
+ --space-2: 0.5rem;
+ --space-3: 0.75rem;
+ --space-4: 1rem;
+ --color-hover: rgba(56, 110, 224, 0.08);
+ --btn-bg: var(--color-primary);
+ --color-border: #D4D4D4;
+ --fs-xl: 2rem;
+
+ font-family: var(--font-primary);
+ position: relative;
+ top: 0;
+ z-index: var(--z-header);
+ background-color: var(--color-bg-translucent);
+ backdrop-filter: blur(10px);
+ transition: background-color var(--transition-base), border-color var(--transition-base);
+}
+
+.site-header.lean {
+ --color-primary: #386EE0;
+ --color-primary-focus: #1D4ED8;
+ --color-primary-light: #4a90e2;
+}
+
+.site-header.mathlib {
+ --color-primary: #22C55E;
+ --color-primary-focus: #16A34A;
+ --color-primary-light: #4ADE80;
+}
+
+@media (prefers-color-scheme: dark) {
+ .site-header {
+ --color-bg-translucent: rgba(24, 24, 24, 0.85);
+ --color-border-nav: #333;
+ --color-text: white;
+ --btn-bg: var(--color-primary);
+ --color-hover: rgba(255, 255, 255, 0.08);
+ }
+}
+
+.navbar {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: var(--nav-padding-y) var(--space-8);
+ border-bottom: 1px solid var(--color-border-nav);
+ box-sizing: border-box;
+}
+
+.navbar-container {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+}
+
+.nav-logo {
+ display: flex;
+ align-items: center;
+ margin-right: var(--space-6);
+ font-size: 25px;
+ color: var(--color-text);
+ font-weight: 300;
+ text-decoration: none;
+}
+
+.nav-logo img,
+.nav-logo svg {
+ vertical-align: middle;
+}
+
+.desktop-menu {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ gap: var(--space-6);
+}
+
+.desktop-menu-part {
+ display: flex;
+ align-items: center;
+ gap: var(--gap-sm);
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.nav-item-lean {
+ display: flex;
+ align-items: center;
+ list-style: none;
+}
+
+
+.mobile-nav .bar-link-lean {
+ width: 100%;
+ display: flex;
+ padding: var(--space-2) var(--space-4);
+ gap: 10px;
+ justify-content: flex-start;
+}
+
+
+.mobile-nav .nav-item-lean {
+ margin: var(--space-1) 0;
+ width: 100%;
+ list-style: none;
+}
+
+.navbar-container {
+ margin: 0px 20px;
+}
+
+.navbar .divider {
+ width: 1px;
+ height: 20px;
+ background: #929292a1;
+ display: block;
+}
+
+.bar-link-lean {
+ gap: 10px;
+ text-decoration: none;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: var(--color-text);
+ font-weight: 500;
+ padding: var(--space-3) var(--space-4);
+ border-radius: var(--radius-md);
+ transition: all var(--transition-base);
+ border: none;
+ background: transparent;
+ position: relative;
+ font-size: 0.9rem;
+ cursor: pointer;
+ transform: translateY(0);
+ white-space: nowrap;
+}
+
+
+.bar-link-lean::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: var(--color-hover);
+ border-radius: var(--radius-md);
+ opacity: 0;
+ transition: opacity var(--transition-base);
+ z-index: -1;
+}
+
+.bar-link-lean:hover {
+ color: var(--color-primary);
+}
+
+.bar-link-lean:hover::before {
+ opacity: 1;
+}
+
+.bar-link-lean svg {
+ width: 20px;
+ height: 20px;
+}
+
+.nav-item-lean.active .bar-link-lean {
+ background-color: rgb(102 142 226 / 12%);
+ color: var(--color-primary);
+}
+
+.nav-toggle {
+ display: none;
+ align-items: center;
+}
+
+.nav-toggle-checkbox {
+ display: none;
+}
+
+.nav-toggle-label {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ padding: var(--space-3);
+ font-size: var(--fs-xl);
+ color: var(--color-text);
+ transition: all var(--transition-base);
+}
+
+.mobile-nav {
+ display: none;
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ background-color: var(--color-bg);
+ backdrop-filter: blur(10px);
+ border-bottom: 1px solid var(--color-border-nav);
+ padding: var(--space-4) var(--space-8);
+ background-color: var(--vscode-menu-background);
+ z-index: 100;
+ list-style: none;
+ margin: 0;
+}
+
+.mobile-nav .nav-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ flex-direction: column;
+ gap: 0px;
+}
+
+.mobile-nav .nav-item-lean {
+ margin: var(--space-1) 0;
+ width: 100%;
+ list-style: none;
+}
+
+.mobile-nav .bar-link-lean {
+ width: 100%;
+ display: flex;
+ padding: var(--space-2) var(--space-4);
+ gap: 10px;
+ justify-content: flex-start;
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0;
+}
+
+.nav-list {
+ display: flex;
+ align-items: center;
+ gap: var(--gap-sm);
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.sub-navbar {
+ display: flex;
+ align-items: center;
+ padding: var(--space-2) var(--space-8);
+ border-bottom: 1px solid var(--color-border-nav);
+ box-sizing: border-box;
+}
+
+.has-submenu {
+ display: block;
+}
+
+nav.sub-navbar .navbar-container {
+ justify-content: start;
+}
+.fro-toggle-checkbox {
+ display: none;
+}
+
+.has-submenu > .bar-link-lean {
+ justify-content: space-between;
+ position: relative;
+ width: -webkit-fill-available;
+}
+
+.has-submenu .submenu {
+ display: none;
+ flex-direction: column;
+ padding-left: var(--space-4);
+}
+
+.fro-toggle-checkbox:checked + .bar-link-lean + .submenu {
+ display: flex;
+}
+
+.has-submenu > .bar-link-lean::after {
+ content: '▸';
+ transition: transform 0.3s;
+ padding: 0px 10px;
+}
+
+.fro-toggle-checkbox:checked + .bar-link-lean::after {
+ transform: rotate(90deg);
+}
+
+@media (max-width: 1024px) {
+ .site-header {
+ background-color: var(--color-bg);
+ }
+
+ .sub-navbar {
+ display: none;
+ }
+
+ .desktop-menu {
+ display: none;
+ }
+
+ .nav-toggle {
+ display: flex;
+ }
+
+ .nav-toggle-checkbox:checked ~ .mobile-nav,
+ .nav-toggle .nav-toggle-checkbox:checked ~ .mobile-nav {
+ display: block;
+ }
+
+ .navbar:has(.nav-toggle-checkbox:checked) .mobile-nav {
+ display: block;
+ }
+}
+
+@media (max-width: 768px) {
+ :root {
+ --nav-padding-y: 0.3rem;
+ }
+
+ .navbar {
+ padding: var(--space-1) var(--space-2);
+ }
+}
diff --git a/client/src/css/index.css b/client/src/css/index.css
index dceb0cc6..0bed44fe 100644
--- a/client/src/css/index.css
+++ b/client/src/css/index.css
@@ -1,3 +1,5 @@
+@import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap');
+
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
@@ -9,6 +11,8 @@ body {
#root {
height: 100vh;
+ display: flex;
+ flex-direction: column;
}
@media (prefers-color-scheme: light) {
diff --git a/client/src/index.tsx b/client/src/index.tsx
index 25e51d79..1b563571 100644
--- a/client/src/index.tsx
+++ b/client/src/index.tsx
@@ -3,10 +3,16 @@ import './css/index.css'
import { StrictMode } from 'react'
import ReactDOM from 'react-dom/client'
+import { NavBarProvider } from './context/NavBarContext.tsx'
+import { NavBarLean, NavBar, NavItem, NavBarMathLib, NavBarComp } from './NavBar'
+
import App from './App.tsx'
ReactDOM.createRoot(document.getElementById('root')!).render(
-
+
+
+
+
,
)
diff --git a/client/src/navigation/Navigation.tsx b/client/src/navigation/Navigation.tsx
index d38b7c94..f6100f0a 100644
--- a/client/src/navigation/Navigation.tsx
+++ b/client/src/navigation/Navigation.tsx
@@ -1,7 +1,7 @@
import '../css/Modal.css'
import '../css/Navigation.css'
-import { faArrowRotateRight, faCode, faInfoCircle } from '@fortawesome/free-solid-svg-icons'
+import { faArrowRotateRight, faCode, faInfoCircle, faEye } from '@fortawesome/free-solid-svg-icons'
import {
faArrowUpRightFromSquare,
faBars,
@@ -34,6 +34,8 @@ import { save } from '../utils/SaveToFile'
import { Dropdown } from './Dropdown'
import { NavButton } from './NavButton'
+import { useNavBar } from '../context/NavBarContext'
+
/** The menu items either appearing inside the dropdown or outside */
function FlexibleMenu({
isInDropdown = false,
@@ -176,6 +178,8 @@ export function Menu({
const hasImpressum = lean4webConfig.impressum || lean4webConfig.contactDetails
+ let navbar = useNavBar()
+
return (
{project && (
@@ -247,6 +251,7 @@ export function Menu({
}}
/>
setToolsOpen(true)} />
+ { navbar.requiresNavBar != 0 && navbar.setHideNavBar(!navbar.hideNavBar)} />}
- {
- setPrivacyOpen(true)
- }}
- />
{hasImpressum && (
+
+
+
setPrivacyOpen(false)} />
{hasImpressum && (
diff --git a/package-lock.json b/package-lock.json
index 3f93b93e..d4131e8e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -118,6 +118,7 @@
"integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
"devOptional": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.2",
@@ -440,6 +441,7 @@
"resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.4.tgz",
"integrity": "sha512-ZQ0V5ovw/miKEXTvjgzRyjnrk9TwriUB1k4R5p7uNnHR9Hus+D1SXHGdJshijEzPFjU25xea/7nhIeSqYFKdbA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@codemirror/state": "^6.5.0",
"style-mod": "^4.1.0",
@@ -653,7 +655,6 @@
"resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-languages-service-override/-/monaco-vscode-languages-service-override-8.0.4.tgz",
"integrity": "sha512-GXd2fKQa96tNv0gFB3nT/yWUc+4pZM/2L8KcfOOuNRWEOjm9TbOWmNZyWGi2Abf4vAdLNKVtJBX1+SoDkwoQdw==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@codingame/monaco-vscode-files-service-override": "8.0.4",
"vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
@@ -673,7 +674,6 @@
"resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-localization-service-override/-/monaco-vscode-localization-service-override-8.0.4.tgz",
"integrity": "sha512-z/MGZXSW69y3pIxbXobRfoGadN82BSSO7tu3jkhJx3c3CpvULaDl5HLUKoXDwtG14/nEA/VCzI/MOHp/bXBKDQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
@@ -683,7 +683,6 @@
"resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-8.0.4.tgz",
"integrity": "sha512-oynV9SnSE1MfqtVjqDWy/xcmekmAVNzyoqTh6oH3B+Oy/nhPqI6X9yIA0I47u0ncs/wjj3dDVnXOEv2IqJXxZg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
@@ -862,6 +861,7 @@
"resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
"integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/runtime": "^7.18.3",
"@emotion/babel-plugin": "^11.13.5",
@@ -905,6 +905,7 @@
"resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz",
"integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/runtime": "^7.18.3",
"@emotion/babel-plugin": "^11.13.5",
@@ -3411,6 +3412,7 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz",
"integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -3881,6 +3883,7 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -4662,6 +4665,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001688",
"electron-to-chromium": "^1.5.73",
@@ -5343,6 +5347,7 @@
"dev": true,
"hasInstallScript": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@cypress/request": "^3.0.10",
"@cypress/xvfb": "^1.2.4",
@@ -5774,6 +5779,7 @@
"integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"ansi-colors": "^4.1.1",
"strip-ansi": "^6.0.1"
@@ -6063,6 +6069,7 @@
"integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -10081,6 +10088,7 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
"integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -10090,6 +10098,7 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
"integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@@ -10299,6 +10308,7 @@
"integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"inherits": "^2.0.4",
"readable-stream": "^2.3.8",
@@ -11468,7 +11478,8 @@
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
+ "license": "0BSD",
+ "peer": true
},
"node_modules/tty-browserify": {
"version": "0.0.1",
@@ -11646,6 +11657,7 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -11862,6 +11874,7 @@
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz",
"integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"esbuild": "^0.27.0",
"fdir": "^6.5.0",