diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8cb8cdf..fc0011c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,8 +6,11 @@ updates: interval: "weekly" day: "friday" - - package-ecosystem: "uv" - directory: "/" + - package-ecosystem: "npm" + directory: "/web" schedule: interval: "weekly" day: "friday" + groups: + dev-dependencies: + dependency-type: "development" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..d08c840 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,60 @@ +name: Deploy + +on: + push: + branches: [master] + pull_request: + branches: [master] + workflow_dispatch: + +# `pages: write` + `id-token: write` are what actions/deploy-pages needs to +# publish; `contents: read` is enough for the checkout. +permissions: + contents: read + pages: write + id-token: write + +# Never let two deploys race. In-progress runs finish so a half-published +# artifact is not left behind. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v7 + with: + node-version: 22 + cache: npm + cache-dependency-path: package-lock.json + + - name: Install dependencies + run: npm ci + + - name: Typecheck + run: npm run typecheck + + - name: Build + run: npm run build + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v5 + with: + path: dist + + deploy: + # Pull requests get the build + typecheck gate but must not publish. + if: github.event_name != 'pull_request' + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml deleted file mode 100644 index 0fbfe5b..0000000 --- a/.github/workflows/docs_build.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Documentation -permissions: - pages: write - id-token: write - -on: - pull_request: - branches: [ master ] - workflow_call: - inputs: &build-docs-inputs - deploy: - type: boolean - required: false - default: false - - workflow_dispatch: - inputs: *build-docs-inputs - -concurrency: - group: docs-build - -jobs: - - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v7 - - - name: Setup uv - uses: astral-sh/setup-uv@v7 - - - name: Build Documentation - run: uv run --with=zensical zensical build --clean --strict - - - name: Set Artifact Name - id: artifact-name - run: | - echo "artifact_name=${{ github.run_id }}[${{ github.run_attempt }}]--docs-artifacts" \ - | tee -a $GITHUB_OUTPUT - - - name: Upload Pages Artifacts - uses: actions/upload-pages-artifact@v5 - with: - name: ${{ steps.artifact-name.outputs.artifact_name }} - path: site/ - - - name: Deploy to GitHub Pages - if: ${{ inputs.deploy }} - uses: actions/deploy-pages@v5 - with: - artifact_name: ${{ steps.artifact-name.outputs.artifact_name }} diff --git a/.gitignore b/.gitignore index f8a207a..47fb24d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ +node_modules +dist .venv -site + +# editors / os +.DS_Store +*.log diff --git a/404.html b/404.html new file mode 100644 index 0000000..a6032e8 --- /dev/null +++ b/404.html @@ -0,0 +1,63 @@ + + + + + + + + + + +
+ +
+
+ + + +
+
+ +

+ This cell died out +

+ +

+ The page you asked for is not here. It may have been moved, renamed, or it never + existed. The repository it belonged to might live under a different name now. +

+ + +
+
+
+ + + + + diff --git a/README.md b/README.md index 626b0fd..f93ec6e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,94 @@ -# Website -Community website. +# eggzec.github.io + +The eggzec organization website. Science + Computing. + +Live at **https://eggzec.github.io/**. + +A hand built static site: Vite and TypeScript, with no UI framework. +Animation uses [Motion](https://motion.dev) plus +[Lenis](https://lenis.darkroom.engineering) for smooth scrolling, and a canvas +Game of Life for the hero texture. + +## Layout + +``` +index.html landing page +404.html custom not found page +projects/ full project catalog, filterable by category +community/ maintainers, plus one page each +partials/head.html shared , injected at build time +public/brand/ logo, project icons +src/ + main.ts single entry, mounts whatever a page contains + data/site.ts projects and people. Edit content here + components/ nav, footer, cards, life field, reveals, marquee + lib/eggzec-block.ts the eggzec Block bitmap display font, as TypeScript + styles/ tokens, base, layout, components, pages +``` + +## Develop + +```bash +npm install +npm run dev # http://localhost:5173 +``` + +```bash +npm run build # typecheck, then emit dist/ +npm run preview # serve the built output +npm run typecheck +``` + +## Editing content + +Almost everything is data rather than markup, and it all lives in +`src/data/site.ts`. + +| What | Where | +| --- | --- | +| Projects, taglines, repository and docs and PyPI links | `PROJECTS` | +| Human facing name when the repo name is not one | `display` on a project | +| Which projects lead the page | any project with an `icon` | +| Maintainers | `PEOPLE` | +| Nav links | `NAV` | +| Footer links | `COLUMNS` in `src/components/footer.ts` | + +A project is featured on the landing page and in the nav menu when it has an +`icon`. That keeps the featured set in sync with the brand icon files under +`public/brand/icons/` automatically, with no second list to maintain. + +Landing page statistics are counted from the catalog at runtime, so the numbers +cannot drift from what is actually listed. + +## Design + +Colours are the Electropop palette on white: + +| Role | Colour | +| --- | --- | +| Block fills, buttons, knockouts | Kiwi `#CCFF00` | +| Accent text and links | Violet `#5200FF` | +| Sparks and newly born cells | Magenta `#F900FF` | +| Third accent | Orange `#FF6B00` | + +Kiwi is brilliant as a field with black on top of it and illegible as type on +white, so `--accent-fill` and `--accent-text` are separate roles. Violet carries +everything that has to be read. + +Display lettering is the eggzec Block bitmap font, rendered as inline SVG at any +size, so there is no font file and no layout shift. Because the font is +monospaced, the hero solves for letter tracking per line, which makes every line +land at the same width and the same cap height. + +The hero, footer and 404 page run Conway's Game of Life on a coarse grid. That +is the same glider hidden in the logo mark. Everything animated respects +`prefers-reduced-motion`. + +## Deploy + +`.github/workflows/deploy.yml` builds the site and publishes to GitHub Pages on +every push to `master`. Pull requests run the typecheck and the build but do not +publish. + +Pages must be set to **Settings, then Pages, then Build and deployment, Source: +GitHub Actions** in the repository settings. diff --git a/community/index.html b/community/index.html new file mode 100644 index 0000000..dac22cf --- /dev/null +++ b/community/index.html @@ -0,0 +1,66 @@ + + + + + + + + + +
+ +
+ + +
+
+
+
+
+ +
+
+
+ +
+

Want to join?

+

+ Start by picking up an issue, then open a draft pull request against the + repository default branch and we will review it. +

+ +
+
+
+
+
+ + + + + diff --git a/community/laraib/index.html b/community/laraib/index.html new file mode 100644 index 0000000..86960e8 --- /dev/null +++ b/community/laraib/index.html @@ -0,0 +1,34 @@ + + + + + + + + + +
+ +
+ + +
+ +
+
+ + + + + diff --git a/community/noor/index.html b/community/noor/index.html new file mode 100644 index 0000000..ede10dd --- /dev/null +++ b/community/noor/index.html @@ -0,0 +1,34 @@ + + + + + + + + + +
+ +
+ + +
+ +
+
+ + + + + diff --git a/community/saud/index.html b/community/saud/index.html new file mode 100644 index 0000000..c94513e --- /dev/null +++ b/community/saud/index.html @@ -0,0 +1,34 @@ + + + + + + + + + +
+ +
+ + +
+ +
+
+ + + + + diff --git a/docs/assets/images/SOERP.svg b/docs/assets/images/SOERP.svg deleted file mode 100644 index 833da4e..0000000 --- a/docs/assets/images/SOERP.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/docs/assets/images/ad.ico b/docs/assets/images/ad.ico deleted file mode 100644 index 2fca2a7..0000000 Binary files a/docs/assets/images/ad.ico and /dev/null differ diff --git a/docs/assets/images/claude.ico b/docs/assets/images/claude.ico deleted file mode 100644 index 5105c0c..0000000 Binary files a/docs/assets/images/claude.ico and /dev/null differ diff --git a/docs/assets/images/deltaFlow.png b/docs/assets/images/deltaFlow.png deleted file mode 100644 index 75c76d9..0000000 Binary files a/docs/assets/images/deltaFlow.png and /dev/null differ diff --git a/docs/assets/images/logo.png b/docs/assets/images/logo.png deleted file mode 100644 index 45569f0..0000000 Binary files a/docs/assets/images/logo.png and /dev/null differ diff --git a/docs/assets/images/mcerp.ico b/docs/assets/images/mcerp.ico deleted file mode 100644 index 4277c87..0000000 Binary files a/docs/assets/images/mcerp.ico and /dev/null differ diff --git a/docs/assets/images/nulapack.png b/docs/assets/images/nulapack.png deleted file mode 100644 index 67fd42c..0000000 Binary files a/docs/assets/images/nulapack.png and /dev/null differ diff --git a/docs/assets/images/pydoe.svg b/docs/assets/images/pydoe.svg deleted file mode 100644 index aecfd08..0000000 --- a/docs/assets/images/pydoe.svg +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/assets/images/pyswarm.ico b/docs/assets/images/pyswarm.ico deleted file mode 100644 index f7c2cf9..0000000 Binary files a/docs/assets/images/pyswarm.ico and /dev/null differ diff --git a/docs/assets/images/qtop.ico b/docs/assets/images/qtop.ico deleted file mode 100644 index 15115cc..0000000 Binary files a/docs/assets/images/qtop.ico and /dev/null differ diff --git a/docs/assets/javascripts/mathjax.js b/docs/assets/javascripts/mathjax.js deleted file mode 100644 index 06dbf38..0000000 --- a/docs/assets/javascripts/mathjax.js +++ /dev/null @@ -1,16 +0,0 @@ -window.MathJax = { - tex: { - inlineMath: [["\\(", "\\)"]], - displayMath: [["\\[", "\\]"]], - processEscapes: true, - processEnvironments: true - }, - options: { - ignoreHtmlClass: ".*|", - processHtmlClass: "arithmatex" - } -}; - -document$.subscribe(() => { - MathJax.typesetPromise() -}) diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css deleted file mode 100644 index 39bc911..0000000 --- a/docs/assets/stylesheets/extra.css +++ /dev/null @@ -1,15 +0,0 @@ -.md-typeset a, -.md-nav__link, -.md-tabs__link, -.md-header__topic, -.md-ellipsis { - color: inherit !important; - text-decoration: none !important; -} - -.md-typeset a:hover, -.md-nav__link:hover, -.md-tabs__link:hover { - color: inherit !important; - text-decoration: none !important; -} diff --git a/docs/community/index.md b/docs/community/index.md deleted file mode 100644 index 5b79f08..0000000 --- a/docs/community/index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -icon: fontawesome/solid/users ---- - -# Community - -
- -- M. Saud Zahir - - --- - - Co-founder and maintainer. Software developer focused on Python, C++, - and Java for high-performance scientific computing. - -- M. Laraib Ali - - --- - - Co-founder and maintainer. Backend and systems engineer specializing in - Python and Go, Linux automation, PostgreSQL, observability, and containers. - -- Noor Mustafa - - --- - - Maintainer. Java-focused backend developer working with Spring, Nginx, - IntelliJ IDEA, Kotlin, and Python. - -
- ---- - -Want to join? Start with [:fontawesome-brands-github: github.com/eggzec](https://github.com/eggzec) diff --git a/docs/community/laraib.md b/docs/community/laraib.md deleted file mode 100644 index 0e72562..0000000 --- a/docs/community/laraib.md +++ /dev/null @@ -1,22 +0,0 @@ -# M. Laraib Ali - -![M Laraib Ali](https://github.com/laraibg786.png){ width="120" style="border-radius:12px;" } - -[:fontawesome-brands-github: GitHub](https://github.com/laraibg786) -  [:fontawesome-brands-gitlab: GitLab](https://gitlab.com/laraibg786) -  [:fontawesome-brands-python: PyPI](https://pypi.org/user/Laraibg786/) -  [:fontawesome-brands-linkedin: LinkedIn](https://www.linkedin.com/in/m-laraib-ali/) -  [:fontawesome-solid-envelope: Email](mailto:laraibg786@outlook.com) - -Backend and systems engineer specializing in Python and Go, building reliable, scalable services and automation on Linux and containerized environments. Experienced in distributed systems, PostgreSQL design, and observability with logging, tracing, and metrics to support production reliability and data-driven operations. - -
- Python - Go - Qt - PostgreSQL - MongoDB - Redis - Linux - Docker -
diff --git a/docs/community/noor.md b/docs/community/noor.md deleted file mode 100644 index e03c4f8..0000000 --- a/docs/community/noor.md +++ /dev/null @@ -1,17 +0,0 @@ -# Noor Mustafa - -![Noor Mustafa](https://github.com/Noor-Mustafa123.png){ width="120" style="border-radius:12px;" } - -[:fontawesome-brands-github: GitHub](https://github.com/Noor-Mustafa123) -  [:fontawesome-brands-linkedin: LinkedIn](https://www.linkedin.com/in/noormustafa715/) - -Passionate Java developer focused on building reliable backend applications with Spring Boot. I enjoy solving complex problems, learning continuously, and collaborating in team environments to deliver clean, maintainable software. - -
- Java - Spring - Nginx - IntelliJ IDEA - Kotlin - Python -
diff --git a/docs/community/saud.md b/docs/community/saud.md deleted file mode 100644 index c9089eb..0000000 --- a/docs/community/saud.md +++ /dev/null @@ -1,19 +0,0 @@ -# M. Saud Zahir - -![Saud Zahir](https://github.com/saudzahirr.png){ width="120" style="border-radius:12px;" } - -[:fontawesome-brands-github: GitHub](https://github.com/saudzahirr) -  [:fontawesome-brands-gitlab: GitLab](https://gitlab.com/saudzahirr) -  [:fontawesome-brands-python: PyPI](https://pypi.org/user/saudzahirr/) -  [:fontawesome-brands-linkedin: LinkedIn](https://www.linkedin.com/in/saudzahirr/) -  [:fontawesome-solid-envelope: Email](mailto:m.saud.zahir@gmail.com) - -I am a software engineer, passionate for developing high-quality software. I have experience interfacing Python with C, C++, and Fortran, as well as programming directly in these languages. I work across the full software lifecycle, from problem formulation and system design to implementation, optimization, and deployment, with a focus on clean, maintainable, and reliable solutions for data-intensive environments. - -
- Python - C++ - Java - Fortran - Qt -
diff --git a/docs/contact.md b/docs/contact.md deleted file mode 100644 index ce30b6a..0000000 --- a/docs/contact.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -icon: fontawesome/solid/envelope ---- - -# Contact - -For project questions, collaboration, or contribution discussions, use one of the channels below. - -## Primary Channels - -- GitHub Organization: [:fontawesome-brands-github: github.com/eggzec](https://github.com/eggzec) -- Community: [Meet the maintainers](community/index.md) - -## Direct Contacts - -* [:fontawesome-solid-envelope:](mailto:m.saud.zahir@gmail.com) M. Saud Zahir -* [:fontawesome-solid-envelope:](mailto:laraibg786@outlook.com) M. Laraib Ali - -If your inquiry is about a specific repository, please include the repo name and a short description so we can respond faster. diff --git a/docs/contributing.md b/docs/contributing.md deleted file mode 100644 index 2986595..0000000 --- a/docs/contributing.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -icon: fontawesome/solid/code-pull-request ---- - -# Contributing - -Thank you for your interest in contributing. -This guide explains how to report issues, propose changes, and keep contributions consistent across code, documentation, and testing. - -## How to Contribute - -You can contribute in several ways: - -- Report bugs or suggest improvements through GitHub Issues. -- Answer questions and help other users. -- Submit pull requests. -- Improve or expand documentation. -- Add or improve tests. -- Review open pull requests. - -> Before starting significant work (other than small typo or minor bug fixes), please open an issue first to discuss your proposal. - -## Reporting Issues - -When filing an issue: - -- Search existing issues to avoid duplicates. -- Use a clear, descriptive title and include a category where possible (for example: `bug - ...`, `feature-req - ...`). -- For bugs, provide steps to reproduce the issue. -- Describe expected behavior and actual behavior. -- Include environment details when relevant (OS, Python version, dependency versions). -- If possible, share a minimal reproducible example. - -## Submitting Pull Requests - -### Prerequisites - -You will need: - -- `git` -- [`uv`](https://docs.astral.sh/uv/getting-started/installation) -- Any code editor or IDE (for example VS Code, PyCharm, or similar) - -### Installation and Setup - -Fork the repository on GitHub and clone it locally. - -```bash -git clone https://github.com//.git --depth 1 -cd -uv sync -``` - -Create a new branch for your changes. - -```bash -git checkout -b -``` - -### Run Linting and Tests - -Add or update tests when your change affects behavior. -Run linting and tests before opening your PR. - -```bash -# linting and formatting (if applicable) -uvx ruff format . -uvx ruff check --fix . - -# tests (if available) -uv run pytest -n auto tests -``` - -### Build Documentation - -If you changed documentation, build and preview docs locally and check for warnings. - -```bash -uv run --with=zensical zensical build --clean --strict -``` - -### Open a Pull Request - -After finalizing your changes: - -1. Commit with a descriptive message. -2. Push your branch to your fork. -3. Open a **draft pull request** against the parent repository's default branch. -4. Include a clear summary and reference related issues. - -Mark the PR as ready for review when checks pass and the change is ready. - -## Good First Contributions - -- Improve documentation clarity and examples. -- Fix broken links, formatting, and small consistency issues. -- Add tests for uncovered behavior. -- Pick up `good first issue` or documentation-tagged issues. - -Thank you for helping improve eggzec. diff --git a/docs/how-we-build.md b/docs/how-we-build.md deleted file mode 100644 index 614d100..0000000 --- a/docs/how-we-build.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -icon: fontawesome/solid/layer-group ---- - -# How We Build - -Here are the tools we actively use to build, test, ship, and maintain software. - -## Languages - -
-
- Python - Go - Java - Rust -
-
- C++ - Fortran -
-
- -## Frameworks - -
- Spring - Boost C++ - Flask - FastAPI - Pydantic - SQLAlchemy -
- -## Data Science and ML - -
- NumPy - SciPy - PyTorch - TensorFlow - pandas -
- -## Databases - -
- SQLite - PostgreSQL - MongoDB -
- -## GUI - -
- Qt - PySide -
- -## Build Systems - -
- CMake - Meson - setuptools -
- -## Package Managers - -
- uv - micromamba - vcpkg - Conan -
- -## Containers and Platforms - -
- Docker - Linux -
- -## IDEs - -
- IntelliJ IDEA - PyCharm - CLion - DataGrip - Visual Studio Code - Visual Studio -
- -## Code Quality - -
- Ruff - SonarQube -
- -## Code Testing - -
- pytest - Catch2 -
- -## Documentation - -
- Zensical - Doxygen -
- -## AI - -
- Claude Code - Claude Code - OpenAI - Codex -
diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 660e720..0000000 --- a/docs/index.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -icon: fontawesome/solid/house ---- - -# eggzec - -**Science + Computing** - ---- - -A community focused on open source high-performance scientific computing and modern software development. - -
- -- pyswarm - - --- - - Particle Swarm Optimization for Python. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/pyswarm/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/pyswarm) - -- pydoe - - --- - - Design of Experiments for Python. - - [:fontawesome-solid-book: Documentation](https://pydoe.github.io/pydoe/) -   [:fontawesome-brands-github: GitHub](https://github.com/pydoe/pydoe) - -- mcerp - - --- - - Monte Carlo error propagation for uncertainty analysis in Python. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/mcerp/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/mcerp) - -- soerp - - --- - - Second-order error propagation for uncertainty analysis in Python. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/soerp/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/soerp) - -- ad - - --- - - First- and second-order automatic differentiation for Python. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/ad/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/ad) - -- qtop - - --- - - HPC queue and cluster monitor. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/qtop/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/qtop) - -
- ---- diff --git a/docs/projects/index.md b/docs/projects/index.md deleted file mode 100644 index 62280aa..0000000 --- a/docs/projects/index.md +++ /dev/null @@ -1,182 +0,0 @@ ---- -icon: fontawesome/solid/diagram-project ---- - -# Projects - -
- -- :fontawesome-brands-github: **bb** - - --- - - A Bitbucket CLI and SDK client. - - [:fontawesome-brands-github: GitHub](https://github.com/eggzec/bb) - -- :fontawesome-brands-github: **vatic** - - --- - - Open-source risk analysis with predictive modeling and Monte Carlo - simulation for uncertainty workflows. - - [:fontawesome-brands-github: GitHub](https://github.com/eggzec/vatic) - -- qtop - - --- - - Text-mode HPC queue monitor for PBS, SGE, and OAR clusters. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/qtop/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/qtop) - -- pyswarm - - --- - - Particle Swarm Optimization (PSO) for Python with a lightweight API for - constrained, gradient-free optimization. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/pyswarm/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/pyswarm) - -- pydoe - - --- - - Design of Experiments package for Python with factorial, - response-surface, space-filling, and optimal design methods. - - [:fontawesome-solid-book: Documentation](https://pydoe.github.io/pydoe/) -   [:fontawesome-brands-github: GitHub](https://github.com/pydoe/pydoe) - -- mcerp - - --- - - Real-time Monte Carlo error propagation for Python using - latin-hypercube sampling. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/mcerp/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/mcerp) - -- soerp - - --- - - Second-order error propagation for Python to track uncertainty through - mathematical models using distribution moments. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/soerp/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/soerp) - -- ad - - --- - - First- and second-order automatic differentiation for Python with - transparent numerical operations. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/ad/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/ad) - -- :fontawesome-brands-github: **sdepack** - - --- - - Stochastic Runge-Kutta solvers for scalar Ito SDEs, from Euler-Maruyama - to higher-order schemes. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/sdepack/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/sdepack) - -- :fontawesome-brands-github: **smolpack** - - --- - - Multidimensional cubature over `[0,1]^d` using Smolyak sparse-grid - construction with Clenshaw-Curtis rules. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/smolpack/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/smolpack) - -- NULAPACK - - --- - - Numerical linear algebra package with Fortran core subroutines and - Python/C++ interfaces. - - [:fontawesome-solid-book: Documentation](https://nulapack.github.io/NULAPACK/) -   [:fontawesome-brands-github: GitHub](https://github.com/NULAPACK/NULAPACK) - -- :fontawesome-brands-github: **polpack** - - --- - - High-performance special functions and polynomial families with a - Fortran numerical core. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/polpack/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/polpack) - -- :fontawesome-brands-github: **kronrod** - - --- - - Gauss-Kronrod quadrature rule generator for reusable high-accuracy - numerical integration. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/kronrod/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/kronrod) - -- :fontawesome-brands-github: **spinterp** - - --- - - Sparse Grid Interpolation Toolbox for Python - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/spinterp/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/spinterp) - -- :fontawesome-brands-github: **sparse_grid** - - --- - - Pure-Python sparse grid implementation with hierarchical index generation - and fast hat-basis evaluation. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/sparse_grid/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/sparse_grid) - -- :fontawesome-brands-github: **cordic** - - --- - - CORDIC-based trigonometric, hyperbolic, exponential, logarithmic, and - root-function evaluation library for Python. - - [:fontawesome-solid-book: Documentation](https://eggzec.github.io/cordic/) -   [:fontawesome-brands-github: GitHub](https://github.com/eggzec/cordic) - -- JavaDOE - - --- - - Java Design of Experiments library including Box-Behnken, central - composite, and factorial designs. - - [:fontawesome-brands-github: GitHub](https://github.com/Java-DOE/JavaDOE) - -- :fontawesome-brands-github: **qweb** - - --- - - Web interface for Sun Grid Engine with job submission, monitoring, and - cluster management endpoints. - - [:fontawesome-brands-github: GitHub](https://github.com/eggzec/qweb) - -
diff --git a/index.html b/index.html new file mode 100644 index 0000000..4ebf631 --- /dev/null +++ b/index.html @@ -0,0 +1,256 @@ + + + + + + + + + +
+ +
+ +
+ + + +
+

+ + Science + Computing +

+ +
+ +

+ We build the numerical layer: + Fortran and C++ cores wrapped for Python, with uncertainty + propagation, design of experiments, and optimization on top. Everything is + published to PyPI, documented, and tested on every push. +

+ + + +
+

Shipping

+
+ pyswarm + pydoe + mcerp + soerp + ad + nlpql + smolpack + sdepack + ogrep + polpack + kronrod + vatic +
+
+
+
+ +
+ + +
+
+
+
+ + Projects +
+
+ + Packages on PyPI +
+
+ + Documentation sites +
+
+ + Maintainers +
+
+
+
+ + +
+
+
+

Projects

+

Tools we needed, so we wrote them

+

+ Every project below is a repository you can clone today. Most ship a package, a + documentation site, and a CI pipeline that runs the tests on every push. +

+
+ +
+ + +
+
+ + +
+
+
+

How we work

+

Fast where it matters, readable everywhere else

+
+ +
+
+

01

+

Native cores, Python surface

+

+ Quadrature, linear algebra, and special functions stay in Fortran and C++. The API + you import is Python, built with f2py, SIP, and Meson. +

+
+ +
+

02

+

Uncertainty is first class

+

+ Propagate error by moments, by Monte Carlo, or by derivative. mcerp, soerp, and ad + cover all three against the same modelling code. +

+
+ +
+

03

+

Published, not parked

+

+ Packages go to PyPI with a versioned docs site, Ruff and pytest in CI, and coverage + reported on the pull request that changed it. +

+
+
+
+
+ + +
+
+
+

Toolchain

+

What we build with

+

+ uv for environments, Meson and CMake for native builds, Ruff and pytest for the gate, + Zensical and Doxygen for the docs. +

+
+
+ +
+ PyPython + FFortran + C++C++ + GoGo + JJava + NpNumPy + SpSciPy + uvuv + RfRuff + MMeson + ptpytest + QtQt + DkDocker + ZnZensical +
+
+ +
+ + +
+
+
+

Community

+

Small group, long horizon

+

+ eggzec is maintained by three engineers working across Python, C++, Fortran, Java, and + Go. Issues and pull requests are welcome on every repository. +

+
+ + +
+
+ + +
+
+
+ +
+

Start with a repository

+

+ Pick a project, read the docs, open an issue. Good first contributions are tagged on + every repo that has them. +

+ +
+
+
+
+
+ +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1b19e7e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1186 @@ +{ + "name": "eggzec-web", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "eggzec-web", + "version": "1.0.0", + "dependencies": { + "lenis": "^1.1.18", + "motion": "^11.18.1" + }, + "devDependencies": { + "@types/node": "^26.2.0", + "typescript": "^5.7.3", + "vite": "^6.0.11" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "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 + }, + "node_modules/@types/node": { + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", + "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", + "dev": true, + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "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, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/framer-motion": { + "version": "11.18.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", + "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "dependencies": { + "motion-dom": "^11.18.1", + "motion-utils": "^11.18.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "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, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/lenis": { + "version": "1.3.26", + "resolved": "https://registry.npmjs.org/lenis/-/lenis-1.3.26.tgz", + "integrity": "sha512-s/xTCZCxTFvHbAN1OzuhNaN5YPJH2ail0XAkctKW1b+RUAG4nUL5UHLXwNko1h8aEeT2jspBXegMgPJd8zcuag==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/darkroomengineering" + }, + "peerDependencies": { + "@nuxt/kit": ">=3.0.0", + "react": ">=17.0.0", + "vue": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "react": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/motion": { + "version": "11.18.2", + "resolved": "https://registry.npmjs.org/motion/-/motion-11.18.2.tgz", + "integrity": "sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg==", + "dependencies": { + "framer-motion": "^11.18.2", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", + "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", + "dependencies": { + "motion-utils": "^11.18.1" + } + }, + "node_modules/motion-utils": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", + "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "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==" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "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" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..80356ae --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "eggzec-web", + "private": true, + "version": "1.0.0", + "type": "module", + "description": "eggzec — Science + Computing. Organization website.", + "scripts": { + "dev": "vite", + "build": "tsc --noEmit && vite build", + "preview": "vite preview", + "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "@types/node": "^26.2.0", + "typescript": "^5.7.3", + "vite": "^6.0.11" + }, + "dependencies": { + "lenis": "^1.1.18", + "motion": "^11.18.1" + } +} diff --git a/partials/head.html b/partials/head.html new file mode 100644 index 0000000..ac4e23a --- /dev/null +++ b/partials/head.html @@ -0,0 +1,23 @@ + + + {{title}} + + + + + + + + + + + + + + + + + diff --git a/projects/index.html b/projects/index.html new file mode 100644 index 0000000..8763481 --- /dev/null +++ b/projects/index.html @@ -0,0 +1,67 @@ + + + + + + + + + +
+ +
+ + +
+
+
+
+
+ +
+
+
+ +
+

+ They are all built the same way. +

+

+ A numerical core in Fortran or C++, a small Python API on top, and a test suite + that runs on every push. Pick one, read its README, and open an issue on + github.com/eggzec + if anything is unclear. +

+
+
+
+
+
+ +
+ + + diff --git a/public/brand/eggzec-banner.png b/public/brand/eggzec-banner.png new file mode 100644 index 0000000..2445056 Binary files /dev/null and b/public/brand/eggzec-banner.png differ diff --git a/public/brand/eggzec-mark.png b/public/brand/eggzec-mark.png new file mode 100644 index 0000000..a5dc2e6 Binary files /dev/null and b/public/brand/eggzec-mark.png differ diff --git a/public/brand/eggzec-mark.svg b/public/brand/eggzec-mark.svg new file mode 100644 index 0000000..05a2659 --- /dev/null +++ b/public/brand/eggzec-mark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/brand/icons/ad.svg b/public/brand/icons/ad.svg new file mode 100644 index 0000000..92ff574 --- /dev/null +++ b/public/brand/icons/ad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/brand/icons/bb.svg b/public/brand/icons/bb.svg new file mode 100644 index 0000000..a6a9a6c --- /dev/null +++ b/public/brand/icons/bb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/brand/icons/mcerp.svg b/public/brand/icons/mcerp.svg new file mode 100644 index 0000000..3f19811 --- /dev/null +++ b/public/brand/icons/mcerp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/brand/icons/nlpql.svg b/public/brand/icons/nlpql.svg new file mode 100644 index 0000000..d1131cd --- /dev/null +++ b/public/brand/icons/nlpql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/brand/icons/ogrep.svg b/public/brand/icons/ogrep.svg new file mode 100644 index 0000000..2468187 --- /dev/null +++ b/public/brand/icons/ogrep.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/brand/icons/pydoe.svg b/public/brand/icons/pydoe.svg new file mode 100644 index 0000000..065eb3f --- /dev/null +++ b/public/brand/icons/pydoe.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/brand/icons/pyswarm.svg b/public/brand/icons/pyswarm.svg new file mode 100644 index 0000000..3c6c526 --- /dev/null +++ b/public/brand/icons/pyswarm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/brand/icons/sdepack.svg b/public/brand/icons/sdepack.svg new file mode 100644 index 0000000..0731df2 --- /dev/null +++ b/public/brand/icons/sdepack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/brand/icons/soerp.svg b/public/brand/icons/soerp.svg new file mode 100644 index 0000000..7ae0a65 --- /dev/null +++ b/public/brand/icons/soerp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/content.ts b/src/components/content.ts new file mode 100644 index 0000000..130ff06 --- /dev/null +++ b/src/components/content.ts @@ -0,0 +1,84 @@ +/** + * Data-driven page bodies: the maintainer grid and the individual maintainer + * profiles, both read from `src/data/site.ts` so a person is described once. + */ + +import { PEOPLE, PROJECTS, type Person } from '../data/site' + +function linkList(person: Person): string { + return person.links + .map((link) => { + const external = !link.href.startsWith('mailto:') + return `${link.label}` + }) + .join('') +} + +/** `
` on /community/. */ +export function mountPeople(root: ParentNode = document): void { + const host = root.querySelector('[data-people]') + if (!host) return + + host.classList.add('people') + host.innerHTML = PEOPLE.map( + (person) => ` +
+ + +
+

${person.name}

+

${person.role}

+
+

${person.bio}

+
+ ${person.stack.map((s) => `${s}`).join('')} +
+
`, + ).join('') +} + +/** `
` on each maintainer page. */ +export function mountProfile(root: ParentNode = document): void { + const host = root.querySelector('[data-profile]') + if (!host) return + + const person = PEOPLE.find((p) => p.slug === host.dataset.profile) + if (!person) return + + document.title = `${person.name} · eggzec` + + host.classList.add('profile') + host.innerHTML = ` + ${person.name} +
+

${person.role}

+

${person.name}

+

${person.bio}

+ +
+ ${person.stack.map((s) => `${s}`).join('')} +
+
` +} + +/** + * Fills `[data-stat]` elements from the catalog rather than from hard-coded + * markup, so the landing-page numbers cannot drift from what is actually + * listed on the site. + */ +export function syncStats(root: ParentNode = document): void { + const totals: Record = { + projects: PROJECTS.length, + packages: PROJECTS.filter((p) => p.pypi).length, + docs: PROJECTS.filter((p) => p.docs).length, + maintainers: PEOPLE.length, + } + + for (const node of root.querySelectorAll('[data-stat]')) { + const key = node.dataset.stat ?? '' + const value = totals[key] + if (value === undefined) continue + node.dataset.countTo = String(value) + node.textContent = `${value}${node.dataset.countSuffix ?? ''}` + } +} diff --git a/src/components/footer.ts b/src/components/footer.ts new file mode 100644 index 0000000..273547a --- /dev/null +++ b/src/components/footer.ts @@ -0,0 +1,85 @@ +/** Site footer, rendered into the `