Compare commits

..

No commits in common. "eafda90a41d2ffda9fad3562262d939f52e26013" and "7438f397861c9e8649c0dc1c2fd563a73a59ae66" have entirely different histories.

81 changed files with 3473 additions and 56201 deletions

View file

@ -1,6 +1,4 @@
NEXT_PUBLIC_SITE_ID=chemnitz
DATABASE_URI=mongodb://127.0.0.1/dreikoenige
PAYLOAD_SECRET=YOUR_SECRET_HERE
GOOGLE_BUCKET=google_storage_bucket #can be omitted
RESEND_API_KEY=some_api_key
NEXT_PUBLIC_SERVER_URL=http://localhost:3000
GOOGLE_BUCKET=google_storage_bucket
RESEND_API_KEY=some_api_key

View file

@ -46,15 +46,6 @@ Create and run a container, then set your `DATABASE_URI` to the Postgres URL. En
Alternatively, you can enable the Postgres service in `docker-compose.yml` (currently commented out) and use that as your local DB.
## Google Cloud Storage
Media and document uploads use `@payloadcms/storage-gcs`. The plugin is always registered but conditionally enabled via the `GOOGLE_BUCKET` environment variable:
- **`GOOGLE_BUCKET` set** — files are uploaded to GCS and served from `https://storage.googleapis.com/<bucket>/`.
- **`GOOGLE_BUCKET` unset** — the plugin is disabled and Payload falls back to local file storage. The `alwaysInsertFields` flag keeps the schema identical in both cases, so `payload-types.ts` and `importMap.js` stay stable across environments.
No additional configuration is needed for local development — simply omit `GOOGLE_BUCKET` from your `.env`.
## Migrations (Payload)
Create a new migration:

View file

@ -1,11 +1,11 @@
$base-color: var(--base-color);
$shade1: var(--shade1);
$shade2: var(--shade2);
$shade3: var(--shade3);
$contrast-color: var(--contrast-color);
$contrast-shade1: var(--contrast-shade1);
$base-color: #426156;
$shade1: #728F8D;
$shade2: #CBD6D5;
$shade3: #E3E9E8;
$contrast-color: #7D1224;
$contrast-shade1: #C14953;
$text-color: #000000;
$border-radius: var(--border-radius);
$border-radius: 13px;
$white: #ffffff;
$light-grey: #f3f3f3;

1864
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -20,7 +20,6 @@
"dependencies": {
"@nyariv/sandboxjs": "0.8.28",
"@payloadcms/db-postgres": "^3.74.0",
"@payloadcms/live-preview-react": "^3.74.0",
"@payloadcms/next": "^3.74.0",
"@payloadcms/richtext-lexical": "^3.74.0",
"@payloadcms/storage-gcs": "^3.74.0",
@ -31,6 +30,7 @@
"moment": "^2.30.1",
"next": "15.4.11",
"payload": "^3.74.0",
"qs-esm": "^7.0.3",
"react": "19.2.4",
"react-dom": "19.2.4",
"resend": "^6.9.1",
@ -38,20 +38,20 @@
"zod": "^4.3.6"
},
"devDependencies": {
"@storybook/nextjs-vite": "^10.2.7",
"@swc/cli": "^0.7.10",
"@swc/core": "^1.15.11",
"@types/node": "^20.19.32",
"@types/react": "19.2.13",
"@types/react-dom": "19.2.3",
"eslint": "^8.57.1",
"eslint-config-next": "^15.4.11",
"eslint": "9.26.0",
"eslint-config-next": "16.1.6",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-storybook": "^10.2.7",
"storybook": "^10.2.7",
"typescript": "5.9.3",
"vitest": "^4.0.18",
"storybook": "^10.2.7",
"@storybook/nextjs-vite": "^10.2.7",
"vite": "^7.3.1",
"vitest": "^4.0.18"
"eslint-plugin-storybook": "^10.2.7"
},
"engines": {
"node": ">=22.0.0"

View file

@ -1,35 +0,0 @@
import { LogoProps } from '@/components/Logo/Logo'
import { processSvg } from '@/utils/processSvg'
import { logoSvg } from './logoSvg'
export const Logo = ({
withText = false,
color = '#000000',
height = 75,
textColor = '#000000',
}: LogoProps) => {
if (withText && typeof textColor === 'undefined') {
textColor = color
}
const viewBox = withText
? '0 0 711.13577 250.2845'
: '0 0 210 255'
const aspectRatio = withText
? 711.13577 / 250.2845
: 210 / 255
const width = height * aspectRatio
const inner = processSvg(logoSvg, { color, textColor, withText })
return (
<svg
width={width}
height={height}
viewBox={viewBox}
xmlns="http://www.w3.org/2000/svg"
dangerouslySetInnerHTML={{ __html: inner }}
/>
)
}
export default Logo

View file

@ -1,32 +0,0 @@
import { SiteConfig } from '@/config/site'
const config: SiteConfig = {
id: 'chemnitz',
name: 'Katholische Pfarrei Heilige Mutter Teresa Chemnitz',
shortName: 'Hl. Mutter Teresa',
description:
'Katholische Pfarrei Heilige Mutter Teresa in Chemnitz Gottesdienste, Veranstaltungen, Sakramente und Gemeindeleben.',
url: 'https://mutter-teresa-chemnitz.de',
email: 'kontakt@mutter-teresa-chemnitz.de',
keywords: [
'Katholische Pfarrei',
'Heilige Mutter Teresa',
'Chemnitz',
'Gottesdienst',
'Sakramente',
'Veranstaltungen',
'Gemeinde',
],
ogImage: '/og-logo.svg',
baseColor: '#016699',
shade1: '#67A3C2',
shade2: '#DDECF7',
shade3: '#eff6ff',
contrastColor: '#CE490F',
contrastShade1: '#DA764B',
defaultFont: 'lato',
headerFont: 'lato',
borderRadius: '0',
}
export default config

View file

@ -1,213 +0,0 @@
// Generated from logo_chemnitz.svg
export const logoSvg = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 711.13577 250.2845"
width="811.79883"
height="285.42059"
version="1.1"
id="svg6"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs10" />
<g id="logo">
<path
d="M 204.2641,6.2541719 89.150104,0.56886185 V 33.435375 l 43.208366,12.453538 -45.969796,4.981411 -4.0068,35.627944 35.952826,5.035567 0.32488,6.172613 -42.287886,-4.060929 0.43317,-52.792166 -25.93585,7.796994 1.57023,42.61276 -42.0713,-12.399394 -10.01698,4.43996 3.79021,29.780207 38.28109,0.64974 14.34864,14.1862 3.35705,91.28984 10.77501,30.42995 26.15244,-6.55165 1.24535,-13.96962 15.431546,-12.67012 -7.20139,-19.76322 -24.365616,-2.81558 3.30289,-40.28451 16.731066,-23.55341 93.56396,1.35366 V 99.168388 L 168.0947,83.195385 199.01196,83.628553 202.15242,54.985414 177.0829,36.684127 205.02215,33.43538 Z"
fill="none"
stroke="#111111"
stroke-width="1.08292"
stroke-linejoin="miter"
stroke-linecap="round"
id="path4"
style="fill:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:0,0;stroke-dashoffset:0" />
</g>
<g
aria-label="Katholische Pfarrei
Heilige Mutter Teresia
Chemnitz"
id="text"
style="font-weight:bold;font-size:49.1062px;line-height:1.3;font-family:Lato;-inkscape-font-specification:'Lato Bold';letter-spacing:0px;word-spacing:0px;fill:#134bd5;stroke:#000000;stroke-width:0">
<path
d="m 233.21819,62.42845 h 1.54684 q 0.93302,0 1.54685,-0.245531 0.61383,-0.270084 1.05578,-0.834805 l 9.79669,-12.399316 q 0.61383,-0.785699 1.27676,-1.080336 0.68749,-0.319191 1.71872,-0.319191 h 5.69632 l -11.95736,14.756414 q -1.05579,1.35042 -2.18523,1.915142 0.81025,0.294637 1.44863,0.834805 0.66294,0.515615 1.25221,1.374974 l 12.32566,16.622449 h -5.81909 q -1.17855,0 -1.76782,-0.31919 -0.56472,-0.343744 -0.95757,-0.982125 L 238.15336,68.640385 q -0.46651,-0.662934 -1.08034,-0.933018 -0.61382,-0.270084 -1.76782,-0.270084 h -2.08701 V 83.053055 H 226.6134 V 47.549271 h 6.60479 z"
style="opacity:1;fill:#000000"
id="path102767" />
<path
d="m 275.79323,83.053055 q -0.85936,0 -1.32587,-0.245531 -0.46651,-0.270084 -0.7366,-1.055784 l -0.54016,-1.792376 q -0.95757,0.859359 -1.86604,1.522292 -0.90846,0.638381 -1.89059,1.080337 -0.98212,0.441956 -2.11156,0.662934 -1.10489,0.220977 -2.45531,0.220977 -1.59596,0 -2.94638,-0.417402 -1.35042,-0.441956 -2.33254,-1.301315 -0.98213,-0.859358 -1.52229,-2.136119 -0.54017,-1.276762 -0.54017,-2.970926 0,-1.424079 0.73659,-2.799053 0.76115,-1.399527 2.50442,-2.504416 1.74327,-1.129443 4.64053,-1.866036 2.89727,-0.736593 7.21862,-0.834805 v -1.473186 q 0,-2.52897 -1.08034,-3.732072 -1.08034,-1.227655 -3.11824,-1.227655 -1.47319,0 -2.45531,0.343744 -0.95758,0.343743 -1.69417,0.785699 -0.73659,0.417403 -1.35042,0.761146 -0.58927,0.343743 -1.32587,0.343743 -0.63838,0 -1.08033,-0.31919 -0.44196,-0.343743 -0.71204,-0.785699 l -1.08034,-1.939695 q 4.3459,-3.977602 10.45962,-3.977602 2.20978,0 3.95305,0.736593 1.74327,0.71204 2.94637,2.013354 1.2031,1.276761 1.81693,3.069138 0.63838,1.792376 0.63838,3.928496 v 15.910409 z m -9.0601,-3.781178 q 1.86604,0 3.21646,-0.662933 1.37497,-0.687487 2.67629,-2.062461 v -4.247686 q -2.65174,0.122765 -4.44412,0.466509 -1.76782,0.31919 -2.84816,0.834805 -1.08033,0.515615 -1.54684,1.203102 -0.46651,0.687487 -0.46651,1.497739 0,1.595952 0.93302,2.283439 0.95757,0.687486 2.47986,0.687486 z"
style="fill:#000000;opacity:1"
id="path102769" />
<path
d="m 292.2928,83.445904 q -3.29012,0 -5.05794,-1.841482 -1.74327,-1.866036 -1.74327,-5.131598 V 62.403897 h -2.57807 q -0.49107,0 -0.83481,-0.31919 -0.34374,-0.31919 -0.34374,-0.957571 v -2.406204 l 4.05126,-0.662934 1.27676,-6.874868 q 0.12277,-0.491062 0.46651,-0.761146 0.34374,-0.270084 0.88391,-0.270084 h 3.1428 v 7.930652 h 6.72755 v 4.321345 h -6.72755 v 13.651524 q 0,1.178549 0.56472,1.841483 0.58927,0.662933 1.59595,0.662933 0.56472,0 0.93302,-0.122765 0.39285,-0.147319 0.66293,-0.294637 0.29464,-0.147319 0.51562,-0.270084 0.22097,-0.147319 0.44195,-0.147319 0.27009,0 0.44196,0.147319 0.17187,0.122765 0.3683,0.392849 l 1.81692,2.946372 q -1.32586,1.10489 -3.04458,1.669611 -1.71872,0.564721 -3.5602,0.564721 z"
style="fill:#000000;opacity:1"
id="path102771" />
<path
d="M 302.16313,83.053055 V 46.567147 h 6.06462 v 14.019821 q 1.47319,-1.399527 3.24101,-2.258885 1.76782,-0.859359 4.14947,-0.859359 2.06246,0 3.65842,0.71204 1.59595,0.687487 2.65173,1.964248 1.08034,1.252208 1.6205,3.020031 0.56473,1.74327 0.56473,3.854837 v 16.033175 h -6.06462 V 67.01988 q 0,-2.307991 -1.05578,-3.560199 -1.05579,-1.276762 -3.21646,-1.276762 -1.5714,0 -2.94637,0.71204 -1.37497,0.71204 -2.60263,1.939695 v 18.218401 z"
style="fill:#000000;opacity:1"
id="path102773" />
<path
d="m 341.0061,57.468724 q 2.79905,0 5.08249,0.908465 2.30799,0.908464 3.92849,2.578075 1.64506,1.669611 2.52897,4.075815 0.88391,2.406204 0.88391,5.377129 0,2.995478 -0.88391,5.401682 -0.88391,2.406204 -2.52897,4.100368 -1.6205,1.694164 -3.92849,2.602629 -2.28344,0.908464 -5.08249,0.908464 -2.82361,0 -5.1316,-0.908464 -2.30799,-0.908465 -3.95305,-2.602629 -1.62051,-1.694164 -2.52897,-4.100368 -0.88391,-2.406204 -0.88391,-5.401682 0,-2.970925 0.88391,-5.377129 0.90846,-2.406204 2.52897,-4.075815 1.64506,-1.669611 3.95305,-2.578075 2.30799,-0.908465 5.1316,-0.908465 z m 0,21.287538 q 3.14279,0 4.64053,-2.111566 1.52229,-2.111567 1.52229,-6.187382 0,-4.075814 -1.52229,-6.211934 -1.49774,-2.13612 -4.64053,-2.13612 -3.19191,0 -4.73875,2.160673 -1.52229,2.13612 -1.52229,6.187381 0,4.051262 1.52229,6.187382 1.54684,2.111566 4.73875,2.111566 z"
style="fill:#000000;opacity:1"
id="path102775" />
<path
d="m 364.20874,46.567147 v 36.485908 h -6.06462 V 46.567147 Z"
style="fill:#000000;opacity:1"
id="path102777" />
<path
d="m 376.55889,57.861574 v 25.191481 h -6.08917 V 57.861574 Z m 0.8348,-7.341377 q 0,0.785699 -0.31919,1.473186 -0.31919,0.687486 -0.85935,1.203101 -0.51562,0.515616 -1.22766,0.834806 -0.71204,0.294637 -1.52229,0.294637 -0.7857,0 -1.49774,-0.294637 -0.68749,-0.31919 -1.2031,-0.834806 -0.51562,-0.515615 -0.83481,-1.203101 -0.29464,-0.687487 -0.29464,-1.473186 0,-0.810253 0.29464,-1.522293 0.31919,-0.71204 0.83481,-1.227655 0.51561,-0.515615 1.2031,-0.810252 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.294637 1.22766,0.810252 0.54016,0.515615 0.85935,1.227655 0.31919,0.71204 0.31919,1.522293 z"
style="fill:#000000;opacity:1"
id="path102779" />
<path
d="m 398.1165,62.772194 q -0.24553,0.392849 -0.51562,0.564721 -0.27008,0.147319 -0.68748,0.147319 -0.44196,0 -0.95758,-0.245531 -0.49106,-0.245531 -1.15399,-0.540169 -0.66293,-0.31919 -1.52229,-0.564721 -0.83481,-0.245531 -1.9888,-0.245531 -1.79238,0 -2.82361,0.761146 -1.00668,0.761146 -1.00668,1.988801 0,0.810253 0.51562,1.374974 0.54017,0.540168 1.39952,0.957571 0.88392,0.417403 1.9888,0.761146 1.10489,0.31919 2.23434,0.71204 1.15399,0.39285 2.25888,0.908465 1.10489,0.491062 1.96425,1.276761 0.88391,0.761146 1.39953,1.841482 0.54017,1.080337 0.54017,2.602629 0,1.81693 -0.66294,3.363775 -0.63838,1.522292 -1.91514,2.651735 -1.27676,1.104889 -3.16735,1.74327 -1.86604,0.613827 -4.32135,0.613827 -1.30131,0 -2.55352,-0.245531 -1.22765,-0.220977 -2.38165,-0.63838 -1.12944,-0.417403 -2.11157,-0.982124 -0.95757,-0.564722 -1.69416,-1.227655 l 1.39953,-2.307992 q 0.27008,-0.417402 0.63838,-0.63838 0.36829,-0.220978 0.93302,-0.220978 0.56472,0 1.05578,0.31919 0.51561,0.31919 1.17855,0.687487 0.66293,0.368296 1.54684,0.687487 0.90847,0.31919 2.28344,0.31919 1.08034,0 1.84148,-0.245531 0.7857,-0.270084 1.27676,-0.687487 0.51562,-0.417403 0.7366,-0.957571 0.24553,-0.564721 0.24553,-1.153995 0,-0.883912 -0.54017,-1.448633 -0.51561,-0.564722 -1.39953,-0.982124 -0.85935,-0.417403 -1.9888,-0.736593 -1.10489,-0.343744 -2.28344,-0.736593 -1.15399,-0.39285 -2.28343,-0.908465 -1.10489,-0.540168 -1.98881,-1.350421 -0.85935,-0.810252 -1.39952,-1.988801 -0.51562,-1.178549 -0.51562,-2.84816 0,-1.546845 0.61383,-2.946372 0.61383,-1.399526 1.79238,-2.430757 1.2031,-1.055783 2.97092,-1.66961 1.79238,-0.638381 4.12492,-0.638381 2.60263,0 4.73875,0.859359 2.13612,0.859358 3.5602,2.258885 z"
style="fill:#000000;opacity:1"
id="path102781" />
<path
d="m 422.37491,63.189596 q -0.27009,0.343744 -0.54017,0.540169 -0.24553,0.196424 -0.73659,0.196424 -0.46651,0 -0.90847,-0.270084 -0.44195,-0.294637 -1.05578,-0.63838 -0.61383,-0.368297 -1.47319,-0.638381 -0.8348,-0.294637 -2.08701,-0.294637 -1.59595,0 -2.79905,0.589274 -1.20311,0.564722 -2.01336,1.645058 -0.7857,1.080336 -1.17855,2.627182 -0.39285,1.522292 -0.39285,3.461987 0,2.013354 0.41741,3.584753 0.44195,1.571398 1.2522,2.651735 0.81026,1.055783 1.96425,1.620504 1.154,0.540168 2.60263,0.540168 1.44863,0 2.33255,-0.343743 0.90846,-0.368297 1.52229,-0.785699 0.61383,-0.441956 1.05578,-0.785699 0.46651,-0.368297 1.03123,-0.368297 0.73659,0 1.10489,0.564721 l 1.74327,2.209779 q -1.00668,1.178549 -2.18523,1.988802 -1.17854,0.785699 -2.45531,1.276761 -1.2522,0.466509 -2.60262,0.662934 -1.32587,0.196424 -2.65174,0.196424 -2.33254,0 -4.395,-0.859358 -2.06246,-0.883912 -3.60931,-2.553523 -1.54684,-1.669611 -2.45531,-4.075814 -0.88391,-2.430757 -0.88391,-5.524448 0,-2.7745 0.7857,-5.131598 0.81025,-2.381651 2.3571,-4.100368 1.54684,-1.74327 3.83028,-2.725394 2.28344,-0.982124 5.25436,-0.982124 2.82361,0 4.93518,0.908465 2.13612,0.908464 3.83028,2.602628 z"
style="fill:#000000;opacity:1"
id="path102783" />
<path
d="M 427.99749,83.053055 V 46.567147 h 6.06462 v 14.019821 q 1.47318,-1.399527 3.24101,-2.258885 1.76782,-0.859359 4.14947,-0.859359 2.06246,0 3.65841,0.71204 1.59596,0.687487 2.65174,1.964248 1.08033,1.252208 1.6205,3.020031 0.56472,1.74327 0.56472,3.854837 v 16.033175 h -6.06461 V 67.01988 q 0,-2.307991 -1.05578,-3.560199 -1.05579,-1.276762 -3.21646,-1.276762 -1.5714,0 -2.94637,0.71204 -1.37498,0.71204 -2.60263,1.939695 v 18.218401 z"
style="fill:#000000;opacity:1"
id="path102785" />
<path
d="m 466.42306,57.468724 q 2.38165,0 4.395,0.761146 2.01336,0.761146 3.46199,2.234332 1.44863,1.448633 2.25889,3.584753 0.8348,2.111567 0.8348,4.836961 0,1.374973 -0.29464,1.866035 -0.29463,0.466509 -1.12944,0.466509 h -15.59122 q 0.14732,1.939695 0.68749,3.363775 0.54017,1.399527 1.42408,2.332545 0.88391,0.908464 2.08701,1.374973 1.22766,0.441956 2.70084,0.441956 1.47319,0 2.52897,-0.343743 1.08034,-0.343744 1.86604,-0.761146 0.81025,-0.417403 1.39953,-0.761147 0.61382,-0.343743 1.17855,-0.343743 0.76114,0 1.12944,0.564721 l 1.74327,2.209779 q -1.00668,1.178549 -2.25889,1.988802 -1.25221,0.785699 -2.62718,1.276761 -1.35042,0.466509 -2.7745,0.662934 -1.39953,0.196424 -2.72539,0.196424 -2.62719,0 -4.88607,-0.859358 -2.25889,-0.883912 -3.9285,-2.578076 -1.66961,-1.718717 -2.62718,-4.223133 -0.95757,-2.528969 -0.95757,-5.843638 0,-2.578076 0.83481,-4.836961 0.8348,-2.283438 2.38165,-3.953049 1.5714,-1.694164 3.80573,-2.676288 2.25888,-0.982124 5.08249,-0.982124 z m 0.12276,4.345899 q -2.65173,0 -4.14947,1.497739 -1.49774,1.497739 -1.91514,4.247686 h 11.44174 q 0,-1.178548 -0.34374,-2.209779 -0.31919,-1.055783 -0.98212,-1.841482 -0.66294,-0.785699 -1.69417,-1.227655 -1.00667,-0.466509 -2.3571,-0.466509 z"
style="fill:#000000;opacity:1"
id="path102787" />
<path
d="m 501.41106,70.555527 v 12.497528 h -6.60479 V 47.549271 h 11.53996 q 3.5602,0 6.16283,0.834806 2.60263,0.834805 4.29679,2.332544 1.69417,1.497739 2.50442,3.584753 0.8348,2.087014 0.8348,4.566877 0,2.578075 -0.85935,4.738748 -0.85936,2.13612 -2.57808,3.682965 -1.71872,1.546846 -4.32135,2.406204 -2.57807,0.859359 -6.04006,0.859359 z m 0,-5.156152 h 4.93517 q 1.81693,0 3.16735,-0.441955 1.35042,-0.466509 2.23433,-1.301315 0.90847,-0.859358 1.35042,-2.06246 0.44196,-1.227655 0.44196,-2.725394 0,-1.42408 -0.44196,-2.578076 -0.44195,-1.153996 -1.32586,-1.964248 -0.88391,-0.810252 -2.23433,-1.227655 -1.35043,-0.441956 -3.19191,-0.441956 h -4.93517 z"
style="fill:#000000;opacity:1"
id="path102789" />
<path
d="M 526.01323,83.053055 V 62.42845 L 523.828,62.084707 q -0.71204,-0.147319 -1.154,-0.491062 -0.4174,-0.368297 -0.4174,-1.03123 v -2.479863 h 3.75663 v -1.866036 q 0,-2.160673 0.63838,-3.87939 0.66293,-1.718717 1.86603,-2.921819 1.22766,-1.203102 2.97093,-1.841483 1.74327,-0.63838 3.92849,-0.63838 1.74327,0 3.24101,0.466509 l -0.12276,3.044584 q -0.0246,0.343744 -0.19643,0.564722 -0.17187,0.196424 -0.46651,0.31919 -0.27008,0.09821 -0.63838,0.147318 -0.36829,0.02455 -0.7857,0.02455 -1.08033,0 -1.93969,0.245531 -0.83481,0.220977 -1.42408,0.810252 -0.58928,0.564721 -0.90847,1.522292 -0.29463,0.933018 -0.29463,2.332545 v 1.669611 h 6.55567 v 4.321345 h -6.35925 v 20.649158 z"
style="fill:#000000;opacity:1"
id="path102791" />
<path
d="m 558.32509,83.053055 q -0.85936,0 -1.32587,-0.245531 -0.46651,-0.270084 -0.73659,-1.055784 l -0.54017,-1.792376 q -0.95757,0.859359 -1.86604,1.522292 -0.90846,0.638381 -1.89059,1.080337 -0.98212,0.441956 -2.11156,0.662934 -1.10489,0.220977 -2.45531,0.220977 -1.59596,0 -2.94638,-0.417402 -1.35042,-0.441956 -2.33254,-1.301315 -0.98212,-0.859358 -1.52229,-2.136119 -0.54017,-1.276762 -0.54017,-2.970926 0,-1.424079 0.73659,-2.799053 0.76115,-1.399527 2.50442,-2.504416 1.74327,-1.129443 4.64053,-1.866036 2.89727,-0.736593 7.21862,-0.834805 v -1.473186 q 0,-2.52897 -1.08034,-3.732072 -1.08034,-1.227655 -3.11824,-1.227655 -1.47319,0 -2.45531,0.343744 -0.95758,0.343743 -1.69417,0.785699 -0.73659,0.417403 -1.35042,0.761146 -0.58927,0.343743 -1.32587,0.343743 -0.63838,0 -1.08033,-0.31919 -0.44196,-0.343743 -0.71204,-0.785699 l -1.08034,-1.939695 q 4.3459,-3.977602 10.45962,-3.977602 2.20978,0 3.95305,0.736593 1.74327,0.71204 2.94637,2.013354 1.2031,1.276761 1.81693,3.069138 0.63838,1.792376 0.63838,3.928496 v 15.910409 z m -9.0601,-3.781178 q 1.86604,0 3.21646,-0.662933 1.37497,-0.687487 2.67629,-2.062461 v -4.247686 q -2.65174,0.122765 -4.44412,0.466509 -1.76782,0.31919 -2.84816,0.834805 -1.08033,0.515615 -1.54684,1.203102 -0.46651,0.687487 -0.46651,1.497739 0,1.595952 0.93302,2.283439 0.95757,0.687486 2.47986,0.687486 z"
style="fill:#000000;opacity:1"
id="path102793" />
<path
d="M 566.77134,83.053055 V 57.861574 h 3.5602 q 0.93302,0 1.30132,0.343743 0.36829,0.31919 0.49106,1.178549 l 0.34374,2.84816 q 1.2031,-2.258886 2.82361,-3.535647 1.6205,-1.301314 3.83028,-1.301314 1.74327,0 2.79905,0.761146 l -0.39284,4.542323 q -0.12277,0.441956 -0.3683,0.638381 -0.22098,0.171872 -0.61383,0.171872 -0.3683,0 -1.10489,-0.122766 -0.71204,-0.122765 -1.39952,-0.122765 -1.00668,0 -1.79238,0.294637 -0.7857,0.294637 -1.42408,0.859358 -0.61383,0.540169 -1.10489,1.325868 -0.46651,0.785699 -0.88391,1.792376 v 15.51756 z"
style="fill:#000000;opacity:1"
id="path102795" />
<path
d="M 585.08793,83.053055 V 57.861574 h 3.5602 q 0.93302,0 1.30132,0.343743 0.36829,0.31919 0.49106,1.178549 l 0.34374,2.84816 q 1.2031,-2.258886 2.82361,-3.535647 1.6205,-1.301314 3.83028,-1.301314 1.74327,0 2.79905,0.761146 l -0.39285,4.542323 q -0.12276,0.441956 -0.36829,0.638381 -0.22098,0.171872 -0.61383,0.171872 -0.3683,0 -1.10489,-0.122766 -0.71204,-0.122765 -1.39953,-0.122765 -1.00667,0 -1.79237,0.294637 -0.7857,0.294637 -1.42408,0.859358 -0.61383,0.540169 -1.10489,1.325868 -0.46651,0.785699 -0.88391,1.792376 v 15.51756 z"
style="fill:#000000;opacity:1"
id="path102797" />
<path
d="m 613.4221,57.468724 q 2.38165,0 4.395,0.761146 2.01336,0.761146 3.46199,2.234332 1.44863,1.448633 2.25889,3.584753 0.8348,2.111567 0.8348,4.836961 0,1.374973 -0.29464,1.866035 -0.29463,0.466509 -1.12944,0.466509 h -15.59122 q 0.14732,1.939695 0.68749,3.363775 0.54017,1.399527 1.42408,2.332545 0.88391,0.908464 2.08701,1.374973 1.22766,0.441956 2.70084,0.441956 1.47319,0 2.52897,-0.343743 1.08034,-0.343744 1.86604,-0.761146 0.81025,-0.417403 1.39953,-0.761147 0.61382,-0.343743 1.17854,-0.343743 0.76115,0 1.12945,0.564721 l 1.74327,2.209779 q -1.00668,1.178549 -2.25889,1.988802 -1.25221,0.785699 -2.62718,1.276761 -1.35042,0.466509 -2.7745,0.662934 -1.39953,0.196424 -2.72539,0.196424 -2.62719,0 -4.88607,-0.859358 -2.25889,-0.883912 -3.9285,-2.578076 -1.66961,-1.718717 -2.62718,-4.223133 -0.95757,-2.528969 -0.95757,-5.843638 0,-2.578076 0.8348,-4.836961 0.83481,-2.283438 2.38166,-3.953049 1.57139,-1.694164 3.80573,-2.676288 2.25888,-0.982124 5.08249,-0.982124 z m 0.12276,4.345899 q -2.65173,0 -4.14947,1.497739 -1.49774,1.497739 -1.91514,4.247686 h 11.44174 q 0,-1.178548 -0.34374,-2.209779 -0.31919,-1.055783 -0.98212,-1.841482 -0.66294,-0.785699 -1.69417,-1.227655 -1.00668,-0.466509 -2.3571,-0.466509 z"
style="fill:#000000;opacity:1"
id="path102799" />
<path
d="m 635.20061,57.861574 v 25.191481 h -6.08917 V 57.861574 Z m 0.83481,-7.341377 q 0,0.785699 -0.31919,1.473186 -0.31919,0.687486 -0.85936,1.203101 -0.51562,0.515616 -1.22766,0.834806 -0.71204,0.294637 -1.52229,0.294637 -0.7857,0 -1.49774,-0.294637 -0.68748,-0.31919 -1.2031,-0.834806 -0.51561,-0.515615 -0.8348,-1.203101 -0.29464,-0.687487 -0.29464,-1.473186 0,-0.810253 0.29464,-1.522293 0.31919,-0.71204 0.8348,-1.227655 0.51562,-0.515615 1.2031,-0.810252 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.294637 1.22766,0.810252 0.54017,0.515615 0.85936,1.227655 0.31919,0.71204 0.31919,1.522293 z"
style="fill:#000000;opacity:1"
id="path102801" />
<path
d="m 256.54363,146.89111 h -6.62933 v -15.51756 h -16.67156 v 15.51756 h -6.62934 v -35.50378 h 6.62934 v 15.27203 h 16.67156 v -15.27203 h 6.62933 z"
style="opacity:1;fill:#000000"
id="path102803" />
<path
d="m 273.46058,121.30678 q 2.38166,0 4.39501,0.76115 2.01335,0.76115 3.46199,2.23433 1.44863,1.44863 2.25888,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54016,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22765,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86603,-0.76114 0.81026,-0.4174 1.39953,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76115,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00667,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39953,0.19642 -2.7254,0.19642 -2.62718,0 -4.88607,-0.85936 -2.25888,-0.88391 -3.92849,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.8348,-4.83697 0.83481,-2.28343 2.38165,-3.95304 1.5714,-1.69417 3.80573,-2.67629 2.25889,-0.98213 5.08249,-0.98213 z m 0.12277,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91515,4.24769 h 11.44175 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05578 -0.98213,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102805" />
<path
d="m 295.23911,121.69963 v 25.19148 h -6.08917 v -25.19148 z m 0.83481,-7.34137 q 0,0.78569 -0.31919,1.47318 -0.31919,0.68749 -0.85936,1.2031 -0.51562,0.51562 -1.22766,0.83481 -0.71204,0.29464 -1.52229,0.29464 -0.7857,0 -1.49774,-0.29464 -0.68749,-0.31919 -1.2031,-0.83481 -0.51562,-0.51561 -0.83481,-1.2031 -0.29463,-0.68749 -0.29463,-1.47318 0,-0.81026 0.29463,-1.5223 0.31919,-0.71204 0.83481,-1.22765 0.51561,-0.51562 1.2031,-0.81025 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.29463 1.22766,0.81025 0.54017,0.51561 0.85936,1.22765 0.31919,0.71204 0.31919,1.5223 z"
style="opacity:1;fill:#000000"
id="path102807" />
<path
d="m 307.56475,110.40521 v 36.4859 h -6.06461 v -36.4859 z"
style="opacity:1;fill:#000000"
id="path102809" />
<path
d="m 319.91491,121.69963 v 25.19148 h -6.08917 v -25.19148 z m 0.8348,-7.34137 q 0,0.78569 -0.31919,1.47318 -0.31919,0.68749 -0.85936,1.2031 -0.51561,0.51562 -1.22765,0.83481 -0.71204,0.29464 -1.52229,0.29464 -0.7857,0 -1.49774,-0.29464 -0.68749,-0.31919 -1.2031,-0.83481 -0.51562,-0.51561 -0.83481,-1.2031 -0.29464,-0.68749 -0.29464,-1.47318 0,-0.81026 0.29464,-1.5223 0.31919,-0.71204 0.83481,-1.22765 0.51561,-0.51562 1.2031,-0.81025 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.29463 1.22765,0.81025 0.54017,0.51561 0.85936,1.22765 0.31919,0.71204 0.31919,1.5223 z"
style="opacity:1;fill:#000000"
id="path102811" />
<path
d="m 335.30969,121.25768 q 1.6205,0 3.02003,0.34374 1.42408,0.31919 2.62718,0.95757 h 7.24317 v 2.25889 q 0,1.08033 -1.30132,1.32586 l -2.25888,0.41741 q 0.24553,0.63838 0.36829,1.35042 0.14732,0.71204 0.14732,1.49774 0,1.86603 -0.76115,3.38832 -0.73659,1.49774 -2.06246,2.55353 -1.32586,1.05578 -3.14279,1.64505 -1.79238,0.56473 -3.87939,0.56473 -1.42408,0 -2.7745,-0.27009 -1.17855,0.71204 -1.17855,1.59595 0,0.76115 0.68748,1.12945 0.71204,0.34374 1.86604,0.49106 1.154,0.14732 2.62718,0.19642 1.47319,0.0246 3.02003,0.14732 1.54685,0.12277 3.02004,0.44196 1.47318,0.29463 2.62718,0.95757 1.15399,0.66293 1.84148,1.81693 0.71204,1.12944 0.71204,2.92182 0,1.66961 -0.83481,3.24101 -0.81025,1.57139 -2.38165,2.79905 -1.54684,1.22765 -3.83028,1.96425 -2.25889,0.76114 -5.15615,0.76114 -2.84816,0 -4.95973,-0.56472 -2.11156,-0.54017 -3.51109,-1.47318 -1.39953,-0.90847 -2.08701,-2.11157 -0.68749,-1.2031 -0.68749,-2.50442 0,-1.74327 1.05578,-2.94637 1.08034,-1.2031 2.92182,-1.91514 -0.98212,-0.51562 -1.5714,-1.37497 -0.58927,-0.85936 -0.58927,-2.25889 0,-0.56472 0.19642,-1.154 0.19643,-0.61382 0.58928,-1.2031 0.4174,-0.58927 1.03123,-1.10489 0.63838,-0.54017 1.47318,-0.95757 -1.91514,-1.03123 -3.02003,-2.74995 -1.08033,-1.71871 -1.08033,-4.0267 0,-1.86604 0.73659,-3.36378 0.76114,-1.52229 2.08701,-2.57807 1.35042,-1.08034 3.16735,-1.64506 1.84148,-0.56472 4.00216,-0.56472 z m 6.85031,26.76288 q 0,-0.7366 -0.44195,-1.17855 -0.44196,-0.46651 -1.20311,-0.7366 -0.76114,-0.27008 -1.79237,-0.39284 -1.00668,-0.12277 -2.16067,-0.17188 -1.12945,-0.0737 -2.3571,-0.12276 -1.2031,-0.0491 -2.3571,-0.19643 -1.00668,0.56472 -1.64506,1.32587 -0.61383,0.76115 -0.61383,1.76782 0,0.66294 0.3192,1.22766 0.34374,0.58927 1.05578,1.00668 0.73659,0.4174 1.89059,0.63838 1.15399,0.24553 2.8236,0.24553 1.69417,0 2.92182,-0.27009 1.22766,-0.24553 2.01336,-0.71204 0.81025,-0.44195 1.17855,-1.08033 0.36829,-0.61383 0.36829,-1.35042 z m -6.85031,-14.33901 q 1.12944,0 1.96425,-0.29464 0.8348,-0.31919 1.37497,-0.85936 0.56472,-0.54017 0.8348,-1.30131 0.29464,-0.76115 0.29464,-1.66962 0,-1.86603 -1.12944,-2.94637 -1.10489,-1.10489 -3.33922,-1.10489 -2.23433,0 -3.36378,1.10489 -1.10489,1.08034 -1.10489,2.94637 0,0.88392 0.27009,1.64506 0.29463,0.76115 0.8348,1.32587 0.56472,0.54017 1.39953,0.85936 0.85936,0.29464 1.96425,0.29464 z"
style="opacity:1;fill:#000000"
id="path102813" />
<path
d="m 362.31806,121.30678 q 2.38165,0 4.395,0.76115 2.01336,0.76115 3.46199,2.23433 1.44863,1.44863 2.25888,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54017,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22766,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86604,-0.76114 0.81025,-0.4174 1.39952,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76115,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00667,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39953,0.19642 -2.7254,0.19642 -2.62718,0 -4.88606,-0.85936 -2.25889,-0.88391 -3.9285,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.8348,-4.83697 0.83481,-2.28343 2.38165,-3.95304 1.5714,-1.69417 3.80573,-2.67629 2.25889,-0.98213 5.0825,-0.98213 z m 0.12276,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91514,4.24769 h 11.44174 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05578 -0.98213,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102815" />
<path
d="m 408.52683,132.15925 q 0.4174,0.7857 0.76115,1.64506 0.36829,0.83481 0.71204,1.69417 0.34374,-0.90847 0.71204,-1.74327 0.36829,-0.85936 0.7857,-1.64506 l 10.48417,-19.66704 q 0.19642,-0.36829 0.4174,-0.58927 0.22098,-0.22098 0.46651,-0.31919 0.27009,-0.0982 0.58928,-0.12277 0.31919,-0.0245 0.76114,-0.0245 h 4.98428 v 35.50378 h -5.81908 v -22.93259 q 0,-0.63838 0.0245,-1.39953 0.0491,-0.76114 0.12276,-1.54684 l -10.7297,20.13354 q -0.76115,1.44863 -2.33254,1.44863 h -0.93302 q -1.5714,0 -2.33255,-1.44863 l -10.85247,-20.2072 q 0.0737,0.81025 0.12277,1.59595 0.0491,0.76114 0.0491,1.42408 v 22.93259 h -5.81908 v -35.50378 h 4.98428 q 0.44195,0 0.76114,0.0245 0.3192,0.0246 0.56473,0.12277 0.27008,0.0982 0.4665,0.31919 0.22098,0.22098 0.41741,0.58927 l 10.63149,19.71614 z"
style="opacity:1;fill:#000000"
id="path102817" />
<path
d="m 441.50161,121.69963 v 16.00862 q 0,2.308 1.05578,3.58476 1.08034,1.25221 3.21645,1.25221 1.5714,0 2.94638,-0.68749 1.37497,-0.71204 2.60263,-1.9397 v -18.2184 h 6.06461 v 25.19148 h -3.70752 q -1.2031,0 -1.52229,-1.10489 l -0.4174,-2.01335 q -0.7857,0.7857 -1.62051,1.44863 -0.8348,0.63838 -1.79237,1.10489 -0.95757,0.46651 -2.03791,0.71204 -1.08034,0.24553 -2.3571,0.24553 -2.06246,0 -3.65841,-0.68748 -1.5714,-0.71204 -2.65173,-1.9888 -1.08034,-1.27677 -1.64506,-3.02004 -0.54017,-1.76782 -0.54017,-3.87939 v -16.00862 z"
style="opacity:1;fill:#000000"
id="path102819" />
<path
d="m 471.77553,147.28396 q -3.29012,0 -5.05794,-1.84148 -1.74327,-1.86603 -1.74327,-5.1316 v -14.06892 h -2.57808 q -0.49106,0 -0.8348,-0.31919 -0.34375,-0.31919 -0.34375,-0.95757 v -2.40621 l 4.05127,-0.66293 1.27676,-6.87487 q 0.12276,-0.49106 0.46651,-0.76115 0.34374,-0.27008 0.88391,-0.27008 h 3.14279 v 7.93065 h 10.48418 l 1.30131,-6.89942 q 0.12277,-0.49106 0.44196,-0.76115 0.34374,-0.27008 0.90846,-0.27008 h 3.11825 v 7.93065 h 6.72755 v 4.32135 h -6.72755 v 13.65152 q 0,1.17855 0.58927,1.84148 0.58928,0.66294 1.59595,0.66294 0.54017,0 0.93302,-0.12277 0.39285,-0.14732 0.66293,-0.29464 0.29464,-0.14731 0.51562,-0.27008 0.22098,-0.14732 0.44196,-0.14732 0.27008,0 0.44195,0.14732 0.17187,0.12277 0.3683,0.39285 l 1.81693,2.94637 q -1.32587,1.10489 -3.04459,1.66961 -1.71871,0.56472 -3.5602,0.56472 -3.29011,0 -5.05794,-1.84148 -1.76782,-1.86603 -1.76782,-5.1316 v -14.06892 h -10.18954 v 13.65152 q 0,1.17855 0.56473,1.84148 0.58927,0.66294 1.59595,0.66294 0.56472,0 0.93302,-0.12277 0.39284,-0.14732 0.66293,-0.29464 0.29464,-0.14731 0.51561,-0.27008 0.22098,-0.14732 0.44196,-0.14732 0.27008,0 0.44196,0.14732 0.17187,0.12277 0.36829,0.39285 l 1.81693,2.94637 q -1.32587,1.10489 -3.04458,1.66961 -1.71872,0.56472 -3.5602,0.56472 z"
style="opacity:1;fill:#000000"
id="path102821" />
<path
d="m 508.62968,121.30678 q 2.38165,0 4.395,0.76115 2.01336,0.76115 3.46199,2.23433 1.44863,1.44863 2.25889,3.58475 0.8348,2.11157 0.8348,4.83696 0,1.37498 -0.29464,1.86604 -0.29463,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54017,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22766,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86604,-0.76114 0.81025,-0.4174 1.39953,-0.76115 0.61382,-0.34374 1.17854,-0.34374 0.76115,0 1.12945,0.56472 l 1.74327,2.20978 q -1.00668,1.17855 -2.25889,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39953,0.19642 -2.72539,0.19642 -2.62719,0 -4.88607,-0.85936 -2.25889,-0.88391 -3.9285,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.83481,-4.83697 0.8348,-2.28343 2.38165,-3.95304 1.57139,-1.69417 3.80573,-2.67629 2.25888,-0.98213 5.08249,-0.98213 z m 0.12276,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91514,4.24769 h 11.44174 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05578 -0.98212,-1.84148 -0.66294,-0.7857 -1.69417,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102823" />
<path
d="m 524.12263,146.89111 v -25.19148 h 3.5602 q 0.93302,0 1.30131,0.34375 0.3683,0.31919 0.49107,1.17855 l 0.34374,2.84815 q 1.2031,-2.25888 2.82361,-3.53564 1.6205,-1.30132 3.83028,-1.30132 1.74327,0 2.79905,0.76115 l -0.39285,4.54232 q -0.12276,0.44196 -0.36829,0.63838 -0.22098,0.17188 -0.61383,0.17188 -0.3683,0 -1.10489,-0.12277 -0.71204,-0.12277 -1.39953,-0.12277 -1.00667,0 -1.79237,0.29464 -0.7857,0.29464 -1.42408,0.85936 -0.61383,0.54017 -1.10489,1.32587 -0.46651,0.7857 -0.88391,1.79237 v 15.51756 z"
style="opacity:1;fill:#000000"
id="path102825" />
<path
d="m 577.59905,111.38733 v 5.42624 H 566.8939 v 30.07754 h -6.60479 v -30.07754 h -10.70515 v -5.42624 z"
style="opacity:1;fill:#000000"
id="path102827" />
<path
d="m 586.11884,121.30678 q 2.38166,0 4.39501,0.76115 2.01335,0.76115 3.46199,2.23433 1.44863,1.44863 2.25888,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54016,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22765,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86604,-0.76114 0.81025,-0.4174 1.39952,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76115,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00667,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39953,0.19642 -2.7254,0.19642 -2.62718,0 -4.88607,-0.85936 -2.25888,-0.88391 -3.92849,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.8348,-4.83697 0.83481,-2.28343 2.38165,-3.95304 1.5714,-1.69417 3.80573,-2.67629 2.25889,-0.98213 5.08249,-0.98213 z m 0.12277,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91515,4.24769 h 11.44175 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05578 -0.98213,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102829" />
<path
d="m 601.6118,146.89111 v -25.19148 h 3.5602 q 0.93301,0 1.30131,0.34375 0.3683,0.31919 0.49106,1.17855 l 0.34375,2.84815 q 1.2031,-2.25888 2.8236,-3.53564 1.62051,-1.30132 3.83029,-1.30132 1.74327,0 2.79905,0.76115 l -0.39285,4.54232 q -0.12277,0.44196 -0.3683,0.63838 -0.22097,0.17188 -0.61382,0.17188 -0.3683,0 -1.10489,-0.12277 -0.71204,-0.12277 -1.39953,-0.12277 -1.00668,0 -1.79238,0.29464 -0.7857,0.29464 -1.42408,0.85936 -0.61382,0.54017 -1.10489,1.32587 -0.46651,0.7857 -0.88391,1.79237 v 15.51756 z"
style="opacity:1;fill:#000000"
id="path102831" />
<path
d="m 629.94596,121.30678 q 2.38165,0 4.39501,0.76115 2.01335,0.76115 3.46198,2.23433 1.44864,1.44863 2.25889,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68748,3.36377 0.54017,1.39953 1.42408,2.33255 0.88392,0.90846 2.08702,1.37497 1.22765,0.44196 2.70084,0.44196 1.47318,0 2.52897,-0.34375 1.08033,-0.34374 1.86603,-0.76114 0.81026,-0.4174 1.39953,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76114,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00668,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62719,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39952,0.19642 -2.72539,0.19642 -2.62718,0 -4.88607,-0.85936 -2.25888,-0.88391 -3.92849,-2.57807 -1.66961,-1.71872 -2.62719,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.83481,-4.83697 0.8348,-2.28343 2.38165,-3.95304 1.5714,-1.69417 3.80573,-2.67629 2.25889,-0.98213 5.08249,-0.98213 z m 0.12277,4.3459 q -2.65174,0 -4.14948,1.49774 -1.49773,1.49774 -1.91514,4.24769 h 11.44175 q 0,-1.17855 -0.34375,-2.20978 -0.31919,-1.05578 -0.98212,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102833" />
<path
d="m 660.80912,126.61025 q -0.24553,0.39285 -0.51561,0.56472 -0.27008,0.14732 -0.68749,0.14732 -0.44195,0 -0.95757,-0.24553 -0.49106,-0.24553 -1.15399,-0.54017 -0.66294,-0.31919 -1.5223,-0.56472 -0.8348,-0.24553 -1.9888,-0.24553 -1.79237,0 -2.8236,0.76115 -1.00668,0.76114 -1.00668,1.9888 0,0.81025 0.51561,1.37497 0.54017,0.54017 1.39953,0.95757 0.88391,0.41741 1.9888,0.76115 1.10489,0.31919 2.23433,0.71204 1.154,0.39285 2.25889,0.90846 1.10489,0.49107 1.96425,1.27677 0.88391,0.76114 1.39952,1.84148 0.54017,1.08033 0.54017,2.60263 0,1.81693 -0.66293,3.36377 -0.63838,1.52229 -1.91514,2.65174 -1.27676,1.10489 -3.16735,1.74327 -1.86604,0.61382 -4.32135,0.61382 -1.30131,0 -2.55352,-0.24553 -1.22766,-0.22098 -2.38165,-0.63838 -1.12944,-0.4174 -2.11157,-0.98212 -0.95757,-0.56472 -1.69416,-1.22766 l 1.39952,-2.30799 q 0.27009,-0.4174 0.63838,-0.63838 0.3683,-0.22098 0.93302,-0.22098 0.56472,0 1.05579,0.31919 0.51561,0.31919 1.17854,0.68749 0.66294,0.3683 1.54685,0.68749 0.90846,0.31919 2.28344,0.31919 1.08033,0 1.84148,-0.24553 0.7857,-0.27009 1.27676,-0.68749 0.51562,-0.4174 0.73659,-0.95757 0.24554,-0.56472 0.24554,-1.154 0,-0.88391 -0.54017,-1.44863 -0.51562,-0.56472 -1.39953,-0.98212 -0.85936,-0.41741 -1.9888,-0.7366 -1.10489,-0.34374 -2.28344,-0.73659 -1.15399,-0.39285 -2.28344,-0.90846 -1.10489,-0.54017 -1.9888,-1.35043 -0.85936,-0.81025 -1.39952,-1.9888 -0.51562,-1.17855 -0.51562,-2.84816 0,-1.54684 0.61383,-2.94637 0.61383,-1.39953 1.79237,-2.43076 1.20311,-1.05578 2.97093,-1.66961 1.79238,-0.63838 4.12492,-0.63838 2.60263,0 4.73875,0.85936 2.13612,0.85936 3.5602,2.25889 z"
style="opacity:1;fill:#000000"
id="path102835" />
<path
d="m 673.3066,121.69963 v 25.19148 h -6.08917 v -25.19148 z m 0.83481,-7.34137 q 0,0.78569 -0.31919,1.47318 -0.3192,0.68749 -0.85936,1.2031 -0.51562,0.51562 -1.22766,0.83481 -0.71204,0.29464 -1.52229,0.29464 -0.7857,0 -1.49774,-0.29464 -0.68749,-0.31919 -1.2031,-0.83481 -0.51562,-0.51561 -0.83481,-1.2031 -0.29463,-0.68749 -0.29463,-1.47318 0,-0.81026 0.29463,-1.5223 0.31919,-0.71204 0.83481,-1.22765 0.51561,-0.51562 1.2031,-0.81025 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.29463 1.22766,0.81025 0.54016,0.51561 0.85936,1.22765 0.31919,0.71204 0.31919,1.5223 z"
style="opacity:1;fill:#000000"
id="path102837" />
<path
d="m 695.9691,146.89111 q -0.85936,0 -1.32587,-0.24553 -0.46651,-0.27008 -0.73659,-1.05578 l -0.54017,-1.79238 q -0.95757,0.85936 -1.86604,1.5223 -0.90846,0.63838 -1.89058,1.08033 -0.98213,0.44196 -2.11157,0.66294 -1.10489,0.22097 -2.45531,0.22097 -1.59595,0 -2.94637,-0.4174 -1.35042,-0.44195 -2.33255,-1.30131 -0.98212,-0.85936 -1.52229,-2.13612 -0.54017,-1.27676 -0.54017,-2.97093 0,-1.42408 0.73659,-2.79905 0.76115,-1.39953 2.50442,-2.50442 1.74327,-1.12944 4.64054,-1.86603 2.89726,-0.7366 7.21861,-0.83481 v -1.47319 q 0,-2.52896 -1.08034,-3.73207 -1.08033,-1.22765 -3.11824,-1.22765 -1.47319,0 -2.45531,0.34374 -0.95757,0.34375 -1.69417,0.7857 -0.73659,0.4174 -1.35042,0.76115 -0.58927,0.34374 -1.32586,0.34374 -0.63838,0 -1.08034,-0.31919 -0.44196,-0.34374 -0.71204,-0.7857 l -1.08034,-1.93969 q 4.3459,-3.97761 10.45962,-3.97761 2.20978,0 3.95305,0.7366 1.74327,0.71204 2.94638,2.01335 1.2031,1.27676 1.81692,3.06914 0.63839,1.79238 0.63839,3.92849 v 15.91041 z m -9.0601,-3.78117 q 1.86604,0 3.21646,-0.66294 1.37497,-0.68748 2.67629,-2.06246 v -4.24768 q -2.65174,0.12276 -4.44411,0.4665 -1.76783,0.3192 -2.84816,0.83481 -1.08034,0.51562 -1.54685,1.2031 -0.46651,0.68749 -0.46651,1.49774 0,1.59595 0.93302,2.28344 0.95757,0.68749 2.47986,0.68749 z"
style="opacity:1;fill:#000000"
id="path102839" />
<path
d="m 250.99463,202.35657 q 0.54017,0 0.95757,0.4174 l 2.60263,2.82361 q -2.16067,2.67628 -5.32802,4.10036 -3.1428,1.42408 -7.56236,1.42408 -3.95304,0 -7.12039,-1.35042 -3.1428,-1.35042 -5.37713,-3.75662 -2.23434,-2.40621 -3.43744,-5.74543 -1.17855,-3.33922 -1.17855,-7.29227 0,-4.00215 1.27676,-7.31682 1.27677,-3.33922 3.58476,-5.74543 2.33254,-2.4062 5.549,-3.73207 3.21645,-1.35042 7.1204,-1.35042 3.87939,0 6.87487,1.27676 3.02003,1.27676 5.13159,3.33922 l -2.20978,3.06914 q -0.19642,0.29464 -0.51561,0.51562 -0.29464,0.22097 -0.83481,0.22097 -0.36829,0 -0.76114,-0.19642 -0.39285,-0.22098 -0.85936,-0.51562 -0.46651,-0.31919 -1.08034,-0.68748 -0.61382,-0.3683 -1.42408,-0.66294 -0.81025,-0.31919 -1.89059,-0.51561 -1.05578,-0.22098 -2.45531,-0.22098 -2.38165,0 -4.37045,0.85936 -1.96425,0.8348 -3.38833,2.45531 -1.42408,1.59595 -2.20977,3.92849 -0.7857,2.308 -0.7857,5.27892 0,2.99548 0.8348,5.32802 0.85936,2.33255 2.30799,3.9285 1.44864,1.59595 3.41288,2.45531 1.96425,0.83481 4.22314,0.83481 1.35042,0 2.43075,-0.14732 1.10489,-0.14732 2.01336,-0.46651 0.93302,-0.31919 1.74327,-0.81025 0.8348,-0.51562 1.64506,-1.25221 0.24553,-0.22098 0.51561,-0.34375 0.27009,-0.14731 0.56472,-0.14731 z"
style="opacity:1;fill:#000000"
id="path102841" />
<path
d="m 258.13954,210.72917 v -36.4859 h 6.06461 v 14.01982 q 1.47319,-1.39953 3.24101,-2.25889 1.76782,-0.85936 4.14948,-0.85936 2.06246,0 3.65841,0.71204 1.59595,0.68749 2.65173,1.96425 1.08034,1.25221 1.62051,3.02003 0.56472,1.74327 0.56472,3.85484 v 16.03317 h -6.06462 V 194.696 q 0,-2.30799 -1.05578,-3.5602 -1.05578,-1.27676 -3.21646,-1.27676 -1.5714,0 -2.94637,0.71204 -1.37497,0.71204 -2.60263,1.93969 v 18.2184 z"
style="opacity:1;fill:#000000"
id="path102843" />
<path
d="m 296.5651,185.14484 q 2.38165,0 4.395,0.76115 2.01335,0.76114 3.46199,2.23433 1.44863,1.44863 2.25888,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54016,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22766,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86604,-0.76114 0.81025,-0.4174 1.39952,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76115,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00667,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66293 -1.39953,0.19643 -2.7254,0.19643 -2.62718,0 -4.88606,-0.85936 -2.25889,-0.88391 -3.9285,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84364 0,-2.57807 0.8348,-4.83696 0.83481,-2.28343 2.38165,-3.95305 1.5714,-1.69416 3.80573,-2.67628 2.25889,-0.98213 5.0825,-0.98213 z m 0.12276,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91514,4.24769 h 11.44174 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05579 -0.98213,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102845" />
<path
d="m 312.05803,210.72917 v -25.19148 h 3.70752 q 1.17855,0 1.54685,1.10489 l 0.39284,1.86604 q 0.66294,-0.7366 1.37498,-1.35042 0.73659,-0.61383 1.54684,-1.05579 0.83481,-0.44195 1.76783,-0.68748 0.95757,-0.27009 2.08701,-0.27009 2.38165,0 3.90394,1.30132 1.54685,1.27676 2.308,3.41288 0.58927,-1.25221 1.47318,-2.13612 0.88391,-0.90847 1.9397,-1.47319 1.05578,-0.56472 2.23433,-0.8348 1.2031,-0.27009 2.4062,-0.27009 2.08702,0 3.70752,0.63838 1.6205,0.63838 2.72539,1.86604 1.10489,1.22765 1.66962,2.99548 0.58927,1.76782 0.58927,4.05126 v 16.03317 h -6.06462 V 194.696 q 0,-2.40621 -1.05578,-3.60931 -1.05578,-1.22765 -3.09369,-1.22765 -0.93302,0 -1.74327,0.31919 -0.7857,0.31919 -1.39953,0.93302 -0.58927,0.58927 -0.93301,1.49773 -0.34375,0.90847 -0.34375,2.08702 v 16.03317 h -6.08917 V 194.696 q 0,-2.52897 -1.03123,-3.68297 -1.00667,-1.15399 -2.97092,-1.15399 -1.32587,0 -2.47987,0.66293 -1.12944,0.63838 -2.11156,1.76782 v 18.43938 z"
style="opacity:1;fill:#000000"
id="path102847" />
<path
d="m 353.18445,210.72917 v -25.19148 h 3.70752 q 1.17855,0 1.54684,1.10489 l 0.41741,1.9888 q 0.76114,-0.7857 1.59595,-1.42408 0.85936,-0.63838 1.79237,-1.10489 0.95758,-0.46651 2.03791,-0.71204 1.08034,-0.24553 2.3571,-0.24553 2.06246,0 3.65841,0.71204 1.59595,0.68749 2.65174,1.96425 1.08033,1.25221 1.6205,3.02003 0.56472,1.74327 0.56472,3.85484 v 16.03317 h -6.06461 V 194.696 q 0,-2.30799 -1.05579,-3.5602 -1.05578,-1.27676 -3.21645,-1.27676 -1.5714,0 -2.94637,0.71204 -1.37498,0.71204 -2.60263,1.93969 v 18.2184 z"
style="opacity:1;fill:#000000"
id="path102849" />
<path
d="m 387.1659,185.53769 v 25.19148 h -6.08917 v -25.19148 z m 0.8348,-7.34138 q 0,0.7857 -0.31919,1.47319 -0.31919,0.68749 -0.85935,1.2031 -0.51562,0.51562 -1.22766,0.83481 -0.71204,0.29464 -1.52229,0.29464 -0.7857,0 -1.49774,-0.29464 -0.68749,-0.31919 -1.2031,-0.83481 -0.51562,-0.51561 -0.83481,-1.2031 -0.29464,-0.68749 -0.29464,-1.47319 0,-0.81025 0.29464,-1.52229 0.31919,-0.71204 0.83481,-1.22765 0.51561,-0.51562 1.2031,-0.81025 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.29463 1.22766,0.81025 0.54016,0.51561 0.85935,1.22765 0.31919,0.71204 0.31919,1.52229 z"
style="opacity:1;fill:#000000"
id="path102851" />
<path
d="m 401.75043,211.12202 q -3.29012,0 -5.05794,-1.84148 -1.74327,-1.86604 -1.74327,-5.1316 v -14.06892 h -2.57808 q -0.49106,0 -0.8348,-0.31919 -0.34375,-0.3192 -0.34375,-0.95758 v -2.4062 l 4.05127,-0.66293 1.27676,-6.87487 q 0.12276,-0.49106 0.46651,-0.76115 0.34374,-0.27008 0.88391,-0.27008 h 3.14279 v 7.93065 h 6.72755 v 4.32135 h -6.72755 v 13.65152 q 0,1.17855 0.56473,1.84148 0.58927,0.66294 1.59595,0.66294 0.56472,0 0.93301,-0.12277 0.39285,-0.14732 0.66294,-0.29464 0.29464,-0.14732 0.51561,-0.27008 0.22098,-0.14732 0.44196,-0.14732 0.27008,0 0.44195,0.14732 0.17188,0.12276 0.3683,0.39285 l 1.81693,2.94637 q -1.32587,1.10489 -3.04458,1.66961 -1.71872,0.56472 -3.5602,0.56472 z"
style="fill:#000000;opacity:1"
id="path102853" />
<path
d="m 429.7164,188.04211 q 0,0.63838 -0.22097,1.25221 -0.22098,0.61382 -0.58928,1.00667 l -11.98191,15.76309 h 12.42387 v 4.66509 h -19.44606 v -2.52897 q 0,-0.4174 0.19643,-0.98212 0.19642,-0.58927 0.58927,-1.10489 l 12.08013,-15.93496 h -12.15379 v -4.64054 h 19.10231 z"
style="fill:#000000;opacity:1"
id="path102855" />
</g>
</svg>
`

View file

@ -1,211 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 711.13577 250.2845"
width="811.79883"
height="285.42059"
version="1.1"
id="svg6"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs10" />
<g id="logo">
<path
d="M 204.2641,6.2541719 89.150104,0.56886185 V 33.435375 l 43.208366,12.453538 -45.969796,4.981411 -4.0068,35.627944 35.952826,5.035567 0.32488,6.172613 -42.287886,-4.060929 0.43317,-52.792166 -25.93585,7.796994 1.57023,42.61276 -42.0713,-12.399394 -10.01698,4.43996 3.79021,29.780207 38.28109,0.64974 14.34864,14.1862 3.35705,91.28984 10.77501,30.42995 26.15244,-6.55165 1.24535,-13.96962 15.431546,-12.67012 -7.20139,-19.76322 -24.365616,-2.81558 3.30289,-40.28451 16.731066,-23.55341 93.56396,1.35366 V 99.168388 L 168.0947,83.195385 199.01196,83.628553 202.15242,54.985414 177.0829,36.684127 205.02215,33.43538 Z"
fill="none"
stroke="#111111"
stroke-width="1.08292"
stroke-linejoin="miter"
stroke-linecap="round"
id="path4"
style="fill:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:0,0;stroke-dashoffset:0" />
</g>
<g
aria-label="Katholische Pfarrei
Heilige Mutter Teresia
Chemnitz"
id="text"
style="font-weight:bold;font-size:49.1062px;line-height:1.3;font-family:Lato;-inkscape-font-specification:'Lato Bold';letter-spacing:0px;word-spacing:0px;fill:#134bd5;stroke:#000000;stroke-width:0">
<path
d="m 233.21819,62.42845 h 1.54684 q 0.93302,0 1.54685,-0.245531 0.61383,-0.270084 1.05578,-0.834805 l 9.79669,-12.399316 q 0.61383,-0.785699 1.27676,-1.080336 0.68749,-0.319191 1.71872,-0.319191 h 5.69632 l -11.95736,14.756414 q -1.05579,1.35042 -2.18523,1.915142 0.81025,0.294637 1.44863,0.834805 0.66294,0.515615 1.25221,1.374974 l 12.32566,16.622449 h -5.81909 q -1.17855,0 -1.76782,-0.31919 -0.56472,-0.343744 -0.95757,-0.982125 L 238.15336,68.640385 q -0.46651,-0.662934 -1.08034,-0.933018 -0.61382,-0.270084 -1.76782,-0.270084 h -2.08701 V 83.053055 H 226.6134 V 47.549271 h 6.60479 z"
style="opacity:1;fill:#000000"
id="path102767" />
<path
d="m 275.79323,83.053055 q -0.85936,0 -1.32587,-0.245531 -0.46651,-0.270084 -0.7366,-1.055784 l -0.54016,-1.792376 q -0.95757,0.859359 -1.86604,1.522292 -0.90846,0.638381 -1.89059,1.080337 -0.98212,0.441956 -2.11156,0.662934 -1.10489,0.220977 -2.45531,0.220977 -1.59596,0 -2.94638,-0.417402 -1.35042,-0.441956 -2.33254,-1.301315 -0.98213,-0.859358 -1.52229,-2.136119 -0.54017,-1.276762 -0.54017,-2.970926 0,-1.424079 0.73659,-2.799053 0.76115,-1.399527 2.50442,-2.504416 1.74327,-1.129443 4.64053,-1.866036 2.89727,-0.736593 7.21862,-0.834805 v -1.473186 q 0,-2.52897 -1.08034,-3.732072 -1.08034,-1.227655 -3.11824,-1.227655 -1.47319,0 -2.45531,0.343744 -0.95758,0.343743 -1.69417,0.785699 -0.73659,0.417403 -1.35042,0.761146 -0.58927,0.343743 -1.32587,0.343743 -0.63838,0 -1.08033,-0.31919 -0.44196,-0.343743 -0.71204,-0.785699 l -1.08034,-1.939695 q 4.3459,-3.977602 10.45962,-3.977602 2.20978,0 3.95305,0.736593 1.74327,0.71204 2.94637,2.013354 1.2031,1.276761 1.81693,3.069138 0.63838,1.792376 0.63838,3.928496 v 15.910409 z m -9.0601,-3.781178 q 1.86604,0 3.21646,-0.662933 1.37497,-0.687487 2.67629,-2.062461 v -4.247686 q -2.65174,0.122765 -4.44412,0.466509 -1.76782,0.31919 -2.84816,0.834805 -1.08033,0.515615 -1.54684,1.203102 -0.46651,0.687487 -0.46651,1.497739 0,1.595952 0.93302,2.283439 0.95757,0.687486 2.47986,0.687486 z"
style="fill:#000000;opacity:1"
id="path102769" />
<path
d="m 292.2928,83.445904 q -3.29012,0 -5.05794,-1.841482 -1.74327,-1.866036 -1.74327,-5.131598 V 62.403897 h -2.57807 q -0.49107,0 -0.83481,-0.31919 -0.34374,-0.31919 -0.34374,-0.957571 v -2.406204 l 4.05126,-0.662934 1.27676,-6.874868 q 0.12277,-0.491062 0.46651,-0.761146 0.34374,-0.270084 0.88391,-0.270084 h 3.1428 v 7.930652 h 6.72755 v 4.321345 h -6.72755 v 13.651524 q 0,1.178549 0.56472,1.841483 0.58927,0.662933 1.59595,0.662933 0.56472,0 0.93302,-0.122765 0.39285,-0.147319 0.66293,-0.294637 0.29464,-0.147319 0.51562,-0.270084 0.22097,-0.147319 0.44195,-0.147319 0.27009,0 0.44196,0.147319 0.17187,0.122765 0.3683,0.392849 l 1.81692,2.946372 q -1.32586,1.10489 -3.04458,1.669611 -1.71872,0.564721 -3.5602,0.564721 z"
style="fill:#000000;opacity:1"
id="path102771" />
<path
d="M 302.16313,83.053055 V 46.567147 h 6.06462 v 14.019821 q 1.47319,-1.399527 3.24101,-2.258885 1.76782,-0.859359 4.14947,-0.859359 2.06246,0 3.65842,0.71204 1.59595,0.687487 2.65173,1.964248 1.08034,1.252208 1.6205,3.020031 0.56473,1.74327 0.56473,3.854837 v 16.033175 h -6.06462 V 67.01988 q 0,-2.307991 -1.05578,-3.560199 -1.05579,-1.276762 -3.21646,-1.276762 -1.5714,0 -2.94637,0.71204 -1.37497,0.71204 -2.60263,1.939695 v 18.218401 z"
style="fill:#000000;opacity:1"
id="path102773" />
<path
d="m 341.0061,57.468724 q 2.79905,0 5.08249,0.908465 2.30799,0.908464 3.92849,2.578075 1.64506,1.669611 2.52897,4.075815 0.88391,2.406204 0.88391,5.377129 0,2.995478 -0.88391,5.401682 -0.88391,2.406204 -2.52897,4.100368 -1.6205,1.694164 -3.92849,2.602629 -2.28344,0.908464 -5.08249,0.908464 -2.82361,0 -5.1316,-0.908464 -2.30799,-0.908465 -3.95305,-2.602629 -1.62051,-1.694164 -2.52897,-4.100368 -0.88391,-2.406204 -0.88391,-5.401682 0,-2.970925 0.88391,-5.377129 0.90846,-2.406204 2.52897,-4.075815 1.64506,-1.669611 3.95305,-2.578075 2.30799,-0.908465 5.1316,-0.908465 z m 0,21.287538 q 3.14279,0 4.64053,-2.111566 1.52229,-2.111567 1.52229,-6.187382 0,-4.075814 -1.52229,-6.211934 -1.49774,-2.13612 -4.64053,-2.13612 -3.19191,0 -4.73875,2.160673 -1.52229,2.13612 -1.52229,6.187381 0,4.051262 1.52229,6.187382 1.54684,2.111566 4.73875,2.111566 z"
style="fill:#000000;opacity:1"
id="path102775" />
<path
d="m 364.20874,46.567147 v 36.485908 h -6.06462 V 46.567147 Z"
style="fill:#000000;opacity:1"
id="path102777" />
<path
d="m 376.55889,57.861574 v 25.191481 h -6.08917 V 57.861574 Z m 0.8348,-7.341377 q 0,0.785699 -0.31919,1.473186 -0.31919,0.687486 -0.85935,1.203101 -0.51562,0.515616 -1.22766,0.834806 -0.71204,0.294637 -1.52229,0.294637 -0.7857,0 -1.49774,-0.294637 -0.68749,-0.31919 -1.2031,-0.834806 -0.51562,-0.515615 -0.83481,-1.203101 -0.29464,-0.687487 -0.29464,-1.473186 0,-0.810253 0.29464,-1.522293 0.31919,-0.71204 0.83481,-1.227655 0.51561,-0.515615 1.2031,-0.810252 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.294637 1.22766,0.810252 0.54016,0.515615 0.85935,1.227655 0.31919,0.71204 0.31919,1.522293 z"
style="fill:#000000;opacity:1"
id="path102779" />
<path
d="m 398.1165,62.772194 q -0.24553,0.392849 -0.51562,0.564721 -0.27008,0.147319 -0.68748,0.147319 -0.44196,0 -0.95758,-0.245531 -0.49106,-0.245531 -1.15399,-0.540169 -0.66293,-0.31919 -1.52229,-0.564721 -0.83481,-0.245531 -1.9888,-0.245531 -1.79238,0 -2.82361,0.761146 -1.00668,0.761146 -1.00668,1.988801 0,0.810253 0.51562,1.374974 0.54017,0.540168 1.39952,0.957571 0.88392,0.417403 1.9888,0.761146 1.10489,0.31919 2.23434,0.71204 1.15399,0.39285 2.25888,0.908465 1.10489,0.491062 1.96425,1.276761 0.88391,0.761146 1.39953,1.841482 0.54017,1.080337 0.54017,2.602629 0,1.81693 -0.66294,3.363775 -0.63838,1.522292 -1.91514,2.651735 -1.27676,1.104889 -3.16735,1.74327 -1.86604,0.613827 -4.32135,0.613827 -1.30131,0 -2.55352,-0.245531 -1.22765,-0.220977 -2.38165,-0.63838 -1.12944,-0.417403 -2.11157,-0.982124 -0.95757,-0.564722 -1.69416,-1.227655 l 1.39953,-2.307992 q 0.27008,-0.417402 0.63838,-0.63838 0.36829,-0.220978 0.93302,-0.220978 0.56472,0 1.05578,0.31919 0.51561,0.31919 1.17855,0.687487 0.66293,0.368296 1.54684,0.687487 0.90847,0.31919 2.28344,0.31919 1.08034,0 1.84148,-0.245531 0.7857,-0.270084 1.27676,-0.687487 0.51562,-0.417403 0.7366,-0.957571 0.24553,-0.564721 0.24553,-1.153995 0,-0.883912 -0.54017,-1.448633 -0.51561,-0.564722 -1.39953,-0.982124 -0.85935,-0.417403 -1.9888,-0.736593 -1.10489,-0.343744 -2.28344,-0.736593 -1.15399,-0.39285 -2.28343,-0.908465 -1.10489,-0.540168 -1.98881,-1.350421 -0.85935,-0.810252 -1.39952,-1.988801 -0.51562,-1.178549 -0.51562,-2.84816 0,-1.546845 0.61383,-2.946372 0.61383,-1.399526 1.79238,-2.430757 1.2031,-1.055783 2.97092,-1.66961 1.79238,-0.638381 4.12492,-0.638381 2.60263,0 4.73875,0.859359 2.13612,0.859358 3.5602,2.258885 z"
style="fill:#000000;opacity:1"
id="path102781" />
<path
d="m 422.37491,63.189596 q -0.27009,0.343744 -0.54017,0.540169 -0.24553,0.196424 -0.73659,0.196424 -0.46651,0 -0.90847,-0.270084 -0.44195,-0.294637 -1.05578,-0.63838 -0.61383,-0.368297 -1.47319,-0.638381 -0.8348,-0.294637 -2.08701,-0.294637 -1.59595,0 -2.79905,0.589274 -1.20311,0.564722 -2.01336,1.645058 -0.7857,1.080336 -1.17855,2.627182 -0.39285,1.522292 -0.39285,3.461987 0,2.013354 0.41741,3.584753 0.44195,1.571398 1.2522,2.651735 0.81026,1.055783 1.96425,1.620504 1.154,0.540168 2.60263,0.540168 1.44863,0 2.33255,-0.343743 0.90846,-0.368297 1.52229,-0.785699 0.61383,-0.441956 1.05578,-0.785699 0.46651,-0.368297 1.03123,-0.368297 0.73659,0 1.10489,0.564721 l 1.74327,2.209779 q -1.00668,1.178549 -2.18523,1.988802 -1.17854,0.785699 -2.45531,1.276761 -1.2522,0.466509 -2.60262,0.662934 -1.32587,0.196424 -2.65174,0.196424 -2.33254,0 -4.395,-0.859358 -2.06246,-0.883912 -3.60931,-2.553523 -1.54684,-1.669611 -2.45531,-4.075814 -0.88391,-2.430757 -0.88391,-5.524448 0,-2.7745 0.7857,-5.131598 0.81025,-2.381651 2.3571,-4.100368 1.54684,-1.74327 3.83028,-2.725394 2.28344,-0.982124 5.25436,-0.982124 2.82361,0 4.93518,0.908465 2.13612,0.908464 3.83028,2.602628 z"
style="fill:#000000;opacity:1"
id="path102783" />
<path
d="M 427.99749,83.053055 V 46.567147 h 6.06462 v 14.019821 q 1.47318,-1.399527 3.24101,-2.258885 1.76782,-0.859359 4.14947,-0.859359 2.06246,0 3.65841,0.71204 1.59596,0.687487 2.65174,1.964248 1.08033,1.252208 1.6205,3.020031 0.56472,1.74327 0.56472,3.854837 v 16.033175 h -6.06461 V 67.01988 q 0,-2.307991 -1.05578,-3.560199 -1.05579,-1.276762 -3.21646,-1.276762 -1.5714,0 -2.94637,0.71204 -1.37498,0.71204 -2.60263,1.939695 v 18.218401 z"
style="fill:#000000;opacity:1"
id="path102785" />
<path
d="m 466.42306,57.468724 q 2.38165,0 4.395,0.761146 2.01336,0.761146 3.46199,2.234332 1.44863,1.448633 2.25889,3.584753 0.8348,2.111567 0.8348,4.836961 0,1.374973 -0.29464,1.866035 -0.29463,0.466509 -1.12944,0.466509 h -15.59122 q 0.14732,1.939695 0.68749,3.363775 0.54017,1.399527 1.42408,2.332545 0.88391,0.908464 2.08701,1.374973 1.22766,0.441956 2.70084,0.441956 1.47319,0 2.52897,-0.343743 1.08034,-0.343744 1.86604,-0.761146 0.81025,-0.417403 1.39953,-0.761147 0.61382,-0.343743 1.17855,-0.343743 0.76114,0 1.12944,0.564721 l 1.74327,2.209779 q -1.00668,1.178549 -2.25889,1.988802 -1.25221,0.785699 -2.62718,1.276761 -1.35042,0.466509 -2.7745,0.662934 -1.39953,0.196424 -2.72539,0.196424 -2.62719,0 -4.88607,-0.859358 -2.25889,-0.883912 -3.9285,-2.578076 -1.66961,-1.718717 -2.62718,-4.223133 -0.95757,-2.528969 -0.95757,-5.843638 0,-2.578076 0.83481,-4.836961 0.8348,-2.283438 2.38165,-3.953049 1.5714,-1.694164 3.80573,-2.676288 2.25888,-0.982124 5.08249,-0.982124 z m 0.12276,4.345899 q -2.65173,0 -4.14947,1.497739 -1.49774,1.497739 -1.91514,4.247686 h 11.44174 q 0,-1.178548 -0.34374,-2.209779 -0.31919,-1.055783 -0.98212,-1.841482 -0.66294,-0.785699 -1.69417,-1.227655 -1.00667,-0.466509 -2.3571,-0.466509 z"
style="fill:#000000;opacity:1"
id="path102787" />
<path
d="m 501.41106,70.555527 v 12.497528 h -6.60479 V 47.549271 h 11.53996 q 3.5602,0 6.16283,0.834806 2.60263,0.834805 4.29679,2.332544 1.69417,1.497739 2.50442,3.584753 0.8348,2.087014 0.8348,4.566877 0,2.578075 -0.85935,4.738748 -0.85936,2.13612 -2.57808,3.682965 -1.71872,1.546846 -4.32135,2.406204 -2.57807,0.859359 -6.04006,0.859359 z m 0,-5.156152 h 4.93517 q 1.81693,0 3.16735,-0.441955 1.35042,-0.466509 2.23433,-1.301315 0.90847,-0.859358 1.35042,-2.06246 0.44196,-1.227655 0.44196,-2.725394 0,-1.42408 -0.44196,-2.578076 -0.44195,-1.153996 -1.32586,-1.964248 -0.88391,-0.810252 -2.23433,-1.227655 -1.35043,-0.441956 -3.19191,-0.441956 h -4.93517 z"
style="fill:#000000;opacity:1"
id="path102789" />
<path
d="M 526.01323,83.053055 V 62.42845 L 523.828,62.084707 q -0.71204,-0.147319 -1.154,-0.491062 -0.4174,-0.368297 -0.4174,-1.03123 v -2.479863 h 3.75663 v -1.866036 q 0,-2.160673 0.63838,-3.87939 0.66293,-1.718717 1.86603,-2.921819 1.22766,-1.203102 2.97093,-1.841483 1.74327,-0.63838 3.92849,-0.63838 1.74327,0 3.24101,0.466509 l -0.12276,3.044584 q -0.0246,0.343744 -0.19643,0.564722 -0.17187,0.196424 -0.46651,0.31919 -0.27008,0.09821 -0.63838,0.147318 -0.36829,0.02455 -0.7857,0.02455 -1.08033,0 -1.93969,0.245531 -0.83481,0.220977 -1.42408,0.810252 -0.58928,0.564721 -0.90847,1.522292 -0.29463,0.933018 -0.29463,2.332545 v 1.669611 h 6.55567 v 4.321345 h -6.35925 v 20.649158 z"
style="fill:#000000;opacity:1"
id="path102791" />
<path
d="m 558.32509,83.053055 q -0.85936,0 -1.32587,-0.245531 -0.46651,-0.270084 -0.73659,-1.055784 l -0.54017,-1.792376 q -0.95757,0.859359 -1.86604,1.522292 -0.90846,0.638381 -1.89059,1.080337 -0.98212,0.441956 -2.11156,0.662934 -1.10489,0.220977 -2.45531,0.220977 -1.59596,0 -2.94638,-0.417402 -1.35042,-0.441956 -2.33254,-1.301315 -0.98212,-0.859358 -1.52229,-2.136119 -0.54017,-1.276762 -0.54017,-2.970926 0,-1.424079 0.73659,-2.799053 0.76115,-1.399527 2.50442,-2.504416 1.74327,-1.129443 4.64053,-1.866036 2.89727,-0.736593 7.21862,-0.834805 v -1.473186 q 0,-2.52897 -1.08034,-3.732072 -1.08034,-1.227655 -3.11824,-1.227655 -1.47319,0 -2.45531,0.343744 -0.95758,0.343743 -1.69417,0.785699 -0.73659,0.417403 -1.35042,0.761146 -0.58927,0.343743 -1.32587,0.343743 -0.63838,0 -1.08033,-0.31919 -0.44196,-0.343743 -0.71204,-0.785699 l -1.08034,-1.939695 q 4.3459,-3.977602 10.45962,-3.977602 2.20978,0 3.95305,0.736593 1.74327,0.71204 2.94637,2.013354 1.2031,1.276761 1.81693,3.069138 0.63838,1.792376 0.63838,3.928496 v 15.910409 z m -9.0601,-3.781178 q 1.86604,0 3.21646,-0.662933 1.37497,-0.687487 2.67629,-2.062461 v -4.247686 q -2.65174,0.122765 -4.44412,0.466509 -1.76782,0.31919 -2.84816,0.834805 -1.08033,0.515615 -1.54684,1.203102 -0.46651,0.687487 -0.46651,1.497739 0,1.595952 0.93302,2.283439 0.95757,0.687486 2.47986,0.687486 z"
style="fill:#000000;opacity:1"
id="path102793" />
<path
d="M 566.77134,83.053055 V 57.861574 h 3.5602 q 0.93302,0 1.30132,0.343743 0.36829,0.31919 0.49106,1.178549 l 0.34374,2.84816 q 1.2031,-2.258886 2.82361,-3.535647 1.6205,-1.301314 3.83028,-1.301314 1.74327,0 2.79905,0.761146 l -0.39284,4.542323 q -0.12277,0.441956 -0.3683,0.638381 -0.22098,0.171872 -0.61383,0.171872 -0.3683,0 -1.10489,-0.122766 -0.71204,-0.122765 -1.39952,-0.122765 -1.00668,0 -1.79238,0.294637 -0.7857,0.294637 -1.42408,0.859358 -0.61383,0.540169 -1.10489,1.325868 -0.46651,0.785699 -0.88391,1.792376 v 15.51756 z"
style="fill:#000000;opacity:1"
id="path102795" />
<path
d="M 585.08793,83.053055 V 57.861574 h 3.5602 q 0.93302,0 1.30132,0.343743 0.36829,0.31919 0.49106,1.178549 l 0.34374,2.84816 q 1.2031,-2.258886 2.82361,-3.535647 1.6205,-1.301314 3.83028,-1.301314 1.74327,0 2.79905,0.761146 l -0.39285,4.542323 q -0.12276,0.441956 -0.36829,0.638381 -0.22098,0.171872 -0.61383,0.171872 -0.3683,0 -1.10489,-0.122766 -0.71204,-0.122765 -1.39953,-0.122765 -1.00667,0 -1.79237,0.294637 -0.7857,0.294637 -1.42408,0.859358 -0.61383,0.540169 -1.10489,1.325868 -0.46651,0.785699 -0.88391,1.792376 v 15.51756 z"
style="fill:#000000;opacity:1"
id="path102797" />
<path
d="m 613.4221,57.468724 q 2.38165,0 4.395,0.761146 2.01336,0.761146 3.46199,2.234332 1.44863,1.448633 2.25889,3.584753 0.8348,2.111567 0.8348,4.836961 0,1.374973 -0.29464,1.866035 -0.29463,0.466509 -1.12944,0.466509 h -15.59122 q 0.14732,1.939695 0.68749,3.363775 0.54017,1.399527 1.42408,2.332545 0.88391,0.908464 2.08701,1.374973 1.22766,0.441956 2.70084,0.441956 1.47319,0 2.52897,-0.343743 1.08034,-0.343744 1.86604,-0.761146 0.81025,-0.417403 1.39953,-0.761147 0.61382,-0.343743 1.17854,-0.343743 0.76115,0 1.12945,0.564721 l 1.74327,2.209779 q -1.00668,1.178549 -2.25889,1.988802 -1.25221,0.785699 -2.62718,1.276761 -1.35042,0.466509 -2.7745,0.662934 -1.39953,0.196424 -2.72539,0.196424 -2.62719,0 -4.88607,-0.859358 -2.25889,-0.883912 -3.9285,-2.578076 -1.66961,-1.718717 -2.62718,-4.223133 -0.95757,-2.528969 -0.95757,-5.843638 0,-2.578076 0.8348,-4.836961 0.83481,-2.283438 2.38166,-3.953049 1.57139,-1.694164 3.80573,-2.676288 2.25888,-0.982124 5.08249,-0.982124 z m 0.12276,4.345899 q -2.65173,0 -4.14947,1.497739 -1.49774,1.497739 -1.91514,4.247686 h 11.44174 q 0,-1.178548 -0.34374,-2.209779 -0.31919,-1.055783 -0.98212,-1.841482 -0.66294,-0.785699 -1.69417,-1.227655 -1.00668,-0.466509 -2.3571,-0.466509 z"
style="fill:#000000;opacity:1"
id="path102799" />
<path
d="m 635.20061,57.861574 v 25.191481 h -6.08917 V 57.861574 Z m 0.83481,-7.341377 q 0,0.785699 -0.31919,1.473186 -0.31919,0.687486 -0.85936,1.203101 -0.51562,0.515616 -1.22766,0.834806 -0.71204,0.294637 -1.52229,0.294637 -0.7857,0 -1.49774,-0.294637 -0.68748,-0.31919 -1.2031,-0.834806 -0.51561,-0.515615 -0.8348,-1.203101 -0.29464,-0.687487 -0.29464,-1.473186 0,-0.810253 0.29464,-1.522293 0.31919,-0.71204 0.8348,-1.227655 0.51562,-0.515615 1.2031,-0.810252 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.294637 1.22766,0.810252 0.54017,0.515615 0.85936,1.227655 0.31919,0.71204 0.31919,1.522293 z"
style="fill:#000000;opacity:1"
id="path102801" />
<path
d="m 256.54363,146.89111 h -6.62933 v -15.51756 h -16.67156 v 15.51756 h -6.62934 v -35.50378 h 6.62934 v 15.27203 h 16.67156 v -15.27203 h 6.62933 z"
style="opacity:1;fill:#000000"
id="path102803" />
<path
d="m 273.46058,121.30678 q 2.38166,0 4.39501,0.76115 2.01335,0.76115 3.46199,2.23433 1.44863,1.44863 2.25888,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54016,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22765,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86603,-0.76114 0.81026,-0.4174 1.39953,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76115,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00667,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39953,0.19642 -2.7254,0.19642 -2.62718,0 -4.88607,-0.85936 -2.25888,-0.88391 -3.92849,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.8348,-4.83697 0.83481,-2.28343 2.38165,-3.95304 1.5714,-1.69417 3.80573,-2.67629 2.25889,-0.98213 5.08249,-0.98213 z m 0.12277,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91515,4.24769 h 11.44175 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05578 -0.98213,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102805" />
<path
d="m 295.23911,121.69963 v 25.19148 h -6.08917 v -25.19148 z m 0.83481,-7.34137 q 0,0.78569 -0.31919,1.47318 -0.31919,0.68749 -0.85936,1.2031 -0.51562,0.51562 -1.22766,0.83481 -0.71204,0.29464 -1.52229,0.29464 -0.7857,0 -1.49774,-0.29464 -0.68749,-0.31919 -1.2031,-0.83481 -0.51562,-0.51561 -0.83481,-1.2031 -0.29463,-0.68749 -0.29463,-1.47318 0,-0.81026 0.29463,-1.5223 0.31919,-0.71204 0.83481,-1.22765 0.51561,-0.51562 1.2031,-0.81025 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.29463 1.22766,0.81025 0.54017,0.51561 0.85936,1.22765 0.31919,0.71204 0.31919,1.5223 z"
style="opacity:1;fill:#000000"
id="path102807" />
<path
d="m 307.56475,110.40521 v 36.4859 h -6.06461 v -36.4859 z"
style="opacity:1;fill:#000000"
id="path102809" />
<path
d="m 319.91491,121.69963 v 25.19148 h -6.08917 v -25.19148 z m 0.8348,-7.34137 q 0,0.78569 -0.31919,1.47318 -0.31919,0.68749 -0.85936,1.2031 -0.51561,0.51562 -1.22765,0.83481 -0.71204,0.29464 -1.52229,0.29464 -0.7857,0 -1.49774,-0.29464 -0.68749,-0.31919 -1.2031,-0.83481 -0.51562,-0.51561 -0.83481,-1.2031 -0.29464,-0.68749 -0.29464,-1.47318 0,-0.81026 0.29464,-1.5223 0.31919,-0.71204 0.83481,-1.22765 0.51561,-0.51562 1.2031,-0.81025 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.29463 1.22765,0.81025 0.54017,0.51561 0.85936,1.22765 0.31919,0.71204 0.31919,1.5223 z"
style="opacity:1;fill:#000000"
id="path102811" />
<path
d="m 335.30969,121.25768 q 1.6205,0 3.02003,0.34374 1.42408,0.31919 2.62718,0.95757 h 7.24317 v 2.25889 q 0,1.08033 -1.30132,1.32586 l -2.25888,0.41741 q 0.24553,0.63838 0.36829,1.35042 0.14732,0.71204 0.14732,1.49774 0,1.86603 -0.76115,3.38832 -0.73659,1.49774 -2.06246,2.55353 -1.32586,1.05578 -3.14279,1.64505 -1.79238,0.56473 -3.87939,0.56473 -1.42408,0 -2.7745,-0.27009 -1.17855,0.71204 -1.17855,1.59595 0,0.76115 0.68748,1.12945 0.71204,0.34374 1.86604,0.49106 1.154,0.14732 2.62718,0.19642 1.47319,0.0246 3.02003,0.14732 1.54685,0.12277 3.02004,0.44196 1.47318,0.29463 2.62718,0.95757 1.15399,0.66293 1.84148,1.81693 0.71204,1.12944 0.71204,2.92182 0,1.66961 -0.83481,3.24101 -0.81025,1.57139 -2.38165,2.79905 -1.54684,1.22765 -3.83028,1.96425 -2.25889,0.76114 -5.15615,0.76114 -2.84816,0 -4.95973,-0.56472 -2.11156,-0.54017 -3.51109,-1.47318 -1.39953,-0.90847 -2.08701,-2.11157 -0.68749,-1.2031 -0.68749,-2.50442 0,-1.74327 1.05578,-2.94637 1.08034,-1.2031 2.92182,-1.91514 -0.98212,-0.51562 -1.5714,-1.37497 -0.58927,-0.85936 -0.58927,-2.25889 0,-0.56472 0.19642,-1.154 0.19643,-0.61382 0.58928,-1.2031 0.4174,-0.58927 1.03123,-1.10489 0.63838,-0.54017 1.47318,-0.95757 -1.91514,-1.03123 -3.02003,-2.74995 -1.08033,-1.71871 -1.08033,-4.0267 0,-1.86604 0.73659,-3.36378 0.76114,-1.52229 2.08701,-2.57807 1.35042,-1.08034 3.16735,-1.64506 1.84148,-0.56472 4.00216,-0.56472 z m 6.85031,26.76288 q 0,-0.7366 -0.44195,-1.17855 -0.44196,-0.46651 -1.20311,-0.7366 -0.76114,-0.27008 -1.79237,-0.39284 -1.00668,-0.12277 -2.16067,-0.17188 -1.12945,-0.0737 -2.3571,-0.12276 -1.2031,-0.0491 -2.3571,-0.19643 -1.00668,0.56472 -1.64506,1.32587 -0.61383,0.76115 -0.61383,1.76782 0,0.66294 0.3192,1.22766 0.34374,0.58927 1.05578,1.00668 0.73659,0.4174 1.89059,0.63838 1.15399,0.24553 2.8236,0.24553 1.69417,0 2.92182,-0.27009 1.22766,-0.24553 2.01336,-0.71204 0.81025,-0.44195 1.17855,-1.08033 0.36829,-0.61383 0.36829,-1.35042 z m -6.85031,-14.33901 q 1.12944,0 1.96425,-0.29464 0.8348,-0.31919 1.37497,-0.85936 0.56472,-0.54017 0.8348,-1.30131 0.29464,-0.76115 0.29464,-1.66962 0,-1.86603 -1.12944,-2.94637 -1.10489,-1.10489 -3.33922,-1.10489 -2.23433,0 -3.36378,1.10489 -1.10489,1.08034 -1.10489,2.94637 0,0.88392 0.27009,1.64506 0.29463,0.76115 0.8348,1.32587 0.56472,0.54017 1.39953,0.85936 0.85936,0.29464 1.96425,0.29464 z"
style="opacity:1;fill:#000000"
id="path102813" />
<path
d="m 362.31806,121.30678 q 2.38165,0 4.395,0.76115 2.01336,0.76115 3.46199,2.23433 1.44863,1.44863 2.25888,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54017,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22766,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86604,-0.76114 0.81025,-0.4174 1.39952,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76115,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00667,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39953,0.19642 -2.7254,0.19642 -2.62718,0 -4.88606,-0.85936 -2.25889,-0.88391 -3.9285,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.8348,-4.83697 0.83481,-2.28343 2.38165,-3.95304 1.5714,-1.69417 3.80573,-2.67629 2.25889,-0.98213 5.0825,-0.98213 z m 0.12276,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91514,4.24769 h 11.44174 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05578 -0.98213,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102815" />
<path
d="m 408.52683,132.15925 q 0.4174,0.7857 0.76115,1.64506 0.36829,0.83481 0.71204,1.69417 0.34374,-0.90847 0.71204,-1.74327 0.36829,-0.85936 0.7857,-1.64506 l 10.48417,-19.66704 q 0.19642,-0.36829 0.4174,-0.58927 0.22098,-0.22098 0.46651,-0.31919 0.27009,-0.0982 0.58928,-0.12277 0.31919,-0.0245 0.76114,-0.0245 h 4.98428 v 35.50378 h -5.81908 v -22.93259 q 0,-0.63838 0.0245,-1.39953 0.0491,-0.76114 0.12276,-1.54684 l -10.7297,20.13354 q -0.76115,1.44863 -2.33254,1.44863 h -0.93302 q -1.5714,0 -2.33255,-1.44863 l -10.85247,-20.2072 q 0.0737,0.81025 0.12277,1.59595 0.0491,0.76114 0.0491,1.42408 v 22.93259 h -5.81908 v -35.50378 h 4.98428 q 0.44195,0 0.76114,0.0245 0.3192,0.0246 0.56473,0.12277 0.27008,0.0982 0.4665,0.31919 0.22098,0.22098 0.41741,0.58927 l 10.63149,19.71614 z"
style="opacity:1;fill:#000000"
id="path102817" />
<path
d="m 441.50161,121.69963 v 16.00862 q 0,2.308 1.05578,3.58476 1.08034,1.25221 3.21645,1.25221 1.5714,0 2.94638,-0.68749 1.37497,-0.71204 2.60263,-1.9397 v -18.2184 h 6.06461 v 25.19148 h -3.70752 q -1.2031,0 -1.52229,-1.10489 l -0.4174,-2.01335 q -0.7857,0.7857 -1.62051,1.44863 -0.8348,0.63838 -1.79237,1.10489 -0.95757,0.46651 -2.03791,0.71204 -1.08034,0.24553 -2.3571,0.24553 -2.06246,0 -3.65841,-0.68748 -1.5714,-0.71204 -2.65173,-1.9888 -1.08034,-1.27677 -1.64506,-3.02004 -0.54017,-1.76782 -0.54017,-3.87939 v -16.00862 z"
style="opacity:1;fill:#000000"
id="path102819" />
<path
d="m 471.77553,147.28396 q -3.29012,0 -5.05794,-1.84148 -1.74327,-1.86603 -1.74327,-5.1316 v -14.06892 h -2.57808 q -0.49106,0 -0.8348,-0.31919 -0.34375,-0.31919 -0.34375,-0.95757 v -2.40621 l 4.05127,-0.66293 1.27676,-6.87487 q 0.12276,-0.49106 0.46651,-0.76115 0.34374,-0.27008 0.88391,-0.27008 h 3.14279 v 7.93065 h 10.48418 l 1.30131,-6.89942 q 0.12277,-0.49106 0.44196,-0.76115 0.34374,-0.27008 0.90846,-0.27008 h 3.11825 v 7.93065 h 6.72755 v 4.32135 h -6.72755 v 13.65152 q 0,1.17855 0.58927,1.84148 0.58928,0.66294 1.59595,0.66294 0.54017,0 0.93302,-0.12277 0.39285,-0.14732 0.66293,-0.29464 0.29464,-0.14731 0.51562,-0.27008 0.22098,-0.14732 0.44196,-0.14732 0.27008,0 0.44195,0.14732 0.17187,0.12277 0.3683,0.39285 l 1.81693,2.94637 q -1.32587,1.10489 -3.04459,1.66961 -1.71871,0.56472 -3.5602,0.56472 -3.29011,0 -5.05794,-1.84148 -1.76782,-1.86603 -1.76782,-5.1316 v -14.06892 h -10.18954 v 13.65152 q 0,1.17855 0.56473,1.84148 0.58927,0.66294 1.59595,0.66294 0.56472,0 0.93302,-0.12277 0.39284,-0.14732 0.66293,-0.29464 0.29464,-0.14731 0.51561,-0.27008 0.22098,-0.14732 0.44196,-0.14732 0.27008,0 0.44196,0.14732 0.17187,0.12277 0.36829,0.39285 l 1.81693,2.94637 q -1.32587,1.10489 -3.04458,1.66961 -1.71872,0.56472 -3.5602,0.56472 z"
style="opacity:1;fill:#000000"
id="path102821" />
<path
d="m 508.62968,121.30678 q 2.38165,0 4.395,0.76115 2.01336,0.76115 3.46199,2.23433 1.44863,1.44863 2.25889,3.58475 0.8348,2.11157 0.8348,4.83696 0,1.37498 -0.29464,1.86604 -0.29463,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54017,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22766,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86604,-0.76114 0.81025,-0.4174 1.39953,-0.76115 0.61382,-0.34374 1.17854,-0.34374 0.76115,0 1.12945,0.56472 l 1.74327,2.20978 q -1.00668,1.17855 -2.25889,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39953,0.19642 -2.72539,0.19642 -2.62719,0 -4.88607,-0.85936 -2.25889,-0.88391 -3.9285,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.83481,-4.83697 0.8348,-2.28343 2.38165,-3.95304 1.57139,-1.69417 3.80573,-2.67629 2.25888,-0.98213 5.08249,-0.98213 z m 0.12276,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91514,4.24769 h 11.44174 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05578 -0.98212,-1.84148 -0.66294,-0.7857 -1.69417,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102823" />
<path
d="m 524.12263,146.89111 v -25.19148 h 3.5602 q 0.93302,0 1.30131,0.34375 0.3683,0.31919 0.49107,1.17855 l 0.34374,2.84815 q 1.2031,-2.25888 2.82361,-3.53564 1.6205,-1.30132 3.83028,-1.30132 1.74327,0 2.79905,0.76115 l -0.39285,4.54232 q -0.12276,0.44196 -0.36829,0.63838 -0.22098,0.17188 -0.61383,0.17188 -0.3683,0 -1.10489,-0.12277 -0.71204,-0.12277 -1.39953,-0.12277 -1.00667,0 -1.79237,0.29464 -0.7857,0.29464 -1.42408,0.85936 -0.61383,0.54017 -1.10489,1.32587 -0.46651,0.7857 -0.88391,1.79237 v 15.51756 z"
style="opacity:1;fill:#000000"
id="path102825" />
<path
d="m 577.59905,111.38733 v 5.42624 H 566.8939 v 30.07754 h -6.60479 v -30.07754 h -10.70515 v -5.42624 z"
style="opacity:1;fill:#000000"
id="path102827" />
<path
d="m 586.11884,121.30678 q 2.38166,0 4.39501,0.76115 2.01335,0.76115 3.46199,2.23433 1.44863,1.44863 2.25888,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54016,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22765,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86604,-0.76114 0.81025,-0.4174 1.39952,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76115,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00667,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39953,0.19642 -2.7254,0.19642 -2.62718,0 -4.88607,-0.85936 -2.25888,-0.88391 -3.92849,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.8348,-4.83697 0.83481,-2.28343 2.38165,-3.95304 1.5714,-1.69417 3.80573,-2.67629 2.25889,-0.98213 5.08249,-0.98213 z m 0.12277,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91515,4.24769 h 11.44175 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05578 -0.98213,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102829" />
<path
d="m 601.6118,146.89111 v -25.19148 h 3.5602 q 0.93301,0 1.30131,0.34375 0.3683,0.31919 0.49106,1.17855 l 0.34375,2.84815 q 1.2031,-2.25888 2.8236,-3.53564 1.62051,-1.30132 3.83029,-1.30132 1.74327,0 2.79905,0.76115 l -0.39285,4.54232 q -0.12277,0.44196 -0.3683,0.63838 -0.22097,0.17188 -0.61382,0.17188 -0.3683,0 -1.10489,-0.12277 -0.71204,-0.12277 -1.39953,-0.12277 -1.00668,0 -1.79238,0.29464 -0.7857,0.29464 -1.42408,0.85936 -0.61382,0.54017 -1.10489,1.32587 -0.46651,0.7857 -0.88391,1.79237 v 15.51756 z"
style="opacity:1;fill:#000000"
id="path102831" />
<path
d="m 629.94596,121.30678 q 2.38165,0 4.39501,0.76115 2.01335,0.76115 3.46198,2.23433 1.44864,1.44863 2.25889,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68748,3.36377 0.54017,1.39953 1.42408,2.33255 0.88392,0.90846 2.08702,1.37497 1.22765,0.44196 2.70084,0.44196 1.47318,0 2.52897,-0.34375 1.08033,-0.34374 1.86603,-0.76114 0.81026,-0.4174 1.39953,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76114,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00668,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62719,1.27676 -1.35042,0.46651 -2.7745,0.66294 -1.39952,0.19642 -2.72539,0.19642 -2.62718,0 -4.88607,-0.85936 -2.25888,-0.88391 -3.92849,-2.57807 -1.66961,-1.71872 -2.62719,-4.22314 -0.95757,-2.52897 -0.95757,-5.84363 0,-2.57808 0.83481,-4.83697 0.8348,-2.28343 2.38165,-3.95304 1.5714,-1.69417 3.80573,-2.67629 2.25889,-0.98213 5.08249,-0.98213 z m 0.12277,4.3459 q -2.65174,0 -4.14948,1.49774 -1.49773,1.49774 -1.91514,4.24769 h 11.44175 q 0,-1.17855 -0.34375,-2.20978 -0.31919,-1.05578 -0.98212,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102833" />
<path
d="m 660.80912,126.61025 q -0.24553,0.39285 -0.51561,0.56472 -0.27008,0.14732 -0.68749,0.14732 -0.44195,0 -0.95757,-0.24553 -0.49106,-0.24553 -1.15399,-0.54017 -0.66294,-0.31919 -1.5223,-0.56472 -0.8348,-0.24553 -1.9888,-0.24553 -1.79237,0 -2.8236,0.76115 -1.00668,0.76114 -1.00668,1.9888 0,0.81025 0.51561,1.37497 0.54017,0.54017 1.39953,0.95757 0.88391,0.41741 1.9888,0.76115 1.10489,0.31919 2.23433,0.71204 1.154,0.39285 2.25889,0.90846 1.10489,0.49107 1.96425,1.27677 0.88391,0.76114 1.39952,1.84148 0.54017,1.08033 0.54017,2.60263 0,1.81693 -0.66293,3.36377 -0.63838,1.52229 -1.91514,2.65174 -1.27676,1.10489 -3.16735,1.74327 -1.86604,0.61382 -4.32135,0.61382 -1.30131,0 -2.55352,-0.24553 -1.22766,-0.22098 -2.38165,-0.63838 -1.12944,-0.4174 -2.11157,-0.98212 -0.95757,-0.56472 -1.69416,-1.22766 l 1.39952,-2.30799 q 0.27009,-0.4174 0.63838,-0.63838 0.3683,-0.22098 0.93302,-0.22098 0.56472,0 1.05579,0.31919 0.51561,0.31919 1.17854,0.68749 0.66294,0.3683 1.54685,0.68749 0.90846,0.31919 2.28344,0.31919 1.08033,0 1.84148,-0.24553 0.7857,-0.27009 1.27676,-0.68749 0.51562,-0.4174 0.73659,-0.95757 0.24554,-0.56472 0.24554,-1.154 0,-0.88391 -0.54017,-1.44863 -0.51562,-0.56472 -1.39953,-0.98212 -0.85936,-0.41741 -1.9888,-0.7366 -1.10489,-0.34374 -2.28344,-0.73659 -1.15399,-0.39285 -2.28344,-0.90846 -1.10489,-0.54017 -1.9888,-1.35043 -0.85936,-0.81025 -1.39952,-1.9888 -0.51562,-1.17855 -0.51562,-2.84816 0,-1.54684 0.61383,-2.94637 0.61383,-1.39953 1.79237,-2.43076 1.20311,-1.05578 2.97093,-1.66961 1.79238,-0.63838 4.12492,-0.63838 2.60263,0 4.73875,0.85936 2.13612,0.85936 3.5602,2.25889 z"
style="opacity:1;fill:#000000"
id="path102835" />
<path
d="m 673.3066,121.69963 v 25.19148 h -6.08917 v -25.19148 z m 0.83481,-7.34137 q 0,0.78569 -0.31919,1.47318 -0.3192,0.68749 -0.85936,1.2031 -0.51562,0.51562 -1.22766,0.83481 -0.71204,0.29464 -1.52229,0.29464 -0.7857,0 -1.49774,-0.29464 -0.68749,-0.31919 -1.2031,-0.83481 -0.51562,-0.51561 -0.83481,-1.2031 -0.29463,-0.68749 -0.29463,-1.47318 0,-0.81026 0.29463,-1.5223 0.31919,-0.71204 0.83481,-1.22765 0.51561,-0.51562 1.2031,-0.81025 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.29463 1.22766,0.81025 0.54016,0.51561 0.85936,1.22765 0.31919,0.71204 0.31919,1.5223 z"
style="opacity:1;fill:#000000"
id="path102837" />
<path
d="m 695.9691,146.89111 q -0.85936,0 -1.32587,-0.24553 -0.46651,-0.27008 -0.73659,-1.05578 l -0.54017,-1.79238 q -0.95757,0.85936 -1.86604,1.5223 -0.90846,0.63838 -1.89058,1.08033 -0.98213,0.44196 -2.11157,0.66294 -1.10489,0.22097 -2.45531,0.22097 -1.59595,0 -2.94637,-0.4174 -1.35042,-0.44195 -2.33255,-1.30131 -0.98212,-0.85936 -1.52229,-2.13612 -0.54017,-1.27676 -0.54017,-2.97093 0,-1.42408 0.73659,-2.79905 0.76115,-1.39953 2.50442,-2.50442 1.74327,-1.12944 4.64054,-1.86603 2.89726,-0.7366 7.21861,-0.83481 v -1.47319 q 0,-2.52896 -1.08034,-3.73207 -1.08033,-1.22765 -3.11824,-1.22765 -1.47319,0 -2.45531,0.34374 -0.95757,0.34375 -1.69417,0.7857 -0.73659,0.4174 -1.35042,0.76115 -0.58927,0.34374 -1.32586,0.34374 -0.63838,0 -1.08034,-0.31919 -0.44196,-0.34374 -0.71204,-0.7857 l -1.08034,-1.93969 q 4.3459,-3.97761 10.45962,-3.97761 2.20978,0 3.95305,0.7366 1.74327,0.71204 2.94638,2.01335 1.2031,1.27676 1.81692,3.06914 0.63839,1.79238 0.63839,3.92849 v 15.91041 z m -9.0601,-3.78117 q 1.86604,0 3.21646,-0.66294 1.37497,-0.68748 2.67629,-2.06246 v -4.24768 q -2.65174,0.12276 -4.44411,0.4665 -1.76783,0.3192 -2.84816,0.83481 -1.08034,0.51562 -1.54685,1.2031 -0.46651,0.68749 -0.46651,1.49774 0,1.59595 0.93302,2.28344 0.95757,0.68749 2.47986,0.68749 z"
style="opacity:1;fill:#000000"
id="path102839" />
<path
d="m 250.99463,202.35657 q 0.54017,0 0.95757,0.4174 l 2.60263,2.82361 q -2.16067,2.67628 -5.32802,4.10036 -3.1428,1.42408 -7.56236,1.42408 -3.95304,0 -7.12039,-1.35042 -3.1428,-1.35042 -5.37713,-3.75662 -2.23434,-2.40621 -3.43744,-5.74543 -1.17855,-3.33922 -1.17855,-7.29227 0,-4.00215 1.27676,-7.31682 1.27677,-3.33922 3.58476,-5.74543 2.33254,-2.4062 5.549,-3.73207 3.21645,-1.35042 7.1204,-1.35042 3.87939,0 6.87487,1.27676 3.02003,1.27676 5.13159,3.33922 l -2.20978,3.06914 q -0.19642,0.29464 -0.51561,0.51562 -0.29464,0.22097 -0.83481,0.22097 -0.36829,0 -0.76114,-0.19642 -0.39285,-0.22098 -0.85936,-0.51562 -0.46651,-0.31919 -1.08034,-0.68748 -0.61382,-0.3683 -1.42408,-0.66294 -0.81025,-0.31919 -1.89059,-0.51561 -1.05578,-0.22098 -2.45531,-0.22098 -2.38165,0 -4.37045,0.85936 -1.96425,0.8348 -3.38833,2.45531 -1.42408,1.59595 -2.20977,3.92849 -0.7857,2.308 -0.7857,5.27892 0,2.99548 0.8348,5.32802 0.85936,2.33255 2.30799,3.9285 1.44864,1.59595 3.41288,2.45531 1.96425,0.83481 4.22314,0.83481 1.35042,0 2.43075,-0.14732 1.10489,-0.14732 2.01336,-0.46651 0.93302,-0.31919 1.74327,-0.81025 0.8348,-0.51562 1.64506,-1.25221 0.24553,-0.22098 0.51561,-0.34375 0.27009,-0.14731 0.56472,-0.14731 z"
style="opacity:1;fill:#000000"
id="path102841" />
<path
d="m 258.13954,210.72917 v -36.4859 h 6.06461 v 14.01982 q 1.47319,-1.39953 3.24101,-2.25889 1.76782,-0.85936 4.14948,-0.85936 2.06246,0 3.65841,0.71204 1.59595,0.68749 2.65173,1.96425 1.08034,1.25221 1.62051,3.02003 0.56472,1.74327 0.56472,3.85484 v 16.03317 h -6.06462 V 194.696 q 0,-2.30799 -1.05578,-3.5602 -1.05578,-1.27676 -3.21646,-1.27676 -1.5714,0 -2.94637,0.71204 -1.37497,0.71204 -2.60263,1.93969 v 18.2184 z"
style="opacity:1;fill:#000000"
id="path102843" />
<path
d="m 296.5651,185.14484 q 2.38165,0 4.395,0.76115 2.01335,0.76114 3.46199,2.23433 1.44863,1.44863 2.25888,3.58475 0.83481,2.11157 0.83481,4.83696 0,1.37498 -0.29464,1.86604 -0.29464,0.46651 -1.12944,0.46651 h -15.59122 q 0.14732,1.93969 0.68749,3.36377 0.54016,1.39953 1.42408,2.33255 0.88391,0.90846 2.08701,1.37497 1.22766,0.44196 2.70084,0.44196 1.47319,0 2.52897,-0.34375 1.08034,-0.34374 1.86604,-0.76114 0.81025,-0.4174 1.39952,-0.76115 0.61383,-0.34374 1.17855,-0.34374 0.76115,0 1.12944,0.56472 l 1.74327,2.20978 q -1.00667,1.17855 -2.25888,1.9888 -1.25221,0.7857 -2.62718,1.27676 -1.35042,0.46651 -2.7745,0.66293 -1.39953,0.19643 -2.7254,0.19643 -2.62718,0 -4.88606,-0.85936 -2.25889,-0.88391 -3.9285,-2.57807 -1.66961,-1.71872 -2.62718,-4.22314 -0.95757,-2.52897 -0.95757,-5.84364 0,-2.57807 0.8348,-4.83696 0.83481,-2.28343 2.38165,-3.95305 1.5714,-1.69416 3.80573,-2.67628 2.25889,-0.98213 5.0825,-0.98213 z m 0.12276,4.3459 q -2.65173,0 -4.14947,1.49774 -1.49774,1.49774 -1.91514,4.24769 h 11.44174 q 0,-1.17855 -0.34374,-2.20978 -0.31919,-1.05579 -0.98213,-1.84148 -0.66293,-0.7857 -1.69416,-1.22766 -1.00668,-0.46651 -2.3571,-0.46651 z"
style="opacity:1;fill:#000000"
id="path102845" />
<path
d="m 312.05803,210.72917 v -25.19148 h 3.70752 q 1.17855,0 1.54685,1.10489 l 0.39284,1.86604 q 0.66294,-0.7366 1.37498,-1.35042 0.73659,-0.61383 1.54684,-1.05579 0.83481,-0.44195 1.76783,-0.68748 0.95757,-0.27009 2.08701,-0.27009 2.38165,0 3.90394,1.30132 1.54685,1.27676 2.308,3.41288 0.58927,-1.25221 1.47318,-2.13612 0.88391,-0.90847 1.9397,-1.47319 1.05578,-0.56472 2.23433,-0.8348 1.2031,-0.27009 2.4062,-0.27009 2.08702,0 3.70752,0.63838 1.6205,0.63838 2.72539,1.86604 1.10489,1.22765 1.66962,2.99548 0.58927,1.76782 0.58927,4.05126 v 16.03317 h -6.06462 V 194.696 q 0,-2.40621 -1.05578,-3.60931 -1.05578,-1.22765 -3.09369,-1.22765 -0.93302,0 -1.74327,0.31919 -0.7857,0.31919 -1.39953,0.93302 -0.58927,0.58927 -0.93301,1.49773 -0.34375,0.90847 -0.34375,2.08702 v 16.03317 h -6.08917 V 194.696 q 0,-2.52897 -1.03123,-3.68297 -1.00667,-1.15399 -2.97092,-1.15399 -1.32587,0 -2.47987,0.66293 -1.12944,0.63838 -2.11156,1.76782 v 18.43938 z"
style="opacity:1;fill:#000000"
id="path102847" />
<path
d="m 353.18445,210.72917 v -25.19148 h 3.70752 q 1.17855,0 1.54684,1.10489 l 0.41741,1.9888 q 0.76114,-0.7857 1.59595,-1.42408 0.85936,-0.63838 1.79237,-1.10489 0.95758,-0.46651 2.03791,-0.71204 1.08034,-0.24553 2.3571,-0.24553 2.06246,0 3.65841,0.71204 1.59595,0.68749 2.65174,1.96425 1.08033,1.25221 1.6205,3.02003 0.56472,1.74327 0.56472,3.85484 v 16.03317 h -6.06461 V 194.696 q 0,-2.30799 -1.05579,-3.5602 -1.05578,-1.27676 -3.21645,-1.27676 -1.5714,0 -2.94637,0.71204 -1.37498,0.71204 -2.60263,1.93969 v 18.2184 z"
style="opacity:1;fill:#000000"
id="path102849" />
<path
d="m 387.1659,185.53769 v 25.19148 h -6.08917 v -25.19148 z m 0.8348,-7.34138 q 0,0.7857 -0.31919,1.47319 -0.31919,0.68749 -0.85935,1.2031 -0.51562,0.51562 -1.22766,0.83481 -0.71204,0.29464 -1.52229,0.29464 -0.7857,0 -1.49774,-0.29464 -0.68749,-0.31919 -1.2031,-0.83481 -0.51562,-0.51561 -0.83481,-1.2031 -0.29464,-0.68749 -0.29464,-1.47319 0,-0.81025 0.29464,-1.52229 0.31919,-0.71204 0.83481,-1.22765 0.51561,-0.51562 1.2031,-0.81025 0.71204,-0.31919 1.49774,-0.31919 0.81025,0 1.52229,0.31919 0.71204,0.29463 1.22766,0.81025 0.54016,0.51561 0.85935,1.22765 0.31919,0.71204 0.31919,1.52229 z"
style="opacity:1;fill:#000000"
id="path102851" />
<path
d="m 401.75043,211.12202 q -3.29012,0 -5.05794,-1.84148 -1.74327,-1.86604 -1.74327,-5.1316 v -14.06892 h -2.57808 q -0.49106,0 -0.8348,-0.31919 -0.34375,-0.3192 -0.34375,-0.95758 v -2.4062 l 4.05127,-0.66293 1.27676,-6.87487 q 0.12276,-0.49106 0.46651,-0.76115 0.34374,-0.27008 0.88391,-0.27008 h 3.14279 v 7.93065 h 6.72755 v 4.32135 h -6.72755 v 13.65152 q 0,1.17855 0.56473,1.84148 0.58927,0.66294 1.59595,0.66294 0.56472,0 0.93301,-0.12277 0.39285,-0.14732 0.66294,-0.29464 0.29464,-0.14732 0.51561,-0.27008 0.22098,-0.14732 0.44196,-0.14732 0.27008,0 0.44195,0.14732 0.17188,0.12276 0.3683,0.39285 l 1.81693,2.94637 q -1.32587,1.10489 -3.04458,1.66961 -1.71872,0.56472 -3.5602,0.56472 z"
style="fill:#000000;opacity:1"
id="path102853" />
<path
d="m 429.7164,188.04211 q 0,0.63838 -0.22097,1.25221 -0.22098,0.61382 -0.58928,1.00667 l -11.98191,15.76309 h 12.42387 v 4.66509 h -19.44606 v -2.52897 q 0,-0.4174 0.19643,-0.98212 0.19642,-0.58927 0.58927,-1.10489 l 12.08013,-15.93496 h -12.15379 v -4.64054 h 19.10231 z"
style="fill:#000000;opacity:1"
id="path102855" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 41 KiB

View file

@ -1,30 +0,0 @@
import { LogoProps } from '@/components/Logo/Logo'
import { processSvg } from '@/utils/processSvg'
import { logoSvg } from './logoSvg'
export const Logo = ({
withText = false,
color = '#000000',
height = 75,
textColor = '#000000',
}: LogoProps) => {
if (withText && typeof textColor === 'undefined') {
textColor = color
}
const viewBox = withText ? '0 0 215 75' : '0 0 75 75'
const width = withText ? (height * 215) / 75 : height
const inner = processSvg(logoSvg, { color, textColor, withText })
return (
<svg
width={width}
height={height}
viewBox={viewBox}
xmlns="http://www.w3.org/2000/svg"
dangerouslySetInnerHTML={{ __html: inner }}
/>
)
}
export default Logo

View file

@ -1,32 +0,0 @@
import { SiteConfig } from '@/config/site'
const config: SiteConfig = {
id: 'dreikoenige',
name: 'Katholische Pfarrei Heilige Drei Könige Berlin',
shortName: 'Hl. Drei Könige',
description:
'Katholische Pfarrei Heilige Drei Könige in Berlin Gottesdienste, Veranstaltungen, Sakramente und Gemeindeleben.',
url: 'https://dreikoenige.berlin',
email: 'kontakt@dreikoenige.berlin',
keywords: [
'Katholische Pfarrei',
'Heilige Drei Könige',
'Berlin',
'Gottesdienst',
'Sakramente',
'Veranstaltungen',
'Gemeinde',
],
ogImage: '/og-logo.svg',
baseColor: '#426156',
shade1: '#728F8D',
shade2: '#CBD6D5',
shade3: '#E3E9E8',
contrastColor: '#7D1224',
contrastShade1: '#C14953',
defaultFont: 'cairo',
headerFont: 'faustina',
borderRadius: '13px',
}
export default config

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 33 KiB

View file

@ -0,0 +1,39 @@
'use client'
import type { TextFieldClientComponent } from 'payload'
import { TextField, useField } from '@payloadcms/ui'
const ColorInput = ({ path }: { path: string }) => {
const { value, setValue } = useField<string>({ path })
return (
<input
type="color"
value={value || '#000000'}
onChange={(e) => setValue(e.target.value)}
style={{
width: 40,
height: 40,
padding: 2,
border: '1px solid var(--theme-elevation-150)',
borderRadius: 4,
cursor: 'pointer',
background: 'none',
flexShrink: 0,
}}
/>
)
}
export const ColorPicker: TextFieldClientComponent = (props) => {
return (
<div style={{ display: 'flex', alignItems: 'flex-end', gap: 8, marginBottom: "20px" }}>
<div style={{ flex: 1 }}>
<TextField {...props} />
</div>
<ColorInput path={props.path} />
</div>
)
}
export default ColorPicker

View file

@ -0,0 +1,40 @@
'use client'
import { useEffect, useState } from 'react'
import moment from 'moment'
import Day from '@/admin/components/calendar/Day'
const Calendar = () => {
const weekNr = moment().isoWeek();
const [week, setWeek] = useState(weekNr.toString())
const [days, setDays] = useState<string[]>([])
// on week change => sey days
useEffect(() => {
const date = moment().isoWeek(Number(week));
const newDays = [];
for(let i=0; i<7; i++) {
let day = date.weekday(i).toISOString();
newDays.push(day)
}
setDays(newDays)
}, [week, setDays])
return (
<div>
<div>
<select value={week} onChange={e => setWeek(e.currentTarget.value)}>
{[...Array(51).keys()].map(i => <option key={i} value={i.toString()}>Woche {i}</option>)}
</select>
</div>
{days.map(day => <Day key={day} date={day} mass={[]} />)}
</div>
)
}
export default Calendar

View file

@ -0,0 +1,22 @@
import { useSyncExternalStore } from 'react'
import { churchStore } from '@/admin/components/calendar/ChurchSelect/churchStore'
type ChurchSelectProps = {
value: string,
className?: string,
onChange: (value: string) => void,
}
export const ChurchSelect = ({value, onChange, className}: ChurchSelectProps) => {
const churches = useSyncExternalStore(churchStore.subscribe, churchStore.getSnapshot)
return (
<select
className={className}
value={value}
onChange={e => onChange(e.target.value)}
>
{churches.map(c => <option key={c.id} value={c.id}>{c.name}</option>)}
</select>
)
}

View file

@ -0,0 +1,42 @@
import { fetchChurches } from '@/fetch/churches'
type Church = {
id: string,
name: string
}
let churches: Church[] = [];
const listeners = new Set<() => void>();
/**
* ChurchStore to use with Reacts `useSyncExternalStore`
*/
export const churchStore = {
// fetch all churches from API
async init() {
const data = await fetchChurches();
if (data) {
churches = data.docs.map(c => {
return { id: c.id, name: c.name }
});
emitChange()
}
},
subscribe: (listener: () => void) => {
listeners.add(listener);
return () => listeners.delete(listener);
},
getSnapshot() {
return churches;
}
}
function emitChange() {
for (let listener of listeners) {
listener();
}
}
await churchStore.init();

View file

@ -0,0 +1,36 @@
import { liturgicalDayName } from '@/hooks/liturgicalDayName'
import styles from "./styles.module.scss"
import MassForm from '@/admin/components/calendar/MassForm'
type DayProps = {
date: string,
mass: Mass[]
}
type Mass = {
id: string,
}
export const Day = ({date}: DayProps) => {
const dayName = liturgicalDayName(date)
const dateObj = new Date(date);
return (
<div className={styles.container}>
<div className={styles.day}>
<strong>{dateObj.toLocaleDateString("de-De", {weekday: "long"})}</strong> <br/>
{dayName}
</div>
<div className={styles.date}>
{date.substring(8, 10)}
</div>
<div>
<MassForm />
</div>
</div>
)
}
export default Day

View file

@ -0,0 +1,54 @@
import styles from "./form.module.scss"
import { ChurchSelect } from '@/admin/components/calendar/ChurchSelect/ChurchSelect'
const MassForm = () => {
return (
<div className={styles.container}>
<div className={styles.time}>
<div className={styles.formRow}>
<select name="time" className={styles.select}>
<option>10:00 Uhr</option>
<option>20:00 Uhr</option>
</select>
</div>
<div>
<ChurchSelect
className={styles.select}
value={"23"}
onChange={() => console.log("chage")}
/>
</div>
</div>
<div>
<div className={styles.formRow}>
<input type="radio" id="heilige_messe" name="massType" value="Heilige Messe" required />
<label htmlFor="heilige_messe">Heilige Messe</label>
<input type="radio" id="wort_gottes_feier" name="massType" value="Wort-Gottes-Feier" required />
<label htmlFor="wort_gottes_feier">Wort-Gottes-Feier</label>
<input type="radio" id="familienmesse" name="massType" value="Familienmesse" required />
<label htmlFor="familienmesse">Familienmesse</label>
</div>
<div className={styles.formRow}>
<input type="text" id="title" name="title" placeholder={"Titel"} className={styles.input} required />
</div>
<div className={styles.formRow}>
<input type="text" id="celebrant" name="celebrant" placeholder={"Zelebrant"} className={styles.input}/>
</div>
<div className={styles.formRow}>
<textarea id="description" name="description" placeholder={"Hinweise"} className={styles.input} rows={4}></textarea>
</div>
</div>
<div>
<button>Entfernen</button>
</div>
</div>
)
}
export default MassForm

View file

@ -0,0 +1,30 @@
.container {
display: flex;
}
.time {
width: 130px;
text-align: center;
}
.formRow {
margin-bottom: 5px;
}
.input {
font-size: 12px;
padding: 3px;
width: 350px;
border: 1px solid #ababab;
border-radius: 4px;
}
.select {
font-size: 12px;
padding: 3px;
border: 1px solid #ababab;
border-radius: 4px;
width: 100px;
background-color: #ffffff;
font-family: inherit;
}

View file

@ -0,0 +1,13 @@
.container {
display: flex;
margin-bottom: 20px;
}
.day {
width: 300px;
}
.date {
font-size: 18px;
font-weight: bold;
}

View file

@ -0,0 +1,40 @@
import { Gutter } from '@payloadcms/ui'
import { DefaultTemplate } from '@payloadcms/next/templates'
import { AdminViewProps } from 'payload'
import Calendar from '@/admin/components/calendar/Calendar'
export default function TestPage({
initPageResult,
params,
searchParams,
}: AdminViewProps) {
const {
req: {
user
}
} = initPageResult
if (!user) {
return <p>You must be logged in to view this page.</p>
}
return (
<DefaultTemplate
i18n={initPageResult.req.i18n}
locale={initPageResult.locale}
params={params}
payload={initPageResult.req.payload}
permissions={initPageResult.permissions}
searchParams={searchParams}
user={initPageResult.req.user || undefined}
visibleEntities={initPageResult.visibleEntities}
>
<Gutter>
<h1>Gottesdiensten</h1>
<p>This view uses the Default Template.</p>
<Calendar />
</Gutter>
</DefaultTemplate>
)
}

View file

@ -5,8 +5,6 @@ import { Metadata } from 'next'
import { AdminMenu } from '@/components/AdminMenu/AdminMenu'
import { Section } from '@/components/Section/Section'
import { isAuthenticated } from '@/utils/auth'
import { RefreshRouteOnSave } from '@/components/RefreshRouteOnSave/RefreshRouteOnSave'
import { draftMode } from 'next/headers'
type Props = {
params: Promise<{ slug: string }>
@ -26,25 +24,19 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
export default async function DynamicPage({ params }: Props) {
const slug = (await params).slug
const { isEnabled: isDraft } = await draftMode()
const page = await fetchPageBySlug(slug, isDraft)
const page = await fetchPageBySlug(slug)
const authenticated = await isAuthenticated()
if (!page) {
notFound()
}
if(!authenticated && page._status !== "published") {
notFound();
}
const firstBlockType = page.content?.[0]?.blockType
const needsTopPadding =
firstBlockType === 'title' || firstBlockType === 'text'
return (
<>
{isDraft && <RefreshRouteOnSave />}
{needsTopPadding && <Section padding={'medium'} />}
{page.content && page.content.length > 0 && (

View file

@ -1,42 +0,0 @@
// Draft Mode API Route
//
// Enables Next.js draft mode so that pages can fetch unpublished
// Payload CMS content. This route is called by Payload's live preview
// iframe (configured in each collection's admin.livePreview.url) to
// set the draft mode cookie before redirecting to the actual page.
//
// Only authenticated Payload users can activate draft mode, ensuring
// public visitors never see draft content.
//
// See: https://nextjs.org/docs/app/guides/draft-mode
import { draftMode } from 'next/headers'
import { redirect } from 'next/navigation'
import { getPayload } from 'payload'
import config from '@/payload.config'
import { headers } from 'next/headers'
export async function GET(request: Request) {
const { searchParams } = new URL(request.url)
const url = searchParams.get('url')
if (!url) {
return new Response('Missing url parameter', { status: 400 })
}
// Verify the request comes from an authenticated Payload CMS user
const payload = await getPayload({ config })
const allHeaders = await headers()
const { user } = await payload.auth({ headers: allHeaders })
if (!user) {
return new Response('Unauthorized', { status: 401 })
}
// Enable draft mode cookie — subsequent page renders will see
// draftMode().isEnabled === true and can fetch draft content
const draft = await draftMode()
draft.enable()
redirect(url)
}

View file

@ -7,19 +7,21 @@ import { notFound } from 'next/navigation'
import { readableDateTime } from '@/utils/readableDate'
import { HR } from '@/components/HorizontalRule/HorizontalRule'
import Image from 'next/image'
import styles from './styles.module.scss'
import styles from "./styles.module.scss"
import { Blocks } from '@/compositions/Blocks/Blocks'
import { isAuthenticated } from '@/utils/auth'
import { AdminMenu } from '@/components/AdminMenu/AdminMenu'
import { RefreshRouteOnSave } from '@/components/RefreshRouteOnSave/RefreshRouteOnSave'
import { draftMode } from 'next/headers'
import { fetchBlog } from '@/fetch/blog'
async function fetchBlog(id: string) {
const res = await fetch(`http://localhost:3000/api/blog/${id}`)
if (!res.ok) return undefined
return res.json();
}
export default async function BlogPage({ params }: { params: Promise<{id: string}>}){
const id = (await params).id;
const { isEnabled: isDraft } = await draftMode()
const data = await fetchBlog(id, isDraft) as Blog;
const data = await fetchBlog(id) as Blog;
const url = typeof data.photo === 'object' && data.photo?.sizes?.banner?.url;
const authenticated = await isAuthenticated();
@ -27,17 +29,12 @@ export default async function BlogPage({ params }: { params: Promise<{id: string
notFound();
}
if(!authenticated && data._status !== "published") {
notFound();
}
// determine if some margin at the bottom should be added
const length = data.content.content.length;
const shouldAddMargin = data.content.content[length - 1].blockType === "text"
return (
<>
{isDraft && <RefreshRouteOnSave />}
<Section paddingBottom={"small"}>
<Container>
<Title title={data.title} color={"contrast"}></Title>

View file

@ -8,21 +8,13 @@ import { getPhoto, transformGallery } from '@/utils/dto/gallery'
import { fetchLastCalendar } from '@/fetch/calendar'
import { isAuthenticated } from '@/utils/auth'
import { AdminMenu } from '@/components/AdminMenu/AdminMenu'
import { RefreshRouteOnSave } from '@/components/RefreshRouteOnSave/RefreshRouteOnSave'
import { draftMode } from 'next/headers'
export default async function ParishPage ({ params }: { params: Promise<{slug: string}>}) {
const slug = (await params).slug;
const { isEnabled: isDraft } = await draftMode()
const parish = await fetchParish(slug, isDraft);
const authenticated = await isAuthenticated();
const parish = await fetchParish(slug);
if(!parish) {
notFound();
}
if(!authenticated && parish._status !== "published") {
if(!parish || !parish.docs[0]) {
notFound();
}
@ -37,16 +29,16 @@ export default async function ParishPage ({ params }: { params: Promise<{slug: s
churches,
gallery,
content
} = parish
} = parish.docs[0]
const events = await fetchEvents({ parishId: id })
const churchIds = churches.map(c => typeof c === "string" ? c : c.id)
const worship = await fetchWorship({ locations: churchIds })
const announcement = await fetchLastAnnouncement(id);
const calendar = await fetchLastCalendar(id);
const authenticated = await isAuthenticated();
const image = getPhoto("tablet", photo)
return (
<>
{isDraft && <RefreshRouteOnSave />}
<Parish
title={name}
slug={slug}

View file

@ -1,20 +1,20 @@
import { notFound } from 'next/navigation'
import { Worship as WorshipType } from '@/payload-types'
import { Worship } from '@/pageComponents/Worship/Worship'
import { isAuthenticated } from '@/utils/auth'
import { AdminMenu } from '@/components/AdminMenu/AdminMenu'
import { fetchWorshipById } from '@/fetch/worship'
export default async function WorshipPage({ params }: { params: Promise<{id: string}>}) {
const id = (await params).id;
const worship = await fetchWorshipById(id)
if (!worship) {
const res = await fetch(`http://localhost:3000/api/worship/${id}`);
if (!res.ok) {
notFound()
}
const authenticated = await isAuthenticated();
const worship = await res.json() as WorshipType;
return (
<>
<Worship
@ -27,4 +27,4 @@ export default async function WorshipPage({ params }: { params: Promise<{id: str
/>
</>
)
}
}

View file

@ -9,37 +9,30 @@ import { HR } from '@/components/HorizontalRule/HorizontalRule'
import { TextDiv } from '@/components/Text/TextDiv'
import { Col } from '@/components/Flex/Col'
import { Row } from '@/components/Flex/Row'
import { RawHTML } from '@/components/RawHTML/RawHTML'
import { Blocks } from '@/compositions/Blocks/Blocks'
import { getPhoto } from '@/utils/dto/gallery'
import { isAuthenticated } from '@/utils/auth'
import { AdminMenu } from '@/components/AdminMenu/AdminMenu'
import { GroupEvents } from '@/compositions/GroupEvents/GroupEvents'
import { RichText } from '@payloadcms/richtext-lexical/react'
import { RefreshRouteOnSave } from '@/components/RefreshRouteOnSave/RefreshRouteOnSave'
import { draftMode } from 'next/headers'
export default async function GroupPage({ params }: { params: Promise<{slug: string}>}) {
const slug = (await params).slug
const { isEnabled: isDraft } = await draftMode()
const group = await fetchGroup(slug, isDraft)
const groups = await fetchGroup(slug)
if(!group) {
if(!groups || groups.docs.length === 0) {
notFound();
}
const {id, shortDescription, photo,name, content, text } = groups.docs[0]
const media = getPhoto("tablet", photo)
const authenticated = await isAuthenticated();
if(!authenticated && group._status !== "published") {
notFound();
}
const {id, shortDescription, photo, name, content, text } = group
const media = getPhoto("tablet", photo)
return (
<>
{isDraft && <RefreshRouteOnSave />}
{ media &&
<ImageWithText

View file

@ -1,56 +1,94 @@
import type { Metadata } from 'next'
import './globals.css'
import { Menu } from '@/components/Menu/Menu'
import { Footer } from '@/compositions/Footer/Footer'
import { comment } from '@/app/(home)/layout-comment'
import { FONT_MAP, getFont } from '@/assets/fonts'
import { siteConfig } from '@/config/site'
import { fetchDesign } from '@/fetch/design'
import { fetchSiteConfig } from '@/fetch/siteConfig'
import { FetchedMenu } from '@/components/Menu/FetchedMenu'
export const dynamic = 'force-dynamic'
export async function generateMetadata(): Promise<Metadata> {
let site
try {
site = await fetchSiteConfig()
} catch {
site = null
}
const name = site?.name || siteConfig.name
const shortName = site?.shortName || siteConfig.shortName
const description = site?.description || siteConfig.description
const url = site?.url || siteConfig.url
const ogImage = site?.ogImage || siteConfig.ogImage
const keywords =
site?.keywords?.map((k) => k.keyword) || siteConfig.keywords
return {
title: {
default: siteConfig.name,
template: `%s | ${siteConfig.shortName}`,
default: name,
template: `%s | ${shortName}`,
},
description: siteConfig.description,
keywords: siteConfig.keywords,
metadataBase: new URL(siteConfig.url),
description,
keywords,
metadataBase: new URL(url),
openGraph: {
title: siteConfig.name,
description: siteConfig.description,
url: siteConfig.url,
siteName: siteConfig.name,
images: [siteConfig.ogImage],
title: name,
description,
url,
siteName: name,
images: [ogImage],
locale: 'de_DE',
type: 'website',
},
}
}
const DESIGN_DEFAULTS = {
baseColor: '#016699',
shade1: '#67A3C2',
shade2: '#DDECF7',
shade3: '#eff6ff',
contrastColor: '#CE490F',
contrastShade1: '#DA764B',
borderRadius: '13px',
defaultFont: 'cairo',
headerFont: 'faustina',
}
export default async function RootLayout({
children,
}: Readonly<{
children: React.ReactNode
}>) {
let design
try {
design = await fetchDesign()
} catch {
design = null
}
const selectedDefaultFont = getFont(
siteConfig.defaultFont,
design?.defaultFont || DESIGN_DEFAULTS.defaultFont,
FONT_MAP.cairo,
)
const selectedHeaderFont = getFont(
siteConfig.headerFont,
design?.headerFont || DESIGN_DEFAULTS.headerFont,
FONT_MAP.faustina,
)
const themeStyle = {
'--base-color': siteConfig.baseColor,
'--shade1': siteConfig.shade1,
'--shade2': siteConfig.shade2,
'--shade3': siteConfig.shade3,
'--contrast-color': siteConfig.contrastColor,
'--contrast-shade1': siteConfig.contrastShade1,
'--border-radius': siteConfig.borderRadius,
'--base-color': design?.baseColor || DESIGN_DEFAULTS.baseColor,
'--shade1': design?.shade1 || DESIGN_DEFAULTS.shade1,
'--shade2': design?.shade2 || DESIGN_DEFAULTS.shade2,
'--shade3': design?.shade3 || DESIGN_DEFAULTS.shade3,
'--contrast-color': design?.contrastColor || DESIGN_DEFAULTS.contrastColor,
'--contrast-shade1':
design?.contrastShade1 || DESIGN_DEFAULTS.contrastShade1,
'--border-radius': design?.borderRadius || DESIGN_DEFAULTS.borderRadius,
'--header-font': selectedHeaderFont.style.fontFamily,
} as React.CSSProperties
@ -59,11 +97,11 @@ export default async function RootLayout({
<body>
<div dangerouslySetInnerHTML={{ __html: comment }}></div>
<FetchedMenu />
<main className={'mainContent'}>
<main className={"mainContent"}>
{children}
</main>
<Footer />
</body>
</html>
)
}
}

View file

@ -1,33 +1,47 @@
import { notFound } from 'next/navigation'
import { Event } from '@/payload-types'
import { EventPage } from '@/pageComponents/Event/Event'
import { stringify } from 'qs-esm'
import { getPhoto } from '@/utils/dto/gallery'
import { cookies } from 'next/headers'
import { isAuthenticated } from '@/utils/auth'
import { fetchEventById } from '@/fetch/events'
import { RefreshRouteOnSave } from '@/components/RefreshRouteOnSave/RefreshRouteOnSave'
import { draftMode } from 'next/headers'
export default async function Page({ params }: { params: Promise<{id: string}>}) {
const id = (await params).id;
const { isEnabled: isDraft } = await draftMode()
const event = await fetchEventById(id, isDraft)
const stringifiedQuery = stringify(
{
select: {
title: true,
date: true,
createdAt: true,
cancelled: true,
isRecurring: true,
location: true,
description: true,
shortDescription: true,
contact: true,
flyer: true,
photo: true,
group: true,
rsvpLink: true
},
},
{ addQueryPrefix: true },
)
const res = await fetch(`http://localhost:3000/api/event/${id}${stringifiedQuery}`);
if (!event) {
if (!res.ok) {
notFound()
}
const authenticated = await isAuthenticated();
if(!authenticated && event._status !== "published") {
notFound();
}
const event = await res.json() as Event;
const group = Array.isArray(event.group) && event.group.length > 0 && typeof event.group[0] == "object" ? event.group[0].slug : undefined;
const photo = getPhoto("tablet", event.photo);
return (
<>
{isDraft && <RefreshRouteOnSave />}
<EventPage
id={event.id}
title={event.title}
@ -45,6 +59,5 @@ export default async function Page({ params }: { params: Promise<{id: string}>})
photo={photo}
isAuthenticated={authenticated}
/>
</>
)
}
}

View file

@ -12,6 +12,7 @@ import { HeadingFeatureClient as HeadingFeatureClient_e70f5e05f09f93e00b997edb1e
import { UnderlineFeatureClient as UnderlineFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from '@payloadcms/richtext-lexical/client'
import { BoldFeatureClient as BoldFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from '@payloadcms/richtext-lexical/client'
import { ItalicFeatureClient as ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from '@payloadcms/richtext-lexical/client'
import { default as default_5697d501e5648edd0cfd5c3685214437 } from '@/admin/components/ColorPicker/ColorPicker'
import { default as default_9bcae99938dc292be0063ce32055e14c } from '../../../components/Logo/Logo'
import { GcsClientUploadHandler as GcsClientUploadHandler_06e62ca02c7c441053a9b643e5545934 } from '@payloadcms/storage-gcs/client'
import { CollectionCards as CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1 } from '@payloadcms/next/rsc'
@ -31,6 +32,7 @@ export const importMap = {
"@payloadcms/richtext-lexical/client#UnderlineFeatureClient": UnderlineFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
"@payloadcms/richtext-lexical/client#BoldFeatureClient": BoldFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
"@payloadcms/richtext-lexical/client#ItalicFeatureClient": ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
"@/admin/components/ColorPicker/ColorPicker#default": default_5697d501e5648edd0cfd5c3685214437,
"/components/Logo/Logo#default": default_9bcae99938dc292be0063ce32055e14c,
"@payloadcms/storage-gcs/client#GcsClientUploadHandler": GcsClientUploadHandler_06e62ca02c7c441053a9b643e5545934,
"@payloadcms/next/rsc#CollectionCards": CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1

15
src/assets/fontOptions.ts Normal file
View file

@ -0,0 +1,15 @@
export const FONT_OPTIONS = [
{ label: 'Cairo (Sans-Serif)', value: 'cairo' },
{ label: 'Roboto (Sans-Serif)', value: 'roboto' },
{ label: 'Open Sans (Sans-Serif)', value: 'openSans' },
{ label: 'Lato (Sans-Serif)', value: 'lato' },
{ label: 'Nunito (Sans-Serif)', value: 'nunito' },
{ label: 'Raleway (Sans-Serif)', value: 'raleway' },
{ label: 'Faustina (Serif)', value: 'faustina' },
{ label: 'Merriweather (Serif)', value: 'merriweather' },
{ label: 'Source Sans 3 (Sans-Serif)', value: 'sourceSans3' },
{ label: 'Playfair Display (Serif)', value: 'playfairDisplay' },
{ label: 'Lora (Serif)', value: 'lora' },
{ label: 'Crimson Text (Serif)', value: 'crimsonText' },
{ label: 'EB Garamond (Serif)', value: 'ebGaramond' },
] as const

View file

@ -7,7 +7,6 @@ import { GalleryBlock } from '@/collections/blocks/Gallery'
import { DonationBlock } from '@/collections/blocks/Donation'
import { ButtonBlock } from '@/collections/blocks/Button'
import { YoutubePlayerBlock } from '@/collections/blocks/YoutubePlayer'
import { isPublishedPublic } from '@/collections/access/public'
export const Blog: CollectionConfig = {
@ -118,17 +117,9 @@ export const Blog: CollectionConfig = {
admin: {
useAsTitle: 'title',
hidden: hide,
livePreview: {
url: ({ data }) => `/api/draft?url=/blog/${data.id}`,
}
},
versions: {
drafts: {
validate: true
}
},
access: {
read: isPublishedPublic(),
read: () => true,
create: isAdminOrEmployee(),
update: isAdminOrEmployee(),
delete: isAdminOrEmployee(),

View file

@ -1,7 +1,6 @@
import { CollectionConfig } from 'payload'
import { Group, User } from '@/payload-types'
import { fetchEventById } from '@/fetch/events'
import { isPublishedPublic } from '@/collections/access/public'
import { stringify } from 'qs-esm'
import { Event, Group, User } from '@/payload-types'
export const Events: CollectionConfig = {
slug: 'event',
@ -183,17 +182,9 @@ export const Events: CollectionConfig = {
],
admin: {
useAsTitle: 'title',
livePreview: {
url: ({ data }) => `/api/draft?url=/veranstaltungen/${data.id}`,
},
},
versions: {
drafts: {
validate: true
},
},
access: {
read: isPublishedPublic(),
read: () => true,
// admins and employees can delete, others only if they are member of the group
delete: async ({ req: { user }, id }) => {
if (!user) {
@ -207,7 +198,7 @@ export const Events: CollectionConfig = {
return false
}
const event = await fetchEventById(id)
const event = await fetchEvent(id)
if (hasGroup(user, event)) {
return true
}
@ -244,3 +235,20 @@ const hasGroup = (user: null | User , data: Partial<any> | undefined) => {
})
}
/**
* Fetch event
* @param id
*/
const fetchEvent = async (id: string): Promise<undefined|Event> => {
const stringifiedQuery = stringify(
{
select: {
group: true,
},
},
{ addQueryPrefix: true },
)
const res = await fetch(`http://localhost:3000/api/event/${id}${stringifiedQuery}`);
if (!res.ok) return undefined
return res.json()
}

View file

@ -7,7 +7,6 @@ import { DocumentBlock } from '@/collections/blocks/Document'
import { DonationBlock } from '@/collections/blocks/Donation'
import { ButtonBlock } from '@/collections/blocks/Button'
import { YoutubePlayerBlock } from '@/collections/blocks/YoutubePlayer'
import { isPublishedPublic } from '@/collections/access/public'
export const Groups: CollectionConfig = {
slug: 'group',
@ -93,17 +92,9 @@ export const Groups: CollectionConfig = {
},
admin: {
useAsTitle: 'name',
livePreview: {
url: ({ data }) => `/api/draft?url=/gruppe/${data.slug}`,
},
},
versions: {
drafts: {
validate: true
},
},
access: {
read: isPublishedPublic(),
read: () => true,
create: isAdminOrEmployee(),
update: ({ req, id }) => {
if (!req.user) {

View file

@ -19,7 +19,6 @@ import { MassTimesBlock } from '@/collections/blocks/MassTimes'
import { CollapsibleImageWithTextBlock } from '@/collections/blocks/CollapsibleImageWithText'
import { EventsBlock } from '@/collections/blocks/Events'
import { PublicationAndNewsletterBlock } from '@/collections/blocks/PublicationAndNewsletter'
import { isPublishedPublic } from '@/collections/access/public'
export const Pages: CollectionConfig = {
slug: 'pages',
@ -95,24 +94,18 @@ export const Pages: CollectionConfig = {
HorizontalRuleBlock,
BlogSliderBlock,
MassTimesBlock,
CollapsibleImageWithTextBlock,
EventsBlock,
PublicationAndNewsletterBlock,
],
},
],
admin: {
useAsTitle: 'title',
hidden: hide,
livePreview: {
url: ({ data }) => `/api/draft?url=/${data.slug}`,
},
},
versions: {
drafts: {
validate: true
},
},
access: {
read: isPublishedPublic(),
read: () => true,
create: isAdminOrEmployee(),
update: isAdminOrEmployee(),
delete: isAdminOrEmployee(),

View file

@ -5,7 +5,6 @@ import { DocumentBlock } from '@/collections/blocks/Document'
import { DonationBlock } from '@/collections/blocks/Donation'
import { YoutubePlayerBlock } from '@/collections/blocks/YoutubePlayer'
import { DonationAppeal } from '@/collections/blocks/DonationAppeal'
import { isPublishedPublic } from '@/collections/access/public'
export const Parish: CollectionConfig = {
slug: 'parish',
@ -164,18 +163,10 @@ export const Parish: CollectionConfig = {
],
admin: {
useAsTitle: 'name',
hidden: hide,
livePreview: {
url: ({ data }) => `/api/draft?url=/gemeinde/${data.slug}`,
},
},
versions: {
drafts: {
validate: true
},
hidden: hide
},
access: {
read: isPublishedPublic(),
read: () => true,
create: isAdmin(),
update: isAdminOrEmployee(),
delete: isAdmin(),

View file

@ -1,17 +0,0 @@
import type { Access } from 'payload'
export const isPublishedPublic = (): Access =>
({ req: { user } }) => {
// If there is a user logged in,
// let them retrieve all documents
if (user) return true
// If there is no user,
// restrict the documents that are returned
// to only those where `_status` is equal to `published`
return {
_status: {
equals: 'published',
},
}
}

View file

@ -33,7 +33,12 @@ export const ContactformBlock: Block = {
{
name: 'email',
type: 'email',
defaultValue: siteConfig.email,
// defaultValue: async ({ req }) => {
// const config = await req.payload.findGlobal({
// slug: 'site-config',
// })
// return config?.email || siteConfig.email
// },
required: true,
}
]

View file

@ -24,7 +24,7 @@ export const CollapsibleArrow = ({direction, onClick, stroke = 2}: CollapsibleAr
className={style}
onClick={onClick}
>
<path d="M1 1L5.28326 8.50159C5.6627 9.16614 6.3373 9.16614 6.71674 8.50159L11 1" stroke="var(--base-color)"
<path d="M1 1L5.28326 8.50159C5.6627 9.16614 6.3373 9.16614 6.71674 8.50159L11 1" stroke="#426156"
strokeWidth={stroke} />
</svg>
)

File diff suppressed because one or more lines are too long

View file

@ -1,15 +0,0 @@
'use client'
import { RefreshRouteOnSave as PayloadLivePreview } from '@payloadcms/live-preview-react'
import { useRouter } from 'next/navigation.js'
import React from 'react'
export const RefreshRouteOnSave: React.FC = () => {
const router = useRouter()
return (
<PayloadLivePreview
refresh={() => router.refresh()}
serverURL={process.env.NEXT_PUBLIC_SERVER_URL || ''}
/>
)
}

View file

@ -193,29 +193,29 @@ export function Blocks({ content }: BlocksProps) {
)
}
// if (item.blockType === 'collapsibleImageWithText') {
// const imageUrl = typeof item.image === 'object' && item.image?.url
// ? item.image.url
// : ''
// const bg = item.backgroundColor === 'none'
// ? undefined
// : item.backgroundColor as 'soft' | 'off-white' | undefined
// return (
// <CollapsibleImageWithText
// key={item.id}
// title={item.title}
// text={item.text}
// image={imageUrl}
// backgroundColor={bg}
// schema={item.schema as 'base' | 'contrast' | undefined}
// content={
// item.content
// ? <HTMLText width={'1/2'} data={item.content} />
// : <></>
// }
// />
// )
// }
if (item.blockType === 'collapsibleImageWithText') {
const imageUrl = typeof item.image === 'object' && item.image?.url
? item.image.url
: ''
const bg = item.backgroundColor === 'none'
? undefined
: item.backgroundColor as 'soft' | 'off-white' | undefined
return (
<CollapsibleImageWithText
key={item.id}
title={item.title}
text={item.text}
image={imageUrl}
backgroundColor={bg}
schema={item.schema as 'base' | 'contrast' | undefined}
content={
item.content
? <HTMLText width={'1/2'} data={item.content} />
: <></>
}
/>
)
}
if (item.blockType === 'events') {
return (
@ -227,9 +227,9 @@ export function Blocks({ content }: BlocksProps) {
)
}
// if (item.blockType === 'publicationAndNewsletter') {
// return <PublicationAndNewsletter key={item.id} />
// }
if (item.blockType === 'publicationAndNewsletter') {
return <PublicationAndNewsletter key={item.id} />
}
})}
</div>

View file

@ -24,7 +24,7 @@ export const Footer = async () => {
<br />
<Logo
color={'#ffffff'}
textColor={'var(--base-color)'}
textColor={'#426156'}
withText={true}
height={100}
/>

View file

@ -1,53 +1,18 @@
import dreikoenige from '../../sites/dreikoenige/config'
import chemnitz from '../../sites/chemnitz/config'
export type FontKey =
| 'cairo'
| 'roboto'
| 'openSans'
| 'lato'
| 'nunito'
| 'raleway'
| 'faustina'
| 'merriweather'
| 'sourceSans3'
| 'playfairDisplay'
| 'lora'
| 'crimsonText'
| 'ebGaramond'
export interface SiteConfig {
id: string
name: string
shortName: string
description: string
url: string
email: string
keywords: string[]
ogImage: string
baseColor: string
shade1: string
shade2: string
shade3: string
contrastColor: string
contrastShade1: string
defaultFont: FontKey
headerFont: FontKey
borderRadius: string
}
const sites: Record<string, SiteConfig> = {
dreikoenige,
chemnitz,
}
const siteId = process.env.NEXT_PUBLIC_SITE_ID || 'dreikoenige'
const config = sites[siteId]
if (!config) {
throw new Error(
`Unknown SITE_ID "${siteId}". Available: ${Object.keys(sites).join(', ')}`,
)
}
export const siteConfig: SiteConfig = config
export const siteConfig = {
name: 'Katholische Pfarrei Heilige Drei Könige Berlin',
shortName: 'Hl. Drei Könige',
description:
'Katholische Pfarrei Heilige Drei Könige in Berlin Gottesdienste, Veranstaltungen, Sakramente und Gemeindeleben.',
url: 'https://dreikoenige.berlin',
keywords: [
'Katholische Pfarrei',
'Heilige Drei Könige',
'Berlin',
'Gottesdienst',
'Sakramente',
'Veranstaltungen',
'Gemeinde',
],
ogImage: '/og-logo.svg',
email: 'kontakt@dreikoenige.berlin',
}

View file

@ -1,75 +1,87 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { stringify } from 'qs-esm'
import { Announcement } from '@/payload-types'
import { PaginatedDocs } from 'payload'
/**
* Fetch last announcement for a parish
*/
export const fetchLastAnnouncement = async (
parishId: string,
): Promise<Announcement | undefined> => {
const date = new Date()
export const fetchLastAnnouncement = async (parishId: string): Promise<Announcement | undefined> => {
const date = new Date();
date.setDate(date.getDate() - 14)
const tomorrow = new Date()
tomorrow.setDate(tomorrow.getDate() + 1)
tomorrow.setHours(23, 59, 59, 59)
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
tomorrow.setHours(23,59,59,59);
const payload = await getPayload({ config })
const result = await payload.find({
collection: 'announcement',
sort: '-date',
where: {
and: [
{
parish: {
equals: parishId,
},
},
{
date: {
greater_than_equal: date.toISOString(),
},
},
{
date: {
less_than_equal: tomorrow.toISOString(),
},
},
],
const query: any = {
and: [
{
parish: {
equals: parishId
}
},
{
date: {
greater_than_equal: date.toISOString(),
}
},
{
date: {
less_than_equal: tomorrow.toISOString()
}
}
]
}
const stringifiedQuery = stringify(
{
sort: "-date",
where: query,
limit: 1,
},
limit: 1,
})
return result.docs[0]
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/announcement${stringifiedQuery}`)
if (!response.ok) return undefined
const announcements = await response.json() as PaginatedDocs<Announcement>
return announcements.docs[0]
}
/**
* Fetch the last few announcements
*/
export const fetchLastAnnouncements = async () => {
const date = new Date()
export const fetchLastAnnouncements = async (): Promise<PaginatedDocs<Announcement> | undefined> => {
const date = new Date();
date.setDate(date.getDate() - 14)
const tomorrow = new Date()
tomorrow.setDate(tomorrow.getDate() + 1)
tomorrow.setHours(23, 59, 59, 59)
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
tomorrow.setHours(23,59,59,59);
const payload = await getPayload({ config })
return payload.find({
collection: 'announcement',
sort: '-date',
where: {
and: [
{
date: {
greater_than_equal: date.toISOString(),
},
},
{
date: {
less_than_equal: tomorrow.toISOString(),
},
},
],
const query: any = {
and: [
{
date: {
greater_than_equal: date.toISOString(),
}
},
{
date: {
less_than_equal: tomorrow.toISOString()
}
}
]
}
const stringifiedQuery = stringify(
{
sort: "-date",
where: query,
limit: 3,
},
limit: 3,
})
}
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/announcement${stringifiedQuery}`)
if (!response.ok) return undefined
return await response.json() as PaginatedDocs<Announcement>
}

View file

@ -1,81 +1,73 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { Blog } from '@/payload-types'
import { PaginatedDocs } from 'payload'
import { stringify } from 'qs-esm'
/**
* Fetches blog posts based on given criteria.
*
* @param {boolean} displayOnFrontpage - Indicates whether to display posts on the front page.
* @returns {Promise<PaginatedDocs<Blog> | undefined>} - A Promise that resolves to the paginated list of blog posts, or undefined if an error occurs.
*/
export const fetchBlogPosts = async (displayOnFrontpage: boolean) => {
const today = new Date()
today.setHours(23, 59)
export const fetchBlogPosts = async (displayOnFrontpage: boolean): Promise<PaginatedDocs<Blog> | undefined> => {
const today = new Date();
today.setHours(23, 59);
const query: any = {
and: [
{
'_status': {
equals: 'published',
}
const query: any =
{
sort: "-date",
select: {
title: true,
date: true,
photo: true,
content: displayOnFrontpage ? undefined : true, // hack to fetch content only for the `/blog` page
},
{
or: [
where: {
and: [
{
'configuration.displayFromDate': {
equals: null,
},
or: [
{
"configuration.displayFromDate": {
equals: null
}
},
{
"configuration.displayFromDate": {
less_than_equal: today.toISOString(),
}
}
]
},
{
'configuration.displayFromDate': {
less_than_equal: today.toISOString(),
},
},
or: [
{
"configuration.displayTillDate": {
equals: null
}
},
{
"configuration.displayTillDate": {
greater_than_equal: today.toISOString(),
}
}
]
}
],
},
{
or: [
{
'configuration.displayTillDate': {
equals: null,
},
},
{
'configuration.displayTillDate': {
greater_than_equal: today.toISOString(),
},
},
],
},
],
}
limit: 18
};
if (displayOnFrontpage) {
query.and.push({
'configuration.showOnFrontpage': {
equals: true,
if(displayOnFrontpage) {
query.where.and.push({
"configuration.showOnFrontpage": {
equals: true
},
})
}
const payload = await getPayload({ config })
return payload.find({
collection: 'blog',
sort: '-date',
select: {
title: true,
date: true,
photo: true,
content: displayOnFrontpage ? undefined : true,
},
where: query,
limit: 18,
})
}
const stringifiedQuery = stringify(query, {addQueryPrefix: true})
export async function fetchBlog(id: string, draft: boolean) {
const payload = await getPayload({ config })
return await payload.findByID({
collection: 'blog',
id: id,
draft,
})
const resp = await fetch(`http://localhost:3000/api/blog${stringifiedQuery}`);
if (!resp.ok) return undefined;
return resp.json();
}

View file

@ -1,75 +1,89 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { stringify } from 'qs-esm'
import { PaginatedDocs } from 'payload'
import { Calendar } from '@/payload-types'
/**
* Fetch last calendar for a parish
*/
export const fetchLastCalendar = async (
parishId: string,
): Promise<Calendar | undefined> => {
const date = new Date()
date.setDate(date.getDate() - 14)
const tomorrow = new Date()
tomorrow.setDate(tomorrow.getDate() + 1)
tomorrow.setHours(23, 59, 59, 59)
export const fetchLastCalendar = async (parishId: string): Promise<Calendar | undefined> => {
const date = new Date();
date.setDate(date.getDate() - 14);
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
tomorrow.setHours(23,59,59,59);
const payload = await getPayload({ config })
const result = await payload.find({
collection: 'calendar',
sort: '-date',
where: {
and: [
{
parish: {
equals: parishId,
},
},
{
date: {
greater_than_equal: date.toISOString(),
},
},
{
date: {
less_than_equal: tomorrow.toISOString(),
},
},
],
const query: any = {
and: [
{
parish: {
equals: parishId
}
},
{
date: {
greater_than_equal: date.toISOString(),
}
},
{
date: {
less_than_equal: tomorrow.toISOString()
}
}
]
}
const stringifiedQuery = stringify(
{
sort: "-date",
where: query,
limit: 1,
},
limit: 1,
})
return result.docs[0]
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/calendar${stringifiedQuery}`)
if (!response.ok) return undefined
const announcements = await response.json() as PaginatedDocs<Calendar>
return announcements.docs[0]
}
/**
* Fetch last calendars
*/
export const fetchLastCalendars = async () => {
const date = new Date()
date.setDate(date.getDate() - 14)
const tomorrow = new Date()
tomorrow.setDate(tomorrow.getDate() + 1)
tomorrow.setHours(23, 59, 59, 59)
export const fetchLastCalendars = async (): Promise<PaginatedDocs<Calendar> | undefined> => {
const date = new Date();
date.setDate(date.getDate() - 14);
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
tomorrow.setHours(23,59,59,59);
const payload = await getPayload({ config })
return payload.find({
collection: 'calendar',
sort: '-date',
where: {
and: [
{
date: {
greater_than_equal: date.toISOString(),
},
},
{
date: {
less_than_equal: tomorrow.toISOString(),
},
},
],
const query: any = {
and: [
{
date: {
greater_than_equal: date.toISOString(),
}
},
{
date: {
less_than_equal: tomorrow.toISOString()
}
}
]
}
const stringifiedQuery = stringify(
{
sort: "-date",
where: query,
limit: 3,
},
limit: 3,
})
}
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/calendar${stringifiedQuery}`)
if (!response.ok) return undefined
return await response.json() as PaginatedDocs<Calendar>
}

17
src/fetch/churches.ts Normal file
View file

@ -0,0 +1,17 @@
import { Church } from '@/payload-types'
import { PaginatedDocs } from 'payload'
import { stringify } from 'qs-esm'
export const fetchChurches = async (): Promise<PaginatedDocs<Church> | undefined> => {
const stringifiedQuery = stringify(
{
sort: "name",
limit: 50
},
{ addQueryPrefix: true },
)
const resp = await fetch(`http://localhost:3000/api/church`);
if (!resp.ok) return undefined;
return resp.json();
}

View file

@ -1,19 +1,27 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { PaginatedDocs } from 'payload'
import { Classified } from '@/payload-types'
import { stringify } from 'qs-esm'
export const fetchClassifieds = async () => {
const date = new Date()
date.setHours(0, 0, 0, 0)
export const fetchClassifieds = async (): Promise<PaginatedDocs<Classified> | undefined> => {
const date = new Date();
date.setHours(0, 0, 0, 0);
const payload = await getPayload({ config })
return payload.find({
collection: 'classifieds',
sort: 'date',
where: {
until: {
greater_than_equal: date.toISOString(),
},
const query = {
until: {
greater_than_equal: date.toISOString(),
}
}
const stringifiedQuery = stringify(
{
sort: "date",
where: query,
limit: 50
},
limit: 50,
})
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/classifieds${stringifiedQuery}`)
if (!response.ok) return undefined
return response.json()
}

View file

@ -1,13 +1,13 @@
import { unstable_cache } from 'next/cache'
import { getPayload } from 'payload'
import config from '@/payload.config'
import { Menu } from '@/payload-types'
export const fetchMenu = unstable_cache(
async (): Promise<Menu> => {
const payload = await getPayload({ config })
return payload.findGlobal({ slug: 'menu' })
},
['menu'],
{ tags: ['menu'] },
)
export const fetchMenu = async (): Promise<Menu> => {
const rep = await fetch(
"http://localhost:3000/api/globals/menu",
{ next: { tags: ['menu'] } } // cache fetch result
);
if (!rep.ok) {
throw new Error("Could not fetch menu")
}
return await rep.json()
}

13
src/fetch/design.ts Normal file
View file

@ -0,0 +1,13 @@
import { Design } from '@/payload-types'
export async function fetchDesign(): Promise<Design> {
const res = await fetch('http://localhost:3000/api/globals/design', {
next: { tags: ['design'] },
})
if (!res.ok) {
throw new Error('Could not fetch design')
}
return res.json()
}

View file

@ -1,17 +1,21 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { DonationForm } from '@/payload-types'
export async function fetchDonationForm(
id: string,
): Promise<DonationForm | undefined> {
try {
const payload = await getPayload({ config })
return await payload.findByID({
collection: 'donation-form',
id,
})
} catch {
return undefined
}
}
export async function fetchDonationForm(id: string): Promise<DonationForm | undefined> {
// const query = {
// id: {
// equals: id,
// },
// }
//
// const stringifiedQuery = stringify(
// {
// where: query,
// },
// { addQueryPrefix: true },
// )
const res = await fetch(`http://localhost:3000/api/donation-form/${id}`);
if (!res.ok) return undefined
const response = await res.json() as DonationForm;
return response
}

View file

@ -1,43 +1,33 @@
import { getPayload, PaginatedDocs } from 'payload'
import config from '@/payload.config'
import { stringify } from 'qs-esm'
import { PaginatedDocs } from 'payload'
import { Event } from '@/payload-types'
type Args = {
parishId?: string
groupId?: string
limit?: number
page?: number
parishId?: string;
groupId?: string;
limit?: number;
page?: number;
fromDate?: Date
toDate?: Date
}
/**
* Fetch a list of events
*
*/
export async function fetchEvents(
args?: Args,
): Promise<PaginatedDocs<Event>> {
const {
parishId,
groupId,
limit = 30,
page = 0,
fromDate = new Date(),
toDate,
} = args || {}
export async function fetchEvents(args?: Args): Promise<PaginatedDocs<Event> | undefined> {
const {parishId, groupId, limit = 30, page = 0, fromDate = new Date(), toDate} = args || {};
const query: any = {
and: [
{
'_status': {
equals: 'published',
}
},
{
date: {
greater_than_equal: fromDate.toISOString(),
},
},
}
],
}
@ -45,54 +35,45 @@ export async function fetchEvents(
query.and.push({
date: {
less_than: toDate.toISOString(),
},
}
})
}
if (parishId) {
query.and.push({
parish: {
equals: parishId,
"parish": {
equals: parishId
},
})
}
if (groupId) {
query.and.push({
group: {
equals: groupId,
},
"group": {
equals: groupId
}
})
}
const payload = await getPayload({ config })
return payload.find({
collection: 'event',
sort: 'date',
where: query,
select: {
location: true,
date: true,
title: true,
cancelled: true,
},
depth: 1,
limit,
page,
}) as Promise<PaginatedDocs<Event>>
}
/**
* Fetch a single event by ID
*/
export async function fetchEventById(
id: string,
draft: boolean = false,
): Promise<Event | undefined> {
try {
const payload = await getPayload({ config })
return await payload.findByID({ collection: 'event', id, draft })
} catch {
return undefined
}
const stringifiedQuery = stringify(
{
sort: "date",
where: query,
select: {
location: true,
date: true,
title: true,
cancelled: true
},
depth: 1,
limit,
page
},
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/event${stringifiedQuery}`)
if (!response.ok) return undefined
return response.json()
}

View file

@ -1,13 +1,13 @@
import { unstable_cache } from 'next/cache'
import { getPayload } from 'payload'
import config from '@/payload.config'
import { Footer } from '@/payload-types'
export const fetchFooter = unstable_cache(
async (): Promise<Footer> => {
const payload = await getPayload({ config })
return payload.findGlobal({ slug: 'footer' })
},
['footer'],
{ tags: ['footer'] },
)
export async function fetchFooter(): Promise<Footer> {
const res = await fetch('http://localhost:3000/api/globals/footer', {
next: { tags: ['footer'] },
})
if (!res.ok) {
throw new Error('Could not fetch footer')
}
return res.json()
}

View file

@ -1,16 +1,22 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { stringify } from 'qs-esm'
import { PaginatedDocs } from 'payload'
import { Group } from '@/payload-types'
export async function fetchGroup(slug: string, draft: boolean = false) {
const payload = await getPayload({ config })
const result = await payload.find({
collection: 'group',
where: {
slug: {
equals: slug,
},
export async function fetchGroup(slug: string): Promise<PaginatedDocs<Group> | undefined> {
const query = {
slug: {
equals: slug,
},
draft,
})
return result.docs[0] ?? null
}
}
const stringifiedQuery = stringify(
{
where: query,
},
{ addQueryPrefix: true },
)
const res = await fetch(`http://localhost:3000/api/group${stringifiedQuery}`)
if (!res.ok) return undefined
return res.json()
}

View file

@ -1,52 +1,64 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { stringify } from 'qs-esm'
import { PaginatedDocs } from 'payload'
import { Highlight } from '@/payload-types'
export const fetchHighlights = async () => {
const date = new Date()
date.setHours(0, 0, 0, 0)
export const fetchHighlights = async (): Promise<PaginatedDocs<Highlight> | undefined> => {
const date = new Date();
date.setHours(0, 0, 0, 0);
const payload = await getPayload({ config })
return payload.find({
collection: 'highlight',
sort: 'date',
where: {
and: [
{
from: {
less_than_equal: date.toISOString(),
},
until: {
greater_than_equal: date.toISOString(),
},
const query: any = {
and: [
{
from: {
less_than_equal: date.toISOString(),
},
],
until: {
greater_than_equal: date.toISOString(),
}
}
],
}
const stringifiedQuery = stringify(
{
sort: "date",
where: query,
limit: 3
},
limit: 3,
})
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/highlight${stringifiedQuery}`)
if (!response.ok) return undefined
return response.json()
}
export const fetchHighlightsBetweenDates = async (
from: Date,
until: Date,
) => {
const payload = await getPayload({ config })
return payload.find({
collection: 'highlight',
sort: 'date',
where: {
and: [
{
date: {
greater_than_equal: from.toISOString(),
},
},
{
date: {
less_than: until.toISOString(),
},
},
],
export const fetchHighlightsBetweenDates = async (from: Date, until: Date): Promise<PaginatedDocs<Highlight> | undefined> => {
const query: any = {
and: [
{
date: {
greater_than_equal: from.toISOString(),
}
},
{
date: {
less_than: until.toISOString(),
}
}
],
}
const stringifiedQuery = stringify(
{
sort: "date",
where: query,
limit: 5
},
limit: 5,
})
}
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/highlight${stringifiedQuery}`)
if (!response.ok) return undefined
return response.json()
}

View file

@ -1,20 +1,27 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { stringify } from 'qs-esm'
import { PaginatedDocs } from 'payload'
import { Magazine } from '@/payload-types'
/**
* Asynchronously fetches the last magazine entry.
* Asynchronously fetches the last magazine entry from the specified API endpoint.
*
* @returns {Promise<Magazine | undefined>} The last magazine entry if successful, or undefined.
* This function sends a request to the specified API endpoint to fetch the last magazine based on the given sorting criteria.
*
* @returns {Promise<Magazine | undefined>} A Promise that resolves to the last fetched magazine entry if successful, or undefined if an error occurs.
*/
export const fetchLastMagazine = async (): Promise<
Magazine | undefined
> => {
const payload = await getPayload({ config })
const result = await payload.find({
collection: 'magazine',
sort: '-date',
limit: 1,
})
return result.docs[0]
}
export const fetchLastMagazine = async (): Promise<Magazine | undefined> => {
const stringifiedQuery = stringify(
{
sort: "-date",
limit: 1,
},
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/magazine${stringifiedQuery}`)
if (!response.ok) return undefined
const announcements = await response.json() as PaginatedDocs<Magazine>
return announcements.docs[0]
}

View file

@ -1,32 +1,25 @@
import { unstable_cache } from 'next/cache'
import { getPayload } from 'payload'
import config from '@/payload.config'
import { Page } from '@/payload-types'
import { stringify } from 'qs-esm'
export async function fetchPageBySlug(
slug: string,
draft: boolean = false,
): Promise<Page | undefined> {
const fetchPage = async () => {
const payload = await getPayload({ config })
const data = await payload.find({
collection: 'pages',
const query = stringify(
{
where: {
slug: {
equals: slug,
},
},
limit: 1,
draft,
})
return data.docs?.[0] ?? undefined
}
},
{ addQueryPrefix: true },
)
if (draft) {
return fetchPage()
}
return unstable_cache(fetchPage, ['pages', slug], {
tags: ['pages', `pages-${slug}`],
})()
const res = await fetch(`http://localhost:3000/api/pages${query}`, {
next: { tags: ['pages', `pages-${slug}`] },
})
if (!res.ok) return undefined
const data = await res.json()
return data.docs?.[0]
}

View file

@ -1,16 +1,22 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { stringify } from 'qs-esm'
import { PaginatedDocs } from 'payload'
import { Parish } from '@/payload-types'
export async function fetchParish(slug: string, draft: boolean = false) {
const payload = await getPayload({ config })
const result = await payload.find({
collection: 'parish',
where: {
slug: {
equals: slug,
},
export async function fetchParish(slug: string): Promise<PaginatedDocs<Parish> | undefined> {
const query = {
slug: {
equals: slug,
},
draft,
})
return result.docs[0] ?? null
}
}
const stringifiedQuery = stringify(
{
where: query,
},
{ addQueryPrefix: true },
)
const res = await fetch(`http://localhost:3000/api/parish${stringifiedQuery}`)
if (!res.ok) return undefined
return res.json()
}

View file

@ -1,5 +1,4 @@
import { getPayload } from 'payload'
import config from '@/payload.config'
import { stringify } from 'qs-esm'
import { PopePrayerIntention } from '@/payload-types'
/**
@ -8,26 +7,30 @@ import { PopePrayerIntention } from '@/payload-types'
* @param year
* @param month - in the form of '01' for january, '02' for february ...
*/
export const fetchPopePrayerIntentions = async (
year: number,
month: string,
): Promise<PopePrayerIntention | undefined> => {
const payload = await getPayload({ config })
const result = await payload.find({
collection: 'popePrayerIntentions',
where: {
and: [
{
month: {
equals: month,
},
year: {
equals: year,
},
export const fetchPopePrayerIntentions = async (year: number, month: string): Promise<PopePrayerIntention | undefined> => {
const query: any = {
and: [
{
month: {
equals: month,
},
],
year: {
equals: year
}
}
],
}
const stringifiedQuery = stringify(
{
where: query,
limit: 1
},
limit: 1,
})
return result.docs[0]
}
{ addQueryPrefix: true },
)
const response = await fetch(`http://localhost:3000/api/popePrayerIntentions${stringifiedQuery}`)
if (!response.ok) return undefined
let data = await response.json()
return data.docs[0]
}

View file

@ -1,16 +1,11 @@
import { unstable_cache } from 'next/cache'
import { getPayload } from 'payload'
import config from '@/payload.config'
import { Prayer } from '@/payload-types'
export const fetchPrayers = unstable_cache(
async (): Promise<string[]> => {
const payload = await getPayload({ config })
const data = await payload.find({
collection: 'prayers',
limit: 0,
})
return data.docs.map((p) => p.text)
},
['prayers'],
{ tags: ['prayers'] },
)
export async function fetchPrayers(): Promise<string[]> {
const res = await fetch(
'http://localhost:3000/api/prayers?limit=0',
{ next: { tags: ['prayers'] } },
)
if (!res.ok) return []
const data = await res.json()
return (data.docs as Prayer[]).map((p) => p.text)
}

16
src/fetch/siteConfig.ts Normal file
View file

@ -0,0 +1,16 @@
import { SiteConfig } from '@/payload-types'
export async function fetchSiteConfig(): Promise<SiteConfig> {
const res = await fetch(
'http://localhost:3000/api/globals/site-config',
{
next: { tags: ['site-config'] },
},
)
if (!res.ok) {
throw new Error('Could not fetch site-config')
}
return res.json()
}

View file

@ -1,76 +1,67 @@
import { getPayload, PaginatedDocs } from 'payload'
import config from '@/payload.config'
import { stringify } from 'qs-esm'
import { PaginatedDocs } from 'payload'
import { Worship } from '@/payload-types'
type FetchWorshipArgs = {
fromDate?: Date
tillDate?: Date
fromDate?: Date,
tillDate?: Date,
locations?: string[]
}
export const fetchWorship = async (
args?: FetchWorshipArgs,
): Promise<PaginatedDocs<Worship>> => {
const { fromDate, tillDate, locations } = args || {}
export const fetchWorship = async (args?: FetchWorshipArgs): Promise<PaginatedDocs<Worship> | undefined> => {
let date = fromDate
const {fromDate, tillDate, locations} = args || {}
let date = fromDate;
if (!date) {
date = new Date()
date.setHours(0, 0, 0, 0)
date = new Date();
date.setHours(0, 0, 0, 0);
}
const query: any = {
and: [
{
date: {
greater_than_equal: date.toISOString(),
},
},
}
],
}
if (tillDate) {
query.and.push({
date: {
less_than: tillDate.toISOString(),
},
less_than: tillDate.toISOString()
}
})
}
if (locations) {
if (locations ) {
query.and.push({
location: {
in: locations,
},
in: locations
}
})
}
const payload = await getPayload({ config })
return payload.find({
collection: 'worship',
sort: 'date',
where: query,
select: {
type: true,
date: true,
cancelled: true,
location: true,
title: true,
const stringifiedQuery = stringify(
{
sort: "date",
where: query,
select: {
type: true,
date: true,
cancelled: true,
location: true,
title: true,
},
limit: 15
},
limit: 15,
}) as Promise<PaginatedDocs<Worship>>
}
{ addQueryPrefix: true },
)
/**
* Fetch a single worship entry by ID
*/
export async function fetchWorshipById(
id: string,
): Promise<Worship | undefined> {
try {
const payload = await getPayload({ config })
return await payload.findByID({ collection: 'worship', id })
} catch {
return undefined
}
}
const response = await fetch(`http://localhost:3000/api/worship${stringifiedQuery}`)
if (!response.ok) return undefined
return response.json()
}

131
src/globals/Design.ts Normal file
View file

@ -0,0 +1,131 @@
import { GlobalConfig } from 'payload'
import { isAdmin } from '@/collections/access/admin'
import { revalidateTag } from 'next/cache'
import { FONT_OPTIONS } from '@/assets/fontOptions'
const hexColorValidation = (value: string | null | undefined) => {
if (!value) return true
if (/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(value)) return true
return 'Bitte geben Sie einen gültigen Hex-Farbwert ein (z.B. #016699)'
}
const colorFieldAdmin = {
components: {
Field: '@/admin/components/ColorPicker/ColorPicker',
},
}
export const DesignGlobal: GlobalConfig = {
slug: 'design',
label: {
de: 'Design',
},
admin: {
description:
'Hier können Sie die Farben und das Erscheinungsbild der Website konfigurieren.',
hidden: args => args.user?.roles === "user"
},
fields: [
{
type: 'collapsible',
label: 'Farben',
fields: [
{
name: 'baseColor',
type: 'text',
label: { de: 'Grundfarbe' },
defaultValue: '#016699',
validate: hexColorValidation,
admin: colorFieldAdmin,
},
{
name: 'shade1',
type: 'text',
label: { de: 'Farbton 1' },
defaultValue: '#67A3C2',
validate: hexColorValidation,
admin: colorFieldAdmin,
},
{
name: 'shade2',
type: 'text',
label: { de: 'Farbton 2' },
defaultValue: '#DDECF7',
validate: hexColorValidation,
admin: colorFieldAdmin,
},
{
name: 'shade3',
type: 'text',
label: { de: 'Farbton 3' },
defaultValue: '#eff6ff',
validate: hexColorValidation,
admin: colorFieldAdmin,
},
{
name: 'contrastColor',
type: 'text',
label: { de: 'Kontrastfarbe' },
defaultValue: '#CE490F',
validate: hexColorValidation,
admin: colorFieldAdmin,
},
{
name: 'contrastShade1',
type: 'text',
label: { de: 'Kontrastfarbton 1' },
defaultValue: '#DA764B',
validate: hexColorValidation,
admin: colorFieldAdmin,
},
],
},
{
type: 'collapsible',
label: 'Schriftarten',
fields: [
{
name: 'defaultFont',
type: 'select',
label: { de: 'Standardschrift' },
defaultValue: 'cairo',
options: FONT_OPTIONS.map((o) => ({
label: o.label,
value: o.value,
})),
admin: {
description:
'Die Hauptschrift für den gesamten Text der Website.',
},
},
{
name: 'headerFont',
type: 'select',
label: { de: 'Überschriftenschrift' },
defaultValue: 'faustina',
options: FONT_OPTIONS.map((o) => ({
label: o.label,
value: o.value,
})),
admin: {
description:
'Die Schrift für Überschriften und hervorgehobenen Text.',
},
},
],
},
{
name: 'borderRadius',
type: 'text',
label: { de: 'Eckenradius' },
defaultValue: '13px',
},
],
access: {
read: () => true,
update: isAdmin(),
},
hooks: {
afterChange: [() => revalidateTag('design')],
},
}

View file

@ -1,7 +1,6 @@
import { GlobalConfig } from 'payload'
import { isAdmin } from '@/collections/access/admin'
import { revalidateTag } from 'next/cache'
import { validateHref } from '@/globals/ValidateHref'
export const FooterGlobal: GlobalConfig = {
slug: 'footer',
@ -51,7 +50,6 @@ export const FooterGlobal: GlobalConfig = {
label: {
de: 'Zieladresse',
},
validate: validateHref,
},
],
},

View file

@ -1,7 +1,6 @@
import { Block, GlobalConfig } from 'payload'
import { isAdmin } from '@/collections/access/admin'
import { hide, isAdmin } from '@/collections/access/admin'
import { revalidateTag } from 'next/cache'
import { validateHref } from '@/globals/ValidateHref'
const SimpleItem: Block = {
slug: 'simple-item',
@ -19,8 +18,7 @@ const SimpleItem: Block = {
name: 'href',
type: 'text',
label: 'Zieladresse',
required: true,
validate: validateHref,
required: true
},
{
name: 'type',
@ -95,7 +93,6 @@ const MegaMenuItem: Block = {
label: 'Zieladresse',
type: 'text',
required: true,
validate: validateHref,
}
],
required: true,

103
src/globals/SiteConfig.ts Normal file
View file

@ -0,0 +1,103 @@
import { GlobalConfig } from 'payload'
import { isAdmin } from '@/collections/access/admin'
import { revalidateTag } from 'next/cache'
export const SiteConfigGlobal: GlobalConfig = {
slug: 'site-config',
label: {
de: 'Website-Einstellungen',
},
admin: {
description:
'Hier können Sie den Namen, die Beschreibung und andere allgemeine Einstellungen der Website konfigurieren.',
hidden: args => args.user?.roles === "user"
},
fields: [
{
name: 'name',
type: 'text',
label: { de: 'Name der Pfarrei' },
required: true,
defaultValue:
'Katholische Pfarrei Heilige Drei Könige Berlin',
},
{
name: 'shortName',
type: 'text',
label: { de: 'Kurzname' },
required: true,
defaultValue: 'Hl. Drei Könige',
admin: {
description:
'Wird im Browser-Tab als Suffix verwendet (z.B. "Seite | Hl. Drei Könige").',
},
},
{
name: 'description',
type: 'textarea',
label: { de: 'Beschreibung' },
required: true,
defaultValue:
'Katholische Pfarrei Heilige Drei Könige in Berlin Gottesdienste, Veranstaltungen, Sakramente und Gemeindeleben.',
admin: {
description: 'Meta-Beschreibung für Suchmaschinen.',
},
},
{
name: 'url',
type: 'text',
label: { de: 'Website-URL' },
required: true,
defaultValue: 'https://dreikoenige.berlin',
},
{
name: 'ogImage',
type: 'text',
label: { de: 'Open Graph Bild' },
defaultValue: '/og-logo.svg',
admin: {
description:
'Pfad zum Vorschaubild für soziale Medien.',
},
},
{
name: 'email',
type: 'email',
label: { de: 'Kontakt-E-Mail' },
required: true,
defaultValue: 'kontakt@dreikoenige.berlin',
admin: {
description:
'Standard-E-Mail-Adresse für Kontaktformulare.',
},
},
{
name: 'keywords',
type: 'array',
label: { de: 'Schlüsselwörter' },
labels: {
singular: { de: 'Schlüsselwort' },
plural: { de: 'Schlüsselwörter' },
},
admin: {
description:
'SEO-Schlüsselwörter für Suchmaschinen.',
},
fields: [
{
name: 'keyword',
type: 'text',
required: true,
label: { de: 'Schlüsselwort' },
},
],
},
],
access: {
read: () => true,
update: isAdmin(),
},
hooks: {
afterChange: [() => revalidateTag('site-config')],
},
}

View file

@ -1,16 +0,0 @@
/**
* Payload field validator for href/link fields.
* Ensures values start with `/`, `http://`, or `https://`
* to prevent malformed or relative URLs.
*/
export const validateHref = (value: string | null | undefined) => {
if (
value &&
!value.startsWith('/') &&
!value.startsWith('http://') &&
!value.startsWith('https://')
) {
return 'Zieladresse muss mit "/", "http://" oder "https://" beginnen'
}
return true
}

File diff suppressed because it is too large Load diff

View file

@ -1,66 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "design" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "site_config_keywords" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "site_config" DISABLE ROW LEVEL SECURITY;
DROP TABLE "design" CASCADE;
DROP TABLE "site_config_keywords" CASCADE;
DROP TABLE "site_config" CASCADE;
ALTER TABLE "announcement" ALTER COLUMN "date" SET DEFAULT '2026-03-15T10:58:14.115Z';
ALTER TABLE "calendar" ALTER COLUMN "date" SET DEFAULT '2026-03-15T10:58:14.432Z';
ALTER TABLE "classifieds" ALTER COLUMN "until" SET DEFAULT '2026-04-09T09:58:14.493Z';
ALTER TABLE "documents" DROP COLUMN "prefix";
ALTER TABLE "media" DROP COLUMN "prefix";
DROP TYPE "public"."enum_design_default_font";
DROP TYPE "public"."enum_design_header_font";`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_design_default_font" AS ENUM('cairo', 'roboto', 'openSans', 'lato', 'nunito', 'raleway', 'faustina', 'merriweather', 'sourceSans3', 'playfairDisplay', 'lora', 'crimsonText', 'ebGaramond');
CREATE TYPE "public"."enum_design_header_font" AS ENUM('cairo', 'roboto', 'openSans', 'lato', 'nunito', 'raleway', 'faustina', 'merriweather', 'sourceSans3', 'playfairDisplay', 'lora', 'crimsonText', 'ebGaramond');
CREATE TABLE "design" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"base_color" varchar DEFAULT '#016699',
"shade1" varchar DEFAULT '#67A3C2',
"shade2" varchar DEFAULT '#DDECF7',
"shade3" varchar DEFAULT '#eff6ff',
"contrast_color" varchar DEFAULT '#CE490F',
"contrast_shade1" varchar DEFAULT '#DA764B',
"default_font" "enum_design_default_font" DEFAULT 'cairo',
"header_font" "enum_design_header_font" DEFAULT 'faustina',
"border_radius" varchar DEFAULT '13px',
"updated_at" timestamp(3) with time zone,
"created_at" timestamp(3) with time zone
);
CREATE TABLE "site_config_keywords" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"keyword" varchar NOT NULL
);
CREATE TABLE "site_config" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"name" varchar DEFAULT 'Katholische Pfarrei Heilige Drei Könige Berlin' NOT NULL,
"short_name" varchar DEFAULT 'Hl. Drei Könige' NOT NULL,
"description" varchar DEFAULT 'Katholische Pfarrei Heilige Drei Könige in Berlin Gottesdienste, Veranstaltungen, Sakramente und Gemeindeleben.' NOT NULL,
"url" varchar DEFAULT 'https://dreikoenige.berlin' NOT NULL,
"og_image" varchar DEFAULT '/og-logo.svg',
"email" varchar DEFAULT 'kontakt@dreikoenige.berlin' NOT NULL,
"updated_at" timestamp(3) with time zone,
"created_at" timestamp(3) with time zone
);
ALTER TABLE "announcement" ALTER COLUMN "date" SET DEFAULT '2026-03-15T11:16:16.612Z';
ALTER TABLE "calendar" ALTER COLUMN "date" SET DEFAULT '2026-03-15T11:16:16.901Z';
ALTER TABLE "classifieds" ALTER COLUMN "until" SET DEFAULT '2026-04-08T10:16:16.962Z';
ALTER TABLE "documents" ADD COLUMN "prefix" varchar DEFAULT 'documents/';
ALTER TABLE "media" ADD COLUMN "prefix" varchar DEFAULT 'media/';
ALTER TABLE "site_config_keywords" ADD CONSTRAINT "site_config_keywords_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."site_config"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "site_config_keywords_order_idx" ON "site_config_keywords" USING btree ("_order");
CREATE INDEX "site_config_keywords_parent_id_idx" ON "site_config_keywords" USING btree ("_parent_id");`)
}

File diff suppressed because it is too large Load diff

View file

@ -1,238 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_blog_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum__blog_v_blocks_text_width" AS ENUM('1/2', '3/4');
CREATE TYPE "public"."enum__blog_v_version_status" AS ENUM('draft', 'published');
CREATE TABLE "_blog_v_blocks_text" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"content" jsonb,
"width" "enum__blog_v_blocks_text_width" DEFAULT '1/2',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_blog_v_blocks_document" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"file_id" uuid,
"button" varchar DEFAULT 'Download Flyer',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_blog_v_blocks_donation" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_blog_v_blocks_contactform" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"title" varchar DEFAULT 'Ich bin dabei!',
"description" varchar DEFAULT 'Um dich anzumelden oder uns zu unterstützen, fülle bitte das Kontaktformular aus. Wir freuen uns sehr, dass du Teil unserer Gemeinschaft bist und mit deinem Engagement dazu beiträgst, unsere Ziele zu erreichen. Solltest du Fragen haben oder weitere Informationen benötigen, zögere nicht, uns zu kontaktieren wir sind gerne für dich da!',
"email" varchar DEFAULT 'kontakt@mutter-teresa-chemnitz.de',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_blog_v_blocks_gallery_items" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"photo_id" uuid,
"_uuid" varchar
);
CREATE TABLE "_blog_v_blocks_gallery" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_blog_v_blocks_youtube" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"youtube_id" varchar,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_blog_v_blocks_button" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"text" varchar,
"url" varchar,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_blog_v" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"parent_id" uuid,
"version_photo_id" uuid,
"version_title" varchar,
"version_content_excerpt" varchar,
"version_configuration_show_on_frontpage" boolean DEFAULT true,
"version_configuration_display_from_date" timestamp(3) with time zone,
"version_configuration_display_till_date" timestamp(3) with time zone,
"version_updated_at" timestamp(3) with time zone,
"version_created_at" timestamp(3) with time zone,
"version__status" "enum__blog_v_version_status" DEFAULT 'draft',
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"latest" boolean,
"autosave" boolean
);
CREATE TABLE "_blog_v_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" uuid NOT NULL,
"path" varchar NOT NULL,
"parish_id" uuid
);
ALTER TABLE "announcement" ALTER COLUMN "date" SET DEFAULT '2026-03-15T14:38:00.254Z';
ALTER TABLE "calendar" ALTER COLUMN "date" SET DEFAULT '2026-03-15T14:38:00.534Z';
ALTER TABLE "blog_blocks_text" ALTER COLUMN "content" DROP NOT NULL;
ALTER TABLE "blog_blocks_text" ALTER COLUMN "width" DROP NOT NULL;
ALTER TABLE "blog_blocks_document" ALTER COLUMN "file_id" DROP NOT NULL;
ALTER TABLE "blog_blocks_document" ALTER COLUMN "button" DROP NOT NULL;
ALTER TABLE "blog_blocks_contactform" ALTER COLUMN "title" DROP NOT NULL;
ALTER TABLE "blog_blocks_contactform" ALTER COLUMN "description" DROP NOT NULL;
ALTER TABLE "blog_blocks_contactform" ALTER COLUMN "email" SET DEFAULT 'kontakt@mutter-teresa-chemnitz.de';
ALTER TABLE "blog_blocks_contactform" ALTER COLUMN "email" DROP NOT NULL;
ALTER TABLE "blog_blocks_gallery_items" ALTER COLUMN "photo_id" DROP NOT NULL;
ALTER TABLE "blog_blocks_youtube" ALTER COLUMN "youtube_id" DROP NOT NULL;
ALTER TABLE "blog_blocks_button" ALTER COLUMN "text" DROP NOT NULL;
ALTER TABLE "blog_blocks_button" ALTER COLUMN "url" DROP NOT NULL;
ALTER TABLE "blog" ALTER COLUMN "title" DROP NOT NULL;
ALTER TABLE "blog" ALTER COLUMN "content_excerpt" DROP NOT NULL;
ALTER TABLE "blog" ALTER COLUMN "configuration_show_on_frontpage" DROP NOT NULL;
ALTER TABLE "classifieds" ALTER COLUMN "until" SET DEFAULT '2026-04-09T13:38:00.592Z';
ALTER TABLE "group_blocks_contactform" ALTER COLUMN "email" SET DEFAULT 'kontakt@mutter-teresa-chemnitz.de';
ALTER TABLE "pages_blocks_contactform" ALTER COLUMN "email" SET DEFAULT 'kontakt@mutter-teresa-chemnitz.de';
ALTER TABLE "blog" ADD COLUMN "_status" "enum_blog_status" DEFAULT 'draft';
ALTER TABLE "_blog_v_blocks_text" ADD CONSTRAINT "_blog_v_blocks_text_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_blog_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_blog_v_blocks_document" ADD CONSTRAINT "_blog_v_blocks_document_file_id_documents_id_fk" FOREIGN KEY ("file_id") REFERENCES "public"."documents"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_blog_v_blocks_document" ADD CONSTRAINT "_blog_v_blocks_document_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_blog_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_blog_v_blocks_donation" ADD CONSTRAINT "_blog_v_blocks_donation_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_blog_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_blog_v_blocks_contactform" ADD CONSTRAINT "_blog_v_blocks_contactform_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_blog_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_blog_v_blocks_gallery_items" ADD CONSTRAINT "_blog_v_blocks_gallery_items_photo_id_media_id_fk" FOREIGN KEY ("photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_blog_v_blocks_gallery_items" ADD CONSTRAINT "_blog_v_blocks_gallery_items_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_blog_v_blocks_gallery"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_blog_v_blocks_gallery" ADD CONSTRAINT "_blog_v_blocks_gallery_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_blog_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_blog_v_blocks_youtube" ADD CONSTRAINT "_blog_v_blocks_youtube_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_blog_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_blog_v_blocks_button" ADD CONSTRAINT "_blog_v_blocks_button_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_blog_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_blog_v" ADD CONSTRAINT "_blog_v_parent_id_blog_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."blog"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_blog_v" ADD CONSTRAINT "_blog_v_version_photo_id_media_id_fk" FOREIGN KEY ("version_photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_blog_v_rels" ADD CONSTRAINT "_blog_v_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."_blog_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_blog_v_rels" ADD CONSTRAINT "_blog_v_rels_parish_fk" FOREIGN KEY ("parish_id") REFERENCES "public"."parish"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "_blog_v_blocks_text_order_idx" ON "_blog_v_blocks_text" USING btree ("_order");
CREATE INDEX "_blog_v_blocks_text_parent_id_idx" ON "_blog_v_blocks_text" USING btree ("_parent_id");
CREATE INDEX "_blog_v_blocks_text_path_idx" ON "_blog_v_blocks_text" USING btree ("_path");
CREATE INDEX "_blog_v_blocks_document_order_idx" ON "_blog_v_blocks_document" USING btree ("_order");
CREATE INDEX "_blog_v_blocks_document_parent_id_idx" ON "_blog_v_blocks_document" USING btree ("_parent_id");
CREATE INDEX "_blog_v_blocks_document_path_idx" ON "_blog_v_blocks_document" USING btree ("_path");
CREATE INDEX "_blog_v_blocks_document_file_idx" ON "_blog_v_blocks_document" USING btree ("file_id");
CREATE INDEX "_blog_v_blocks_donation_order_idx" ON "_blog_v_blocks_donation" USING btree ("_order");
CREATE INDEX "_blog_v_blocks_donation_parent_id_idx" ON "_blog_v_blocks_donation" USING btree ("_parent_id");
CREATE INDEX "_blog_v_blocks_donation_path_idx" ON "_blog_v_blocks_donation" USING btree ("_path");
CREATE INDEX "_blog_v_blocks_contactform_order_idx" ON "_blog_v_blocks_contactform" USING btree ("_order");
CREATE INDEX "_blog_v_blocks_contactform_parent_id_idx" ON "_blog_v_blocks_contactform" USING btree ("_parent_id");
CREATE INDEX "_blog_v_blocks_contactform_path_idx" ON "_blog_v_blocks_contactform" USING btree ("_path");
CREATE INDEX "_blog_v_blocks_gallery_items_order_idx" ON "_blog_v_blocks_gallery_items" USING btree ("_order");
CREATE INDEX "_blog_v_blocks_gallery_items_parent_id_idx" ON "_blog_v_blocks_gallery_items" USING btree ("_parent_id");
CREATE INDEX "_blog_v_blocks_gallery_items_photo_idx" ON "_blog_v_blocks_gallery_items" USING btree ("photo_id");
CREATE INDEX "_blog_v_blocks_gallery_order_idx" ON "_blog_v_blocks_gallery" USING btree ("_order");
CREATE INDEX "_blog_v_blocks_gallery_parent_id_idx" ON "_blog_v_blocks_gallery" USING btree ("_parent_id");
CREATE INDEX "_blog_v_blocks_gallery_path_idx" ON "_blog_v_blocks_gallery" USING btree ("_path");
CREATE INDEX "_blog_v_blocks_youtube_order_idx" ON "_blog_v_blocks_youtube" USING btree ("_order");
CREATE INDEX "_blog_v_blocks_youtube_parent_id_idx" ON "_blog_v_blocks_youtube" USING btree ("_parent_id");
CREATE INDEX "_blog_v_blocks_youtube_path_idx" ON "_blog_v_blocks_youtube" USING btree ("_path");
CREATE INDEX "_blog_v_blocks_button_order_idx" ON "_blog_v_blocks_button" USING btree ("_order");
CREATE INDEX "_blog_v_blocks_button_parent_id_idx" ON "_blog_v_blocks_button" USING btree ("_parent_id");
CREATE INDEX "_blog_v_blocks_button_path_idx" ON "_blog_v_blocks_button" USING btree ("_path");
CREATE INDEX "_blog_v_parent_idx" ON "_blog_v" USING btree ("parent_id");
CREATE INDEX "_blog_v_version_version_photo_idx" ON "_blog_v" USING btree ("version_photo_id");
CREATE INDEX "_blog_v_version_version_updated_at_idx" ON "_blog_v" USING btree ("version_updated_at");
CREATE INDEX "_blog_v_version_version_created_at_idx" ON "_blog_v" USING btree ("version_created_at");
CREATE INDEX "_blog_v_version_version__status_idx" ON "_blog_v" USING btree ("version__status");
CREATE INDEX "_blog_v_created_at_idx" ON "_blog_v" USING btree ("created_at");
CREATE INDEX "_blog_v_updated_at_idx" ON "_blog_v" USING btree ("updated_at");
CREATE INDEX "_blog_v_latest_idx" ON "_blog_v" USING btree ("latest");
CREATE INDEX "_blog_v_autosave_idx" ON "_blog_v" USING btree ("autosave");
CREATE INDEX "_blog_v_rels_order_idx" ON "_blog_v_rels" USING btree ("order");
CREATE INDEX "_blog_v_rels_parent_idx" ON "_blog_v_rels" USING btree ("parent_id");
CREATE INDEX "_blog_v_rels_path_idx" ON "_blog_v_rels" USING btree ("path");
CREATE INDEX "_blog_v_rels_parish_id_idx" ON "_blog_v_rels" USING btree ("parish_id");
CREATE INDEX "blog__status_idx" ON "blog" USING btree ("_status");`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "_blog_v_blocks_text" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_blog_v_blocks_document" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_blog_v_blocks_donation" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_blog_v_blocks_contactform" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_blog_v_blocks_gallery_items" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_blog_v_blocks_gallery" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_blog_v_blocks_youtube" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_blog_v_blocks_button" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_blog_v" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_blog_v_rels" DISABLE ROW LEVEL SECURITY;
DROP TABLE "_blog_v_blocks_text" CASCADE;
DROP TABLE "_blog_v_blocks_document" CASCADE;
DROP TABLE "_blog_v_blocks_donation" CASCADE;
DROP TABLE "_blog_v_blocks_contactform" CASCADE;
DROP TABLE "_blog_v_blocks_gallery_items" CASCADE;
DROP TABLE "_blog_v_blocks_gallery" CASCADE;
DROP TABLE "_blog_v_blocks_youtube" CASCADE;
DROP TABLE "_blog_v_blocks_button" CASCADE;
DROP TABLE "_blog_v" CASCADE;
DROP TABLE "_blog_v_rels" CASCADE;
DROP INDEX "blog__status_idx";
ALTER TABLE "announcement" ALTER COLUMN "date" SET DEFAULT '2026-03-15T10:58:14.115Z';
ALTER TABLE "calendar" ALTER COLUMN "date" SET DEFAULT '2026-03-15T10:58:14.432Z';
ALTER TABLE "blog_blocks_text" ALTER COLUMN "content" SET NOT NULL;
ALTER TABLE "blog_blocks_text" ALTER COLUMN "width" SET NOT NULL;
ALTER TABLE "blog_blocks_document" ALTER COLUMN "file_id" SET NOT NULL;
ALTER TABLE "blog_blocks_document" ALTER COLUMN "button" SET NOT NULL;
ALTER TABLE "blog_blocks_contactform" ALTER COLUMN "title" SET NOT NULL;
ALTER TABLE "blog_blocks_contactform" ALTER COLUMN "description" SET NOT NULL;
ALTER TABLE "blog_blocks_contactform" ALTER COLUMN "email" DROP DEFAULT;
ALTER TABLE "blog_blocks_contactform" ALTER COLUMN "email" SET NOT NULL;
ALTER TABLE "blog_blocks_gallery_items" ALTER COLUMN "photo_id" SET NOT NULL;
ALTER TABLE "blog_blocks_youtube" ALTER COLUMN "youtube_id" SET NOT NULL;
ALTER TABLE "blog_blocks_button" ALTER COLUMN "text" SET NOT NULL;
ALTER TABLE "blog_blocks_button" ALTER COLUMN "url" SET NOT NULL;
ALTER TABLE "blog" ALTER COLUMN "title" SET NOT NULL;
ALTER TABLE "blog" ALTER COLUMN "content_excerpt" SET NOT NULL;
ALTER TABLE "blog" ALTER COLUMN "configuration_show_on_frontpage" SET NOT NULL;
ALTER TABLE "classifieds" ALTER COLUMN "until" SET DEFAULT '2026-04-09T09:58:14.493Z';
ALTER TABLE "group_blocks_contactform" ALTER COLUMN "email" DROP DEFAULT;
ALTER TABLE "pages_blocks_contactform" ALTER COLUMN "email" DROP DEFAULT;
ALTER TABLE "blog" DROP COLUMN "_status";
DROP TYPE "public"."enum_blog_status";
DROP TYPE "public"."enum__blog_v_blocks_text_width";
DROP TYPE "public"."enum__blog_v_version_status";`)
}

File diff suppressed because it is too large Load diff

View file

@ -1,59 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "pages_blocks_collapsible_image_with_text" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "pages_blocks_publication_and_newsletter" DISABLE ROW LEVEL SECURITY;
DROP TABLE "pages_blocks_collapsible_image_with_text" CASCADE;
DROP TABLE "pages_blocks_publication_and_newsletter" CASCADE;
DROP INDEX "_blog_v_autosave_idx";
ALTER TABLE "announcement" ALTER COLUMN "date" SET DEFAULT '2026-03-15T10:59:47.266Z';
ALTER TABLE "calendar" ALTER COLUMN "date" SET DEFAULT '2026-03-15T10:59:47.547Z';
ALTER TABLE "classifieds" ALTER COLUMN "until" SET DEFAULT '2026-04-10T09:59:47.604Z';
ALTER TABLE "_blog_v" DROP COLUMN "autosave";
DROP TYPE "public"."enum_pages_blocks_collapsible_image_with_text_background_color";
DROP TYPE "public"."enum_pages_blocks_collapsible_image_with_text_schema";`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_pages_blocks_collapsible_image_with_text_background_color" AS ENUM('none', 'soft', 'off-white');
CREATE TYPE "public"."enum_pages_blocks_collapsible_image_with_text_schema" AS ENUM('base', 'contrast');
CREATE TABLE "pages_blocks_collapsible_image_with_text" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"title" varchar NOT NULL,
"text" varchar NOT NULL,
"image_id" uuid NOT NULL,
"content" jsonb NOT NULL,
"background_color" "enum_pages_blocks_collapsible_image_with_text_background_color" DEFAULT 'none',
"schema" "enum_pages_blocks_collapsible_image_with_text_schema" DEFAULT 'base',
"block_name" varchar
);
CREATE TABLE "pages_blocks_publication_and_newsletter" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"block_name" varchar
);
ALTER TABLE "announcement" ALTER COLUMN "date" SET DEFAULT '2026-03-15T14:38:00.254Z';
ALTER TABLE "calendar" ALTER COLUMN "date" SET DEFAULT '2026-03-15T14:38:00.534Z';
ALTER TABLE "classifieds" ALTER COLUMN "until" SET DEFAULT '2026-04-09T13:38:00.592Z';
ALTER TABLE "_blog_v" ADD COLUMN "autosave" boolean;
ALTER TABLE "pages_blocks_collapsible_image_with_text" ADD CONSTRAINT "pages_blocks_collapsible_image_with_text_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages_blocks_collapsible_image_with_text" ADD CONSTRAINT "pages_blocks_collapsible_image_with_text_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_publication_and_newsletter" ADD CONSTRAINT "pages_blocks_publication_and_newsletter_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "pages_blocks_collapsible_image_with_text_order_idx" ON "pages_blocks_collapsible_image_with_text" USING btree ("_order");
CREATE INDEX "pages_blocks_collapsible_image_with_text_parent_id_idx" ON "pages_blocks_collapsible_image_with_text" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_collapsible_image_with_text_path_idx" ON "pages_blocks_collapsible_image_with_text" USING btree ("_path");
CREATE INDEX "pages_blocks_collapsible_image_with_text_image_idx" ON "pages_blocks_collapsible_image_with_text" USING btree ("image_id");
CREATE INDEX "pages_blocks_publication_and_newsletter_order_idx" ON "pages_blocks_publication_and_newsletter" USING btree ("_order");
CREATE INDEX "pages_blocks_publication_and_newsletter_parent_id_idx" ON "pages_blocks_publication_and_newsletter" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_publication_and_newsletter_path_idx" ON "pages_blocks_publication_and_newsletter" USING btree ("_path");
CREATE INDEX "_blog_v_autosave_idx" ON "_blog_v" USING btree ("autosave");`)
}

File diff suppressed because it is too large Load diff

View file

@ -1,901 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_parish_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum__parish_v_blocks_text_width" AS ENUM('1/2', '3/4');
CREATE TYPE "public"."enum__parish_v_version_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum_event_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum__event_v_version_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum_group_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum__group_v_blocks_text_width" AS ENUM('1/2', '3/4');
CREATE TYPE "public"."enum__group_v_version_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum_pages_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum__pages_v_blocks_text_width" AS ENUM('1/2', '3/4');
CREATE TYPE "public"."enum__pages_v_blocks_title_size" AS ENUM('xl', 'lg', 'md', 'sm');
CREATE TYPE "public"."enum__pages_v_blocks_title_align" AS ENUM('left', 'center');
CREATE TYPE "public"."enum__pages_v_blocks_section_background_color" AS ENUM('none', 'soft', 'off-white');
CREATE TYPE "public"."enum__pages_v_blocks_section_padding" AS ENUM('small', 'medium', 'large');
CREATE TYPE "public"."enum__pages_v_blocks_banner_background_position" AS ENUM('center center', 'top center', 'bottom center', 'center left', 'center right', 'top left', 'top right', 'bottom left', 'bottom right');
CREATE TYPE "public"."enum__pages_v_blocks_banner_background_size" AS ENUM('cover', 'contain', 'auto');
CREATE TYPE "public"."enum__pages_v_blocks_horizontal_rule_color" AS ENUM('base', 'shade1', 'shade2', 'shade3', 'contrast', 'contrastShade1');
CREATE TYPE "public"."enum__pages_v_version_status" AS ENUM('draft', 'published');
CREATE TABLE "_parish_v_version_contact_persons" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"title" varchar,
"description" varchar,
"_uuid" varchar
);
CREATE TABLE "_parish_v_blocks_text" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"content" jsonb,
"width" "enum__parish_v_blocks_text_width" DEFAULT '1/2',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_parish_v_blocks_document" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"file_id" uuid,
"button" varchar DEFAULT 'Download Flyer',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_parish_v_blocks_donation" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_parish_v_blocks_youtube" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"youtube_id" varchar,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_parish_v_blocks_donation_appeal" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_parish_v_version_gallery" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"photo_id" uuid,
"_uuid" varchar
);
CREATE TABLE "_parish_v" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"parent_id" uuid,
"version_name" varchar,
"version_slug" varchar,
"version_description" varchar,
"version_history" varchar,
"version_contact" varchar,
"version_photo_id" uuid,
"version_updated_at" timestamp(3) with time zone,
"version_created_at" timestamp(3) with time zone,
"version__status" "enum__parish_v_version_status" DEFAULT 'draft',
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"latest" boolean
);
CREATE TABLE "_parish_v_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" uuid NOT NULL,
"path" varchar NOT NULL,
"church_id" uuid
);
CREATE TABLE "_event_v" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"parent_id" uuid,
"version_title" varchar,
"version_date" timestamp(3) with time zone,
"version_location_id" uuid,
"version_contact_id" uuid,
"version_short_description" varchar,
"version_description" varchar,
"version_rsvp_link" varchar,
"version_photo_id" uuid,
"version_flyer_id" uuid,
"version_cancelled" boolean DEFAULT false,
"version_is_recurring" boolean DEFAULT false,
"version_updated_at" timestamp(3) with time zone,
"version_created_at" timestamp(3) with time zone,
"version__status" "enum__event_v_version_status" DEFAULT 'draft',
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"latest" boolean
);
CREATE TABLE "_event_v_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" uuid NOT NULL,
"path" varchar NOT NULL,
"parish_id" uuid,
"group_id" uuid
);
CREATE TABLE "_group_v_blocks_text" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"content" jsonb,
"width" "enum__group_v_blocks_text_width" DEFAULT '1/2',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_group_v_blocks_gallery_items" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"photo_id" uuid,
"_uuid" varchar
);
CREATE TABLE "_group_v_blocks_gallery" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_group_v_blocks_document" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"file_id" uuid,
"button" varchar DEFAULT 'Download Flyer',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_group_v_blocks_donation" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_group_v_blocks_youtube" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"youtube_id" varchar,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_group_v_blocks_contactform" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"title" varchar DEFAULT 'Ich bin dabei!',
"description" varchar DEFAULT 'Um dich anzumelden oder uns zu unterstützen, fülle bitte das Kontaktformular aus. Wir freuen uns sehr, dass du Teil unserer Gemeinschaft bist und mit deinem Engagement dazu beiträgst, unsere Ziele zu erreichen. Solltest du Fragen haben oder weitere Informationen benötigen, zögere nicht, uns zu kontaktieren wir sind gerne für dich da!',
"email" varchar DEFAULT 'kontakt@mutter-teresa-chemnitz.de',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_group_v_blocks_button" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"text" varchar,
"url" varchar,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_group_v" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"parent_id" uuid,
"version_photo_id" uuid,
"version_name" varchar,
"version_slug" varchar,
"version_short_description" varchar,
"version_text" jsonb,
"version_updated_at" timestamp(3) with time zone,
"version_created_at" timestamp(3) with time zone,
"version__status" "enum__group_v_version_status" DEFAULT 'draft',
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"latest" boolean
);
CREATE TABLE "_pages_v_blocks_page_header" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"title" varchar,
"description" varchar,
"image_id" uuid,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_text" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"content" jsonb,
"width" "enum__pages_v_blocks_text_width" DEFAULT '1/2',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_title" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"title" varchar,
"subtitle" varchar,
"size" "enum__pages_v_blocks_title_size" DEFAULT 'lg',
"align" "enum__pages_v_blocks_title_align" DEFAULT 'left',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_section" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"background_color" "enum__pages_v_blocks_section_background_color" DEFAULT 'none',
"padding" "enum__pages_v_blocks_section_padding" DEFAULT 'large',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_gallery_items" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"photo_id" uuid,
"_uuid" varchar
);
CREATE TABLE "_pages_v_blocks_gallery" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_document" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"file_id" uuid,
"button" varchar DEFAULT 'Download Flyer',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_youtube" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"youtube_id" varchar,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_button" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"text" varchar,
"url" varchar,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_contactform" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"title" varchar DEFAULT 'Ich bin dabei!',
"description" varchar DEFAULT 'Um dich anzumelden oder uns zu unterstützen, fülle bitte das Kontaktformular aus. Wir freuen uns sehr, dass du Teil unserer Gemeinschaft bist und mit deinem Engagement dazu beiträgst, unsere Ziele zu erreichen. Solltest du Fragen haben oder weitere Informationen benötigen, zögere nicht, uns zu kontaktieren wir sind gerne für dich da!',
"email" varchar DEFAULT 'kontakt@mutter-teresa-chemnitz.de',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_donation" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_banner" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"text_line1" varchar,
"text_line2" varchar,
"text_line3" varchar,
"background_color" varchar,
"background_image_id" uuid,
"background_position" "enum__pages_v_blocks_banner_background_position" DEFAULT 'center center',
"background_size" "enum__pages_v_blocks_banner_background_size" DEFAULT 'cover',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_main_text" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"text" varchar DEFAULT 'Jesus sagte zu ihm: Ich bin der Weg und die Wahrheit und das Leben; niemand kommt zum Vater außer durch mich. Wenn ihr mich erkannt habt, werdet ihr auch meinen Vater erkennen.',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_horizontal_rule" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"color" "enum__pages_v_blocks_horizontal_rule_color" DEFAULT 'base',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_blog_slider" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"title" varchar DEFAULT 'Aktuelles',
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_mass_times" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"title" varchar DEFAULT 'Nächste Gottesdienste',
"subtitle" varchar,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v_blocks_events" (
"_order" integer NOT NULL,
"_parent_id" uuid NOT NULL,
"_path" text NOT NULL,
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"title" varchar DEFAULT 'Veranstaltungen',
"items_per_page" numeric DEFAULT 6,
"_uuid" varchar,
"block_name" varchar
);
CREATE TABLE "_pages_v" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"parent_id" uuid,
"version_title" varchar,
"version_description" varchar,
"version_slug" varchar,
"version_updated_at" timestamp(3) with time zone,
"version_created_at" timestamp(3) with time zone,
"version__status" "enum__pages_v_version_status" DEFAULT 'draft',
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"latest" boolean
);
ALTER TABLE "parish_contact_persons" ALTER COLUMN "title" DROP NOT NULL;
ALTER TABLE "parish_contact_persons" ALTER COLUMN "description" DROP NOT NULL;
ALTER TABLE "parish_blocks_text" ALTER COLUMN "content" DROP NOT NULL;
ALTER TABLE "parish_blocks_text" ALTER COLUMN "width" DROP NOT NULL;
ALTER TABLE "parish_blocks_document" ALTER COLUMN "file_id" DROP NOT NULL;
ALTER TABLE "parish_blocks_document" ALTER COLUMN "button" DROP NOT NULL;
ALTER TABLE "parish_blocks_youtube" ALTER COLUMN "youtube_id" DROP NOT NULL;
ALTER TABLE "parish_gallery" ALTER COLUMN "photo_id" DROP NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "name" DROP NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "slug" DROP NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "description" DROP NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "history" DROP NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "contact" DROP NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "photo_id" DROP NOT NULL;
ALTER TABLE "announcement" ALTER COLUMN "date" SET DEFAULT '2026-03-15T11:02:35.690Z';
ALTER TABLE "calendar" ALTER COLUMN "date" SET DEFAULT '2026-03-15T11:02:35.969Z';
ALTER TABLE "event" ALTER COLUMN "title" DROP NOT NULL;
ALTER TABLE "event" ALTER COLUMN "date" DROP NOT NULL;
ALTER TABLE "event" ALTER COLUMN "location_id" DROP NOT NULL;
ALTER TABLE "event" ALTER COLUMN "short_description" DROP NOT NULL;
ALTER TABLE "event" ALTER COLUMN "description" DROP NOT NULL;
ALTER TABLE "event" ALTER COLUMN "cancelled" DROP NOT NULL;
ALTER TABLE "event" ALTER COLUMN "is_recurring" DROP NOT NULL;
ALTER TABLE "classifieds" ALTER COLUMN "until" SET DEFAULT '2026-04-10T10:02:36.027Z';
ALTER TABLE "group_blocks_text" ALTER COLUMN "content" DROP NOT NULL;
ALTER TABLE "group_blocks_text" ALTER COLUMN "width" DROP NOT NULL;
ALTER TABLE "group_blocks_gallery_items" ALTER COLUMN "photo_id" DROP NOT NULL;
ALTER TABLE "group_blocks_document" ALTER COLUMN "file_id" DROP NOT NULL;
ALTER TABLE "group_blocks_document" ALTER COLUMN "button" DROP NOT NULL;
ALTER TABLE "group_blocks_youtube" ALTER COLUMN "youtube_id" DROP NOT NULL;
ALTER TABLE "group_blocks_contactform" ALTER COLUMN "title" DROP NOT NULL;
ALTER TABLE "group_blocks_contactform" ALTER COLUMN "description" DROP NOT NULL;
ALTER TABLE "group_blocks_contactform" ALTER COLUMN "email" DROP NOT NULL;
ALTER TABLE "group_blocks_button" ALTER COLUMN "text" DROP NOT NULL;
ALTER TABLE "group_blocks_button" ALTER COLUMN "url" DROP NOT NULL;
ALTER TABLE "group" ALTER COLUMN "name" DROP NOT NULL;
ALTER TABLE "group" ALTER COLUMN "slug" DROP NOT NULL;
ALTER TABLE "group" ALTER COLUMN "short_description" DROP NOT NULL;
ALTER TABLE "pages_blocks_page_header" ALTER COLUMN "title" DROP NOT NULL;
ALTER TABLE "pages_blocks_page_header" ALTER COLUMN "description" DROP NOT NULL;
ALTER TABLE "pages_blocks_text" ALTER COLUMN "content" DROP NOT NULL;
ALTER TABLE "pages_blocks_text" ALTER COLUMN "width" DROP NOT NULL;
ALTER TABLE "pages_blocks_title" ALTER COLUMN "title" DROP NOT NULL;
ALTER TABLE "pages_blocks_gallery_items" ALTER COLUMN "photo_id" DROP NOT NULL;
ALTER TABLE "pages_blocks_document" ALTER COLUMN "file_id" DROP NOT NULL;
ALTER TABLE "pages_blocks_document" ALTER COLUMN "button" DROP NOT NULL;
ALTER TABLE "pages_blocks_youtube" ALTER COLUMN "youtube_id" DROP NOT NULL;
ALTER TABLE "pages_blocks_button" ALTER COLUMN "text" DROP NOT NULL;
ALTER TABLE "pages_blocks_button" ALTER COLUMN "url" DROP NOT NULL;
ALTER TABLE "pages_blocks_contactform" ALTER COLUMN "title" DROP NOT NULL;
ALTER TABLE "pages_blocks_contactform" ALTER COLUMN "description" DROP NOT NULL;
ALTER TABLE "pages_blocks_contactform" ALTER COLUMN "email" DROP NOT NULL;
ALTER TABLE "pages_blocks_main_text" ALTER COLUMN "text" DROP NOT NULL;
ALTER TABLE "pages_blocks_horizontal_rule" ALTER COLUMN "color" DROP NOT NULL;
ALTER TABLE "pages" ALTER COLUMN "title" DROP NOT NULL;
ALTER TABLE "pages" ALTER COLUMN "slug" DROP NOT NULL;
ALTER TABLE "parish" ADD COLUMN "_status" "enum_parish_status" DEFAULT 'draft';
ALTER TABLE "event" ADD COLUMN "_status" "enum_event_status" DEFAULT 'draft';
ALTER TABLE "group" ADD COLUMN "_status" "enum_group_status" DEFAULT 'draft';
ALTER TABLE "pages" ADD COLUMN "_status" "enum_pages_status" DEFAULT 'draft';
ALTER TABLE "_parish_v_version_contact_persons" ADD CONSTRAINT "_parish_v_version_contact_persons_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_parish_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_parish_v_blocks_text" ADD CONSTRAINT "_parish_v_blocks_text_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_parish_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_parish_v_blocks_document" ADD CONSTRAINT "_parish_v_blocks_document_file_id_documents_id_fk" FOREIGN KEY ("file_id") REFERENCES "public"."documents"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_parish_v_blocks_document" ADD CONSTRAINT "_parish_v_blocks_document_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_parish_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_parish_v_blocks_donation" ADD CONSTRAINT "_parish_v_blocks_donation_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_parish_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_parish_v_blocks_youtube" ADD CONSTRAINT "_parish_v_blocks_youtube_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_parish_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_parish_v_blocks_donation_appeal" ADD CONSTRAINT "_parish_v_blocks_donation_appeal_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_parish_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_parish_v_version_gallery" ADD CONSTRAINT "_parish_v_version_gallery_photo_id_media_id_fk" FOREIGN KEY ("photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_parish_v_version_gallery" ADD CONSTRAINT "_parish_v_version_gallery_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_parish_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_parish_v" ADD CONSTRAINT "_parish_v_parent_id_parish_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."parish"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_parish_v" ADD CONSTRAINT "_parish_v_version_photo_id_media_id_fk" FOREIGN KEY ("version_photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_parish_v_rels" ADD CONSTRAINT "_parish_v_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."_parish_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_parish_v_rels" ADD CONSTRAINT "_parish_v_rels_church_fk" FOREIGN KEY ("church_id") REFERENCES "public"."church"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_event_v" ADD CONSTRAINT "_event_v_parent_id_event_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."event"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_event_v" ADD CONSTRAINT "_event_v_version_location_id_locations_id_fk" FOREIGN KEY ("version_location_id") REFERENCES "public"."locations"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_event_v" ADD CONSTRAINT "_event_v_version_contact_id_contact_person_id_fk" FOREIGN KEY ("version_contact_id") REFERENCES "public"."contact_person"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_event_v" ADD CONSTRAINT "_event_v_version_photo_id_media_id_fk" FOREIGN KEY ("version_photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_event_v" ADD CONSTRAINT "_event_v_version_flyer_id_documents_id_fk" FOREIGN KEY ("version_flyer_id") REFERENCES "public"."documents"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_event_v_rels" ADD CONSTRAINT "_event_v_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."_event_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_event_v_rels" ADD CONSTRAINT "_event_v_rels_parish_fk" FOREIGN KEY ("parish_id") REFERENCES "public"."parish"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_event_v_rels" ADD CONSTRAINT "_event_v_rels_group_fk" FOREIGN KEY ("group_id") REFERENCES "public"."group"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_group_v_blocks_text" ADD CONSTRAINT "_group_v_blocks_text_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_group_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_group_v_blocks_gallery_items" ADD CONSTRAINT "_group_v_blocks_gallery_items_photo_id_media_id_fk" FOREIGN KEY ("photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_group_v_blocks_gallery_items" ADD CONSTRAINT "_group_v_blocks_gallery_items_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_group_v_blocks_gallery"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_group_v_blocks_gallery" ADD CONSTRAINT "_group_v_blocks_gallery_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_group_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_group_v_blocks_document" ADD CONSTRAINT "_group_v_blocks_document_file_id_documents_id_fk" FOREIGN KEY ("file_id") REFERENCES "public"."documents"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_group_v_blocks_document" ADD CONSTRAINT "_group_v_blocks_document_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_group_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_group_v_blocks_donation" ADD CONSTRAINT "_group_v_blocks_donation_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_group_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_group_v_blocks_youtube" ADD CONSTRAINT "_group_v_blocks_youtube_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_group_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_group_v_blocks_contactform" ADD CONSTRAINT "_group_v_blocks_contactform_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_group_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_group_v_blocks_button" ADD CONSTRAINT "_group_v_blocks_button_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_group_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_group_v" ADD CONSTRAINT "_group_v_parent_id_group_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."group"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_group_v" ADD CONSTRAINT "_group_v_version_photo_id_media_id_fk" FOREIGN KEY ("version_photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_page_header" ADD CONSTRAINT "_pages_v_blocks_page_header_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_page_header" ADD CONSTRAINT "_pages_v_blocks_page_header_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_text" ADD CONSTRAINT "_pages_v_blocks_text_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_title" ADD CONSTRAINT "_pages_v_blocks_title_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_section" ADD CONSTRAINT "_pages_v_blocks_section_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_gallery_items" ADD CONSTRAINT "_pages_v_blocks_gallery_items_photo_id_media_id_fk" FOREIGN KEY ("photo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_gallery_items" ADD CONSTRAINT "_pages_v_blocks_gallery_items_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v_blocks_gallery"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_gallery" ADD CONSTRAINT "_pages_v_blocks_gallery_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_document" ADD CONSTRAINT "_pages_v_blocks_document_file_id_documents_id_fk" FOREIGN KEY ("file_id") REFERENCES "public"."documents"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_document" ADD CONSTRAINT "_pages_v_blocks_document_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_youtube" ADD CONSTRAINT "_pages_v_blocks_youtube_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_button" ADD CONSTRAINT "_pages_v_blocks_button_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_contactform" ADD CONSTRAINT "_pages_v_blocks_contactform_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_donation" ADD CONSTRAINT "_pages_v_blocks_donation_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_banner" ADD CONSTRAINT "_pages_v_blocks_banner_background_image_id_media_id_fk" FOREIGN KEY ("background_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_banner" ADD CONSTRAINT "_pages_v_blocks_banner_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_main_text" ADD CONSTRAINT "_pages_v_blocks_main_text_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_horizontal_rule" ADD CONSTRAINT "_pages_v_blocks_horizontal_rule_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_blog_slider" ADD CONSTRAINT "_pages_v_blocks_blog_slider_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_mass_times" ADD CONSTRAINT "_pages_v_blocks_mass_times_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v_blocks_events" ADD CONSTRAINT "_pages_v_blocks_events_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."_pages_v"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "_pages_v" ADD CONSTRAINT "_pages_v_parent_id_pages_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."pages"("id") ON DELETE set null ON UPDATE no action;
CREATE INDEX "_parish_v_version_contact_persons_order_idx" ON "_parish_v_version_contact_persons" USING btree ("_order");
CREATE INDEX "_parish_v_version_contact_persons_parent_id_idx" ON "_parish_v_version_contact_persons" USING btree ("_parent_id");
CREATE INDEX "_parish_v_blocks_text_order_idx" ON "_parish_v_blocks_text" USING btree ("_order");
CREATE INDEX "_parish_v_blocks_text_parent_id_idx" ON "_parish_v_blocks_text" USING btree ("_parent_id");
CREATE INDEX "_parish_v_blocks_text_path_idx" ON "_parish_v_blocks_text" USING btree ("_path");
CREATE INDEX "_parish_v_blocks_document_order_idx" ON "_parish_v_blocks_document" USING btree ("_order");
CREATE INDEX "_parish_v_blocks_document_parent_id_idx" ON "_parish_v_blocks_document" USING btree ("_parent_id");
CREATE INDEX "_parish_v_blocks_document_path_idx" ON "_parish_v_blocks_document" USING btree ("_path");
CREATE INDEX "_parish_v_blocks_document_file_idx" ON "_parish_v_blocks_document" USING btree ("file_id");
CREATE INDEX "_parish_v_blocks_donation_order_idx" ON "_parish_v_blocks_donation" USING btree ("_order");
CREATE INDEX "_parish_v_blocks_donation_parent_id_idx" ON "_parish_v_blocks_donation" USING btree ("_parent_id");
CREATE INDEX "_parish_v_blocks_donation_path_idx" ON "_parish_v_blocks_donation" USING btree ("_path");
CREATE INDEX "_parish_v_blocks_youtube_order_idx" ON "_parish_v_blocks_youtube" USING btree ("_order");
CREATE INDEX "_parish_v_blocks_youtube_parent_id_idx" ON "_parish_v_blocks_youtube" USING btree ("_parent_id");
CREATE INDEX "_parish_v_blocks_youtube_path_idx" ON "_parish_v_blocks_youtube" USING btree ("_path");
CREATE INDEX "_parish_v_blocks_donation_appeal_order_idx" ON "_parish_v_blocks_donation_appeal" USING btree ("_order");
CREATE INDEX "_parish_v_blocks_donation_appeal_parent_id_idx" ON "_parish_v_blocks_donation_appeal" USING btree ("_parent_id");
CREATE INDEX "_parish_v_blocks_donation_appeal_path_idx" ON "_parish_v_blocks_donation_appeal" USING btree ("_path");
CREATE INDEX "_parish_v_version_gallery_order_idx" ON "_parish_v_version_gallery" USING btree ("_order");
CREATE INDEX "_parish_v_version_gallery_parent_id_idx" ON "_parish_v_version_gallery" USING btree ("_parent_id");
CREATE INDEX "_parish_v_version_gallery_photo_idx" ON "_parish_v_version_gallery" USING btree ("photo_id");
CREATE INDEX "_parish_v_parent_idx" ON "_parish_v" USING btree ("parent_id");
CREATE INDEX "_parish_v_version_version_photo_idx" ON "_parish_v" USING btree ("version_photo_id");
CREATE INDEX "_parish_v_version_version_updated_at_idx" ON "_parish_v" USING btree ("version_updated_at");
CREATE INDEX "_parish_v_version_version_created_at_idx" ON "_parish_v" USING btree ("version_created_at");
CREATE INDEX "_parish_v_version_version__status_idx" ON "_parish_v" USING btree ("version__status");
CREATE INDEX "_parish_v_created_at_idx" ON "_parish_v" USING btree ("created_at");
CREATE INDEX "_parish_v_updated_at_idx" ON "_parish_v" USING btree ("updated_at");
CREATE INDEX "_parish_v_latest_idx" ON "_parish_v" USING btree ("latest");
CREATE INDEX "_parish_v_rels_order_idx" ON "_parish_v_rels" USING btree ("order");
CREATE INDEX "_parish_v_rels_parent_idx" ON "_parish_v_rels" USING btree ("parent_id");
CREATE INDEX "_parish_v_rels_path_idx" ON "_parish_v_rels" USING btree ("path");
CREATE INDEX "_parish_v_rels_church_id_idx" ON "_parish_v_rels" USING btree ("church_id");
CREATE INDEX "_event_v_parent_idx" ON "_event_v" USING btree ("parent_id");
CREATE INDEX "_event_v_version_version_location_idx" ON "_event_v" USING btree ("version_location_id");
CREATE INDEX "_event_v_version_version_contact_idx" ON "_event_v" USING btree ("version_contact_id");
CREATE INDEX "_event_v_version_version_photo_idx" ON "_event_v" USING btree ("version_photo_id");
CREATE INDEX "_event_v_version_version_flyer_idx" ON "_event_v" USING btree ("version_flyer_id");
CREATE INDEX "_event_v_version_version_updated_at_idx" ON "_event_v" USING btree ("version_updated_at");
CREATE INDEX "_event_v_version_version_created_at_idx" ON "_event_v" USING btree ("version_created_at");
CREATE INDEX "_event_v_version_version__status_idx" ON "_event_v" USING btree ("version__status");
CREATE INDEX "_event_v_created_at_idx" ON "_event_v" USING btree ("created_at");
CREATE INDEX "_event_v_updated_at_idx" ON "_event_v" USING btree ("updated_at");
CREATE INDEX "_event_v_latest_idx" ON "_event_v" USING btree ("latest");
CREATE INDEX "_event_v_rels_order_idx" ON "_event_v_rels" USING btree ("order");
CREATE INDEX "_event_v_rels_parent_idx" ON "_event_v_rels" USING btree ("parent_id");
CREATE INDEX "_event_v_rels_path_idx" ON "_event_v_rels" USING btree ("path");
CREATE INDEX "_event_v_rels_parish_id_idx" ON "_event_v_rels" USING btree ("parish_id");
CREATE INDEX "_event_v_rels_group_id_idx" ON "_event_v_rels" USING btree ("group_id");
CREATE INDEX "_group_v_blocks_text_order_idx" ON "_group_v_blocks_text" USING btree ("_order");
CREATE INDEX "_group_v_blocks_text_parent_id_idx" ON "_group_v_blocks_text" USING btree ("_parent_id");
CREATE INDEX "_group_v_blocks_text_path_idx" ON "_group_v_blocks_text" USING btree ("_path");
CREATE INDEX "_group_v_blocks_gallery_items_order_idx" ON "_group_v_blocks_gallery_items" USING btree ("_order");
CREATE INDEX "_group_v_blocks_gallery_items_parent_id_idx" ON "_group_v_blocks_gallery_items" USING btree ("_parent_id");
CREATE INDEX "_group_v_blocks_gallery_items_photo_idx" ON "_group_v_blocks_gallery_items" USING btree ("photo_id");
CREATE INDEX "_group_v_blocks_gallery_order_idx" ON "_group_v_blocks_gallery" USING btree ("_order");
CREATE INDEX "_group_v_blocks_gallery_parent_id_idx" ON "_group_v_blocks_gallery" USING btree ("_parent_id");
CREATE INDEX "_group_v_blocks_gallery_path_idx" ON "_group_v_blocks_gallery" USING btree ("_path");
CREATE INDEX "_group_v_blocks_document_order_idx" ON "_group_v_blocks_document" USING btree ("_order");
CREATE INDEX "_group_v_blocks_document_parent_id_idx" ON "_group_v_blocks_document" USING btree ("_parent_id");
CREATE INDEX "_group_v_blocks_document_path_idx" ON "_group_v_blocks_document" USING btree ("_path");
CREATE INDEX "_group_v_blocks_document_file_idx" ON "_group_v_blocks_document" USING btree ("file_id");
CREATE INDEX "_group_v_blocks_donation_order_idx" ON "_group_v_blocks_donation" USING btree ("_order");
CREATE INDEX "_group_v_blocks_donation_parent_id_idx" ON "_group_v_blocks_donation" USING btree ("_parent_id");
CREATE INDEX "_group_v_blocks_donation_path_idx" ON "_group_v_blocks_donation" USING btree ("_path");
CREATE INDEX "_group_v_blocks_youtube_order_idx" ON "_group_v_blocks_youtube" USING btree ("_order");
CREATE INDEX "_group_v_blocks_youtube_parent_id_idx" ON "_group_v_blocks_youtube" USING btree ("_parent_id");
CREATE INDEX "_group_v_blocks_youtube_path_idx" ON "_group_v_blocks_youtube" USING btree ("_path");
CREATE INDEX "_group_v_blocks_contactform_order_idx" ON "_group_v_blocks_contactform" USING btree ("_order");
CREATE INDEX "_group_v_blocks_contactform_parent_id_idx" ON "_group_v_blocks_contactform" USING btree ("_parent_id");
CREATE INDEX "_group_v_blocks_contactform_path_idx" ON "_group_v_blocks_contactform" USING btree ("_path");
CREATE INDEX "_group_v_blocks_button_order_idx" ON "_group_v_blocks_button" USING btree ("_order");
CREATE INDEX "_group_v_blocks_button_parent_id_idx" ON "_group_v_blocks_button" USING btree ("_parent_id");
CREATE INDEX "_group_v_blocks_button_path_idx" ON "_group_v_blocks_button" USING btree ("_path");
CREATE INDEX "_group_v_parent_idx" ON "_group_v" USING btree ("parent_id");
CREATE INDEX "_group_v_version_version_photo_idx" ON "_group_v" USING btree ("version_photo_id");
CREATE INDEX "_group_v_version_version_slug_idx" ON "_group_v" USING btree ("version_slug");
CREATE INDEX "_group_v_version_version_updated_at_idx" ON "_group_v" USING btree ("version_updated_at");
CREATE INDEX "_group_v_version_version_created_at_idx" ON "_group_v" USING btree ("version_created_at");
CREATE INDEX "_group_v_version_version__status_idx" ON "_group_v" USING btree ("version__status");
CREATE INDEX "_group_v_created_at_idx" ON "_group_v" USING btree ("created_at");
CREATE INDEX "_group_v_updated_at_idx" ON "_group_v" USING btree ("updated_at");
CREATE INDEX "_group_v_latest_idx" ON "_group_v" USING btree ("latest");
CREATE INDEX "_pages_v_blocks_page_header_order_idx" ON "_pages_v_blocks_page_header" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_page_header_parent_id_idx" ON "_pages_v_blocks_page_header" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_page_header_path_idx" ON "_pages_v_blocks_page_header" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_page_header_image_idx" ON "_pages_v_blocks_page_header" USING btree ("image_id");
CREATE INDEX "_pages_v_blocks_text_order_idx" ON "_pages_v_blocks_text" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_text_parent_id_idx" ON "_pages_v_blocks_text" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_text_path_idx" ON "_pages_v_blocks_text" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_title_order_idx" ON "_pages_v_blocks_title" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_title_parent_id_idx" ON "_pages_v_blocks_title" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_title_path_idx" ON "_pages_v_blocks_title" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_section_order_idx" ON "_pages_v_blocks_section" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_section_parent_id_idx" ON "_pages_v_blocks_section" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_section_path_idx" ON "_pages_v_blocks_section" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_gallery_items_order_idx" ON "_pages_v_blocks_gallery_items" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_gallery_items_parent_id_idx" ON "_pages_v_blocks_gallery_items" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_gallery_items_photo_idx" ON "_pages_v_blocks_gallery_items" USING btree ("photo_id");
CREATE INDEX "_pages_v_blocks_gallery_order_idx" ON "_pages_v_blocks_gallery" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_gallery_parent_id_idx" ON "_pages_v_blocks_gallery" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_gallery_path_idx" ON "_pages_v_blocks_gallery" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_document_order_idx" ON "_pages_v_blocks_document" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_document_parent_id_idx" ON "_pages_v_blocks_document" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_document_path_idx" ON "_pages_v_blocks_document" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_document_file_idx" ON "_pages_v_blocks_document" USING btree ("file_id");
CREATE INDEX "_pages_v_blocks_youtube_order_idx" ON "_pages_v_blocks_youtube" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_youtube_parent_id_idx" ON "_pages_v_blocks_youtube" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_youtube_path_idx" ON "_pages_v_blocks_youtube" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_button_order_idx" ON "_pages_v_blocks_button" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_button_parent_id_idx" ON "_pages_v_blocks_button" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_button_path_idx" ON "_pages_v_blocks_button" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_contactform_order_idx" ON "_pages_v_blocks_contactform" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_contactform_parent_id_idx" ON "_pages_v_blocks_contactform" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_contactform_path_idx" ON "_pages_v_blocks_contactform" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_donation_order_idx" ON "_pages_v_blocks_donation" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_donation_parent_id_idx" ON "_pages_v_blocks_donation" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_donation_path_idx" ON "_pages_v_blocks_donation" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_banner_order_idx" ON "_pages_v_blocks_banner" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_banner_parent_id_idx" ON "_pages_v_blocks_banner" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_banner_path_idx" ON "_pages_v_blocks_banner" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_banner_background_image_idx" ON "_pages_v_blocks_banner" USING btree ("background_image_id");
CREATE INDEX "_pages_v_blocks_main_text_order_idx" ON "_pages_v_blocks_main_text" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_main_text_parent_id_idx" ON "_pages_v_blocks_main_text" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_main_text_path_idx" ON "_pages_v_blocks_main_text" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_horizontal_rule_order_idx" ON "_pages_v_blocks_horizontal_rule" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_horizontal_rule_parent_id_idx" ON "_pages_v_blocks_horizontal_rule" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_horizontal_rule_path_idx" ON "_pages_v_blocks_horizontal_rule" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_blog_slider_order_idx" ON "_pages_v_blocks_blog_slider" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_blog_slider_parent_id_idx" ON "_pages_v_blocks_blog_slider" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_blog_slider_path_idx" ON "_pages_v_blocks_blog_slider" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_mass_times_order_idx" ON "_pages_v_blocks_mass_times" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_mass_times_parent_id_idx" ON "_pages_v_blocks_mass_times" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_mass_times_path_idx" ON "_pages_v_blocks_mass_times" USING btree ("_path");
CREATE INDEX "_pages_v_blocks_events_order_idx" ON "_pages_v_blocks_events" USING btree ("_order");
CREATE INDEX "_pages_v_blocks_events_parent_id_idx" ON "_pages_v_blocks_events" USING btree ("_parent_id");
CREATE INDEX "_pages_v_blocks_events_path_idx" ON "_pages_v_blocks_events" USING btree ("_path");
CREATE INDEX "_pages_v_parent_idx" ON "_pages_v" USING btree ("parent_id");
CREATE INDEX "_pages_v_version_version_slug_idx" ON "_pages_v" USING btree ("version_slug");
CREATE INDEX "_pages_v_version_version_updated_at_idx" ON "_pages_v" USING btree ("version_updated_at");
CREATE INDEX "_pages_v_version_version_created_at_idx" ON "_pages_v" USING btree ("version_created_at");
CREATE INDEX "_pages_v_version_version__status_idx" ON "_pages_v" USING btree ("version__status");
CREATE INDEX "_pages_v_created_at_idx" ON "_pages_v" USING btree ("created_at");
CREATE INDEX "_pages_v_updated_at_idx" ON "_pages_v" USING btree ("updated_at");
CREATE INDEX "_pages_v_latest_idx" ON "_pages_v" USING btree ("latest");
CREATE INDEX "parish__status_idx" ON "parish" USING btree ("_status");
CREATE INDEX "event__status_idx" ON "event" USING btree ("_status");
CREATE INDEX "group__status_idx" ON "group" USING btree ("_status");
CREATE INDEX "pages__status_idx" ON "pages" USING btree ("_status");
UPDATE "blog" SET "_status" = 'published' WHERE "_status" = 'draft';
UPDATE "parish" SET "_status" = 'published' WHERE "_status" = 'draft';
UPDATE "event" SET "_status" = 'published' WHERE "_status" = 'draft';
UPDATE "group" SET "_status" = 'published' WHERE "_status" = 'draft';
UPDATE "pages" SET "_status" = 'published' WHERE "_status" = 'draft';
INSERT INTO "_blog_v" (parent_id, version_photo_id, version_title, version_content_excerpt, version_configuration_show_on_frontpage, version_configuration_display_from_date, version_configuration_display_till_date, version_updated_at, version_created_at, version__status, latest)
SELECT id, photo_id, title, content_excerpt, configuration_show_on_frontpage, configuration_display_from_date, configuration_display_till_date, updated_at, created_at, 'published', true
FROM "blog" b
WHERE NOT EXISTS (SELECT 1 FROM "_blog_v" v WHERE v.parent_id = b.id);
INSERT INTO "_event_v" (parent_id, version_title, version_date, version_location_id, version_contact_id, version_short_description, version_description, version_rsvp_link, version_photo_id, version_flyer_id, version_cancelled, version_is_recurring, version_updated_at, version_created_at, version__status, latest)
SELECT id, title, date, location_id, contact_id, short_description, description, rsvp_link, photo_id, flyer_id, cancelled, is_recurring, updated_at, created_at, 'published', true
FROM "event" e
WHERE NOT EXISTS (SELECT 1 FROM "_event_v" v WHERE v.parent_id = e.id);
INSERT INTO "_group_v" (parent_id, version_photo_id, version_name, version_slug, version_short_description, version_text, version_updated_at, version_created_at, version__status, latest)
SELECT id, photo_id, name, slug, short_description, text, updated_at, created_at, 'published', true
FROM "group" g
WHERE NOT EXISTS (SELECT 1 FROM "_group_v" v WHERE v.parent_id = g.id);
INSERT INTO "_pages_v" (parent_id, version_title, version_description, version_slug, version_updated_at, version_created_at, version__status, latest)
SELECT id, title, description, slug, updated_at, created_at, 'published', true
FROM "pages" p
WHERE NOT EXISTS (SELECT 1 FROM "_pages_v" v WHERE v.parent_id = p.id);
INSERT INTO "_parish_v" (parent_id, version_name, version_slug, version_description, version_history, version_contact, version_photo_id, version_updated_at, version_created_at, version__status, latest)
SELECT id, name, slug, description, history, contact, photo_id, updated_at, created_at, 'published', true
FROM "parish" pa
WHERE NOT EXISTS (SELECT 1 FROM "_parish_v" v WHERE v.parent_id = pa.id);
`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "_parish_v_version_contact_persons" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_parish_v_blocks_text" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_parish_v_blocks_document" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_parish_v_blocks_donation" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_parish_v_blocks_youtube" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_parish_v_blocks_donation_appeal" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_parish_v_version_gallery" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_parish_v" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_parish_v_rels" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_event_v" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_event_v_rels" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_group_v_blocks_text" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_group_v_blocks_gallery_items" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_group_v_blocks_gallery" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_group_v_blocks_document" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_group_v_blocks_donation" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_group_v_blocks_youtube" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_group_v_blocks_contactform" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_group_v_blocks_button" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_group_v" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_page_header" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_text" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_title" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_section" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_gallery_items" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_gallery" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_document" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_youtube" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_button" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_contactform" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_donation" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_banner" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_main_text" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_horizontal_rule" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_blog_slider" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_mass_times" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v_blocks_events" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "_pages_v" DISABLE ROW LEVEL SECURITY;
DROP TABLE "_parish_v_version_contact_persons" CASCADE;
DROP TABLE "_parish_v_blocks_text" CASCADE;
DROP TABLE "_parish_v_blocks_document" CASCADE;
DROP TABLE "_parish_v_blocks_donation" CASCADE;
DROP TABLE "_parish_v_blocks_youtube" CASCADE;
DROP TABLE "_parish_v_blocks_donation_appeal" CASCADE;
DROP TABLE "_parish_v_version_gallery" CASCADE;
DROP TABLE "_parish_v" CASCADE;
DROP TABLE "_parish_v_rels" CASCADE;
DROP TABLE "_event_v" CASCADE;
DROP TABLE "_event_v_rels" CASCADE;
DROP TABLE "_group_v_blocks_text" CASCADE;
DROP TABLE "_group_v_blocks_gallery_items" CASCADE;
DROP TABLE "_group_v_blocks_gallery" CASCADE;
DROP TABLE "_group_v_blocks_document" CASCADE;
DROP TABLE "_group_v_blocks_donation" CASCADE;
DROP TABLE "_group_v_blocks_youtube" CASCADE;
DROP TABLE "_group_v_blocks_contactform" CASCADE;
DROP TABLE "_group_v_blocks_button" CASCADE;
DROP TABLE "_group_v" CASCADE;
DROP TABLE "_pages_v_blocks_page_header" CASCADE;
DROP TABLE "_pages_v_blocks_text" CASCADE;
DROP TABLE "_pages_v_blocks_title" CASCADE;
DROP TABLE "_pages_v_blocks_section" CASCADE;
DROP TABLE "_pages_v_blocks_gallery_items" CASCADE;
DROP TABLE "_pages_v_blocks_gallery" CASCADE;
DROP TABLE "_pages_v_blocks_document" CASCADE;
DROP TABLE "_pages_v_blocks_youtube" CASCADE;
DROP TABLE "_pages_v_blocks_button" CASCADE;
DROP TABLE "_pages_v_blocks_contactform" CASCADE;
DROP TABLE "_pages_v_blocks_donation" CASCADE;
DROP TABLE "_pages_v_blocks_banner" CASCADE;
DROP TABLE "_pages_v_blocks_main_text" CASCADE;
DROP TABLE "_pages_v_blocks_horizontal_rule" CASCADE;
DROP TABLE "_pages_v_blocks_blog_slider" CASCADE;
DROP TABLE "_pages_v_blocks_mass_times" CASCADE;
DROP TABLE "_pages_v_blocks_events" CASCADE;
DROP TABLE "_pages_v" CASCADE;
DROP INDEX "parish__status_idx";
DROP INDEX "event__status_idx";
DROP INDEX "group__status_idx";
DROP INDEX "pages__status_idx";
ALTER TABLE "parish_contact_persons" ALTER COLUMN "title" SET NOT NULL;
ALTER TABLE "parish_contact_persons" ALTER COLUMN "description" SET NOT NULL;
ALTER TABLE "parish_blocks_text" ALTER COLUMN "content" SET NOT NULL;
ALTER TABLE "parish_blocks_text" ALTER COLUMN "width" SET NOT NULL;
ALTER TABLE "parish_blocks_document" ALTER COLUMN "file_id" SET NOT NULL;
ALTER TABLE "parish_blocks_document" ALTER COLUMN "button" SET NOT NULL;
ALTER TABLE "parish_blocks_youtube" ALTER COLUMN "youtube_id" SET NOT NULL;
ALTER TABLE "parish_gallery" ALTER COLUMN "photo_id" SET NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "name" SET NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "slug" SET NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "description" SET NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "history" SET NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "contact" SET NOT NULL;
ALTER TABLE "parish" ALTER COLUMN "photo_id" SET NOT NULL;
ALTER TABLE "announcement" ALTER COLUMN "date" SET DEFAULT '2026-03-15T10:59:47.266Z';
ALTER TABLE "calendar" ALTER COLUMN "date" SET DEFAULT '2026-03-15T10:59:47.547Z';
ALTER TABLE "event" ALTER COLUMN "title" SET NOT NULL;
ALTER TABLE "event" ALTER COLUMN "date" SET NOT NULL;
ALTER TABLE "event" ALTER COLUMN "location_id" SET NOT NULL;
ALTER TABLE "event" ALTER COLUMN "short_description" SET NOT NULL;
ALTER TABLE "event" ALTER COLUMN "description" SET NOT NULL;
ALTER TABLE "event" ALTER COLUMN "cancelled" SET NOT NULL;
ALTER TABLE "event" ALTER COLUMN "is_recurring" SET NOT NULL;
ALTER TABLE "classifieds" ALTER COLUMN "until" SET DEFAULT '2026-04-10T09:59:47.604Z';
ALTER TABLE "group_blocks_text" ALTER COLUMN "content" SET NOT NULL;
ALTER TABLE "group_blocks_text" ALTER COLUMN "width" SET NOT NULL;
ALTER TABLE "group_blocks_gallery_items" ALTER COLUMN "photo_id" SET NOT NULL;
ALTER TABLE "group_blocks_document" ALTER COLUMN "file_id" SET NOT NULL;
ALTER TABLE "group_blocks_document" ALTER COLUMN "button" SET NOT NULL;
ALTER TABLE "group_blocks_youtube" ALTER COLUMN "youtube_id" SET NOT NULL;
ALTER TABLE "group_blocks_contactform" ALTER COLUMN "title" SET NOT NULL;
ALTER TABLE "group_blocks_contactform" ALTER COLUMN "description" SET NOT NULL;
ALTER TABLE "group_blocks_contactform" ALTER COLUMN "email" SET NOT NULL;
ALTER TABLE "group_blocks_button" ALTER COLUMN "text" SET NOT NULL;
ALTER TABLE "group_blocks_button" ALTER COLUMN "url" SET NOT NULL;
ALTER TABLE "group" ALTER COLUMN "name" SET NOT NULL;
ALTER TABLE "group" ALTER COLUMN "slug" SET NOT NULL;
ALTER TABLE "group" ALTER COLUMN "short_description" SET NOT NULL;
ALTER TABLE "pages_blocks_page_header" ALTER COLUMN "title" SET NOT NULL;
ALTER TABLE "pages_blocks_page_header" ALTER COLUMN "description" SET NOT NULL;
ALTER TABLE "pages_blocks_text" ALTER COLUMN "content" SET NOT NULL;
ALTER TABLE "pages_blocks_text" ALTER COLUMN "width" SET NOT NULL;
ALTER TABLE "pages_blocks_title" ALTER COLUMN "title" SET NOT NULL;
ALTER TABLE "pages_blocks_gallery_items" ALTER COLUMN "photo_id" SET NOT NULL;
ALTER TABLE "pages_blocks_document" ALTER COLUMN "file_id" SET NOT NULL;
ALTER TABLE "pages_blocks_document" ALTER COLUMN "button" SET NOT NULL;
ALTER TABLE "pages_blocks_youtube" ALTER COLUMN "youtube_id" SET NOT NULL;
ALTER TABLE "pages_blocks_button" ALTER COLUMN "text" SET NOT NULL;
ALTER TABLE "pages_blocks_button" ALTER COLUMN "url" SET NOT NULL;
ALTER TABLE "pages_blocks_contactform" ALTER COLUMN "title" SET NOT NULL;
ALTER TABLE "pages_blocks_contactform" ALTER COLUMN "description" SET NOT NULL;
ALTER TABLE "pages_blocks_contactform" ALTER COLUMN "email" SET NOT NULL;
ALTER TABLE "pages_blocks_main_text" ALTER COLUMN "text" SET NOT NULL;
ALTER TABLE "pages_blocks_horizontal_rule" ALTER COLUMN "color" SET NOT NULL;
ALTER TABLE "pages" ALTER COLUMN "title" SET NOT NULL;
ALTER TABLE "pages" ALTER COLUMN "slug" SET NOT NULL;
ALTER TABLE "parish" DROP COLUMN "_status";
ALTER TABLE "event" DROP COLUMN "_status";
ALTER TABLE "group" DROP COLUMN "_status";
ALTER TABLE "pages" DROP COLUMN "_status";
DROP TYPE "public"."enum_parish_status";
DROP TYPE "public"."enum__parish_v_blocks_text_width";
DROP TYPE "public"."enum__parish_v_version_status";
DROP TYPE "public"."enum_event_status";
DROP TYPE "public"."enum__event_v_version_status";
DROP TYPE "public"."enum_group_status";
DROP TYPE "public"."enum__group_v_blocks_text_width";
DROP TYPE "public"."enum__group_v_version_status";
DROP TYPE "public"."enum_pages_status";
DROP TYPE "public"."enum__pages_v_blocks_text_width";
DROP TYPE "public"."enum__pages_v_blocks_title_size";
DROP TYPE "public"."enum__pages_v_blocks_title_align";
DROP TYPE "public"."enum__pages_v_blocks_section_background_color";
DROP TYPE "public"."enum__pages_v_blocks_section_padding";
DROP TYPE "public"."enum__pages_v_blocks_banner_background_position";
DROP TYPE "public"."enum__pages_v_blocks_banner_background_size";
DROP TYPE "public"."enum__pages_v_blocks_horizontal_rule_color";
DROP TYPE "public"."enum__pages_v_version_status";`)
}

View file

@ -17,10 +17,6 @@ import * as migration_20260106_085445_donationforms from './20260106_085445_dona
import * as migration_20260106_103529_donation_appeal from './20260106_103529_donation_appeal';
import * as migration_20260205_155735_version_bump from './20260205_155735_version_bump';
import * as migration_20260309_111617_many_new_features from './20260309_111617_many_new_features';
import * as migration_20260310_105814 from './20260310_105814';
import * as migration_20260310_143800 from './20260310_143800';
import * as migration_20260311_105947_drop_features from './20260311_105947_drop_features';
import * as migration_20260311_110236_live_preview from './20260311_110236_live_preview';
export const migrations = [
{
@ -116,26 +112,6 @@ export const migrations = [
{
up: migration_20260309_111617_many_new_features.up,
down: migration_20260309_111617_many_new_features.down,
name: '20260309_111617_many_new_features',
},
{
up: migration_20260310_105814.up,
down: migration_20260310_105814.down,
name: '20260310_105814',
},
{
up: migration_20260310_143800.up,
down: migration_20260310_143800.down,
name: '20260310_143800',
},
{
up: migration_20260311_105947_drop_features.up,
down: migration_20260311_105947_drop_features.down,
name: '20260311_105947_drop_features',
},
{
up: migration_20260311_110236_live_preview.up,
down: migration_20260311_110236_live_preview.down,
name: '20260311_110236_live_preview',
name: '20260309_111617_many_new_features'
},
];

View file

@ -126,10 +126,14 @@ export interface Config {
globals: {
menu: Menu;
footer: Footer;
design: Design;
'site-config': SiteConfig;
};
globalsSelect: {
menu: MenuSelect<false> | MenuSelect<true>;
footer: FooterSelect<false> | FooterSelect<true>;
design: DesignSelect<false> | DesignSelect<true>;
'site-config': SiteConfigSelect<false> | SiteConfigSelect<true>;
};
locale: null;
user: User & {
@ -237,7 +241,6 @@ export interface Parish {
| null;
updatedAt: string;
createdAt: string;
_status?: ('draft' | 'published') | null;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -256,6 +259,7 @@ export interface Church {
*/
export interface Document {
id: string;
prefix?: string | null;
updatedAt: string;
createdAt: string;
url?: string | null;
@ -281,6 +285,7 @@ export interface Media {
publicWithoutName: boolean;
consent: boolean;
};
prefix?: string | null;
updatedAt: string;
createdAt: string;
url?: string | null;
@ -469,7 +474,6 @@ export interface Blog {
};
updatedAt: string;
createdAt: string;
_status?: ('draft' | 'published') | null;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -518,7 +522,6 @@ export interface Event {
isRecurring: boolean;
updatedAt: string;
createdAt: string;
_status?: ('draft' | 'published') | null;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -635,7 +638,6 @@ export interface Group {
| null;
updatedAt: string;
createdAt: string;
_status?: ('draft' | 'published') | null;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -854,6 +856,31 @@ export interface Page {
blockName?: string | null;
blockType: 'massTimes';
}
| {
title: string;
text: string;
image: string | Media;
content: {
root: {
type: string;
children: {
type: any;
version: number;
[k: string]: unknown;
}[];
direction: ('ltr' | 'rtl') | null;
format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
indent: number;
version: number;
};
[k: string]: unknown;
};
backgroundColor?: ('none' | 'soft' | 'off-white') | null;
schema?: ('base' | 'contrast') | null;
id?: string | null;
blockName?: string | null;
blockType: 'collapsibleImageWithText';
}
| {
title?: string | null;
itemsPerPage?: number | null;
@ -861,11 +888,15 @@ export interface Page {
blockName?: string | null;
blockType: 'events';
}
| {
id?: string | null;
blockName?: string | null;
blockType: 'publicationAndNewsletter';
}
)[]
| null;
updatedAt: string;
createdAt: string;
_status?: ('draft' | 'published') | null;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -1128,7 +1159,6 @@ export interface ParishSelect<T extends boolean = true> {
};
updatedAt?: T;
createdAt?: T;
_status?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -1274,7 +1304,6 @@ export interface BlogSelect<T extends boolean = true> {
};
updatedAt?: T;
createdAt?: T;
_status?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -1309,7 +1338,6 @@ export interface EventSelect<T extends boolean = true> {
isRecurring?: T;
updatedAt?: T;
createdAt?: T;
_status?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -1421,7 +1449,6 @@ export interface GroupSelect<T extends boolean = true> {
};
updatedAt?: T;
createdAt?: T;
_status?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -1572,6 +1599,18 @@ export interface PagesSelect<T extends boolean = true> {
id?: T;
blockName?: T;
};
collapsibleImageWithText?:
| T
| {
title?: T;
text?: T;
image?: T;
content?: T;
backgroundColor?: T;
schema?: T;
id?: T;
blockName?: T;
};
events?:
| T
| {
@ -1580,10 +1619,15 @@ export interface PagesSelect<T extends boolean = true> {
id?: T;
blockName?: T;
};
publicationAndNewsletter?:
| T
| {
id?: T;
blockName?: T;
};
};
updatedAt?: T;
createdAt?: T;
_status?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
@ -1610,6 +1654,7 @@ export interface MagazineSelect<T extends boolean = true> {
* via the `definition` "documents_select".
*/
export interface DocumentsSelect<T extends boolean = true> {
prefix?: T;
updatedAt?: T;
createdAt?: T;
url?: T;
@ -1636,6 +1681,7 @@ export interface MediaSelect<T extends boolean = true> {
publicWithoutName?: T;
consent?: T;
};
prefix?: T;
updatedAt?: T;
createdAt?: T;
url?: T;
@ -1848,6 +1894,102 @@ export interface Footer {
updatedAt?: string | null;
createdAt?: string | null;
}
/**
* Hier können Sie die Farben und das Erscheinungsbild der Website konfigurieren.
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "design".
*/
export interface Design {
id: string;
baseColor?: string | null;
shade1?: string | null;
shade2?: string | null;
shade3?: string | null;
contrastColor?: string | null;
contrastShade1?: string | null;
/**
* Die Hauptschrift für den gesamten Text der Website.
*/
defaultFont?:
| (
| 'cairo'
| 'roboto'
| 'openSans'
| 'lato'
| 'nunito'
| 'raleway'
| 'faustina'
| 'merriweather'
| 'sourceSans3'
| 'playfairDisplay'
| 'lora'
| 'crimsonText'
| 'ebGaramond'
)
| null;
/**
* Die Schrift für Überschriften und hervorgehobenen Text.
*/
headerFont?:
| (
| 'cairo'
| 'roboto'
| 'openSans'
| 'lato'
| 'nunito'
| 'raleway'
| 'faustina'
| 'merriweather'
| 'sourceSans3'
| 'playfairDisplay'
| 'lora'
| 'crimsonText'
| 'ebGaramond'
)
| null;
borderRadius?: string | null;
updatedAt?: string | null;
createdAt?: string | null;
}
/**
* Hier können Sie den Namen, die Beschreibung und andere allgemeine Einstellungen der Website konfigurieren.
*
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "site-config".
*/
export interface SiteConfig {
id: string;
name: string;
/**
* Wird im Browser-Tab als Suffix verwendet (z.B. "Seite | Hl. Drei Könige").
*/
shortName: string;
/**
* Meta-Beschreibung für Suchmaschinen.
*/
description: string;
url: string;
/**
* Pfad zum Vorschaubild für soziale Medien.
*/
ogImage?: string | null;
/**
* Standard-E-Mail-Adresse für Kontaktformulare.
*/
email: string;
/**
* SEO-Schlüsselwörter für Suchmaschinen.
*/
keywords?:
| {
keyword: string;
id?: string | null;
}[]
| null;
updatedAt?: string | null;
createdAt?: string | null;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "menu_select".
@ -1951,6 +2093,45 @@ export interface FooterSelect<T extends boolean = true> {
createdAt?: T;
globalType?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "design_select".
*/
export interface DesignSelect<T extends boolean = true> {
baseColor?: T;
shade1?: T;
shade2?: T;
shade3?: T;
contrastColor?: T;
contrastShade1?: T;
defaultFont?: T;
headerFont?: T;
borderRadius?: T;
updatedAt?: T;
createdAt?: T;
globalType?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "site-config_select".
*/
export interface SiteConfigSelect<T extends boolean = true> {
name?: T;
shortName?: T;
description?: T;
url?: T;
ogImage?: T;
email?: T;
keywords?:
| T
| {
keyword?: T;
id?: T;
};
updatedAt?: T;
createdAt?: T;
globalType?: T;
}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "auth".

View file

@ -10,7 +10,7 @@ import {
AlignFeature,
UnorderedListFeature,
LinkFeature,
FixedToolbarFeature,
HTMLConverterFeature, FixedToolbarFeature,
} from '@payloadcms/richtext-lexical'
import path from 'path'
import { buildConfig } from 'payload'
@ -38,6 +38,8 @@ import { LiturgicalCalendar } from '@/collections/LiturgicalCalendar'
import { Classifieds } from '@/collections/Classifieds'
import { MenuGlobal } from '@/globals/Menu'
import { FooterGlobal } from '@/globals/Footer'
import { DesignGlobal } from '@/globals/Design'
import { SiteConfigGlobal } from '@/globals/SiteConfig'
import { Magazine } from '@/collections/Magazine'
import { DonationForms } from '@/collections/DonationForms'
import { Pages } from '@/collections/Pages'
@ -73,10 +75,7 @@ export default buildConfig({
}
}
}
},
livePreview: {
collections: ['blog', 'event', 'group', 'pages', 'parish'],
},
}
},
collections: [
Parish,
@ -103,6 +102,8 @@ export default buildConfig({
globals: [
MenuGlobal,
FooterGlobal,
DesignGlobal,
SiteConfigGlobal,
],
graphQL: {
disable: true
@ -140,25 +141,22 @@ export default buildConfig({
sharp,
plugins: [
gcsStorage({
enabled: !!process.env.GOOGLE_BUCKET,
alwaysInsertFields: true,
collections: {
media: {
disablePayloadAccessControl: true,
prefix: 'media/',
generateFileURL: (args) =>
`https://storage.googleapis.com/${process.env.GOOGLE_BUCKET}/media/${args.filename}`,
generateFileURL: args => `https://storage.googleapis.com/${process.env.GOOGLE_BUCKET}/media/${args.filename}`
},
documents: {
disablePayloadAccessControl: true,
prefix: 'documents/',
generateFileURL: (args) =>
`https://storage.googleapis.com/${process.env.GOOGLE_BUCKET}/documents/${args.filename}`,
generateFileURL: args => `https://storage.googleapis.com/${process.env.GOOGLE_BUCKET}/documents/${args.filename}`
},
},
bucket: process.env.GOOGLE_BUCKET || '',
bucket: process.env.GOOGLE_BUCKET || "",
options: {},
acl: undefined,
}),
acl: undefined
})
],
})

View file

@ -1,88 +0,0 @@
type ProcessSvgOptions = {
color: string
textColor: string
withText: boolean
}
function findGroupBounds(
svg: string,
groupId: string,
): { start: number; end: number } | null {
const pattern = new RegExp(`<g[^>]*\\bid="${groupId}"[^>]*>`)
const match = svg.match(pattern)
if (!match || match.index === undefined) return null
let depth = 1
let pos = match.index + match[0].length
while (depth > 0 && pos < svg.length) {
const nextOpen = svg.indexOf('<g', pos)
const nextClose = svg.indexOf('</g>', pos)
if (nextClose === -1) break
if (nextOpen !== -1 && nextOpen < nextClose) {
depth++
pos = nextOpen + 2
} else {
depth--
if (depth === 0) {
return { start: match.index, end: nextClose + 4 }
}
pos = nextClose + 4
}
}
return null
}
function replaceGroupFills(section: string, color: string): string {
return section
.replace(/fill:#[0-9a-fA-F]{3,8}/g, `fill:${color}`)
.replace(/fill="[^"]*#[0-9a-fA-F]{3,8}[^"]*"/g, `fill="${color}"`)
}
function extractSvgInner(svg: string): string {
const openMatch = svg.match(/<svg[^>]*>/)
if (!openMatch || openMatch.index === undefined) return svg
const innerStart = openMatch.index + openMatch[0].length
const innerEnd = svg.lastIndexOf('</svg>')
if (innerEnd === -1) return svg
return svg.substring(innerStart, innerEnd)
}
export function processSvg(
rawSvg: string,
{ color, textColor, withText }: ProcessSvgOptions,
): string {
let inner = extractSvgInner(rawSvg)
const logoBounds = findGroupBounds(inner, 'logo')
const textBounds = findGroupBounds(inner, 'text')
if (logoBounds) {
const logoSection = inner.substring(logoBounds.start, logoBounds.end)
const processedLogo = replaceGroupFills(logoSection, color)
inner = inner.replace(logoSection, processedLogo)
}
if (textBounds) {
// Re-find text bounds after logo replacement may have shifted positions
const updatedTextBounds = findGroupBounds(inner, 'text')
if (updatedTextBounds) {
if (!withText) {
inner =
inner.substring(0, updatedTextBounds.start) +
inner.substring(updatedTextBounds.end)
} else {
const textSection = inner.substring(
updatedTextBounds.start,
updatedTextBounds.end,
)
const processedText = replaceGroupFills(textSection, textColor)
inner = inner.replace(textSection, processedText)
}
}
}
return inner
}