From 7a57ae3338e5e37fd12a6e0dc13461293384bffd Mon Sep 17 00:00:00 2001 From: Stefan Probst Date: Fri, 24 May 2024 14:02:18 +0200 Subject: [PATCH] feat: add website [wip] --- .devcontainer/devcontainer.json | 19 + .dockerignore | 63 + .editorconfig | 13 + .env.local.example | 46 + .gitattributes | 1 + .github/workflows/build-deploy.yml | 131 + .github/workflows/validate.yml | 102 + .gitignore | 35 + .npmrc | 4 + .vscode/extensions.json | 13 + .vscode/launch.json | 24 + .vscode/settings.json | 54 + Dockerfile | 73 + Dockerfile.static | 53 + astro.config.ts | 89 + content/index-page/index.json | 87 + content/metadata.json | 5 + content/navigation.json | 304 + content/pages/anton-bruckner-2024.mdx | 68 + content/pages/audio/beispiele.mdx | 20 + content/pages/audio/symphonien.mdx | 7 + content/pages/drucke/alte-gesamtausgabe.mdx | 13 + .../pages/drucke/erstdrucke-digitalisate.mdx | 6 + content/pages/drucke/erstdrucke.mdx | 11 + content/pages/drucke/gesamtausgabe.mdx | 74 + .../pages/forschung/bruckner-gesellschaft.mdx | 41 + .../pages/forschung/chronologie-datenbank.mdx | 5 + .../geschichte-dom-musikarchiv-linz.mdx | 30 + content/pages/forschung/international.mdx | 7 + .../kitzler-studienbuch-codierung.mdx | 21 + .../kitzler-studienbuch-imageviewer.mdx | 25 + .../kitzler-studienbuch-musikanalyse.mdx | 19 + ...itzler-studienbuch-projektbeschreibung.mdx | 34 + .../pages/forschung/kitzler-studienbuch.mdx | 24 + content/pages/forschung/kopisten.mdx | 7 + content/pages/forschung/links.mdx | 14 + .../pages/forschung/transkriptionstool.mdx | 8 + content/pages/leben/bibliographie.mdx | 5 + content/pages/leben/kindheit-und-jugend.mdx | 120 + content/pages/leben/linz.mdx | 201 + content/pages/leben/st-florian.mdx | 166 + content/pages/leben/wien-i.mdx | 173 + content/pages/leben/wien-ii.mdx | 219 + content/pages/leben/wien-iii.mdx | 143 + content/pages/lexikon/abkuerzungen.mdx | 102 + content/pages/lexikon/artikel.mdx | 4 + content/pages/lexikon/autorinnen.mdx | 4 + content/pages/lexikon/home.mdx | 4 + content/pages/lexikon/literatur.mdx | 4 + content/pages/lexikon/orte.mdx | 4 + content/pages/lexikon/personen.mdx | 4 + content/pages/lexikon/projekt.mdx | 44 + content/pages/lexikon/sachbegriffe.mdx | 4 + content/pages/lexikon/suche.mdx | 4 + content/pages/lexikon/werke.mdx | 4 + .../pages/projekt/bruckner-forschung-oeaw.mdx | 13 + content/pages/projekt/mitarbeiter.mdx | 33 + content/pages/projekt/projektbeschreibung.mdx | 25 + .../pages/werkverzeichnis/abkuerzungen.mdx | 58 + .../werkverzeichnis/aufbewahrungsorte.mdx | 4 + .../gedrucktes-werkverzeichnis.mdx | 21 + content/pages/werkverzeichnis/vorwort.mdx | 15 + .../pages/werkverzeichnis/wab-konkordanz.mdx | 42 + content/pages/werkverzeichnis/wab.mdx | 6 + .../werkeintraege-quellenbeschreibungen.mdx | 60 + .../pages/werkverzeichnis/werksystematik.mdx | 83 + .../pages/werkverzeichnis/werkuebersicht.mdx | 221 + e2e/lib/fixtures/a11y.ts | 24 + e2e/lib/fixtures/i18n.ts | 46 + e2e/lib/fixtures/imprint-page.ts | 28 + e2e/lib/fixtures/index-page.ts | 28 + e2e/lib/test.ts | 50 + ...-have-visible-changes-1-chromium-linux.png | Bin 0 -> 90597 bytes e2e/tests/app/analytics.test.ts | 26 + e2e/tests/app/app.test.ts | 124 + e2e/tests/app/metadata.test.ts | 117 + e2e/tests/global.setup.ts | 14 + e2e/tests/pages/imprint.test.ts | 37 + e2e/tests/pages/index.test.ts | 23 + keystatic.config.tsx | 415 + license | 18 + package.json | 178 + playwright.config.ts | 76 + pnpm-lock.yaml | 12288 ++++++++++++++++ prettier.config.js | 18 + public/android-chrome-192x192.png | Bin 0 -> 6969 bytes public/android-chrome-512x512.png | Bin 0 -> 21004 bytes public/apple-icon.png | Bin 0 -> 5868 bytes .../index-page/hero/slides/0/image.jpg | Bin 0 -> 118314 bytes .../index-page/hero/slides/1/image.jpg | Bin 0 -> 149041 bytes .../index-page/hero/slides/2/image.jpg | Bin 0 -> 199106 bytes .../index-page/hero/slides/3/image.jpg | Bin 0 -> 154961 bytes .../index-page/hero/slides/4/image.jpg | Bin 0 -> 132114 bytes .../index-page/hero/slides/5/image.jpg | Bin 0 -> 155360 bytes .../index-page/hero/slides/6/image.jpg | Bin 0 -> 1029060 bytes .../index-page/hero/slides/7/image.jpg | Bin 0 -> 244353 bytes .../index-page/hero/slides/8/image.jpg | Bin 0 -> 149041 bytes .../content/pages/audio/symphonien/image.jpg | Bin 0 -> 70480 bytes .../pages/drucke/alte-gesamtausgabe/image.jpg | Bin 0 -> 117886 bytes .../drucke/erstdrucke-digitalisate/image.jpg | Bin 0 -> 148828 bytes .../content/pages/drucke/erstdrucke/image.jpg | Bin 0 -> 148828 bytes .../pages/drucke/gesamtausgabe/image.jpg | Bin 0 -> 159089 bytes .../pages/forschung/international/image.jpg | Bin 0 -> 118314 bytes .../kitzler-studienbuch-codierung/image.jpg | Bin 0 -> 1029060 bytes .../kitzler-studienbuch-imageviewer/image.jpg | Bin 0 -> 1029060 bytes .../image.jpg | Bin 0 -> 1029060 bytes .../image.jpg | Bin 0 -> 1029060 bytes .../forschung/kitzler-studienbuch/image.jpg | Bin 0 -> 1029060 bytes .../pages/forschung/kopisten/image.png | Bin 0 -> 89604 bytes .../content/pages/forschung/links/image.jpg | Bin 0 -> 149041 bytes .../pages/leben/bibliographie/image.jpg | Bin 0 -> 260428 bytes .../pages/leben/kindheit-und-jugend/image.jpg | Bin 0 -> 203715 bytes .../assets/content/pages/leben/linz/image.jpg | Bin 0 -> 161249 bytes .../content/pages/leben/st-florian/image.jpg | Bin 0 -> 113502 bytes .../content/pages/leben/wien-i/image.jpg | Bin 0 -> 155360 bytes .../content/pages/leben/wien-ii/image.jpg | Bin 0 -> 124699 bytes .../content/pages/leben/wien-iii/image.jpg | Bin 0 -> 119328 bytes .../pages/lexikon/abkuerzungen/image.jpg | Bin 0 -> 191542 bytes .../content/pages/lexikon/artikel/image.jpg | Bin 0 -> 191542 bytes .../pages/lexikon/autorinnen/image.jpg | Bin 0 -> 191542 bytes .../content/pages/lexikon/home/image.jpg | Bin 0 -> 191542 bytes .../content/pages/lexikon/literatur/image.jpg | Bin 0 -> 191542 bytes .../content/pages/lexikon/orte/image.jpg | Bin 0 -> 191542 bytes .../content/pages/lexikon/personen/image.jpg | Bin 0 -> 191542 bytes .../content/pages/lexikon/projekt/image.jpg | Bin 0 -> 191542 bytes .../pages/lexikon/sachbegriffe/image.jpg | Bin 0 -> 191542 bytes .../content/pages/lexikon/suche/image.jpg | Bin 0 -> 191542 bytes .../content/pages/lexikon/werke/image.jpg | Bin 0 -> 191542 bytes .../projekt/bruckner-forschung-oeaw/image.jpg | Bin 0 -> 118314 bytes .../pages/projekt/mitarbeiter/image.jpg | Bin 0 -> 118314 bytes .../projekt/projektbeschreibung/image.jpg | Bin 0 -> 118314 bytes .../gedrucktes-werkverzeichnis/image.png | Bin 0 -> 572361 bytes .../pages/werkverzeichnis/vorwort/image.jpg | Bin 0 -> 154961 bytes public/assets/images/acdh-ch-logo-dark.svg | 1 + public/assets/images/acdh-ch-logo-light.svg | 1 + public/assets/images/bruckner-online-logo.png | Bin 0 -> 11923 bytes public/assets/images/footer.png | Bin 0 -> 113325 bytes public/assets/images/fwf-logo-dark.png | Bin 0 -> 3571 bytes public/assets/images/logo.svg | 1 + public/assets/images/oeaw-logo-dark.png | Bin 0 -> 3116 bytes public/assets/images/oenb-logo-dark.png | Bin 0 -> 6401 bytes public/favicon.ico | Bin 0 -> 4158 bytes public/icon-maskable.svg | 1 + public/icon.svg | 1 + public/opengraph-image.png | Bin 0 -> 75833 bytes readme.md | 101 + src/components/card.astro | 46 + src/components/content/download.astro | 11 + src/components/content/embed.astro | 16 + src/components/content/figure.astro | 20 + src/components/content/image-carousel.astro | 293 + src/components/content/img.astro | 22 + .../content/transkriptions-tool.astro | 3 + src/components/content/video.astro | 27 + src/components/form/label.astro | 12 + src/components/form/required-indicator.astro | 9 + src/components/form/text-area-field.astro | 24 + src/components/form/text-input-field.astro | 28 + src/components/lexicon-alphabet-links.astro | 21 + src/components/lexicon-nav.astro | 43 + src/components/lexicon-search-form.astro | 49 + src/components/logo.tsx | 28 + src/components/main-content.astro | 17 + src/components/navigation/constants.ts | 3 + .../navigation/mobile-nav-toggle.astro | 52 + src/components/navigation/mobile-nav.astro | 94 + src/components/navigation/nav-link.astro | 14 + src/components/navigation/nav-menu-item.astro | 21 + src/components/navigation/nav-menu-link.astro | 18 + .../navigation/nav-menu-popover.astro | 6 + .../navigation/nav-menu-trigger.astro | 16 + src/components/navigation/nav-menu.astro | 3 + src/components/navigation/navigation.astro | 178 + src/components/page-card.astro | 24 + src/components/page-section.astro | 18 + src/components/page-title.astro | 11 + src/components/skip-link.astro | 12 + src/components/website-footer.astro | 103 + src/components/website-header.astro | 113 + src/config/content.config.ts | 16 + src/config/env.config.ts | 65 + src/config/i18n.config.ts | 18 + src/config/imprint.config.ts | 12 + src/config/mdx.config.ts | 56 + src/config/syntax-highlighter.config.ts | 9 + src/env.d.ts | 3 + src/layouts/document-layout.astro | 123 + src/layouts/lexicon-layout.astro | 24 + src/layouts/page-layout.astro | 26 + src/lib/analytics.ts | 45 + src/lib/content/components.ts | 22 + src/lib/content/mdx.ts | 27 + src/lib/content/reader.ts | 7 + src/lib/content/types.ts | 11 + src/lib/email.ts | 37 + src/lib/ensure-array.ts | 6 + src/lib/ensure-trailing-slash.ts | 3 + src/lib/generate-unique-id.ts | 3 + src/lib/get-image-import.ts | 18 + src/lib/get-intl-messages.ts | 9 + src/lib/i18n.ts | 29 + src/lib/lexicon.ts | 115 + src/lib/safe-json-ld-replacer.ts | 44 + src/lib/styles.ts | 1 + src/messages/de.json | 90 + src/pages/404.astro | 22 + src/pages/[...id]/index.astro | 39 + src/pages/feed.xml.ts | 23 + src/pages/impressum.astro | 32 + src/pages/index.astro | 54 + src/pages/kontakt.astro | 37 + src/pages/lexikon/artikel/[id].astro | 35 + src/pages/lexikon/artikel/index.astro | 73 + src/pages/lexikon/autorinnen/[id].astro | 70 + src/pages/lexikon/autorinnen/index.astro | 76 + src/pages/lexikon/index.astro | 74 + src/pages/lexikon/literatur/index.astro | 69 + src/pages/lexikon/orte/[id].astro | 35 + src/pages/lexikon/orte/index.astro | 73 + src/pages/lexikon/personen/[id].astro | 35 + src/pages/lexikon/personen/index.astro | 78 + src/pages/lexikon/projekt.astro | 23 + src/pages/lexikon/sachbegriffe/[id].astro | 35 + src/pages/lexikon/sachbegriffe/index.astro | 78 + src/pages/lexikon/suche.astro | 89 + src/pages/lexikon/werke/[id].astro | 36 + src/pages/lexikon/werke/index.astro | 78 + src/pages/manifest.webmanifest.ts | 21 + src/pages/robots.txt.ts | 22 + src/styles/index.css | 6 + tailwind.config.ts | 43 + tsconfig.json | 16 + 232 files changed, 20402 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .env.local.example create mode 100644 .gitattributes create mode 100644 .github/workflows/build-deploy.yml create mode 100644 .github/workflows/validate.yml create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 Dockerfile create mode 100644 Dockerfile.static create mode 100644 astro.config.ts create mode 100644 content/index-page/index.json create mode 100644 content/metadata.json create mode 100644 content/navigation.json create mode 100644 content/pages/anton-bruckner-2024.mdx create mode 100644 content/pages/audio/beispiele.mdx create mode 100644 content/pages/audio/symphonien.mdx create mode 100644 content/pages/drucke/alte-gesamtausgabe.mdx create mode 100644 content/pages/drucke/erstdrucke-digitalisate.mdx create mode 100644 content/pages/drucke/erstdrucke.mdx create mode 100644 content/pages/drucke/gesamtausgabe.mdx create mode 100644 content/pages/forschung/bruckner-gesellschaft.mdx create mode 100644 content/pages/forschung/chronologie-datenbank.mdx create mode 100644 content/pages/forschung/geschichte-dom-musikarchiv-linz.mdx create mode 100644 content/pages/forschung/international.mdx create mode 100644 content/pages/forschung/kitzler-studienbuch-codierung.mdx create mode 100644 content/pages/forschung/kitzler-studienbuch-imageviewer.mdx create mode 100644 content/pages/forschung/kitzler-studienbuch-musikanalyse.mdx create mode 100644 content/pages/forschung/kitzler-studienbuch-projektbeschreibung.mdx create mode 100644 content/pages/forschung/kitzler-studienbuch.mdx create mode 100644 content/pages/forschung/kopisten.mdx create mode 100644 content/pages/forschung/links.mdx create mode 100644 content/pages/forschung/transkriptionstool.mdx create mode 100644 content/pages/leben/bibliographie.mdx create mode 100644 content/pages/leben/kindheit-und-jugend.mdx create mode 100644 content/pages/leben/linz.mdx create mode 100644 content/pages/leben/st-florian.mdx create mode 100644 content/pages/leben/wien-i.mdx create mode 100644 content/pages/leben/wien-ii.mdx create mode 100644 content/pages/leben/wien-iii.mdx create mode 100644 content/pages/lexikon/abkuerzungen.mdx create mode 100644 content/pages/lexikon/artikel.mdx create mode 100644 content/pages/lexikon/autorinnen.mdx create mode 100644 content/pages/lexikon/home.mdx create mode 100644 content/pages/lexikon/literatur.mdx create mode 100644 content/pages/lexikon/orte.mdx create mode 100644 content/pages/lexikon/personen.mdx create mode 100644 content/pages/lexikon/projekt.mdx create mode 100644 content/pages/lexikon/sachbegriffe.mdx create mode 100644 content/pages/lexikon/suche.mdx create mode 100644 content/pages/lexikon/werke.mdx create mode 100644 content/pages/projekt/bruckner-forschung-oeaw.mdx create mode 100644 content/pages/projekt/mitarbeiter.mdx create mode 100644 content/pages/projekt/projektbeschreibung.mdx create mode 100644 content/pages/werkverzeichnis/abkuerzungen.mdx create mode 100644 content/pages/werkverzeichnis/aufbewahrungsorte.mdx create mode 100644 content/pages/werkverzeichnis/gedrucktes-werkverzeichnis.mdx create mode 100644 content/pages/werkverzeichnis/vorwort.mdx create mode 100644 content/pages/werkverzeichnis/wab-konkordanz.mdx create mode 100644 content/pages/werkverzeichnis/wab.mdx create mode 100644 content/pages/werkverzeichnis/werkeintraege-quellenbeschreibungen.mdx create mode 100644 content/pages/werkverzeichnis/werksystematik.mdx create mode 100644 content/pages/werkverzeichnis/werkuebersicht.mdx create mode 100644 e2e/lib/fixtures/a11y.ts create mode 100644 e2e/lib/fixtures/i18n.ts create mode 100644 e2e/lib/fixtures/imprint-page.ts create mode 100644 e2e/lib/fixtures/index-page.ts create mode 100644 e2e/lib/test.ts create mode 100644 e2e/snapshots/tests/pages/imprint.test.ts-snapshots/imprint-page-should-not-have-visible-changes-1-chromium-linux.png create mode 100644 e2e/tests/app/analytics.test.ts create mode 100644 e2e/tests/app/app.test.ts create mode 100644 e2e/tests/app/metadata.test.ts create mode 100644 e2e/tests/global.setup.ts create mode 100644 e2e/tests/pages/imprint.test.ts create mode 100644 e2e/tests/pages/index.test.ts create mode 100644 keystatic.config.tsx create mode 100644 license create mode 100644 package.json create mode 100644 playwright.config.ts create mode 100644 pnpm-lock.yaml create mode 100644 prettier.config.js create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-icon.png create mode 100644 public/assets/content/index-page/hero/slides/0/image.jpg create mode 100644 public/assets/content/index-page/hero/slides/1/image.jpg create mode 100644 public/assets/content/index-page/hero/slides/2/image.jpg create mode 100644 public/assets/content/index-page/hero/slides/3/image.jpg create mode 100644 public/assets/content/index-page/hero/slides/4/image.jpg create mode 100644 public/assets/content/index-page/hero/slides/5/image.jpg create mode 100644 public/assets/content/index-page/hero/slides/6/image.jpg create mode 100644 public/assets/content/index-page/hero/slides/7/image.jpg create mode 100644 public/assets/content/index-page/hero/slides/8/image.jpg create mode 100644 public/assets/content/pages/audio/symphonien/image.jpg create mode 100644 public/assets/content/pages/drucke/alte-gesamtausgabe/image.jpg create mode 100644 public/assets/content/pages/drucke/erstdrucke-digitalisate/image.jpg create mode 100644 public/assets/content/pages/drucke/erstdrucke/image.jpg create mode 100644 public/assets/content/pages/drucke/gesamtausgabe/image.jpg create mode 100644 public/assets/content/pages/forschung/international/image.jpg create mode 100644 public/assets/content/pages/forschung/kitzler-studienbuch-codierung/image.jpg create mode 100644 public/assets/content/pages/forschung/kitzler-studienbuch-imageviewer/image.jpg create mode 100644 public/assets/content/pages/forschung/kitzler-studienbuch-musikanalyse/image.jpg create mode 100644 public/assets/content/pages/forschung/kitzler-studienbuch-projektbeschreibung/image.jpg create mode 100644 public/assets/content/pages/forschung/kitzler-studienbuch/image.jpg create mode 100644 public/assets/content/pages/forschung/kopisten/image.png create mode 100644 public/assets/content/pages/forschung/links/image.jpg create mode 100644 public/assets/content/pages/leben/bibliographie/image.jpg create mode 100644 public/assets/content/pages/leben/kindheit-und-jugend/image.jpg create mode 100644 public/assets/content/pages/leben/linz/image.jpg create mode 100644 public/assets/content/pages/leben/st-florian/image.jpg create mode 100644 public/assets/content/pages/leben/wien-i/image.jpg create mode 100644 public/assets/content/pages/leben/wien-ii/image.jpg create mode 100644 public/assets/content/pages/leben/wien-iii/image.jpg create mode 100644 public/assets/content/pages/lexikon/abkuerzungen/image.jpg create mode 100644 public/assets/content/pages/lexikon/artikel/image.jpg create mode 100644 public/assets/content/pages/lexikon/autorinnen/image.jpg create mode 100644 public/assets/content/pages/lexikon/home/image.jpg create mode 100644 public/assets/content/pages/lexikon/literatur/image.jpg create mode 100644 public/assets/content/pages/lexikon/orte/image.jpg create mode 100644 public/assets/content/pages/lexikon/personen/image.jpg create mode 100644 public/assets/content/pages/lexikon/projekt/image.jpg create mode 100644 public/assets/content/pages/lexikon/sachbegriffe/image.jpg create mode 100644 public/assets/content/pages/lexikon/suche/image.jpg create mode 100644 public/assets/content/pages/lexikon/werke/image.jpg create mode 100644 public/assets/content/pages/projekt/bruckner-forschung-oeaw/image.jpg create mode 100644 public/assets/content/pages/projekt/mitarbeiter/image.jpg create mode 100644 public/assets/content/pages/projekt/projektbeschreibung/image.jpg create mode 100644 public/assets/content/pages/werkverzeichnis/gedrucktes-werkverzeichnis/image.png create mode 100644 public/assets/content/pages/werkverzeichnis/vorwort/image.jpg create mode 100644 public/assets/images/acdh-ch-logo-dark.svg create mode 100644 public/assets/images/acdh-ch-logo-light.svg create mode 100644 public/assets/images/bruckner-online-logo.png create mode 100644 public/assets/images/footer.png create mode 100644 public/assets/images/fwf-logo-dark.png create mode 100644 public/assets/images/logo.svg create mode 100644 public/assets/images/oeaw-logo-dark.png create mode 100644 public/assets/images/oenb-logo-dark.png create mode 100644 public/favicon.ico create mode 100644 public/icon-maskable.svg create mode 100644 public/icon.svg create mode 100644 public/opengraph-image.png create mode 100644 readme.md create mode 100644 src/components/card.astro create mode 100644 src/components/content/download.astro create mode 100644 src/components/content/embed.astro create mode 100644 src/components/content/figure.astro create mode 100644 src/components/content/image-carousel.astro create mode 100644 src/components/content/img.astro create mode 100644 src/components/content/transkriptions-tool.astro create mode 100644 src/components/content/video.astro create mode 100644 src/components/form/label.astro create mode 100644 src/components/form/required-indicator.astro create mode 100644 src/components/form/text-area-field.astro create mode 100644 src/components/form/text-input-field.astro create mode 100644 src/components/lexicon-alphabet-links.astro create mode 100644 src/components/lexicon-nav.astro create mode 100644 src/components/lexicon-search-form.astro create mode 100644 src/components/logo.tsx create mode 100644 src/components/main-content.astro create mode 100644 src/components/navigation/constants.ts create mode 100644 src/components/navigation/mobile-nav-toggle.astro create mode 100644 src/components/navigation/mobile-nav.astro create mode 100644 src/components/navigation/nav-link.astro create mode 100644 src/components/navigation/nav-menu-item.astro create mode 100644 src/components/navigation/nav-menu-link.astro create mode 100644 src/components/navigation/nav-menu-popover.astro create mode 100644 src/components/navigation/nav-menu-trigger.astro create mode 100644 src/components/navigation/nav-menu.astro create mode 100644 src/components/navigation/navigation.astro create mode 100644 src/components/page-card.astro create mode 100644 src/components/page-section.astro create mode 100644 src/components/page-title.astro create mode 100644 src/components/skip-link.astro create mode 100644 src/components/website-footer.astro create mode 100644 src/components/website-header.astro create mode 100644 src/config/content.config.ts create mode 100644 src/config/env.config.ts create mode 100644 src/config/i18n.config.ts create mode 100644 src/config/imprint.config.ts create mode 100644 src/config/mdx.config.ts create mode 100644 src/config/syntax-highlighter.config.ts create mode 100644 src/env.d.ts create mode 100644 src/layouts/document-layout.astro create mode 100644 src/layouts/lexicon-layout.astro create mode 100644 src/layouts/page-layout.astro create mode 100644 src/lib/analytics.ts create mode 100644 src/lib/content/components.ts create mode 100644 src/lib/content/mdx.ts create mode 100644 src/lib/content/reader.ts create mode 100644 src/lib/content/types.ts create mode 100644 src/lib/email.ts create mode 100644 src/lib/ensure-array.ts create mode 100644 src/lib/ensure-trailing-slash.ts create mode 100644 src/lib/generate-unique-id.ts create mode 100644 src/lib/get-image-import.ts create mode 100644 src/lib/get-intl-messages.ts create mode 100644 src/lib/i18n.ts create mode 100644 src/lib/lexicon.ts create mode 100644 src/lib/safe-json-ld-replacer.ts create mode 100644 src/lib/styles.ts create mode 100644 src/messages/de.json create mode 100644 src/pages/404.astro create mode 100644 src/pages/[...id]/index.astro create mode 100644 src/pages/feed.xml.ts create mode 100644 src/pages/impressum.astro create mode 100644 src/pages/index.astro create mode 100644 src/pages/kontakt.astro create mode 100644 src/pages/lexikon/artikel/[id].astro create mode 100644 src/pages/lexikon/artikel/index.astro create mode 100644 src/pages/lexikon/autorinnen/[id].astro create mode 100644 src/pages/lexikon/autorinnen/index.astro create mode 100644 src/pages/lexikon/index.astro create mode 100644 src/pages/lexikon/literatur/index.astro create mode 100644 src/pages/lexikon/orte/[id].astro create mode 100644 src/pages/lexikon/orte/index.astro create mode 100644 src/pages/lexikon/personen/[id].astro create mode 100644 src/pages/lexikon/personen/index.astro create mode 100644 src/pages/lexikon/projekt.astro create mode 100644 src/pages/lexikon/sachbegriffe/[id].astro create mode 100644 src/pages/lexikon/sachbegriffe/index.astro create mode 100644 src/pages/lexikon/suche.astro create mode 100644 src/pages/lexikon/werke/[id].astro create mode 100644 src/pages/lexikon/werke/index.astro create mode 100644 src/pages/manifest.webmanifest.ts create mode 100644 src/pages/robots.txt.ts create mode 100644 src/styles/index.css create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..1c8114e --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,19 @@ +{ + "name": "Astro", + "image": "ghcr.io/acdh-oeaw/devcontainer-frontend:20", + "customizations": { + "vscode": { + "extensions": [ + "astro-build.astro-vscode", + "bradlc.vscode-tailwindcss", + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "mikestead.dotenv", + "ms-playwright.playwright", + "stylelint.vscode-stylelint", + "unifiedjs.vscode-mdx" + ] + } + } +} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..793e18a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,63 @@ +## .gitignore ## + +# dependencies +node_modules/ +.pnpm-store/ + +# logs +*.log + +# non-public environment variables +.env.local +.env.*.local + +# caches +.eslintcache +.stylelintcache +*.tsbuildinfo + +# vercel +.vercel + +# misc +.DS_Store +.idea/ + +# astro +dist/ +.astro/ + +# test +/coverage/ + +# playwright +/blob-report/ +/playwright/.cache/ +/playwright-report/ +/test-results/ + + +## .dockerignore ## + +# git +.git/ +.gitattributes +.gitignore + +# github +.github/ + +# vscode settings +.vscode/ + +# environment variables +.env +.env.* + +# tests +playwright.config.ts +/e2e/ +/test/ + +# misc +.editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7d73f1e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = tab +insert_final_newline = true +max_line_length = 100 +trim_trailing_whitespace = true + +[*.{yaml,yml}] +indent_style = space diff --git a/.env.local.example b/.env.local.example new file mode 100644 index 0000000..b3be690 --- /dev/null +++ b/.env.local.example @@ -0,0 +1,46 @@ +# ------------------------------------------------------------------------------------------------- +# environment variables +# ------------------------------------------------------------------------------------------------- +# - public environment variables must be prefixed with `PUBLIC_`. +# - when adding new environment variables, don't forget to also update the +# validation schema in `./config/env.config.ts`. + +# ------------------------------------------------------------------------------------------------- +# app +# ------------------------------------------------------------------------------------------------- +PUBLIC_APP_BASE_URL="http://localhost:3000" +# PUBLIC_APP_BASE_PATH= +# imprint service +PUBLIC_REDMINE_ID="22508" +# web crawlers +PUBLIC_BOTS="disabled" +# validate environment variables +ENV_VALIDATION="enabled" + +# ------------------------------------------------------------------------------------------------- +# analytics +# ------------------------------------------------------------------------------------------------- +# PUBLIC_GOOGLE_SITE_VERIFICATION= +PUBLIC_MATOMO_BASE_URL="https://matomo.acdh.oeaw.ac.at" +# PUBLIC_MATOMO_ID= + +# ------------------------------------------------------------------------------------------------- +# keystatic cms +# ------------------------------------------------------------------------------------------------- +# KEYSTATIC_GITHUB_CLIENT_ID= +# KEYSTATIC_GITHUB_CLIENT_SECRET= +# KEYSTATIC_SECRET= +# PUBLIC_KEYSTATIC_GITHUB_APP_SLUG= +# PUBLIC_KEYSTATIC_GITHUB_REPO_NAME= +# PUBLIC_KEYSTATIC_GITHUB_REPO_OWNER= +# PUBLIC_KEYSTATIC_MODE="github" + +# ------------------------------------------------------------------------------------------------- +# registration form +# ------------------------------------------------------------------------------------------------- +# EMAIL_CONTACT_ADDRESS= +# EMAIL_CONTACT_ADDRESS_BCC= +# EMAIL_SMTP_PORT="587" +# EMAIL_SMTP_SERVER="smtp.oeaw.ac.at" +# EMAIL_SMTP_USERNAME +# EMAIL_SMTP_PASSWORD diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.github/workflows/build-deploy.yml b/.github/workflows/build-deploy.yml new file mode 100644 index 0000000..bd2aa3e --- /dev/null +++ b/.github/workflows/build-deploy.yml @@ -0,0 +1,131 @@ +name: Build and deploy + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}-build-deploy" + cancel-in-progress: true + +on: + workflow_call: + workflow_dispatch: + +jobs: + env: + name: Generate environment variables + runs-on: ubuntu-latest + steps: + - name: Derive environment from git ref + id: environment + run: | + if [ "${{ github.ref }}" = "refs/heads/main" ]; then + ENVIRONMENT="production" + APP_NAME_SUFFIX="" + elif [ "${{ github.ref }}" = "refs/heads/develop" ]; then + ENVIRONMENT="development" + APP_NAME_SUFFIX="-development" + elif [ "${{github.event_name}}" = "pull_request"]; then + ENVIRONMENT="pr/${{ github.event.pull_request.number }}" + APP_NAME_SUFFIX="-pr-${{ github.event.pull_request.number }}" + else + exit 1 + fi + + echo "ENVIRONMENT=$ENVIRONMENT" >> $GITHUB_OUTPUT + echo "APP_NAME_SUFFIX=$APP_NAME_SUFFIX" >> $GITHUB_OUTPUT + outputs: + environment: "${{ steps.environment.outputs.ENVIRONMENT }}" + app_name: "bruckner-online-website${{ steps.environment.outputs.APP_NAME_SUFFIX }}" + registry: "ghcr.io" + image: "${{ github.repository }}" + + vars: + name: Generate public url + needs: [env] + runs-on: ubuntu-latest + environment: + name: "${{ needs.env.outputs.environment }}" + steps: + - name: Generate public URL + id: public_url + run: | + if [ -z "${{ vars.PUBLIC_URL }}" ]; then + PUBLIC_URL="https://${{ needs.env.outputs.app_name }}.${{ vars.KUBE_INGRESS_BASE_DOMAIN }}" + else + PUBLIC_URL="${{ vars.PUBLIC_URL }}" + fi + + echo "PUBLIC_URL=$PUBLIC_URL" >> $GITHUB_OUTPUT + outputs: + public_url: "${{ steps.public_url.outputs.PUBLIC_URL }}" + + build: + name: Build and push docker image + needs: [env, vars] + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: "${{ needs.env.outputs.registry }}" + username: "${{ github.actor }}" + password: "${{ secrets.GITHUB_TOKEN }}" + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: "${{ needs.env.outputs.registry }}/${{ needs.env.outputs.image }}" + tags: | + type=raw,value={{sha}} + type=ref,event=branch + # type=ref,event=pr + # type=semver,pattern={{version}} + # type=semver,pattern={{major}}.{{minor}} + # type=raw,value=latest + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: "${{ steps.meta.outputs.tags }}" + labels: "${{ steps.meta.outputs.labels }}" + build-args: | + "PUBLIC_APP_BASE_URL=${{ needs.vars.outputs.public_url }}" + "PUBLIC_BOTS=${{ vars.PUBLIC_BOTS }}" + "PUBLIC_KEYSTATIC_GITHUB_APP_SLUG=${{ vars.PUBLIC_KEYSTATIC_GITHUB_APP_SLUG }}" + "PUBLIC_KEYSTATIC_GITHUB_REPO_NAME=${{ vars.PUBLIC_KEYSTATIC_GITHUB_REPO_NAME }}" + "PUBLIC_KEYSTATIC_GITHUB_REPO_OWNER=${{ vars.PUBLIC_KEYSTATIC_GITHUB_REPO_OWNER }}" + "PUBLIC_KEYSTATIC_MODE=${{ vars.PUBLIC_KEYSTATIC_MODE }}" + "PUBLIC_MATOMO_BASE_URL=${{ vars.PUBLIC_MATOMO_BASE_URL }}" + "PUBLIC_MATOMO_ID=${{ vars.PUBLIC_MATOMO_ID }}" + "PUBLIC_REDMINE_ID=${{ vars.SERVICE_ID }}" + secrets: | + "KEYSTATIC_GITHUB_CLIENT_ID=${{ secrets.K8S_SECRET_KEYSTATIC_GITHUB_CLIENT_ID }}" + "KEYSTATIC_GITHUB_CLIENT_SECRET=${{ secrets.K8S_SECRET_KEYSTATIC_GITHUB_CLIENT_SECRET }}" + "KEYSTATIC_SECRET=${{ secrets.K8S_SECRET_KEYSTATIC_SECRET }}" + cache-from: type=gha + cache-to: type=gha,mode=max + + deploy: + name: Deploy docker image + needs: [env, vars, build] + uses: acdh-oeaw/gl-autodevops-minimal-port/.github/workflows/deploy.yml@main + secrets: inherit + with: + environment: "${{ needs.env.outputs.environment }}" + DOCKER_TAG: "${{ needs.env.outputs.registry }}/${{ needs.env.outputs.image }}" + APP_NAME: "${{ needs.env.outputs.app_name }}" + APP_ROOT: "/" + SERVICE_ID: "${{ vars.SERVICE_ID }}" + PUBLIC_URL: "${{ needs.vars.outputs.public_url }}" + default_port: "3000" diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 0000000..3c6f4cd --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,102 @@ +name: Validate + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}-validate" + cancel-in-progress: true + +on: + pull_request: + branches: + - main + push: + branches: + - main + +jobs: + validate: + name: Validate + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + + strategy: + fail-fast: true + matrix: + node-version: [20.x] + os: [ubuntu-latest] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Necessary because `actions/setup-node` does not yet support `corepack`. + # @see https://github.com/actions/setup-node/issues/531 + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Format + run: pnpm run format:check + + - name: Lint + run: pnpm run lint:check + + - name: Typecheck + run: pnpm run types:check + + - name: Test + run: pnpm run test + + - name: Get playwright version + run: | + PLAYWRIGHT_VERSION=$(pnpm ls @playwright/test --json | jq --raw-output '.[0].devDependencies["@playwright/test"].version') + echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV + + - name: Cache playwright browsers + uses: actions/cache@v4 + id: cache-playwright-browsers + with: + path: "~/.cache/ms-playwright" + key: "${{ matrix.os }}-playwright-browsers-${{ env.PLAYWRIGHT_VERSION }}" + + - name: Install playwright browsers + if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' + run: pnpm exec playwright install --with-deps + - name: Install playwright browsers (operating system dependencies) + if: steps.cache-playwright-browsers.outputs.cache-hit == 'true' + run: pnpm exec playwright install-deps + + - name: Build app + run: pnpm run build + env: + PUBLIC_APP_BASE_URL: "http://localhost:3000" + PUBLIC_REDMINE_ID: "${{ vars.SERVICE_ID }}" + + - name: Run e2e tests + run: pnpm run test:e2e + env: + PUBLIC_APP_BASE_URL: "http://localhost:3000" + + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 + + build-deploy: + if: ${{ github.event_name == 'push' }} + needs: [validate] + uses: ./.github/workflows/build-deploy.yml + secrets: inherit + # https://docs.github.com/en/actions/using-workflows/reusing-workflows#access-and-permissions + permissions: + contents: read + packages: write diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..622b980 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# dependencies +node_modules/ +.pnpm-store/ + +# logs +*.log + +# non-public environment variables +.env.local +.env.*.local + +# caches +.eslintcache +.stylelintcache +*.tsbuildinfo + +# vercel +.vercel + +# misc +.DS_Store +.idea/ + +# astro +dist/ +.astro/ + +# test +/coverage/ + +# playwright +/blob-report/ +/playwright/.cache/ +/playwright-report/ +/test-results/ diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..e284682 --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +engine-strict=true +package-manager-strict=false +shell-emulator=true +use-node-version=20.14.0 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..4f00a02 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,13 @@ +{ + "recommendations": [ + "astro-build.astro-vscode", + "bradlc.vscode-tailwindcss", + "dbaeumer.vscode-eslint", + "editorconfig.editorconfig", + "esbenp.prettier-vscode", + "mikestead.dotenv", + "ms-playwright.playwright", + "stylelint.vscode-stylelint", + "unifiedjs.vscode-mdx" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..98a64ed --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "configurations": [ + { + "name": "Apps: Web (server-side)", + "request": "launch", + "runtimeArgs": ["run", "dev"], + "runtimeExecutable": "pnpm", + "skipFiles": ["/**"], + "type": "node" + }, + { + "name": "Apps: Web (client-side)", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000" + } + ], + "compounds": [ + { + "name": "Apps: Web", + "configurations": ["Apps: Web (server-side)", "Apps: Web (client-side)"] + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9967b32 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,54 @@ +{ + "css.validate": false, + "editor.codeActionsOnSave": { + "source.fixAll": "explicit" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.inlayHints.enabled": "offUnlessPressed", + "editor.linkedEditing": true, + "editor.quickSuggestions": { + "strings": true + }, + "editor.rulers": [100], + "editor.stickyScroll.enabled": true, + "eslint.enable": true, + "eslint.options": { + "ignorePath": ".gitignore" + }, + "eslint.validate": ["astro", "javascript", "typescript", "typescriptreact"], + "files.associations": { + "*.css": "tailwindcss" + }, + "files.eol": "\n", + "html.autoCreateQuotes": false, + "less.validate": false, + "mdx.server.enable": true, + "prettier.documentSelectors": ["**/*.astro"], + "prettier.ignorePath": ".gitignore", + "scss.validate": false, + "stylelint.enable": true, + "stylelint.snippet": ["astro", "css", "postcss", "tailwindcss"], + "stylelint.validate": ["astro", "css", "postcss", "tailwindcss"], + "tailwindCSS.classAttributes": ["class", "class:list"], + "tailwindCSS.experimental.classRegex": [ + ["cn\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"], + ["variants\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"] + ], + "tailwindCSS.validate": true, + "terminal.integrated.enablePersistentSessions": false, + "typescript.enablePromptUseWorkspaceTsdk": true, + "typescript.inlayHints.parameterNames.enabled": "all", + "typescript.preferences.importModuleSpecifier": "non-relative", + "typescript.preferences.preferTypeOnlyAutoImports": true, + "typescript.tsdk": "node_modules/typescript/lib", + "workbench.editor.labelFormat": "medium", + "workbench.tree.enableStickyScroll": true, + "[markdown]": { + "editor.wordWrap": "on" + }, + "[mdx]": { + "editor.formatOnSave": false, + "editor.wordWrap": "on" + } +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..723d0e6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,73 @@ +# syntax=docker/dockerfile:1 + +# using alpine base image to avoid `sharp` memory leaks. +# @see https://sharp.pixelplumbing.com/install#linux-memory-allocator + +# base +FROM node:20-alpine AS base + +RUN corepack enable + +RUN mkdir /app && chown -R node:node /app +WORKDIR /app + +USER node + +COPY --chown=node:node .npmrc package.json pnpm-lock.yaml ./ +RUN sed -i "s/use-node-version/# use-node-version/" .npmrc + +RUN pnpm fetch --prod +RUN pnpm install --frozen-lockfile --ignore-scripts --offline --prod + +# build +FROM base as build + +RUN pnpm fetch --dev + +COPY --chown=node:node ./ ./ +RUN sed -i "s/use-node-version/# use-node-version/" .npmrc + +ARG PUBLIC_APP_BASE_PATH +ARG PUBLIC_APP_BASE_URL +ARG PUBLIC_BOTS +ARG PUBLIC_KEYSTATIC_GITHUB_APP_SLUG +ARG PUBLIC_KEYSTATIC_GITHUB_REPO_NAME +ARG PUBLIC_KEYSTATIC_GITHUB_REPO_OWNER +ARG PUBLIC_KEYSTATIC_MODE +ARG PUBLIC_MATOMO_BASE_URL +ARG PUBLIC_MATOMO_ID +ARG PUBLIC_REDMINE_ID + +# disable validation for runtime environment variables +ENV ENV_VALIDATION=public + +RUN pnpm install --frozen-lockfile --offline + +ENV NODE_ENV=production + +RUN --mount=type=secret,id=KEYSTATIC_GITHUB_CLIENT_ID,uid=1000 \ + --mount=type=secret,id=KEYSTATIC_GITHUB_CLIENT_SECRET,uid=1000 \ + --mount=type=secret,id=KEYSTATIC_SECRET,uid=1000 \ + KEYSTATIC_GITHUB_CLIENT_ID=$(cat /run/secrets/KEYSTATIC_GITHUB_CLIENT_ID) \ + KEYSTATIC_GITHUB_CLIENT_SECRET=$(cat /run/secrets/KEYSTATIC_GITHUB_CLIENT_SECRET) \ + KEYSTATIC_SECRET=$(cat /run/secrets/KEYSTATIC_SECRET) \ + pnpm run build + +# serve +FROM node:20-alpine AS serve + +RUN mkdir /app && chown -R node:node /app +WORKDIR /app + +USER node + +COPY --from=base --chown=node:node /app/node_modules ./node_modules +COPY --from=build --chown=node:node /app/dist ./ + +ENV NODE_ENV=production +ENV HOST=0.0.0.0 +ENV PORT=3000 + +EXPOSE 3000 + +CMD [ "node", "./server/entry.mjs" ] diff --git a/Dockerfile.static b/Dockerfile.static new file mode 100644 index 0000000..1472598 --- /dev/null +++ b/Dockerfile.static @@ -0,0 +1,53 @@ +# syntax=docker/dockerfile:1 + +# using alpine base image to avoid `sharp` memory leaks. +# @see https://sharp.pixelplumbing.com/install#linux-memory-allocator + +# build +FROM node:20-alpine AS build + +RUN corepack enable + +RUN mkdir /app && chown -R node:node /app +WORKDIR /app + +USER node + +COPY --chown=node:node .npmrc package.json pnpm-lock.yaml ./ +RUN sed -i "s/use-node-version/# use-node-version/" .npmrc + +RUN pnpm fetch + +COPY --chown=node:node ./ ./ +RUN sed -i "s/use-node-version/# use-node-version/" .npmrc + +ARG PUBLIC_APP_BASE_PATH +ARG PUBLIC_APP_BASE_URL +ARG PUBLIC_BOTS +ARG PUBLIC_KEYSTATIC_GITHUB_APP_SLUG +ARG PUBLIC_KEYSTATIC_GITHUB_REPO_NAME +ARG PUBLIC_KEYSTATIC_GITHUB_REPO_OWNER +ARG PUBLIC_KEYSTATIC_MODE +ARG PUBLIC_MATOMO_BASE_URL +ARG PUBLIC_MATOMO_ID +ARG PUBLIC_REDMINE_ID + +# disable validation for runtime environment variables +ENV ENV_VALIDATION=public + +ENV NODE_ENV=production + +RUN pnpm install --frozen-lockfile --offline + +RUN pnpm run build + +# serve +FROM caddy:2-alpine AS serve + +WORKDIR /usr/share/caddy + +COPY --from=build /app/dist /usr/share/caddy + +EXPOSE 3000 + +CMD ["caddy", "file-server", "--listen", ":3000"] diff --git a/astro.config.ts b/astro.config.ts new file mode 100644 index 0000000..10f8c50 --- /dev/null +++ b/astro.config.ts @@ -0,0 +1,89 @@ +import mdx from "@astrojs/mdx"; +import node from "@astrojs/node"; +import react from "@astrojs/react"; +import sitemap from "@astrojs/sitemap"; +import keystatic from "@keystatic/astro"; +import { defineConfig } from "astro/config"; +import icon from "astro-icon"; +import { loadEnv } from "vite"; + +// import { defaultLocale } from "./src/config/i18n.config"; +// import { createConfig as createMdxConfig } from "./src/config/mdx.config"; + +const env = loadEnv(import.meta.env.MODE, process.cwd(), ""); + +export default defineConfig({ + /** + * When switching to static site generation, place an empty `index.astro` file in + * the `src/pages` folder, so `astro` will generate a redirect to the default locale + * via ``. + */ + adapter: node({ + mode: "standalone", + }), + base: env.PUBLIC_APP_BASE_PATH, + experimental: { + contentCollectionCache: true, + }, + integrations: [ + icon({ + /** @see https://www.astroicon.dev/reference/configuration/#include */ + include: { + lucide: [ + "chevron-down", + "chevron-left", + "chevron-right", + "circle-pause", + "circle-play", + "menu", + "quote", + "search", + "x", + ], + }, + svgoOptions: { + multipass: true, + plugins: [ + { + name: "preset-default", + params: { + overrides: { + removeViewBox: false, + }, + }, + }, + ], + }, + }), + keystatic(), + mdx(), + react(), + sitemap(), + ], + // // @ts-expect-error Astro types are incomplete. + // markdown: { + // ...(await createMdxConfig(defaultLocale)), + // gfm: false, + // smartypants: false, + // syntaxHighlight: false, + // }, + output: "hybrid", + prefetch: { + defaultStrategy: "hover", + prefetchAll: true, + }, + redirects: { + "/admin": { + destination: "/keystatic", + status: 307, + }, + }, + scopedStyleStrategy: "where", + security: { + checkOrigin: true, + }, + server: { + port: 3000, + }, + site: env.PUBLIC_APP_BASE_URL, +}); diff --git a/content/index-page/index.json b/content/index-page/index.json new file mode 100644 index 0000000..e7dbc74 --- /dev/null +++ b/content/index-page/index.json @@ -0,0 +1,87 @@ +{ + "hero": { + "slides": [ + { + "title": "Jubiläumsjahr 2024", + "summary": "Veranstaltungen zum 200. Geburtstag Anton Bruckners", + "alignment": "right", + "image": "/assets/content/index-page/hero/slides/0/image.jpg", + "page": "lexikon" + }, + { + "title": "Digitales Werkverzeichnis Anton Bruckner", + "summary": "Datenbank mit Informationen zu Werken Anton Bruckners und zu weiteren Quellen aus dem musikalischen Nachlass", + "alignment": "left", + "image": "/assets/content/index-page/hero/slides/1/image.jpg", + "page": "werkverzeichnis/wab" + }, + { + "title": "Anton Bruckner-Lexikon", + "summary": "Mit Informationen zu Leben und Werk des Komponisten", + "alignment": "right", + "image": "/assets/content/index-page/hero/slides/2/image.jpg", + "page": "lexikon" + }, + { + "title": "Musik-Handschriften ", + "summary": "31.000 Farbdigitalisate in hoher Qualität von über 700 Autographen und frühen Abschriften Bruckners (zugänglich über das Werkverzeichnis)", + "alignment": "left", + "image": "/assets/content/index-page/hero/slides/3/image.jpg", + "page": "werkverzeichnis/wab" + }, + { + "title": "Musik-Drucke ", + "summary": "5500 Farbdigitalisate aller zur Verfügung stehenden Erstausgaben und der Alten Gesamtausgabe", + "alignment": "right", + "image": "/assets/content/index-page/hero/slides/4/image.jpg", + "page": "drucke/erstdrucke" + }, + { + "title": "Biographie", + "summary": "Zusammenstellung der wichtigsten Stationen in Bruckners Leben und zeitliche Einordung der Werke", + "alignment": "left", + "image": "/assets/content/index-page/hero/slides/5/image.jpg", + "page": "leben/kindheit-und-jugend" + }, + { + "title": "Kitzler-Studienbuch", + "summary": "Digitale Edition und automatisierte Harmonieanalyse auf Grundlage MEI-codierter Notation.", + "alignment": "left", + "image": "/assets/content/index-page/hero/slides/6/image.jpg", + "page": "forschung/kitzler-studienbuch" + }, + { + "title": "Bibliographie", + "summary": "Datenbank mit 9749 Literaturzitaten", + "alignment": "left", + "image": "/assets/content/index-page/hero/slides/7/image.jpg", + "page": "leben/bibliographie" + }, + { + "title": "Anton Bruckner Chronologie Datenbank", + "summary": "von Franz Scheder", + "alignment": "right", + "image": "/assets/content/index-page/hero/slides/8/image.jpg", + "page": "forschung/chronologie-datenbank" + } + ] + }, + "quote": "Anton Bruckner-Jubiläumsjahr 2024 an der Akademie der Wissenschaften: Symposion (10.-12.04). Jubiläumskonzert im historischen Festsaal (10.04.). Bruckner-Fest im Arkadenhof der Akademie (07.09.). ", + "links": [ + { + "title": "Werkverzeichnis", + "summary": "Datenbank mit Informationen zu Werken Anton Bruckners und zu weiteren Quellen aus dem musikalischen Nachlass", + "page": "werkverzeichnis/wab" + }, + { + "title": "ABLO", + "summary": "Anton Bruckner-Lexikon online mit Informationen zu Leben und Werk des Komponisten", + "page": "lexikon" + }, + { + "title": "ABCD", + "summary": "Anton Bruckner Chronologie Datenbank der biographisch erfassten Informationen zu Leben und Werk des Komponisten", + "page": "forschung/chronologie-datenbank" + } + ] +} diff --git a/content/metadata.json b/content/metadata.json new file mode 100644 index 0000000..ed8e3c2 --- /dev/null +++ b/content/metadata.json @@ -0,0 +1,5 @@ +{ + "title": "Bruckner Online", + "shortTitle": "Bruckner Online", + "description": "bruckner-online.at ist ein umfangreich angelegtes Bruckner-Internet-Portal (Webarchiv), in dem neben der elektronischen Dokumentation sämtlicher hand­schriftlicher Quellen auch alle Kompositionen, relevante Personen und Orte enthalten sind. Zudem werden von allen Quellen, Erstdrucken und der Alten Gesamtausgabe vollständige Digitalisate zur Verfügung gestellt." +} diff --git a/content/navigation.json b/content/navigation.json new file mode 100644 index 0000000..3a94f6f --- /dev/null +++ b/content/navigation.json @@ -0,0 +1,304 @@ +{ + "links": [ + { + "discriminant": "menu", + "value": { + "label": "Projekt", + "links": [ + { + "discriminant": "page", + "value": { + "label": "Mitarbeiter", + "reference": "projekt/mitarbeiter" + } + }, + { + "discriminant": "page", + "value": { + "label": "Beschreibung", + "reference": "projekt/projektbeschreibung" + } + }, + { + "discriminant": "page", + "value": { + "label": "Bruckner-Forschung (ÖAW)", + "reference": "projekt/bruckner-forschung-oeaw" + } + } + ] + } + }, + { + "discriminant": "menu", + "value": { + "label": "Bruckner", + "links": [ + { + "discriminant": "page", + "value": { + "label": "Leben: Kindheit und Jugend (1824-1845)", + "reference": "leben/kindheit-und-jugend" + } + }, + { + "discriminant": "page", + "value": { + "label": "Leben: St. Florian (1845-1855)", + "reference": "leben/st-florian" + } + }, + { + "discriminant": "page", + "value": { + "label": "Leben: Linz (1856-1868)", + "reference": "leben/linz" + } + }, + { + "discriminant": "page", + "value": { + "label": "Leben: Wien I (1868-1877)", + "reference": "leben/wien-i" + } + }, + { + "discriminant": "page", + "value": { + "label": "Leben: Wien II (1878-1889)", + "reference": "leben/wien-ii" + } + }, + { + "discriminant": "page", + "value": { + "label": "Leben: Wien III (1890-1896)", + "reference": "leben/wien-iii" + } + }, + { + "discriminant": "page", + "value": { + "label": "Bibliographie", + "reference": "leben/bibliographie" + } + } + ] + } + }, + { + "discriminant": "menu", + "value": { + "label": "Werkverzeichnis", + "links": [ + { + "discriminant": "page", + "value": { + "label": "Werkverzeichnis", + "reference": "werkverzeichnis/wab" + } + }, + { + "discriminant": "page", + "value": { + "label": "Gedrucktes Werkverzeichnis", + "reference": "werkverzeichnis/gedrucktes-werkverzeichnis" + } + }, + { + "discriminant": "page", + "value": { + "label": "Werkübersicht", + "reference": "werkverzeichnis/werkuebersicht" + } + }, + { + "discriminant": "page", + "value": { + "label": "Werksystematik", + "reference": "werkverzeichnis/werksystematik" + } + }, + { + "discriminant": "page", + "value": { + "label": "WAB-Konkordanz", + "reference": "werkverzeichnis/wab-konkordanz" + } + }, + { + "discriminant": "page", + "value": { + "label": "Werkeinträge / Quellenbeschreibungen", + "reference": "werkverzeichnis/werkeintraege-quellenbeschreibungen" + } + }, + { + "discriminant": "page", + "value": { + "label": "Aufbewahrungsorte", + "reference": "werkverzeichnis/aufbewahrungsorte" + } + }, + { + "discriminant": "page", + "value": { + "label": "Abkürzungen", + "reference": "werkverzeichnis/abkuerzungen" + } + } + ] + } + }, + { + "discriminant": "menu", + "value": { + "label": "Drucke", + "links": [ + { + "discriminant": "page", + "value": { + "label": "Erstdrucke", + "reference": "drucke/erstdrucke" + } + }, + { + "discriminant": "page", + "value": { + "label": "Digitalisate der Erstdrucke", + "reference": "drucke/erstdrucke-digitalisate" + } + }, + { + "discriminant": "page", + "value": { + "label": "Anton Bruckner Sämtliche Werke (AGA)", + "reference": "drucke/alte-gesamtausgabe" + } + }, + { + "discriminant": "page", + "value": { + "label": "Anton Bruckner Gesamtausgabe (NGA)", + "reference": "drucke/gesamtausgabe" + } + }, + { + "discriminant": "link", + "value": { + "label": "Neue Anton Bruckner Gesamtausgabe", + "href": "https://www.mwv.at/content/seite/NeueAntonBrucknerGesamtausgabeab2016/" + } + }, + { + "discriminant": "link", + "value": { + "label": "Anton Bruckner Urtext Gesamtausgabe", + "href": "https://hermann.eu/home/label/BEW" + } + } + ] + } + }, + { + "discriminant": "menu", + "value": { + "label": "Forschung", + "links": [ + { + "discriminant": "page", + "value": { + "label": "Kitzler-Studienbuch", + "reference": "forschung/kitzler-studienbuch" + } + }, + { + "discriminant": "page", + "value": { + "label": "Chronologie-Datenbank", + "reference": "forschung/chronologie-datenbank" + } + }, + { + "discriminant": "page", + "value": { + "label": "Transkriptionstool Hanschrift Bruckners", + "reference": "forschung/transkriptionstool" + } + }, + { + "discriminant": "page", + "value": { + "label": "Anton Bruckner Kopisten", + "reference": "forschung/kopisten" + } + }, + { + "discriminant": "page", + "value": { + "label": "Bruckner Forschung (ÖAW)", + "reference": "projekt/bruckner-forschung-oeaw" + } + }, + { + "discriminant": "page", + "value": { + "label": "Bruckner Forschung International", + "reference": "forschung/international" + } + }, + { + "discriminant": "page", + "value": { + "label": "Bruckner Gesellschaft", + "reference": "forschung/bruckner-gesellschaft" + } + }, + { + "discriminant": "page", + "value": { + "label": "Geschichte Dom-Musikarchiv Linz", + "reference": "forschung/geschichte-dom-musikarchiv-linz" + } + }, + { + "discriminant": "page", + "value": { + "label": "Weitere Links", + "reference": "forschung/links" + } + } + ] + } + }, + { + "discriminant": "page", + "value": { + "label": "Lexikon", + "reference": "lexikon" + } + }, + { + "discriminant": "menu", + "value": { + "label": "Audio", + "links": [ + { + "discriminant": "page", + "value": { + "label": "Symphonien", + "reference": "audio/symphonien" + } + }, + { + "discriminant": "page", + "value": { + "label": "Weitere Audiobeispiele", + "reference": "audio/beispiele" + } + } + ] + } + } + ] +} diff --git a/content/pages/anton-bruckner-2024.mdx b/content/pages/anton-bruckner-2024.mdx new file mode 100644 index 0000000..979a123 --- /dev/null +++ b/content/pages/anton-bruckner-2024.mdx @@ -0,0 +1,68 @@ +--- +title: anton bruckner 2024 +--- +**Aktivitäten im Jubiläumsjahr** + +Am 4. September 2024 jährt sich zum 200. Mal der Geburtstag des bedeutenden österreichischen Komponisten Anton Bruckner (1824-1896). Dieses Jubiläum nimmt die Österreichische Akademie der Wissenschaften zum Anlass für verschiedene Veranstaltungen. + +**10.-12. April 2024** + +**Internationales Symposion** **der Akademie der Wissenschaften**\ +Bruckner-Aspekte: 200 Jahre Bruckner – 100 Jahre Bruckner-Forschung. + +**Mittwoch, 10. April 2024** – **19 Uhr** + +**Jubiläumskonzert im historischen Festsaal der Akademie der Wissenschaften** + +Zwei Fanfaren über Werke Anton Bruckners von Vinzenz Goller. Ausführende: Blechbläser:innen-Kammermusikensemble *BrassAdventure* der Universität für Musik und darstellende Kunst Wien.\ +Symphonie Nr. 7 E-Dur in einer Bearbeitung für groß besetztes Kammerensemble von Hanns Eisler, Erwin Stein und Karl Rankl.\ +Ausführende: Musiker:innen des Bruckner Orchester Linz. + + + +**Samstag, 7. September 2024** + +**09.30 Uhr**: **Festgottesdienst in der Jesuitenkirche Wien** + +Messe in e-Moll, Ausführende: „Chorvereinigung St. Augustin“ unter der Leitung von Andreas Pixner\ +Zelebranten: Seine Eminenz Kardinal Christoph Schönborn, Erzbischof von Wien und Propst Johann Holzinger von St. Florian, Generalabt der Augustiner-Chorherren. + +Präsentation des neuen, gedruckten [*Werkverzeichnis Anton Bruckner*](http://www.bruckner-online.at/?page_id=2660) + +**11-18 Uhr: Campusfestival im Arkadenhof der Akademie der Wissenschaften** + +Grätzlfest für die Wiener Bevölkerung mit Bewirtung, Musik- und Kinderprogramm + +*Vorläufiges Programm*\ +11.00-12.00 Uhr [Musikverein Kremsmünster](https://www.mvkremsmuenster.at/)\ +12.00-12.30 Uhr [Bachl Chor](https://www.bachlchor.at/)\ +12.30-13.30 Uhr [Musikverein Kremsmünster](https://www.mvkremsmuenster.at/)\ +13.30-14.00 Uhr [Andorfer Chöre](https://andorferchoere.at/)\ +14.00-15.00 Uhr [Musikverein St. Florian](https://www.mv-stflorian.at/index.html)\ +15.00-15.30 Uhr [Camerata Garstina](https://www.chvooe.at/chvooe/mitgliedschoere/5051-camerata-garstina)\ +15.30-16.00 Uhr [Musikverein St. Florian](https://www.mv-stflorian.at/index.html)\ +16.00-16.30 Uhr Chor der ÖAW\ +16.30-18.00 Uhr [Blaskapelle der Boku Wien](https://blaskapelle.boku.ac.at/) + +Die Veranstaltung findet in Kooperation mit dem **Remasuri Straßenfest** in der Wollzeile (Wien) statt. + +--- + +#### Donnerstag, 21. November 2024 – 18 Uhr + +**Leibniz Lecture im Rahmen der Akademievorlesungen** + +Prof.em. Dr. Jürgen Stolzenberg, Institut für Philosophie der Universität Halle:\ +Zur Religion in Bruckners Neunter Symphonie\ +\ +Österreichische Akademie der Wissenschaften, Seminarraum am Arkadenhof + +--- + +### **anton bruckner 2024 in Oberösterreich** + +Oberösterreich war Anton Bruckners Heimat. In ­Ansfelden wurde er 1824 geboren, im Stift des Nachbarortes St. Florian musikalisch sozialisiert, gefördert und ausgebildet. In Linz entwickelte er sich zum umjubelten Orgelimprovisator und zu einem ­Komponisten mit unverwechselbarer Tonsprache. Hier erklingt seine Musik heute im renommierten Konzerthaus, das seinen Namen trägt, hier spielt sie das nach ihm benannte Orchester und hier lehrt und erforscht sie eine Universität, deren Namensgeber er ist. + +Sein runder Geburtstag ist willkommener Anlass, gemeinsam oberösterreichische Kultur in ihrer ganzen Vielfalt zu präsentieren, was in zahlreichen Projekten rund um Bruckner seinen Ausdruck finden wird, auf Plätzen und an Orten, in Dörfern und Städten, überall in Oberösterreich. + +[www.anton-bruckner-2024.at](https://www.anton-bruckner-2024.at/) diff --git a/content/pages/audio/beispiele.mdx b/content/pages/audio/beispiele.mdx new file mode 100644 index 0000000..7a51ada --- /dev/null +++ b/content/pages/audio/beispiele.mdx @@ -0,0 +1,20 @@ +--- +title: Auswahl weiterer Audio- und Musikvideobeispiele +--- +## Fanfaren über Themen Anton Bruckners von Vinzenz Goller + +