commit 8a6a1fcf07bd8122e8ec491eeb10af40eec57caa Author: Stefan Koelle Date: Sat Aug 15 18:51:43 2026 +0200 initial commit diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..583e98c --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +# Copy to .env.local for local development (never commit real secrets) +CLOUDFLARE_API_TOKEN= +CLOUDFLARE_ZONE_ID= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d23fd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +node_modules/ +dist/ +.astro/ +.DS_Store +.venv/ +/.tmp +.env +.env.local +.env.production diff --git a/.moonweb.yml b/.moonweb.yml new file mode 100644 index 0000000..2704a2b --- /dev/null +++ b/.moonweb.yml @@ -0,0 +1,6 @@ +title: "28k8 tHE tEMPLE BBS" +emoji: "💾" +category: code +subcategory: "Web Projects" +status: active +stack: [Astro, React, TypeScript, Cloudflare Pages] diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..765a268 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,189 @@ +# AGENTS.md - Projekt-Kontext für KI-Agenten + +## Was ist das Projekt? + +**28k8.moonweb.org** — Eine Retro-BBS-Homepage im Stil eines 90er-DOS-Terminals für "tHE tEMPLE bBS" (Augsburg, FidoNet 2:2480/330, Sysop: Stefan Koelle). Kein Backend, kein PHP, keine Datenbank, kein Tracking. + +## Tech-Stack + +| Bereich | Technologie | +|---|---| +| Framework | **Astro 4.15+** mit React-Islands | +| Rendering | Vollständig statisch (SSG), jede Route wird zur Build-Zeit vorgerendert | +| Hosting | **Cloudflare Pages** | +| DNS | Cloudflare | +| Content | Astro Content Collections + Zod-Schema-Validierung | +| Styling | CSS Custom Properties, DOS 16-Farben-Palette, kein CSS-Framework | +| TypeScript | Strict Mode, React-JSX | + +## Dokumentenlage + +| Datei | Inhalt | +|---|---| +| `PRD.md` | Anforderungsdokument für 28k8 | +| `PLAN.md` | Implementierungsplan (Astro) | +| `SPEC.md` | Technische Spezifikation (Astro) | +| `README.md` | Projekt-README | + +## Projektstruktur + +``` +28k8-moonweb-org/ +├── src/ +│ ├── pages/ # Astro-Routing (eine Datei = eine URL) +│ │ ├── index.astro # / → Modem-Intro (nur beim ersten Besuch) +│ │ └── bbs/ +│ │ ├── index.astro # /bbs/ → Hauptmenü (2×2-Kachel-Raster) +│ │ ├── legal-notice.astro +│ │ ├── pc/ # PHOB!A, Tr@nceMISSION, SkyLINE, Kosmos Design +│ │ ├── atari/ # Tropic DREAMs +│ │ ├── amiga/ # ESPRIT, MOD Files +│ │ └── fido/ # ANSI Art, Nodelist +│ ├── components/ +│ │ ├── TerminalLayout.astro # Basis-HTML-Layout (head, meta, CSS-Import) +│ │ ├── TerminalShell.tsx # React-Island: Keyboard-Shortcuts +│ │ ├── ModemIntro.tsx # React-Island: Wahl-Simulation + Sound +│ │ ├── ModPlayer.tsx # React-Island: MOD Playlist + WASM Player +│ │ ├── AnsiArt.astro # Rendered vorberechnete ANSI-Art als HTML +│ │ ├── Tile.astro # Menü-Kachel-Component +│ │ ├── NavBar.astro # Navigation [B] [Q] [I] +│ │ ├── StatusBar.astro # "28800 bps | Line: V34 | 28k8.moonweb.org" +│ │ └── LetterFooter.astro # Dekorativer "tHE tEMPLE bBS"-Buchstaben-Footer +│ ├── data/ +│ │ └── mods.json # MOD-Metadaten (pre-build generiert, committed) +│ ├── content/ # Markdown+Frontmatter für Releases +│ │ ├── config.ts # Zod-Schemas für Content Collections +│ │ ├── skyline/ # SkyLINE Productions Releases +│ │ ├── kosmos-design/ # Kosmos Design Releases +│ │ ├── tropicdreams/ # Tropic DREAMs Releases (Atari ST) +│ │ └── esprit/ # ESPRIT Releases (Amiga) +│ ├── lib/ +│ │ ├── ansiArt.ts # BANNER_*, ANSI_GALLERY, BOX_* Exporte (HTML-Strings) +│ │ ├── keymap.ts # Tastatur-Zuordnungen (GLOBAL_NAV_KEYS, MENU_KEYS) +│ │ └── sound.ts # Audio-Playback für Modem-Intro +│ └── styles/ +│ └── global.css # alle CSS-Variablen, Klassen, Responsive-Styles +├── public/ +│ ├── images/ # skyline-header.png, og-image.png +│ ├── audio/ # dial-tone.mp3, dtmf-beeps.mp3, modem-handshake.mp3 +│ ├── js/ +│ │ ├── chiptune3.js # MOD Player Library (gepatcht für Script-Tag) +│ │ ├── chiptune3.worklet.js # AudioWorklet für libopenmpt +│ │ └── libopenmpt.worklet.js # libopenmpt WASM (~1.5 MB) +│ ├── favicon.ico +│ └── fonts/ # CP437-Webfont (geplant, noch nicht vorhanden) +├── tools/ +│ ├── fetch_mods.py # Pre-build: Holt MOD-Metadaten von moonweb.org +│ ├── generate_ansi.py # Referenz-Script für ANSI-Art-Generierung +│ └── cp437_to_utf8.py # CP437 → UTF-8 Konverter für BBS-Dateien +├── prebuild.sh # Pre-build Orchestrator (ruft alle tools/fetch_*.py auf) +├── source-assets/ +│ └── reference/ # Original-BBS-Screenshots als Design-Referenz +├── astro.config.mjs # site: https://28k8.moonweb.org, React-Integration +├── tsconfig.json # strict Mode, react-jsx +├── package.json # astro, @astrojs/react, react, react-dom, chiptune3 +└── .env.example # CLOUDFLARE_API_TOKEN, CLOUDFLARE_ZONE_ID +``` + +## Routing & URLs + +| URL | Seite | Bemerkung | +|---|---|---| +| `/` | Modem-Intro | Redirect zu `/bbs/` wenn `localStorage.hasConnected === 'true'` | +| `/bbs/` | Hauptmenü | 2×2-Kachel-Raster, Google-indexierbar | +| `/bbs/pc/phobia` | PHOB!A | Teaser → Link zu moonweb.org/phobia/ | +| `/bbs/pc/trancemission` | Tr@nceMISSION | Teaser → Link zu moonweb.org/tcm/ | +| `/bbs/pc/skyline` | SkyLINE Productions | Content aus Collections, Blau-Akzent | +| `/bbs/pc/kosmos-design` | Kosmos Design [KDS] | Own Releases + Outside Productions | +| `/bbs/atari/tropic-dreams` | Tropic DREAMs | Atari ST Releases (1990-1992) | +| `/bbs/amiga/esprit` | ESPRIT Releases | Amiga DemoMaker | +| `/bbs/amiga/mods` | MOD Files | Echte MODs von moonweb.org, WASM-Player (chiptune3) | +| `/bbs/fido/ansi-art` | BBS ANSI Art | Gallery mit 8 Filler-Patterns | +| `/bbs/fido/nodelist` | Fidonets & Nodelists | 9 Net-Boxen transkribiert | +| `/bbs/legal-notice` | Legal Notice | Pflichtangaben hinterlegt, Link zu hub.moonweb.org/impressum | + +## Keyboard-Shortcuts (keymap.ts) + +**Global:** `B` Back (history.back), `Q` Disconnect (clears localStorage), `I` Legal Notice + +**Menu:** `P` PHOB!A, `T` Tr@nceMISSION, `S` SkyLINE, `K` Kosmos Design, `D` Tropic DREAMs, `E` ESPRIT, `M` MOD Files, `A` BBS ANSI Art, `N` Fidonets + +## Content Collections (src/content/config.ts) + +Schema für alle Releases: +```typescript +{ title, group, year?, platform, credits: [{role, name}], description, + download_url?, screenshot?, file_id_diz } +``` + +## ANSI-Art-System + +1. `tools/generate_ansi.py` generiert HTML aus 5×7-Bitmap-Font + Dithering-Gradienten +2. Output landet als statische Strings in `src/lib/ansiArt.ts` +3. Components laden via `import { BANNER_X } from '../../lib/ansiArt'` +4. Rendered via `` (zero JS, set:html) + +CSS-Klassen: `c-border-red`, `c-main-red`, `c-shadow-red`, `c-border-blue`, `c-main-blue`, `c-shadow-blue`, `c-white`, `c-grey`, `c-pink`, `c-cyan` + +## Lokaler Dev-Workflow + +```bash +npm install +npm run dev # → localhost:4321 +npm run build # → prebuild.sh + dist/ +npm run preview # → lokaler Production-Server +``` + +## Pre-Build System + +`prebuild.sh` lädt vor jedem Build externe Daten (JSON) und schreibt sie nach `src/data/`. Die JSON wird committed, der Build hängt nicht vom externen Server ab. + +```bash +./prebuild.sh # alle Stages +./prebuild.sh mods # nur MOD-Metadaten +``` + +Aktive Stages: +| Stage | Script | Output | Beschreibung | +|---|---|---|---| +| `mods` | `tools/fetch_mods.py` | `src/data/mods.json` | MOD-Metadaten von moonweb.org | + +Neuen Stage hinzufügen: +1. `tools/fetch_.py` erstellen (Output: `src/data/.json`) +2. Case-Block in `prebuild.sh` ergänzen +3. `npm run build` ruft automatisch `prebuild.sh` auf + +## CP437 → UTF-8 Konvertierung + +Alte BBS-Dateien (FILES.BBS, kosmos.txt, etc.) sind im CP437-Kodiert (IBM PC Zeichensatz). Für die Anzeige auf der Website müssen sie konvertiert werden. + +```bash +# Einmal-Datei konvertieren (Output auf stdout) +python3 tools/cp437_to_utf8.py https://www.moonweb.org/files/pc/KDS/kosmos.txt + +# In Datei speichern +python3 tools/cp437_to_utf8.py https://www.moonweb.org/files/pc/KDS/FILES.BBS src/data/kds-files-bbs.txt +``` + +**Neue Dateien einbinden:** +1. Konvertieren: `python3 tools/cp437_to_utf8.py src/data/.txt` +2. In `.astro` einlesen: `const text = readFileSync('src/data/.txt', 'utf-8');` +3. Overlay nutzen: `` + +Konvertierte Dateien werden in `src/data/` gespeichert und committed. + +## Design-Regeln + +- DOS 16-Farben-Palette strikt, Hintergrund immer Schwarz +- Keine Scanlines, kein CRT-Curvature, kein Flicker +- CP437-Font für ANSI-Art, IBM Plex Mono für Fließtext +- Fix 80 Zeichen breit, vertikal scrollbar +- SkyLINE: einzige Seite mit Blau-Akzent (sonst immer Rot) +- Kompletter Content auf Englisch +- Barrierefreiheit explizit nicht priorisiert + +## Offene Aufgaben + +**Aktuelle Task-Liste:** `TODO.md` — dort steht der nächste Schritt ganz oben. + +Bei neuem Kontext: Zuerst `TODO.md` lesen, dann `PLAN.md` (Roadmap), dann `SPEC.md` (Tech-Spec). diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 0000000..e4a2bd2 --- /dev/null +++ b/PLAN.md @@ -0,0 +1,34 @@ +# PLAN.md - Implementation Roadmap (v2) + +## Phase 0 - Scaffold (v1, done) + Phase 0.5 - v2 fixes (done in this drop) +- [x] Fix: ANSI banner renders (AnsiArt.astro + ansiArt.ts) +- [x] Fix: Disconnect clears state (NavBar.astro) +- [x] Fix: SkyLINE blue accent visible + real header PNG +- [x] 10 boxed ASCII banners w/ dithering bars, 8 gallery patterns, 9 net-boxes +- [x] Tropic DREAMs (4 real), SkyLINE (+3), Kosmos Design (7 new), ESPRIT (4 new) +- [x] MOD Files placeholder tracklist + visual player widget +- [x] PHOB!A / Tr@nceMISSION teaser text, favicon.ico + og-image.png + +## Phase 1 - Make it actually run +- [ ] npm install, npm run dev, npm run build && npm run preview +- [ ] Modem-Intro-Audio-Clips bereitstellen: public/audio/dial-tone.mp3, dtmf-beeps.mp3, modem-handshake.mp3 + +## Phase 2 - Real ANSI rendering +- [ ] Feed real .ans files (via OpenCode) into source-assets/ansi/ +- [ ] Self-host CP437 webfont under public/fonts/ + +## Phase 3 - Navigation polish +- [ ] /bbs/atari/ etc. as mobile anchors to /bbs/#atari +- [ ] Astro View Transitions, subtle text-build-in stutter effect + +## Phase 4-5 - Visual + Content +- [ ] Replace filler gallery patterns with real scanned ANSI art +- [ ] Replace placeholder releases with real ones, write real Impressum text + +## Phase 6 - Amiga MOD player +- [ ] Real WASM MOD player (libopenmpt.js/chiptune3.js), real .mod files + +## Phase 7-8 - Infra & Launch +- [ ] files.moonweb.org, public GitHub repo + Cloudflare Pages +- [ ] sitemap.xml/robots.txt, full click-through incl. regression test of + the two v1 bugs (banner visibility + Disconnect) diff --git a/PRD.md b/PRD.md new file mode 100755 index 0000000..cd9d24a --- /dev/null +++ b/PRD.md @@ -0,0 +1,495 @@ +# PRD – 28k8.moonweb.org +**"tHE tEMPLE bBS" Retro Hub Page** + +Status: v2.0 + +--- + +## 1. Vision & Zweck + +Eine persönliche Hub-Page unter `28k8.moonweb.org`, die die eigene BBS-/Demoscene-Vergangenheit der 90er Jahre in Augsburg dokumentiert und als Portal zu bereits existierenden Archiv-Subdomains (`phobia`, `tcm`) sowie neuen Unterseiten (SkyLINE, Kosmos Design, Tropic DREAMs, ESPRIT, MOD-Sammlung, BBS-ANSI-Art, Fidonet) dient. + +Das ursprüngliche Vorbild ist das eigene BBS aus den 90ern: + +``` +tHE tEMPLE bBS +0821-2191038 (Augsburg) +Sysop: Stefan Koelle +Fido: 2:2480/330 +``` + +Die Seite soll stilistisch wie ein echtes DOS-Terminal wirken (schwarzer Hintergrund, ANSI-Art, CP437-Font), aber technisch eine moderne, rein clientseitige Static Site sein – kein Backend, kein PHP. + +**Kernprinzip:** Nostalgie-Genauigkeit im Design > moderne UX-Konventionen. Lieber weniger Schnickschnack als zu viel. Kleine, witzige moderne Gimmicks im alten Stil sind erlaubt (z. B. Modem-Dial-Sound, In-Browser-MOD-Player). + +## 2. Ziele / Non-Goals + +**Ziele:** +- Alle eigenen 90er-Projekte (PC/Atari ST/Amiga/BBS) an einem zentralen Ort dokumentieren +- Authentisches BBS-/Terminal-Gefühl per Maus (primär, ganze Box/Kachel klickbar inkl. Hover-State) **und** Tastatur (Fallback, eindeutige Buchstaben-Shortcuts) +- Vollständig statisch, SEO-fähig +- Wartbar über Markdown+Frontmatter im Git-Repo, Content-Pflege künftig primär durch AI-gestützte Edits +- Kein Server, kein PHP, keine Datenbank +- Komplett englischsprachiger Content + +**Non-Goals:** +- Keine Barrierefreiheit/Accessibility +- Kein CMS, kein Backend, kein Login-System +- Kein Nodelist-Browser +- Keine Terminal-Effekte wie Scanlines/CRT-Curvature/Flicker +- Kein Guestbook/Kommentarfunktion +- Kein Analytics/Tracking jeglicher Art +- Kein Easter-Egg im Buchstaben-Footer (rein dekorativ) + +## 3. Tech-Stack & Architektur + +| Bereich | Entscheidung | +|---|---| +| Framework | **Astro** + React-Islands für interaktive Komponenten (Terminal-Input, MOD-Player, ANSI-Renderer) | +| Rendering | Vollständig statisch, jede Route wird zur Build-Zeit vorgerendert (SSG) | +| Hosting | **Cloudflare Pages** – Git-Push triggert automatisch Cloudflare-eigenen Build & Deploy | +| DNS/CDN | Cloudflare | +| Domain-Registrar | 1&1 IONOS (unverändert) | +| Backend | **Keins.** Kein PHP, keine serverseitige Logik jemals | +| Asset-Hosting (Downloads) | `files.moonweb.org` (Synology oder eigener Static-Fileserver-Container) | +| Asset-Ablage (Design-Referenz) | `source-assets/` im Haupt-Repo | +| Repo | Neues, öffentliches GitHub-Repo | +| Content-Format | Markdown mit Frontmatter pro Release/Seite | + +### 3.1 Technologie-Entscheidung: Astro statt Eleventy + +**Frage geklärt:** Eleventy (11ty) ist ein reiner Template-basierter Static-Site-Generator ohne eingebaute Interaktivitäts-Architektur – JS-Komponenten (Terminal-Input, ANSI-Renderer, MOD-Player) müssten manuell über einen separaten Bundler eingebunden werden, inkl. eigener Logik dafür, dass nur nötige Seiten JS laden. + +Astro bietet **Islands Architecture**: jede Seite ist standardmäßig 100% statisches HTML/CSS, nur explizit markierte Komponenten (Terminal-Shell, MOD-Player) werden als React-Island hydriert. Zusätzlich: Content Collections mit Schema-Validierung (Zod) für Markdown+Frontmatter, integrierte View-Transitions-API für den gewünschten SPA-Effekt zwischen Subseiten. Deshalb Astro statt Eleventy – bessere Passform für "größtenteils statisch, aber gezielt interaktiv". + +### 3.2 Lokaler Dev-Workflow + +Damit vor jedem Push zu GitHub lokal getestet werden kann (Astro bringt das ohne Zusatztooling mit): + +| Command | Zweck | +|---|---| +| `npm run dev` | Lokaler Dev-Server mit Hot-Reload (`localhost:4321`) für die Entwicklung | +| `npm run build` | Erzeugt den finalen statischen Build nach `dist/` – identisch zu dem, was Cloudflare Pages baut | +| `npm run preview` | Startet einen kleinen lokalen Webserver, der exakt den `dist/`-Static-Build ausliefert, zum Prüfen vor dem Push | + +Damit ist ein vollständiger lokaler Build+Test-Zyklus möglich, ohne dass die GitHub Action/Cloudflare Pages involviert sein muss. + +### CI/CD +- Push auf `main` → Cloudflare Pages Build (Astro build) → automatisches Deploy +- Preview-Deployments für Pull Requests (Cloudflare-Pages-Standardfeature) +- Kein SFTP/IONOS-Webspace-Deploy nötig + +## 4. Informationsarchitektur / URL-Struktur + +``` +28k8.moonweb.org/ → Modem-Connect-Intro (nur beim ersten Besuch + bzw. nach explizitem "Disconnect") +28k8.moonweb.org/bbs/ → Hauptmenü (2x2-Kachel-Raster), Google-indexierbar +28k8.moonweb.org/bbs/pc/ → PC Section (Anchor-Ziel, kein eigenständiger Content) +28k8.moonweb.org/bbs/pc/phobia → Subseite PHOB!A +28k8.moonweb.org/bbs/pc/trancemission → Subseite Tr@nceMISSION +28k8.moonweb.org/bbs/pc/skyline → Subseite SkyLINE Productions +28k8.moonweb.org/bbs/pc/kosmos-design → Subseite Kosmos Design [KDS] +28k8.moonweb.org/bbs/atari/ → Atari Section (Anchor-Ziel) +28k8.moonweb.org/bbs/atari/tropic-dreams→ Subseite Tropic DREAMs +28k8.moonweb.org/bbs/amiga/ → Amiga Section (Anchor-Ziel) +28k8.moonweb.org/bbs/amiga/esprit → Subseite ESPRIT Releases +28k8.moonweb.org/bbs/amiga/mods → Subseite MOD Files (mit In-Browser-Player) +28k8.moonweb.org/bbs/fido/ → BBS & FIDO Section (Anchor-Ziel) +28k8.moonweb.org/bbs/fido/ansi-art → Subseite BBS ANSI Art +28k8.moonweb.org/bbs/fido/nodelist → Subseite Fidonets and Nodelists +28k8.moonweb.org/bbs/legal-notice → Legal Notice (Pflichtseite, eigener Menüpunkt) +``` + +**Regeln:** +- `/` zeigt Intro nur beim allerersten Besuch (`localStorage`-Flag), danach Redirect zu `/bbs/` +- "Disconnect" setzt den Flag zurück und navigiert zu `/` +- Zurück-Navigation: `[B] Back` als Tastaturbefehl, zusätzlich klickbar +- Mobile: Section-URL scrollt zum Anchor innerhalb `/bbs/` (`/bbs/#atari`) +- Subseiten-Wechsel wirkt wie SPA (äußerer Terminal-Rahmen bleibt bestehen), aber jede Subseite hat eine echte, vorgerenderte, crawlbare URL + +## 5. Interaktionsmodell + +### 5.1 Modem-Connect-Intro (`/`) +- 28k8-Modem-SVG + simuliertes Terminalfenster, ATDT-Wählbefehl +- Line-Auswahl: + ``` + Line 1: +49-821-2191-038 [VFC V34] 28800 + Line 2: +49-821-2191-036 [X75] 64000 + ``` +- **Line 1:** Volle Modem-Einwahl-Simulation (Wählton → Pieptöne → Handshake-Sound) → Redirect zu `/bbs/` +- **Line 2:** Kein Sound, sofortiger Direktzugang → Redirect zu `/bbs/` +- Sound nur an dieser einen Stelle im gesamten Projekt + +### 5.2 Hauptmenü (`/bbs/`) – Bedienlogik +- **Keine Section-Keys mehr** (P/A/G/F entfallen) – Sections selbst sind reine visuelle Gruppierung ohne eigenes Ziel +- **Jeder einzelne Menüpunkt bekommt einen global eindeutigen Tastatur-Shortcut** (siehe Keymap-Tabelle 5.2.1), Tastatur ist Fallback/Gimmick +- **Primäre Bedienung: Maus** – die **komplette Kachel/Box ist klickbar** (nicht nur der `[X]`-Buchstabe am Anfang der Zeile), inkl. Hover-State (z. B. Aufhellen der Box-Rahmenfarbe oder invertierter Text) +- Ungültige Tasteneingabe: keine Fehlermeldung, wird einfach ignoriert (kein "Invalid selection"-Text) +- Kein Sysop-Login-Screen, kein "New User"-Dialog – nach Intro direkt ins Hauptmenü +- **Statuszeile gewünscht:** unten im Hauptmenü (und ggf. auf Subseiten) eine Zeile im Stil `Connected: 28800 bps | Line: V34 | 28k8.moonweb.org` – Details (echte vs. simulierte Uhrzeit, weitere Felder) noch offen, siehe Abschnitt 15 +- **Buchstaben-Button-Footer** ("t H E t E M P L E b B S", siehe Referenzscreen 7.2 Punkt 4) wird 1:1 optisch nachgebaut, ist aber **rein dekorativ, ohne Klickfunktion/Easter-Egg** +- **Layout: 2×2-Kachel-Raster** auf Desktop (siehe 14.1), auf Mobile 1 Spalte mit allen 4 Kacheln untereinander (siehe 14.1-Mobile) +- Kein Guestbook, kein Loading-Screen zwischen Seiten (sofortiger Content-Wechsel). Optional/nice-to-have: leicht verzögerter Textaufbau mit kleinem "Stocken" mitten in der Zeile beim ersten Erscheinen einer Box – kein Muss, kann später entschieden werden +- Legal Notice ist ein regulärer Menüpunkt im BBS-Stil (nicht nur ein unauffälliger Footer-Link) + +### 5.2.1 Globaler Keymap + +| Key | Ziel | Bereich | +|---|---|---| +| `B` | Back | global | +| `Q` | Disconnect | global | +| `I` | Legal Notice | global | +| `P` | PHOB!A | PC | +| `T` | Tr@nceMISSION | PC | +| `S` | SkyLINE Productions | PC | +| `K` | Kosmos Design [KDS] | PC | +| `D` | Tropic DREAMs | Atari ST | +| `E` | ESPRIT Releases | Amiga | +| `M` | MOD Files | Amiga | +| `A` | BBS ANSI Art | BBS & FIDO | +| `N` | Fidonets and Nodelists | BBS & FIDO | + +**Offen:** Reihenfolge der Kacheln (welche Section oben-links im 2×2-Raster). `M` wurde als globaler Main-Menu-Key verworfen — bei nur 2 Ebenen und immer verfügbarem `[B] Back` ist er nicht nötig, stattdessen `M` für MOD Files (Amiga) reserviert. + +### 5.3 Subseiten +- Gleiches Grundlayout: ANSI-Banner-Header + Einleitungstext + Release-Liste + Outbound-Link-Box +- Ausnahme SkyLINE: PNG-Header (Cyan "SKY"/Weiß "LINE" auf Blau-Gradient), zweispaltiges Listen-Layout (siehe 14.2) +- Content-Wechsel behält äußeren Terminal-Rahmen bei + +## 6. Design-System + +| Element | Vorgabe | +|---|---| +| Grundfarben | Strikt DOS 16-Farben-Palette, Hintergrund konsequent Schwarz | +| Vordergrundfarbe Standard | Grau/Weiß, angelehnt an MS-DOS 6.22 | +| **Verboten** | DOS-Blau als Hintergrund | +| Hauptfarbe gesamte Seite | Dunkelrot/Hellrot (bestätigt durch Original-Screens) | +| SkyLINE-Ausnahme | **Nur innerhalb** der SkyLINE-Subseite: zusätzlich Blau/Hellblau als Akzent (PNG-Header + Rahmen-Akzente), Rest der Seite bleibt sonst konsistent im roten Grundton | +| Box-/Rahmen-Stile | (a) eckige Klammerboxen `[ Titel ]`; (b) runde Divider mit `º`/`°` für große Abschnittsüberschriften | +| Terminal-Effekte | Keine Scanlines, kein Flicker, kein CRT-Curvature | +| Font (ANSI/echte Retro-Art) | Echte CP437/DOS-Font (z. B. "Web 437"/"Perfect DOS VGA 437") | +| Font (Fake-BBS-Fließtext) | IBM Plex Mono o. ä. Monospace | +| Breite | Fix 80 Zeichen breit, vertikal unendlich scrollbar | +| Sound | Ausschließlich der Modem-Connect-Sound in der Intro | +| Barrierefreiheit | Explizit nicht priorisiert | +| Analytics | Keins – kein Tracking jeglicher Art | +| Favicon/Social-Preview | **Ja, vollständig umsetzen** – Retro-Favicon (z. B. Ausschnitt Temple-BBS-Logo) + Open-Graph-Bild für Link-Previews (Discord/Mastodon/etc.) | + +### 6.1 Kachel-Styling-Beschreibung (textuelle Spezifikation, noch nicht visuell umgesetzt) + +Die 4 Hauptmenü-Kacheln sollen "stylischer" wirken als reine Einfarb-Boxen, aber ohne die 16-Farben-Grenze zu verlassen. Ansatz: **Dithering-Farbverläufe per ANSI-Blockzeichen**, eine klassische Scene-Technik – durch Kombination von Halbraster-Zeichen (`░` `▒` `▓` `█`) mit wechselnder Vorder-/Hintergrundfarbe lässt sich innerhalb der 16-Farben-Palette ein Verlaufseffekt simulieren (z. B. Kachel-Kopfzeile: oben helles Rot auf dunklem Rot mit `█`-Zeichen, darunter zunehmend `▓`→`▒`→`░` für einen weichen Übergang zum schwarzen Body). Diese Technik wurde in echten 90er-ANSI-Artworks häufig für Logo-Hintergründe und Balken verwendet und passt damit stilecht. Die konkrete Umsetzung (welche Zeichen, welche Farbpaare pro Kachel) wird erst in der Design-/Umsetzungsphase ausgearbeitet, hier nur als Anforderung dokumentiert. + +### 6.2 Box-Interaktion +- Die **gesamte Kachel bzw. gesamte FILE_ID.DIZ-Box** ist eine klickbare Fläche (nicht nur das Shortcut-Zeichen) +- Hover-State erforderlich (visuelle Rückmeldung, z. B. hellere Rahmenfarbe oder Farbinversion), Umsetzungsdetail folgt in der Design-Phase + +### 6.3 Content-Sprache +**Die komplette Live-Seite wird auf Englisch verfasst** – Menütexte, Einleitungstexte, FILE_ID.DIZ-Beschreibungen, Statusmeldungen, Fehlertexte (falls vorhanden) und so weit rechtlich zulässig auch das Impressum. Dieses PRD-Dokument selbst bleibt als internes Planungsdokument auf Deutsch. + +## 7. ANSI-Art-Handling + +- Quellmaterial: `.ANS`-Dateien (transkribiert) sowie Foto-Screenshots als aktuelle visuelle Referenz +- Rendering-Strategie: Hybrid (teilweise Live-ANSI-Rendering, größtenteils Fake-BBS-Look mit CP437-Font) +- BBS-ANSI-Art-Galerie: ca. 8 Snippets, untereinander, mit Fake-BBS-Kontexttexten dazwischen + +### 7.1 Asset-Intake & Ablage-Konvention + +| Kategorie | Beispiel | Ablageort | +|---|---|---| +| Design-Referenz | Fotos/Screenshots Original-BBS | `source-assets/reference/` im Haupt-Repo | +| Enduser-Downloads | `.ans`, Disk-Images, `.mod`-Dateien | `files.moonweb.org` | + +Kein ZIP im Repo committen (nur als Transportweg). Kebab-case-Dateinamen mit Herkunfts-Tag. + +### 7.2 Bereits gesichtetes Referenzmaterial (Stand 12.08.2026) + +1. Hauptmenü-Screen (rot/pink): Blocklogo, "USEFULL INFORMATION"/"SUPPORTED NETS" mit `º...°`-Divider +2. Hauptmenü-Screen (Line-1/Line-2): bestätigt Wortlaut, FidoNet-Adressen, Tagline +3. Tr@nceMISSION-Crack-Intro: ASCII-Blocklogo, Stilvorbild (Inhalt nicht übernehmen) +4. Regular-Nets-Übersicht: `[ Titel ]`-Rahmenmuster, Buchstaben-Button-Footer +5. Pixel-Logo-Variante: Sponsor-Tags, Kandidat für Fidonet-Seite +6. ASCII-Slash-Logo mit `%KDS world headquarter%`-Tag +7. SkyLINE-PNG-Header: Cyan/Weiß auf Blau-Gradient + +## 8. Content-Modell (Markdown + Frontmatter) + +```yaml +--- +title: "Runner" +group: "Tropic DREAMs" +year: 1991 +platform: "Atari ST" +credits: + - role: "Idea" + name: "CPK" + - role: "Coding" + name: "Stefan" +description: > + An all-round helper tool including a database, memo, system overview, + and a game. +download_url: "https://files.moonweb.org/atari/tropic-dreams/runner.zip" +screenshot: "https://files.moonweb.org/atari/tropic-dreams/runner_shot1.png" +file_id_diz: | + RUNNER v1.0 + by Tropic DREAMs + All-round helper + tool w/ Hangman + game. (~25 chars + per line wrap) +--- +``` + +Content-Sprache in allen Feldern: Englisch (siehe 6.3). + +## 9. Sections & Menüpunkte + +### PC Section +Hardware: Colani 486 DX-50 / DOS / VGA / Soundblaster AWE32 + +| Menüpunkt | Key | Status | Ziel | +|---|---|---|---| +| PHOB!A | `P` | Bestehende Subdomain | `moonweb.org/phobia/` | +| Tr@nceMISSION | `T` | Bestehende Subdomain, Releases nachtragen | `moonweb.org/tcm/` | +| SkyLINE Productions | `S` | **Neue Subseite, MVP #1** | FILE_ID.DIZ-Liste + Screenshots + PNG-Header | +| Kosmos Design [KDS] | `K` | **Neue Subseite** | 4 Releases + Fremdproductions integriert | + +### Atari ST Section +Hardware: 1040 STFM (1MB) / Mega 4 (4MB, 60MB HDD) + +| Menüpunkt | Key | Status | +|---|---|---| +| Tropic DREAMs | `D` | **Neue Subseite**, Inhalte vollständig vorhanden (International Kegeln and Bowling 1990, Runner 1991, Atom Oh No! 1991, TOP Tools 1992) | + +### Amiga Section +Hardware: Amiga 500, 1MB, 2 Diskdrives + +| Menüpunkt | Key | Status | +|---|---|---| +| ESPRIT Releases | `E` | **Neue Subseite** – Content TBD | +| MOD Files | `F` | **Neue Subseite** mit In-Browser-MOD-Player | + +### BBS & FIDO Section +Hardware: 486dx2-66 OS/2 Warp 3; PHOBOS 486dx2-66 OS/2-Mailbox + +| Menüpunkt | Key | Status | +|---|---|---| +| BBS ANSI Art | `A` | **Neue Subseite** – ca. 8 Snippets | +| Fidonets and Nodelists | `N` | **Neue Subseite** – Nodelist 2:2480/330 | + +## 10. Downloads & Asset-Strategie + +Original-Assets werden direkt zum Download angeboten, gehostet auf `files.moonweb.org`. Design-Referenzmaterial separat in `source-assets/reference/`. + +## 11. SEO & Crawlability + +`/bbs/` und alle Subseiten vollständig vorgerendert. `sitemap.xml`/`robots.txt`. Aussagekräftige ``/`<meta description>` (Englisch) pro Subseite. + +## 12. Offene Punkte (TBD) + +- [ ] Weitere `.ANS`-Rohdateien ins Repo übernehmen +- [ ] Finale Release-Texte/FILE_ID.DIZ-Inhalte (Englisch) für SkyLINE, Kosmos Design, ESPRIT +- [ ] Technisches Setup von `files.moonweb.org` +- [ ] Foto vom Amiga 500 nachreichen +- [ ] Sponsor-/Affiliation-Tags: welche als Flavor-Text auf der Fidonet-Seite erscheinen +- [ ] Cloudflare Pages Projekt-Setup +- [ ] Fehlende Tr@nceMISSION-Releases nachtragen +- [ ] Referenzbilder gemäß 7.1 ins Repo einpflegen +- [ ] **Keymap-Bestätigung** (Tabelle 5.2.1) und Kachel-Reihenfolge im 2×2-Raster +- [ ] Konkrete Umsetzung der Dithering-Gradient-Kacheln (Abschnitt 6.1) in der Design-Phase +- [ ] Optionaler "Stocken beim Textaufbau"-Effekt: einbauen oder weglassen (nice-to-have, kein Muss) +- [x] Legal Notice-Inhalt (Pflichtangaben) zusammenstellen + +## 13. MVP-Reihenfolge (Vorschlag) + +1. Grundgerüst: Astro-Projekt, Terminal-Shell-Komponente, Routing `/`, `/bbs/` +2. Modem-Connect-Intro mit Line-1/Line-2-Logik und Sound +3. Hauptmenü `/bbs/` mit 2×2-Kachel-Raster und Buchstaben-Button-Footer +4. **SkyLINE-Subseite** als erste vollständige Content-Subseite (zweispaltiges Listen-Layout) +5. Rollout der übrigen Subseiten nach demselben Template +6. MOD-Player-Integration (Amiga-Section) +7. Deployment-Pipeline (Cloudflare Pages) parallel von Anfang an aktivieren + +## 14. Wireframes (ASCII-Scribbles, Layout-Sketches) + +**Hinweis:** Grobe Struktur-Skizzen, keine finale ANSI-Kunst. Farbverläufe/Dithering (siehe 6.1) sind hier nur als Kommentar markiert, nicht ausgezeichnet. + +### 14.1 Hauptmenü `/bbs/` – Desktop: 2×2-Kachel-Raster (je Kachel ~40 Zeichen) + +``` +================================================================================ +|| [ ASCII-LOGO PLATZHALTER: "tHE tEMPLE bBS" Blockschrift-Banner, || +|| Referenz: source-assets/reference/temple-bbs-mainmenu-red-v1.jpg ] || +|| DemoBoard - MultiNetServer - no ratios - Augsburg, DE || +|| FidoNet: 2:2480/330 - 2:2480/331 || +================================================================================ + ++--------------------------------------++--------------------------------------+ +| PC SECTION || ATARI ST SECTION | +| <- Kachel-Kopf mit Dither-Gradient || <- Kachel-Kopf mit Dither-Gradient | +| (siehe 6.1), Farbe dunkelrot->hellrot || (siehe 6.1), Farbe dunkelrot->hellrot | +| || | +| Colani 486 DX-50 / DOS / VGA / || 1040 STFM (1MB) / Mega 4 (4MB, | +| Soundblaster AWE32 || 60MB HD) | +| || | +| [P] PHOB!A || [D] Tropic DREAMs | +| [T] Tr@nceMISSION || | +| [S] SkyLINE Productions || | +| [K] Kosmos Design [KDS] || | +| || | +| (ganze Kachel klickbar + Hover) || (ganze Kachel klickbar + Hover) | ++--------------------------------------++--------------------------------------+ ++--------------------------------------++--------------------------------------+ +| AMIGA SECTION || BBS & FIDO SECTION | +| || | +| Amiga 500, 1MB, 2 Diskdrives || 486dx2-66 OS/2 Warp3 / PHOBOS | +| || Mailbox | +| [E] ESPRIT Releases || [A] BBS ANSI Art | +| [F] MOD Files || [N] Fidonets and Nodelists | +| || | ++--------------------------------------++--------------------------------------+ + + [B] Back [Q] Disconnect [I] Legal Notice + + ----------------------------------------------------------------------------- + | t | H | E | | t | E | M | P | L | E | | b | B | S | <- rein dekorativ + ----------------------------------------------------------------------------- + + Status: 28800 bps | Line V34 | 28k8.moonweb.org <- Statuszeile +================================================================================ +``` + +### 14.1-Mobile Hauptmenü – Kacheln gestapelt (1 Spalte) + +``` +================================ +|| ASCII-LOGO (verkleinert) || +================================ + ++------------------------------+ +| PC SECTION | +| Colani 486 DX-50 / DOS / | +| VGA / Soundblaster AWE32 | +| | +| [P] PHOB!A | +| [T] Tr@nceMISSION | +| [S] SkyLINE Productions | +| [K] Kosmos Design [KDS] | ++------------------------------+ + ++------------------------------+ +| ATARI ST SECTION | +| 1040 STFM (1MB) / Mega 4 | +| | +| [D] Tropic DREAMs | ++------------------------------+ + ++------------------------------+ +| AMIGA SECTION | +| Amiga 500, 1MB, 2 Disk | +| | +| [E] ESPRIT Releases | +| [F] MOD Files | ++------------------------------+ + ++------------------------------+ +| BBS & FIDO SECTION | +| 486dx2-66 OS/2 Warp3 | +| | +| [A] BBS ANSI Art | +| [N] Fidonets and Nodelists | ++------------------------------+ + + [B] Back [Q] Disconnect [I] Legal Notice + Status: 28800 bps | V34 +================================ +``` + +### 14.2 SkyLINE-Subseite `/bbs/pc/skyline` – Desktop, zweispaltige Liste + +``` +================================================================================ +|| [ PNG-HEADER: skyline-header.png - Cyan "SKY" + Weiss "LINE" auf || +|| blauem Gradient-Banner, darunter schwarzer Hintergrund ] || +================================================================================ + + [B] Back to Main Menu 28k8.moonweb.org/bbs/pc/skyline + + -------------------------------------------------------------------------- + SkyLINE Productions + Intro text (TBD, English): Application software for the 486, small tools + and subdemos. Most of my own PC releases happened here. + -------------------------------------------------------------------------- + + +----------------------------------------+ +-------------------------+ + | TOOLNAME v1.0 | | [ FILE_ID.DIZ ]--[ 01 ] | + | by SkyLINE Productions | | .-----------------. | + | Year: 199x Platform: DOS/486 | | | TOOLNAME v1.0 | | + | Credits: Coding-Stefan | Gfx-... | | | by SkyLINE Prod.| | + | | | | --------------- | | + | [Screenshot Thumbnail Placeholder] | | | Short descr., | | + | (files.moonweb.org, ca. 240x160) | | | wrapped at ~25 | | + | | | | chars, like the | | + | [D]ownload [S]creenshot [I]nfo | | | original DIZ. | | + | | | '-----------------' | + | (ganze Box klickbar + Hover) | | (~25 Zeichen breit) | + +----------------------------------------+ +-------------------------+ + + +----------------------------------------+ +-------------------------+ + | ... naechstes Release, gleiches Muster, untereinander in der Liste ... | + +----------------------------------------+ +-------------------------+ + + -------------------------------------------------------------------------- + [B] Back [Q] Disconnect +================================================================================ +``` + +### 14.2-Mobile SkyLINE – gestapelte Spalten pro Release + +``` +================================ +|| PNG-HEADER (verkleinert) || +================================ + [B] Back + + SkyLINE Productions + Intro text (TBD, English)... + + +------------------------------+ + | TOOLNAME v1.0 | + | by SkyLINE Productions | + | Year: 199x Platform: DOS | + | Credits: Coding-Stefan | + | | + | [Screenshot Placeholder] | + | | + | [D]ownload [S]creenshot | + +------------------------------+ + +------------------------------+ + | [ FILE_ID.DIZ ]------[ 01 ] | + | .--------------------. | + | | TOOLNAME v1.0 | | + | | by SkyLINE Prod. | | + | | Short descr. text | | + | | wrapped ~25 chars | | + | '--------------------' | + +------------------------------+ + + ... (naechstes Release darunter) ... + + [B] Back [Q] Disconnect +================================ +``` + +## 15. Noch offene Detailfragen + +- [ ] Reihenfolge der Kacheln im 2×2-Raster (Vorschlag: PC oben-links, Atari oben-rechts, Amiga unten-links, BBS&FIDO unten-rechts – zu bestätigen) +- [ ] Keymap-Tabelle 5.2.1: passt so oder andere Wunsch-Buchstaben (historisch aus Original-BBS-Menü)? +- [ ] Statuszeile: exakte Felder (echte vs. simulierte Uhrzeit, weitere Angaben wie "Time online") +- [ ] Optionaler Stocken-Effekt beim Textaufbau: einbauen oder nicht (nice-to-have) +- [x] Legal Notice: Pflichtangaben zusammenstellen (Name, Anschrift, Kontakt – rechtlich notwendig) +- [ ] Konkrete Farbpaare/Zeichen für die Dithering-Gradient-Kacheln (Abschnitt 6.1) in der Design-Phase festlegen + +--- + +**Ende PRD v2.0** diff --git a/README.md b/README.md new file mode 100644 index 0000000..9d724c8 --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +# 28k8.moonweb.org - tHE tEMPLE bBS Retro Hub (v2) + +A 90s BBS/demoscene retro hub, built with Astro + React Islands, deployed +on Cloudflare Pages. No backend, no PHP, no database, no tracking. + +## v2 highlights +- The colored TEMPLE ANSI banner now actually renders on the main menu. +- Disconnect works correctly (clears state, returns to the intro screen). +- SkyLINE has a visible blue accent + a real generated header image. +- 10 full ASCII banners with color gradients across every page, an 8-item + ANSI-art gallery, and real net-list content from the original screenshots. +- Lots more content: Tropic DREAMs (all 4 real releases), SkyLINE (+3), + Kosmos Design (7, new), ESPRIT (4, new), MOD Files tracklist. + +## Start here +1. PRD.md - requirements + v1.4 changelog +2. SPEC.md - technical spec, what changed and why +3. PLAN.md - phase-by-phase remaining work + +## Quick start +``` +npm install +npm run dev # http://localhost:4321 +npm run build # -> dist/ +npm run preview # serve the production build locally +``` + +## Deployment +Cloudflare Pages, connected directly to this repo. Build command +`npm run build`, output directory `dist`. + +## WelcomeBanner (Startseite) + +Das "THE TEMPLE BBS"-Logo auf der Startseite wird als CP437-Text mit +Typewriter-Animation dargestellt. Der Text kommt aus einer echten +CP437-Datei und wird mit einem IBM-VGA-Webfont gerendert. + +### Dateien + +| Datei | Zweck | +|---|---| +| `source-assets/welcome.txt` | Original-Datei (CP437-kodiert) | +| `source-assets/welcome-utf8.txt` | UTF-8-Version, wird von Astro eingelesen | +| `src/components/WelcomeBanner.astro` | Komponente (Rendering + Animation) | +| `public/fonts/Px437_IBM_VGA_8x16.woff2` | CP437-Webfont (6.6 KB) | +| `public/fonts/Px437_IBM_VGA_8x16.ttf` | Font als Fallback | +| `src/styles/global.css:2` | `@font-face`-Definition | + +### Warum zwei Textdateien? + +Node.js unterstützt `cp437` nicht in `TextDecoder`. Die Original-Datei +wird daher per Python in UTF-8 konvertiert und die `.txt`-Datei mit +abgespeichert. Bei Änderungen an `welcome.txt` muss die UTF-8-Version +neu generiert werden: + +```bash +python3 -c " +with open('source-assets/welcome.txt','rb') as f: d=f.read() +with open('source-assets/welcome-utf8.txt','w',encoding='utf-8') as f: f.write(d.decode('cp437')) +" +``` + +### Animation anpassen + +In `src/components/WelcomeBanner.astro`, Zeile 24-26: + +```javascript +const BASE = 8; // Basis-delay pro Zeichen (ms) +const FAST = 4; // Delay für Leerzeichen (ms) +const HARD_PAUSES: [number, number][] = [[34, 400], [98, 350]]; +// [Zeichen-Position, Pause in ms] +``` + +- **`BASE`/`FAST`** kleiner = schneller +- **`HARD_PAUSES`** = 2 bewusste Pausen mitten in einer Zeile. + Position 34 ≈ Mitte der 1. Zeile, Position 98 ≈ Mitte der 2. Zeile. + Werte an Text anpassen wenn sich die Zeilenlängen ändern. + +### Font + +`Px437 IBM VGA 8x16` von int10h.org (Oldschool PC Font Pack v2.2, +CC BY-SA 4.0). Enthält 288 Glyphs inkl. aller CP437-Block-Zeichen +(█, ▄, ▀, ▌, ▐, ░, ▒, ▓) und Box-Drawing-Zeichen. + +Der Font ist über `--font-ansi` in `global.css` verfügbar und wird +auch von den ANSI-Art-Bannern (`ansiArt.ts`) genutzt. diff --git a/SPEC.md b/SPEC.md new file mode 100644 index 0000000..a69f1b9 --- /dev/null +++ b/SPEC.md @@ -0,0 +1,37 @@ +# SPEC.md - 28k8.moonweb.org Technical Specification (v2) + +## v2 changes (bug fixes + requested improvements) +1. Fixed: ANSI banner not visible - v1 only showed a placeholder <pre> comment. + Now rendered via src/components/AnsiArt.astro + src/lib/ansiArt.ts (precomputed + colored HTML via set:html, zero JS required). +2. Fixed: Disconnect not working - v1's mouse link never cleared localStorage, + so '/' bounced straight back to '/bbs/'. Fixed in src/components/NavBar.astro + via a plain onclick attribute that clears state before navigating. +3. More content: Tropic DREAMs (4 real releases), SkyLINE (+3), Kosmos Design + (7, new collection), ESPRIT (4, new collection), MOD Files tracklist, BBS + ANSI Art gallery (8 filler patterns), PHOB!A/Tr@nceMISSION teaser text. +4. More period ASCII art + gradients: 10 full boxed banners (5x7 bitmap font) + each with a dithering gradient bar, plus 9 net-list boxes transcribed + verbatim from the original reference screenshots (Fidonet/Nodelist page). +5. SkyLINE blue accent strengthened (headings/tiles/diz-box/nav-bar) + a real + generated header PNG (public/images/skyline-header.png). + +## Repository layout delta +src/lib/ansiArt.ts, src/components/AnsiArt.astro, src/components/NavBar.astro, +tools/generate_ansi.py, public/images/skyline-header.png, public/favicon.ico, +public/og-image.png, src/content/kosmos-design/*.md, src/content/esprit/*.md + +## AnsiArt contract +BANNER_<NAME> / ANSI_GALLERY / BOX_<NAME> exports, HTML with CSS classes +c-border-red, c-main-red, c-shadow-red, c-border-blue, c-main-blue, +c-shadow-blue, c-white, c-grey, c-pink, c-cyan (all in global.css). +Render via <AnsiArt html={BANNER_X} />. + +## NavBar contract +optional [B] Back (history.back()), always [Q] Disconnect +(clears localStorage.hasConnected via onclick, then navigates to /), +optional [I] Impressum & Privacy. Use everywhere instead of ad-hoc links. + +## Everything else +Routing table, design tokens, local dev workflow (npm run dev/build/preview), +deployment (Cloudflare Pages) - unchanged from v1. See PRD.md and PLAN.md. diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..6f9679d --- /dev/null +++ b/TODO.md @@ -0,0 +1,155 @@ +# TODO.md - Offene Aufgaben & Workflow + +Stand: 13.08.2026 | Referenz: PLAN.md, SPEC.md, PRD.md + +--- + +## NÄCHSTER SCHRITT: Phase 1 (fertig) + +### P1.1 Build-Chain testen +- [x] `npm install` ausgeführt +- [x] `npm run dev` → localhost:4321 funktioniert +- [x] `npm run build` → dist/ mit 12 Seiten erfolgreich +- [x] `npm run preview` → lokaler Production-Server (nächster Schritt) + +### P1.2 Modem-Intro Audio +- [x] dial-tone.mp3 besorgen/erstellen → public/audio/ +- [x] dtmf-beeps.mp3 besorgen/erstellen → public/audio/ +- [x] modem-handshake.mp3 besorgen/erstellen → public/audio/ +- [x] ModemIntro.tsx testen (Line 1 = Sound, Line 2 = Direktzugang) + +### P1.3 Pre-Build System +- [x] `tools/fetch_mods.py` — MOD-Metadaten von moonweb.org +- [x] `prebuild.sh` — ruft alle Pre-Build Stages auf +- [x] `npm run build` führt automatisch prebuild.sh aus +- [x] `src/data/mods.json` — gecachte MOD-Daten + +--- + +## VOR DEM LIVE-TEST + +### Inhalt aufräumen +- [ ] Placeholder-Texte in Content-Dateien entfernen (`[Placeholder/fake content]`, PRD.md-Referenzen) + - [ ] `src/content/skyline/disk-doctor.md` + - [ ] `src/content/skyline/example-tool.md` + - [ ] `src/content/skyline/megademo-93.md` + - [ ] `src/content/skyline/sky-file-manager.md` + - [ ] `src/content/esprit/esprit-utility-music.md` + - [ ] `src/content/esprit/esprit-demomaker-1.md` + - [ ] `src/content/esprit/esprit-utility-copy.md` + - [ ] `src/content/esprit/esprit-demomaker-2.md` + - [ ] `src/content/kosmos-design/kds-intro-1.md` + - [ ] `src/content/kosmos-design/kds-cracktro-pack.md` + - [ ] `src/content/kosmos-design/kds-slideshow.md` + - [ ] `src/content/kosmos-design/kds-musicdisk.md` +- [ ] Placeholder-Hinweise in Seiten-Descriptions entfernen: + - [ ] `src/pages/bbs/pc/skyline.astro` (PRD.md 12) + - [ ] `src/pages/bbs/pc/trancemission.astro` (PRD.md section 12) + - [ ] `src/pages/bbs/pc/kosmos-design.astro` (PRD.md 12) + - [ ] `src/pages/bbs/amiga/esprit.astro` (PRD.md 12) + - [ ] `src/pages/bbs/fido/ansi-art.astro` (PRD.md section 3) + +### Asset-Hosting +- [ ] `files.moonweb.org` einrichten (Synology oder Static-Fileserver) +- [ ] Download-Dateien (.zip, .mod) dort ablegen +- [ ] Links in Content-Dateien prüfen/aktualisieren + +--- + +## DANACH: Phase 2 - ANSI-Art + +### P2.1 Echte .ans Dateien +- [ ] Original .ans Dateien aus den 90ern besorgen +- [ ] In source-assets/ansi/ ablegen +- [ ] generate_ansi.py anpassen oder neuen Parser schreiben +- [ ] In ansiArt.ts einbinden (Fallback auf generierte Patterns) + +### P2.2 CP437 Webfont +- [ ] Passenden CP437/DOS-Font beschaffen (Web 437, Perfect DOS VGA 437) +- [ ] Als WOFF2 unter public/fonts/ ablegen +- [ ] @font-face in global.css korrigieren (aktuell: `src: local('Web 437')` → funktioniert nur wenn Font installiert) +- [ ] Testing: ANSI-Art mit echtem Font rendern + +--- + +## DANACH: Phase 3 - Navigation + +### P3.1 Mobile Anchors +- [ ] /bbs/atari/ → /bbs/#atari als Scroll-Ziel +- [ ] /bbs/amiga/ → /bbs/#amiga +- [ ] /bbs/fido/ → /bbs/#fido +- [ ] /bbs/pc/ → /bbs/#pc (falls nötig) + +### P3.2 View Transitions +- [ ] Astro View Transitions einbauen +- [ ] Optional: Subtiler Textaufbau-Effekt ("Stottern") + +--- + +## DANACH: Phase 4-5 - Content & Visual + +### P4.1 Echte ANSI-Art +- [ ] 8 Filler-Patterns durch echte gescannte/analysierte .ans ersetzen +- [ ] BBS ANSI Art Seite aktualisieren + +### P4.2 Echte Releases +- [ ] SkyLINE: placeholder/disk-doctor.md → echte Inhalte +- [ ] SkyLINE: example-tool.md → echte Inhalte +- [ ] Kosmos Design: Prüfen ob alle Credits korrekt sind +- [ ] ESPRIT: Prüfen ob alle Inhalte korrekt sind +- [ ] Tr@nceMISSION: Fehlende Releases nachtragen (PRD.md 12) + +### P4.3 Impressum +- [x] Pflichtangaben zusammenstellen (Name, Anschrift, Kontakt) +- [x] legal-notice.astro ausfüllen +- [x] Auf Englisch (PRD.md 6.3) + +--- + +## DANACH: Phase 6 - MOD Player + +### P6.1 WASM MOD Player +- [x] chiptune3.js (libopenmpt AudioWorklet) eingebunden +- [x] `tools/fetch_mods.py` → `src/data/mods.json` (pre-build) +- [x] `ModPlayer.tsx` React-Island mit Playlist +- [x] `prebuild.sh` Orchestrator für alle Pre-Build Stages +- [ ] Echte .mod Dateien auf files.moonweb.org bereitstellen (oder direkt von moonweb.org streamen) + +--- + +## LETZTE PHASE: 7-8 - Infra & Launch + +### P7.1 Asset-Hosting +- [ ] files.moonweb.org einrichten (Synology oder Static-Fileserver) +- [ ] Alle Downloads (.ans, .mod, Disk-Images) dort ablegen +- [ ] Links in Content-Dateien aktualisieren + +### P7.2 Deployment +- [ ] GitHub-Repo veröffentlichen +- [ ] Cloudflare Pages Projekt anlegen +- [ ] Build-Command: `npm run build`, Output: `dist` +- [ ] DNS-Eintrag für 28k8.moonweb.org prüfen +- [ ] Erstes Live-Deploy + +### P7.3 SEO & Finalisierung +- [ ] sitemap.xml generieren +- [ ] robots.txt anlegen +- [ ] <title> und <meta description> pro Seite prüfen +- [ ] Full click-through Regression Test + - [ ] Banner sichtbar auf Hauptmenü? + - [ ] Disconnect → localStorage geleert → Redirect zu /? + - [ ] Alle Keyboard-Shortcuts funktionieren? + - [ ] Mobile Ansicht: Kacheln gestapelt? + +--- + +## EMBEDDED CONTEXT (für neuen Chat) + +Wenn du diesen Kontext in einem neuen Chat öffnest: + +1. Lies diese Datei als erstes +2. Das NÄCHSTE unmittelbare Ziel steht oben unter "NÄCHSTER SCHRITT" +3. Fertige Phasen sind unten (hier aktuell: Phase 1 + Pre-Launch Checklist) +4. Referenz-Dokumente: PLAN.md (Roadmap), SPEC.md (Tech-Spec), PRD.md (Anforderungen) +5. AGENTS.md hat die Projektstruktur und technischen Details +6. Wenn Phase 1 fertig ist → diese Datei aktualisieren, Phase 1 als done markieren, Phase 2 als nächstes setzen diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..8ad6ad0 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,3 @@ +import { defineConfig } from 'astro/config'; +import react from '@astrojs/react'; +export default defineConfig({ site: 'https://28k8.moonweb.org', integrations: [react()], output: 'static', server: { host: '0.0.0.0' }, vite: { server: { allowedHosts: true } } }); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5b57427 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5689 @@ +{ + "name": "28k8-moonweb-org", + "version": "0.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "28k8-moonweb-org", + "version": "0.2.0", + "dependencies": { + "@astrojs/react": "^3.6.0", + "astro": "^4.15.0", + "chiptune3": "^0.8.7", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "typescript": "^5.5.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz", + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.1.tgz", + "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==", + "license": "MIT" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.3.0.tgz", + "integrity": "sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==", + "license": "MIT", + "dependencies": { + "@astrojs/prism": "3.1.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.1.0", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.1", + "remark-smartypants": "^3.0.2", + "shiki": "^1.22.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz", + "integrity": "sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.29.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + } + }, + "node_modules/@astrojs/react": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.6.3.tgz", + "integrity": "sha512-5ihLQDH5Runddug5AZYlnp/Q5T81QxhwnWJXA9rchBAdh11c6UhBbv9Kdk7b2PkXoEU70CGWBP9hSh0VCR58eA==", + "license": "MIT", + "dependencies": { + "@vitejs/plugin-react": "^4.3.3", + "ultrahtml": "^1.5.3", + "vite": "^5.4.10" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + }, + "peerDependencies": { + "@types/react": "^17.0.50 || ^18.0.21", + "@types/react-dom": "^17.0.17 || ^18.0.6", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0-beta" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz", + "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.0.0", + "debug": "^4.3.4", + "dlv": "^1.1.3", + "dset": "^3.1.3", + "is-docker": "^3.0.0", + "is-wsl": "^3.0.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz", + "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "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" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", + "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", + "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", + "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz", + "integrity": "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz", + "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astro": { + "version": "4.16.19", + "resolved": "https://registry.npmjs.org/astro/-/astro-4.16.19.tgz", + "integrity": "sha512-baeSswPC5ZYvhGDoj25L2FuzKRWMgx105FetOPQVJFMCAp0o08OonYC7AhwsFdhvp7GapqjnC1Fe3lKb2lupYw==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.10.3", + "@astrojs/internal-helpers": "0.4.1", + "@astrojs/markdown-remark": "5.3.0", + "@astrojs/telemetry": "3.1.0", + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/types": "^7.26.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.1.3", + "@types/babel__core": "^7.20.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.1.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^0.7.2", + "cssesc": "^3.0.0", + "debug": "^4.3.7", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.1.1", + "diff": "^5.2.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.5.4", + "esbuild": "^0.21.5", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "flattie": "^1.1.1", + "github-slugger": "^2.0.0", + "gray-matter": "^4.0.3", + "html-escaper": "^3.0.3", + "http-cache-semantics": "^4.1.1", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.14", + "magicast": "^0.3.5", + "micromatch": "^4.0.8", + "mrmime": "^2.0.0", + "neotraverse": "^0.6.18", + "ora": "^8.1.1", + "p-limit": "^6.1.0", + "p-queue": "^8.0.1", + "preferred-pm": "^4.0.0", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.6.3", + "shiki": "^1.23.1", + "tinyexec": "^0.3.1", + "tsconfck": "^3.1.4", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3", + "vite": "^5.4.11", + "vitefu": "^1.0.4", + "which-pm": "^3.0.0", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.5", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "optionalDependencies": { + "sharp": "^0.33.3" + } + }, + "node_modules/astro/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.13.tgz", + "integrity": "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chiptune3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/chiptune3/-/chiptune3-0.8.7.tgz", + "integrity": "sha512-lFK7Lk146nijMkObg1FnWClvQLq5Ih/F+sV7bA1Cqx/9zmdTmCG8YLZIm51M/HRp4a6DfI79q1m2I1peGGjiig==", + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT", + "optional": true + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.0.tgz", + "integrity": "sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.405", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.405.tgz", + "integrity": "sha512-bNglH7lPH5l+yHOes7Zr4VqxhOy4BQ9ZBUX4VdoFgxMpzJk7W1ZoO3Vgd9Pxa9PyjQ76sfm2aKH/nzEcCNRlew==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT", + "optional": true + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/load-yaml-file/node_modules/js-yaml": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-es": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", + "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preferred-pm": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.1.1.tgz", + "integrity": "sha512-rU+ZAv1Ur9jAUZtGPebQVQPzdGhNzaEiQ7VL9+cjsAWPHFYOccNXPNiev1CCDSOg/2j7UujM7ojNhpkuILEVNQ==", + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0", + "find-yarn-workspace-root2": "1.2.16", + "which-pm": "^3.0.1" + }, + "engines": { + "node": ">=18.12" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", + "license": "MIT", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.3.tgz", + "integrity": "sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", + "license": "MIT", + "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/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shiki": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz", + "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "deprecated": "unmaintained", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ultrahtml": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", + "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.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", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which-pm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.1.tgz", + "integrity": "sha512-v2JrMq0waAI4ju1xU5x3blsxBBMgdgZve580iYMN5frDaLGjbA24fok7wKCsya8KLVO19Ju4XDc5+zTZCJkQfg==", + "license": "MIT", + "dependencies": { + "load-yaml-file": "^0.2.0" + }, + "engines": { + "node": ">=18.12" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c58070a --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "28k8-moonweb-org", + "version": "0.2.0", + "private": true, + "type": "module", + "scripts": { + "prebuild": "./prebuild.sh", + "dev": "astro dev", + "start": "astro dev", + "build": "./prebuild.sh && astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/react": "^3.6.0", + "astro": "^4.15.0", + "chiptune3": "^0.8.7", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "typescript": "^5.5.0" + } +} diff --git a/prebuild.sh b/prebuild.sh new file mode 100755 index 0000000..e4ec847 --- /dev/null +++ b/prebuild.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# prebuild.sh - Run all prebuild stages before `npm run build`. +# +# Usage: +# ./prebuild.sh # run all stages +# ./prebuild.sh mods # run only the mods fetch +# +# This script is called automatically by `npm run prebuild`. +# Each stage fetches data from external sources and writes JSON +# to src/data/. The JSON is committed to the repo so builds +# don't depend on external servers. +# +# To add a new prebuild stage: +# 1. Create tools/fetch_<name>.py (or .sh) +# 2. Have it write to src/data/<name>.json +# 3. Add a case block below +# 4. The stage will be called on next prebuild.sh run + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +STAGE="${1:-all}" + +run_stage() { + local name="$1" + local script="$2" + echo "▶ prebuild: $name" + if [ ! -f "$SCRIPT_DIR/$script" ]; then + echo " ⚠ $script not found, skipping" + return 0 + fi + python3 "$SCRIPT_DIR/$script" +} + +echo "=== prebuild.sh: running stages ===" + +if [ "$STAGE" = "all" ] || [ "$STAGE" = "mods" ]; then + run_stage "mods" "tools/fetch_mods.py" +fi + +# Add new stages here: +# if [ "$STAGE" = "all" ] || [ "$STAGE" = "releases" ]; then +# run_stage "releases" "tools/fetch_releases.py" +# fi + +echo "=== prebuild.sh: done ===" diff --git a/public/audio/README.md b/public/audio/README.md new file mode 100644 index 0000000..4991bba --- /dev/null +++ b/public/audio/README.md @@ -0,0 +1 @@ +Place the three modem intro audio clips here: dial-tone.mp3, dtmf-beeps.mp3, modem-handshake.mp3. Only sound in the project (PRD.md 5.1/6). diff --git a/public/audio/dial-tone.mp3 b/public/audio/dial-tone.mp3 new file mode 100755 index 0000000..c4e80a7 Binary files /dev/null and b/public/audio/dial-tone.mp3 differ diff --git a/public/audio/dtmf-beeps.mp3 b/public/audio/dtmf-beeps.mp3 new file mode 100755 index 0000000..53de44b Binary files /dev/null and b/public/audio/dtmf-beeps.mp3 differ diff --git a/public/audio/modem-handshake.mp3 b/public/audio/modem-handshake.mp3 new file mode 100755 index 0000000..a652eeb Binary files /dev/null and b/public/audio/modem-handshake.mp3 differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..f10aca4 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/fonts/Px437_IBM_VGA_8x16.ttf b/public/fonts/Px437_IBM_VGA_8x16.ttf new file mode 100644 index 0000000..7bee1e9 Binary files /dev/null and b/public/fonts/Px437_IBM_VGA_8x16.ttf differ diff --git a/public/fonts/Px437_IBM_VGA_8x16.woff2 b/public/fonts/Px437_IBM_VGA_8x16.woff2 new file mode 100644 index 0000000..6632afe Binary files /dev/null and b/public/fonts/Px437_IBM_VGA_8x16.woff2 differ diff --git a/public/images/README.md b/public/images/README.md new file mode 100644 index 0000000..dc1a99f --- /dev/null +++ b/public/images/README.md @@ -0,0 +1 @@ +Production web images live here. Large downloadable assets belong on files.moonweb.org (PRD.md 10). diff --git a/public/images/esprit/ArcadeDemo.png b/public/images/esprit/ArcadeDemo.png new file mode 100644 index 0000000..b02a5ef Binary files /dev/null and b/public/images/esprit/ArcadeDemo.png differ diff --git a/public/images/esprit/AscDemo.png b/public/images/esprit/AscDemo.png new file mode 100644 index 0000000..8711483 Binary files /dev/null and b/public/images/esprit/AscDemo.png differ diff --git a/public/images/esprit/BlueFieldDemo.png b/public/images/esprit/BlueFieldDemo.png new file mode 100644 index 0000000..0b2e6d3 Binary files /dev/null and b/public/images/esprit/BlueFieldDemo.png differ diff --git a/public/images/esprit/EspritDemo.png b/public/images/esprit/EspritDemo.png new file mode 100644 index 0000000..f7dfe4e Binary files /dev/null and b/public/images/esprit/EspritDemo.png differ diff --git a/public/images/esprit/SaturdayDemo.png b/public/images/esprit/SaturdayDemo.png new file mode 100644 index 0000000..6d4606d Binary files /dev/null and b/public/images/esprit/SaturdayDemo.png differ diff --git a/public/images/phobia-header.png b/public/images/phobia-header.png new file mode 100755 index 0000000..3996988 Binary files /dev/null and b/public/images/phobia-header.png differ diff --git a/public/images/skyline-header.png b/public/images/skyline-header.png new file mode 100755 index 0000000..4db3874 Binary files /dev/null and b/public/images/skyline-header.png differ diff --git a/public/images/trancemission-header.png b/public/images/trancemission-header.png new file mode 100755 index 0000000..0f0d664 Binary files /dev/null and b/public/images/trancemission-header.png differ diff --git a/public/js/chiptune3.js b/public/js/chiptune3.js new file mode 100644 index 0000000..eb17194 --- /dev/null +++ b/public/js/chiptune3.js @@ -0,0 +1,124 @@ +/* + chiptune3 (worklet version) - patched for <script> loading + Source: npm chiptune3, only export+import.meta.url changed +*/ + +const defaultCfg = { + repeatCount: -1, + stereoSeparation: 100, + interpolationFilter: 0, + context: false, +} + +class ChiptuneJsPlayer { + constructor(cfg) { + this.config = {...defaultCfg, ...cfg} + + if (this.config.context) { + if (!this.config.context.destination) { + throw('ChiptuneJsPlayer: This is not an audio context') + } + this.context = this.config.context + this.destination = false + } else { + this.context = new AudioContext() + this.destination = this.context.destination + } + delete this.config.context + + this.gain = this.context.createGain() + this.gain.gain.value = 1 + + this.handlers = [] + + this.context.audioWorklet.addModule('/js/chiptune3.worklet.js') + .then(()=>{ + this.processNode = new AudioWorkletNode(this.context, 'libopenmpt-processor', { + numberOfInputs: 0, + numberOfOutputs: 1, + outputChannelCount: [2] + }) + this.processNode.port.onmessage = this.handleMessage_.bind(this) + this.processNode.port.postMessage({cmd:'config', val:this.config}) + this.fireEvent('onInitialized') + + this.processNode.connect(this.gain) + if (this.destination) this.gain.connect(this.destination) + }) + .catch(e=>console.error(e)) + } + + handleMessage_(msg) { + switch (msg.data.cmd) { + case 'meta': + this.meta = msg.data.meta + this.duration = msg.data.meta.dur + this.fireEvent('onMetadata', this.meta) + break + case 'pos': + this.currentTime = msg.data.pos + this.order = msg.data.order + this.pattern = msg.data.pattern + this.row = msg.data.row + this.fireEvent('onProgress', msg.data) + break + case 'end': + this.fireEvent('onEnded') + break + case 'err': + this.fireEvent('onError', {type: msg.data.val}) + break + case 'fullAudioData': + this.fireEvent('onFullAudioData', msg.data) + break + default: + console.log('Received unknown message',msg.data) + } + } + + fireEvent(eventName, response) { + const handlers = this.handlers + if (handlers.length) { + handlers.forEach(function (handler) { + if (handler.eventName === eventName) { + handler.handler(response) + } + }) + } + } + addHandler(eventName, handler) { this.handlers.push({eventName: eventName, handler: handler}) } + onInitialized(handler) { this.addHandler('onInitialized', handler) } + onEnded(handler) { this.addHandler('onEnded', handler) } + onError(handler) { this.addHandler('onError', handler) } + onMetadata(handler) { this.addHandler('onMetadata', handler) } + onProgress(handler) { this.addHandler('onProgress', handler) } + onFullAudioData(handler) { this.addHandler('onFullAudioData', handler) } + + postMsg(cmd, val) { + if (this.processNode) + this.processNode.port.postMessage({cmd:cmd,val:val}) + } + load(url) { + fetch(url) + .then(response => response.arrayBuffer()) + .then(arrayBuffer => this.play(arrayBuffer)) + .catch(e=>{this.fireEvent('onError', {type: 'Load'})}) + } + play(val) { this.postMsg('play', val) } + stop() { this.postMsg('stop') } + pause() { this.postMsg('pause') } + unpause() { this.postMsg('unpause') } + togglePause() { this.postMsg('togglePause') } + setRepeatCount(val) { this.postMsg('repeatCount', val) } + setPitch(val) { this.postMsg('setPitch', val) } + setTempo(val) { this.postMsg('setTempo', val) } + setPos(val) { this.postMsg('setPos', val) } + setOrderRow(o,r) { this.postMsg('setOrderRow', {o:o,r:r}) } + setVol(val) { this.gain.gain.value = val } + selectSubsong(val) { this.postMsg('selectSubsong', val) } + seek(val) { this.setPos(val) } + getCurrentTime() { return this.currentTime } + decodeAll(ab) { this.postMsg('decodeAll', ab) } +} + +window.ChiptuneJsPlayer = ChiptuneJsPlayer; diff --git a/public/js/chiptune3.worklet.js b/public/js/chiptune3.worklet.js new file mode 100644 index 0000000..285b067 --- /dev/null +++ b/public/js/chiptune3.worklet.js @@ -0,0 +1,362 @@ +/* + AudioWorklet: DrSnuggles +*/ + +import libopenmptPromise from './libopenmpt.worklet.js' + +// consts +const OPENMPT_MODULE_RENDER_STEREOSEPARATION_PERCENT = 2 +const OPENMPT_MODULE_RENDER_INTERPOLATIONFILTER_LENGTH = 3 + +// vars +let libopenmpt + +// init +libopenmptPromise() +.then(res => { + libopenmpt = res + + if (!libopenmpt.stackSave) return + // set libopenmpt version to display later + let stack = libopenmpt.stackSave() + libopenmpt.version = libopenmpt.UTF8ToString(libopenmpt._openmpt_get_string(asciiToStack('library_version'))) + libopenmpt.build = libopenmpt.UTF8ToString(libopenmpt._openmpt_get_string(asciiToStack('build'))) + libopenmpt.stackRestore(stack) +}) +.catch(e => console.error(e)) + +// +// Helpers +// +function asciiToStack(str) { + const stackStr = libopenmpt.stackAlloc(str.length + 1) // DrS: needed to export in emscripten + writeAsciiToMemory(str, stackStr) // no longer in Emscripten, see below + return stackStr +} +function writeAsciiToMemory(str,buffer,dontAddNull){for(let i=0;i<str.length;++i){libopenmpt.HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)libopenmpt.HEAP8[buffer>>0]=0} + + +// +// Processor +// +class MPT extends AudioWorkletProcessor { + constructor() { + super() + this.port.onmessage = this.handleMessage_.bind(this) + this.paused = false + this.config = { + repeatCount: -1, // -1 = play endless, 0 = play once, do not repeat + stereoSeparation: 100, // percents + interpolationFilter: 0, // https://lib.openmpt.org/doc/group__openmpt__module__render__param.html + } + this.channels = 0 + } + + process(inputList, outputList, parameters) { + if (!this.modulePtr || !this.leftPtr || !this.rightPtr || this.paused) return true //silence + + const left = outputList[0][0] + const right = outputList[0][1] + + const actualFramesPerChunk = libopenmpt._openmpt_module_read_float_stereo(this.modulePtr, sampleRate, left.length, this.leftPtr, this.rightPtr) + if (actualFramesPerChunk == 0) { + //this.paused = true + // modulePtr will be 0 on openmpt: error: openmpt_module_read_float_stereo: ERROR: module * not valid or other openmpt error + const error = !this.modulePtr + if (error) { + this.port.postMessage({cmd:'err',val:'Process'}) + } else { + this.port.postMessage({cmd:'end'}) + } + return true + } + + left.set(libopenmpt.HEAPF32.subarray(this.leftPtr / 4, this.leftPtr / 4 + actualFramesPerChunk)) + right.set(libopenmpt.HEAPF32.subarray(this.rightPtr / 4, this.rightPtr / 4 + actualFramesPerChunk)) + + // post progress + // openmpt_module_get_current_order + + let msg = { + cmd: 'pos', + pos: libopenmpt._openmpt_module_get_position_seconds(this.modulePtr), + // pos in song + order: libopenmpt._openmpt_module_get_current_order(this.modulePtr), + pattern: libopenmpt._openmpt_module_get_current_pattern(this.modulePtr), + row: libopenmpt._openmpt_module_get_current_row(this.modulePtr), + // channel volumes + //chVol: [], // ch0Left, ch0Right, ch1Left, ... + } + /* + for (let i = 0; i < this.channels; i++) { + msg.chVol.push( { + left: libopenmpt._openmpt_module_get_current_channel_vu_left(this.modulePtr, i), + right: libopenmpt._openmpt_module_get_current_channel_vu_right(this.modulePtr, i), + }) + } + */ + + this.port.postMessage( msg ) + + return true // def. needed for Chrome + } + + handleMessage_(msg) { + //console.log('[Processor:Received]',msg.data) + const v = msg.data.val + switch (msg.data.cmd) { + case 'config': + this.config = v + break + case 'play': + this.play(v, false) + break + case 'pause': + this.paused = true + break + case 'unpause': + this.paused = false + break + case 'togglePause': + this.paused = !this.paused + break + case 'stop': + this.stop() + break + case 'meta': + this.meta() + break + case 'repeatCount': + this.config.repeatCount = v + if (!this.modulePtr) return + libopenmpt._openmpt_module_set_repeat_count(this.modulePtr, this.config.repeatCount) + break + case 'setPitch': + if (!libopenmpt.stackSave || !this.modulePtr) return + libopenmpt._openmpt_module_ctl_set(this.modulePtr, asciiToStack('play.pitch_factor'), asciiToStack(v.toString())) + break + case 'setTempo': + if (!libopenmpt.stackSave || !this.modulePtr) return + libopenmpt._openmpt_module_ctl_set(this.modulePtr, asciiToStack('play.tempo_factor'), asciiToStack(v.toString())) + break + case 'selectSubsong': + if (!this.modulePtr) return + libopenmpt._openmpt_module_select_subsong(this.modulePtr, v) + //this.meta() + break + case 'setPos': + if (!this.modulePtr) return + libopenmpt._openmpt_module_set_position_seconds(this.modulePtr, v) + break + case 'setOrderRow': + if (!this.modulePtr) return + libopenmpt._openmpt_module_set_position_order_row(this.modulePtr, v.o, v.r) + break + /* + case 'toggleMute' + // openmpt_module_ext_get_interface(mod_ext, interface_id, interface, interface_size) + // openmpt_module_ext_interface_interactive + // set_channel_mute_status + // https://lib.openmpt.org/doc/group__libopenmpt__ext__c.html#ga0275a35da407cd092232a20d3535c9e4 + if (!this.modulePtr) return + //const extPtr = libopenmpt.openmpt_module_ext_get_interface(mod_ext, interface_id, interface, interface_size) + break + */ + case 'decodeAll': + this.decodeAll(v) + break + default: + console.log('Received unknown message',msg.data) + } + } // handleMessage_ + + decodeAll(buffer) { + this.play(buffer, true) + + // now build the full audioData + const left = [], right = [] + const maxFramesPerChunk = 128 + let actualFramesPerChunk = libopenmpt._openmpt_module_read_float_stereo(this.modulePtr, sampleRate, maxFramesPerChunk, this.leftPtr, this.rightPtr) + while (actualFramesPerChunk != 0) { + left.push( ...libopenmpt.HEAPF32.subarray(this.leftPtr / 4, this.leftPtr / 4 + actualFramesPerChunk) ) + right.push( ...libopenmpt.HEAPF32.subarray(this.rightPtr / 4, this.rightPtr / 4 + actualFramesPerChunk) ) + actualFramesPerChunk = libopenmpt._openmpt_module_read_float_stereo(this.modulePtr, sampleRate, maxFramesPerChunk, this.leftPtr, this.rightPtr) + } + + // post final data + let msg = { + cmd: 'fullAudioData', + meta: this.getMeta(), + data: [left,right] + } + this.port.postMessage( msg ) + + this.stop() + } + + play(buffer, paused = false) { + this.stop() + + const maxFramesPerChunk = 128 // thats what worklet is using + const byteArray = new Int8Array(buffer) + const ptrToFile = libopenmpt._malloc(byteArray.byteLength) + libopenmpt.HEAPU8.set(byteArray, ptrToFile) + this.modulePtr = libopenmpt._openmpt_module_create_from_memory(ptrToFile, byteArray.byteLength, 0, 0, 0) + + if(this.modulePtr === 0) { + // could not create module + this.port.postMessage({cmd:'err',val:'ptr'}) + return + } + + if (libopenmpt.stackSave) { + const stack = libopenmpt.stackSave() + libopenmpt._openmpt_module_ctl_set(this.modulePtr, asciiToStack('render.resampler.emulate_amiga'), asciiToStack('1')) + libopenmpt._openmpt_module_ctl_set(this.modulePtr, asciiToStack('render.resampler.emulate_amiga_type'), asciiToStack('a1200')) + //libopenmpt._openmpt_module_ctl_set('play.pitch_factor', e.target.value.toString()); + + libopenmpt.stackRestore(stack) + } + + this.paused = paused + this.leftPtr = libopenmpt._malloc(4 * maxFramesPerChunk) // 4x = float + this.rightPtr = libopenmpt._malloc(4 * maxFramesPerChunk) + + // set config options on module + libopenmpt._openmpt_module_set_repeat_count(this.modulePtr, this.config.repeatCount) + libopenmpt._openmpt_module_set_render_param(this.modulePtr, OPENMPT_MODULE_RENDER_STEREOSEPARATION_PERCENT, this.config.stereoSeparation) + libopenmpt._openmpt_module_set_render_param(this.modulePtr, OPENMPT_MODULE_RENDER_INTERPOLATIONFILTER_LENGTH, this.config.interpolationFilter) + + // post back tracks metadata + if (!paused) this.meta() + } + stop() { + if (!this.modulePtr) return + if (this.modulePtr != 0) { + libopenmpt._openmpt_module_destroy(this.modulePtr) + this.modulePtr = 0 + } + if (this.leftBufferPtr != 0) { + libopenmpt._free(this.leftBufferPtr) + this.leftBufferPtr = 0 + } + if (this.rightBufferPtr != 0) { + libopenmpt._free(this.rightBufferPtr) + this.rightBufferPtr = 0 + } + this.channels = 0 + } + meta() { + this.port.postMessage({cmd: 'meta', meta: this.getMeta()}) + } + getSong() { + if (!libopenmpt.UTF8ToString || !this.modulePtr) return false + + // https://lib.openmpt.org/doc/ + let song = { + channels: [], + instruments: [], + samples: [], + orders: [], + numSubsongs: libopenmpt._openmpt_module_get_num_subsongs(this.modulePtr), + patterns: [], + } + // channels + const chNum = libopenmpt._openmpt_module_get_num_channels(this.modulePtr) + this.channel = chNum + for (let i = 0; i < chNum; i++) { + song.channels.push( libopenmpt.UTF8ToString(libopenmpt._openmpt_module_get_channel_name(this.modulePtr, i)) ) + } + // instruments + for (let i = 0, e = libopenmpt._openmpt_module_get_num_instruments(this.modulePtr); i < e; i++) { + song.instruments.push( libopenmpt.UTF8ToString(libopenmpt._openmpt_module_get_instrument_name(this.modulePtr, i)) ) + } + // samples + for (let i = 0, e = libopenmpt._openmpt_module_get_num_samples(this.modulePtr); i < e; i++) { + song.samples.push( libopenmpt.UTF8ToString(libopenmpt._openmpt_module_get_sample_name(this.modulePtr, i)) ) + } + // orders + for (let i = 0, e = libopenmpt._openmpt_module_get_num_orders(this.modulePtr); i < e; i++) { + song.orders.push( { + name: libopenmpt.UTF8ToString(libopenmpt._openmpt_module_get_order_name(this.modulePtr, i)), + pat: libopenmpt._openmpt_module_get_order_pattern(this.modulePtr, i), + }) + } + // patterns + for (let patIdx = 0, patNum = libopenmpt._openmpt_module_get_num_patterns(this.modulePtr); patIdx < patNum; patIdx++) { + const pattern = { + name: libopenmpt.UTF8ToString(libopenmpt._openmpt_module_get_pattern_name(this.modulePtr, patIdx)), + rows: [], + } + // rows + for(let rowIdx = 0, rowNum = libopenmpt._openmpt_module_get_pattern_num_rows(this.modulePtr, patIdx); rowIdx < rowNum; rowIdx++) { + const row = [] + // channels + for (let chIdx = 0; chIdx < chNum; chIdx++) { + const channel = [] + for (let comIdx = 0; comIdx < 6; comIdx++) { + /* commands + OPENMPT_MODULE_COMMAND_NOTE = 0 + OPENMPT_MODULE_COMMAND_INSTRUMENT = 1 + OPENMPT_MODULE_COMMAND_VOLUMEEFFECT = 2 + OPENMPT_MODULE_COMMAND_EFFECT = 3 + OPENMPT_MODULE_COMMAND_VOLUME = 4 + OPENMPT_MODULE_COMMAND_PARAMETER = 5 + */ + channel.push( libopenmpt._openmpt_module_get_pattern_row_channel_command(this.modulePtr, patIdx, rowIdx, chIdx, comIdx) ) + } + row.push( channel ) + } + pattern.rows.push( row ) + } + song.patterns.push( pattern ) + } + + + return song + } + getMeta() { + if (!libopenmpt.UTF8ToString || !this.modulePtr) return false + + const data = {} + data.dur = libopenmpt._openmpt_module_get_duration_seconds(this.modulePtr) + if (data.dur == 0) { + // looks like an error occured reading the mod + this.port.postMessage({cmd:'err',val:'dur'}) + } + const keys = libopenmpt.UTF8ToString(libopenmpt._openmpt_module_get_metadata_keys(this.modulePtr)).split(';') + for (let i = 0; i < keys.length; i++) { + const keyNameBuffer = libopenmpt._malloc(keys[i].length + 1) + writeAsciiToMemory(keys[i], keyNameBuffer) + data[keys[i]] = libopenmpt.UTF8ToString(libopenmpt._openmpt_module_get_metadata(this.modulePtr, keyNameBuffer)) + libopenmpt._free(keyNameBuffer) + } + data.song = this.getSong() + data.totalOrders = data.song.orders.length // libopenmpt._openmpt_module_get_num_orders(this.modulePtr) + data.totalPatterns = data.song.patterns.length// libopenmpt._openmpt_module_get_num_patterns(this.modulePtr) + data.songs = this.getSongs() + data.libopenmptVersion = libopenmpt.version + data.libopenmptBuild = libopenmpt.build + return data + } + getSongs() { + if (!libopenmpt.UTF8ToString) return '' // todo: ?? why string here + + const subsongs = libopenmpt._openmpt_module_get_num_subsongs(this.modulePtr) + const names = [] + for (let i = 0; i < subsongs; i++) { + const namePtr = libopenmpt._openmpt_module_get_subsong_name(this.modulePtr, i) + const name = libopenmpt.UTF8ToString(namePtr) + if(name != "") { + names.push(name) + } else { + names.push("Subsong " + (i + 1)) + } + libopenmpt._openmpt_free_string(namePtr) + } + return names + } + +} + +registerProcessor('libopenmpt-processor', MPT) \ No newline at end of file diff --git a/public/js/libopenmpt.worklet.js b/public/js/libopenmpt.worklet.js new file mode 100644 index 0000000..e46fe18 Binary files /dev/null and b/public/js/libopenmpt.worklet.js differ diff --git a/public/og-image.png b/public/og-image.png new file mode 100644 index 0000000..20c9729 Binary files /dev/null and b/public/og-image.png differ diff --git a/source-assets/ansi/logged.ans b/source-assets/ansi/logged.ans new file mode 100644 index 0000000..0032a0d --- /dev/null +++ b/source-assets/ansi/logged.ans @@ -0,0 +1,16 @@ +[?7h + +۲ +۲ + +         + +       + ܱ ܱ ܱ ܱܱ  +       +     +   +OUT    OF [mJ] +     +tHE tEMPLE bBS + diff --git a/source-assets/ansi/mainbase.ans b/source-assets/ansi/mainbase.ans new file mode 100644 index 0000000..cfbef3b --- /dev/null +++ b/source-assets/ansi/mainbase.ans @@ -0,0 +1 @@ +[?7h       %A%%F%.%D%a.%U% rf.%S% ei..%Nal...%ced.f. hto.i.  %aaw.l. %ngnuen%gglpse.eeolewt.raoafH%.dariE%.dcl.%.he%%.s%%%. %W%% .%R% t.%P%E..%C%M...%O%P....%M%Lw..s.%1%Er.py..%2.iras...%%tegoo... %eaepn... %dclob. .msoinu.bsmymnlijBgssmeiloS.goeundi.%.pnse.n%%.temc.%%%.rsoc!%%.gno% %%.fn. B%%.fl %L%%.o.%3%g..%ob..fbl.f[sau.Mlss%Jite ]sur tss eeerrt.su%.p%.% \ No newline at end of file diff --git a/source-assets/ansi/skyline.ans b/source-assets/ansi/skyline.ans new file mode 100644 index 0000000..f7649b5 --- /dev/null +++ b/source-assets/ansi/skyline.ans @@ -0,0 +1,8 @@ +[?7h + + +Ŀ  +  ĿĿĿĿĴ Ŀ Ĵ ĴĴĴ   +ĿFILESDATABASE MISCELLANEOUS  SYSOP OPTIONS Ĵ(C)hange file area (M)essage system (T)ime on system (&) Add Filedesc. (F)ile descriptions(Q)uestionnaire (O)perator chat (*) Read Sysoplog (P)rogram directory(A)nsi color on/off(S)earch for File (Z)ippy file scan (V)iew bulletins (X)pert mode toggle(L)og Drive(D)ownload file(s) (H)elp with BBS (+) Trap Doors(U)pload file(s) (K)nown caller log(G)oodbye log off (E)cho Mail + + \ No newline at end of file diff --git a/source-assets/ansi/temple3.ans b/source-assets/ansi/temple3.ans new file mode 100644 index 0000000..43c18b6 --- /dev/null +++ b/source-assets/ansi/temple3.ans @@ -0,0 +1,50 @@ +[?7h   +    + ߱ ߱   +    +   +MULTI-NET-SERVER AUGSBURG - ONLINE: 2.00 - 5.30 - MAILONLY + + +[ Regular Nets ]Ŀ +TelefonNet......49:821/416484FidoNet............2:2480/330 + + +[ Fido Clone Nets ]Ŀ +XcessNet.........213:315/8630NightNet......1000:10499/3033 + + +[ Nets with single Topics ]Ŀ +KingsNet.........900:4990/115Sysopnet.........129:1492/130 +SF-net............142:106/830Ravenet...........303:498/330 +Gernet.............21:496/330MedNet...........80:4091/9177 +MediaNet..........24:2510/220PressNet.........193:2490/120 + + +[ Special Nets ]Ŀ +999er-MBG............999:2/56BavariaNet.........95:106/113 + + +[ Chat Nets ]Ŀ +UP-Net............??:498/soonTacoNet............31:4990/22 +PseudoNet...........33:104/20FFNet..............60:666/330 +Phantasy Net.....202:498/3030BierNet............44:510/230 + + +[ Demo Nets ]Ŀ +AquaNet...........139:5050/41Scene-Net..........99:200/530 + + +ĿĿĿ ĿĿĿĿĿĿ ĿĿĿ + t  H  E  t  E  M  P  L  E  b  B  S  + +THE DEMOBOARD IN AUGSBURG - FREQ FILES - FREE POINTS AND DOWNLINKS + + + + + + + + + \ No newline at end of file diff --git a/source-assets/ansi/ttbmjban.ans b/source-assets/ansi/ttbmjban.ans new file mode 100644 index 0000000..8274b6c --- /dev/null +++ b/source-assets/ansi/ttbmjban.ans @@ -0,0 +1,25 @@ +[?7h + + ۲  ۲  +  ۲ + ۲   + tHE    +  ۲   +۲   +  ۲ bBS +  + ۲  ۲ +  [mJ] + +^` ^` oooooooooooooooooooo ^` ^` + + t H E t E M P L E b B S  + + line1+498212191038v34+line2+498212191036isdn + +stonedbrainrecordsmemberboardszenenet2ndhq +net-serverhostbayernscenenetcomanetoanet8bitnet +expressiondistsiteaironlinesupportsite +freqnetinfo + +^` ^` uuuuuuuuuuuuuuuuuuuu ^` ^` diff --git a/source-assets/welcome-utf8.txt b/source-assets/welcome-utf8.txt new file mode 100644 index 0000000..e8d5599 --- /dev/null +++ b/source-assets/welcome-utf8.txt @@ -0,0 +1,8 @@ + ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄ ▄▄▄ ▄ ▄▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄ + THE █████ ▄███ ████▀▄▀█ █████ █ ████ █████ BBS + █████ █████ ████ █ █████ █ ████ █████ + █████ █████▀ ████ █ █████▀ ████ █████▀ + █████ █████ ████ █ █████ ████ ▀████ + █████ █████▄ ████ █ █████ █████▄ ▀██▄ + + t H E t E M P L E b B S diff --git a/source-assets/welcome.txt b/source-assets/welcome.txt new file mode 100755 index 0000000..47bed62 --- /dev/null +++ b/source-assets/welcome.txt @@ -0,0 +1,7 @@ + + THE BBS + + + + + diff --git a/src/components/AnsiArt.astro b/src/components/AnsiArt.astro new file mode 100644 index 0000000..a6d36e3 --- /dev/null +++ b/src/components/AnsiArt.astro @@ -0,0 +1,5 @@ +--- +export interface Props { html: string; } +const { html } = Astro.props; +--- +<Fragment set:html={html} /> diff --git a/src/components/LetterFooter.astro b/src/components/LetterFooter.astro new file mode 100644 index 0000000..a7fd98b --- /dev/null +++ b/src/components/LetterFooter.astro @@ -0,0 +1,8 @@ +--- +const letters = ['t', 'H', 'E', ' ', 't', 'E', 'M', 'P', 'L', 'E', ' ', 'b', 'B', 'S']; +--- +<div class="letter-footer" aria-hidden="true"> + {letters.map((l) => l === ' ' ? <span class="letter-space">{'\u00A0'}</span> : <span>{l}</span>)} + <a href="/" onclick="localStorage.removeItem('hasConnected');">[Q] Disconnect</a> + <a href="/bbs/legal-notice">[I] Legal Notice</a> +</div> diff --git a/src/components/ModPlayer.tsx b/src/components/ModPlayer.tsx new file mode 100644 index 0000000..d8aca56 --- /dev/null +++ b/src/components/ModPlayer.tsx @@ -0,0 +1,142 @@ +import { useState, useRef, useCallback } from 'react'; + +export interface ModEntry { + name: string; + title: string; + size_human: string; + channels: number; + sample_count: number; + modified: string; + url: string; +} + +declare global { + interface Window { + ChiptuneJsPlayer: any; + } +} + +function loadScript(src: string): Promise<void> { + return new Promise((resolve, reject) => { + if (document.querySelector(`script[src="${src}"]`)) { resolve(); return; } + const s = document.createElement('script'); + s.src = src; + s.onload = () => resolve(); + s.onerror = () => reject(new Error(`Failed to load ${src}`)); + document.head.appendChild(s); + }); +} + +async function getPlayer(): Promise<any> { + await loadScript('/js/chiptune3.js'); + return new Promise<any>((resolve) => { + const p = new window.ChiptuneJsPlayer({ repeatCount: 0 }); + p.onInitialized(() => resolve(p)); + }); +} + +export default function ModPlayer({ mods }: { mods: ModEntry[] }) { + const [currentIdx, setCurrentIdx] = useState(-1); + const [playing, setPlaying] = useState(false); + const [ready, setReady] = useState(false); + const playerRef = useRef<any>(null); + const loadingRef = useRef(false); + + const ensurePlayer = useCallback(async () => { + if (playerRef.current) return playerRef.current; + if (loadingRef.current) return null; + loadingRef.current = true; + try { + const p = await getPlayer(); + p.onEnded(() => { + setCurrentIdx((prev) => { + const next = prev + 1; + if (next < mods.length) { + p.setRepeatCount(0); + p.load(mods[next].url); + return next; + } + setPlaying(false); + return -1; + }); + }); + playerRef.current = p; + setReady(true); + return p; + } catch (e) { + console.error('MOD player init failed:', e); + loadingRef.current = false; + return null; + } + }, [mods]); + + const playIdx = useCallback(async (idx: number) => { + if (idx < 0 || idx >= mods.length) return; + const p = await ensurePlayer(); + if (!p) return; + p.setRepeatCount(0); + p.load(mods[idx].url); + setCurrentIdx(idx); + setPlaying(true); + }, [mods, ensurePlayer]); + + async function togglePlay(idx: number) { + const p = playerRef.current; + if (currentIdx === idx && playing) { + p?.pause(); + setPlaying(false); + } else if (currentIdx === idx && !playing) { + p?.unpause(); + setPlaying(true); + } else { + playIdx(idx); + } + } + + function prev() { + if (currentIdx > 0) playIdx(currentIdx - 1); + } + + function next() { + if (currentIdx < mods.length - 1) playIdx(currentIdx + 1); + } + + const current = currentIdx >= 0 ? mods[currentIdx] : null; + + return ( + <div className="mod-player"> + <div className="mod-player-nowplaying"> + <span className="mod-player-label">NOW PLAYING:</span>{' '} + {current + ? <span className="mod-player-track">{current.title} <span className="mod-player-file">({current.name})</span></span> + : <span className="mod-player-idle">-- nothing selected --</span> + } + <span className="mod-player-controls"> + <button onClick={prev} disabled={currentIdx <= 0} className="mod-btn" title="Previous">|<<</button> + <button onClick={() => currentIdx >= 0 ? togglePlay(currentIdx) : playIdx(0)} className="mod-btn mod-btn-play" title={playing ? 'Pause' : 'Play'}> + {playing ? '⏸' : '▶'} + </button> + <button onClick={next} disabled={currentIdx >= mods.length - 1} className="mod-btn" title="Next">>>|</button> + </span> + </div> + <table className="mod-list"> + <tbody> + {mods.map((m, i) => ( + <tr key={m.name} className={currentIdx === i ? 'mod-active' : ''}> + <td className="mod-col-play"> + <button onClick={() => togglePlay(i)} className="mod-btn-inline" title={currentIdx === i && playing ? 'Pause' : 'Play'}> + {currentIdx === i && playing ? '⏸' : '▶'} + </button> + </td> + <td className="mod-col-file">[F] {m.name}</td> + <td className="mod-col-title">{m.title}</td> + <td className="mod-col-ch">{m.channels}ch</td> + <td className="mod-col-size">{m.size_human}</td> + <td><a href={m.url}>[D]ownload</a></td> + </tr> + ))} + </tbody> + </table> + </div> + ); +} diff --git a/src/components/ModemIntro.tsx b/src/components/ModemIntro.tsx new file mode 100644 index 0000000..71b0a47 --- /dev/null +++ b/src/components/ModemIntro.tsx @@ -0,0 +1,22 @@ +import { useState } from 'react'; +import { playLine1Sequence, markConnected } from '../lib/sound'; +type DialState = 'idle' | 'dialing'; +export default function ModemIntro() { + const [state, setState] = useState<DialState>('idle'); + function selectLine(line: 1 | 2) { + if (line === 2) { markConnected(); window.location.href = '/bbs/'; return; } + setState('dialing'); + playLine1Sequence(() => { markConnected(); window.location.href = '/bbs/'; }); + } + return ( + <div className="ansi-text welcome-modem" role="region" aria-label="Modem connect intro"> + <pre style={{ textAlign: 'center' }}>{`+------------------------------------------+ +| 28k8 [MODEM] ATDT +49-821-2191-038 | ++------------------------------------------+`}</pre> + {state === 'idle' && ( + <pre style={{ textAlign: 'center' }}><a href="#" onClick={(e) => { e.preventDefault(); selectLine(1); }}>{`> Line 1: +49-821-2191-038 [VFC V34] 28800 <`}</a>{'\n\n'}<a href="#" onClick={(e) => { e.preventDefault(); selectLine(2); }}>{`> Line 2: +49-821-2191-036 [X75] 64000 <`}</a></pre> + )} + {state === 'dialing' && <p style={{ textAlign: 'center' }}>Dialing... please wait.</p>} + </div> + ); +} diff --git a/src/components/NavBar.astro b/src/components/NavBar.astro new file mode 100644 index 0000000..5b7c442 --- /dev/null +++ b/src/components/NavBar.astro @@ -0,0 +1,7 @@ +--- +export interface Props { showBack?: boolean; } +const { showBack = true } = Astro.props; +--- +<div class="nav-bar"> + {showBack && <a href="#" onclick="event.preventDefault(); history.back();">[B] Back</a>} +</div> diff --git a/src/components/StatusBar.astro b/src/components/StatusBar.astro new file mode 100644 index 0000000..7e60956 --- /dev/null +++ b/src/components/StatusBar.astro @@ -0,0 +1,5 @@ +--- +const now = new Date(); +const dateStr = `${String(now.getDate()).padStart(2, '0')}.${String(now.getMonth() + 1).padStart(2, '0')}.1994`; +--- +<div class="status-bar" style="display: flex; justify-content: space-between;"><span>Status: 28800 bps | Line: V34 | 28k8.moonweb.org</span><span>{dateStr}</span></div> diff --git a/src/components/TerminalShell.tsx b/src/components/TerminalShell.tsx new file mode 100644 index 0000000..354d62c --- /dev/null +++ b/src/components/TerminalShell.tsx @@ -0,0 +1,18 @@ +import { useEffect } from 'react'; +import { findKeyEntry } from '../lib/keymap'; +import { resetConnected } from '../lib/sound'; +export default function TerminalShell({ children }: { children?: React.ReactNode }) { + useEffect(() => { + function onKeyDown(e: KeyboardEvent) { + if (e.metaKey || e.ctrlKey || e.altKey) return; + const entry = findKeyEntry(e.key); + if (!entry) return; + if (entry.href === 'back') { window.history.back(); return; } + if (entry.href === 'disconnect') { resetConnected(); window.location.href = '/'; return; } + window.location.href = entry.href; + } + window.addEventListener('keydown', onKeyDown); + return () => window.removeEventListener('keydown', onKeyDown); + }, []); + return <>{children}</>; +} diff --git a/src/components/TextOverlay.astro b/src/components/TextOverlay.astro new file mode 100644 index 0000000..02389e2 --- /dev/null +++ b/src/components/TextOverlay.astro @@ -0,0 +1,27 @@ +--- +interface Props { + title: string; + content: string; +} +const { title, content } = Astro.props; +const id = `overlay-${title.toLowerCase().replace(/[^a-z0-9]/gi, '-')}`; +--- +<button class="text-overlay-btn" data-overlay={id}> + {title} +</button> +<style> + .text-overlay-btn { + background: none; + border: 1px solid var(--red-dark); + color: var(--fg); + font-family: var(--font-ansi); + padding: 0.25rem 0.6rem; + cursor: pointer; + font-size: inherit; + display: inline; + } + .text-overlay-btn:hover { + border-color: var(--red-bright); + color: var(--red-bright); + } +</style> diff --git a/src/components/TextOverlayScript.astro b/src/components/TextOverlayScript.astro new file mode 100644 index 0000000..379ebf6 --- /dev/null +++ b/src/components/TextOverlayScript.astro @@ -0,0 +1,125 @@ +--- +interface OverlayEntry { + id: string; + title: string; + content: string; +} +interface Props { + overlays: OverlayEntry[]; +} +const { overlays } = Astro.props; +const data = JSON.stringify(overlays); +--- +<script define:vars={{ data }}> + window.__textOverlays = JSON.parse(data); +</script> +<script> + function initOverlays() { + document.querySelectorAll('.text-overlay-btn').forEach((btn) => { + btn.addEventListener('click', () => { + const id = btn.getAttribute('data-overlay'); + let dialog = document.getElementById(id) as HTMLDialogElement; + if (!dialog) { + const entry = window.__textOverlays.find((o) => o.id === id); + if (!entry) return; + dialog = document.createElement('dialog'); + dialog.className = 'text-overlay'; + dialog.id = id; + const titleHtml = document.createElement('span'); + titleHtml.textContent = entry.title; + const contentPre = document.createElement('pre'); + contentPre.className = 'text-overlay-content'; + contentPre.textContent = entry.content; + const headerDiv = document.createElement('div'); + headerDiv.className = 'text-overlay-header'; + headerDiv.appendChild(titleHtml); + const closeBtn = document.createElement('button'); + closeBtn.className = 'text-overlay-close'; + closeBtn.textContent = '[X]'; + headerDiv.appendChild(closeBtn); + const innerDiv = document.createElement('div'); + innerDiv.className = 'text-overlay-inner'; + innerDiv.appendChild(headerDiv); + innerDiv.appendChild(contentPre); + dialog.appendChild(innerDiv); + document.body.appendChild(dialog); + closeBtn.addEventListener('click', () => dialog.close()); + dialog.addEventListener('click', (e) => { + if (e.target === dialog) dialog.close(); + }); + } + dialog.showModal(); + }); + }); + } + initOverlays(); + document.addEventListener('astro:page-load', initOverlays); +</script> +<style is:global> + .text-overlay { + background: #000; + color: #ffb000; + border: 2px solid var(--red-dark); + padding: 0; + max-width: 90vw; + height: 80vh; + width: 80ch; + overflow: hidden; + } + .text-overlay::backdrop { + background: rgba(0, 0, 0, 0.85); + } + .text-overlay-inner { + display: flex; + flex-direction: column; + height: 100%; + } + .text-overlay-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.5rem 0.75rem; + border-bottom: 1px solid var(--red-dark); + font-family: var(--font-ansi); + color: var(--red-bright); + flex-shrink: 0; + } + .text-overlay-close { + background: none; + border: none; + color: var(--red-bright); + font-family: var(--font-ansi); + cursor: pointer; + padding: 0; + font-size: inherit; + } + .text-overlay-close:hover { + color: #fff; + } + .text-overlay-content { + margin: 0; + padding: 0.75rem; + font-family: var(--font-ansi); + font-size: 14px; + line-height: 1.15; + overflow-y: auto; + white-space: pre; + color: #ffb000; + flex: 1; + scrollbar-width: thin; + scrollbar-color: var(--red-dark) #000; + } + .text-overlay-content::-webkit-scrollbar { + width: 8px; + } + .text-overlay-content::-webkit-scrollbar-track { + background: #000; + } + .text-overlay-content::-webkit-scrollbar-thumb { + background: var(--red-dark); + border-radius: 0; + } + .text-overlay-content::-webkit-scrollbar-thumb:hover { + background: var(--red-bright); + } +</style> diff --git a/src/components/Tile.astro b/src/components/Tile.astro new file mode 100644 index 0000000..08fbd0d --- /dev/null +++ b/src/components/Tile.astro @@ -0,0 +1,19 @@ +--- +export interface MenuItem { key: string; label: string; href: string; } +export interface Section { title: string; hardware: string; items: MenuItem[]; } +export interface Props { sections: Section[]; } +const { sections } = Astro.props; +--- +<div> + {sections.map((section, i) => ( + <div class="tile-section"> + <h3>{section.title}</h3> + <p>{section.hardware}</p> + <ul style="list-style:none; padding:0; margin:0;"> + {section.items.map((item) => ( + <li><a class="tile" href={item.href} title={item.label} aria-label={`[${item.key}] ${item.label}`}>[{item.key}] {item.label}</a></li> + ))} + </ul> + </div> + ))} +</div> diff --git a/src/components/WelcomeBanner.astro b/src/components/WelcomeBanner.astro new file mode 100644 index 0000000..10c4070 --- /dev/null +++ b/src/components/WelcomeBanner.astro @@ -0,0 +1,80 @@ +--- +import { readFileSync } from 'node:fs'; +import { join } from 'node:path'; + +const raw = readFileSync(join(process.cwd(), 'source-assets/welcome-utf8.txt'), 'utf-8'); +const text = raw.replace(/\r\n/g, '\n').trimEnd(); +const escaped = text + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>'); +--- + +<pre class="welcome-banner" id="welcome-banner" aria-hidden="true">{escaped}</pre> + +<script> + (function () { + const el = document.getElementById('welcome-banner'); + if (!el) return; + + const full = el.textContent || ''; + el.textContent = ''; + + let i = 0; + const BASE = 8; + const FAST = 4; + const HARD_PAUSES: [number, number][] = [[34, 400], [98, 350]]; + + function tick() { + if (i >= full.length) { + el.removeAttribute('aria-hidden'); + return; + } + const ch = full[i]; + el.textContent += ch; + i++; + + let delay = FAST; + const hp = HARD_PAUSES.find(p => p[0] === i); + if (hp) { + delay = hp[1]; + } else if (ch === '\n') { + delay = BASE * 4; + } else { + delay = BASE + Math.random() * 6; + } + + setTimeout(tick, delay); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => setTimeout(tick, 300)); + } else { + setTimeout(tick, 300); + } + })(); +</script> + +<style> + .welcome-banner { + font-family: var(--font-ansi); + color: var(--red-bright); + text-align: left; + width: 500px; + margin: 50px auto 0.5rem; + line-height: 1.1; + font-size: clamp(0.6rem, 1.5vw, 0.85rem); + letter-spacing: 0; + white-space: pre; + overflow: hidden; + min-height: 9.5em; + } + .welcome-banner::after { + content: '\2588'; + animation: blink 1s step-end infinite; + color: var(--red-bright); + } + @keyframes blink { + 50% { opacity: 0; } + } +</style> diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..0a3bf2c --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,12 @@ +import { defineCollection, z } from 'astro:content'; +const releaseSchema = z.object({ + title: z.string(), group: z.string(), year: z.number().int().optional(), platform: z.string(), + credits: z.array(z.object({ role: z.string(), name: z.string() })).default([]), + description: z.string(), download_url: z.string().url().optional(), screenshot: z.string().optional(), + file_id_diz: z.string(), +}); +const skyline = defineCollection({ type: 'content', schema: releaseSchema }); +const kosmosDesign = defineCollection({ type: 'content', schema: releaseSchema }); +const tropicdreams = defineCollection({ type: 'content', schema: releaseSchema }); +const esprit = defineCollection({ type: 'content', schema: releaseSchema }); +export const collections = { skyline, 'kosmos-design': kosmosDesign, tropicdreams, esprit }; diff --git a/src/content/esprit/arcade-demo.md b/src/content/esprit/arcade-demo.md new file mode 100644 index 0000000..1489bd9 --- /dev/null +++ b/src/content/esprit/arcade-demo.md @@ -0,0 +1,17 @@ +--- +title: "Arcade Demo" +group: "ESPRIT" +year: 1992 +platform: "Amiga 500" +credits: + - role: "Code" + name: "Stefan" +description: > + Arcade-style demo with sprite animations and raster effects. +screenshot: "/images/esprit/ArcadeDemo.png" +file_id_diz: | + ARCADE DEMO + ------------------ + Sprite animations + + raster effects. +--- diff --git a/src/content/esprit/asc-demo.md b/src/content/esprit/asc-demo.md new file mode 100644 index 0000000..4b2ccc4 --- /dev/null +++ b/src/content/esprit/asc-demo.md @@ -0,0 +1,17 @@ +--- +title: "ASC Demo" +group: "ESPRIT" +year: 1991 +platform: "Amiga 500" +credits: + - role: "Code" + name: "Stefan" +description: > + ASC (Amiga Scroller Construction) demo with sine-wave text movement. +screenshot: "/images/esprit/AscDemo.png" +file_id_diz: | + ASC DEMO + ------------------ + Amiga Scroller + Construction demo. +--- diff --git a/src/content/esprit/blue-field-demo.md b/src/content/esprit/blue-field-demo.md new file mode 100644 index 0000000..a8f6617 --- /dev/null +++ b/src/content/esprit/blue-field-demo.md @@ -0,0 +1,17 @@ +--- +title: "Blue Field Demo" +group: "ESPRIT" +year: 1991 +platform: "Amiga 500" +credits: + - role: "Code" + name: "Stefan" +description: > + Classic blue field star effect demo with scrolling text. +screenshot: "/images/esprit/BlueFieldDemo.png" +file_id_diz: | + BLUE FIELD DEMO + ------------------ + Blue field star + effect + scroller. +--- diff --git a/src/content/esprit/esprit-intro.md b/src/content/esprit/esprit-intro.md new file mode 100644 index 0000000..0af17e0 --- /dev/null +++ b/src/content/esprit/esprit-intro.md @@ -0,0 +1,17 @@ +--- +title: "ESPRIT Intro" +group: "ESPRIT" +year: 1993 +platform: "Amiga 500" +credits: + - role: "Code" + name: "Stefan" +description: > + Group intro with logo animation and MOD music soundtrack. +screenshot: "/images/esprit/EspritDemo.png" +file_id_diz: | + ESPRIT INTRO + ------------------ + Group intro with + logo + MOD music. +--- diff --git a/src/content/esprit/saturday-demo.md b/src/content/esprit/saturday-demo.md new file mode 100644 index 0000000..79fd8a4 --- /dev/null +++ b/src/content/esprit/saturday-demo.md @@ -0,0 +1,17 @@ +--- +title: "Saturday Demo" +group: "ESPRIT" +year: 1992 +platform: "Amiga 500" +credits: + - role: "Code" + name: "Stefan" +description: > + Weekend coding session demo with copper bars and plasma effect. +screenshot: "/images/esprit/SaturdayDemo.png" +file_id_diz: | + SATURDAY DEMO + ------------------ + Copper bars + plasma + effect demo. +--- diff --git a/src/content/kosmos-design/kds-flr021.md b/src/content/kosmos-design/kds-flr021.md new file mode 100644 index 0000000..811afa5 --- /dev/null +++ b/src/content/kosmos-design/kds-flr021.md @@ -0,0 +1,29 @@ +--- +title: "FastEcho LogFile Reporter V0.21" +group: "Kosmos Design [KDS]" +year: 1996 +platform: "DOS" +credits: + - role: "Code" + name: "Stefan" +description: > + Simple utility for FastEcho to create a report of all incoming mails + in a better way than the logfile. Tested with FE 1.45 but should work + with other versions. Mailware. +download_url: "https://www.moonweb.org/files/pc/KDS/K`FLR021.RAR" +file_id_diz: | + ▄ ──═════════════════════════════── ▄ + █ k 0 S M 0 S - d - S i g n █ + ▀ ──═════════[ presents ]════════── ▀ + │ │ + ║ FastEcho LogFile Reporter ║ + ║ ║ + ║ Very simple util for FastEcho to ║ + ║ make a report of all incoming ║ + ║ mails in a better way then the ║ + ║ logfile. Tested with FE 1.45 but ║ + ║ must work also with other ║ + ║ versions. Notice: MAILWARE ║ + │ │ + ■──══[tHE tEMPLE bBS 2:2480/330]══──■ +--- diff --git a/src/content/kosmos-design/kds-hardtrance-1.md b/src/content/kosmos-design/kds-hardtrance-1.md new file mode 100644 index 0000000..a7cf1c0 --- /dev/null +++ b/src/content/kosmos-design/kds-hardtrance-1.md @@ -0,0 +1,12 @@ +--- +title: "Hardtrance and Hardcore Vol I" +group: "Kosmos Design [KDS]" +year: 1995 +platform: "Audio" +credits: + - role: "DJ" + name: "marc JiNX" +description: > + Hardtrance and hardcore mix tape. 90 minutes of hard dance music. Available by mail order. +file_id_diz: "" +--- diff --git a/src/content/kosmos-design/kds-house-acid-1.md b/src/content/kosmos-design/kds-house-acid-1.md new file mode 100644 index 0000000..cc7c580 --- /dev/null +++ b/src/content/kosmos-design/kds-house-acid-1.md @@ -0,0 +1,12 @@ +--- +title: "House and Acid Vol I" +group: "Kosmos Design [KDS]" +year: 1996 +platform: "Audio" +credits: + - role: "DJ" + name: "marc JiNX" +description: > + House and acid mix tape. 90 minutes of house and acid music. Available by mail order. +file_id_diz: "" +--- diff --git a/src/content/kosmos-design/kds-house-acid-2.md b/src/content/kosmos-design/kds-house-acid-2.md new file mode 100644 index 0000000..6d64c1b --- /dev/null +++ b/src/content/kosmos-design/kds-house-acid-2.md @@ -0,0 +1,12 @@ +--- +title: "House and Acid Vol II" +group: "Kosmos Design [KDS]" +year: 1996 +platform: "Audio" +credits: + - role: "DJ" + name: "marc JiNX" +description: > + House and acid mix tape. 90 minutes of house and acid music. Available by mail order. +file_id_diz: "" +--- diff --git a/src/content/kosmos-design/kds-li-001.md b/src/content/kosmos-design/kds-li-001.md new file mode 100644 index 0000000..5f655c7 --- /dev/null +++ b/src/content/kosmos-design/kds-li-001.md @@ -0,0 +1,30 @@ +--- +title: "Nightmare on Billerstreet" +group: "Lethal Illusion [KDS]" +year: 1996 +platform: "DOS" +credits: + - role: "Level Design" + name: "Stefan" +description: > + Duke Nukem 3D level. A house-level for single player and dukematch. +download_url: "https://www.moonweb.org/files/pc/KDS/K`LI`001.RAR" +file_id_diz: | + ▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ + ▐███▓▌ ███▓▐██████▓▄ ▐███████▓ + ▐████▌▄███▌▐███ ███▐███ ▀▀▀▀ + █████████▌ ████ ██ █████████▌ + █████▌▐███▌████ ███▌▄▄[mJ]██▓▌ + ▓████▌ ▓██▌▓██████▓▌ █▓██████▌ + ▀▀▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ + ╖─┌───════╧════════╧╧════════╧╛ + ║ │ lETHAL iLLUSiON sUBDiViSION + ║═╡ + ╚═╕ Duke Nukem 3D level + ║ │ Nightmare on billerstreet + ║ │ + ║ │ House-Level: a good new + ║═╡ level for + ╚═╕ single and + ║ │ dukematch! +--- diff --git a/src/content/kosmos-design/kds-menu01.md b/src/content/kosmos-design/kds-menu01.md new file mode 100644 index 0000000..5dbb0e8 --- /dev/null +++ b/src/content/kosmos-design/kds-menu01.md @@ -0,0 +1,13 @@ +--- +title: "BBS Menu Files V0.1" +group: "Kosmos Design [KDS]" +year: 1996 +platform: "DOS" +credits: + - role: "GFX" + name: "Stefan" +description: > + Collection of BBS menu ANSI graphics for use with bulletin board systems. +download_url: "https://www.moonweb.org/files/pc/KDS/K`MENU01.RAR" +file_id_diz: " kOSMOS d-Sign\n quick release\n\n bbs menu ansi's\n" +--- diff --git a/src/content/kosmos-design/kds-trancemix-1.md b/src/content/kosmos-design/kds-trancemix-1.md new file mode 100644 index 0000000..5287ecd --- /dev/null +++ b/src/content/kosmos-design/kds-trancemix-1.md @@ -0,0 +1,12 @@ +--- +title: "Trancemix Vol I" +group: "Kosmos Design [KDS]" +year: 1995 +platform: "Audio" +credits: + - role: "DJ" + name: "marc JiNX" +description: > + Trance mix tape. 90 minutes of mixed trance music. Available by mail order. +file_id_diz: "" +--- diff --git a/src/content/kosmos-design/outside-sbr.md b/src/content/kosmos-design/outside-sbr.md new file mode 100644 index 0000000..478b7b8 --- /dev/null +++ b/src/content/kosmos-design/outside-sbr.md @@ -0,0 +1,19 @@ +--- +title: "SBR BBS Intro" +group: "Kosmos Design [KDS] - Outside Productions" +year: 1995 +platform: "DOS/486, VGA" +credits: + - role: "Code + GFX" + name: "Stefan" + - role: "Commissioned by" + name: "SBR BBS" +description: > + Custom login/intro screen for SBR BBS (real credit, exact wording pending, PRD.md 12). +file_id_diz: | + SBR INTRO + by Kosmos Design + ------------------ + Custom BBS login + for SBR BBS. +--- diff --git a/src/content/skyline/arjutil.md b/src/content/skyline/arjutil.md new file mode 100644 index 0000000..0f8f6fd --- /dev/null +++ b/src/content/skyline/arjutil.md @@ -0,0 +1,30 @@ +--- +title: "ArjUtil V1.0" +group: "SkyLINE Productions" +year: 1994 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + ARJ archive utility. Enter the sub-dir and destination drive, and the program does the rest. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/ARJUTIL.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ ArjUtil V1.0 │ + │ ---------------------- │ + │ You enter the sub-dir │ + │ and the dest.drive and │ + │ my prog does the rest. │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/cd-open.md b/src/content/skyline/cd-open.md new file mode 100644 index 0000000..1b79d3a --- /dev/null +++ b/src/content/skyline/cd-open.md @@ -0,0 +1,27 @@ +--- +title: "CD-ROM TSR Dooropener" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + TSR utility that opens the CD-ROM door with the F12 key. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/CD_OPEN.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ CDROM TSR Dooropener │ + │ ---------------------- │ + │ Opens the CD-ROM door │ + │ with the F12 key. │ + │ │ + │ SkyLINE ShareWare 1995 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/coperint.md b/src/content/skyline/coperint.md new file mode 100644 index 0000000..4940b87 --- /dev/null +++ b/src/content/skyline/coperint.md @@ -0,0 +1,24 @@ +--- +title: "Copper Intro" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "UncleSAM" +description: > + VGA Textmode 3 copper intro. Amazing 3 coppers on the screen, smooth scroller on top, up/down fading text. All in normal VGAMode 3. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/COPERINT.RAR" +file_id_diz: | + ----------------------------------- + ==== UncleSAM/SkyLINE presents ==== + ≡≡≡≡ COPPER intro ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ + ==== Real Textmode 3 intro ======== + ----------------------------------- + Amazing 3 Coppers on the screen + SmoothScroller on the top + Up/Dn Fading text + & all in the normal VGAMode 3 + + (C) 04/1995 by UncleSAM/SkyLINE +--- diff --git a/src/content/skyline/dcpp.md b/src/content/skyline/dcpp.md new file mode 100644 index 0000000..475be49 --- /dev/null +++ b/src/content/skyline/dcpp.md @@ -0,0 +1,27 @@ +--- +title: "DemoCoderz Pascal Pack" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Source codes for Pascal demo beginners. 3D, Plasmas, Coppers, Sound, Xmode, Bobs and more. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/DCPP.RAR" +file_id_diz: | + SkyLINE proudly presents + ▓▀▀▓ ▓▀▀ ▓▀▀▓ ▓▀▀▓ + ▒ ▒ ▒ ▒▀▀▀ ▒▀▀▀ + ░▄▄░ ░▄▄ ░ ░ + DemoCoderz Pascal Pack + ------------------------ + Here it is, the ultimate + source codes for all + pascal demo beginners! + Learn from existing srcs + and make your own demo + ------------------------ + 3d/Plasmas/Coppers/Sound + Xmode/Bobs/and even more +--- diff --git a/src/content/skyline/diskinfo.md b/src/content/skyline/diskinfo.md new file mode 100644 index 0000000..3ef4f6a --- /dev/null +++ b/src/content/skyline/diskinfo.md @@ -0,0 +1,30 @@ +--- +title: "DiskInfo V1.0" +group: "SkyLINE Productions" +year: 1994 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Shows how much disk space is free on up to 8 drives. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/DISKINFO.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ DiskInfo V1.0 │ + │ ---------------------- │ + │ It shows you how much │ + │ diskspace on up to 8 │ + │ drives is free. │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/dosmenu.md b/src/content/skyline/dosmenu.md new file mode 100644 index 0000000..56cbc32 --- /dev/null +++ b/src/content/skyline/dosmenu.md @@ -0,0 +1,33 @@ +--- +title: "DosMENU V2.0" +group: "SkyLINE Productions" +year: 1994 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + System configuration selector for booting. Helps when you have more than one configuration. Finished and published version. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/!DM_V2_0.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ DosMENU(TM) V2.0 │ + │ ---------------------- │ + │ This program selects │ + │ a System-Configuartion │ + │ while booting. Helpful │ + │ for all with more than │ + │ one Configuration. │ + │ │ + │ This is the finished │ + │ and published version. │ + │ │ + │ SkyLINE ShareWare 1994 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/infopack.md b/src/content/skyline/infopack.md new file mode 100644 index 0000000..c8af05a --- /dev/null +++ b/src/content/skyline/infopack.md @@ -0,0 +1,25 @@ +--- +title: "SkyLINE InfoPack" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Information package with newest infos, little intros and other content. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/INFOPACK.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ SkyLINE InfoPack │ + │ ────────────────────── │ + │ Newest Infos, little │ + │ Intros and other. │ + │ │ + │ SkyLINE ShareWare 1995 │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/moddisk1.md b/src/content/skyline/moddisk1.md new file mode 100644 index 0000000..7cf4f5a --- /dev/null +++ b/src/content/skyline/moddisk1.md @@ -0,0 +1,31 @@ +--- +title: "MusicDisk #1" +group: "SkyLINE Productions" +year: 1994 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + MOD music collection including MDP by the Future Crew. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/MODDISK1.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ MusicDisk #1 │ + │ ---------------------- │ + │ Some nice but not so │ + │ good MODs from Stern. │ + │ This includes MDP by │ + │ the Future Crew. │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/playmod.md b/src/content/skyline/playmod.md new file mode 100644 index 0000000..81c5860 --- /dev/null +++ b/src/content/skyline/playmod.md @@ -0,0 +1,33 @@ +--- +title: "Play MOD V0.2" +group: "SkyLINE Productions" +year: 1994 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Little MOD player using WOW-TPU. German docs. Notice: this version has some bugs (WOW-TPU has the bugs). +download_url: "https://www.moonweb.org/files/pc/SKYLINE/PLAYMOD.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ Play MOD V0.2ß │ + │ ---------------------- │ + │ A little MOD-Player. │ + │ Uses WOW-TPU. Sorry │ + │ docs and programm in │ + │ german. Notice: This │ + │ version has some bugs. │ + │ WOW-TPU has the bugs!! │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/preview1.md b/src/content/skyline/preview1.md new file mode 100644 index 0000000..814e959 --- /dev/null +++ b/src/content/skyline/preview1.md @@ -0,0 +1,28 @@ +--- +title: "Preview Compilation #1" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Picture compilation from SkyLINE mixed with text and music. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/PREVIEW1.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ Preview Compilation #1 │ + │ ---------------------- │ + │ Here are some pics │ + │ from us mixed up with │ + │ some text and music. │ + │ │ + │ SkyLINE ShareWare 1995 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/sharkbox.md b/src/content/skyline/sharkbox.md new file mode 100644 index 0000000..f56f32b --- /dev/null +++ b/src/content/skyline/sharkbox.md @@ -0,0 +1,26 @@ +--- +title: "Shark Box Intro" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "sAM" +description: > + BBS intro for Shark-BOX BBS, Augsburg. Online from Saturday 10 to Sunday 24. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/SHARKBOX.RAR" +file_id_diz: | + ▄▄▄▄▄ ▄ ▄ ▄▄▄▄▄ ▄▄▄▄ ▄ ▄ + ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ + ▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄ + ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ + ▄▄▄▄▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ + ·∙─────── B - O - X ───────∙· + + sAM/SkyLINE DemoGroup Auxburg + present + The Shark Box Intro + + oNLiNE from: sAT 10 to sUN 24 + ·∙──── +49-8231-88912 ─────∙· +--- diff --git a/src/content/skyline/shell.md b/src/content/skyline/shell.md new file mode 100644 index 0000000..be7016c --- /dev/null +++ b/src/content/skyline/shell.md @@ -0,0 +1,40 @@ +--- +title: "X-OS Shell V0.65" +group: "SkyLINE Productions" +year: 1994 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Norton Commander clone. Preview with some bugs and limited commands. Made with the SkyLINE-Bench Workarea. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/SHELL.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ X-OS Shell V0.65ß │ + │ ---------------------- │ + │ This is a NC-Clone. │ + │ Made with the well │ + │ known SkyLINE-Bench │ + │ Workarea. Little │ + │ Preview sith some bugs │ + │ and only some commands.│ + │ │ + │ I'm still working on │ + │ this product, but │ + │ there must some bigger │ + │ products finished │ + │ first before this. │ + │ Notice this is only a │ + │ Preview nor a cripple │ + │ ShareWare. │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/sln-demo.md b/src/content/skyline/sln-demo.md new file mode 100644 index 0000000..07a6c03 --- /dev/null +++ b/src/content/skyline/sln-demo.md @@ -0,0 +1,27 @@ +--- +title: "Uncle SAM Welcome Demo" +group: "SkyLINE Productions" +year: 1994 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + A little demo by the SkyLINE crew. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/SLN_DEMO.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ Uncle SAM welcome Demo │ + │ ---------------------- │ + │ A little Demo by the │ + │ SkyLINE-Crew. │ + │ │ + │ SkyLINE ShareWare 1994 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/sln-smi.md b/src/content/skyline/sln-smi.md new file mode 100644 index 0000000..e8b7669 --- /dev/null +++ b/src/content/skyline/sln-smi.md @@ -0,0 +1,19 @@ +--- +title: "SkyLINE Searching Member Intro" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Searching member intro. Final bugfixed version. "We're still searching for new members. So download and call today!" +download_url: "https://www.moonweb.org/files/pc/SKYLINE/SLN_SMI.RAR" +file_id_diz: | + SkyLINE Searching Member Intro + +----------------------------+ + | Final Bugfixed Version | + +----------------------------+ + We' re still searching for new + Members. So d/l and call today +--- diff --git a/src/content/skyline/slnfonts.md b/src/content/skyline/slnfonts.md new file mode 100644 index 0000000..618da2d --- /dev/null +++ b/src/content/skyline/slnfonts.md @@ -0,0 +1,13 @@ +--- +title: "SkyLINE Fonts" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Over 100 fonts for TheDraw in three Tdfont-Packs. Easy to change with included batches. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/SLNFONTS.RAR" +file_id_diz: " SkyLINE proudly presents\n ▓███▀█ ▓███▀█ ▓███▀▀█ ▀▀████▀▀\n ▒███▄ ▒███ █ ▒███ █ ███░\n ████ ████▄█ ████ █ ███▒\n\n ▓███▀█ ▓███▀█ ▓███▀█ ▓███ █\n ▒███▄█ ▒███▄█ ▒███ ▒███▀▄\n ████ ████ █ ████▄█ ████ █\n\n Over 100 Fonts for TheDraw in\n three Tdfont-Packs. Easy to\n change with included batches!\n A must for all Sysop's\n" +--- diff --git a/src/content/skyline/speaktim.md b/src/content/skyline/speaktim.md new file mode 100644 index 0000000..d95f63f --- /dev/null +++ b/src/content/skyline/speaktim.md @@ -0,0 +1,31 @@ +--- +title: "SpeakTime V1.0" +group: "SkyLINE Productions" +year: 1994 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Have your PC speak the time. German version. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/SPEAKTIM.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ Speaktime V1.0 │ + │ ---------------------- │ + │ Have you ever heard │ + │ your PC speaking the │ + │ time. Here it is. │ + │ Notice: German version │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/stime-v2.md b/src/content/skyline/stime-v2.md new file mode 100644 index 0000000..2322a70 --- /dev/null +++ b/src/content/skyline/stime-v2.md @@ -0,0 +1,26 @@ +--- +title: "SpeakTime V2.0" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Updated version of SpeakTime. Now also supports SoundBlaster. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/STIME_V2.RAR" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ Speaktime V2.0 │ + │ ────────────────────── │ + │ Hear your Computer │ + │ speaking the time. Now │ + │ also on SoundBlaster. │ + │ │ + │ SkyLINE ShareWare 1995 │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/tet-comp.md b/src/content/skyline/tet-comp.md new file mode 100644 index 0000000..7cc2842 --- /dev/null +++ b/src/content/skyline/tet-comp.md @@ -0,0 +1,30 @@ +--- +title: "TetrisCompetition V1.0" +group: "SkyLINE Productions" +year: 1994 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Tetris game for 2 players with rules like GameBoy Tetris. Preview version. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/TET_COMP.ZIP" +file_id_diz: | + ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ TetrisCompetition V1.0 │ + │ ---------------------- │ + │ A Tetris game for 2 │ + │ players with the rules │ + │ like GameBoy Tetris. │ + │ │ + │ This is a Preview │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ +--- diff --git a/src/content/skyline/thl-addy.md b/src/content/skyline/thl-addy.md new file mode 100644 index 0000000..149313a --- /dev/null +++ b/src/content/skyline/thl-addy.md @@ -0,0 +1,13 @@ +--- +title: "The Highland BBS Addy" +group: "SkyLINE Productions" +year: 1995 +platform: "DOS" +credits: + - role: "Code" + name: "Sterling" +description: > + Custom BBS intro screen for The Highland BBS. Especially made for Klaus Gruber. +download_url: "https://www.moonweb.org/files/pc/SKYLINE/THL_ADDY.RAR" +file_id_diz: " ▄▄▄▄▄▄▄▄ ▄▄ ▄▄ ▄▄\n ▐▓▓▓▓▓▓▓▓▌▐▓▓▌ ▐▓▓▌▐▓▓▌\n ▐ ■█▓▓█▀■ ▐▓▓█■▐▓▓▌▐▓▓▌\n▓▓▓ ▐▓▓▌ ▐▓▓▓▓▓▓▓▌▐▓▓▌■ ▓▓▓\n ▐▓▓▌ ▐▓▓▌ ▐▓▓▌▐▓▓█▄▄▄\n ▐▓▓▌ ▐▓▓▌ ▐▓▓▌▐▓▓▓▓▓▓▌\n ▐▀■▌ ▐▀■▌ ▐▀■▌▐▀■ ▀▀▌\n tHE Highland BBS Addy\n Esspecially made for KlAUS GRUBER\n" +--- diff --git a/src/content/tropicdreams/atom-oh-no.md b/src/content/tropicdreams/atom-oh-no.md new file mode 100644 index 0000000..d5c2ae4 --- /dev/null +++ b/src/content/tropicdreams/atom-oh-no.md @@ -0,0 +1,18 @@ +--- +title: "Atom Oh No!" +group: "Tropic DREAMs" +year: 1991 +platform: "Atari ST" +credits: + - role: "Coding" + name: "Stefan" +description: > + Second game release on the Atari ST, coded by Stefan under the pseudonym "Tropic DREAMs". Idea from Amiga's Atomix, ported to hi-res 640x400 incl. level maker and 10 demo levels. +file_id_diz: | + ATOM OH NO! (1991) + by Tropic DREAMs + ------------------ + Port of Atomix, + Hi-Res 640x400, + level maker. +--- diff --git a/src/content/tropicdreams/international-kegeln-and-bowling.md b/src/content/tropicdreams/international-kegeln-and-bowling.md new file mode 100644 index 0000000..21301a0 --- /dev/null +++ b/src/content/tropicdreams/international-kegeln-and-bowling.md @@ -0,0 +1,20 @@ +--- +title: "International Kegeln and Bowling" +group: "Tropic DREAMs" +year: 1990 +platform: "Atari ST" +credits: + - role: "Idea" + name: "Matthias (Olympic Arts)" + - role: "Coding" + name: "Stefan" +description: > + Our first release ever. A complete Bowling game, built as a second version of "International Kegeln", simply called Bowling. It was complete, but never quite playable. +file_id_diz: | + INT. KEGELN & + BOWLING (1990) + ------------------ + First ever release. + Idea by Matthias + (Olympic Arts). +--- diff --git a/src/content/tropicdreams/runner.md b/src/content/tropicdreams/runner.md new file mode 100644 index 0000000..2274787 --- /dev/null +++ b/src/content/tropicdreams/runner.md @@ -0,0 +1,20 @@ +--- +title: "Runner" +group: "Tropic DREAMs" +year: 1991 +platform: "Atari ST" +credits: + - role: "Idea" + name: "CPK" + - role: "Coding" + name: "Stefan" +description: > + An all-round helper tool including a database, memo, system overview, and a game. +file_id_diz: | + RUNNER v1.0 + by Tropic DREAMs + ------------------ + Database, memo, + system info + + Hangman game. +--- diff --git a/src/content/tropicdreams/top-tools.md b/src/content/tropicdreams/top-tools.md new file mode 100644 index 0000000..5276b77 --- /dev/null +++ b/src/content/tropicdreams/top-tools.md @@ -0,0 +1,18 @@ +--- +title: "TOP Tools" +group: "Tropic DREAMs" +year: 1992 +platform: "Atari ST" +credits: + - role: "Coding" + name: "Stefan" +description: > + Small tools and a game coded by Stefan under the pseudonym "Tropic DREAMs". All-round tool, simple strategy game, archive tool for TOS magazine. +file_id_diz: | + TOP TOOLS (1992) + by Tropic DREAMs + ------------------ + All-round tool, + strategy game, + archive tool. +--- diff --git a/src/data/kds-files-bbs.txt b/src/data/kds-files-bbs.txt new file mode 100644 index 0000000..de4fa52 --- /dev/null +++ b/src/data/kds-files-bbs.txt @@ -0,0 +1,38 @@ +K`FLR021.RAR [000] FastEcho LogFile Reporter V0.21 + > ▄ ──═════════════════════════════── ▄ + > █ k 0 S M 0 S - d - S i g n █ + > ▀ ──═════════[ presents ]════════── ▀ + > │ │ + > ║ FastEcho LogFile Reporter ║ + > ║ ║ + > ║ Very simple util for FastEcho to ║ + > ║ make a report of all incoming ║ + > ║ mails in a better way then the ║ + > ║ logfile. Tested with FE 1.45 but ║ + > ║ must work also with other ║ + > ║ versions. Notice: MAILWARE ║ + > │ │ + > ■──══[tHE tEMPLE bBS 2:2480/330]══──■ +K`MENU01.RAR [000] + > kOSMOS d-Sign + > quick release + > + > bbs menu ansi's + > +K`LI`001.RAR [000] ▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ + > ▐███▓▌ ███▓▐██████▓▄ ▐███████▓ + > ▐████▌▄███▌▐███ ███▐███ ▀▀▀▀ + > █████████▌ ████ ██ █████████▌ + > █████▌▐███▌████ ███▌▄▄[mJ]██▓▌ + > ▓████▌ ▓██▌▓██████▓▌ █▓██████▌ + > ▀▀▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ + > ╖─┌───════╧════════╧╧════════╧╛ + > ║ │ lETHAL iLLUSiON sUBDiViSION + > ║═╡ + > ╚═╕ Duke Nukem 3D level + > ║ │ Nightmare on billerstreet + > ║ │ + > ║ │ House-Level: a good new + > ║═╡ level for + > ╚═╕ single and + > ║ │ dukematch! diff --git a/src/data/kds-kosmos.txt b/src/data/kds-kosmos.txt new file mode 100644 index 0000000..4e5cf07 --- /dev/null +++ b/src/data/kds-kosmos.txt @@ -0,0 +1,111 @@ + ▄▄▄▄ ▄▄▄▄ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ + ▐███▓▌ ███▓▐██████▓▄ ▐███████▓ + ▐████▌▄███▌▐███ ███▐███ ▀▀▀▀ + █████████▌ ████ ██ █████████▌ + █████▌▐███▌████ ███▌▄▄[mJ]██▓▌ + ▓████▌ ▓██▌▓██████▓▌ █▓██████▌ + ▀▀▀▀▀ ▀▀▀ ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀ + + ■ · « ─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─- » · ■ + · /----) /----) /----) /----\ [mJ]· + ¡ /---\___) /---\___) ( ____)/-\ ___/ ¡ + | |-| | ! |--\--\/--| ! |--\ |-| ( ----\\_/ ---\-\ |-| | + | | |/-) | |__ )|\/| | | |__ ) ·──· /-| | ·──· \____ )-| __ ) \| | | + ! | < ¡ |-- )| | | ¡ |-- ) | <> | (---- ) | -- )|\ | ! + · |_|\_)___/___/_| |_|___/___/ \_|_| (____/|_|\___/_| \_| · + ■ · « ─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─-─- » · ■ + + + kOSMOS-d-Sign + + iNFO fILE + + short and easy + + May '96 + + + + + + + beginning-section some words from my own + =`-`=`-`-`=-`-`=-`=`-`=`-`=-`=-`=`=`-`=-`=-`=-`=-`=-`=-`=`-`=-`=`-=`-`= + + I tried to make a demogroup in augsburg quite long, but nobody was + interessted... + So I gave up my doing's as coorinator of SkyLINE, dropped all out and + now do my work alone... + You probably think SkyLINE was lame and it was sure! + now i learned and don't want to be the best, I only do my work and + that's all... + + But, the SkyLINE progs are not dead! I try to improve some tool and + release them again... + + Later I wanted to join a new demogroup in augsburg, but there is no + real teamwork possible, I would be the only real coder there... + So i decided to join SBR... + + On KDS I only will release my own stuff, which could not be released + through a demogroup... + + marc JiNX^kDS^SBR (Stefan Koelle) + + + + + + tool-section releases + =`-`=`-`-`=-`-`=-`=`-`=`-`=-`=-`=`=`-`=-`=-`=-`=-`=-`=-`=`-`=-`=`-=`-`= + + Name Desciption + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + K`FLR021.RAR FastEcho LogFile Reporter V0.21 + K`MENU01.RAR BBS Menu Files V0.1 + + + + + + tape-section releases + =`-`=`-`-`=-`-`=-`=`-`=`-`=-`=-`=`=`-`=-`=-`=-`=-`=-`=-`=`-`=-`=`-=`-`= + DJ marc JiNX Releases: + + Name Year Length + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Trancemix Vol I 1995 90:00 + Hardtrance and Hardcore Vol I 1995 90:00 + House and Acid Vol I 1996 90:00 + House and Acid Vol II 1996 90:00 + + + To order contact me on bbs or by mail + + + + + lethal illusion - sub-section releases + =`-`=`-`-`=-`-`=-`=`-`=`-`=-`=-`=`=`-`=-`=-`=-`=-`=-`=-`=`-`=-`=`-=`-`= + + Name Desciption + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + K`LI`001.RAR Duke 3D Level: Nightmare on billerstreet + + + + + + bbs-section tHE tEMPLE bBS + =`-`=`-`-`=-`-`=-`=`-`=`-`=-`=-`=`=`-`=-`=-`=-`=-`=-`=-`=`-`=-`=`-=`-`= + + ________ ________ ________ ________ ____ ________ + !__ __!__ __!_ _!!_ !__ ! !__ __! + %tHE%/ \ / __) / \ / \ _¡ / ___ / __)%bBS% + / \ / \/ \/ \ / \/ \ + \______/ \______/\___/\___/\______/mJ\______/\______/ + %49.821.2191038`mODEM% %iSDN`49.821.2191036% + + %stoned`brain`records`memberboard% %exp`dist% %air`online`support% + %bavarian`host`of% %comanet% %scenenet% %oanet% %8bitnet% + %szenenet`2nd`hq% %KDS`world`headquater% diff --git a/src/data/mods.json b/src/data/mods.json new file mode 100644 index 0000000..0145e3a --- /dev/null +++ b/src/data/mods.json @@ -0,0 +1,146 @@ +[ + { + "name": "brown.mod", + "title": "mod.james brown", + "size_human": "93.99 KB", + "channels": 4, + "sample_count": 15, + "modified": "1992-07-29T11:11:54+02:00", + "url": "https://www.moonweb.org/files/amiga/mods/brown.mod" + }, + { + "name": "chess.mod", + "title": "CHESS_GOES_TEKKNO___", + "size_human": "130.52 KB", + "channels": 4, + "sample_count": 18, + "modified": "1993-08-08T22:32:44+02:00", + "url": "https://www.moonweb.org/files/amiga/mods/chess.mod" + }, + { + "name": "djc-test.mod", + "title": "djc-test.mod", + "size_human": "51.45 KB", + "channels": 4, + "sample_count": 5, + "modified": "1994-01-12T18:14:54+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/djc-test.mod" + }, + { + "name": "franzl.mod", + "title": "franzl von der alm", + "size_human": "143.39 KB", + "channels": 4, + "sample_count": 7, + "modified": "1991-12-23T07:05:00+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/franzl.mod" + }, + { + "name": "jump.mod", + "title": "JUMP_ON_THE_JAMP____", + "size_human": "24.66 KB", + "channels": 4, + "sample_count": 4, + "modified": "1987-04-22T00:21:42+02:00", + "url": "https://www.moonweb.org/files/amiga/mods/jump.mod" + }, + { + "name": "jungle.mod", + "title": "jungle-tekkno", + "size_human": "34.84 KB", + "channels": 4, + "sample_count": 16, + "modified": "1991-12-23T07:46:00+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/jungle.mod" + }, + { + "name": "kings.mod", + "title": "KINGS_______________", + "size_human": "77.16 KB", + "channels": 4, + "sample_count": 12, + "modified": "1987-04-22T00:05:30+02:00", + "url": "https://www.moonweb.org/files/amiga/mods/kings.mod" + }, + { + "name": "LIT_RAVE.MOD", + "title": "little rave", + "size_human": "55.41 KB", + "channels": 4, + "sample_count": 7, + "modified": "1991-12-23T19:32:00+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/LIT_RAVE.MOD" + }, + { + "name": "no_limit.mod", + "title": "no limit gen remix", + "size_human": "94.06 KB", + "channels": 4, + "sample_count": 11, + "modified": "1993-12-04T10:27:04+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/no_limit.mod" + }, + { + "name": "NXT_RAVE.MOD", + "title": "next !rave", + "size_human": "32.02 KB", + "channels": 4, + "sample_count": 4, + "modified": "1994-03-16T00:26:42+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/NXT_RAVE.MOD" + }, + { + "name": "pump.mod", + "title": "PUMP_UP_THE_ASC_____", + "size_human": "45.65 KB", + "channels": 4, + "sample_count": 8, + "modified": "1993-02-23T08:13:34+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/pump.mod" + }, + { + "name": "run_away.mod", + "title": "run away by genius", + "size_human": "43.66 KB", + "channels": 4, + "sample_count": 15, + "modified": "1991-12-23T07:07:00+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/run_away.mod" + }, + { + "name": "tekkno.mod", + "title": "tekknotracks genius", + "size_human": "39.75 KB", + "channels": 4, + "sample_count": 14, + "modified": "1991-12-23T07:13:00+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/tekkno.mod" + }, + { + "name": "turbo.mod", + "title": "TURBO_SONG_FOR_INTRO", + "size_human": "126.31 KB", + "channels": 4, + "sample_count": 10, + "modified": "1987-04-22T00:10:18+02:00", + "url": "https://www.moonweb.org/files/amiga/mods/turbo.mod" + }, + { + "name": "valla.mod", + "title": "VALLA_______________", + "size_human": "25.18 KB", + "channels": 4, + "sample_count": 3, + "modified": "1993-02-23T08:11:24+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/valla.mod" + }, + { + "name": "wizard.mod", + "title": "wizard by genius 93", + "size_human": "46.34 KB", + "channels": 4, + "sample_count": 9, + "modified": "1991-12-23T07:02:00+01:00", + "url": "https://www.moonweb.org/files/amiga/mods/wizard.mod" + } +] diff --git a/src/data/skyline-files-bbs.txt b/src/data/skyline-files-bbs.txt new file mode 100644 index 0000000..c626b4c --- /dev/null +++ b/src/data/skyline-files-bbs.txt @@ -0,0 +1,288 @@ +ARJUTIL.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ ArjUtil V1.0 │ + > │ ---------------------- │ + > │ You enter the sub-dir │ + > │ and the dest.drive and │ + > │ my prog does the rest. │ + > │ │ + > │ This is Freeware │ + > │ │ + > │ SkyLINE Production '94 │ + > │ │ + > └────────────────────────┘ +CD_OPEN.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ CDROM TSR Dooropener │ + > │ ---------------------- │ + > │ Opens the CD-ROM door │ + > │ with the F12 key. │ + > │ │ + > │ SkyLINE ShareWare 1995 │ + > │ │ + > └────────────────────────┘ +COPERINT.RAR [000] ----------------------------------- + > ==== UncleSAM/SkyLINE presents ==== + > ≡≡≡≡ COPPER intro ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ + > ==== Real Textmode 3 intro ======== + > ----------------------------------- + > Amazing 3 Coppers on the screen + > SmoothScroller on the top + > Up/Dn Fading text + > & all in the normal VGAMode 3 + > + > (C) 04/1995 by UncleSAM/SkyLINE +DCPP.RAR [000] SkyLINE proudly presents + > ▓▀▀▓ ▓▀▀ ▓▀▀▓ ▓▀▀▓ + > ▒ ▒ ▒ ▒▀▀▀ ▒▀▀▀ + > ░▄▄░ ░▄▄ ░ ░ + > DemoCoderz Pascal Pack + > ------------------------ + > Here it is, the ultimate + > source codes for all + > pascal demo beginners! + > Learn from existing srcs + > and make your own demo + > ------------------------ + > 3d/Plasmas/Coppers/Sound + > Xmode/Bobs/and even more +DISKINFO.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ DiskInfo V1.0 │ + > │ ---------------------- │ + > │ It shows you how much │ + > │ diskspace on up to 8 │ + > │ drives is free. │ + > │ │ + > │ This is Freeware │ + > │ │ + > │ SkyLINE Production '94 │ + > │ │ + > └────────────────────────┘ +INFOPACK.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ SkyLINE InfoPack │ + > │ ────────────────────── │ + > │ Newest Infos, little │ + > │ Intros and other. │ + > │ │ + > │ SkyLINE ShareWare 1995 │ + > └────────────────────────┘ +MODDISK1.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ MusicDisk #1 │ + > │ ---------------------- │ + > │ Some nice but not so │ + > │ good MODs from Stern. │ + > │ This includes MDP by │ + > │ the Future Crew. │ + > │ │ + > │ This is Freeware │ + > │ │ + > │ SkyLINE Production '94 │ + > │ │ + > └────────────────────────┘ +PLAYMOD.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ Play MOD V0.2ß │ + > │ ---------------------- │ + > │ A little MOD-Player. │ + > │ Uses WOW-TPU. Sorry │ + > │ docs and programm in │ + > │ german. Notice: This │ + > │ version has some bugs. │ + > │ WOW-TPU has the bugs!! │ + > │ │ + > │ This is Freeware │ + > │ │ + > │ SkyLINE Production '94 │ + > │ │ + > └────────────────────────┘ +PREVIEW1.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ Preview Compilation #1 │ + > │ ---------------------- │ + > │ Here are some pics │ + > │ from us mixed up with │ + > │ some text and music. │ + > │ │ + > │ SkyLINE ShareWare 1995 │ + > │ │ + > └────────────────────────┘ +SHARKBOX.RAR [000] ▄▄▄▄▄ ▄ ▄ ▄▄▄▄▄ ▄▄▄▄ ▄ ▄ + > ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ + > ▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄▄ ▄▄▄▄ ▄▄▄▄ + > ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ + > ▄▄▄▄▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ + > ·∙─────── B - O - X ───────∙· + > + > sAM/SkyLINE DemoGroup Auxburg + > present + > The Shark Box Intro + > + > oNLiNE from: sAT 10 to sUN 24 + > ·∙──── +49-8231-88912 ─────∙· +SHELL.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ X-OS Shell V0.65ß │ + > │ ---------------------- │ + > │ This is a NC-Clone. │ + > │ Made with the well │ + > │ known SkyLINE-Bench │ + > │ Workarea. Little │ + > │ Preview sith some bugs │ + > │ and only some commands.│ + > │ │ + > │ I'm still working on │ + > │ this product, but │ + > │ there must some bigger │ + > │ products finished │ + > │ first before this. │ + > │ Notice this is only a │ + > │ Preview nor a cripple │ + > │ ShareWare. │ + > │ │ + > │ SkyLINE Production '94 │ + > │ │ + > └────────────────────────┘ +SLN_DEMO.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ Uncle SAM welcome Demo │ + > │ ---------------------- │ + > │ A little Demo by the │ + > │ SkyLINE-Crew. │ + > │ │ + > │ SkyLINE ShareWare 1994 │ + > │ │ + > └────────────────────────┘ +SLN_SMI.RAR [000] SkyLINE Searching Member Intro + > +----------------------------+ + > | Final Bugfixed Version | + > +----------------------------+ + > We' re still searching for new + > Members. So d/l and call today +SLNFONTS.RAR [000] SkyLINE proudly presents + > ▓███▀█ ▓███▀█ ▓███▀▀█ ▀▀████▀▀ + > ▒███▄ ▒███ █ ▒███ █ ███░ + > ████ ████▄█ ████ █ ███▒ + > + > ▓███▀█ ▓███▀█ ▓███▀█ ▓███ █ + > ▒███▄█ ▒███▄█ ▒███ ▒███▀▄ + > ████ ████ █ ████▄█ ████ █ + > + > Over 100 Fonts for TheDraw in + > three Tdfont-Packs. Easy to + > change with included batches! + > A must for all Sysop's +SPEAKTIM.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ Speaktime V1.0 │ + > │ ---------------------- │ + > │ Have you ever heard │ + > │ your PC speaking the │ + > │ time. Here it is. │ + > │ Notice: German version │ + > │ │ + > │ This is Freeware │ + > │ │ + > │ SkyLINE Production '94 │ + > │ │ + > └────────────────────────┘ +STIME_V2.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ Speaktime V2.0 │ + > │ ────────────────────── │ + > │ Hear your Computer │ + > │ speaking the time. Now │ + > │ also on SoundBlaster. │ + > │ │ + > │ SkyLINE ShareWare 1995 │ + > └────────────────────────┘ +TET_COMP.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ TetrisCompetition V1.0 │ + > │ ---------------------- │ + > │ A Tetris game for 2 │ + > │ players with the rules │ + > │ like GameBoy Tetris. │ + > │ │ + > │ This is a Preview │ + > │ │ + > │ SkyLINE Production '94 │ + > │ │ + > └────────────────────────┘ +THL_ADDY.RAR [000] ▄▄▄▄▄▄▄▄ ▄▄ ▄▄ ▄▄ + > ▐▓▓▓▓▓▓▓▓▌▐▓▓▌ ▐▓▓▌▐▓▓▌ + > ▐ ■█▓▓█▀■ ▐▓▓█■▐▓▓▌▐▓▓▌ + > ▓▓▓▓▓ ▐▓▓▌ ▐▓▓▓▓▓▓▓▌▐▓▓▌■ ▓▓▓▓▓ + > ▐▓▓▌ ▐▓▓▌ ▐▓▓▌▐▓▓█▄▄▄ + > ▐▓▓▌ ▐▓▓▌ ▐▓▓▌▐▓▓▓▓▓▓▌ + > ▐▀■▌ ▐▀■▌ ▐▀■▌▐▀■ ▀▀▌ + > tHE Highland BBS Addy + > Esspecially made for KlAUS GRUBER +!DM_V2_0.RAR [000] ┌────────────────────────┐ + > │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + > │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + > │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + > │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + > │ │ + > │ DosMENU(TM) V2.0 │ + > │ ---------------------- │ + > │ This program selects │ + > │ a System-Configuartion │ + > │ while booting. Helpful │ + > │ for all with more than │ + > │ one Configuration. │ + > │ │ + > │ This is the finished │ + > │ and published version. │ + > │ │ + > │ SkyLINE ShareWare 1994 │ + > │ │ + > └────────────────────────┘ diff --git a/src/data/skyline94.txt b/src/data/skyline94.txt new file mode 100644 index 0000000..e7d05be --- /dev/null +++ b/src/data/skyline94.txt @@ -0,0 +1,299 @@ + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ Date: + ▒▒███████████████ ▒▒ 25-Aug-94 + ▒▒██ █ █ █ █ ██ ███ █▄ █▄ █▄ █████▄ ▒▒ + ▒▒██ ███ █ █ █ ██ ███ ███ ███▄███ ███▀▀▀ ▒▒ Lines: + ▒▒██ █ ██ █ ██ ███ ███ ███████ █████ ▒▒ 299 + ▒▒████ █ █ ██ ███ ███▄▄▄ ███ ███▀███ ███▄▄▄ ▒▒ + ▒▒██ █ █ ██ ███ ▀████ ▀█ ▀█ ▀█ ▀████ ▒▒ File Size: + ▒▒███████████████ ▒▒ 12 KBytes + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + ▒▒ SkyLINE -> Information File <- SkyLINE ▒▒ Written by + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ Sterling + + + Introduction + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + +You will probably say "What is SkyLine?". I will try to explain what we wanna +do on the PC. SkyLine is a very young group of people who want to enter the +world of PC. At the moment there are only two Members of SkyLine. By the way +this is a legal group. NO illegal tradings or any other piracy stuff. At the +moment we are only coding some nice utilities and some not so good games, but +in the future we want to code real cool demos in asm. + + + Topics in this document + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + + Introduction + Members + Finished Products + Unfinished Products + Some words about DOSMenu + How to reach SkyLINE + Final Message + The END + + + Members + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + + Alias | Real Name | Age | Activities + ----------+-------------------+-----+---------------------------------------- + Sterling | Stefan Kölle | 17 | Organizing, Code, Music, Some GFX + M.H. | Matthias Hebeisen | 18 | RayTracing, GFX, Some Coding + + + Spreaded Products + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + + Productname: Arj Utility V1.0 + Filename : ARJUTIL.ZIP + Filesize : 8 KBytes + StartDate : summer 1993 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ ArjUtil V1.0 │ + │ ---------------------- │ + │ You enter the sub-dir │ + │ and the dest.drive and │ + │ my prog does the rest. │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ + + Productname: Shell V0.65ß Preview + Filename : SHELL.ZIP + Filesize : 21 KBytes + StartDate : summer 1993 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ X-OS Shell V0.65ß │ + │ ---------------------- │ + │ This is a NC-Clone. │ + │ Made with the well │ + │ known SkyLINE-Bench │ + │ Workarea. Little │ + │ Preview sith some bugs │ + │ and only some commands.│ + │ │ + │ I'm still working on │ + │ this product, but │ + │ there must some bigger │ + │ products finished │ + │ first before this. │ + │ Notice this is only a │ + │ Preview nor a cripple │ + │ ShareWare. │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ + + Productname: DiskInfo V1.0 + Filename : DISKINFO.ZIP + Filesize : 10 KBytes + StartDate : fall 1993 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ DiskInfo V1.0 │ + │ ---------------------- │ + │ It shows you how much │ + │ diskspace on up to 8 │ + │ drives is free. │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ + + Productname: Play MOD V0.2ß + Filename : PLAYMOD.ZIP + Filesize : 15 KBytes + StartDate : winter 1993 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ Play MOD V0.2ß │ + │ ---------------------- │ + │ A little MOD-Player. │ + │ Uses WOW-TPU. Sorry │ + │ docs and programm in │ + │ german. Notice: This │ + │ version has some bugs. │ + │ WOW-TPU has the bugs!! │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ + + Productname: Tetris Competition V1.0 + Filename : TET_COMP.ZIP + Filesize : 55 KBytes + StartDate : spring 1994 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ TetrisCompetition V1.0 │ + │ ---------------------- │ + │ A Tetris game for 2 │ + │ players with the rules │ + │ like GameBoy Tetris. │ + │ │ + │ This is a Preview │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ + + Productname: SpeakTime V1.0 + Filename : SPEAKTIM.ZIP + Filesize : 90 KBytes + StartDate : summer 1994 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ Speaktime V1.0 │ + │ ---------------------- │ + │ Have you ever heard │ + │ your PC speaking the │ + │ time. Here it is. │ + │ Notice: German version │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ + + Productname: MOD Disk Number One + Filename : MODDISK1.ZIP + Filesize : 410 KBytes + StartDate : 24.08.1994 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ MusicDisk #1 │ + │ ---------------------- │ + │ Some nice but not so │ + │ good MODs from Stern. │ + │ This includes MDP by │ + │ the Future Crew. │ + │ │ + │ This is Freeware │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ + + Productname: DOSMenu Final V2.0 + Filename : !DM_V2_0 + Filesize : ?? KBytes + StartDate : summer 1993 + ReleaseDate: ??.??.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ DOSMenu Final V2.0 │ + │ ---------------------- │ + │ This program selects │ + │ a System-Configuartion │ + │ while booting. Helpful │ + │ for all with more than │ + │ one Configuration. │ + │ │ + │ This is the finished │ + │ and published version. │ + │ │ + │ SkyLINE Production '94 │ + │ │ + └────────────────────────┘ + + Frequently asked Questions about SkyLINE + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + +Q: Why have you released all your first Products on 24.08.1994? +A: That's because on this day I searched through all my Sub-DIRs and + thought it would be funny to release all my little programs as Freeware. + + + Some words about DOSMenu + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + +These are the previous versions of DOSMenu which are not fully working and +they have some bugs. Please don't spread this versions any longer. + + DOSMenu V0.9ß + DOSMenu II V2.0 + DOSMenu III V1.0 - V1.4 + DOSMenu Update + + + How to reach SkyLINE + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + + Write to : Stefan Kölle + Laugingerstr. 10 + 86154 Augsburg + Germany + Or simply dial: +49-821-416484 (19h-20h) + + + Final Message + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + +If you want to order a program please use the ORDER.TXT. Read the information +very good in ORDER.TXT. If somebody wants to join SkyLINE please don't wait +and call us now. We strongly need a BBS. Please call us if you live in +Augsburg in Germany and you want to join SkyLINE. We also need more Coder, +Graphics-Artists and Music-Composer and finaly a vice Organizer or later the +first Organizer is needed, I'm not a real Organizer. Signed Sterling. + + + The END + ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ + __ _ _ ____ + _| | | | \ | \|\ | __\ + / \|_ \ | |_ | || || _| + \/\ \ \___| \_| \|\_| \___| + / [94-Stern] \ No newline at end of file diff --git a/src/data/skyline95.txt b/src/data/skyline95.txt new file mode 100644 index 0000000..4f6cbf4 --- /dev/null +++ b/src/data/skyline95.txt @@ -0,0 +1,548 @@ + + █ ░█ ███ ██ █▓ █ + █▒ █ █ █ █░█ ▒█ ░█ ███████ + ██░ ░ ░█ ░█ █ ░█ ██░█ █ █ + ░█ █▒ █▒ ████▓ █ ░░ ██ ██ █░ ▒█▓█████░ + ░█ █░ ▒▒ █▒ █ █ █░ █ █ █ + ░█▓ ███░██░ ██ █ █ ░██ █ + █ ▒█░ █ █ ▓█ █ ██ █▓ + ██ ▒█ █░██████████ █ █░ ██ █▒████░░░▒███ + ░█ ██ █ + ██░ + The iNFOFilE ▒█████▒ █ ███▒ + ^^^ ^^^^^^^^ ████▓ ██ ███░ + ████░ ▒█░ ░███░ + ███░ █░ ░████▒ + ▒███░ Version: June '95 + + + + Hello everybody out there... This is the SkyLINE iNFOFiLE with a new dezign + +As you will already know, SkyLINE is a DemoGroup in AuxBurg. In this Textfile + we want to tell you all about this Crew. + + + ··········································································· + + +-> The Topics this time... + ^^^^^^^^^^^^^^^^^^^^^^^ + + * Memberstaff + * Spreaded Products + * Distro-Sites + * The Order-Form + * How to contact sAM/SkyLINE + * Some information + + + ··········································································· + + +-> Memberstaff + ^^^^^^^^^^^ + +╒═══════════════════════════════════════════════════════════════════════════╕ +│ SkyLINE Members: │ +├─════════════════──────────────┬──────────┬────────────────────────────────┤ +│ sAM (Stefan Kölle) │ 18 years │ Organizing, Code, Music, ANSI, │ +│ │ │ Some GFX (and soon SYSOP?) │ +│ M.H. (Matthias Hebeisen) │ 18 years │ RayTracing, GFX, Some Coding │ +╞═══════════════════════════════╧══════════╧════════════════════════════════╡ +│ │ +│ Cooperations with: │ +├─══════════════════────────────┬──────────┬────────────────────────────────┤ +│ Milk Run (Jürgen Vejmelka) │ 19 years │ Coding, Some Graphics │ +│ Mirko (Mirko Klinski) │ 17 years │ Graphics │ +│ and other (name ???) │ ?? years │ Graphics │ +╞═══════════════════════════════╧══════════╧════════════════════════════════╡ +│ │ +│ New Members: │ +├─════════════──────────────────────────────────────────────────────────────┤ +│ This could be you - Call us today, if you think you are good enough │ +╘═══════════════════════════════════════════════════════════════════════════╛ + + + ··········································································· + + +-> Spreaded Products + ^^^^^^^^^^^^^^^^^ + + Productname: Arj Utility V1.0 + Filename : ARJUTIL.ZIP + Filesize : 8 KBytes + StartDate : summer 1993 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ ArjUtil V1.0 │ + │ ---------------------- │ + │ You enter the sub-dir │ + │ and the dest.drive and │ + │ my prog does the rest. │ + │ This is Freeware │ + └────────────────────────┘ + + Productname: Shell V0.65ß Preview + Filename : SHELL.ZIP + Filesize : 21 KBytes + StartDate : summer 1993 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ X-OS Shell V0.65ß │ + │ ---------------------- │ + │ This is a NC-Clone. │ + │ Made with the well │ + │ known SkyLINE-Bench │ + │ Workarea. Little │ + │ Preview sith some bugs │ + │ and only some commands.│ + │ │ + │ I'm still working on │ + │ this product, but │ + │ there must some bigger │ + │ products finished │ + │ first before this. │ + │ Notice this is only a │ + │ Preview nor a cripple │ + │ ShareWare. │ + └────────────────────────┘ + + Productname: DiskInfo V1.0 + Filename : DISKINFO.ZIP + Filesize : 10 KBytes + StartDate : fall 1993 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ DiskInfo V1.0 │ + │ ---------------------- │ + │ It shows you how much │ + │ diskspace on up to 8 │ + │ drives is free. │ + │ This is Freeware │ + └────────────────────────┘ + + Productname: Play MOD V0.2ß + Filename : PLAYMOD.ZIP + Filesize : 15 KBytes + StartDate : winter 1993 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ Play MOD V0.2ß │ + │ ---------------------- │ + │ A little MOD-Player. │ + │ Uses WOW-TPU. Sorry │ + │ docs and programm in │ + │ german. Notice: This │ + │ version has some bugs. │ + │ WOW-TPU has the bugs!! │ + │ This is Freeware │ + └────────────────────────┘ + + Productname: Tetris Competition V1.0 + Filename : TET_COMP.ZIP + Filesize : 55 KBytes + StartDate : spring 1994 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ TetrisCompetition V1.0 │ + │ ---------------------- │ + │ A Tetris game for 2 │ + │ players with the rules │ + │ like GameBoy Tetris. │ + │ This is a Preview │ + └────────────────────────┘ + + Productname: SpeakTime V1.0 + Filename : SPEAKTIM.ZIP + Filesize : 90 KBytes + StartDate : summer 1994 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ Speaktime V1.0 │ + │ ---------------------- │ + │ Have you ever heard │ + │ your PC speaking the │ + │ time. Here it is. │ + │ Notice: German version │ + │ This is Freeware │ + └────────────────────────┘ + + Productname: MOD Disk Number One + Filename : MODDISK1.ZIP + Filesize : 410 KBytes + StartDate : 24.08.1994 + ReleaseDate: 24.08.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ MusicDisk #1 │ + │ ---------------------- │ + │ Some nice but not so │ + │ good MODs from Stern. │ + │ This includes MDP by │ + │ the Future Crew. │ + │ This is Freeware │ + └────────────────────────┘ + + Productname: DosMENU(TM) V2.0 + Filename : !DM_V2_0 + Filesize : 181 KBytes + StartDate : summer 1993 + ReleaseDate: 26.09.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ │ + │ DosMENU(TM) V2.0 │ + │ ---------------------- │ + │ This program selects │ + │ a System-Configuartion │ + │ while booting. Helpful │ + │ for all with more than │ + │ one Configuration. │ + │ │ + │ This is the finished │ + │ and published version. │ + │ │ + │ SkyLINE ShareWare 1994 │ + │ │ + └────────────────────────┘ + + Productname: The Uncle SAM welcome demo + Filename : SLN_DEMO + Filesize : 181 KBytes + StartDate : September 1994 + ReleaseDate: 27.10.1994 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ Uncle SAM welcome Demo │ + │ ---------------------- │ + │ A little Demo by the │ + │ SkyLINE-Crew. │ + └────────────────────────┘ + + Productname: Preview Compilation #1 + Filename : PREVIEW1 + Filesize : 410 KBytes + StartDate : 07.03.1995 + ReleaseDate: 07.03.1995 / 1 hour later :-) + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ Preview Compilation #1 │ + │ ---------------------- │ + │ Here are some pics │ + │ from us mixed up with │ + │ some text and music. │ + └────────────────────────┘ + + Productname: CD-ROM TSR Dooropener + Filename : CD_OPEN + Filesize : 11 KBytes + StartDate : 03.02.1995 + ReleaseDate: 07.03.1995 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ CDROM TSR Dooropener │ + │ ---------------------- │ + │ Opens the CD-ROM door │ + │ with the F12 key. │ + │ SkyLINE ShareWare 1995 │ + └────────────────────────┘ + + Productname: Infromation Package & Little Intro + Filename : INFOPACK + Filesize : 74 KBytes + StartDate : 12.02.1995 (Intro started a year ago) + ReleaseDate: 12.03.1995 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ SkyLINE InfoPack │ + │ ────────────────────── │ + │ Newest Infos, little │ + │ Intros and other. │ + │ │ + │ SkyLINE ShareWare 1995 │ + └────────────────────────┘ + + Productname: SpeakTime V2.0 (New Version) + Filename : STIME_V2 + Filesize : 107 KBytes + StartDate : 24.08.1994 (first version) + ReleaseDate: 22.03.1995 + Description: ┌────────────────────────┐ + │ ██▌█ █▐█ █▐█ █▌█ █▐██ │ + │ █ █ █▐█ █▐█ █▌█▌█▐█ │ + │ ▀█▌█▀▄ ▐█ ▐█ █▌███▐█▀ │ + │ ██▌█ █ ▐█ ▐██▌█▌█▐█▐██ │ + │ Speaktime V2.0 │ + │ ────────────────────── │ + │ Hear your Computer │ + │ speaking the time. Now │ + │ also on SoundBlaster. │ + │ │ + │ SkyLINE ShareWare 1995 │ + └────────────────────────┘ + + Productname: SkyLINE Searching Member Intro (Bugfixed Version) + Filename : SLN_SMI + Filesize : 17 KBytes + StartDate : 12.03.1995 (first version) + ReleaseDate: 09.04.1995 + Description: SkyLINE Searching Member Intro + +----------------------------+ + | Final Bugfixed Version | + +----------------------------+ + We' re still searching for new + Members. So d/l and call today + + Productname: VGA Textmode 3 Copper Intro + Filename : COPERINT + Filesize : 16 KBytes + StartDate : 30.03.1995 + ReleaseDate: 09.04.1995 + Description: ----------------------------------- + ==== UncleSAM/SkyLINE presents ==== + ≡≡≡≡ COPPER intro ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ + ==== Real Textmode 3 intro ======== + ----------------------------------- + Amazing 3 Coppers on the screen + SmoothScroller on the top + Up/Dn Fading text + & all in the normal VGAMode 3 + + (C) 04/1995 by UncleSAM/SkyLINE + + Productname: The Highland BBS Addy + Filename : THL_ADDY + Filesize : 19 KBytes + StartDate : 18.04.1995 + ReleaseDate: 29.04.1995 + Description: ▄▄▄▄▄▄▄▄ ▄▄ ▄▄ ▄▄ + ▐▓▓▓▓▓▓▓▓▌▐▓▓▌ ▐▓▓▌▐▓▓▌ + ▐ ■█▓▓█▀■ ▐▓▓█■▐▓▓▌▐▓▓▌ + ▓▓▓▓▓ ▐▓▓▌ ▐▓▓▓▓▓▓▓▌▐▓▓▌■ ▓▓▓▓▓ + ▐▓▓▌ ▐▓▓▌ ▐▓▓▌▐▓▓█▄▄▄ + ▐▓▓▌ ▐▓▓▌ ▐▓▓▌▐▓▓▓▓▓▓▌ + ▐▀■▌ ▐▀■▌ ▐▀■▌▐▀■ ▀▀▌ + tHE Highland BBS Addy + Esspecially made for KlAUS GRUBER + + + ··········································································· + + +-> Distro-Sites + ^^^^^^^^^^^^ + +╒═══════════════════════════════════════════════════════════════════════════╕ +│ Request-Distro (for Requests call this Board) │ +├─══════════════───┬────────────────┬─────────────────────┬─────────────────┤ +│ Sirius-BBS │ +49-8233-30860 │ 4 ZYX 19K2 modems │ 2:2480/96 │ +│ 2:2480/96 │ +49-8233-32167 │ 4 v34 / vFC modems │ 2:2480/196 │ +│ Christian │ +49-8233-70020 │ ISDNA, ISDNB, ISDNC │ 2:2480/195 │ +│ Niessner └────────────────┴─────────────────────┴─────────────────┤ +│ Group: Programmer's Support - Area: SkyLINE Support │ +╞═══════════════════════════════════════════════════════════════════════════╡ +│ Local-Distro (from Augsburg call this Board) │ +├─════════════─────┬────────────────┬───────────────────────────────────────┤ +│ Shark-BOX │ +49-8231-88192 │ v32bis modem │ +│ 2:2480/403.20 └────────────────┴───────────────────────────────────────┤ +│ Bernhard Lindner Group: #24 SkyLine - Area: #75 SkyLINE Productions │ +│ │ +│ Online from Saturday 10 o'clock to Sunday 20 o'clock │ +│ Use Command "2" for special SkyLINE Menu │ +╞═══════════════════════════════════════════════════════════════════════════╡ +│ Product-Site (not all Files from SkyLINE) │ +├─════════════─────┬────────────────┬───────────────────────────────────────┤ +│ Airport │ +49-821-563350 │ v32bis modem │ +│ 2:2480/404 │ +49-821-563893 │ vFC modem │ +│ Bernd Liedke └────────────────┴───────────────────────────────────────┤ +│ Konferenz / Area: #290 Skyline Software │ +╞═══════════════════════════════════════════════════════════════════════════╡ +│ Product-Site (not all Files from SkyLINE) │ +├─════════════─────┬────────────────┬───────────────────────────────────────┤ +│ The Highland BBS │ +49-821- 98959 │ 2 vFC v34 v32T modems │ +│ │ +49-821- 93095 │ vFC v34 modem or ISDN │ +│ │ +49-821- 98498 │ v32b Zyx16.8/19.2 modem or ISDN │ +╘══════════════════╧════════════════╧═══════════════════════════════════════╛ + + + ··········································································· + + +-> The Order-Form + ^^^^^^^^^^^^^^ + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cut here ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + Mailed to: Stefan Kölle Hotline at: +49-821-416484 + Laugingerstr. 10 + 86154 Augsburg + Germany + + + + Name : ·················································· + + + Company: ·················································· + + + Street : ·················································· + + + City : ·················································· + + + Country: ·················································· + + + Phone : ······················ FAX: ······················ + + + + + Check the following boxes with X if you want the product: + + + [ ] DosMENU(TM) V2.0 Registration Disk (1.44) 30,- DM + (Newest Info/Boot Choice util/and more) + + [ ] SkyLINE-Production Disk 1 (1.44) 10,- DM + (!DM_V2_0/ARJUTIL/CD_OPEN/DISKINFO/ + MODDISK1/PLAYMOD/PREVIEW1/SHELL/ + SLN_DEMO/SPEAKTIM/TET_COMP) + + [ ] SkyLINE-Production Disk 2 (1.44) 10,- DM + (INFOPACK/STIME_V2/SLN_SMI/COPERINT) + ========= + Please count the money and write here >>> + + + + Please enclose the money in an envelope and I send you the + disk(s) as soon as possible. + + + + + + I accept the above: ·················································· + ( Place your signature here ) + + + Thanks for your Order. Uncle SAM of SkyLINE/18-Apr-95 + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cut here ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + ··········································································· + + +-> How to contact sAM/SkyLINE + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +FIDO Netmail to Stefan Koelle@2:2480/96.23 + +Local Echo at SKYLINE_SUPPORT.GER (Sirius BBS) + +Local Message at Airport to Stefan Koelle - +49-821-563350 v32bis modem + +49-821-563893 vFastClass modem + +Voicetalk at +49-821-416484 (answeringmachine) + +Snailmail to Stefan Koelle - Laugingerstr. 10 - 86154 Augsburg - Germany + + + ··········································································· + + +-> Some information + ^^^^^^^^^^^^^^^^ + +Augsburg first DemoBoard +------------------------ +If someone wants to log into the SkyLINE BBS then you have to call me first +by voice :-( + +I'm no real sysop and if you want the newest stuff from SkyLINE then +call our Support-Sites, but if you really want to call me, no problem. +Also I must say that my BBS is not very comfortably :-( + +So, I must say, my BBS is only useful for demo-groups, because I have +very nice Demos/Intros, Demo-Sources, Music-Tracker, MOD-Files, MID-Files, +GFX-Utils, ANSI-Utils and ofcource our own products. +But please don't call at night, best times are weekdays from 18.00 to +21.00. Thanx. + + +Searching people +---------------- +We are still searching for coders, graphicans or musicans... +Don't hesitate to call me. Also Cooperation-works are welcome. + + +Support BBS's +------------- +We are NO LONGER searching for support BBS's in the area of Augsburg, +but other city's/states/countries are welcome. If someone is interested +then please leave a NetMail to Stefan Koelle@2:2480/96.23 + + + +Take care... *Stefan* + + ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ + Founder and member of √SkyLINE DemoGroup Auxburg + ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ + Contact me: sAM/SkyLINE » fIDOnET········2:2480/96.23 + gERnET·······21:100/1010.23 + rENDERrING···511:3000/96.23 + ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ + + +─═[ End of the iNFOFiLE ]═─ diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..9bc5cb4 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1 @@ +/// <reference path="../.astro/types.d.ts" /> \ No newline at end of file diff --git a/src/layouts/TerminalLayout.astro b/src/layouts/TerminalLayout.astro new file mode 100644 index 0000000..3248ee4 --- /dev/null +++ b/src/layouts/TerminalLayout.astro @@ -0,0 +1,22 @@ +--- +import '../styles/global.css'; +export interface Props { title: string; description?: string; accentClass?: string; } +const { title, description = 'A 90s BBS/demoscene retro hub.', accentClass = '' } = Astro.props; +--- +<html lang="en"> + <head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <title>{title} :: tHE tEMPLE bBS + + + + + + + +
+ +
+ + diff --git a/src/lib/ansiArt.ts b/src/lib/ansiArt.ts new file mode 100644 index 0000000..ec0e39b --- /dev/null +++ b/src/lib/ansiArt.ts @@ -0,0 +1,30 @@ +// Auto-generated - real ANSI art screens from .ANS files + precomputed banners. +// See tools/ansi2html.py for .ANS conversion. + +export const BANNER_SKYLINE = "
         ░▒▓░▒▓░▒▓ ░▒▓   ░▒▓ ░▒▓   ░▒▓ ░▒▓    ░▒▓ ░▒▓   ░▒▓ ░▒▓░▒▓░\n         ░▒▓       ░▒▓   ░▒▓ ░▒▓   ░▒▓ ░▒▓    ░▒▓ ░▒▓░  ░▒▓ ░▒▓\n         ░▒▓░▒▓░▒▓ ░▒▓░▒▓    ░▒▓░▒▓░▒▓ ░▒▓    ░▒▓ ░▒▓░▒▓░▒▓ ░▒▓░▒▓\n┌────────┐     ░▒▓ ░▒▓   ░▒▓       ░▒▓ ░▒▓    ░▒▓ ░▒▓  ▓░▒▓ ░▒▓\n········▒▓░▒▓░▒▓ ░▒▓   ░▒▓       ░▒▓ ░▒▓░▒▓ ░▒▓ ░▒▓   ░▒▓ ░▒▓░▒▓░┌───────────┐\n········                      ┌────────┐                         ···········\n········        ┌─────┐       │········├─────┐                   ···········\n········├────────┤·····       ········│·····│  ┌─────────┐      ···········\n│·····················│  ┌────┤········│·····│  │·········├──────┤···········\n·····················├──┤·················├──┤··························\n                     │  │    │             │  │                          \n\n┌───────────────────┬──────────────────┬───────────────────┬───────────────────┐\n       FILES            DATABASE     MISCELLANEOUS   SYSOP OPTIONS   \n├───────────────────┼──────────────────┼───────────────────┼───────────────────┤\n(C)hange file area (M)essage system  (T)ime on system   (&) Add Filedesc.  \n(F)ile descriptions(Q)uestionnaire   (O)perator chat    (*) Read Sysoplog  \n(P)rogram directory                  (A)nsi color on/off(S)earch for File  \n(Z)ippy file scan  (V)iew bulletins  (X)pert mode toggle(L)og Drive        \n(D)ownload file(s)                   (H)elp with BBS    (+) Trap Doors     \n(U)pload file(s)   (K)nown caller log(G)oodbye log off  (E)cho Mail        \n└───────────────────┴──────────────────┴───────────────────┴───────────────────┘
"; + +export const BANNER_TEMPLE3 = "
        █   █ █▀▀▀▀        █▀▀▀▀ █▄ ▄█ █▀▀▀▄ █     █▀▀▀▀          █▀▀▀▄ ▄▀▀▀▄\n     █  ▓   ▓ ▓         █  ▓     ▓ ▀ ▓ ▓   █ ▓                  ▓   ▓ ▓\n    ▀▒▀ ▒ ▀ ▒ ▒ ▀▀     ▀▒▀ ▒ ▀▀  ▒   ▒ ▒ ▀▀  ▒     ▒ ▀▀     ▒▄▀▀▄ ▒  ▀▄  ▀▀▀▄\n     ░  ░   ░ ░         ░  ░     ░   ░ ░                  ░▄  ░ ░   ░ ▄   ░\n     ▀  ▀   ▀ ▀▀▀▀▀     ▀  ▀▀▀▀▀ ▀   ▀ ▀     ▀▀▀▀▀ ▀▀▀▀▀    ▀ ▀▀  ▀▀▀▀   ▀▀▀\n             MULTI-NET-SERVER AUGSBURG - ONLINE: 2.00 - 5.30 - MAILONLY\n\n\n       ┌──[ Regular Nets ]──────────────────────────────────────────────┐\n       TelefonNet......49:821/416484      FidoNet............2:2480/330\n       └────────────────────────────────────────────────────────────────┘\n\n       ┌──[ Fido Clone Nets ]───────────────────────────────────────────┐\n       XcessNet.........213:315/8630      NightNet......1000:10499/3033\n       └────────────────────────────────────────────────────────────────┘\n\n       ┌──[ Nets with single Topics ]───────────────────────────────────┐\n       KingsNet.........900:4990/115      Sysopnet.........129:1492/130\n       SF-net............142:106/830      Ravenet...........303:498/330\n       Gernet.............21:496/330      MedNet...........80:4091/9177\n       MediaNet..........24:2510/220      PressNet.........193:2490/120\n       └────────────────────────────────────────────────────────────────┘\n\n       ┌──[ Special Nets ]──────────────────────────────────────────────┐\n       THE DEMOBOARD IN AUGSBURG - FREQ FILES - FREE POINTS AND DOWNLINKS
"; + +export const BANNER_INFOFILE = "
             ▄▄▄■\n        ■█████▀                                  ·▀███      ▓██\n    ███████▓    ███■           ■▀██  ■▄       ███▓   ██     ███      ███■\n   ██   ███     ███ ███·    ███▄  ███ ·███    ███    ·██   ███       ██▓ ███·\n       ███     ▓██  ·▀██    ██▓   ███   ███  ███      ██   ███      ███  ·▀██\n tHE   ███     ███         ███   ███    ███  ███      ██  ███       ███\n      ███·    ███          ███   ██▓   ███  ███     ███   ███      ███\n      ███     ██▓█▄▄■     ███·  ■▀     ███  ███ ▀■███    ███       ████▄▄■\n     ███·    ███  ▀█·     ███         ███  ███          ·██▓      ███  ▀█· bBS\n     ███     ███         ███         ███·  ███          ███     · ███\n █  ██▓·       ███  ■█   ███         ███   ██▓           ███  ■█   ▓███  ■█\n ■████·          ███▀   ·█■         █■     █■             ▓███▀       ███▀[mJ]\n\n      ∩^`  ∩^` oóôòooóôòooóôòooóôòooóôòooóôòooóôòooóôòooóôòooóôòo ∩^`  ∩^`\n\n                     º°º  t H E   t E M P L E   b B S  º°º\n\n   º°ºline1º°º+49≈821≈2191≈038º°ºv34+º°°°ºline2º°º+49≈821≈2191≈036º°ºisdnº°º\n\n            º°ºstoned≈brain≈records≈memberboardº°ºszenenet≈2nd≈hqº°º\n      º°ºnet-server≈host≈bayernº°ºscenenetº°ºcomanetº°ºoanetº°º8bitnetº°º\n               º°ºexpression≈distsiteº°ºaironline≈supportsiteº°º\n                               º°ºfreq≈netinfoº°º\n\n      ∩^`  ∩^` uúûùuuúûùuuúûùuuúûùuuúûùuuúûùuuúûùuuúûùuuúûùuuúûùu ∩^`  ∩^`
"; + +export const BANNER_MAINBASE = "
▓▓▓▀▀▀▀▀▀▀▀▓▓▓▀▀▀▀▀▀▀▀▀▀▀▀▓▓▀▀▀▀▀▀▀▓▓▓▀▀▀▀▀▀▀▀▓▓▀▀▀▀▀▀▀▀▓▓▀▀▀▀▀▀▀▀▓▓▀▀▀▀▀▀▀▀▓▓▓\n ▀▀▀▀▀▀  ▀▀▀▀▀█▄    ▀▀▀▀▀  ▀▀▀▀▀█▄  ▀▀▀▀▀█▄  ▀▀▀▀▀█▄  ▀▀▀▀▀█▄ ▒▒\n ██████ ██▌▀▐██  ▀▀  ██ ██ ██▌▀▐██ ██▌▀▐██ ██▌▀  ▀▀ ██▌▀  ▀▀ ░░\n     ░▒ ░▒ ▀▀    ░▒ ░▐  ░▒ ░▐  ░▐ ▄██\n     ▒▓ ▒░ ▒▓       ▒▓ ▒░ ▒▓ ▒░ ▒▓ ▄▄▄▄▒▓ ▒░▄▄▄▄ ███\n ▀▀    ▀▀   ▀▀   ▀▀ ▒▓ ▀▀   ▀▀  █▀▀▀▀▀▀    ▀▀   ▀▀ █▀▀▀▀▀▀[MJ]▀▀▀▀▀▀▀ █▓▓\n▒▄▄▄██████████████▄▄▄█▄ █▀▀ ▄▄███████▄▄▄█████████████▄▄▄█▄▄▄███████████████▓▓▒▒▒\n░░░▒▒▒▓▓▓███▀▀       ▀█▄▄▄██▀▀      ▀▀▀▀▀           ▀▀▀▀▀▀▀▀▀      ▀▀██▓▓▓▒▒▒░░░\n ░▒▒▓▓▓▓▓▀                                                             ▀▓▓▓▒▒░░░\n░▒▒▓▓▓▀                 %%%.tHE.%%%.tEMPLE.%%%.bBS.%%%                  ▀▓▓▓▒▒░\n░▒▓▓▀                                                                    ▀▓▓▓▒░\n░▒▓▀        %A%.areachange.%   %W%....write msg.%   %B%..bbslister.%      ▓▓▓▒░\n░▒▓▄        %F%.filetagger.%   %R%.....read msg.%   %L%..lastusers.%      ▓▓▒▒░\n░▒▒▓▄       %D%...download.%   %P%...page sysop.%   %3%..usersetup.%     ▄▓▒▒░░\n░░▒▓▓▄      %U%.....upload.%   %C%.sysopcomment.%                       ▄▓▓▒░░\n ░▒▒▓▓▄     %S%.filesearch.%   %O%...onlineuser.%                      ▄▓▓▒▒░\n ░░▒▒▓▓▓▄   %N%...newfiles.%   %M%....onlinemsg.%                    ▄▓▓▓▒▒░░\n  ░░▒▒▒▓▓▓▓▄                   %1%...build.conf.%                   ▄▓▓▒▒▒░░\n   ░░░▒▒▒▒▓▓▓▄                 %2%....join.conf.%                ▄▓▓▓▓▒▒░░░\n     ░░░░▒▒▒▓▓▓▓▓▓▄                                      ▄▓▓▓▓▓▓▓▓▓▒▒▒▒░░\n        ░░░▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ %!%.logoff.% ▄▓▓▓▓▓▒▒▒▒▒▒▒▒▒░░░░\n          ░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒░░░░░░░░░
"; + +export const BANNER_LOGGED = "
                               ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n                 ▄▄▄▄▄▄█████████████████████████████████▄▄▄▄▄▄\n            ▄▄███▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▀▀████▄▄\n           █▓▀▀▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▓▓▓▓▓█\n           ░░░░░░░░░░▄▄▄▄░░░░░▄▄▄▄░░░░░▄▄▄▄░░░░░▄▄▄▄░░░▒▒▒▒▒▒▒█\n           ▒▒        ████ ████ ████ ████▄ ▐▓▓▄▄▄░█\n           ▓▓      ▀▀██▌▐▀▀██▌▐▀▀██▌▐▀▀██▌▐▀▀██\n           ██    ▄▄ ▐█  █▓▓▌▐█  █▓▓▌▐█  █▓▓▌▐▀▀▀▀▀▌▐█  █▓▓\n           ███▄█▒░▌▐██▄▒▓█ ▐██▄▒▓█ ▐██▄▒▓█ ▐██▄▒▓█▄▐██▄▒▓\n           █▄ ██▓▒░█  ▀█████▌▄ ▀█████▌▄ ▀█████▌  ▀███████▌▀█████\n            ▀▀▀▀▀     ▀▀▀▀▐█▄ ▀██▐█▄ ▀█     ▀▀▀▀▀▀   ▀▀▀▀ \n             ▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ █████▓▒▌▐█████▓▒█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n             ■·O·■·U·■·T·■ ▀▄ ▀█▓▒░█  ▀█▓▒░     ■·O·■·F·■  [mJ]\n          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█▄▄ ▀▀▀▀ ▄▄▄▄ ▀▀▀ ▄█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n          ■·t·■·H·■·E·■   ■·t·■·E·■·M·■·P·■·L·■·E·■   ■·b·■·B·■·S·■\n          ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
"; + +export const BANNER_TEMPLE = "
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551                                                                              \u2551\n\u2551  tHE                                                                    bBS  \u2551\n\u2551                                                                              \u2551\n\u2551                    \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588   \u2588 \u2588\u2588\u2588\u2588  \u2588     \u2588\u2588\u2588\u2588\u2588                       \u2551\n\u2551                     \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588    \u2588\u2588\u2588\u2588\u2588\u2588                      \u2551\n\u2551                      \u2588\u2588  \u2588\u2588    \u2588\u2588\u2588 \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588    \u2588\u2588                          \u2551\n\u2551                      \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588    \u2588\u2588\u2588\u2588                        \u2551\n\u2551                      \u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588    \u2588\u2588\u2588\u2588\u2588                       \u2551\n\u2551                      \u2588\u2588  \u2588\u2588    \u2588\u2588  \u2588\u2588\u2588\u2588    \u2588\u2588    \u2588\u2588                          \u2551\n\u2551                      \u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588  \u2588\u2588\u2588\u2588    \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                       \u2551\n\u2551                       \u2588   \u2588\u2588\u2588\u2588\u2588 \u2588   \u2588 \u2588     \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                      \u2551\n\u2551                                                                              \u2551\n\u2551     \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591     \u2551\n\u2551                                                                              \u2551\n\u2551                          +49-821-2191038  V34+ISDN                           \u2551\n\u2551          DemoBoard - MultiNetServer - no ratios - Augsburg, Germany          \u2551\n\u2551                       FidoNet: 2:2480/330 - 2:2480/331                       \u2551\n\u2551                                                                              \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d
"; +export const BANNER_KOSMOS = "
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551                                                                              \u2551\n\u2551                    \u2588   \u2588  \u2588\u2588\u2588   \u2588\u2588\u2588\u2588 \u2588   \u2588  \u2588\u2588\u2588   \u2588\u2588\u2588\u2588                       \u2551\n\u2551                    \u2588\u2588 \u2588 \u2588\u2588 \u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588 \u2588\u2588\u2588\u2588                      \u2551\n\u2551                    \u2588\u2588\u2588 \u2588 \u2588\u2588  \u2588\u2588\u2588\u2588    \u2588\u2588\u2588 \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588                          \u2551\n\u2551                    \u2588\u2588 \u2588  \u2588\u2588  \u2588\u2588 \u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588  \u2588\u2588 \u2588\u2588\u2588                        \u2551\n\u2551                    \u2588\u2588\u2588   \u2588\u2588  \u2588\u2588  \u2588\u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588  \u2588\u2588  \u2588\u2588\u2588                       \u2551\n\u2551                    \u2588\u2588 \u2588  \u2588\u2588  \u2588\u2588    \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588    \u2588\u2588                      \u2551\n\u2551                    \u2588\u2588  \u2588  \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588  \u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588                      \u2551\n\u2551                     \u2588   \u2588  \u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588   \u2588  \u2588\u2588\u2588  \u2588\u2588\u2588\u2588                       \u2551\n\u2551                                                                              \u2551\n\u2551     \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591     \u2551\n\u2551                                                                              \u2551\n\u2551                            D E S I G N  [ K D S ]                            \u2551\n\u2551                     Demos, Intros & Outside Productions                      \u2551\n\u2551                                                                              \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d
"; +export const BANNER_ESPRIT = "
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551                                                                              \u2551\n\u2551                    \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                       \u2551\n\u2551                    \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                      \u2551\n\u2551                    \u2588\u2588    \u2588\u2588    \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588  \u2588\u2588    \u2588\u2588                        \u2551\n\u2551                    \u2588\u2588\u2588\u2588   \u2588\u2588\u2588  \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588  \u2588\u2588    \u2588\u2588                        \u2551\n\u2551                    \u2588\u2588\u2588\u2588\u2588   \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588   \u2588\u2588    \u2588\u2588                        \u2551\n\u2551                    \u2588\u2588        \u2588\u2588\u2588\u2588    \u2588\u2588 \u2588    \u2588\u2588    \u2588\u2588                        \u2551\n\u2551                    \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588 \u2588\u2588\u2588    \u2588\u2588  \u2588 \u2588\u2588\u2588\u2588\u2588   \u2588\u2588                        \u2551\n\u2551                     \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588  \u2588     \u2588   \u2588 \u2588\u2588\u2588\u2588\u2588   \u2588                        \u2551\n\u2551                                                                              \u2551\n\u2551     \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591     \u2551\n\u2551                                                                              \u2551\n\u2551                               R E L E A S E S                                \u2551\n\u2551                                                                              \u2551\n\u2551                                                                              \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d
"; +export const BANNER_FIDONET = "
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551                                                                              \u2551\n\u2551                 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588   \u2588\u2588\u2588  \u2588   \u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                    \u2551\n\u2551                 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588 \u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                   \u2551\n\u2551                 \u2588\u2588      \u2588\u2588  \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588      \u2588\u2588                     \u2551\n\u2551                 \u2588\u2588\u2588\u2588    \u2588\u2588  \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588    \u2588\u2588                     \u2551\n\u2551                 \u2588\u2588\u2588\u2588\u2588   \u2588\u2588  \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588   \u2588\u2588                     \u2551\n\u2551                 \u2588\u2588      \u2588\u2588  \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588      \u2588\u2588                     \u2551\n\u2551                 \u2588\u2588    \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588 \u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588   \u2588\u2588                     \u2551\n\u2551                  \u2588     \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588   \u2588\u2588\u2588  \u2588   \u2588 \u2588\u2588\u2588\u2588\u2588   \u2588                     \u2551\n\u2551                                                                              \u2551\n\u2551     \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591     \u2551\n\u2551                                                                              \u2551\n\u2551                          A N D   N O D E L I S T S                           \u2551\n\u2551                       Node 2:2480/330 - tHE tEMPLE bBS                       \u2551\n\u2551                                                                              \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d
"; +export const BANNER_PHOBIA = "
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551                                                                              \u2551\n\u2551                    \u2588\u2588\u2588\u2588  \u2588   \u2588  \u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588                        \u2551\n\u2551                    \u2588\u2588\u2588\u2588\u2588 \u2588\u2588  \u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588                       \u2551\n\u2551                    \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588  \u2588\u2588  \u2588\u2588  \u2588\u2588                      \u2551\n\u2551                    \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588 \u2588  \u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588                      \u2551\n\u2551                    \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588   \u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588                      \u2551\n\u2551                    \u2588\u2588    \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588  \u2588\u2588  \u2588\u2588  \u2588\u2588                      \u2551\n\u2551                    \u2588\u2588    \u2588\u2588  \u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588  \u2588\u2588                      \u2551\n\u2551                     \u2588     \u2588   \u2588  \u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588   \u2588                      \u2551\n\u2551                                                                              \u2551\n\u2551     \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591     \u2551\n\u2551                                                                              \u2551\n\u2551                      D E M O G R O U P   A R C H I V E                       \u2551\n\u2551                                                                              \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d
"; +export const BANNER_TRANCE = "
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551                                                                              \u2551\n\u2551                    \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588   \u2588\u2588\u2588  \u2588   \u2588  \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                       \u2551\n\u2551                     \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588 \u2588\u2588  \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588                      \u2551\n\u2551                      \u2588\u2588  \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588    \u2588\u2588                          \u2551\n\u2551                      \u2588\u2588  \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588    \u2588\u2588\u2588\u2588                        \u2551\n\u2551                      \u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588    \u2588\u2588\u2588\u2588\u2588                       \u2551\n\u2551                      \u2588\u2588  \u2588\u2588 \u2588  \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588    \u2588\u2588                          \u2551\n\u2551                      \u2588\u2588  \u2588\u2588  \u2588 \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588 \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                       \u2551\n\u2551                       \u2588   \u2588   \u2588 \u2588   \u2588 \u2588   \u2588  \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                      \u2551\n\u2551                                                                              \u2551\n\u2551     \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591     \u2551\n\u2551                                                                              \u2551\n\u2551                                M I S S I O N                                 \u2551\n\u2551                             Archive of Releases                              \u2551\n\u2551                                                                              \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d
"; +export const BANNER_AMIGA = "
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551                                                                              \u2551\n\u2551                        \u2588\u2588\u2588  \u2588   \u2588 \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588                           \u2551\n\u2551                       \u2588 \u2588\u2588\u2588 \u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588                          \u2551\n\u2551                       \u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588  \u2588\u2588  \u2588\u2588    \u2588\u2588  \u2588\u2588                         \u2551\n\u2551                       \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588  \u2588\u2588  \u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588                         \u2551\n\u2551                       \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588  \u2588\u2588  \u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588                         \u2551\n\u2551                       \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588  \u2588\u2588  \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588                         \u2551\n\u2551                       \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588  \u2588\u2588                         \u2551\n\u2551                        \u2588   \u2588 \u2588   \u2588 \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588 \u2588   \u2588                         \u2551\n\u2551                                                                              \u2551\n\u2551     \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591     \u2551\n\u2551                                                                              \u2551\n\u2551                              M O D   F I L E S                               \u2551\n\u2551                           Module Music Collection                            \u2551\n\u2551                                                                              \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d
"; +export const BANNER_ATARI = "
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551                                                                              \u2551\n\u2551                    \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588   \u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588                       \u2551\n\u2551                     \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588                      \u2551\n\u2551                      \u2588\u2588  \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588  \u2588\u2588  \u2588\u2588                          \u2551\n\u2551                      \u2588\u2588  \u2588\u2588\u2588\u2588 \u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588 \u2588  \u2588\u2588  \u2588\u2588                          \u2551\n\u2551                      \u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588\u2588   \u2588\u2588  \u2588\u2588                          \u2551\n\u2551                      \u2588\u2588  \u2588\u2588 \u2588  \u2588\u2588  \u2588\u2588\u2588\u2588      \u2588\u2588  \u2588\u2588                          \u2551\n\u2551                      \u2588\u2588  \u2588\u2588  \u2588  \u2588\u2588\u2588 \u2588\u2588\u2588    \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588                       \u2551\n\u2551                       \u2588   \u2588   \u2588  \u2588\u2588\u2588  \u2588     \u2588\u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588                      \u2551\n\u2551                                                                              \u2551\n\u2551     \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591     \u2551\n\u2551                                                                              \u2551\n\u2551                                 D R E A M s                                  \u2551\n\u2551                       Atari ST Games & Tools 1990-1992                       \u2551\n\u2551                                                                              \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d
"; +export const BOX_USEFUL_INFO = "
-[ USEFULL INFORMATION ]----------------------------------------------------\n o  analog/isdn number  +49-821-2191038                                     \n o  mailonly number     +49-821-2191036                                     \n o  all nets are free of charge                                             \n o  everything in the file areas can be downloaded for free                 \n----------------------------------------------------------------------------
"; +export const BOX_SUPPORTED_NETS = "
-[ SUPPORTED NETS ]---------------------------------------------------------\n FIDONET .... General, points and nodes free of charge                      \n FILENET .... General file network                                          \n OANET ...... Sound & graphics files for WIN, DOS, OS/2   [HOST]            \n RAVENET .... The network for techno freaks              [HUB]              \n 8BITNET .... The network for 8-bit computers             [HOST]            \n PPPSNET .... Info, techno, chat, anything related        [HOST]            \n MIXNET ..... Talk, song lyrics, general stuff                              \n----------------------------------------------------------------------------
"; +export const BOX_REGULAR_NETS = "
-[ Regular Nets ]-----------------------------------------------------------\n TelefonNet ...... 49:821/416484        FidoNet ......... 2:2480/330        \n----------------------------------------------------------------------------
"; +export const BOX_CLONE_NETS = "
-[ Fido Clone Nets ]--------------------------------------------------------\n XcessNet ........ 213:315/8630         NightNet ........ 1000:10499/3043   \n----------------------------------------------------------------------------
"; +export const BOX_SINGLE_TOPIC_NETS = "
-[ Nets with single Topics ]------------------------------------------------\n KingsNet ...... 900:4990/115           SysopNet ...... 129:1492/130        \n SF-net ........ 142:106/830             RaveNet ....... 303:498/330        \n Gernet ........ 21:496/330              MedNet ........ 80:4091/9177       \n MediaNet ...... 24:2510/220             PressNet ...... 193:2490/120       \n----------------------------------------------------------------------------
"; +export const BOX_SPECIAL_NETS = "
-[ Special Nets ]-----------------------------------------------------------\n 999er-MBG ...... 999:2/56               BavariaNet ..... 95:106/113        \n----------------------------------------------------------------------------
"; +export const BOX_CHAT_NETS = "
-[ Chat Nets ]--------------------------------------------------------------\n UP-Net ........ ??:498/soon             TacoNet ....... 31:4990/22         \n PseudoNet ..... 33:104/20               FFNet ......... 60:666/330         \n Phantasy Net .. 202:498/3030            BierNet ....... 44:510/230         \n----------------------------------------------------------------------------
"; +export const BOX_DEMO_NETS = "
-[ Demo Nets ]--------------------------------------------------------------\n AquaNet ........ 139:5050/41            Scene-Net ...... 99:200/530        \n----------------------------------------------------------------------------
"; +export const BOX_AVAILABLE_NETS = "
-[ Available Nets (full list, HOST/HUB roles) ]-------------------------------\n COMA Net ...... 425:105/0 /30 /31      [HOST] MusicNetwork                   \n SceneNet ...... 99:120/0 /100/130      [HOST] SceneNetwork                   \n OhrAugeNet .... 123:4017/0 /30/31       [HOST] Sound&GFXNetwork              \n Air-NET ....... 66:8000/1 /2 /3 /8200   [HOST] AIR-Online Software           \n WurmNet ....... 189:905/100 /130/131    [HUB]  UniversalNetwork              \n BavariaNet .... 95:106/300 /330/331     [HUB]  UniversalNetwork              \n UP-Net ........ 55:498/200 /230/231     [HUB]  LocalNetwork                  \n PseudoNet ..... 33:104/200 /230/231     [HUB]  ChatNetwork                   \n EuroNet ....... 29:245/300 /330/331     [HUB]  ChatNetwork                   \n EuroAccess .... 225:492/300 /330/331    [HUB]  ChatNetwork                   \n McMailNet ..... 321:4906/230 /231       RAUN ......... 63:4971/130/131       \n PascalNet ..... 115:4903/830/831        XcessNet ...... 213:315/8630/8631    \n FF-Net ........ 60:666/330/331          NightNet ...... 1000:10499/3033/3043 \n SysopNet ...... 129:1492/130/131        RaveNet ....... 303:498/330/331      \n MediaNet ...... 24:2510/220             PressNet ...... 193:2490/120         \n KingsNet ...... 900:4990/115            OS2Net ........ 81:449/8630/8631     \n------------------------------------------------------------------------------
";export const BANNER_ANSI = "
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551                                                                              \u2551\n\u2551                           \u2588\u2588\u2588  \u2588   \u2588  \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                             \u2551\n\u2551                          \u2588 \u2588\u2588\u2588 \u2588\u2588  \u2588\u2588\u2588 \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588                            \u2551\n\u2551                          \u2588\u2588  \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588      \u2588\u2588                              \u2551\n\u2551                          \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588    \u2588\u2588                              \u2551\n\u2551                          \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588  \u2588\u2588\u2588   \u2588\u2588                              \u2551\n\u2551                          \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588    \u2588\u2588  \u2588\u2588                              \u2551\n\u2551                          \u2588\u2588  \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588                             \u2551\n\u2551                           \u2588   \u2588 \u2588   \u2588 \u2588\u2588\u2588\u2588  \u2588\u2588\u2588\u2588\u2588                            \u2551\n\u2551                                                                              \u2551\n\u2551     \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591     \u2551\n\u2551                                                                              \u2551\n\u2551                            A R T   G A L L E R Y                             \u2551\n\u2551                       Original BBS screens, 1993-1996                        \u2551\n\u2551                                                                              \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d
"; \ No newline at end of file diff --git a/src/lib/keymap.ts b/src/lib/keymap.ts new file mode 100644 index 0000000..55e0220 --- /dev/null +++ b/src/lib/keymap.ts @@ -0,0 +1,22 @@ +export type KeymapEntry = { key: string; href: string; label: string }; +export const GLOBAL_NAV_KEYS: KeymapEntry[] = [ + { key: 'B', href: 'back', label: 'Back' }, + { key: 'Q', href: 'disconnect', label: 'Disconnect' }, + { key: 'I', href: '/bbs/legal-notice', label: 'Legal Notice' }, +]; +export const MENU_KEYS: KeymapEntry[] = [ + { key: 'P', href: '/bbs/pc/phobia', label: 'PHOB!A' }, + { key: 'T', href: '/bbs/pc/trancemission', label: 'Tr@nceMISSION' }, + { key: 'S', href: '/bbs/pc/skyline', label: 'SkyLINE Productions' }, + { key: 'K', href: '/bbs/pc/kosmos-design', label: 'Kosmos Design [KDS]' }, + { key: 'D', href: '/bbs/atari/tropic-dreams', label: 'Tropic DREAMs' }, + { key: 'E', href: '/bbs/amiga/esprit', label: 'ESPRIT Releases' }, + { key: 'M', href: '/bbs/amiga/mods', label: 'MOD Files' }, + { key: 'A', href: '/bbs/fido/ansi-art', label: 'BBS ANSI Art' }, + { key: 'F', href: '/bbs/fido/nodelist', label: 'Fidonets and Nodelists' }, +]; +export const ALL_KEYS: KeymapEntry[] = [...GLOBAL_NAV_KEYS, ...MENU_KEYS]; +export function findKeyEntry(pressedKey: string): KeymapEntry | undefined { + const upper = pressedKey.toUpperCase(); + return ALL_KEYS.find((entry) => entry.key === upper); +} diff --git a/src/lib/sound.ts b/src/lib/sound.ts new file mode 100644 index 0000000..4d7f8e6 --- /dev/null +++ b/src/lib/sound.ts @@ -0,0 +1,20 @@ +export async function playLine1Sequence(onComplete: () => void) { + const steps = ['/audio/dial-tone.mp3', '/audio/dtmf-beeps.mp3', '/audio/modem-handshake.mp3']; + for (const src of steps) { await playClip(src); } + onComplete(); +} +function playClip(src: string): Promise { + return new Promise((resolve) => { + const audio = new Audio(src); + audio.addEventListener('ended', () => resolve()); + audio.addEventListener('error', () => resolve()); + audio.play().catch(() => resolve()); + }); +} +const STORAGE_KEY = 'hasConnected'; +export function hasConnectedBefore(): boolean { + if (typeof localStorage === 'undefined') return false; + return localStorage.getItem(STORAGE_KEY) === 'true'; +} +export function markConnected() { localStorage.setItem(STORAGE_KEY, 'true'); } +export function resetConnected() { localStorage.removeItem(STORAGE_KEY); } diff --git a/src/pages/bbs/amiga/esprit.astro b/src/pages/bbs/amiga/esprit.astro new file mode 100644 index 0000000..a75043b --- /dev/null +++ b/src/pages/bbs/amiga/esprit.astro @@ -0,0 +1,68 @@ +--- +import { getCollection } from 'astro:content'; +import TerminalLayout from '../../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../../components/TerminalShell'; +import StatusBar from '../../../components/StatusBar.astro'; +import NavBar from '../../../components/NavBar.astro'; +import AnsiArt from '../../../components/AnsiArt.astro'; +import { BANNER_ESPRIT } from '../../../lib/ansiArt'; +import LetterFooter from '../../../components/LetterFooter.astro'; +const releases = await getCollection('esprit'); +--- + + + + +

ESPRIT Releases

+

A collection of demos built on the Amiga 500.

+ {releases.map((release) => ( +
+
+

{release.data.title}

+

{release.data.description}

+

Year: {release.data.year ?? '19xx'}   Platform: {release.data.platform}

+
+ + {release.data.screenshot && {release.data.title}} + {!release.data.screenshot && release.data.file_id_diz} + +
+ ))} + + + +
+ + +
diff --git a/src/pages/bbs/amiga/mods.astro b/src/pages/bbs/amiga/mods.astro new file mode 100644 index 0000000..1b0b159 --- /dev/null +++ b/src/pages/bbs/amiga/mods.astro @@ -0,0 +1,23 @@ +--- +import TerminalLayout from '../../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../../components/TerminalShell'; +import StatusBar from '../../../components/StatusBar.astro'; +import NavBar from '../../../components/NavBar.astro'; +import AnsiArt from '../../../components/AnsiArt.astro'; +import { BANNER_AMIGA } from '../../../lib/ansiArt'; +import LetterFooter from '../../../components/LetterFooter.astro'; +import ModPlayer from '../../../components/ModPlayer'; +import mods from '../../../data/mods.json'; +--- + + + + +

MOD Files

+

My personal MOD file collection — all tracks composed by me on the Amiga. Click ▶ to play in-browser (WASM, libopenmpt).

+ + + + +
+
diff --git a/src/pages/bbs/atari/tropic-dreams.astro b/src/pages/bbs/atari/tropic-dreams.astro new file mode 100644 index 0000000..46afaf0 --- /dev/null +++ b/src/pages/bbs/atari/tropic-dreams.astro @@ -0,0 +1,30 @@ +--- +import { getCollection } from 'astro:content'; +import TerminalLayout from '../../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../../components/TerminalShell'; +import StatusBar from '../../../components/StatusBar.astro'; +import NavBar from '../../../components/NavBar.astro'; +import AnsiArt from '../../../components/AnsiArt.astro'; +import { BANNER_ATARI } from '../../../lib/ansiArt'; +import LetterFooter from '../../../components/LetterFooter.astro'; +const releases = (await getCollection('tropicdreams')).sort((a, b) => (a.data.year ?? 0) - (b.data.year ?? 0)); +--- + + + + +

Tropic DREAMs

+

Stefan's pseudonym for everything released on the Atari ST - a 1040 STFM (1MB, low-res) and later a Mega 4 (4MB, 60MB HD, hi-res 640x400). Four releases between 1990 and 1992:

+ {releases.map((release) => ( +
+

{release.data.title} ({release.data.year})

{release.data.description}

Credits: {release.data.credits.map((c) => `${c.role} - ${c.name}`).join(' | ')}

+ +{release.data.file_id_diz} + +
+ ))} + + + +
+
diff --git a/src/pages/bbs/cds.astro b/src/pages/bbs/cds.astro new file mode 100644 index 0000000..16f162a --- /dev/null +++ b/src/pages/bbs/cds.astro @@ -0,0 +1,161 @@ +--- +import TerminalLayout from '../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../components/TerminalShell'; +import StatusBar from '../../components/StatusBar.astro'; +import NavBar from '../../components/NavBar.astro'; +import LetterFooter from '../../components/LetterFooter.astro'; +import AnsiArt from '../../components/AnsiArt.astro'; +import { BANNER_TEMPLE } from '../../lib/ansiArt'; + +const cds = [ + { id: 1, title: 'tHE tEMPLE cD #1', file: 'templecd1.txt', url: 'https://www.moonweb.org/files/bbs/templecd1.txt', size: '650 MB' }, + { id: 2, title: 'tHE tEMPLE cD #2', file: 'templecd2.txt', url: 'https://www.moonweb.org/files/bbs/templecd2.txt', size: '650 MB' }, + { id: 3, title: 'tHE tEMPLE cD #3', file: 'templecd3.txt', url: 'https://www.moonweb.org/files/bbs/templecd3.txt', size: '650 MB' }, + { id: 4, title: 'tHE tEMPLE cD #4', file: 'templecd4.txt', url: 'https://www.moonweb.org/files/bbs/templecd4.txt', size: '650 MB' }, +]; +--- + + + +

tHE tEMPLE bBS CDs

+

Four CD compilations with files from the FidoNet networks of the 1990s. Each CD contains approx. 650 MB of Shareware, Freeware, Demoscene productions and BBS utilities.

+
+
+ {cds.map((cd) => ( + + #{cd.id} + {cd.title} + {cd.size} + + ))} +
+ tHE tEMPLE cD +
+ + + +
+ + + +
diff --git a/src/pages/bbs/fido/ansi-art.astro b/src/pages/bbs/fido/ansi-art.astro new file mode 100644 index 0000000..b07fbd7 --- /dev/null +++ b/src/pages/bbs/fido/ansi-art.astro @@ -0,0 +1,34 @@ +--- +import TerminalLayout from '../../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../../components/TerminalShell'; +import StatusBar from '../../../components/StatusBar.astro'; +import NavBar from '../../../components/NavBar.astro'; +import AnsiArt from '../../../components/AnsiArt.astro'; +import { BANNER_ANSI, BANNER_SKYLINE, BANNER_TEMPLE3, BANNER_INFOFILE, BANNER_MAINBASE, BANNER_LOGGED } from '../../../lib/ansiArt'; +import LetterFooter from '../../../components/LetterFooter.astro'; + +const screens = [ + { title: "SKYLINE VERSION", html: BANNER_SKYLINE }, + { title: "NETLIST", html: BANNER_TEMPLE3 }, + { title: "INFOFILE", html: BANNER_INFOFILE }, + { title: "MAINBASE", html: BANNER_MAINBASE }, + { title: "LOGGED", html: BANNER_LOGGED }, +]; +--- + + + + +

BBS ANSI Art

+

Original .ANS screens from tHE tEMPLE bBS (Augsburg, FidoNet 2:2480/330).

+ {screens.map((screen) => ( + + ))} + + + +
+
diff --git a/src/pages/bbs/fido/nodelist.astro b/src/pages/bbs/fido/nodelist.astro new file mode 100644 index 0000000..e5142e1 --- /dev/null +++ b/src/pages/bbs/fido/nodelist.astro @@ -0,0 +1,35 @@ +--- +import TerminalLayout from '../../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../../components/TerminalShell'; +import StatusBar from '../../../components/StatusBar.astro'; +import NavBar from '../../../components/NavBar.astro'; +import AnsiArt from '../../../components/AnsiArt.astro'; +import { + BANNER_FIDONET, BOX_USEFUL_INFO, BOX_SUPPORTED_NETS, + BOX_REGULAR_NETS, BOX_CLONE_NETS, BOX_SINGLE_TOPIC_NETS, + BOX_SPECIAL_NETS, BOX_CHAT_NETS, BOX_DEMO_NETS, BOX_AVAILABLE_NETS, +} from '../../../lib/ansiArt'; +import LetterFooter from '../../../components/LetterFooter.astro'; +--- + + + + +

Fidonets and Nodelists

+

tHE tEMPLE bBS was Fidonet node 2:2480/330 (with a point network at 2:2480/331), running as a multi-net-server with a long list of other networks, most free to join and free to use for downloads. Sysop: Stefan Koelle.

+ + +

Net Groups (as listed on the original welcome screen)

+ + + + + + +

Full Available Nets List (HOST/HUB roles)

+ + + + +
+
diff --git a/src/pages/bbs/index.astro b/src/pages/bbs/index.astro new file mode 100644 index 0000000..f827811 --- /dev/null +++ b/src/pages/bbs/index.astro @@ -0,0 +1,55 @@ +--- +import TerminalLayout from '../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../components/TerminalShell'; +import Tile from '../../components/Tile.astro'; +import StatusBar from '../../components/StatusBar.astro'; +import LetterFooter from '../../components/LetterFooter.astro'; +import NavBar from '../../components/NavBar.astro'; +import AnsiArt from '../../components/AnsiArt.astro'; +import { BANNER_TEMPLE } from '../../lib/ansiArt'; +--- + + + +
+ + +
+ + +
+
diff --git a/src/pages/bbs/legal-notice.astro b/src/pages/bbs/legal-notice.astro new file mode 100644 index 0000000..2e3880f --- /dev/null +++ b/src/pages/bbs/legal-notice.astro @@ -0,0 +1,25 @@ +--- +import TerminalLayout from '../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../components/TerminalShell'; +import StatusBar from '../../components/StatusBar.astro'; +import NavBar from '../../components/NavBar.astro'; +import LetterFooter from '../../components/LetterFooter.astro'; +--- + + + +

Legal Notice

+

Stefan Kölle
+Neumarkter Str. 86c
+81673 München, Germany
+
+Phone/Fax: +49-(89)-20006547
+Email: 28k8@moonweb.org +

+

Responsible for content according to § 18 (2) MStV: Stefan Kölle, address as above.

+

Full legal notice & privacy policy for this website and the moonweb.org network: hub.moonweb.org/impressum

+ + + +
+
diff --git a/src/pages/bbs/pc/kosmos-design.astro b/src/pages/bbs/pc/kosmos-design.astro new file mode 100644 index 0000000..7178cf9 --- /dev/null +++ b/src/pages/bbs/pc/kosmos-design.astro @@ -0,0 +1,86 @@ +--- +import { getCollection } from 'astro:content'; +import { readFileSync } from 'node:fs'; +import TerminalLayout from '../../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../../components/TerminalShell'; +import StatusBar from '../../../components/StatusBar.astro'; +import NavBar from '../../../components/NavBar.astro'; +import AnsiArt from '../../../components/AnsiArt.astro'; +import { BANNER_KOSMOS } from '../../../lib/ansiArt'; +import LetterFooter from '../../../components/LetterFooter.astro'; +import TextOverlay from '../../../components/TextOverlay.astro'; +import TextOverlayScript from '../../../components/TextOverlayScript.astro'; +const kosmosTxt = readFileSync('src/data/kds-kosmos.txt', 'utf-8'); +const filesBbs = readFileSync('src/data/kds-files-bbs.txt', 'utf-8'); +const allReleases = await getCollection('kosmos-design'); +const outsideReleases = allReleases.filter((r) => r.data.group.includes('Outside Productions')); +const lethalIllusion = allReleases.filter((r) => r.data.group.includes('Lethal Illusion')); +const tapes = allReleases.filter((r) => r.data.platform === 'Audio'); +const remaining = allReleases.filter((r) => !r.data.group.includes('Outside Productions') && !r.data.group.includes('Lethal Illusion') && r.data.platform !== 'Audio'); +const tools = remaining.filter((r) => r.data.platform === 'DOS'); +--- + + + + +

kOSMOS-d-Sign [KDS]

+

marc JiNX^kDS^SBR (Stefan Koelle) - Augsburg, May '96. After giving up as coordinator of SkyLINE ("you probably think SkyLINE was lame and it was sure!"), KDS became the outlet for personal releases that couldn't go through a demogroup. Also a member of SBR.

+

Closely tied to tHE tEMPLE bBS - a reference screen even carried the tag "%KDS world headquarter%". BBS: 49.821.2191038 (Modem), 49.821.2191036 (ISDN). Networks: stoned brain records, comanet, scenenet, oanet, 8bitnet.

+

Source files:

+

Tools

+ {tools.map((release) => ( +
+
+

{release.data.title}

+

{release.data.description}

+

Year: {release.data.year ?? '19xx'}   Platform: {release.data.platform}

+ {release.data.download_url &&

Download

} +
+
{release.data.file_id_diz}
+
+ ))} +

DJ Mix Tapes

+ {tapes.map((release) => ( +
+
+

{release.data.title}

+

{release.data.description}

+

Year: {release.data.year ?? '19xx'}   Length: 90 min

+ {release.data.download_url &&

Download

} +
+ {release.data.file_id_diz &&
{release.data.file_id_diz}
} +
+ ))} +

Lethal Illusion [Duke 3D]

+ {lethalIllusion.map((release) => ( +
+
+

{release.data.title}

+

{release.data.description}

+

Year: {release.data.year ?? '19xx'}   Platform: {release.data.platform}

+ {release.data.download_url &&

Download

} +
+
{release.data.file_id_diz}
+
+ ))} +

Outside Productions (BBS Intros)

+ {outsideReleases.map((release) => ( +
+
+

{release.data.title}

+

{release.data.description}

+

Credits: {release.data.credits.map((c) => `${c.role} - ${c.name}`).join(' | ')}

+ {release.data.download_url &&

Download

} +
+
{release.data.file_id_diz}
+
+ ))} + + + +
+ +
diff --git a/src/pages/bbs/pc/phobia.astro b/src/pages/bbs/pc/phobia.astro new file mode 100644 index 0000000..c59a6f9 --- /dev/null +++ b/src/pages/bbs/pc/phobia.astro @@ -0,0 +1,33 @@ +--- +import TerminalLayout from '../../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../../components/TerminalShell'; +import StatusBar from '../../../components/StatusBar.astro'; +import NavBar from '../../../components/NavBar.astro'; +import AnsiArt from '../../../components/AnsiArt.astro'; +import { BANNER_PHOBIA } from '../../../lib/ansiArt'; +import LetterFooter from '../../../components/LetterFooter.astro'; +--- + + + + + PHOB!A +

PHOB!A

+
+
+

PHOB!A was a short-lived but memorable PC DemoGroup in 1994. The highlight was the Phobia Welcome Intro — coded in Turbo Pascal with inline assembler on a 486 DX50, using palette tricks for animation and a custom font compiled into the executable.

+

Source code is available on GitHub.

+
+
{`PHOB!A DemoGroup
+------------------
+PC Intros - 1994
+Turbo Pascal + ASM
+486 DX50
+X-LIB TextGraf`}
+
+

-> Visit the full PHOB!A archive with screenshots & videos

+ + + +
+
diff --git a/src/pages/bbs/pc/skyline.astro b/src/pages/bbs/pc/skyline.astro new file mode 100644 index 0000000..b5b78a7 --- /dev/null +++ b/src/pages/bbs/pc/skyline.astro @@ -0,0 +1,61 @@ +--- +import { getCollection } from 'astro:content'; +import { readFileSync } from 'node:fs'; +import TerminalLayout from '../../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../../components/TerminalShell'; +import StatusBar from '../../../components/StatusBar.astro'; +import NavBar from '../../../components/NavBar.astro'; +import AnsiArt from '../../../components/AnsiArt.astro'; +import { BANNER_SKYLINE } from '../../../lib/ansiArt'; +import LetterFooter from '../../../components/LetterFooter.astro'; +import TextOverlay from '../../../components/TextOverlay.astro'; +import TextOverlayScript from '../../../components/TextOverlayScript.astro'; +const skylineFilesBbs = readFileSync('src/data/skyline-files-bbs.txt', 'utf-8'); +const skyline94 = readFileSync('src/data/skyline94.txt', 'utf-8'); +const skyline95 = readFileSync('src/data/skyline95.txt', 'utf-8'); +const releases = await getCollection('skyline'); +const tools = releases.filter((r) => !r.data.title.toLowerCase().includes('intro') && !r.data.title.toLowerCase().includes('demo') && !r.data.title.toLowerCase().includes('copper') && !r.data.title.toLowerCase().includes('shark') && !r.data.title.toLowerCase().includes('highland') && !r.data.title.toLowerCase().includes('searching')); +const intros = releases.filter((r) => r.data.title.toLowerCase().includes('intro') || r.data.title.toLowerCase().includes('demo') || r.data.title.toLowerCase().includes('copper') || r.data.title.toLowerCase().includes('shark') || r.data.title.toLowerCase().includes('highland') || r.data.title.toLowerCase().includes('searching')); +--- + + + + +

SkyLINE Productions

+

Augsburg's first DemoGroup. Sterling (Stefan Kölle) and M.H. (Matthias Hebeisen) coding utilities, intros and games since 1993.

+

"We want to code real cool demos in asm."

+

Source files:

+

Tools & Utilities

+ {tools.map((release) => ( +
+
+

{release.data.title}

+

{release.data.description}

+

Year: {release.data.year ?? '19xx'}   Platform: {release.data.platform}

+ {release.data.download_url &&

Download

} +
+
{release.data.file_id_diz}
+
+ ))} +

Intros & Demos

+ {intros.map((release) => ( +
+
+

{release.data.title}

+

{release.data.description}

+

Year: {release.data.year ?? '19xx'}   Platform: {release.data.platform}

+ {release.data.download_url &&

Download

} +
+
{release.data.file_id_diz}
+
+ ))} + + + +
+ +
diff --git a/src/pages/bbs/pc/trancemission.astro b/src/pages/bbs/pc/trancemission.astro new file mode 100644 index 0000000..65d6f06 --- /dev/null +++ b/src/pages/bbs/pc/trancemission.astro @@ -0,0 +1,33 @@ +--- +import TerminalLayout from '../../../layouts/TerminalLayout.astro'; +import TerminalShell from '../../../components/TerminalShell'; +import StatusBar from '../../../components/StatusBar.astro'; +import NavBar from '../../../components/NavBar.astro'; +import AnsiArt from '../../../components/AnsiArt.astro'; +import { BANNER_TRANCE } from '../../../lib/ansiArt'; +import LetterFooter from '../../../components/LetterFooter.astro'; +--- + + + + + Tr@nceMISSION +

Tr@nceMISSION

+
+
+

Tr@nceMISSION was a Programming & Cracking Crew active from 1992 to 1995. The group was led by Stefan Koelle and created DOS demos and intros using Turbo Pascal and assembler, pushing the hardware capabilities of the time with creative animations, sound effects, and interactive elements.

+

The archive features three Pascal intros — Star Intro, Logo Intro, and Menu Intro — each showcasing animated graphics, sine wave text effects, and SoundBlaster support. Source code is available on GitHub.

+
+
{`Tr@nceMISSION
+------------------
+DOS Demos & Intros
+Turbo Pascal + ASM
+1992 - 1995
+SoundBlaster FX`}
+
+

-> Visit the full Tr@nceMISSION archive with screenshots & videos

+ + + +
+
diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..5261e45 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,16 @@ +--- +import TerminalLayout from '../layouts/TerminalLayout.astro'; +import ModemIntro from '../components/ModemIntro'; +import WelcomeBanner from '../components/WelcomeBanner.astro'; +const now = new Date(); +const dateStr = `${String(now.getDate()).padStart(2, '0')}.${String(now.getMonth() + 1).padStart(2, '0')}.1994`; +--- + + +

Travel back to the '90s

+ +
Status: not connected{dateStr}
+ +
diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..74d4ebe --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,93 @@ +/* Global terminal styling - v2: color-run classes for ANSI art, NavBar, strengthened SkyLINE blue accent. */ +@font-face { font-family: 'Px437 IBM VGA 8x16'; src: url('/fonts/Px437_IBM_VGA_8x16.woff2') format('woff2'), url('/fonts/Px437_IBM_VGA_8x16.ttf') format('truetype'); font-display: swap; } +:root { + --bg:#000; --fg:#c0c0c0; --fg-bright:#fff; + --red-dark:#8b0000; --red-bright:#ff2828; --red-shadow:#4a0000; --pink:#ff69b4; --yellow:#ffd23f; --grey:#969696; + --blue-dark:#00008b; --blue-bright:#55aaff; --blue-shadow:#000050; --cyan:#50e6e6; + --font-ansi:'Px437 IBM VGA 8x16','Perfect DOS VGA 437',monospace; --font-body:'IBM Plex Mono',ui-monospace,monospace; --terminal-width-ch:calc(84ch + 13px); +} +* { box-sizing: border-box; } +html, body { margin:0; background:var(--bg); color:var(--fg); font-family:var(--font-body); -webkit-text-size-adjust: none; } +a { color: inherit; } +.terminal-frame { max-width: var(--terminal-width-ch); margin:0 auto; padding:1rem; } +.ansi-text { font-family: var(--font-ansi); white-space: pre; overflow-x: hidden; line-height: 1.05; font-size: 18px; } +.ansi-banner { margin: 0 0 1rem; } +.ansi-full { margin: 0.5rem 0; overflow-x: auto; } +.ansi-snippet { margin: 0.5rem 0; font-size: 0.8em; } +.net-box { margin: 0.5rem 0; } +.c-border-red{color:var(--red-dark);} .c-main-red{color:var(--red-bright);font-weight:bold;} .c-shadow-red{color:var(--red-shadow);} +.c-border-blue{color:var(--blue-dark);} .c-main-blue{color:var(--blue-bright);font-weight:bold;} .c-shadow-blue{color:var(--blue-shadow);} +.c-white{color:var(--fg-bright);font-weight:bold;} .c-grey{color:var(--grey);} .c-pink{color:var(--pink);font-weight:bold;} .c-cyan{color:var(--cyan);font-weight:bold;} +/* ANSI 16-color palette — FG (SGR index → correct hex) */ +.c-fg-0{color:#000000;} .c-fg-1{color:#aa0000;} .c-fg-2{color:#00aa00;} .c-fg-3{color:#aa5500;} +.c-fg-4{color:#0000aa;} .c-fg-5{color:#aa00aa;} .c-fg-6{color:#00aaaa;} .c-fg-7{color:#aaaaaa;} +.c-fg-8{color:#555555;} .c-fg-9{color:#ff5555;} .c-fg-10{color:#55ff55;} .c-fg-11{color:#ffff55;} +.c-fg-12{color:#5555ff;} .c-fg-13{color:#ff55ff;} .c-fg-14{color:#55ffff;} .c-fg-15{color:#ffffff;} +/* ANSI 16-color palette — BG */ +.c-bg-0{background:#000000;} .c-bg-1{background:#aa0000;} .c-bg-2{background:#00aa00;} .c-bg-3{background:#aa5500;} +.c-bg-4{background:#0000aa;} .c-bg-5{background:#aa00aa;} .c-bg-6{background:#00aaaa;} .c-bg-7{background:#aaaaaa;} +.c-bg-8{background:#555555;} .c-bg-9{background:#ff5555;} .c-bg-10{background:#55ff55;} .c-bg-11{background:#ffff55;} +.c-bg-12{background:#5555ff;} .c-bg-13{background:#ff55ff;} .c-bg-14{background:#55ffff;} .c-bg-15{background:#ffffff;} +.c-bold{font-weight:normal;} +.tile { border:1px solid var(--red-dark); color:var(--fg); padding:0.75rem; cursor:pointer; display:block; text-decoration:none; background: linear-gradient(180deg, rgba(139,0,0,0.18), rgba(0,0,0,0) 60%); } +.tile:hover, .tile:focus-visible { border-color: var(--red-bright); outline:none; box-shadow: inset 0 0 0 1px var(--red-bright), 0 0 8px rgba(255,40,40,0.35); background: linear-gradient(180deg, rgba(255,40,40,0.15), rgba(0,0,0,0) 70%); } +.tile h3 { color: var(--red-bright); margin: 0 0 0.5rem; } +.tile-grid { display:grid; grid-template-columns: 1fr 1fr; gap:1rem; } +@media (max-width:640px) { .tile-grid { grid-template-columns: 1fr; } } +@media (max-width:640px) { .ansi-text { font-size: 9px; } } +.welcome-modem { transform: scaleY(2); transform-origin: top center; line-height: 0.84; } +@media (max-width:640px) { .welcome-modem { font-size: 12px; } } +@media (max-width:640px) { .ansi-text .c-main-red, .ansi-text .c-main-blue, .ansi-text .c-white, .ansi-text .c-pink, .ansi-text .c-cyan { font-weight: normal; } } +.status-bar { border-top:1px solid var(--red-dark); margin-top:1rem; padding-top:0.5rem; font-size:0.85em; } +.letter-footer { display:flex; gap:0.15rem; margin:40px 0 1rem; flex-wrap:wrap; font-size:0.85em; } +.letter-footer span { border:1px solid var(--red-dark); padding:0.16rem 0.42rem; color:var(--red-bright); } +.letter-footer .letter-space { border:none; padding:0.2rem 0.02rem; } +.letter-footer a { text-decoration:none; border:1px solid var(--red-dark); padding:0.25rem 0.6rem; margin-left:auto; } +.letter-footer a:hover { border-color:var(--red-bright); color:var(--red-bright); } +.nav-bar { margin:26px 0 1rem; display:flex; gap:1rem; flex-wrap:wrap; } +.nav-bar a { text-decoration:none; border:1px solid var(--red-dark); padding:0.25rem 0.6rem; } +.nav-bar a:hover { border-color: var(--red-bright); color: var(--red-bright); } +.skyline-accent h1, .skyline-accent h2, .skyline-accent h3 { color: var(--blue-bright); } +.skyline-accent .tile, .skyline-accent .diz-box { border-color: var(--blue-dark); background: linear-gradient(180deg, rgba(0,0,139,0.22), rgba(0,0,0,0) 60%); } +.skyline-accent .tile:hover, .skyline-accent .diz-box:hover { border-color: var(--blue-bright); box-shadow: inset 0 0 0 1px var(--blue-bright), 0 0 8px rgba(85,170,255,0.35); } +.skyline-accent .nav-bar a { border-color: var(--blue-dark); } +.skyline-accent .nav-bar a:hover { border-color: var(--blue-bright); color: var(--blue-bright); } +.skyline-accent .status-bar { border-top-color: var(--blue-dark); } +.release-row { display:grid; grid-template-columns: 1fr 300px; gap:1rem; margin-bottom:1.5rem; } +@media (max-width:640px) { .release-row { grid-template-columns: 1fr; } } +.diz-box { border:1px solid var(--red-dark); padding:0.5rem; width:100%; font-family:var(--font-ansi); white-space:pre-wrap; cursor:pointer; display:block; color:var(--fg); text-decoration:none; } +@media (max-width:640px) { .diz-box { width:100%; } } +.gallery-grid { display:flex; flex-direction:column; gap:1rem; } +.gallery-item { margin:0; } +.gallery-item figcaption { color:var(--fg-bright); font-size:0.85em; margin-top:40px; } +.mod-player { margin:1rem 0; } +.mod-player-nowplaying { border:1px solid var(--red-dark); padding:0.6rem 0.75rem; margin-bottom:0.75rem; display:flex; align-items:center; gap:0.75rem; flex-wrap:wrap; font-family:var(--font-ansi); } +.mod-player-label { color:var(--red-bright); font-weight:bold; } +.mod-player-track { color:var(--fg-bright); } +.mod-player-file { color:var(--grey); } +.mod-player-idle { color:var(--grey); } +.mod-player-controls { margin-left:auto; display:flex; gap:0.4rem; } +.mod-btn { background:none; border:1px solid var(--red-dark); color:var(--fg); font-family:var(--font-ansi); padding:0.15rem 0.5rem; cursor:pointer; } +.mod-btn:hover:not(:disabled) { border-color:var(--red-bright); color:var(--red-bright); } +.mod-btn:disabled { opacity:0.35; cursor:default; } +.mod-btn-play { min-width:2.2rem; text-align:center; } +.mod-list { border-collapse:collapse; width:100%; } +.mod-list td { border-bottom:1px solid var(--red-dark); padding:0.35rem 0.5rem; } +.mod-list tr.mod-active { color:var(--red-bright); } +.mod-list tr.mod-active td { border-bottom-color:var(--red-bright); } +.mod-col-play { width:2.5rem; text-align:center; } +.mod-col-file { white-space:nowrap; } +.mod-col-title { color:var(--fg-bright); max-width:30ch; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } +.mod-col-ch { color:var(--grey); width:3rem; text-align:right; } +.mod-col-size { color:var(--grey); width:5rem; text-align:right; } +.mod-btn-inline { background:none; border:none; color:var(--fg); font-family:var(--font-ansi); cursor:pointer; padding:0; font-size:inherit; } +.mod-btn-inline:hover { color:var(--red-bright); } +.mod-loading { color:var(--grey); font-size:0.85em; margin:0.5rem 0; } +.subtitle { text-align:center; color:var(--fg-bright); font-weight:bold; margin:1rem 0; font-family:var(--font-body); } +.esprit-thumb { display:flex; align-items:center; justify-content:center; min-height:120px; } +.esprit-thumb img { max-width:100%; height:auto; display:block; } +.modal-overlay { position:fixed; inset:0; z-index:1000; background:rgba(0,0,0,0.85); display:flex; align-items:center; justify-content:center; } +.modal-content { position:relative; max-width:90vw; max-height:90vh; } +.modal-content img { max-width:90vw; max-height:85vh; display:block; border:2px solid var(--red-dark); } +.modal-close { position:absolute; top:-1.5rem; right:-0.5rem; background:none; border:none; color:var(--fg-bright); font-size:2rem; cursor:pointer; line-height:1; } +.modal-close:hover { color:var(--red-bright); } diff --git a/start-dev.sh b/start-dev.sh new file mode 100755 index 0000000..174c2dc --- /dev/null +++ b/start-dev.sh @@ -0,0 +1,2 @@ +#!/bin/bash +cd "$(dirname "$0")" && npm run dev -- --host diff --git a/tools/ansi2html.py b/tools/ansi2html.py new file mode 100644 index 0000000..17b5277 --- /dev/null +++ b/tools/ansi2html.py @@ -0,0 +1,263 @@ +#!/usr/bin/env python3 +"""tools/ansi2html.py - Convert real .ANS (ANSI BBS) files to HTML for the website. + +Reads a .ANS file, simulates an 80x25 terminal, and outputs an HTML string +using CSS classes for the 16 ANSI foreground/background colors. + +Usage: + python3 tools/ansi2html.py source-assets/ansi/skyline.ans + python3 tools/ansi2html.py source-assets/ansi/skyline.ans --var BANNER_SKYLINE +""" + +import sys +import html as html_mod + + +def cp437_char(byte_val: int) -> str: + """Convert a CP437 byte value (0-255) to a Unicode character using Python's codec.""" + return bytes([byte_val]).decode("cp437") + + +# ── ANSI 16-color palette → CSS class names ─────────────────────────────────── +# FG class: c-fg-N BG class: c-bg-N +# Bold on fg 0-7 brightens to 8-15 (handled in parser). + +ANSI_FG_CLASS = { + 0: "c-fg-0", 1: "c-fg-1", 2: "c-fg-2", 3: "c-fg-3", + 4: "c-fg-4", 5: "c-fg-5", 6: "c-fg-6", 7: "c-fg-7", + 8: "c-fg-8", 9: "c-fg-9", 10: "c-fg-10", 11: "c-fg-11", + 12: "c-fg-12", 13: "c-fg-13", 14: "c-fg-14", 15: "c-fg-15", +} + +ANSI_BG_CLASS = { + 0: "c-bg-0", 1: "c-bg-1", 2: "c-bg-2", 3: "c-bg-3", + 4: "c-bg-4", 5: "c-bg-5", 6: "c-bg-6", 7: "c-bg-7", + 8: "c-bg-8", 9: "c-bg-9", 10: "c-bg-10", 11: "c-bg-11", + 12: "c-bg-12", 13: "c-bg-13", 14: "c-bg-14", 15: "c-bg-15", +} + + +# ── Terminal cell ────────────────────────────────────────────────────────────── +class Cell: + __slots__ = ("char", "fg", "bg", "bold") + def __init__(self, char=" ", fg=7, bg=0, bold=False): + self.char = char + self.fg = fg + self.bg = bg + self.bold = bold + + +# ── ANSI parser ──────────────────────────────────────────────────────────────── +def parse_ansi_to_html(data: bytes, width: int = 80, max_rows: int = 25) -> str: + """Parse raw ANSI bytes into an HTML string with CSS color classes.""" + screen = [[Cell() for _ in range(width)] for _ in range(max_rows)] + cur_row, cur_col = 0, 0 + fg, bg, bold = 7, 0, False + + i = 0 + length = len(data) + + while i < length: + b = data[i] + + if b == 0x1B: # ESC + i += 1 + if i >= length: + break + if data[i] != 0x5B: # '[' — not a CSI sequence + continue + i += 1 + # Collect parameter bytes until a final letter + params = [] + num_str = "" + while i < length: + c = data[i] + if 0x30 <= c <= 0x39: # '0'-'9' + num_str += chr(c) + i += 1 + elif c == 0x3B: # ';' + params.append(int(num_str) if num_str else 0) + num_str = "" + i += 1 + elif c == 0x6D: # 'm' — SGR (color/style) + params.append(int(num_str) if num_str else 0) + i += 1 + fg, bg, bold = _apply_sgr(params, fg, bg, bold) + break + elif c == 0x48 or c == 0x66: # 'H' or 'f' — cursor position + params.append(int(num_str) if num_str else 0) + i += 1 + row = (params[0] if len(params) > 0 else 1) - 1 + col = (params[1] if len(params) > 1 else 1) - 1 + cur_row = max(0, min(row, max_rows - 1)) + cur_col = max(0, min(col, width - 1)) + break + elif c == 0x43: # 'C' — cursor forward (right) + n = int(num_str) if num_str else 1 + i += 1 + cur_col = min(cur_col + n, width - 1) + break + elif c == 0x44: # 'D' — cursor back (left) + n = int(num_str) if num_str else 1 + i += 1 + cur_col = max(cur_col - n, 0) + break + elif c == 0x4A: # 'J' — erase display + params.append(int(num_str) if num_str else 0) + i += 1 + if not params or params[0] in (2, 3): + screen = [[Cell() for _ in range(width)] for _ in range(max_rows)] + break + elif c == 0x4B: # 'K' — erase line + params.append(int(num_str) if num_str else 0) + i += 1 + if cur_row < max_rows: + screen[cur_row] = [Cell() for _ in range(width)] + break + elif 0x40 <= c <= 0x7E: # Final byte of unknown CSI + i += 1 + break + else: + i += 1 + elif b == 0x0D: # CR + i += 1 + elif b == 0x0A: # LF + cur_col = 0 + cur_row += 1 + if cur_row >= max_rows: + cur_row = max_rows - 1 + i += 1 + elif b == 0x09: # TAB + cur_col = min(cur_col + 8, width - 1) + i += 1 + elif b == 0x07: # BEL + i += 1 + else: + char = cp437_char(b) + if cur_row < max_rows and cur_col < width: + screen[cur_row][cur_col] = Cell(char, fg, bg, bold) + cur_col += 1 + if cur_col >= width: + cur_col = 0 + cur_row += 1 + if cur_row >= max_rows: + cur_row = max_rows - 1 + i += 1 + + return _render_screen(screen) + + +def _apply_sgr(params, fg, bg, bold): + """Apply SGR (Select Graphic Rendition) parameters. Returns (fg, bg, bold).""" + j = 0 + while j < len(params): + p = params[j] + if p == 0: + fg, bg, bold = 7, 0, False + elif p == 1: + bold = True + elif p == 2: + bold = False + elif p == 22: + bold = False + elif 30 <= p <= 37: + fg = p - 30 + elif p == 39: + fg = 7 + elif 40 <= p <= 47: + bg = p - 40 + elif p == 49: + bg = 0 + elif 90 <= p <= 97: + fg = p - 90 + 8 + elif 100 <= p <= 107: + bg = p - 100 + 8 + j += 1 + return fg, bg, bold + + +def _render_screen(screen): + """Render the terminal screen buffer to HTML.""" + lines = [] + for row in screen: + # Trim trailing spaces (on default bg) + last_non_space = len(row) - 1 + while last_non_space >= 0 and row[last_non_space].char == " " and row[last_non_space].bg == 0: + last_non_space -= 1 + row = row[:last_non_space + 1] + + row_html = "" + seg_fg, seg_bg, seg_bold = None, None, False + seg_chars = [] + + for cell in row: + effective_fg = 15 if (cell.bold and cell.fg < 8) else cell.fg + key = (effective_fg, cell.bg, cell.bold) + if key != (seg_fg, seg_bg, seg_bold) or not seg_chars: + if seg_chars: + row_html += _span(seg_fg, seg_bg, seg_bold, "".join(seg_chars)) + seg_fg, seg_bg, seg_bold = effective_fg, cell.bg, cell.bold + seg_chars = [cell.char] + else: + seg_chars.append(cell.char) + + if seg_chars: + row_html += _span(seg_fg, seg_bg, seg_bold, "".join(seg_chars)) + + lines.append(row_html) + + # Trim trailing empty lines + while lines and lines[-1].strip() == "": + lines.pop() + + return "\n".join(lines) + + +def _span(fg, bg, bold, text): + """Render a styled text segment as an HTML span with CSS classes.""" + if not text: + return "" + fg_cls = ANSI_FG_CLASS.get(fg, "c-fg-7") + bg_cls = ANSI_BG_CLASS.get(bg, "c-bg-0") + classes = f"{fg_cls} {bg_cls}" + if bold: + classes += " c-bold" + return f'{html_mod.escape(text)}' + + +# ── Main ─────────────────────────────────────────────────────────────────────── +def main(): + if len(sys.argv) < 2: + print(f"Usage: {sys.argv[0]} [--var NAME] [--max-rows N]", file=sys.stderr) + sys.exit(1) + + filepath = sys.argv[1] + var_name = None + max_rows = 25 + + args = sys.argv[2:] + i = 0 + while i < len(args): + if args[i] == "--var" and i + 1 < len(args): + var_name = args[i + 1] + i += 2 + elif args[i] == "--max-rows" and i + 1 < len(args): + max_rows = int(args[i + 1]) + i += 2 + else: + i += 1 + + with open(filepath, "rb") as f: + data = f.read() + + html_content = parse_ansi_to_html(data, width=80, max_rows=max_rows) + + if var_name: + escaped = html_content.replace("\\", "\\\\").replace('"', '\\"').replace("\n", "\\n") + print(f'export const {var_name} = "
{escaped}
";') + else: + print(f'
{html_content}
') + + +if __name__ == "__main__": + main() diff --git a/tools/cp437_to_utf8.py b/tools/cp437_to_utf8.py new file mode 100644 index 0000000..59b8e5e --- /dev/null +++ b/tools/cp437_to_utf8.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +"""tools/cp437_to_utf8.py - Convert CP437 encoded files from URLs to UTF-8 text. + +Usage: + python3 tools/cp437_to_utf8.py [output_file] + +Examples: + python3 tools/cp437_to_utf8.py https://www.moonweb.org/files/pc/KDS/kosmos.txt + python3 tools/cp437_to_utf8.py https://www.moonweb.org/files/pc/KDS/FILES.BBS src/data/kds-files-bbs.txt + +If no output_file is given, prints to stdout. +""" + +import sys +import urllib.request +import urllib.error +from pathlib import Path + + +def fetch_cp437(url: str) -> str: + """Fetch a URL and decode the response body as CP437.""" + req = urllib.request.Request(url, headers={"User-Agent": "28k8-cp437-converter/1.0"}) + with urllib.request.urlopen(req, timeout=15) as resp: + raw = resp.read() + return raw.decode("cp437", errors="replace") + + +def main(): + if len(sys.argv) < 2: + print(__doc__, file=sys.stderr) + sys.exit(1) + + url = sys.argv[1] + output = sys.argv[2] if len(sys.argv) > 2 else None + + try: + text = fetch_cp437(url) + except (urllib.error.URLError, OSError) as exc: + print(f"Error fetching {url}: {exc}", file=sys.stderr) + sys.exit(1) + + if output: + out_path = Path(output) + out_path.parent.mkdir(parents=True, exist_ok=True) + out_path.write_text(text, encoding="utf-8") + print(f"Wrote {len(text)} chars to {output}", file=sys.stderr) + else: + print(text) + + +if __name__ == "__main__": + main() diff --git a/tools/fetch_mods.py b/tools/fetch_mods.py new file mode 100644 index 0000000..acc92a1 --- /dev/null +++ b/tools/fetch_mods.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""tools/fetch_mods.py - Fetch MOD file metadata from moonweb.org and write to src/data/mods.json. + +Run before build: + python3 tools/fetch_mods.py + +The JSON is committed to the repo so the build doesn't depend on the external server. +Re-run to refresh the list if files change on moonweb.org. +""" + +import json +import sys +import urllib.request +import urllib.error +from pathlib import Path + +API_URL = "https://www.moonweb.org/files/amiga/mods/?info=1" +OUTPUT = Path(__file__).resolve().parent.parent / "src" / "data" / "mods.json" + + +def fetch_mods(): + req = urllib.request.Request(API_URL, headers={"User-Agent": "28k8-moonweb-build/1.0"}) + with urllib.request.urlopen(req, timeout=15) as resp: + return json.loads(resp.read().decode()) + + +def extract(file_entry): + info = file_entry.get("module_info", {}) + return { + "name": file_entry["name"], + "title": info.get("title", "").strip() or file_entry["name"], + "size_human": file_entry.get("size_human", "?"), + "channels": info.get("channels", 0), + "sample_count": info.get("sample_count", 0), + "modified": file_entry.get("modified", ""), + "url": file_entry.get("url", ""), + } + + +def main(): + try: + data = fetch_mods() + except (urllib.error.URLError, OSError) as exc: + print(f"Error fetching {API_URL}: {exc}", file=sys.stderr) + sys.exit(1) + + files = data.get("files", []) + mods = sorted((extract(f) for f in files), key=lambda m: m["name"].lower()) + + OUTPUT.parent.mkdir(parents=True, exist_ok=True) + OUTPUT.write_text(json.dumps(mods, indent=2) + "\n") + print(f"Wrote {len(mods)} MODs to {OUTPUT.relative_to(OUTPUT.parent.parent.parent)}") + + +if __name__ == "__main__": + main() diff --git a/tools/generate_ansi.py b/tools/generate_ansi.py new file mode 100644 index 0000000..85d78f9 --- /dev/null +++ b/tools/generate_ansi.py @@ -0,0 +1,10 @@ +"""tools/generate_ansi.py - starting point / font reference for src/lib/ansiArt.ts. +See SPEC.md section 9 for why precomputed HTML is used instead of a live ANSI parser.""" +FONT = { + 'A': [".###.","#...#","#...#","#####","#...#","#...#","#...#"], + 'B': ["####.","#...#","#...#","####.","#...#","#...#","####."], + 'S': [".####","#....","#....",".###.","....#","....#","####."], + ' ': ["....." for _ in range(7)], +} +if __name__ == "__main__": + print("Reference font + starting point. Full logic documented in SPEC.md/PLAN.md.") diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..51429d7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1 @@ +{ "extends": "astro/tsconfigs/strict", "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "react" } }