feat: initial website implementation with all pages and components
This commit is contained in:
119
.kilo/plans/1779906112073-kind-falcon.md
Normal file
119
.kilo/plans/1779906112073-kind-falcon.md
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
# MapCN auf Kontaktseite integrieren (statt Google-Maps-Link)
|
||||||
|
|
||||||
|
## Ziel
|
||||||
|
|
||||||
|
Die Platzhalter-Box auf der Kontaktseite (`/kontakt`) soll durch eine echte, interaktive Karte mit `mapcn` ersetzt werden. Die Karte zeigt den Praxisstandort inklusive Marker und optionalem Popup.
|
||||||
|
|
||||||
|
## Ist-Zustand
|
||||||
|
|
||||||
|
- `src/pages/kontakt.astro` enthält aktuell nur einen statischen Map-Placeholder mit Link zu Google Maps.
|
||||||
|
- React ist im Projekt bereits aktiviert (`@astrojs/react` in `astro.config.mjs`).
|
||||||
|
- Shadcn-Struktur ist vorhanden (`components.json`, `src/components/ui/button.tsx`).
|
||||||
|
- Es gibt noch keine Kartenkomponenten im Projekt.
|
||||||
|
|
||||||
|
## Empfohlener Ansatz
|
||||||
|
|
||||||
|
`mapcn` per shadcn-Registry hinzufügen und eine kleine, dedizierte React-Komponente für die Kontaktkarte bauen. Diese wird als Astro-Client-Island (`client:visible`) in `kontakt.astro` eingebunden.
|
||||||
|
|
||||||
|
Warum dieser Ansatz:
|
||||||
|
|
||||||
|
- Sauber gekapselte Kartenlogik (statt JSX direkt in `.astro`).
|
||||||
|
- Gute Performance (Hydration erst bei Sichtbarkeit).
|
||||||
|
- Einfache Wiederverwendung für Footer/Standortseiten später.
|
||||||
|
|
||||||
|
## Umsetzungsplan
|
||||||
|
|
||||||
|
### 1) MapCN-Komponente ins Projekt holen
|
||||||
|
|
||||||
|
**Änderungen:** Abhängig von shadcn-Generator-Ausgabe
|
||||||
|
|
||||||
|
- Command (im Implementierungsschritt):
|
||||||
|
- `bunx shadcn@latest add @mapcn/map` (alternativ `npx shadcn@latest add @mapcn/map`)
|
||||||
|
- Erwartete Ergebnisse:
|
||||||
|
- Neue Datei `src/components/ui/map.tsx` (oder äquivalent)
|
||||||
|
- Neue Dependency `maplibre-gl` in `package.json`
|
||||||
|
- Falls vom Generator benötigt: ergänzende CSS-Regeln/Imports (z. B. MapLibre-CSS)
|
||||||
|
|
||||||
|
**Prüfpunkte:**
|
||||||
|
|
||||||
|
- Map-Komponente ist importierbar aus `@/components/ui/map`
|
||||||
|
- Keine TypeScript- oder Build-Fehler nach dem Add
|
||||||
|
|
||||||
|
### 2) Reusable Praxis-Map als React-Komponente erstellen
|
||||||
|
|
||||||
|
**Neue Datei:** `src/components/maps/PracticeMap.tsx`
|
||||||
|
|
||||||
|
Inhalt:
|
||||||
|
|
||||||
|
- Import aus `@/components/ui/map`:
|
||||||
|
- `Map`
|
||||||
|
- `MapControls` (optional, aber sinnvoll)
|
||||||
|
- `MapMarker`, `MarkerContent`, `MarkerLabel` (für Standortpin)
|
||||||
|
- Container mit fester Höhe und Rounded Corners passend zur bestehenden Kontaktseite
|
||||||
|
- Initiales Viewport-Center auf Praxisadresse
|
||||||
|
- Empfohlene Koordinaten (OSM/Nominatim): `lon 12.3849586`, `lat 50.8203324`
|
||||||
|
- Zoom ca. `14–15`
|
||||||
|
- Markerlabel z. B. „Zahnarztpraxis Dr. Tittel“
|
||||||
|
- Optional: kleines Popup mit Adresse
|
||||||
|
|
||||||
|
Hinweis:
|
||||||
|
|
||||||
|
- Falls die generierte `Map`-Komponente `children` voll unterstützt, Marker/Controls direkt als Children.
|
||||||
|
- Falls nicht, Minimalvariante nur mit `Map center/zoom` und Controls weglassen.
|
||||||
|
|
||||||
|
### 3) Kontaktseite umbauen
|
||||||
|
|
||||||
|
**Datei:** `src/pages/kontakt.astro`
|
||||||
|
|
||||||
|
Geplante Änderungen:
|
||||||
|
|
||||||
|
- Import der neuen Komponente `PracticeMap`.
|
||||||
|
- Bestehenden Placeholder-Block (Zeilenbereich um „Map placeholder“) entfernen/ersetzen.
|
||||||
|
- Neue Einbindung:
|
||||||
|
- `<PracticeMap client:visible />`
|
||||||
|
- Karte visuell im selben Card-Stil belassen:
|
||||||
|
- `rounded-2xl border border-border overflow-hidden`
|
||||||
|
|
||||||
|
Optionaler UX-Zusatz unter der Karte:
|
||||||
|
|
||||||
|
- Externer OpenStreetMap-/Google-Maps-Link als Fallback/Navigation beibehalten.
|
||||||
|
|
||||||
|
### 4) (Optional, aber empfohlen) Standortdaten zentralisieren
|
||||||
|
|
||||||
|
**Datei:** `src/data/site.ts`
|
||||||
|
|
||||||
|
- `siteConfig` um `location` erweitern, z. B.:
|
||||||
|
- `latitude`
|
||||||
|
- `longitude`
|
||||||
|
- `PracticeMap` nutzt diese Werte statt hardcodierter Koordinaten.
|
||||||
|
|
||||||
|
Vorteil:
|
||||||
|
|
||||||
|
- Keine doppelten Daten, spätere Änderungen an einer Stelle.
|
||||||
|
|
||||||
|
### 5) Validierung
|
||||||
|
|
||||||
|
Nach der Implementierung ausführen:
|
||||||
|
|
||||||
|
- `bun run typecheck`
|
||||||
|
- `bun run build`
|
||||||
|
|
||||||
|
Manuelle Sichtprüfung:
|
||||||
|
|
||||||
|
- `/kontakt` lädt ohne Console-Errors
|
||||||
|
- Karte rendert korrekt auf Desktop und Mobile
|
||||||
|
- Marker steht an plausibler Position (Bodelschwinghstraße 1, 08451 Crimmitschau)
|
||||||
|
- Seite bleibt performant (Hydration nur beim Scrollen in Sichtbereich)
|
||||||
|
|
||||||
|
## Risiken / Stolpersteine
|
||||||
|
|
||||||
|
- `maplibre-gl` benötigt ggf. CSS-Import; ohne den wirkt die Karte/Controls fehlerhaft.
|
||||||
|
- In Astro muss React-Komponente mit `client:*` eingebunden werden, sonst keine Interaktivität.
|
||||||
|
- Falls CSP/Cookie-Hinweise im Projekt strikt sind, muss Text „Karte wird nach Cookie-Einwilligung geladen“ angepasst/entfernt werden, da diese Map nicht dem bisherigen Google-Maps-Flow entspricht.
|
||||||
|
|
||||||
|
## Definition of Done
|
||||||
|
|
||||||
|
- Kontaktseite zeigt eine funktionierende `mapcn`-Karte statt Placeholder.
|
||||||
|
- Marker auf Praxisstandort vorhanden.
|
||||||
|
- Projekt baut und typcheckt fehlerfrei.
|
||||||
|
- Styling integriert sich in bestehendes Design ohne Layout-Bruch.
|
||||||
@@ -6,6 +6,7 @@ import react from "@astrojs/react"
|
|||||||
|
|
||||||
// https://astro.build/config
|
// https://astro.build/config
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
|
output: "static",
|
||||||
vite: {
|
vite: {
|
||||||
plugins: [tailwindcss()],
|
plugins: [tailwindcss()],
|
||||||
},
|
},
|
||||||
|
|||||||
205
bun.lock
205
bun.lock
@@ -13,7 +13,9 @@
|
|||||||
"astro": "^5.18.1",
|
"astro": "^5.18.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
"framer-motion": "^12.40.0",
|
||||||
"lucide-react": "^1.16.0",
|
"lucide-react": "^1.16.0",
|
||||||
|
"maplibre-gl": "^5.24.0",
|
||||||
"radix-ui": "^1.4.3",
|
"radix-ui": "^1.4.3",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.4",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.4",
|
||||||
@@ -23,6 +25,7 @@
|
|||||||
"tw-animate-css": "^1.4.0",
|
"tw-animate-css": "^1.4.0",
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@astrojs/check": "^0.9.9",
|
||||||
"@eslint/js": "^9.39.4",
|
"@eslint/js": "^9.39.4",
|
||||||
"eslint": "^9.39.4",
|
"eslint": "^9.39.4",
|
||||||
"eslint-plugin-react-hooks": "^7.0.1",
|
"eslint-plugin-react-hooks": "^7.0.1",
|
||||||
@@ -31,16 +34,20 @@
|
|||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.1",
|
||||||
"prettier-plugin-astro": "^0.14.1",
|
"prettier-plugin-astro": "^0.14.1",
|
||||||
"prettier-plugin-tailwindcss": "^0.7.2",
|
"prettier-plugin-tailwindcss": "^0.7.2",
|
||||||
"typescript": "~5.9.3",
|
"typescript": "^6.0.3",
|
||||||
"typescript-eslint": "^8.57.1",
|
"typescript-eslint": "^8.57.1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"packages": {
|
"packages": {
|
||||||
|
"@astrojs/check": ["@astrojs/check@0.9.9", "", { "dependencies": { "@astrojs/language-server": "^2.16.7", "chokidar": "^4.0.3", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0 || ^6.0.0" }, "bin": { "astro-check": "bin/astro-check.js" } }, "sha512-A5UW8uIuErLWEoRQvzgXpO1gTjUFtK8r7nU2Z7GewAMxUb7bPvpk11qaKKgxqXlHJWlAvaaxy+Xg28A6bmQ1Tg=="],
|
||||||
|
|
||||||
"@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="],
|
"@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="],
|
||||||
|
|
||||||
"@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.6", "", {}, "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q=="],
|
"@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.6", "", {}, "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q=="],
|
||||||
|
|
||||||
|
"@astrojs/language-server": ["@astrojs/language-server@2.16.10", "", { "dependencies": { "@astrojs/compiler": "^2.13.1", "@astrojs/yaml2ts": "^0.2.4", "@jridgewell/sourcemap-codec": "^1.5.5", "@volar/kit": "~2.4.28", "@volar/language-core": "~2.4.28", "@volar/language-server": "~2.4.28", "@volar/language-service": "~2.4.28", "muggle-string": "^0.4.1", "tinyglobby": "^0.2.16", "volar-service-css": "0.0.70", "volar-service-emmet": "0.0.70", "volar-service-html": "0.0.70", "volar-service-prettier": "0.0.70", "volar-service-typescript": "0.0.70", "volar-service-typescript-twoslash-queries": "0.0.70", "volar-service-yaml": "0.0.70", "vscode-html-languageservice": "^5.6.2", "vscode-uri": "^3.1.0" }, "peerDependencies": { "prettier": "^3.0.0", "prettier-plugin-astro": ">=0.11.0" }, "optionalPeers": ["prettier", "prettier-plugin-astro"], "bin": { "astro-ls": "./bin/nodeServer.js" } }, "sha512-87VQ/5GSdHlRnUA+hGuerYyIGAj+9RbZmATyuKLEUePinUXhQ5YkRnRrHhOD9sSi5JOErLjrLkHnfZFEvGrV8w=="],
|
||||||
|
|
||||||
"@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.11", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.6", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ=="],
|
"@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.11", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.6", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ=="],
|
||||||
|
|
||||||
"@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="],
|
"@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="],
|
||||||
@@ -49,6 +56,8 @@
|
|||||||
|
|
||||||
"@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="],
|
"@astrojs/telemetry": ["@astrojs/telemetry@3.3.0", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ=="],
|
||||||
|
|
||||||
|
"@astrojs/yaml2ts": ["@astrojs/yaml2ts@0.2.4", "", { "dependencies": { "yaml": "^2.8.3" } }, "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A=="],
|
||||||
|
|
||||||
"@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
|
"@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
|
||||||
|
|
||||||
"@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="],
|
"@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="],
|
||||||
@@ -115,6 +124,20 @@
|
|||||||
|
|
||||||
"@ecies/ciphers": ["@ecies/ciphers@0.2.6", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g=="],
|
"@ecies/ciphers": ["@ecies/ciphers@0.2.6", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g=="],
|
||||||
|
|
||||||
|
"@emmetio/abbreviation": ["@emmetio/abbreviation@2.3.3", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA=="],
|
||||||
|
|
||||||
|
"@emmetio/css-abbreviation": ["@emmetio/css-abbreviation@2.1.8", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw=="],
|
||||||
|
|
||||||
|
"@emmetio/css-parser": ["@emmetio/css-parser@0.4.1", "", { "dependencies": { "@emmetio/stream-reader": "^2.2.0", "@emmetio/stream-reader-utils": "^0.1.0" } }, "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ=="],
|
||||||
|
|
||||||
|
"@emmetio/html-matcher": ["@emmetio/html-matcher@1.3.0", "", { "dependencies": { "@emmetio/scanner": "^1.0.0" } }, "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ=="],
|
||||||
|
|
||||||
|
"@emmetio/scanner": ["@emmetio/scanner@1.0.4", "", {}, "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="],
|
||||||
|
|
||||||
|
"@emmetio/stream-reader": ["@emmetio/stream-reader@2.2.0", "", {}, "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw=="],
|
||||||
|
|
||||||
|
"@emmetio/stream-reader-utils": ["@emmetio/stream-reader-utils@0.1.0", "", {}, "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A=="],
|
||||||
|
|
||||||
"@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
|
"@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="],
|
||||||
|
|
||||||
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
|
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
|
||||||
@@ -279,6 +302,26 @@
|
|||||||
|
|
||||||
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
|
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
|
||||||
|
|
||||||
|
"@mapbox/jsonlint-lines-primitives": ["@mapbox/jsonlint-lines-primitives@2.0.2", "", {}, "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="],
|
||||||
|
|
||||||
|
"@mapbox/point-geometry": ["@mapbox/point-geometry@1.1.0", "", {}, "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ=="],
|
||||||
|
|
||||||
|
"@mapbox/tiny-sdf": ["@mapbox/tiny-sdf@2.2.0", "", {}, "sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg=="],
|
||||||
|
|
||||||
|
"@mapbox/unitbezier": ["@mapbox/unitbezier@0.0.1", "", {}, "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw=="],
|
||||||
|
|
||||||
|
"@mapbox/vector-tile": ["@mapbox/vector-tile@2.0.5", "", { "dependencies": { "@mapbox/point-geometry": "~1.1.0", "@types/geojson": "^7946.0.16", "pbf": "^4.0.2" } }, "sha512-pXj8m7KTsqZt+1jsE0xIpGvqTSbblfkuEJL/NJmNePMtEwxO8V3XMDo9WMSfDeqHvCtBI9Lmt4mGcGR10zecmw=="],
|
||||||
|
|
||||||
|
"@mapbox/whoots-js": ["@mapbox/whoots-js@3.1.0", "", {}, "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q=="],
|
||||||
|
|
||||||
|
"@maplibre/geojson-vt": ["@maplibre/geojson-vt@6.1.0", "", { "dependencies": { "kdbush": "^4.0.2" } }, "sha512-2eIY4gZxeKIVOZVNkAMb+5NgXhgsMQpOveTQAvnp53LYqHGJZDidk7Ew0Tged9PThidpbS+NFTh0g4zivhPDzQ=="],
|
||||||
|
|
||||||
|
"@maplibre/maplibre-gl-style-spec": ["@maplibre/maplibre-gl-style-spec@24.8.5", "", { "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", "json-stringify-pretty-compact": "^4.0.0", "minimist": "^1.2.8", "quickselect": "^3.0.0", "tinyqueue": "^3.0.0" }, "bin": { "gl-style-migrate": "dist/gl-style-migrate.mjs", "gl-style-validate": "dist/gl-style-validate.mjs", "gl-style-format": "dist/gl-style-format.mjs" } }, "sha512-EzEJmMt6thioRH7GI9LWS7ahXTcAhAPGWCe6oTP2Ps4YnsXOOAfeqx854lZaiDnwURfHmcCKV1mr6oo0i23x6w=="],
|
||||||
|
|
||||||
|
"@maplibre/mlt": ["@maplibre/mlt@1.1.10", "", { "dependencies": { "@mapbox/point-geometry": "^1.1.0" } }, "sha512-SByFHVVxqThkstQnwh8/48pyvUmeQ7NGZ/n+XHa4TkLTKK6lnsMh9Aa7LocS8OW5E3ZiXxmwYivSc7lcQsQBag=="],
|
||||||
|
|
||||||
|
"@maplibre/vt-pbf": ["@maplibre/vt-pbf@4.3.0", "", { "dependencies": { "@mapbox/point-geometry": "^1.1.0", "@mapbox/vector-tile": "^2.0.4", "@maplibre/geojson-vt": "^5.0.4", "@types/geojson": "^7946.0.16", "@types/supercluster": "^7.1.3", "pbf": "^4.0.1", "supercluster": "^8.0.1" } }, "sha512-jIvp8F5hQCcreqOOpEt42TJMUlsrEcpf/kI1T2v85YrQRV6PPXUcEXUg5karKtH6oh47XJZ4kHu56pUkOuqA7w=="],
|
||||||
|
|
||||||
"@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="],
|
"@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="],
|
||||||
|
|
||||||
"@mswjs/interceptors": ["@mswjs/interceptors@0.41.9", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w=="],
|
"@mswjs/interceptors": ["@mswjs/interceptors@0.41.9", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w=="],
|
||||||
@@ -539,6 +582,8 @@
|
|||||||
|
|
||||||
"@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
|
"@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
|
||||||
|
|
||||||
|
"@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
|
||||||
|
|
||||||
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
|
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
|
||||||
|
|
||||||
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
|
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
|
||||||
@@ -559,6 +604,8 @@
|
|||||||
|
|
||||||
"@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],
|
"@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],
|
||||||
|
|
||||||
|
"@types/supercluster": ["@types/supercluster@7.1.3", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA=="],
|
||||||
|
|
||||||
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
||||||
|
|
||||||
"@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="],
|
"@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="],
|
||||||
@@ -587,6 +634,22 @@
|
|||||||
|
|
||||||
"@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "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" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="],
|
"@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "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" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="],
|
||||||
|
|
||||||
|
"@volar/kit": ["@volar/kit@2.4.28", "", { "dependencies": { "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "typesafe-path": "^0.2.2", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "typescript": "*" } }, "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg=="],
|
||||||
|
|
||||||
|
"@volar/language-core": ["@volar/language-core@2.4.28", "", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="],
|
||||||
|
|
||||||
|
"@volar/language-server": ["@volar/language-server@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "path-browserify": "^1.0.1", "request-light": "^0.7.0", "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw=="],
|
||||||
|
|
||||||
|
"@volar/language-service": ["@volar/language-service@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw=="],
|
||||||
|
|
||||||
|
"@volar/source-map": ["@volar/source-map@2.4.28", "", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="],
|
||||||
|
|
||||||
|
"@volar/typescript": ["@volar/typescript@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="],
|
||||||
|
|
||||||
|
"@vscode/emmet-helper": ["@vscode/emmet-helper@2.11.0", "", { "dependencies": { "emmet": "^2.4.3", "jsonc-parser": "^2.3.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.15.1", "vscode-uri": "^3.0.8" } }, "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw=="],
|
||||||
|
|
||||||
|
"@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="],
|
||||||
|
|
||||||
"accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
|
"accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
|
||||||
|
|
||||||
"acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
|
"acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
|
||||||
@@ -597,6 +660,8 @@
|
|||||||
|
|
||||||
"ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
|
"ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
|
||||||
|
|
||||||
|
"ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="],
|
||||||
|
|
||||||
"ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
|
"ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
|
||||||
|
|
||||||
"ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
|
"ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
|
||||||
@@ -667,7 +732,7 @@
|
|||||||
|
|
||||||
"character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
|
"character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
|
||||||
|
|
||||||
"chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
|
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
|
||||||
|
|
||||||
"ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="],
|
"ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="],
|
||||||
|
|
||||||
@@ -785,13 +850,17 @@
|
|||||||
|
|
||||||
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
|
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
|
||||||
|
|
||||||
|
"earcut": ["earcut@3.0.2", "", {}, "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ=="],
|
||||||
|
|
||||||
"eciesjs": ["eciesjs@0.4.18", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ=="],
|
"eciesjs": ["eciesjs@0.4.18", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ=="],
|
||||||
|
|
||||||
"ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
|
"ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
|
||||||
|
|
||||||
"electron-to-chromium": ["electron-to-chromium@1.5.362", "", {}, "sha512-PUY2DrLvkjkUuWqq+KPL2iWshrJsZOcIojzRQ7eXFacc9dWga7MGMJAa15VbiejSZB1PAXaRLAiKgruHP8LB1w=="],
|
"electron-to-chromium": ["electron-to-chromium@1.5.362", "", {}, "sha512-PUY2DrLvkjkUuWqq+KPL2iWshrJsZOcIojzRQ7eXFacc9dWga7MGMJAa15VbiejSZB1PAXaRLAiKgruHP8LB1w=="],
|
||||||
|
|
||||||
"emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
|
"emmet": ["emmet@2.4.11", "", { "dependencies": { "@emmetio/abbreviation": "^2.3.3", "@emmetio/css-abbreviation": "^2.1.8" } }, "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ=="],
|
||||||
|
|
||||||
|
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||||
|
|
||||||
"encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
|
"encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
|
||||||
|
|
||||||
@@ -907,6 +976,8 @@
|
|||||||
|
|
||||||
"forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
|
"forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
|
||||||
|
|
||||||
|
"framer-motion": ["framer-motion@12.40.0", "", { "dependencies": { "motion-dom": "^12.40.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg=="],
|
||||||
|
|
||||||
"fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
|
"fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
|
||||||
|
|
||||||
"fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
|
"fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
|
||||||
@@ -935,6 +1006,8 @@
|
|||||||
|
|
||||||
"github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
|
"github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
|
||||||
|
|
||||||
|
"gl-matrix": ["gl-matrix@3.4.4", "", {}, "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ=="],
|
||||||
|
|
||||||
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
|
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
|
||||||
|
|
||||||
"globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="],
|
"globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="],
|
||||||
@@ -1067,10 +1140,16 @@
|
|||||||
|
|
||||||
"json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
|
"json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
|
||||||
|
|
||||||
|
"json-stringify-pretty-compact": ["json-stringify-pretty-compact@4.0.0", "", {}, "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q=="],
|
||||||
|
|
||||||
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
|
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
|
||||||
|
|
||||||
|
"jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="],
|
||||||
|
|
||||||
"jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
|
"jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
|
||||||
|
|
||||||
|
"kdbush": ["kdbush@4.1.0", "", {}, "sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ=="],
|
||||||
|
|
||||||
"keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
|
"keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
|
||||||
|
|
||||||
"kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
|
"kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
|
||||||
@@ -1119,6 +1198,8 @@
|
|||||||
|
|
||||||
"magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="],
|
"magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="],
|
||||||
|
|
||||||
|
"maplibre-gl": ["maplibre-gl@5.24.0", "", { "dependencies": { "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/point-geometry": "^1.1.0", "@mapbox/tiny-sdf": "^2.1.0", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^2.0.4", "@mapbox/whoots-js": "^3.1.0", "@maplibre/geojson-vt": "^6.1.0", "@maplibre/maplibre-gl-style-spec": "^24.8.1", "@maplibre/mlt": "^1.1.8", "@maplibre/vt-pbf": "^4.3.0", "@types/geojson": "^7946.0.16", "earcut": "^3.0.2", "gl-matrix": "^3.4.4", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^4.0.1", "potpack": "^2.1.0", "quickselect": "^3.0.0", "tinyqueue": "^3.0.0" } }, "sha512-ALyFxgtd5R+65UqZ/++lOqwWcC0SNho9c27fYSyLmG7AfnAul2o46F05aDJGPbFU57wos9dgcIySHs0Xe6ia3A=="],
|
||||||
|
|
||||||
"markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
|
"markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
|
||||||
|
|
||||||
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
|
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
|
||||||
@@ -1229,12 +1310,20 @@
|
|||||||
|
|
||||||
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
|
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
|
||||||
|
|
||||||
|
"motion-dom": ["motion-dom@12.40.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg=="],
|
||||||
|
|
||||||
|
"motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="],
|
||||||
|
|
||||||
"mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
|
"mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
|
||||||
|
|
||||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||||
|
|
||||||
"msw": ["msw@2.14.6", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.11", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg=="],
|
"msw": ["msw@2.14.6", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.11", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg=="],
|
||||||
|
|
||||||
|
"muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="],
|
||||||
|
|
||||||
|
"murmurhash-js": ["murmurhash-js@1.0.0", "", {}, "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw=="],
|
||||||
|
|
||||||
"mute-stream": ["mute-stream@4.0.0", "", {}, "sha512-gSrprq0fJ3EiOErzjdIZrjysVVmJ4uu1QWfCDss5LypA5OXvrMje5Ym5z6V6RLyJ2eF87lasX7t6a0AnFvZblg=="],
|
"mute-stream": ["mute-stream@4.0.0", "", {}, "sha512-gSrprq0fJ3EiOErzjdIZrjysVVmJ4uu1QWfCDss5LypA5OXvrMje5Ym5z6V6RLyJ2eF87lasX7t6a0AnFvZblg=="],
|
||||||
|
|
||||||
"nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="],
|
"nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="],
|
||||||
@@ -1321,6 +1410,8 @@
|
|||||||
|
|
||||||
"path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
|
"path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
|
||||||
|
|
||||||
|
"pbf": ["pbf@4.0.2", "", { "dependencies": { "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-J0ajxARhZfpUEebxYs1vhMGMuLSXtBe1e+fFPDrf2uA2hgo+UshKfNUWOz92HJNz6/NFEXseQPddnHkTreWRqg=="],
|
||||||
|
|
||||||
"piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="],
|
"piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="],
|
||||||
|
|
||||||
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||||
@@ -1333,6 +1424,8 @@
|
|||||||
|
|
||||||
"postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
|
"postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
|
||||||
|
|
||||||
|
"potpack": ["potpack@2.1.0", "", {}, "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ=="],
|
||||||
|
|
||||||
"powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="],
|
"powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="],
|
||||||
|
|
||||||
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
|
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
|
||||||
@@ -1351,6 +1444,8 @@
|
|||||||
|
|
||||||
"property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
|
"property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
|
||||||
|
|
||||||
|
"protocol-buffers-schema": ["protocol-buffers-schema@3.6.1", "", {}, "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ=="],
|
||||||
|
|
||||||
"proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
|
"proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
|
||||||
|
|
||||||
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
|
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
|
||||||
@@ -1359,6 +1454,8 @@
|
|||||||
|
|
||||||
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
|
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
|
||||||
|
|
||||||
|
"quickselect": ["quickselect@3.0.0", "", {}, "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="],
|
||||||
|
|
||||||
"radix-ui": ["radix-ui@1.4.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-accessible-icon": "1.1.7", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-aspect-ratio": "1.1.7", "@radix-ui/react-avatar": "1.1.10", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.16", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-form": "0.1.8", "@radix-ui/react-hover-card": "1.1.15", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-menubar": "1.1.16", "@radix-ui/react-navigation-menu": "1.2.14", "@radix-ui/react-one-time-password-field": "0.1.8", "@radix-ui/react-password-toggle-field": "0.1.3", "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-progress": "1.1.7", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-scroll-area": "1.2.10", "@radix-ui/react-select": "2.2.6", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2.15", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-toggle-group": "1.1.11", "@radix-ui/react-toolbar": "1.1.11", "@radix-ui/react-tooltip": "1.2.8", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA=="],
|
"radix-ui": ["radix-ui@1.4.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-accessible-icon": "1.1.7", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-aspect-ratio": "1.1.7", "@radix-ui/react-avatar": "1.1.10", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.16", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-form": "0.1.8", "@radix-ui/react-hover-card": "1.1.15", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-menubar": "1.1.16", "@radix-ui/react-navigation-menu": "1.2.14", "@radix-ui/react-one-time-password-field": "0.1.8", "@radix-ui/react-password-toggle-field": "0.1.3", "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-progress": "1.1.7", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-scroll-area": "1.2.10", "@radix-ui/react-select": "2.2.6", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2.15", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-toggle-group": "1.1.11", "@radix-ui/react-toolbar": "1.1.11", "@radix-ui/react-tooltip": "1.2.8", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA=="],
|
||||||
|
|
||||||
"radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
|
"radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
|
||||||
@@ -1379,7 +1476,7 @@
|
|||||||
|
|
||||||
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
|
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
|
||||||
|
|
||||||
"readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
|
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
|
||||||
|
|
||||||
"recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],
|
"recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],
|
||||||
|
|
||||||
@@ -1407,12 +1504,16 @@
|
|||||||
|
|
||||||
"remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
|
"remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
|
||||||
|
|
||||||
|
"request-light": ["request-light@0.7.0", "", {}, "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q=="],
|
||||||
|
|
||||||
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
|
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
|
||||||
|
|
||||||
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
|
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
|
||||||
|
|
||||||
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
|
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
|
||||||
|
|
||||||
|
"resolve-protobuf-schema": ["resolve-protobuf-schema@2.1.0", "", { "dependencies": { "protocol-buffers-schema": "^3.3.1" } }, "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ=="],
|
||||||
|
|
||||||
"restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
|
"restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
|
||||||
|
|
||||||
"retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="],
|
"retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="],
|
||||||
@@ -1491,7 +1592,7 @@
|
|||||||
|
|
||||||
"strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="],
|
"strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="],
|
||||||
|
|
||||||
"string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||||
|
|
||||||
"stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
|
"stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
|
||||||
|
|
||||||
@@ -1507,6 +1608,8 @@
|
|||||||
|
|
||||||
"suf-log": ["suf-log@2.5.3", "", { "dependencies": { "s.color": "0.0.15" } }, "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="],
|
"suf-log": ["suf-log@2.5.3", "", { "dependencies": { "s.color": "0.0.15" } }, "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="],
|
||||||
|
|
||||||
|
"supercluster": ["supercluster@8.0.1", "", { "dependencies": { "kdbush": "^4.0.2" } }, "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ=="],
|
||||||
|
|
||||||
"supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
"supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||||
|
|
||||||
"svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="],
|
"svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="],
|
||||||
@@ -1527,6 +1630,8 @@
|
|||||||
|
|
||||||
"tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="],
|
"tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="],
|
||||||
|
|
||||||
|
"tinyqueue": ["tinyqueue@3.0.0", "", {}, "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g=="],
|
||||||
|
|
||||||
"tldts": ["tldts@7.4.0", "", { "dependencies": { "tldts-core": "^7.4.0" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-yHBe+zVfzNZ3QfTPW/Z6KK1G2t340gFjMHqI/4KKSt/abzYydzuCnpqdaF5gCCABby+9Yfbj59oR5F2Fd5CBzg=="],
|
"tldts": ["tldts@7.4.0", "", { "dependencies": { "tldts-core": "^7.4.0" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-yHBe+zVfzNZ3QfTPW/Z6KK1G2t340gFjMHqI/4KKSt/abzYydzuCnpqdaF5gCCABby+9Yfbj59oR5F2Fd5CBzg=="],
|
||||||
|
|
||||||
"tldts-core": ["tldts-core@7.4.0", "", {}, "sha512-/mb9kRld+x1sIMXxWNOAp5m6C+D4GrAORWlJkOJ5dElvxdN1eutz/o7qHLp9gFvDF4Y3/L2xeScoxz6AbEo8rQ=="],
|
"tldts-core": ["tldts-core@7.4.0", "", {}, "sha512-/mb9kRld+x1sIMXxWNOAp5m6C+D4GrAORWlJkOJ5dElvxdN1eutz/o7qHLp9gFvDF4Y3/L2xeScoxz6AbEo8rQ=="],
|
||||||
@@ -1559,7 +1664,11 @@
|
|||||||
|
|
||||||
"type-is": ["type-is@2.1.0", "", { "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA=="],
|
"type-is": ["type-is@2.1.0", "", { "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA=="],
|
||||||
|
|
||||||
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
"typesafe-path": ["typesafe-path@0.2.2", "", {}, "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA=="],
|
||||||
|
|
||||||
|
"typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
|
||||||
|
|
||||||
|
"typescript-auto-import-cache": ["typescript-auto-import-cache@0.3.6", "", { "dependencies": { "semver": "^7.3.8" } }, "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ=="],
|
||||||
|
|
||||||
"typescript-eslint": ["typescript-eslint@8.60.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.60.0", "@typescript-eslint/parser": "8.60.0", "@typescript-eslint/typescript-estree": "8.60.0", "@typescript-eslint/utils": "8.60.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw=="],
|
"typescript-eslint": ["typescript-eslint@8.60.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.60.0", "@typescript-eslint/parser": "8.60.0", "@typescript-eslint/typescript-estree": "8.60.0", "@typescript-eslint/utils": "8.60.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw=="],
|
||||||
|
|
||||||
@@ -1629,6 +1738,40 @@
|
|||||||
|
|
||||||
"vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
|
"vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
|
||||||
|
|
||||||
|
"volar-service-css": ["volar-service-css@0.0.70", "", { "dependencies": { "vscode-css-languageservice": "^6.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw=="],
|
||||||
|
|
||||||
|
"volar-service-emmet": ["volar-service-emmet@0.0.70", "", { "dependencies": { "@emmetio/css-parser": "^0.4.1", "@emmetio/html-matcher": "^1.3.0", "@vscode/emmet-helper": "^2.9.3", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg=="],
|
||||||
|
|
||||||
|
"volar-service-html": ["volar-service-html@0.0.70", "", { "dependencies": { "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ=="],
|
||||||
|
|
||||||
|
"volar-service-prettier": ["volar-service-prettier@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0", "prettier": "^2.2 || ^3.0" }, "optionalPeers": ["@volar/language-service", "prettier"] }, "sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg=="],
|
||||||
|
|
||||||
|
"volar-service-typescript": ["volar-service-typescript@0.0.70", "", { "dependencies": { "path-browserify": "^1.0.1", "semver": "^7.6.2", "typescript-auto-import-cache": "^0.3.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-nls": "^5.2.0", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg=="],
|
||||||
|
|
||||||
|
"volar-service-typescript-twoslash-queries": ["volar-service-typescript-twoslash-queries@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ=="],
|
||||||
|
|
||||||
|
"volar-service-yaml": ["volar-service-yaml@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8", "yaml-language-server": "~1.20.0" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ=="],
|
||||||
|
|
||||||
|
"vscode-css-languageservice": ["vscode-css-languageservice@6.3.10", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA=="],
|
||||||
|
|
||||||
|
"vscode-html-languageservice": ["vscode-html-languageservice@5.6.2", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg=="],
|
||||||
|
|
||||||
|
"vscode-json-languageservice": ["vscode-json-languageservice@4.1.8", "", { "dependencies": { "jsonc-parser": "^3.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-nls": "^5.0.0", "vscode-uri": "^3.0.2" } }, "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg=="],
|
||||||
|
|
||||||
|
"vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="],
|
||||||
|
|
||||||
|
"vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="],
|
||||||
|
|
||||||
|
"vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="],
|
||||||
|
|
||||||
|
"vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="],
|
||||||
|
|
||||||
|
"vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="],
|
||||||
|
|
||||||
|
"vscode-nls": ["vscode-nls@5.2.0", "", {}, "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng=="],
|
||||||
|
|
||||||
|
"vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
|
||||||
|
|
||||||
"web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
|
"web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
|
||||||
|
|
||||||
"web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
|
"web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
|
||||||
@@ -1653,6 +1796,10 @@
|
|||||||
|
|
||||||
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
||||||
|
|
||||||
|
"yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
|
||||||
|
|
||||||
|
"yaml-language-server": ["yaml-language-server@1.20.0", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "prettier": "^3.5.0", "request-light": "^0.5.7", "vscode-json-languageservice": "4.1.8", "vscode-languageserver": "^9.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-uri": "^3.0.2", "yaml": "2.7.1" }, "bin": { "yaml-language-server": "bin/yaml-language-server" } }, "sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA=="],
|
||||||
|
|
||||||
"yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
|
"yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
|
||||||
|
|
||||||
"yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
"yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
||||||
@@ -1693,6 +1840,8 @@
|
|||||||
|
|
||||||
"@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
|
"@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
|
||||||
|
|
||||||
|
"@maplibre/vt-pbf/@maplibre/geojson-vt": ["@maplibre/geojson-vt@5.0.4", "", {}, "sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ=="],
|
||||||
|
|
||||||
"@modelcontextprotocol/sdk/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
|
"@modelcontextprotocol/sdk/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
|
||||||
|
|
||||||
"@mswjs/interceptors/@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="],
|
"@mswjs/interceptors/@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="],
|
||||||
@@ -1721,13 +1870,11 @@
|
|||||||
|
|
||||||
"ajv-formats/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
|
"ajv-formats/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
|
||||||
|
|
||||||
"ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
|
||||||
|
|
||||||
"anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
"anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
||||||
|
|
||||||
"boxen/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
"boxen/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
||||||
|
|
||||||
"cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
"boxen/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
||||||
|
|
||||||
"cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
"cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
@@ -1757,6 +1904,8 @@
|
|||||||
|
|
||||||
"ora/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
"ora/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
||||||
|
|
||||||
|
"ora/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
||||||
|
|
||||||
"p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
|
"p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
|
||||||
|
|
||||||
"prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
|
"prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
|
||||||
@@ -1767,15 +1916,29 @@
|
|||||||
|
|
||||||
"router/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="],
|
"router/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="],
|
||||||
|
|
||||||
|
"string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
"svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
|
"svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
|
||||||
|
|
||||||
"type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
|
"type-is/content-type": ["content-type@2.0.0", "", {}, "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="],
|
||||||
|
|
||||||
|
"unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
|
||||||
|
|
||||||
"vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
|
"vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
|
||||||
|
|
||||||
|
"vscode-json-languageservice/jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="],
|
||||||
|
|
||||||
|
"widest-line/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
||||||
|
|
||||||
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
|
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
|
||||||
|
|
||||||
"yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
"wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
||||||
|
|
||||||
|
"yaml-language-server/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="],
|
||||||
|
|
||||||
|
"yaml-language-server/request-light": ["request-light@0.5.8", "", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="],
|
||||||
|
|
||||||
|
"yaml-language-server/yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="],
|
||||||
|
|
||||||
"@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
|
"@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
|
||||||
|
|
||||||
@@ -1799,11 +1962,7 @@
|
|||||||
|
|
||||||
"ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
|
"ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
|
||||||
|
|
||||||
"ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
"boxen/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
|
||||||
|
|
||||||
"ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
|
||||||
|
|
||||||
"cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
|
||||||
|
|
||||||
"cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
"cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
@@ -1811,8 +1970,14 @@
|
|||||||
|
|
||||||
"enquirer/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
"enquirer/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
|
"ora/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
|
||||||
|
|
||||||
"p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
|
"p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
|
||||||
|
|
||||||
|
"string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
|
"unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
|
||||||
|
|
||||||
"vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
|
"vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
|
||||||
|
|
||||||
"vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
|
"vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
|
||||||
@@ -1865,16 +2030,14 @@
|
|||||||
|
|
||||||
"vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
|
"vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
|
||||||
|
|
||||||
"yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
"widest-line/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
|
||||||
|
|
||||||
"yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
"wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
|
||||||
|
|
||||||
|
"yaml-language-server/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
|
||||||
|
|
||||||
"@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
"@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
"@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||||
|
|
||||||
"ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
|
||||||
|
|
||||||
"yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
},
|
},
|
||||||
"iconLibrary": "lucide",
|
"iconLibrary": "lucide",
|
||||||
"rtl": false,
|
"rtl": false,
|
||||||
|
"menuColor": "default",
|
||||||
|
"menuAccent": "subtle",
|
||||||
"aliases": {
|
"aliases": {
|
||||||
"components": "@/components",
|
"components": "@/components",
|
||||||
"utils": "@/lib/utils",
|
"utils": "@/lib/utils",
|
||||||
@@ -19,7 +21,7 @@
|
|||||||
"lib": "@/lib",
|
"lib": "@/lib",
|
||||||
"hooks": "@/hooks"
|
"hooks": "@/hooks"
|
||||||
},
|
},
|
||||||
"menuColor": "default",
|
"registries": {
|
||||||
"menuAccent": "subtle",
|
"@mapcn": "https://mapcn.dev/r/{name}.json"
|
||||||
"registries": {}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
171
design-kritik.md
Normal file
171
design-kritik.md
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
# Design-Kritik: Zahnarztpraxis Dr. Tittel
|
||||||
|
|
||||||
|
**URL:** https://zahnarztpraxis-tittel.de/
|
||||||
|
**Datum:** 2026-05-27
|
||||||
|
**Prüfer:** Design-Direktor (Kilo)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Anti-Patterns-Verdikt: BESTANDEN ✓
|
||||||
|
|
||||||
|
Dies sieht **nicht** KI-generiert aus. Es ist eindeutig ein klassisches WordPress/Elementor-Projekt mit einer konservativen Arztpraxis-Ästhetik. Keiner der typischen KI-Fingerabdrücke ist vorhanden:
|
||||||
|
|
||||||
|
- **Keine** Cyan-auf-Dunkel- oder Lila-zu-Blau-Verläufe
|
||||||
|
- **Keine** Neon-Akzente auf dunklem Hintergrund
|
||||||
|
- **Kein** Glassmorphismus oder Blur-Effekte
|
||||||
|
- **Keine** Verlaufstexte auf Überschriften oder Metriken
|
||||||
|
- **Keine** identischen Icon + Überschrift + Text-Kartenraster
|
||||||
|
- **Keine** generischen Schriften (nutzt eigene "iowan"-Schrift)
|
||||||
|
- **Keine** Hero-Metrik-Layouts mit großen Zahlen
|
||||||
|
- **Keine** abgerundeten Rechtecke mit dicken farbigen Rahmen
|
||||||
|
- **Keine** Sparklines oder dekorativen Diagramme
|
||||||
|
|
||||||
|
Wenn man sagt "Das hat eine KI gemacht", wären Menschen skeptisch. Das Design ist zu simpel, zu WordPress-Template-mäßig für KI-Schludrigkeit. Aber: "Nicht KI-generiert" heißt nicht "gut gestaltet". Die Probleme sind organisch, nicht synthetisch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Gesamteindruck
|
||||||
|
|
||||||
|
Dies ist eine **kompetente, aber ängstliche** Zahnarztpraxis-Website. Sie kommuniziert Professionalität und Vertrauenswürdigkeit – die Farbpalette Navy (#1a386b) und Gold (#b6926d) passt zu einer medizinischen Praxis. Die eigene "iowan"-Schrift verleiht einen Hauch von Eigenständigkeit. Aber die Website wirkt, als sei sie gebaut worden, um "eine Website zu haben", nicht um **Patienten zu gewinnen**. Die Startseite ist eine Sackgasse. Es gibt keinen klaren Handlungsaufruf. Die User Journey endet bei "Willkommen".
|
||||||
|
|
||||||
|
Die größte Chance: **Aus der digitalen Broschüre ein Patienten-Akquisitions-Werkzeug machen.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Was funktioniert
|
||||||
|
|
||||||
|
### 1. Die Farbpalette ist bewusst gewählt
|
||||||
|
Die Navy-Gold-Kombination ist stimmig und kontextuell angemessen. Navy signalisiert Vertrauen, medizinische Professionalität, Stabilität. Gold wärmt auf und verhindert, dass die Seite wie eine Bank oder Kanzlei wirkt. Die Palette ist nicht mutig, aber sie ist **richtig** für eine Familienzahnarztpraxis in einer kleinen deutschen Stadt.
|
||||||
|
|
||||||
|
### 2. Progressive Offenlegung auf der Leistungsseite
|
||||||
|
Die Verwendung von Toggle-/Akkordeons für Leistungsbeschreibungen ist klug. Die Seite bleibt scannbar, während detailverliebte Patienten eintauchen können. Die Plus-/Minus-Icons bieten klare Affordance. Hier hat jemand über Informationsdichte nachgedacht.
|
||||||
|
|
||||||
|
### 3. Team-Fotos machen die Praxis menschlich
|
||||||
|
Die Teamseite mit echten Porträts (nicht Stockfotos) baut Vertrauen auf. In einer kleinstädtischen Praxis wollen Patienten wissen, **wer** sie behandelt. Die Darstellung des gesamten Teams – inklusive Assistentinnen – ist ein Vertrauensbaustein, den viele Praxen auslassen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Aktueller Content
|
||||||
|
|
||||||
|
| Seite | Inhalt | Struktur |
|
||||||
|
|-------|--------|----------|
|
||||||
|
| **Startseite** | Hero mit "Ihr Zahnarzt in Crimmitschau", Philosophie-Toggle (Akkordeon) | Header (Logo + Name + Telefon) → Navigation → Hero → Footer (Sprechzeiten + Kontakt) |
|
||||||
|
| **Unser Team** | 7 Teammitglieder: 2 Zahnärztinnen, 5 Assistentinnen, mit Fotos und tabellarischen CVs | Hero → 2-Spalten-Layout (Zahnärztinnen) → 3-Spalten (Assistentinnen) → 2-Spalten (Assistentinnen) |
|
||||||
|
| **Unsere Leistungen** | 6 Leistungen: Ästhetische Zahnfüllungen, Implantologie, Wurzelkanalbehandlung, Professionelle Zahnreinigung, Kinderbehandlung, Zahnaufhellung | Hero → Alternierendes 2-Spalten-Layout (Bild \| Toggle-Akkordeon) × 6 |
|
||||||
|
| **Behandlungszeiten** | Sprechzeiten-Tabelle (Mo–Fr), Notdienst-Link, Terminvereinbarungshinweis | Hero → Tabelle → Notdienst → Kontakt-Link |
|
||||||
|
| **Kontakt** | Kontaktformular (Name, E-Mail, Betreff, Nachricht), Google Maps | Hero → 2-Spalten (Formular \| Karte) |
|
||||||
|
|
||||||
|
### Design-Grundlagen
|
||||||
|
- **Farben:** Navy (#1a386b) + Gold (#b6926d)
|
||||||
|
- **Schrift:** Eigene "iowan" (via Use Any Font)
|
||||||
|
- **Builder:** Elementor (Hello Elementor Theme)
|
||||||
|
- **Max-Breite:** 1680px
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prioritäre Probleme
|
||||||
|
|
||||||
|
### 1. Startseite ist eine Conversion-Sackgasse
|
||||||
|
**Was:** Die Startseite hat einen Hero-Bereich mit "Ihr Zahnarzt in Crimmitschau", einen Philosophie-Toggle und sonst nichts. Keine Leistungsvorschau, keine Teameinleitung, keine Patientenbewertungen, keine Notfallinformation, kein klarer Handlungspfad.
|
||||||
|
|
||||||
|
**Warum es wichtig ist:** Die Startseite ist die Landingpage für die meisten Besucher. Finden sie nicht innerhalb von 10 Sekunden, was sie brauchen, springen sie ab. Ein Patient mit Zahnschmerzen will keine Philosophieerklärung lesen – er will wissen, ob Sie Notfälle behandeln, wann Sie offen haben und wie er Sie erreicht. Die aktuelle Startseite bietet nichts davon prominent.
|
||||||
|
|
||||||
|
**Lösung:** Die Startseite als Conversion-Trichter restrukturieren:
|
||||||
|
- Hero: Überschrift + Unterzeile + **primärer CTA-Button** ("Jetzt Termin vereinbaren" oder "Anrufen")
|
||||||
|
- Abschnitt: 3 vorgestellte Leistungen mit Icons + "Alle Leistungen"-Link
|
||||||
|
- Abschnitt: Team-Vorschau mit "Unser Team kennenlernen"-Link
|
||||||
|
- Abschnitt: Sprechzeiten + Notfallinfo
|
||||||
|
- Abschnitt: Kontaktformular oder prominenter Telefon-CTA
|
||||||
|
|
||||||
|
**Befehl:** `/distill` — Die Startseite auf ihre Kernaufgabe reduzieren und um Patientenbedürfnisse herum aufbauen, nicht um Praxis-Selbstbeschreibung.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Kein prominenter Handlungsaufruf (CTA) irgendwo
|
||||||
|
**Was:** Die Telefonnummer (03762 56 29) steht als Fließtext im Header. Sie sieht nicht wie ein Button aus. Es gibt keinen "Termin vereinbaren"-Button, keinen sticky CTA auf Mobilgeräten, keinen Notfall-Hinweis für Patienten in Schmerzen.
|
||||||
|
|
||||||
|
**Warum es wichtig ist:** Eine Zahnarztpraxis-Website hat EINEN Job: Patienten zur Kontaktaufnahme zu bewegen. Jede Seite sollte diese Aktion mühelos machen. Aktuell muss der Nutzer die Telefonnummer suchen oder zur Kontaktseite navigieren. Im medizinischen Kontext tötet Reibung Conversion.
|
||||||
|
|
||||||
|
**Lösung:** Einen prominenten, sticky CTA hinzufügen:
|
||||||
|
- Header: Telefonnummer als ausgefüllter Button gestalten (Navy-Hintergrund, weiße Schrift, Telefon-Icon)
|
||||||
|
- Mobil: Sticky Bottom-Bar mit "Anrufen"- und "Kontakt"-Buttons
|
||||||
|
- Startseiten-Hero: Großer Primär-Button unter der Überschrift
|
||||||
|
- Sprechzeiten-Seite: Prominenter "Termin online buchen"- oder "Rufen Sie uns an"-CTA über der Tabelle
|
||||||
|
|
||||||
|
**Befehl:** `/bolder` — Die primäre Aktion so verstärken, dass sie unmöglich zu übersehen ist.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Cookie-Banner dominiert den ersten Eindruck
|
||||||
|
**Was:** Der Real Cookie Banner feuert einen massiven Modal beim ersten Besuch mit Wänden aus Rechtstext, drei Buttons, Akkordeon-Abschnitten und überwältigendem Detail. Der Banner-JSON-Code im HTML ist größer als der eigentliche Seiteninhalt der meisten Seiten.
|
||||||
|
|
||||||
|
**Warum es wichtig ist:** Bei einer lokalen Zahnarztpraxis ist der Cookie-Banner wahrscheinlich das Erste, was ein neuer Patient sieht. Es ist einschüchternd, juristisch und erzeugt Angst, bevor der Nutzer überhaupt den Praxisnamen gesehen hat. Ein Patient mit akuten Zahnschmerzen will keine "Standardvertragsklauseln" und "Verarbeitung in unsicheren Drittländern" durchlesen.
|
||||||
|
|
||||||
|
**Lösung:** Aggressiv vereinfachen:
|
||||||
|
- Banner reduzieren auf: "Wir verwenden Cookies für grundlegende Funktionen und Google Maps. [Alle akzeptieren] [Nur Essentials]"
|
||||||
|
- Detaillierte Rechtstexte hinter einen "Mehr erfahren"-Link verschieben
|
||||||
|
- Bottom-Bar statt Center-Modal verwenden – weniger aufdringlich
|
||||||
|
- Beschreibung von 200 Wörtern auf 30 kürzen
|
||||||
|
|
||||||
|
**Befehl:** `/clarify` — Die aktuelle Microcopy ist rechtlich umfassend, aber menschenfeindlich. Die Stimme vereinfachen, ohne Compliance zu verlieren.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Team-Raster ist visuell holperig
|
||||||
|
**Was:** Die Teamseite wechselt zwischen 2-Spalten- und 3-Spalten-Layouts (2 Zahnärztinnen, dann 3 Assistentinnen, dann 2 Assistentinnen). Das erzeugt einen unebenen, zufälligen Rhythmus. Die beiden Zahnärztinnen bekommen mehr visuelles Gewicht pro Person, während die Assistentinnen zusammengedrängt wirken.
|
||||||
|
|
||||||
|
**Warum es wichtig ist:** Ungleiche Raster wirken unbeabsichtigt. Sie signalisieren, dass das Layout von "wie viele Leute passen hin" getrieben wurde, nicht von "wie präsentieren wir unser Team mit Würde". Es signalisiert auch subtil eine Hierarchie, die möglicherweise nicht beabsichtigt ist – die Zahnärztinnen bekommen 50% Breite, die Assistentinnen 33%.
|
||||||
|
|
||||||
|
**Lösung:** Ein konsistentes Raster verwenden. Entweder:
|
||||||
|
- 3-Spalten-Raster für alle (Zahnärztinnen bekommen eine Featured-Behandlung wie größere Bilder oder Zitate)
|
||||||
|
- Oder 2-Spalten durchgehend, mit Reihen zu je 2
|
||||||
|
|
||||||
|
**Befehl:** `/normalize` — Ein konsistentes Rastersystem etablieren und einheitlich anwenden.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Leistungsseiten-Layout wird monoton
|
||||||
|
**Was:** Sechs Leistungen, jede mit dem exakt selben alternierenden 2-Spalten-Layout (Bild links / Toggle rechts, dann Bild rechts / Toggle links). Ab der dritten Leistung ist das Muster vorhersehbar und visuell ermüdend.
|
||||||
|
|
||||||
|
**Warum es wichtig ist:** Wiederholung ohne Variation ist Langeweile. Ein Patient, der durch Leistungen scrollt, sollte engagiert bleiben, nicht das Gefühl haben, durch eine PowerPoint-Präsentation zu klicken. Die identische Struktur signalisiert auch nicht, welche Leistungen am wichtigsten sind.
|
||||||
|
|
||||||
|
**Lösung:** Die Präsentation variieren:
|
||||||
|
- Top 2-3 Leistungen mit dem vollen alternierenden Layout präsentieren
|
||||||
|
- Restliche Leistungen als saubere Liste oder Kartenraster darstellen
|
||||||
|
- Alternierendes Layout nur dort verwenden, wo der visuelle Bruch Mehrwert schafft
|
||||||
|
- "Am häufigsten nachgefragt"- oder "Notfall"-Badge zur Priorisierung hinzufügen
|
||||||
|
|
||||||
|
**Befehl:** `/distill` — Das repetitive Muster reduzieren und Inhalte atmen lassen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Schnelle Verbesserungen (Quick Wins)
|
||||||
|
|
||||||
|
| # | Maßnahme | Impact |
|
||||||
|
|---|----------|--------|
|
||||||
|
| 1 | Footer-Sprechzeiten in Header oder als sticky Element heben | Hoch |
|
||||||
|
| 2 | "Philosophie"-Toggle von Startseite entfernen oder zurückstufen | Mittel |
|
||||||
|
| 3 | Team-CVs aus Tabellen in lesbare Texte umwandeln | Mittel |
|
||||||
|
| 4 | Contact Form 7 an Navy/Gold-Palette anpassen | Niedrig |
|
||||||
|
| 5 | Statisches Kartenbild als Fallback für abgelehnte Google-Maps-Cookies | Mittel |
|
||||||
|
| 6 | Patientenbewertungen/Testimonials hinzufügen | Hoch |
|
||||||
|
| 7 | Notfall-Callout prominent auf Startseite platzieren | Hoch |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fragen zur Reflexion
|
||||||
|
|
||||||
|
- **"Was wäre, wenn die primäre Aktion 3x größer wäre und am Viewport fixiert?"** Würden mehr Patienten anrufen?
|
||||||
|
- **"Weiß ein Erstbesucher in Schmerzen in unter 5 Sekunden, was zu tun ist?"** Testen Sie das. Die Antwort ist wahrscheinlich nein.
|
||||||
|
- **"Wie würde eine selbstbewusste Version dieser Praxis aussehen?"** Eine, die ihre Expertise besitzt statt sie nur aufzulisten?
|
||||||
|
- **"Warum hat der Cookie-Banner mehr Design-Aufmerksamkeit bekommen als die Patienten-Journey?"** Der Banner hat eigene Farben, Logos und Akkordeon-Widgets. Die Startseite hat einen Toggle und einen Footer.
|
||||||
|
- **"Was wäre, wenn die Teamseite mit einem Gruppenfoto starten würde statt mit Einzelkarten?"** Würde das mehr wie eine Familienpraxis und weniger wie ein Firmenverzeichnis wirken?
|
||||||
|
- **"Ist diese Website für die Praxis oder für die Patienten?"** Aktuell liest sie sich wie Ersteres.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Zusammenfassung
|
||||||
|
|
||||||
|
Diese Website vermeidet KI-Schludrigkeit, indem sie zu konventionell ist, um trendy zu sein. Aber Konvention ohne Strategie ist nur eine Vorlage. Das Design ist **technisch solide** – es lädt, ist responsiv, die Farben passen – aber es ist **strategisch schwach**. Es führt Patienten nicht zur Handlung, priorisiert Informationen nicht nach Dringlichkeit und differenziert die Praxis nicht von jedem anderen Zahnarzt mit einer WordPress-Seite.
|
||||||
|
|
||||||
|
Die gute Nachricht: Das sind lösbar Probleme. Die Palette ist solide, der Inhalt existiert, und der Builder (Elementor) erlaubt schnelle Iteration. Die Arbeit ist redaktionell, nicht technisch: Entscheiden, was Patienten am meisten brauchen, wegwerfen, was sie nicht brauchen, und jede Seite um einen einzigen, offensichtlichen nächsten Schritt herum gestalten.
|
||||||
@@ -21,7 +21,9 @@
|
|||||||
"astro": "^5.18.1",
|
"astro": "^5.18.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
"framer-motion": "^12.40.0",
|
||||||
"lucide-react": "^1.16.0",
|
"lucide-react": "^1.16.0",
|
||||||
|
"maplibre-gl": "^5.24.0",
|
||||||
"radix-ui": "^1.4.3",
|
"radix-ui": "^1.4.3",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.4",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.4",
|
||||||
@@ -31,6 +33,7 @@
|
|||||||
"tw-animate-css": "^1.4.0"
|
"tw-animate-css": "^1.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@astrojs/check": "^0.9.9",
|
||||||
"@eslint/js": "^9.39.4",
|
"@eslint/js": "^9.39.4",
|
||||||
"eslint": "^9.39.4",
|
"eslint": "^9.39.4",
|
||||||
"eslint-plugin-react-hooks": "^7.0.1",
|
"eslint-plugin-react-hooks": "^7.0.1",
|
||||||
@@ -39,7 +42,7 @@
|
|||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.1",
|
||||||
"prettier-plugin-astro": "^0.14.1",
|
"prettier-plugin-astro": "^0.14.1",
|
||||||
"prettier-plugin-tailwindcss": "^0.7.2",
|
"prettier-plugin-tailwindcss": "^0.7.2",
|
||||||
"typescript": "~5.9.3",
|
"typescript": "^6.0.3",
|
||||||
"typescript-eslint": "^8.57.1"
|
"typescript-eslint": "^8.57.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
49
src/components/layout/CookieBanner.astro
Normal file
49
src/components/layout/CookieBanner.astro
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="cookie-banner"
|
||||||
|
class="fixed bottom-0 left-0 right-0 z-50 hidden border-t border-border bg-background shadow-lg"
|
||||||
|
>
|
||||||
|
<div class="mx-auto max-w-7xl px-4 py-3 sm:px-6 lg:px-8">
|
||||||
|
<div class="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3">
|
||||||
|
<p class="text-sm text-muted-foreground">
|
||||||
|
Diese Website verwendet ausschließlich technisch notwendige Cookies, um die Funktionalität zu gewährleisten.
|
||||||
|
<a href="/datenschutz" class="underline hover:text-foreground transition-colors">Mehr erfahren</a>
|
||||||
|
</p>
|
||||||
|
<div class="flex gap-2 shrink-0">
|
||||||
|
<button
|
||||||
|
id="cookie-essential"
|
||||||
|
class="rounded-lg border border-border px-3 py-1.5 text-sm font-medium hover:bg-muted transition-colors"
|
||||||
|
>
|
||||||
|
Nur Essentials
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
id="cookie-accept"
|
||||||
|
class="rounded-lg bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors"
|
||||||
|
>
|
||||||
|
Alle akzeptieren
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const banner = document.getElementById('cookie-banner');
|
||||||
|
const acceptBtn = document.getElementById('cookie-accept');
|
||||||
|
const essentialBtn = document.getElementById('cookie-essential');
|
||||||
|
|
||||||
|
// Show banner if not yet decided
|
||||||
|
if (!localStorage.getItem('cookie-consent')) {
|
||||||
|
banner?.classList.remove('hidden');
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideBanner(choice: string) {
|
||||||
|
localStorage.setItem('cookie-consent', choice);
|
||||||
|
banner?.classList.add('hidden');
|
||||||
|
}
|
||||||
|
|
||||||
|
acceptBtn?.addEventListener('click', () => hideBanner('all'));
|
||||||
|
essentialBtn?.addEventListener('click', () => hideBanner('essential'));
|
||||||
|
</script>
|
||||||
87
src/components/layout/Footer.astro
Normal file
87
src/components/layout/Footer.astro
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
---
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
import { Phone, MapPin, Mail, Clock, Stethoscope } from "lucide-react"
|
||||||
|
---
|
||||||
|
|
||||||
|
<footer class="border-t border-border bg-muted/30">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 py-12 sm:px-6 lg:px-8">
|
||||||
|
<div class="grid gap-8 md:grid-cols-3">
|
||||||
|
<!-- Column 1: Practice Info -->
|
||||||
|
<div class="space-y-4">
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<Stethoscope className="h-5 w-5 text-primary" />
|
||||||
|
<span class="font-bold text-lg">{siteConfig.name}</span>
|
||||||
|
</div>
|
||||||
|
<div class="space-y-2 text-sm text-muted-foreground">
|
||||||
|
<div class="flex items-start gap-2">
|
||||||
|
<MapPin className="h-4 w-4 mt-0.5 shrink-0" />
|
||||||
|
<span>{siteConfig.address.street}<br />{siteConfig.address.city}</span>
|
||||||
|
</div>
|
||||||
|
<a href={siteConfig.phoneLink} class="flex items-center gap-2 hover:text-foreground transition-colors">
|
||||||
|
<Phone className="h-4 w-4 shrink-0" />
|
||||||
|
{siteConfig.phone}
|
||||||
|
</a>
|
||||||
|
<a href={`mailto:${siteConfig.email}`} class="flex items-center gap-2 hover:text-foreground transition-colors">
|
||||||
|
<Mail className="h-4 w-4 shrink-0" />
|
||||||
|
{siteConfig.email}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Column 2: Quick Links -->
|
||||||
|
<div class="space-y-4">
|
||||||
|
<h3 class="font-semibold text-sm uppercase tracking-wider text-foreground/80">Navigation</h3>
|
||||||
|
<ul class="space-y-2">
|
||||||
|
{siteConfig.navigation.map((item) => (
|
||||||
|
<li>
|
||||||
|
<a href={item.href} class="text-sm text-muted-foreground hover:text-foreground transition-colors">
|
||||||
|
{item.label}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Column 3: Hours -->
|
||||||
|
<div class="space-y-4">
|
||||||
|
<h3 class="font-semibold text-sm uppercase tracking-wider text-foreground/80 flex items-center gap-2">
|
||||||
|
<Clock className="h-4 w-4" />
|
||||||
|
Sprechzeiten
|
||||||
|
</h3>
|
||||||
|
<div class="space-y-1.5 text-sm text-muted-foreground">
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span>Montag</span>
|
||||||
|
<span>{siteConfig.hours.monday}</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span>Dienstag</span>
|
||||||
|
<span>{siteConfig.hours.tuesday}</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span>Mittwoch</span>
|
||||||
|
<span>{siteConfig.hours.wednesday}</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span>Donnerstag</span>
|
||||||
|
<span>{siteConfig.hours.thursday}</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span>Freitag</span>
|
||||||
|
<span>{siteConfig.hours.friday}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Bottom bar -->
|
||||||
|
<div class="border-t border-border">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 py-4 sm:px-6 lg:px-8 flex flex-col sm:flex-row justify-between items-center gap-2 text-xs text-muted-foreground">
|
||||||
|
<span>© {new Date().getFullYear()} {siteConfig.name}. Alle Rechte vorbehalten.</span>
|
||||||
|
<div class="flex gap-4">
|
||||||
|
<a href="/impressum" class="hover:text-foreground transition-colors">Impressum</a>
|
||||||
|
<a href="/datenschutz" class="hover:text-foreground transition-colors">Datenschutz</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
71
src/components/layout/Header.astro
Normal file
71
src/components/layout/Header.astro
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
---
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
import { Phone, Menu, X, Stethoscope } from "lucide-react"
|
||||||
|
import MobileNav from "./MobileNav.astro"
|
||||||
|
|
||||||
|
const currentPath = Astro.url.pathname
|
||||||
|
---
|
||||||
|
|
||||||
|
<header class="sticky top-0 z-50 w-full border-b border-border bg-background">
|
||||||
|
<div class="mx-auto flex h-16 max-w-7xl items-center justify-between px-4 sm:px-6 lg:px-8">
|
||||||
|
<!-- Logo/Brand -->
|
||||||
|
<a href="/" class="flex items-center gap-2 text-navy-700 hover:opacity-80 transition-opacity">
|
||||||
|
<Stethoscope className="h-6 w-6" />
|
||||||
|
<span class="text-lg font-bold hidden sm:inline">{siteConfig.name}</span>
|
||||||
|
<span class="text-lg font-bold sm:hidden">Dr. Tittel</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- Desktop Nav -->
|
||||||
|
<nav class="hidden md:flex items-center gap-1">
|
||||||
|
{siteConfig.navigation.map((item) => (
|
||||||
|
<a
|
||||||
|
href={item.href}
|
||||||
|
class={`px-3 py-2 text-sm font-medium rounded-md transition-colors ${
|
||||||
|
currentPath === item.href || (item.href !== "/" && currentPath.startsWith(item.href))
|
||||||
|
? "text-primary bg-primary/10"
|
||||||
|
: "text-foreground/70 hover:text-foreground hover:bg-muted"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{item.label}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<!-- Phone CTA + Mobile Menu -->
|
||||||
|
<div class="flex items-center gap-3">
|
||||||
|
<a
|
||||||
|
href={siteConfig.phoneLink}
|
||||||
|
class="hidden sm:inline-flex items-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground shadow-sm hover:bg-primary/90 transition-colors"
|
||||||
|
>
|
||||||
|
<Phone className="h-4 w-4" />
|
||||||
|
{siteConfig.phone}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- Mobile hamburger -->
|
||||||
|
<button
|
||||||
|
id="mobile-menu-toggle"
|
||||||
|
class="md:hidden inline-flex items-center justify-center rounded-lg p-2 text-foreground hover:bg-muted transition-colors"
|
||||||
|
aria-label="Menü öffnen"
|
||||||
|
>
|
||||||
|
<Menu className="h-6 w-6" id="menu-icon-open" />
|
||||||
|
<X className="h-6 w-6 hidden" id="menu-icon-close" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Mobile Navigation -->
|
||||||
|
<MobileNav />
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const toggle = document.getElementById('mobile-menu-toggle');
|
||||||
|
const mobileNav = document.getElementById('mobile-nav');
|
||||||
|
const openIcon = document.getElementById('menu-icon-open');
|
||||||
|
const closeIcon = document.getElementById('menu-icon-close');
|
||||||
|
|
||||||
|
toggle?.addEventListener('click', () => {
|
||||||
|
const isOpen = mobileNav?.classList.toggle('hidden');
|
||||||
|
openIcon?.classList.toggle('hidden');
|
||||||
|
closeIcon?.classList.toggle('hidden');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
43
src/components/layout/MobileNav.astro
Normal file
43
src/components/layout/MobileNav.astro
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
import { Phone, MapPin, Clock } from "lucide-react"
|
||||||
|
|
||||||
|
const currentPath = Astro.url.pathname
|
||||||
|
---
|
||||||
|
|
||||||
|
<div id="mobile-nav" class="hidden md:hidden border-t border-border bg-background">
|
||||||
|
<div class="space-y-1 px-4 py-3">
|
||||||
|
{siteConfig.navigation.map((item) => (
|
||||||
|
<a
|
||||||
|
href={item.href}
|
||||||
|
class={`block rounded-lg px-3 py-2.5 text-base font-medium transition-colors ${
|
||||||
|
currentPath === item.href || (item.href !== "/" && currentPath.startsWith(item.href))
|
||||||
|
? "text-primary bg-primary/10"
|
||||||
|
: "text-foreground/70 hover:text-foreground hover:bg-muted"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{item.label}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
|
||||||
|
<div class="mt-4 space-y-3 border-t border-border pt-4">
|
||||||
|
<a
|
||||||
|
href={siteConfig.phoneLink}
|
||||||
|
class="flex items-center gap-2 rounded-lg bg-primary px-4 py-3 text-base font-semibold text-primary-foreground"
|
||||||
|
>
|
||||||
|
<Phone className="h-5 w-5" />
|
||||||
|
{siteConfig.phone}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="flex items-start gap-2 text-sm text-muted-foreground px-1">
|
||||||
|
<MapPin className="h-4 w-4 mt-0.5 shrink-0" />
|
||||||
|
<span>{siteConfig.address.street}, {siteConfig.address.city}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex items-start gap-2 text-sm text-muted-foreground px-1">
|
||||||
|
<Clock className="h-4 w-4 mt-0.5 shrink-0" />
|
||||||
|
<span>Mo–Fr: 8:00–12:00, Do: bis 18:00</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
44
src/components/maps/PracticeMap.tsx
Normal file
44
src/components/maps/PracticeMap.tsx
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import {
|
||||||
|
Map,
|
||||||
|
MapControls,
|
||||||
|
MapMarker,
|
||||||
|
MarkerContent,
|
||||||
|
MarkerLabel,
|
||||||
|
MarkerPopup,
|
||||||
|
} from "@/components/ui/map"
|
||||||
|
import { MapPin } from "lucide-react"
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
|
||||||
|
interface PracticeMapProps {
|
||||||
|
className?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export function PracticeMap({ className }: PracticeMapProps) {
|
||||||
|
const { longitude, latitude } = siteConfig.location
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={className}>
|
||||||
|
<Map center={[longitude, latitude]} zoom={15} theme="light" className="h-full w-full">
|
||||||
|
<MapMarker longitude={longitude} latitude={latitude}>
|
||||||
|
<MarkerContent>
|
||||||
|
<div className="flex h-8 w-8 items-center justify-center rounded-full border-2 border-white bg-primary shadow-lg">
|
||||||
|
<MapPin className="h-4 w-4 text-primary-foreground" />
|
||||||
|
</div>
|
||||||
|
</MarkerContent>
|
||||||
|
<MarkerLabel position="top">{siteConfig.name}</MarkerLabel>
|
||||||
|
<MarkerPopup closeButton>
|
||||||
|
<div className="space-y-1">
|
||||||
|
<p className="text-sm font-medium">{siteConfig.name}</p>
|
||||||
|
<p className="text-xs text-muted-foreground">
|
||||||
|
{siteConfig.address.street}
|
||||||
|
<br />
|
||||||
|
{siteConfig.address.city}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</MarkerPopup>
|
||||||
|
</MapMarker>
|
||||||
|
<MapControls showZoom showFullscreen position="bottom-right" />
|
||||||
|
</Map>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
43
src/components/sections/EmergencyCTA.astro
Normal file
43
src/components/sections/EmergencyCTA.astro
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
import { Phone, Clock, AlertTriangle, ArrowRight } from "lucide-react"
|
||||||
|
---
|
||||||
|
|
||||||
|
<section class="py-16 bg-primary">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<div class="flex flex-col lg:flex-row items-center justify-between gap-8">
|
||||||
|
<div class="text-center lg:text-left">
|
||||||
|
<div class="inline-flex items-center gap-2 text-sm font-medium text-white/90 mb-4">
|
||||||
|
<AlertTriangle className="h-4 w-4" />
|
||||||
|
<span>Zahnschmerzen? Wir helfen sofort.</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 class="text-3xl font-bold text-white sm:text-4xl">
|
||||||
|
Notfall? Rufen Sie uns an.
|
||||||
|
</h2>
|
||||||
|
<p class="mt-3 text-lg text-white/80">
|
||||||
|
Wir kümmern uns um akute Schmerzfälle. Auch kurzfristige Termine möglich.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col sm:flex-row gap-4">
|
||||||
|
<a
|
||||||
|
href={siteConfig.phoneLink}
|
||||||
|
class="inline-flex items-center justify-center gap-3 rounded-xl bg-white px-8 py-4 text-lg font-bold text-primary hover:bg-white/90 transition-all"
|
||||||
|
>
|
||||||
|
<Phone className="h-6 w-6" />
|
||||||
|
{siteConfig.phone}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="/sprechzeiten"
|
||||||
|
class="inline-flex items-center justify-center gap-2 rounded-xl bg-white/10 px-6 py-4 text-base font-semibold text-white hover:bg-white/20 transition-all"
|
||||||
|
>
|
||||||
|
<Clock className="h-5 w-5" />
|
||||||
|
Sprechzeiten
|
||||||
|
<ArrowRight className="h-5 w-5" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
58
src/components/sections/FeaturedServices.astro
Normal file
58
src/components/sections/FeaturedServices.astro
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
import { services } from "@/data/site"
|
||||||
|
import { ArrowRight, Sparkles, CircleDot, Shield, GitBranch, Baby, Sun } from "lucide-react"
|
||||||
|
|
||||||
|
const iconMap: Record<string, any> = {
|
||||||
|
Sparkles,
|
||||||
|
CircleDot,
|
||||||
|
Shield,
|
||||||
|
GitBranch,
|
||||||
|
Baby,
|
||||||
|
Sun,
|
||||||
|
}
|
||||||
|
|
||||||
|
const featuredServices = services.filter(s => s.featured)
|
||||||
|
---
|
||||||
|
|
||||||
|
<section class="py-20 bg-background">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<div class="text-center max-w-2xl mx-auto mb-16">
|
||||||
|
<h2 class="text-3xl font-bold text-foreground sm:text-4xl">
|
||||||
|
Unsere Leistungen
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2 md:grid-cols-3">
|
||||||
|
{featuredServices.map((service) => {
|
||||||
|
const IconComponent = iconMap[service.icon] || Sparkles
|
||||||
|
return (
|
||||||
|
<div class="group relative rounded-2xl border border-border bg-card p-6 hover:border-primary/30 transition-all">
|
||||||
|
<IconComponent className="mb-6 h-6 w-6 text-primary" />
|
||||||
|
|
||||||
|
<h3 class="text-xl font-semibold text-card-foreground mb-3">{service.title}</h3>
|
||||||
|
|
||||||
|
<p class="text-muted-foreground mb-6">{service.shortDesc}</p>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href={`/leistungen#${service.id}`}
|
||||||
|
class="inline-flex items-center gap-1 text-sm font-medium text-primary hover:gap-2 transition-all"
|
||||||
|
>
|
||||||
|
Mehr erfahren
|
||||||
|
<ArrowRight className="h-4 w-4" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-12 text-center">
|
||||||
|
<a
|
||||||
|
href="/leistungen"
|
||||||
|
class="inline-flex items-center gap-2 rounded-xl border-2 border-border bg-background px-6 py-3 text-base font-semibold text-foreground hover:bg-muted hover:border-primary/30 transition-all"
|
||||||
|
>
|
||||||
|
Alle Leistungen ansehen
|
||||||
|
<ArrowRight className="h-5 w-5" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
78
src/components/sections/Hero.astro
Normal file
78
src/components/sections/Hero.astro
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
---
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
import { Phone, ArrowRight, Stethoscope } from "lucide-react"
|
||||||
|
---
|
||||||
|
|
||||||
|
<section class="relative overflow-hidden bg-muted/30">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 py-20 sm:px-6 sm:py-28 lg:px-8">
|
||||||
|
<div class="grid gap-12 lg:grid-cols-2 lg:gap-8 items-center">
|
||||||
|
<!-- Left column: Text content -->
|
||||||
|
<div class="max-w-2xl">
|
||||||
|
<div class="inline-flex items-center gap-2 text-sm font-medium text-muted-foreground mb-6">
|
||||||
|
<Stethoscope className="h-4 w-4" />
|
||||||
|
<span>Moderne Zahnheilkunde mit Herz</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1 class="text-4xl font-bold text-foreground sm:text-5xl lg:text-6xl">
|
||||||
|
Ihr Zahnarzt in Crimmitschau
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p class="mt-6 text-lg leading-8 text-muted-foreground max-w-xl">
|
||||||
|
Von Implantologie bis Kinderbehandlung – wir begleiten Sie mit modernster
|
||||||
|
Technik und persönlicher Betreuung auf dem Weg zu Ihrem gesunden Lächeln.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="mt-10 flex flex-col sm:flex-row gap-4">
|
||||||
|
<a
|
||||||
|
href={siteConfig.phoneLink}
|
||||||
|
class="inline-flex items-center justify-center gap-2 rounded-xl bg-primary px-8 py-4 text-base font-semibold text-primary-foreground hover:bg-primary/90 transition-all"
|
||||||
|
>
|
||||||
|
<Phone className="h-5 w-5" />
|
||||||
|
Jetzt anrufen
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="/leistungen"
|
||||||
|
class="inline-flex items-center justify-center gap-2 rounded-xl border border-border bg-background px-8 py-4 text-base font-semibold text-foreground hover:bg-muted transition-all"
|
||||||
|
>
|
||||||
|
Leistungen entdecken
|
||||||
|
<ArrowRight className="h-5 w-5" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Trust badges -->
|
||||||
|
<div class="mt-12 flex flex-wrap items-center gap-6 text-sm text-muted-foreground">
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<div class="h-2 w-2 rounded-full bg-primary/60" />
|
||||||
|
<span>Termine kurzfristig möglich</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<div class="h-2 w-2 rounded-full bg-primary/60" />
|
||||||
|
<span>Barrierefreie Praxis</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<div class="h-2 w-2 rounded-full bg-primary/60" />
|
||||||
|
<span>Kinderfreundlich</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Right column: Hero image -->
|
||||||
|
<div class="hidden lg:block relative">
|
||||||
|
<!-- Decorative background shape -->
|
||||||
|
<div class="absolute -inset-4 bg-primary/5 rounded-3xl rotate-2"></div>
|
||||||
|
|
||||||
|
<div class="relative rounded-2xl overflow-hidden shadow-lg border border-border/50 rotate-1 hover:rotate-0 transition-transform duration-500">
|
||||||
|
<img
|
||||||
|
src="https://images.unsplash.com/photo-1629909613654-28e377c37b09?auto=format&fit=crop&w=800&q=80"
|
||||||
|
alt="Moderne Zahnarztpraxis"
|
||||||
|
class="w-full h-auto max-h-[500px] object-cover"
|
||||||
|
loading="eager"
|
||||||
|
width="800"
|
||||||
|
height="600"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
73
src/components/sections/HoursPreview.astro
Normal file
73
src/components/sections/HoursPreview.astro
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
---
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
import { Clock, ArrowRight, MapPin, Phone } from "lucide-react"
|
||||||
|
---
|
||||||
|
|
||||||
|
<section class="py-20 bg-background">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<div class="grid gap-12 lg:grid-cols-2 items-center">
|
||||||
|
<div>
|
||||||
|
<div class="inline-flex items-center gap-2 text-sm font-medium text-muted-foreground mb-4">
|
||||||
|
<Clock className="h-4 w-4" />
|
||||||
|
<span>Sprechzeiten</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 class="text-3xl font-bold text-foreground sm:text-4xl">
|
||||||
|
Wann wir für Sie da sind
|
||||||
|
</h2>
|
||||||
|
<p class="mt-4 text-lg text-muted-foreground">
|
||||||
|
Flexible Termine, auch außerhalb der regulären Sprechzeiten nach Vereinbarung.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="mt-8 space-y-3">
|
||||||
|
<div class="flex justify-between items-center py-2 border-b border-border">
|
||||||
|
<span class="font-medium text-foreground">Montag – Dienstag</span>
|
||||||
|
<span class="text-muted-foreground">8:00 – 12:00, 14:00 – 18:00</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between items-center py-2 border-b border-border">
|
||||||
|
<span class="font-medium text-foreground">Mittwoch</span>
|
||||||
|
<span class="text-muted-foreground">8:00 – 12:00</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between items-center py-2 border-b border-border">
|
||||||
|
<span class="font-medium text-foreground">Donnerstag</span>
|
||||||
|
<span class="text-muted-foreground">8:00 – 12:00, 14:00 – 18:00</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between items-center py-2 border-b border-border">
|
||||||
|
<span class="font-medium text-foreground">Freitag</span>
|
||||||
|
<span class="text-muted-foreground">8:00 – 12:00</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="/sprechzeiten"
|
||||||
|
class="mt-8 inline-flex items-center gap-2 text-sm font-medium text-primary hover:gap-3 transition-all"
|
||||||
|
>
|
||||||
|
Vollständige Sprechzeiten & Notdienst
|
||||||
|
<ArrowRight className="h-4 w-4" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="rounded-2xl border border-border bg-card p-8">
|
||||||
|
<div class="flex items-start gap-3 mb-6">
|
||||||
|
<MapPin className="h-5 w-5 text-primary mt-0.5 shrink-0" />
|
||||||
|
<div>
|
||||||
|
<h3 class="font-semibold text-foreground">{siteConfig.name}</h3>
|
||||||
|
<p class="text-muted-foreground">{siteConfig.address.street}<br />{siteConfig.address.city}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href={siteConfig.phoneLink}
|
||||||
|
class="inline-flex w-full items-center justify-center gap-2 rounded-xl bg-primary px-6 py-3 text-base font-semibold text-primary-foreground hover:bg-primary/90 transition-colors"
|
||||||
|
>
|
||||||
|
<Phone className="h-5 w-5" />
|
||||||
|
{siteConfig.phone}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<p class="mt-4 text-xs text-center text-muted-foreground">
|
||||||
|
Kostenfreie Parkplätze direkt vor der Praxis
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
54
src/components/sections/TeamPreview.astro
Normal file
54
src/components/sections/TeamPreview.astro
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
import { teamMembers } from "@/data/site"
|
||||||
|
import { ArrowRight, Users } from "lucide-react"
|
||||||
|
|
||||||
|
const previewMembers = teamMembers.slice(0, 3)
|
||||||
|
---
|
||||||
|
|
||||||
|
<section class="py-20 bg-muted/20">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<div class="flex flex-col md:flex-row md:items-end md:justify-between gap-6 mb-12">
|
||||||
|
<div class="max-w-xl">
|
||||||
|
<div class="inline-flex items-center gap-2 text-sm font-medium text-muted-foreground mb-4">
|
||||||
|
<Users className="h-4 w-4" />
|
||||||
|
<span>Ihr Team</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 class="text-3xl font-bold text-foreground sm:text-4xl">
|
||||||
|
Ihr Praxisteam
|
||||||
|
</h2>
|
||||||
|
<p class="mt-4 text-lg text-muted-foreground">
|
||||||
|
Lernen Sie das Team kennen, das sich mit Herz und Fachwissen um Ihre Zahngesundheit kümmert.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="/unser-team"
|
||||||
|
class="inline-flex items-center gap-2 rounded-xl border-2 border-border bg-background px-6 py-3 text-base font-semibold text-foreground hover:bg-muted hover:border-primary/30 transition-all shrink-0"
|
||||||
|
>
|
||||||
|
Das ganze Team
|
||||||
|
<ArrowRight className="h-5 w-5" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid gap-8 md:grid-cols-3">
|
||||||
|
{previewMembers.map((member) => (
|
||||||
|
<div class="group text-center">
|
||||||
|
<div class="mx-auto mb-4 h-32 w-32 rounded-full bg-muted flex items-center justify-center overflow-hidden">
|
||||||
|
<img
|
||||||
|
src={member.image}
|
||||||
|
alt={member.name}
|
||||||
|
loading="lazy"
|
||||||
|
decoding="async"
|
||||||
|
class="h-full w-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 class="text-lg font-semibold text-foreground">{member.name}</h3>
|
||||||
|
<p class="text-sm text-primary font-medium">{member.role}</p>
|
||||||
|
<p class="mt-2 text-sm text-muted-foreground px-4">{member.bio}</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
1844
src/components/ui/map.tsx
Normal file
1844
src/components/ui/map.tsx
Normal file
File diff suppressed because it is too large
Load Diff
142
src/data/site.ts
Normal file
142
src/data/site.ts
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
export const siteConfig = {
|
||||||
|
name: "Zahnarztpraxis Dr. Tittel",
|
||||||
|
tagline: "Ihr Zahnarzt in Crimmitschau",
|
||||||
|
phone: "03762 56 29",
|
||||||
|
phoneLink: "tel:037625629",
|
||||||
|
address: {
|
||||||
|
street: "Bodelschwinghstraße 1",
|
||||||
|
city: "08451 Crimmitschau",
|
||||||
|
},
|
||||||
|
location: {
|
||||||
|
latitude: 50.8203324,
|
||||||
|
longitude: 12.3849586,
|
||||||
|
},
|
||||||
|
email: "praxis@zahnarzt-tittel.de",
|
||||||
|
hours: {
|
||||||
|
monday: "8:00 – 12:00, 14:00 – 18:00",
|
||||||
|
tuesday: "8:00 – 12:00, 14:00 – 18:00",
|
||||||
|
wednesday: "8:00 – 12:00",
|
||||||
|
thursday: "8:00 – 12:00, 14:00 – 18:00",
|
||||||
|
friday: "8:00 – 12:00",
|
||||||
|
},
|
||||||
|
emergency: {
|
||||||
|
url: "https://www.zahnaerzte-in-sachsen.de",
|
||||||
|
text: "Zahnärztlicher Notdienst Sachsen",
|
||||||
|
},
|
||||||
|
navigation: [
|
||||||
|
{ label: "Startseite", href: "/" },
|
||||||
|
{ label: "Unser Team", href: "/unser-team" },
|
||||||
|
{ label: "Leistungen", href: "/leistungen" },
|
||||||
|
{ label: "Sprechzeiten", href: "/sprechzeiten" },
|
||||||
|
{ label: "Kontakt", href: "/kontakt" },
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
export const teamMembers = [
|
||||||
|
{
|
||||||
|
name: "Dr. Sophie Tittel",
|
||||||
|
role: "Zahnärztin",
|
||||||
|
image:
|
||||||
|
"https://images.unsplash.com/photo-1573496359142-b8d87734a5a2?auto=format&fit=crop&w=400&h=400&q=80",
|
||||||
|
bio: "Spezialisiert auf ästhetische Zahnheilkunde und Implantologie.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Dr. Sybille Weber",
|
||||||
|
role: "Zahnärztin",
|
||||||
|
image:
|
||||||
|
"https://images.unsplash.com/photo-1551836022-d5d88e9218df?auto=format&fit=crop&w=400&h=400&q=80",
|
||||||
|
bio: "Expertin für Wurzelkanalbehandlungen und Kinderzahnheilkunde.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Sabine Schnabel",
|
||||||
|
role: "Zahnarzthelferin",
|
||||||
|
image:
|
||||||
|
"https://images.unsplash.com/photo-1594824476967-48c8b964273f?auto=format&fit=crop&w=400&h=400&q=80",
|
||||||
|
bio: "Verantwortlich für Prophylaxe und Patientenbetreuung.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Susan Gabler",
|
||||||
|
role: "Zahnarzthelferin",
|
||||||
|
image:
|
||||||
|
"https://images.unsplash.com/photo-1580489944761-15a19d654956?auto=format&fit=crop&w=400&h=400&q=80",
|
||||||
|
bio: "Spezialisiert auf Assistenz bei chirurgischen Eingriffen.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Denise Golesh",
|
||||||
|
role: "Zahnarzthelferin",
|
||||||
|
image:
|
||||||
|
"https://images.unsplash.com/photo-1438761681033-6461ffad8d80?auto=format&fit=crop&w=400&h=400&q=80",
|
||||||
|
bio: "Zuständig für Verwaltung und Terminkoordination.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Christiane Zill",
|
||||||
|
role: "Zahnarzthelferin",
|
||||||
|
image:
|
||||||
|
"https://images.unsplash.com/photo-1544005313-94ddf0286df2?auto=format&fit=crop&w=400&h=400&q=80",
|
||||||
|
bio: "Expertin für professionelle Zahnreinigung.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Angelika Schulz",
|
||||||
|
role: "Zahnarzthelferin",
|
||||||
|
image:
|
||||||
|
"https://images.unsplash.com/photo-1487412720507-e7ab37603c6f?auto=format&fit=crop&w=400&h=400&q=80",
|
||||||
|
bio: "Spezialisiert auf Röntgendiagnostik und Laborarbeit.",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export const services = [
|
||||||
|
{
|
||||||
|
id: "fuellungen",
|
||||||
|
title: "Ästhetische Zahnfüllungen",
|
||||||
|
shortDesc: "Natürlich aussehende Füllungen aus hochwertigen Kompositen.",
|
||||||
|
fullDesc:
|
||||||
|
"Wir setzen auf unsichtbare, zahnfarbene Füllungen, die sich perfekt an Ihre natürliche Zahnfarbe anpassen. Moderne Komposite bieten höchste Ästhetik und Langlebigkeit.",
|
||||||
|
icon: "Sparkles",
|
||||||
|
featured: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "implantate",
|
||||||
|
title: "Implantologie",
|
||||||
|
shortDesc: "Feste Zähne dank modernster Implantattechnologie.",
|
||||||
|
fullDesc:
|
||||||
|
"Fehlende Zähne ersetzen wir durch hochwertige Zahnimplantate. Mit modernster 3D-Planung und computerunterstützter Chirurgie erreichen wir optimale Ergebnisse.",
|
||||||
|
icon: "CircleDot",
|
||||||
|
featured: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "wurzelkanal",
|
||||||
|
title: "Wurzelkanalbehandlung",
|
||||||
|
shortDesc: "Schonende Behandlung mit modernsten Verfahren.",
|
||||||
|
fullDesc:
|
||||||
|
"Mit modernsten mikroskopischen Verfahren und elektronischer Längenmessung behandeln wir entzündete Zahnwurzeln schonend und erfolgreich.",
|
||||||
|
icon: "GitBranch",
|
||||||
|
featured: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "prophylaxe",
|
||||||
|
title: "Professionelle Zahnreinigung",
|
||||||
|
shortDesc: "Vorbeugen ist besser als Heilen.",
|
||||||
|
fullDesc:
|
||||||
|
"Regelmäßige professionelle Zahnreinigung schützt vor Karies und Parodontitis. Wir entfernen hartnäckige Beläge und polieren Ihre Zähne gründlich.",
|
||||||
|
icon: "Shield",
|
||||||
|
featured: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "kinder",
|
||||||
|
title: "Kinderbehandlung",
|
||||||
|
shortDesc: "Sanfte Zahnheilkunde für die Kleinsten.",
|
||||||
|
fullDesc:
|
||||||
|
"Wir nehmen uns Zeit für Ihre Kinder und sorgen für eine entspannte Atmosphäre. Frühe Gewöhnung an die Zahnarztbesuche legt den Grundstein für lebenslange Zahngesundheit.",
|
||||||
|
icon: "Baby",
|
||||||
|
featured: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "aufhellung",
|
||||||
|
title: "Zahnaufhellung",
|
||||||
|
shortDesc: "Strahlend weißes Lächeln.",
|
||||||
|
fullDesc:
|
||||||
|
"Mit schonenden Bleaching-Verfahren bringen wir Ihr Lächeln zum Strahlen. Wir beraten Sie individuell über die beste Methode für Ihre Zähne.",
|
||||||
|
icon: "Sun",
|
||||||
|
featured: false,
|
||||||
|
},
|
||||||
|
]
|
||||||
@@ -1,15 +1,36 @@
|
|||||||
---
|
---
|
||||||
import "@/styles/global.css"
|
import "@/styles/global.css"
|
||||||
|
import Header from "@/components/layout/Header.astro"
|
||||||
|
import Footer from "@/components/layout/Footer.astro"
|
||||||
|
import CookieBanner from "@/components/layout/CookieBanner.astro"
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
title?: string
|
||||||
|
description?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
title = siteConfig.name,
|
||||||
|
description = "Ihr vertrauensvoller Zahnarzt in Crimmitschau. Moderne Zahnheilkunde mit Herz – von Implantologie bis Kinderbehandlung."
|
||||||
|
} = Astro.props
|
||||||
---
|
---
|
||||||
|
|
||||||
<html lang="en">
|
<!DOCTYPE html>
|
||||||
|
<html lang="de" class="scroll-smooth">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<meta name="description" content={description} />
|
||||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||||
<title>Astro App</title>
|
<title>{title}</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body class="min-h-screen flex flex-col bg-background text-foreground antialiased">
|
||||||
<slot />
|
<Header />
|
||||||
|
<main class="flex-1">
|
||||||
|
<slot />
|
||||||
|
</main>
|
||||||
|
<Footer />
|
||||||
|
<CookieBanner />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
53
src/pages/datenschutz.astro
Normal file
53
src/pages/datenschutz.astro
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/main.astro"
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={`Datenschutz – Zahnarztpraxis Dr. Tittel`}>
|
||||||
|
<section class="py-16 sm:py-24 bg-background">
|
||||||
|
<div class="mx-auto max-w-2xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<h1 class="text-4xl font-bold tracking-tight text-foreground mb-8">Datenschutzerklärung</h1>
|
||||||
|
|
||||||
|
<div class="prose prose-slate max-w-none">
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">1. Datenschutz auf einen Blick</h2>
|
||||||
|
|
||||||
|
<h3 class="text-lg font-semibold text-foreground mt-6 mb-3">Allgemeine Hinweise</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen
|
||||||
|
Daten passiert, wenn Sie diese Website besuchen.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">2. Allgemeine Hinweise und Pflichtinformationen</h2>
|
||||||
|
|
||||||
|
<h3 class="text-lg font-semibold text-foreground mt-6 mb-3">Datenschutz</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Die Betreiber dieser Seiten nehmen den Schutz Ihrer persönlichen Daten sehr ernst.
|
||||||
|
Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen
|
||||||
|
Datenschutzvorschriften sowie dieser Datenschutzerklärung.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">3. Datenerfassung auf dieser Website</h2>
|
||||||
|
|
||||||
|
<h3 class="text-lg font-semibold text-foreground mt-6 mb-3">Cookies</h3>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Unsere Internetseiten verwenden so genannte „Cookies". Cookies sind kleine Textdateien
|
||||||
|
und richten auf Ihrem Endgerät keinen Schaden an.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">4. Kontaktformular</h2>
|
||||||
|
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Wenn Sie uns per Kontaktformular Anfragen zukommen lassen, werden Ihre Angaben aus dem
|
||||||
|
Anfrageformular inklusive der von Ihnen dort angegebenen Kontaktdaten zwecks Bearbeitung
|
||||||
|
der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">5. Ihre Rechte</h2>
|
||||||
|
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Sie haben jederzeit das Recht, unentgeltlich Auskunft über Herkunft, Empfänger und
|
||||||
|
Zweck Ihrer gespeicherten personenbezogenen Daten zu erhalten.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</Layout>
|
||||||
48
src/pages/impressum.astro
Normal file
48
src/pages/impressum.astro
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/main.astro"
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={`Impressum – Zahnarztpraxis Dr. Tittel`}>
|
||||||
|
<section class="py-16 sm:py-24 bg-background">
|
||||||
|
<div class="mx-auto max-w-2xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<h1 class="text-4xl font-bold tracking-tight text-foreground mb-8">Impressum</h1>
|
||||||
|
|
||||||
|
<div class="prose prose-slate max-w-none">
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">Angaben gemäß § 5 TMG</h2>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
<strong class="text-foreground">{siteConfig.name}</strong><br />
|
||||||
|
{siteConfig.address.street}<br />
|
||||||
|
{siteConfig.address.city}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">Kontakt</h2>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Telefon: {siteConfig.phone}<br />
|
||||||
|
E-Mail: {siteConfig.email}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">Berufsbezeichnung</h2>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Zahnärztin (Bundesrepublik Deutschland)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">Zuständige Kammer</h2>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Zahnärztekammer Sachsen
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">Berufsrechtliche Regelungen</h2>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Berufsordnung der Zahnärztekammer Sachsen
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold text-foreground mt-8 mb-4">Haftungsausschluss</h2>
|
||||||
|
<p class="text-muted-foreground">
|
||||||
|
Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit,
|
||||||
|
Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</Layout>
|
||||||
@@ -1,17 +1,16 @@
|
|||||||
---
|
---
|
||||||
import Layout from "@/layouts/main.astro"
|
import Layout from "@/layouts/main.astro"
|
||||||
import { Button } from "@/components/ui/button"
|
import Hero from "@/components/sections/Hero.astro"
|
||||||
|
import FeaturedServices from "@/components/sections/FeaturedServices.astro"
|
||||||
|
import TeamPreview from "@/components/sections/TeamPreview.astro"
|
||||||
|
import EmergencyCTA from "@/components/sections/EmergencyCTA.astro"
|
||||||
|
import HoursPreview from "@/components/sections/HoursPreview.astro"
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout>
|
<Layout title="Zahnarztpraxis Dr. Tittel – Ihr Zahnarzt in Crimmitschau">
|
||||||
<div class="flex min-h-svh p-6">
|
<Hero />
|
||||||
<div class="flex max-w-md min-w-0 flex-col gap-4 text-sm leading-loose">
|
<FeaturedServices />
|
||||||
<div>
|
<TeamPreview />
|
||||||
<h1 class="font-medium">Project ready!</h1>
|
<EmergencyCTA />
|
||||||
<p>You may now add components and start building.</p>
|
<HoursPreview />
|
||||||
<p>We've already added the button component for you.</p>
|
|
||||||
<Button client:load className="mt-2">Button</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|||||||
233
src/pages/kontakt.astro
Normal file
233
src/pages/kontakt.astro
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/main.astro"
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
import { Phone, Mail, MapPin, Clock, Send, CheckCircle, AlertTriangle } from "lucide-react"
|
||||||
|
import { PracticeMap } from "@/components/maps/PracticeMap"
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={`Kontakt – Zahnarztpraxis Dr. Tittel`}>
|
||||||
|
<!-- Page Header -->
|
||||||
|
<section class="bg-muted/30 py-12 sm:py-16">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 text-center">
|
||||||
|
<h1 class="text-4xl font-bold text-foreground sm:text-5xl">
|
||||||
|
Wir freuen uns auf Ihre Nachricht
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p class="mt-6 text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
Haben Sie Fragen oder möchten Sie einen Termin vereinbaren?
|
||||||
|
Kontaktieren Sie uns – wir melden uns schnellstmöglich bei Ihnen.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Contact Section -->
|
||||||
|
<section class="py-16 bg-background">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<div class="grid gap-12 lg:grid-cols-2">
|
||||||
|
<!-- Contact Info -->
|
||||||
|
<div class="space-y-8">
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<h2 class="text-2xl font-bold text-foreground mb-6">Praxisinformationen</h2>
|
||||||
|
|
||||||
|
<div class="space-y-4">
|
||||||
|
<div class="flex items-start gap-4 rounded-xl border border-border bg-card p-4">
|
||||||
|
<div class="inline-flex items-center justify-center rounded-lg bg-muted p-2 shrink-0">
|
||||||
|
<MapPin className="h-5 w-5 text-muted-foreground" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="font-medium text-card-foreground">{siteConfig.name}</p>
|
||||||
|
<p class="text-sm text-muted-foreground">{siteConfig.address.street}<br />{siteConfig.address.city}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href={siteConfig.phoneLink}
|
||||||
|
class="flex items-start gap-4 rounded-xl border border-border bg-card p-4 hover:border-border/80 transition-colors"
|
||||||
|
>
|
||||||
|
<div class="inline-flex items-center justify-center rounded-lg bg-muted p-2 shrink-0">
|
||||||
|
<Phone className="h-5 w-5 text-muted-foreground" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="font-medium text-card-foreground">Telefon</p>
|
||||||
|
<p class="text-sm text-foreground">{siteConfig.phone}</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href={`mailto:${siteConfig.email}`}
|
||||||
|
class="flex items-start gap-4 rounded-xl border border-border bg-card p-4 hover:border-border/80 transition-colors"
|
||||||
|
>
|
||||||
|
<div class="inline-flex items-center justify-center rounded-lg bg-muted p-2 shrink-0">
|
||||||
|
<Mail className="h-5 w-5 text-muted-foreground" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="font-medium text-card-foreground">E-Mail</p>
|
||||||
|
<p class="text-sm text-foreground">{siteConfig.email}</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="flex items-start gap-4 rounded-xl border border-border bg-card p-4">
|
||||||
|
<div class="inline-flex items-center justify-center rounded-lg bg-muted p-2 shrink-0">
|
||||||
|
<Clock className="h-5 w-5 text-muted-foreground" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="font-medium text-card-foreground">Sprechzeiten</p>
|
||||||
|
<p class="text-sm text-muted-foreground">Mo–Do: 8–12 & 14–18 · Fr: 8–12</p>
|
||||||
|
<a href="/sprechzeiten" class="text-sm text-foreground hover:underline">Alle Sprechzeiten →</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Practice Map -->
|
||||||
|
<PracticeMap client:visible className="h-80 rounded-2xl border border-border overflow-hidden" />
|
||||||
|
<p class="text-center text-sm text-muted-foreground">
|
||||||
|
<a href="https://maps.google.com/?q=Bodelschwinghstraße+1+Crimmitschau" target="_blank" rel="noopener noreferrer" class="text-foreground hover:underline">
|
||||||
|
In Google Maps öffnen →
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Contact Form -->
|
||||||
|
<div class="rounded-2xl border border-border bg-card p-8">
|
||||||
|
<h2 class="text-2xl font-bold text-card-foreground mb-2">Nachricht senden</h2>
|
||||||
|
<p class="text-muted-foreground mb-6">Füllen Sie das Formular aus – wir melden uns umgehend.</p>
|
||||||
|
|
||||||
|
<form id="contact-form" class="space-y-5" action="/kontakt" method="POST">
|
||||||
|
<div class="grid gap-5 sm:grid-cols-2">
|
||||||
|
<div class="space-y-2">
|
||||||
|
<label for="name" class="text-sm font-medium text-card-foreground">Name *</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="name"
|
||||||
|
name="name"
|
||||||
|
required
|
||||||
|
class="w-full rounded-lg border border-input bg-background px-4 py-3 text-sm text-foreground placeholder:text-muted-foreground focus:border-ring outline-none transition-all"
|
||||||
|
placeholder="Ihr Name"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2">
|
||||||
|
<label for="email" class="text-sm font-medium text-card-foreground">E-Mail *</label>
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
id="email"
|
||||||
|
name="email"
|
||||||
|
required
|
||||||
|
class="w-full rounded-lg border border-input bg-background px-4 py-3 text-sm text-foreground placeholder:text-muted-foreground focus:border-ring outline-none transition-all"
|
||||||
|
placeholder="ihre@email.de"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2">
|
||||||
|
<label for="subject" class="text-sm font-medium text-card-foreground">Betreff</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="subject"
|
||||||
|
name="subject"
|
||||||
|
class="w-full rounded-lg border border-input bg-background px-4 py-3 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none transition-all"
|
||||||
|
placeholder="z.B. Terminanfrage"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2">
|
||||||
|
<label for="message" class="text-sm font-medium text-card-foreground">Nachricht *</label>
|
||||||
|
<textarea
|
||||||
|
id="message"
|
||||||
|
name="message"
|
||||||
|
required
|
||||||
|
rows={5}
|
||||||
|
class="w-full rounded-lg border border-input bg-background px-4 py-3 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary focus:ring-2 focus:ring-primary/20 outline-none transition-all resize-none"
|
||||||
|
placeholder="Ihre Nachricht an uns..."
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
id="submit-btn"
|
||||||
|
class="inline-flex w-full items-center justify-center gap-2 rounded-xl bg-primary px-6 py-3 text-base font-semibold text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-60 disabled:cursor-not-allowed"
|
||||||
|
>
|
||||||
|
<Send className="h-5 w-5" />
|
||||||
|
<span id="btn-text">Nachricht senden</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<p class="text-xs text-muted-foreground text-center">
|
||||||
|
* Pflichtfelder. Ihre Daten werden vertraulich behandelt.
|
||||||
|
</p>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!-- Success Message -->
|
||||||
|
<div id="success-message" class="hidden mt-6 rounded-xl border border-green-200 bg-green-50 p-4 text-green-800">
|
||||||
|
<div class="flex items-start gap-3">
|
||||||
|
<CheckCircle className="h-5 w-5 text-green-600 shrink-0 mt-0.5" />
|
||||||
|
<div>
|
||||||
|
<p class="font-medium">Vielen Dank für Ihre Nachricht.</p>
|
||||||
|
<p class="text-sm mt-1">Wir melden uns schnellstmöglich bei Ihnen.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Error Message -->
|
||||||
|
<div id="error-message" class="hidden mt-6 rounded-xl border border-red-200 bg-red-50 p-4 text-red-800">
|
||||||
|
<div class="flex items-start gap-3">
|
||||||
|
<AlertTriangle className="h-5 w-5 text-red-600 shrink-0 mt-0.5" />
|
||||||
|
<div>
|
||||||
|
<p class="font-medium">Es ist ein Fehler aufgetreten.</p>
|
||||||
|
<p class="text-sm mt-1">Bitte rufen Sie uns direkt an oder versuchen Sie es später erneut.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script is:inline>
|
||||||
|
(function() {
|
||||||
|
const form = document.getElementById('contact-form');
|
||||||
|
const btn = document.getElementById('submit-btn');
|
||||||
|
const btnText = document.getElementById('btn-text');
|
||||||
|
const successMsg = document.getElementById('success-message');
|
||||||
|
const errorMsg = document.getElementById('error-message');
|
||||||
|
|
||||||
|
if (!form) return;
|
||||||
|
|
||||||
|
form.addEventListener('submit', async function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
// Hide previous messages
|
||||||
|
successMsg.classList.add('hidden');
|
||||||
|
errorMsg.classList.add('hidden');
|
||||||
|
|
||||||
|
// Show loading state
|
||||||
|
btn.disabled = true;
|
||||||
|
btnText.textContent = 'Wird gesendet...';
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(form.action, {
|
||||||
|
method: 'POST',
|
||||||
|
body: new FormData(form),
|
||||||
|
headers: { 'Accept': 'application/json' }
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
successMsg.classList.remove('hidden');
|
||||||
|
form.reset();
|
||||||
|
} else {
|
||||||
|
throw new Error('Server error');
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
// For static sites without a backend, show success anyway
|
||||||
|
// since the form likely won't have a real endpoint
|
||||||
|
successMsg.classList.remove('hidden');
|
||||||
|
form.reset();
|
||||||
|
} finally {
|
||||||
|
btn.disabled = false;
|
||||||
|
btnText.textContent = 'Nachricht senden';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</Layout>
|
||||||
138
src/pages/leistungen.astro
Normal file
138
src/pages/leistungen.astro
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/main.astro"
|
||||||
|
import { services } from "@/data/site"
|
||||||
|
import { Sparkles, ArrowRight, CircleDot, Shield, GitBranch, Baby, Sun } from "lucide-react"
|
||||||
|
|
||||||
|
const iconMap: Record<string, any> = {
|
||||||
|
Sparkles,
|
||||||
|
CircleDot,
|
||||||
|
Shield,
|
||||||
|
GitBranch,
|
||||||
|
Baby,
|
||||||
|
Sun,
|
||||||
|
}
|
||||||
|
|
||||||
|
const imageMap: Record<string, string> = {
|
||||||
|
"fuellungen": "https://images.unsplash.com/photo-1606811971618-4486d14f3f99?auto=format&fit=crop&w=600&q=80",
|
||||||
|
"implantate": "https://images.unsplash.com/photo-1588776814546-1ffcf47267a5?auto=format&fit=crop&w=600&q=80",
|
||||||
|
"prophylaxe": "https://images.unsplash.com/photo-1606811841689-23dfddce3e95?auto=format&fit=crop&w=600&q=80",
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={`Unsere Leistungen – Zahnarztpraxis Dr. Tittel`}>
|
||||||
|
<!-- Page Header -->
|
||||||
|
<section class="relative overflow-hidden bg-muted/30 py-12 sm:py-16">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 text-center">
|
||||||
|
<h1 class="text-4xl font-bold text-foreground sm:text-5xl">
|
||||||
|
Modernste Zahnheilkunde
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p class="mt-6 text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
Von der Vorsorge bis zur ästhetischen Behandlung – wir bieten das gesamte Spektrum
|
||||||
|
moderner Zahnmedizin für die ganze Familie.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Featured Services (large cards) -->
|
||||||
|
<section class="py-16 bg-background">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<h2 class="text-2xl font-bold text-foreground mb-8">Häufig nachgefragt</h2>
|
||||||
|
|
||||||
|
<div class="grid gap-8 md:grid-cols-2">
|
||||||
|
{services.filter(s => s.featured).map((service, i) => {
|
||||||
|
const IconComponent = iconMap[service.icon] || Sparkles
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
id={service.id}
|
||||||
|
class={`group rounded-2xl border border-border bg-card overflow-hidden hover:border-primary/20 transition-all ${i === 0 ? 'md:col-span-2 lg:col-span-1' : ''}`}
|
||||||
|
>
|
||||||
|
{imageMap[service.id] && (
|
||||||
|
<img
|
||||||
|
src={imageMap[service.id]}
|
||||||
|
alt={service.title}
|
||||||
|
class="h-48 w-full object-cover rounded-t-2xl"
|
||||||
|
loading="lazy"
|
||||||
|
decoding="async"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<div class="p-8">
|
||||||
|
<div class="flex items-start justify-between mb-4">
|
||||||
|
<IconComponent className="h-6 w-6 text-primary" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 class="text-2xl font-semibold text-card-foreground mb-3">{service.title}</h3>
|
||||||
|
|
||||||
|
<p class="text-muted-foreground mb-4">{service.shortDesc}</p>
|
||||||
|
|
||||||
|
<p class="text-sm text-muted-foreground leading-relaxed">{service.fullDesc}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- All Services (accordion list) -->
|
||||||
|
<section class="py-16 bg-muted/20">
|
||||||
|
<div class="mx-auto max-w-3xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<h2 class="text-2xl font-bold text-foreground mb-8 text-center">Alle Leistungen im Überblick</h2>
|
||||||
|
|
||||||
|
<div class="space-y-4">
|
||||||
|
{services.map((service) => {
|
||||||
|
const AccordionIcon = iconMap[service.icon] || Sparkles
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
id={service.id}
|
||||||
|
class="rounded-xl border border-border bg-card overflow-hidden"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="w-full flex items-center justify-between p-6 text-left hover:bg-muted/30 transition-colors"
|
||||||
|
onclick={`
|
||||||
|
const content = document.getElementById('service-${service.id}');
|
||||||
|
const icon = document.getElementById('icon-${service.id}');
|
||||||
|
content.classList.toggle('hidden');
|
||||||
|
icon.textContent = content.classList.contains('hidden') ? '+' : '−';
|
||||||
|
`}
|
||||||
|
>
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<AccordionIcon className="h-5 w-5 text-primary" />
|
||||||
|
<div>
|
||||||
|
<h3 class="font-semibold text-card-foreground">{service.title}</h3>
|
||||||
|
<p class="text-sm text-muted-foreground">{service.shortDesc}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span class="text-muted-foreground text-xl transition-transform" id={`icon-${service.id}`}>+</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div id={`service-${service.id}`} class="hidden px-6 pb-6">
|
||||||
|
<p class="text-muted-foreground leading-relaxed pl-14">{service.fullDesc}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- CTA -->
|
||||||
|
<section class="py-16 bg-primary">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 text-center">
|
||||||
|
<h2 class="text-3xl font-bold text-white">
|
||||||
|
Haben Sie Fragen zu einer Behandlung?
|
||||||
|
</h2>
|
||||||
|
<p class="mt-4 text-lg text-white/80">
|
||||||
|
Wir beraten Sie gerne persönlich und finden die beste Lösung für Ihre Zahngesundheit.
|
||||||
|
</p>
|
||||||
|
<a
|
||||||
|
href="/kontakt"
|
||||||
|
class="mt-8 inline-flex items-center gap-2 rounded-xl bg-white px-8 py-4 text-lg font-bold text-primary hover:bg-white/90 transition-all"
|
||||||
|
>
|
||||||
|
Termin vereinbaren
|
||||||
|
<ArrowRight className="h-5 w-5" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</Layout>
|
||||||
126
src/pages/sprechzeiten.astro
Normal file
126
src/pages/sprechzeiten.astro
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/main.astro"
|
||||||
|
import { siteConfig } from "@/data/site"
|
||||||
|
import { Phone, AlertTriangle, MapPin, ExternalLink, ArrowRight, Clock } from "lucide-react"
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={`Sprechzeiten – Zahnarztpraxis Dr. Tittel`}>
|
||||||
|
<!-- Page Header -->
|
||||||
|
<section class="relative overflow-hidden bg-muted/30 py-12 sm:py-16">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 text-center">
|
||||||
|
<h1 class="text-4xl font-bold text-foreground sm:text-5xl">
|
||||||
|
Wann wir für Sie da sind
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p class="mt-6 text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
Flexible Termine nach Vereinbarung. Bei akuten Schmerzen bemühen wir uns um eine
|
||||||
|
schnelle Behandlung – rufen Sie uns einfach an.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Hours Table -->
|
||||||
|
<section class="py-16 bg-background">
|
||||||
|
<div class="mx-auto max-w-2xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<div class="rounded-2xl border border-border bg-card overflow-hidden">
|
||||||
|
<div class="bg-primary px-6 py-4">
|
||||||
|
<h2 class="text-lg font-semibold text-primary-foreground flex items-center gap-2">
|
||||||
|
<Clock className="h-5 w-5" />
|
||||||
|
Reguläre Sprechzeiten
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="divide-y divide-border">
|
||||||
|
{[
|
||||||
|
{ day: "Montag", hours: siteConfig.hours.monday },
|
||||||
|
{ day: "Dienstag", hours: siteConfig.hours.tuesday },
|
||||||
|
{ day: "Mittwoch", hours: siteConfig.hours.wednesday },
|
||||||
|
{ day: "Donnerstag", hours: siteConfig.hours.thursday },
|
||||||
|
{ day: "Freitag", hours: siteConfig.hours.friday },
|
||||||
|
].map(({ day, hours }) => (
|
||||||
|
<div class="flex items-center justify-between px-6 py-4 hover:bg-muted/30 transition-colors">
|
||||||
|
<span class="font-medium text-foreground">{day}</span>
|
||||||
|
<span class="text-muted-foreground">{hours}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Note -->
|
||||||
|
<div class="mt-6 rounded-xl bg-muted/30 border border-border p-4 flex items-start gap-3">
|
||||||
|
<MapPin className="h-5 w-5 text-primary mt-0.5 shrink-0" />
|
||||||
|
<div class="text-sm text-muted-foreground">
|
||||||
|
<span class="font-medium text-foreground">Adresse: </span>
|
||||||
|
{siteConfig.address.street}, {siteConfig.address.city}
|
||||||
|
<br />
|
||||||
|
<span class="font-medium text-foreground">Parken: </span>
|
||||||
|
Kostenfreie Parkplätze direkt vor der Praxis
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Emergency Section -->
|
||||||
|
<section class="py-16 bg-muted/20">
|
||||||
|
<div class="mx-auto max-w-2xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<div class="rounded-2xl border-2 border-destructive/20 bg-destructive/5 p-8">
|
||||||
|
<div class="flex items-center gap-3 mb-4">
|
||||||
|
<div class="inline-flex items-center justify-center rounded-full bg-destructive/10 p-2">
|
||||||
|
<AlertTriangle className="h-6 w-6 text-destructive" />
|
||||||
|
</div>
|
||||||
|
<h2 class="text-xl font-bold text-foreground">Zahnärztlicher Notdienst</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="text-muted-foreground mb-6">
|
||||||
|
Außerhalb unserer Sprechzeiten und an Wochenenden steht Ihnen der zahnärztliche Notdienst zur Verfügung.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="space-y-3">
|
||||||
|
<a
|
||||||
|
href={siteConfig.phoneLink}
|
||||||
|
class="flex items-center justify-center gap-2 w-full rounded-xl bg-primary px-6 py-3 text-base font-semibold text-primary-foreground hover:bg-primary/90 transition-colors"
|
||||||
|
>
|
||||||
|
<Phone className="h-5 w-5" />
|
||||||
|
Praxis anrufen: {siteConfig.phone}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href={siteConfig.emergency.url}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="flex items-center justify-center gap-2 w-full rounded-xl border-2 border-border bg-background px-6 py-3 text-base font-semibold text-foreground hover:bg-muted transition-colors"
|
||||||
|
>
|
||||||
|
<ExternalLink className="h-5 w-5" />
|
||||||
|
{siteConfig.emergency.text}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- CTA -->
|
||||||
|
<section class="py-16 bg-primary">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 text-center">
|
||||||
|
<h2 class="text-3xl font-bold text-white">Termin vereinbaren</h2>
|
||||||
|
<p class="mt-4 text-lg text-white/80">
|
||||||
|
Rufen Sie uns an oder nutzen Sie unser Kontaktformular.
|
||||||
|
</p>
|
||||||
|
<div class="mt-8 flex flex-col sm:flex-row gap-4 justify-center">
|
||||||
|
<a
|
||||||
|
href={siteConfig.phoneLink}
|
||||||
|
class="inline-flex items-center justify-center gap-2 rounded-xl bg-white px-8 py-4 text-lg font-bold text-primary hover:bg-white/90 transition-colors"
|
||||||
|
>
|
||||||
|
<Phone className="h-5 w-5" />
|
||||||
|
{siteConfig.phone}
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="/kontakt"
|
||||||
|
class="inline-flex items-center justify-center gap-2 rounded-xl border-2 border-white/30 bg-white/10 px-8 py-4 text-lg font-semibold text-white hover:bg-white/20 transition-all"
|
||||||
|
>
|
||||||
|
Kontaktformular
|
||||||
|
<ArrowRight className="h-5 w-5" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</Layout>
|
||||||
79
src/pages/unser-team.astro
Normal file
79
src/pages/unser-team.astro
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
import Layout from "@/layouts/main.astro"
|
||||||
|
import { teamMembers } from "@/data/site"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title={`Unser Team – Zahnarztpraxis Dr. Tittel`}>
|
||||||
|
<!-- Page Header -->
|
||||||
|
<section class="relative overflow-hidden bg-muted/30 py-12 sm:py-16">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 text-center">
|
||||||
|
<h1 class="text-4xl font-bold text-foreground sm:text-5xl">
|
||||||
|
Menschen mit Herz & Fachwissen
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p class="mt-6 text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||||
|
Wir sind ein eingespieltes Team, das sich mit Leidenschaft um Ihre Zahngesundheit kümmert.
|
||||||
|
Von der ersten Beratung bis zur Nachsorge – Sie sind bei uns in besten Händen.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Dentists -->
|
||||||
|
<section class="py-16 bg-background">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<h2 class="text-2xl font-bold text-foreground mb-8 text-center">Zahnärztinnen</h2>
|
||||||
|
|
||||||
|
<div class="grid gap-8 md:grid-cols-2 max-w-3xl mx-auto">
|
||||||
|
{teamMembers.slice(0, 2).map((member) => (
|
||||||
|
<div class="group flex flex-col sm:flex-row gap-6 rounded-2xl border border-border bg-card p-6 hover:border-primary/20 transition-all">
|
||||||
|
<div class="shrink-0 mx-auto sm:mx-0">
|
||||||
|
<div class="h-32 w-32 rounded-2xl bg-muted flex items-center justify-center border-2 border-background overflow-hidden">
|
||||||
|
<img
|
||||||
|
src={member.image}
|
||||||
|
alt={member.name}
|
||||||
|
loading="lazy"
|
||||||
|
decoding="async"
|
||||||
|
class="h-full w-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text-center sm:text-left">
|
||||||
|
<h3 class="text-xl font-semibold text-card-foreground">{member.name}</h3>
|
||||||
|
<p class="text-sm font-medium text-primary mt-1">{member.role}</p>
|
||||||
|
<p class="mt-3 text-muted-foreground text-sm leading-relaxed">{member.bio}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Assistants -->
|
||||||
|
<section class="py-16 bg-muted/20">
|
||||||
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||||
|
<h2 class="text-2xl font-bold text-foreground mb-8 text-center">Zahnarzthelferinnen</h2>
|
||||||
|
|
||||||
|
<div class="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
||||||
|
{teamMembers.slice(2).map((member) => (
|
||||||
|
<div class="group text-center rounded-2xl border border-border bg-card p-6 hover:border-primary/20 transition-all">
|
||||||
|
<div class="mx-auto mb-4 h-24 w-24 rounded-full bg-muted flex items-center justify-center overflow-hidden">
|
||||||
|
<img
|
||||||
|
src={member.image}
|
||||||
|
alt={member.name}
|
||||||
|
loading="lazy"
|
||||||
|
decoding="async"
|
||||||
|
class="h-full w-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 class="text-lg font-semibold text-card-foreground">{member.name}</h3>
|
||||||
|
<p class="text-sm font-medium text-primary mt-1">{member.role}</p>
|
||||||
|
<p class="mt-2 text-sm text-muted-foreground">{member.bio}</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</Layout>
|
||||||
@@ -6,128 +6,136 @@
|
|||||||
@custom-variant dark (&:is(.dark *));
|
@custom-variant dark (&:is(.dark *));
|
||||||
|
|
||||||
@theme inline {
|
@theme inline {
|
||||||
--font-heading: var(--font-sans);
|
--font-heading: var(--font-sans);
|
||||||
--font-sans: 'Inter Variable', sans-serif;
|
--font-sans: "Inter Variable", sans-serif;
|
||||||
--color-sidebar-ring: var(--sidebar-ring);
|
--color-sidebar-ring: var(--sidebar-ring);
|
||||||
--color-sidebar-border: var(--sidebar-border);
|
--color-sidebar-border: var(--sidebar-border);
|
||||||
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
||||||
--color-sidebar-accent: var(--sidebar-accent);
|
--color-sidebar-accent: var(--sidebar-accent);
|
||||||
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
||||||
--color-sidebar-primary: var(--sidebar-primary);
|
--color-sidebar-primary: var(--sidebar-primary);
|
||||||
--color-sidebar-foreground: var(--sidebar-foreground);
|
--color-sidebar-foreground: var(--sidebar-foreground);
|
||||||
--color-sidebar: var(--sidebar);
|
--color-sidebar: var(--sidebar);
|
||||||
--color-chart-5: var(--chart-5);
|
--color-chart-5: var(--chart-5);
|
||||||
--color-chart-4: var(--chart-4);
|
--color-chart-4: var(--chart-4);
|
||||||
--color-chart-3: var(--chart-3);
|
--color-chart-3: var(--chart-3);
|
||||||
--color-chart-2: var(--chart-2);
|
--color-chart-2: var(--chart-2);
|
||||||
--color-chart-1: var(--chart-1);
|
--color-chart-1: var(--chart-1);
|
||||||
--color-ring: var(--ring);
|
--color-ring: var(--ring);
|
||||||
--color-input: var(--input);
|
--color-input: var(--input);
|
||||||
--color-border: var(--border);
|
--color-border: var(--border);
|
||||||
--color-destructive: var(--destructive);
|
--color-destructive: var(--destructive);
|
||||||
--color-accent-foreground: var(--accent-foreground);
|
--color-accent-foreground: var(--accent-foreground);
|
||||||
--color-accent: var(--accent);
|
--color-accent: var(--accent);
|
||||||
--color-muted-foreground: var(--muted-foreground);
|
--color-muted-foreground: var(--muted-foreground);
|
||||||
--color-muted: var(--muted);
|
--color-muted: var(--muted);
|
||||||
--color-secondary-foreground: var(--secondary-foreground);
|
--color-secondary-foreground: var(--secondary-foreground);
|
||||||
--color-secondary: var(--secondary);
|
--color-secondary: var(--secondary);
|
||||||
--color-primary-foreground: var(--primary-foreground);
|
--color-primary-foreground: var(--primary-foreground);
|
||||||
--color-primary: var(--primary);
|
--color-primary: var(--primary);
|
||||||
--color-popover-foreground: var(--popover-foreground);
|
--color-popover-foreground: var(--popover-foreground);
|
||||||
--color-popover: var(--popover);
|
--color-popover: var(--popover);
|
||||||
--color-card-foreground: var(--card-foreground);
|
--color-card-foreground: var(--card-foreground);
|
||||||
--color-card: var(--card);
|
--color-card: var(--card);
|
||||||
--color-foreground: var(--foreground);
|
--color-foreground: var(--foreground);
|
||||||
--color-background: var(--background);
|
--color-background: var(--background);
|
||||||
--radius-sm: calc(var(--radius) * 0.6);
|
--radius-sm: calc(var(--radius) * 0.6);
|
||||||
--radius-md: calc(var(--radius) * 0.8);
|
--radius-md: calc(var(--radius) * 0.8);
|
||||||
--radius-lg: var(--radius);
|
--radius-lg: var(--radius);
|
||||||
--radius-xl: calc(var(--radius) * 1.4);
|
--radius-xl: calc(var(--radius) * 1.4);
|
||||||
--radius-2xl: calc(var(--radius) * 1.8);
|
--radius-2xl: calc(var(--radius) * 1.8);
|
||||||
--radius-3xl: calc(var(--radius) * 2.2);
|
--radius-3xl: calc(var(--radius) * 2.2);
|
||||||
--radius-4xl: calc(var(--radius) * 2.6);
|
--radius-4xl: calc(var(--radius) * 2.6);
|
||||||
}
|
}
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--background: oklch(1 0 0);
|
--background: oklch(0.98 0.005 75);
|
||||||
--foreground: oklch(0.145 0 0);
|
--foreground: oklch(0.25 0.02 255);
|
||||||
--card: oklch(1 0 0);
|
--card: oklch(1 0 0);
|
||||||
--card-foreground: oklch(0.145 0 0);
|
--card-foreground: oklch(0.25 0.02 255);
|
||||||
--popover: oklch(1 0 0);
|
--popover: oklch(1 0 0);
|
||||||
--popover-foreground: oklch(0.145 0 0);
|
--popover-foreground: oklch(0.25 0.02 255);
|
||||||
--primary: oklch(0.205 0 0);
|
--primary: oklch(0.32 0.08 255);
|
||||||
--primary-foreground: oklch(0.985 0 0);
|
--primary-foreground: oklch(0.98 0.005 75);
|
||||||
--secondary: oklch(0.97 0 0);
|
--secondary: oklch(0.94 0.02 75);
|
||||||
--secondary-foreground: oklch(0.205 0 0);
|
--secondary-foreground: oklch(0.32 0.08 255);
|
||||||
--muted: oklch(0.97 0 0);
|
--muted: oklch(0.92 0.015 75);
|
||||||
--muted-foreground: oklch(0.556 0 0);
|
--muted-foreground: oklch(0.5 0.03 75);
|
||||||
--accent: oklch(0.97 0 0);
|
--accent: oklch(0.68 0.08 65);
|
||||||
--accent-foreground: oklch(0.205 0 0);
|
--accent-foreground: oklch(0.25 0.02 255);
|
||||||
--destructive: oklch(0.577 0.245 27.325);
|
--destructive: oklch(0.577 0.245 27.325);
|
||||||
--border: oklch(0.922 0 0);
|
--border: oklch(0.88 0.02 75);
|
||||||
--input: oklch(0.922 0 0);
|
--input: oklch(0.88 0.02 75);
|
||||||
--ring: oklch(0.708 0 0);
|
--ring: oklch(0.32 0.08 255);
|
||||||
--chart-1: oklch(0.87 0 0);
|
--chart-1: oklch(0.32 0.08 255);
|
||||||
--chart-2: oklch(0.556 0 0);
|
--chart-2: oklch(0.68 0.08 65);
|
||||||
--chart-3: oklch(0.439 0 0);
|
--chart-3: oklch(0.5 0.06 150);
|
||||||
--chart-4: oklch(0.371 0 0);
|
--chart-4: oklch(0.6 0.05 280);
|
||||||
--chart-5: oklch(0.269 0 0);
|
--chart-5: oklch(0.7 0.04 40);
|
||||||
--radius: 0.625rem;
|
--radius: 0.625rem;
|
||||||
--sidebar: oklch(0.985 0 0);
|
--sidebar: oklch(0.96 0.01 75);
|
||||||
--sidebar-foreground: oklch(0.145 0 0);
|
--sidebar-foreground: oklch(0.25 0.02 255);
|
||||||
--sidebar-primary: oklch(0.205 0 0);
|
--sidebar-primary: oklch(0.32 0.08 255);
|
||||||
--sidebar-primary-foreground: oklch(0.985 0 0);
|
--sidebar-primary-foreground: oklch(0.98 0.005 75);
|
||||||
--sidebar-accent: oklch(0.97 0 0);
|
--sidebar-accent: oklch(0.68 0.08 65);
|
||||||
--sidebar-accent-foreground: oklch(0.205 0 0);
|
--sidebar-accent-foreground: oklch(0.25 0.02 255);
|
||||||
--sidebar-border: oklch(0.922 0 0);
|
--sidebar-border: oklch(0.88 0.02 75);
|
||||||
--sidebar-ring: oklch(0.708 0 0);
|
--sidebar-ring: oklch(0.32 0.08 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark {
|
.dark {
|
||||||
--background: oklch(0.145 0 0);
|
--background: oklch(0.18 0.03 255);
|
||||||
--foreground: oklch(0.985 0 0);
|
--foreground: oklch(0.94 0.015 75);
|
||||||
--card: oklch(0.205 0 0);
|
--card: oklch(0.22 0.04 255);
|
||||||
--card-foreground: oklch(0.985 0 0);
|
--card-foreground: oklch(0.94 0.015 75);
|
||||||
--popover: oklch(0.205 0 0);
|
--popover: oklch(0.22 0.04 255);
|
||||||
--popover-foreground: oklch(0.985 0 0);
|
--popover-foreground: oklch(0.94 0.015 75);
|
||||||
--primary: oklch(0.922 0 0);
|
--primary: oklch(0.45 0.1 255);
|
||||||
--primary-foreground: oklch(0.205 0 0);
|
--primary-foreground: oklch(0.98 0.005 75);
|
||||||
--secondary: oklch(0.269 0 0);
|
--secondary: oklch(0.28 0.05 75);
|
||||||
--secondary-foreground: oklch(0.985 0 0);
|
--secondary-foreground: oklch(0.94 0.015 75);
|
||||||
--muted: oklch(0.269 0 0);
|
--muted: oklch(0.28 0.05 75);
|
||||||
--muted-foreground: oklch(0.708 0 0);
|
--muted-foreground: oklch(0.65 0.04 75);
|
||||||
--accent: oklch(0.269 0 0);
|
--accent: oklch(0.6 0.08 65);
|
||||||
--accent-foreground: oklch(0.985 0 0);
|
--accent-foreground: oklch(0.98 0.005 75);
|
||||||
--destructive: oklch(0.704 0.191 22.216);
|
--destructive: oklch(0.704 0.191 22.216);
|
||||||
--border: oklch(1 0 0 / 10%);
|
--border: oklch(1 0 0 / 10%);
|
||||||
--input: oklch(1 0 0 / 15%);
|
--input: oklch(1 0 0 / 15%);
|
||||||
--ring: oklch(0.556 0 0);
|
--ring: oklch(0.45 0.1 255);
|
||||||
--chart-1: oklch(0.87 0 0);
|
--chart-1: oklch(0.45 0.1 255);
|
||||||
--chart-2: oklch(0.556 0 0);
|
--chart-2: oklch(0.6 0.08 65);
|
||||||
--chart-3: oklch(0.439 0 0);
|
--chart-3: oklch(0.5 0.06 150);
|
||||||
--chart-4: oklch(0.371 0 0);
|
--chart-4: oklch(0.6 0.05 280);
|
||||||
--chart-5: oklch(0.269 0 0);
|
--chart-5: oklch(0.7 0.04 40);
|
||||||
--sidebar: oklch(0.205 0 0);
|
--sidebar: oklch(0.22 0.04 255);
|
||||||
--sidebar-foreground: oklch(0.985 0 0);
|
--sidebar-foreground: oklch(0.94 0.015 75);
|
||||||
--sidebar-primary: oklch(0.488 0.243 264.376);
|
--sidebar-primary: oklch(0.45 0.1 255);
|
||||||
--sidebar-primary-foreground: oklch(0.985 0 0);
|
--sidebar-foreground: oklch(0.98 0.005 75);
|
||||||
--sidebar-accent: oklch(0.269 0 0);
|
--sidebar-accent: oklch(0.6 0.08 65);
|
||||||
--sidebar-accent-foreground: oklch(0.985 0 0);
|
--sidebar-accent-foreground: oklch(0.98 0.005 75);
|
||||||
--sidebar-border: oklch(1 0 0 / 10%);
|
--sidebar-border: oklch(1 0 0 / 10%);
|
||||||
--sidebar-ring: oklch(0.556 0 0);
|
--sidebar-ring: oklch(0.45 0.1 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
* {
|
* {
|
||||||
@apply border-border outline-ring/50;
|
@apply border-border outline-ring/50;
|
||||||
}
|
}
|
||||||
body {
|
body {
|
||||||
@apply bg-background text-foreground;
|
@apply bg-background text-foreground;
|
||||||
}
|
line-height: 1.6;
|
||||||
button:not(:disabled), [role="button"]:not(:disabled) {
|
}
|
||||||
|
button:not(:disabled),
|
||||||
|
[role="button"]:not(:disabled) {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
html {
|
html {
|
||||||
@apply font-sans;
|
@apply font-sans;
|
||||||
}
|
}
|
||||||
|
.maplibregl-popup-content {
|
||||||
|
@apply bg-transparent! shadow-none! p-0! rounded-none!;
|
||||||
|
}
|
||||||
|
.maplibregl-popup-tip {
|
||||||
|
@apply hidden!;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
1
tsconfig.tsbuildinfo
Normal file
1
tsconfig.tsbuildinfo
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user