Compare commits

..
27 changed files with 1028 additions and 1410 deletions

View file

@ -16,12 +16,9 @@
"@tailwindcss/typography": "^0.5.20",
"@tailwindcss/vite": "^4.3.3",
"astro": "^7.3.5",
"plaiceholder": "^3.0.0",
"sharp": "^0.35.5",
"tailwindcss": "^4.3.3"
},
"devDependencies": {
"@types/node": "^26.6.4",
"daisyui": "^5.7.46"
}
}

69
pnpm-lock.yaml generated
View file

@ -10,29 +10,20 @@ importers:
dependencies:
'@lucide/astro':
specifier: ^1.48.0
version: 1.48.0(astro@7.3.5(@types/node@26.6.4)(jiti@2.7.0))
version: 1.48.0(astro@7.3.5(jiti@2.7.0))
'@tailwindcss/typography':
specifier: ^0.5.20
version: 0.5.20(tailwindcss@4.3.3)
'@tailwindcss/vite':
specifier: ^4.3.3
version: 4.3.3(vite@8.3.1(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0))
version: 4.3.3(vite@8.3.1(esbuild@0.28.2)(jiti@2.7.0))
astro:
specifier: ^7.3.5
version: 7.3.5(@types/node@26.6.4)(jiti@2.7.0)
plaiceholder:
specifier: ^3.0.0
version: 3.0.0(sharp@0.35.5(@types/node@26.6.4))
sharp:
specifier: ^0.35.5
version: 0.35.5(@types/node@26.6.4)
version: 7.3.5(jiti@2.7.0)
tailwindcss:
specifier: ^4.3.3
version: 4.3.3
devDependencies:
'@types/node':
specifier: ^26.6.4
version: 26.6.4
daisyui:
specifier: ^5.7.46
version: 5.7.46
@ -819,9 +810,6 @@ packages:
'@types/nlcst@2.0.3':
resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
'@types/node@26.6.4':
resolution: {integrity: sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==}
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
@ -1343,11 +1331,6 @@ packages:
resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
engines: {node: '>=12'}
plaiceholder@3.0.0:
resolution: {integrity: sha512-jwHxxHPnr1BwRzPCeZgEK2BMsEy2327sWynw3qb6XC/oGgGDUTPtR8pFxFQmNArhMBwhkUbUr5OPhhIJpCa8eQ==}
peerDependencies:
sharp: '>= 0.30.6'
postcss-selector-parser@6.0.10:
resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
engines: {node: '>=4'}
@ -1481,9 +1464,6 @@ packages:
uncrypto@0.1.3:
resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
undici-types@8.9.0:
resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==}
undici@8.11.2:
resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==}
engines: {node: '>=22.19.0'}
@ -1904,7 +1884,8 @@ snapshots:
'@esbuild/win32-x64@0.28.2':
optional: true
'@img/colour@1.1.0': {}
'@img/colour@1.1.0':
optional: true
'@img/sharp-darwin-arm64@0.35.5':
optionalDependencies:
@ -2029,9 +2010,9 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.6.0
'@lucide/astro@1.48.0(astro@7.3.5(@types/node@26.6.4)(jiti@2.7.0))':
'@lucide/astro@1.48.0(astro@7.3.5(jiti@2.7.0))':
dependencies:
astro: 7.3.5(@types/node@26.6.4)(jiti@2.7.0)
astro: 7.3.5(jiti@2.7.0)
'@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)':
dependencies:
@ -2204,12 +2185,12 @@ snapshots:
postcss-selector-parser: 6.0.10
tailwindcss: 4.3.3
'@tailwindcss/vite@4.3.3(vite@8.3.1(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0))':
'@tailwindcss/vite@4.3.3(vite@8.3.1(esbuild@0.28.2)(jiti@2.7.0))':
dependencies:
'@tailwindcss/node': 4.3.3
'@tailwindcss/oxide': 4.3.3
tailwindcss: 4.3.3
vite: 8.3.1(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)
vite: 8.3.1(esbuild@0.28.2)(jiti@2.7.0)
'@tybys/wasm-util@0.10.4':
dependencies:
@ -2234,10 +2215,6 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
'@types/node@26.6.4':
dependencies:
undici-types: 8.9.0
'@types/unist@3.0.3': {}
'@ungap/structured-clone@1.4.0': {}
@ -2255,7 +2232,7 @@ snapshots:
aria-query@5.3.2: {}
astro@7.3.5(@types/node@26.6.4)(jiti@2.7.0):
astro@7.3.5(jiti@2.7.0):
dependencies:
'@astrojs/compiler-rs': 0.5.1
'@astrojs/internal-helpers': 0.11.0
@ -2305,13 +2282,13 @@ snapshots:
unifont: 0.7.5
unstorage: 1.17.5
verkit: 0.4.1
vite: 8.3.1(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)
vitefu: 1.1.3(vite@8.3.1(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0))
vite: 8.3.1(esbuild@0.28.2)(jiti@2.7.0)
vitefu: 1.1.3(vite@8.3.1(esbuild@0.28.2)(jiti@2.7.0))
xxhash-wasm: 1.1.0
yargs-parser: 22.0.0
zod: 4.6.5
optionalDependencies:
sharp: 0.35.5(@types/node@26.6.4)
sharp: 0.35.5
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@ -2777,10 +2754,6 @@ snapshots:
picomatch@4.0.7: {}
plaiceholder@3.0.0(sharp@0.35.5(@types/node@26.6.4)):
dependencies:
sharp: 0.35.5(@types/node@26.6.4)
postcss-selector-parser@6.0.10:
dependencies:
cssesc: 3.0.0
@ -2860,9 +2833,10 @@ snapshots:
sax@1.6.1: {}
semver@7.8.5: {}
semver@7.8.5:
optional: true
sharp@0.35.5(@types/node@26.6.4):
sharp@0.35.5:
dependencies:
'@img/colour': 1.1.0
detect-libc: 2.1.2
@ -2893,7 +2867,7 @@ snapshots:
'@img/sharp-win32-arm64': 0.35.5
'@img/sharp-win32-ia32': 0.35.5
'@img/sharp-win32-x64': 0.35.5
'@types/node': 26.6.4
optional: true
shiki@4.4.3:
dependencies:
@ -2957,8 +2931,6 @@ snapshots:
uncrypto@0.1.3: {}
undici-types@8.9.0: {}
undici@8.11.2: {}
unified@11.0.5:
@ -3025,7 +2997,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
vite@8.3.1(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0):
vite@8.3.1(esbuild@0.28.2)(jiti@2.7.0):
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.7
@ -3033,14 +3005,13 @@ snapshots:
rolldown: 1.2.11
tinyglobby: 0.2.17
optionalDependencies:
'@types/node': 26.6.4
esbuild: 0.28.2
fsevents: 2.3.3
jiti: 2.7.0
vitefu@1.1.3(vite@8.3.1(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)):
vitefu@1.1.3(vite@8.3.1(esbuild@0.28.2)(jiti@2.7.0)):
optionalDependencies:
vite: 8.3.1(@types/node@26.6.4)(esbuild@0.28.2)(jiti@2.7.0)
vite: 8.3.1(esbuild@0.28.2)(jiti@2.7.0)
xxhash-wasm@1.1.0: {}

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 363 KiB

After

Width:  |  Height:  |  Size: 363 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Before After
Before After

View file

@ -1,287 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 232.51806 82.699088"
width="232.51807pt"
height="82.699089pt"
version="1.1"
id="svg1734"
sodipodi:docname="social.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1734"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="pt">
<inkscape:page
x="-1.7632415e-38"
y="0"
width="232.51807"
height="82.699089"
id="page2"
margin="0"
bleed="0" />
</sodipodi:namedview>
<g
transform="matrix(0.8,0,0,0.8,5.7736079,0.92522993)"
id="g1719">
<g
transform="matrix(1,0,0,-1,-7.2170079,67.464567)"
id="g1703">
<use
xlink:href="#g235EE6022D045F3B1180C0D88D8B0DDC"
x="0"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1702" />
<use
xlink:href="#g39F49CB5E19E9CF4058E21CAA6301665"
x="69.777641"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1703" />
</g>
<g
transform="matrix(1,0,0,-1,91.672441,67.464567)"
id="g1707">
<use
xlink:href="#g3318BDD63D77FA2107464675D9F5DCCF"
x="0"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1704" />
<use
xlink:href="#gBDFC9AD08B6F962467A9573CE1CD1760"
x="51.550865"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1705" />
<use
xlink:href="#gC891A3D19973D46EDEF95A9D0B4D9335"
x="96.837166"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1706" />
<use
xlink:href="#gA5D8B46AC0A159D14552D0EB9DCE384F"
x="142.70174"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1707" />
</g>
<g
transform="matrix(1,0,0,-1,-2.1174803,101.79213)"
id="g1711">
<use
xlink:href="#g1205DB5C1EB00AB1DA1D0763B3AB3A8A"
x="0"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1708" />
<use
xlink:href="#g68238015C7D207E5078F5F81501F2AA0"
x="21.564568"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1709" />
<use
xlink:href="#g1205DB5C1EB00AB1DA1D0763B3AB3A8A"
x="45.113384"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1710" />
<use
xlink:href="#g5EBC7036348A474003124BFFDC93DE13"
x="66.677956"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1711" />
</g>
<g
transform="matrix(1,0,0,-1,98.23748,101.79213)"
id="g1718">
<use
xlink:href="#g8E6AC688CFBB70D6CEB1963ECE61AA69"
x="0"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1712" />
<use
xlink:href="#g6B3B76D2B8234CCD7F07A6CD6863832C"
x="26.844095"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1713" />
<use
xlink:href="#gD10F42B71E2B533345799A04029B23B5"
x="52.944096"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1714" />
<use
xlink:href="#gC65321C9DA712852DAE01AC9A48A0B93"
x="84.748817"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1715" />
<use
xlink:href="#gA45DD5D235CAC36E29E13763D4715334"
x="110.84882"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1716" />
<use
xlink:href="#g55E1EBD5D776423A04474C777635C9A3"
x="138.01181"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1717" />
<use
xlink:href="#g53690710312B481980D246EB3348FCF5"
x="164.14725"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1718" />
</g>
</g>
<defs
id="defs1734">
<symbol
id="g235EE6022D045F3B1180C0D88D8B0DDC"
overflow="visible">
<path
d="M 0,0 M 7.2283465,67.464567 V 0 H 31.708346 c 24.769134,0 33.346772,18.408189 33.346772,33.732283 0,16.866142 -9.348661,33.732284 -32.96126,33.732284 z M 33.250394,13.974803 H 21.877795 v 39.611339 h 12.432756 c 10.697953,0 15.516851,-10.312441 15.516851,-19.853859 0,-9.155905 -4.529764,-19.75748 -16.577008,-19.75748 z"
id="path1719" />
</symbol>
<symbol
id="g39F49CB5E19E9CF4058E21CAA6301665"
overflow="visible">
<path
d="M 0,0 M 7.7102362,0 H 22.359685 V 67.464567 H 7.7102362 Z"
id="path1720" />
</symbol>
<symbol
id="g3318BDD63D77FA2107464675D9F5DCCF"
overflow="visible">
<path
d="M 0,0 M 10.408819,67.464567 V 0 h 16.287874 c 23.99811,0 30.551811,18.215433 30.551811,33.732283 0,16.673386 -7.613858,33.732284 -30.166299,33.732284 z M 26.889449,4.8188976 H 15.51685 V 62.742047 h 12.143622 c 17.733544,0 24.190867,-14.553071 24.190867,-29.009764 0,-13.492913 -5.493544,-28.9133854 -24.96189,-28.9133854 z"
id="path1721" />
</symbol>
<symbol
id="gBDFC9AD08B6F962467A9573CE1CD1760"
overflow="visible">
<path
d="m 0,0 m 51.273071,0 h 5.300787 L 33.154016,67.464567 H 29.298898 L 6.071811,0 h 5.397165 l 6.168189,18.215433 H 44.912126 Z M 43.466457,22.648819 H 19.082835 l 9.541417,27.853228 c 0.48189,1.44567 2.120315,6.360945 2.602205,8.48126 0.481889,-2.120315 2.120315,-6.842835 2.698582,-8.48126 z"
id="path1722" />
</symbol>
<symbol
id="gC891A3D19973D46EDEF95A9D0B4D9335"
overflow="visible">
<path
d="m 0,0 m 26.793071,0 h 5.108031 V 26.793071 L 53.875276,67.464567 H 48.47811 L 29.298898,31.515591 10.408819,67.464567 H 4.8188976 L 26.793071,26.600315 Z"
id="path1723" />
</symbol>
<symbol
id="gA5D8B46AC0A159D14552D0EB9DCE384F"
overflow="visible">
<path
d="m 0,0 m 28.624252,-1.1565354 c 11.950866,0 20.432126,6.6500787 20.432126,18.3118114 0,12.432755 -10.119685,18.119055 -18.890079,21.588661 -8.192126,3.27685 -16.095118,6.746457 -16.095118,14.649449 0,6.457323 5.011654,10.505197 13.492913,10.505197 6.939213,0 11.565355,-3.180473 13.589292,-7.710237 l 4.818897,1.542048 c -2.023937,6.457323 -8.963149,10.890708 -18.119055,10.890708 -12.143622,0 -19.0828343,-6.746456 -19.0828343,-15.227716 0,-11.179843 10.0233073,-15.99874 19.2755903,-19.564725 8.192126,-3.084094 15.709607,-7.99937 15.709607,-16.769763 0,-8.7703941 -5.879056,-13.4929137 -15.034961,-13.4929137 -7.902992,0 -13.974803,4.4333858 -16.96252,10.9870867 L 6.7464567,12.818268 C 9.7341732,5.3007874 17.733543,-1.1565354 28.624252,-1.1565354 Z"
id="path1724" />
</symbol>
<symbol
id="g1205DB5C1EB00AB1DA1D0763B3AB3A8A"
overflow="visible">
<path
d="M 0,0 M 2.1614173,0 H 19.38189 V 5.1732283 H 8.4685039 c 0.8149607,1.8425197 2.1259841,2.8700788 5.4566931,4.8543307 3.047244,1.771654 5.244094,3.57874 5.244094,7.866142 0,4.03937 -2.940945,7.334645 -8.114173,7.334645 -3.57874,0 -6.9803149,-2.019685 -8.5039369,-5.421259 l 4.8188976,-2.161418 c 0.8149607,1.559055 2.1259843,2.480315 3.8622043,2.480315 1.629922,0 2.622048,-0.744094 2.622048,-2.444882 0,-1.700787 -1.559055,-2.692913 -3.188977,-3.57874 C 5.8464567,11.444882 2.1614173,7.6181102 2.1614173,0 Z"
id="path1725" />
</symbol>
<symbol
id="g68238015C7D207E5078F5F81501F2AA0"
overflow="visible">
<path
d="m 0,0 m 11.834646,-0.42519685 c 7.15748,0 9.283464,6.51968505 9.283464,12.82677185 0,6.271653 -2.019685,12.826771 -9.283464,12.826771 -7.1929137,0 -9.318898,-6.448818 -9.318898,-12.826771 0,-6.0590553 2.0196851,-12.82677185 9.318898,-12.82677185 z m 0,5.10236225 c -3.0472444,0 -4.0039373,3.8622047 -4.0039373,7.7244096 0,4.03937 1.027559,7.724409 4.0039373,7.724409 3.011811,0 3.968504,-3.826771 3.968504,-7.724409 0,-4.0393703 -0.992126,-7.7244096 -3.968504,-7.7244096 z"
id="path1726" />
</symbol>
<symbol
id="g5EBC7036348A474003124BFFDC93DE13"
overflow="visible">
<path
d="m 0,0 m 11.444882,-0.42519685 c 5.279527,0 9.035433,3.29527555 9.035433,8.11417325 0,4.8188976 -3.543307,8.1141736 -8.362205,8.1141736 -1.488189,0 -2.6574801,-0.389764 -3.5078738,-0.92126 1.4881888,3.295275 5.2795278,4.748031 8.6102358,5.244094 v 5.102362 C 6.484252,23.562992 2.1614173,17.007874 2.1614173,9.1062992 c 0,-5.4212598 3.2598425,-9.53149605 9.2834647,-9.53149605 z m 0,5.10236225 c -2.1614174,0 -3.7204726,1.0984252 -3.7204726,3.011811 0,1.7716535 1.5590552,3.0472436 3.7204726,3.0472436 2.090551,0 3.685039,-1.2047239 3.685039,-3.0472436 0,-1.9133858 -1.594488,-3.011811 -3.685039,-3.011811 z"
id="path1727" />
</symbol>
<symbol
id="g8E6AC688CFBB70D6CEB1963ECE61AA69"
overflow="visible">
<path
d="M 0,0 M 18.425197,0 H 20.30315 V 24.80315 H 18.425197 V 13.783465 H 5.7047244 V 24.80315 H 3.8267717 V 0 H 5.7047244 V 12.011811 H 18.425197 Z"
id="path1728" />
</symbol>
<symbol
id="g6B3B76D2B8234CCD7F07A6CD6863832C"
overflow="visible">
<path
d="m 0,0 m 18.850394,0 h 1.948819 L 12.188976,24.80315 H 10.771654 L 2.2322835,0 H 4.2165354 L 6.484252,6.6968504 H 16.511811 Z M 15.980315,8.3267717 H 7.015748 l 3.507874,10.2401573 c 0.177165,0.531496 0.779528,2.338583 0.956693,3.11811 0.177165,-0.779527 0.779528,-2.515748 0.992126,-3.11811 z"
id="path1729" />
</symbol>
<symbol
id="gD10F42B71E2B533345799A04029B23B5"
overflow="visible">
<path
d="M 0,0 M 24.555118,0 V 24.80315 H 22.889764 L 14.811024,5.7755906 C 14.598425,5.2440945 14.385827,4.7125984 14.137795,4.1811024 13.925197,4.7125984 13.712598,5.2440945 13.464567,5.7755906 L 5.4566929,24.80315 H 3.8267717 V 0 h 1.8779527 v 18.212598 1.488189 C 5.8818898,19.204724 6.0944882,18.708661 6.3070866,18.212598 L 14.031496,-0.42519685 22.003937,18.212598 c 0.212598,0.531496 0.46063,1.027559 0.673228,1.523622 V 18.212598 0 Z"
id="path1730" />
</symbol>
<symbol
id="gC65321C9DA712852DAE01AC9A48A0B93"
overflow="visible">
<path
d="M 0,0 M 3.8267717,24.80315 V 0 h 8.4685043 c 5.881889,0 7.61811,3.507874 7.61811,6.8031496 0,3.5078744 -2.196851,5.7401574 -5.208662,6.2007874 2.657481,0.779528 4.322835,2.870079 4.322835,5.492126 0,3.153543 -1.700787,6.307087 -7.299213,6.307087 z M 11.090551,13.712598 H 5.7047244 v 9.425197 h 6.2007876 c 4.358268,0 5.350394,-2.374015 5.350394,-4.570866 0,-2.940945 -2.090552,-4.854331 -6.165355,-4.854331 z M 12.685039,1.7007874 H 5.7047244 V 12.047244 h 5.8110236 c 5.279528,0 6.625984,-2.6220471 6.625984,-5.4566928 0,-2.480315 -1.204724,-4.8897638 -5.456693,-4.8897638 z"
id="path1731" />
</symbol>
<symbol
id="gA45DD5D235CAC36E29E13763D4715334"
overflow="visible">
<path
d="m 0,0 m 11.870079,-0.42519685 c 5.102362,0 8.185039,2.69291335 8.185039,9.46062995 V 24.80315 H 18.177165 V 9.0708661 c 0,-6.2362204 -2.976378,-7.7598425 -6.307086,-7.7598425 -3.366142,0 -6.3425199,1.5236221 -6.3425199,7.7598425 V 24.80315 H 3.6496063 V 9.0354331 c 0,-6.7677166 3.0826772,-9.46062995 8.2204727,-9.46062995 z"
id="path1732" />
</symbol>
<symbol
id="g55E1EBD5D776423A04474C777635C9A3"
overflow="visible">
<path
d="M 0,0 M 3.8267717,0 H 5.7047244 V 11.374016 H 11.76378 L 17.220472,0 h 2.090552 l -5.598426,11.444882 c 4.5,0.531496 6.307087,3.57874 6.307087,6.732283 0,3.259843 -1.771654,6.625985 -7.405512,6.625985 H 3.8267717 Z m 1.8779527,13.074803 v 10.027559 h 6.9448816 c 4.322835,0 5.492126,-2.870079 5.492126,-4.996063 0,-2.409449 -1.346456,-5.031496 -5.492126,-5.031496 z"
id="path1733" />
</symbol>
<symbol
id="g53690710312B481980D246EB3348FCF5"
overflow="visible">
<path
d="m 0,0 m 12.720472,-0.42519685 c 4.677166,0 8.18504,3.15354335 8.18504,9.88582675 V 11.409449 H 14.031496 V 9.7086614 H 18.92126 V 8.7519685 c 0,-4.7834646 -2.409449,-7.4055118 -6.200788,-7.4055118 -5.6338578,0 -7.9724405,5.3503937 -7.9724405,11.0551183 0,5.173228 2.0905512,11.090551 7.9724405,11.090551 2.870079,0 4.429134,-1.417323 5.527559,-2.976378 l 1.665355,1.027559 c -1.240158,1.807087 -3.188977,3.685039 -7.192914,3.685039 -6.9448814,0 -9.9566925,-6.059055 -9.9566925,-12.826771 0,-6.4842522 2.7992126,-12.82677185 9.9566925,-12.82677185 z"
id="path1734" />
</symbol>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

View file

@ -1,16 +1,174 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 226.73577 55.822265"
width="226.73578pt"
height="55.822266pt"
viewBox="0 0 232.51806 82.699088"
width="232.51807pt"
height="82.699089pt"
version="1.1"
id="svg1734"
sodipodi:docname="social.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<path
id="path6"
style="fill:#563b07;fill-rule:nonzero;stroke-width:0.8"
d="M 209.77295,2.4422778e-8 C 200.05805,2.4422778e-8 194.50634,5.396633 194.50634,12.181641 c 0,8.943875 8.01858,12.799067 15.42041,15.651855 6.5537,2.467275 12.56836,6.400189 12.56836,13.416504 0,7.016315 -4.7031,10.794434 -12.02783,10.794434 -6.32239,0 -11.18014,-3.547567 -13.57031,-8.790528 l -4.00928,1.388672 c 2.39017,6.013984 8.78939,11.179688 17.50196,11.179688 9.56069,0 16.34619,-5.320517 16.34619,-14.649903 0,-9.946204 -8.09649,-14.494823 -15.1128,-17.270508 -6.5537,-2.62148 -12.87597,-5.39782 -12.87597,-11.720214 0,-5.165858 4.00942,-8.403809 10.79443,-8.403809 5.55137,0 9.25292,2.544646 10.87207,6.168458 l 3.85547,-1.233399 C 222.64989,3.547033 217.09768,2.4422778e-8 209.77295,2.4422778e-8 Z M -3.0889907e-7,0.92578202 V 54.896484 H 19.584961 c 19.815307,0 26.676269,-14.726076 26.676269,-26.985351 0,-13.492914 -7.478572,-26.98535098 -26.368652,-26.98535098 z m 56.20751930889907,0 V 54.896484 H 67.927734 V 0.92578202 Z m 25.448731,0 V 54.896484 h 13.029785 c 19.198485,0 24.442375,-14.571871 24.442375,-26.985351 0,-13.338709 -6.09134,-26.98535098 -24.133295,-26.98535098 z m 56.35254,0 -18.58155,53.97070198 h 4.31836 l 4.9336,-14.572265 h 21.82031 l 5.08887,14.572265 h 4.24072 L 141.09375,0.92578202 Z m 16.64502,0 17.57959,32.69091698 v 21.279785 h 4.08691 V 33.462891 L 193.8999,0.92578202 h -4.31836 L 174.23877,29.685059 159.12597,0.92578202 Z M 85.743165,4.703614 h 9.71484 c 14.186835,0 19.352055,11.642164 19.352055,23.207519 0,10.79433 -4.39407,23.131347 -19.968755,23.131347 h -9.09814 z m 53.808105,3.007324 c 0.38551,1.696252 1.69657,5.472951 2.15918,6.783691 l 7.6333,22.283203 h -19.50733 l 7.6333,-22.283203 c 0.38551,-1.156536 1.69603,-5.087439 2.08155,-6.783691 z M 11.720215,12.027832 h 9.946289 c 8.558362,0 12.413086,8.250166 12.413086,15.883301 0,7.324724 -3.623435,15.805664 -13.261231,15.805664 h -9.098144 z" />
<sodipodi:namedview
id="namedview1734"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="pt">
<inkscape:page
x="-1.7632415e-38"
y="0"
width="232.51807"
height="82.699089"
id="page2"
margin="0"
bleed="0" />
</sodipodi:namedview>
<g
transform="matrix(0.8,0,0,0.8,5.7736079,0.92522993)"
id="g1719">
<g
transform="matrix(1,0,0,-1,-7.2170079,67.464567)"
id="g1703">
<use
xlink:href="#g235EE6022D045F3B1180C0D88D8B0DDC"
x="0"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1702" />
<use
xlink:href="#g39F49CB5E19E9CF4058E21CAA6301665"
x="69.777641"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1703" />
</g>
<g
transform="matrix(1,0,0,-1,91.672441,67.464567)"
id="g1707">
<use
xlink:href="#g3318BDD63D77FA2107464675D9F5DCCF"
x="0"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1704" />
<use
xlink:href="#gBDFC9AD08B6F962467A9573CE1CD1760"
x="51.550865"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1705" />
<use
xlink:href="#gC891A3D19973D46EDEF95A9D0B4D9335"
x="96.837166"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1706" />
<use
xlink:href="#gA5D8B46AC0A159D14552D0EB9DCE384F"
x="142.70174"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1707" />
</g>
<g
transform="matrix(1,0,0,-1,-2.1174803,101.79213)"
id="g1711">
<use
xlink:href="#g1205DB5C1EB00AB1DA1D0763B3AB3A8A"
x="0"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1708" />
<use
xlink:href="#g68238015C7D207E5078F5F81501F2AA0"
x="21.564568"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1709" />
<use
xlink:href="#g1205DB5C1EB00AB1DA1D0763B3AB3A8A"
x="45.113384"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1710" />
<use
xlink:href="#g5EBC7036348A474003124BFFDC93DE13"
x="66.677956"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1711" />
</g>
<g
transform="matrix(1,0,0,-1,98.23748,101.79213)"
id="g1718">
<use
xlink:href="#g8E6AC688CFBB70D6CEB1963ECE61AA69"
x="0"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1712" />
<use
xlink:href="#g6B3B76D2B8234CCD7F07A6CD6863832C"
x="26.844095"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1713" />
<use
xlink:href="#gD10F42B71E2B533345799A04029B23B5"
x="52.944096"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1714" />
<use
xlink:href="#gC65321C9DA712852DAE01AC9A48A0B93"
x="84.748817"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1715" />
<use
xlink:href="#gA45DD5D235CAC36E29E13763D4715334"
x="110.84882"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1716" />
<use
xlink:href="#g55E1EBD5D776423A04474C777635C9A3"
x="138.01181"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1717" />
<use
xlink:href="#g53690710312B481980D246EB3348FCF5"
x="164.14725"
y="0"
fill="#563b07"
fill-rule="nonzero"
id="use1718" />
</g>
</g>
<defs
id="defs1734">
<symbol

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Before After
Before After

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

View file

@ -17,11 +17,23 @@ const {white = false} = Astro.props
eine Email an <a class="link" href="mailto:orga@didays.de">orga@didays.de</a>.<br><br>
</p>
</div>
<div class="container px-8 mx-auto max-w-4xl grid grid-cols-1 items-center gap-12">
<div class="container px-8 mx-auto max-w-4xl grid grid-cols-1 md:grid-cols-3 items-center gap-12">
<div class="flex flex-col items-center">
<a class="link" href="https://hamburg.ccc.de/imprint/">Kontakt & Impressum</a>
<a class="link" href="https://hamburg.ccc.de/privacy-notice/">Datenschutzerklärung</a>
<a class="link" rel="me" href="https://chaos.social/@didays">Fediverse</a>
</div>
<div class="flex flex-col items-center">
<a href="https://hamburg.ccc.de">
<img alt="Logo des Chaos Computer Club Hamburg e.V." src={path(import.meta.env.BASE_URL, "/ccchh.svg")}
class="max-w-40 invert"/>
</a>
</div>
<div class="flex flex-col items-center">
<a href="https://www.wauland.de">
<img alt="Logo der Wau-Holland-Stiftung" src={path(import.meta.env.BASE_URL, "/wauland.svg")}
class="max-w-40 invert"/>
</a>
</div>
</div>
</footer>

View file

@ -1,48 +1,9 @@
---
import path from "../utils/path.ts"
import {Users, List, Info, CalendarDays, type AstroComponent} from "@lucide/astro"
const route = Astro.url.pathname
const events: Record<string, Array<{
name: string,
path: string,
icon: AstroComponent,
}>> = {
"fallback": [
{
name: "Hamburg 2026",
path: "/hamburg/2026/",
icon: CalendarDays,
},
],
"/meta": [],
"/hamburg/2026": [
{
name: "Info & Rückblick",
path: "/hamburg/2026/",
icon: Info,
},
{
name: "Programm",
path: "/hamburg/2026/programm",
icon: List,
},
{
name: "Wer",
path: "/hamburg/2026/wer",
icon: Users,
},
],
}
const currentEventPath = Object.keys(events).filter(event => route.startsWith(path(import.meta.env.BASE_URL, event)))[0]
const event = events[currentEventPath] ?? events["fallback"]
import {Users, List, Info} from "@lucide/astro"
---
<div class="navbar bg-base-100 shadow-sm z-50 h-20 sticky top-0 left-0 w-screen">
<div class="navbar bg-base-100 shadow-sm z-30 sticky top-0 left-0 w-screen">
<div class="navbar-start w-fit max-h-14">
<div class="dropdown">
<div tabindex="0" role="button" class="btn btn-ghost sm:hidden">
@ -53,16 +14,18 @@ const event = events[currentEventPath] ?? events["fallback"]
<ul
tabindex="-1"
class="menu menu-sm dropdown-content bg-base-100 rounded-box z-1 mt-3 w-52 p-4 gap-4 shadow-xl border">
{
event.map(item =>
<li>
<a class="text-xl" href={path(import.meta.env.BASE_URL, item.path)}>
<item.icon />
{item.name}
</a>
</li>,
)
}
<li><a class="text-xl" href={path(import.meta.env.BASE_URL, "/")}>
<Info/>
Wann & Wo
</a></li>
<li><a class="text-xl" href={path(import.meta.env.BASE_URL, "/hamburg/2026/programm/")}>
<List/>
Programm
</a></li>
<li><a class="text-xl" href={path(import.meta.env.BASE_URL, "/hamburg/2026/wer/")}>
<Users/>
Wer
</a></li>
</ul>
</div>
<a class="btn btn-link text-xl max-h-14" href={path(import.meta.env.BASE_URL, "/")}>
@ -74,16 +37,18 @@ const event = events[currentEventPath] ?? events["fallback"]
</div>
<div class="navbar-center hidden sm:flex">
<ul class="menu menu-horizontal px-1 gap-2">
{
event.map(item =>
<li>
<a href={path(import.meta.env.BASE_URL, item.path)}>
<item.icon />
{item.name}
</a>
</li>,
)
}
<li><a href={path(import.meta.env.BASE_URL, "/")}>
<Info/>
Wann & Wo
</a></li>
<li><a href={path(import.meta.env.BASE_URL, "/hamburg/2026/programm/")}>
<List/>
Programm
</a></li>
<li><a href={path(import.meta.env.BASE_URL, "/hamburg/2026/wer/")}>
<Users/>
Wer
</a></li>
</ul>
</div>
</div>

View file

@ -1,249 +0,0 @@
---
import Footer from "../../../components/Footer.astro"
import Layout from "../../../layouts/Layout.astro"
import {File} from "@lucide/astro"
import customPath from "../../../utils/path.ts"
import {Picture} from "astro:assets"
import {readFile} from "node:fs/promises"
import {getPlaiceholder} from "plaiceholder"
import traumweh_1 from "../../../assets/media/hamburg/2026/traumweh_1.png"
type Image = {
image: any,
alt: string,
attribution: string,
blur?: string,
}
const images_raw: Record<string, Image> = {
traumweh_1: {
image: traumweh_1,
alt: "Ein Foto der Veranstaltung. Eine Speakerin steht auf einer Bühe. Auf einer Leinwand ist eine Präsentation zu sehen. Auf Bannern steht DIDAYS 2026 Hamburg.",
attribution: "CC-4.0 BY-SA traumweh",
},
traumweh_2: {
image: traumweh_1,
alt: "Ein Foto der Veranstaltung. Eine Speakerin steht auf einer Bühe. Auf einer Leinwand ist eine Präsentation zu sehen. Auf Bannern steht DIDAYS 2026 Hamburg.",
attribution: "CC-4.0 BY-SA traumweh",
},
traumweh_3: {
image: traumweh_1,
alt: "Ein Foto der Veranstaltung. Eine Speakerin steht auf einer Bühe. Auf einer Leinwand ist eine Präsentation zu sehen. Auf Bannern steht DIDAYS 2026 Hamburg.",
attribution: "CC-4.0 BY-SA traumweh",
},
traumweh_4: {
image: traumweh_1,
alt: "Ein Foto der Veranstaltung. Eine Speakerin steht auf einer Bühe. Auf einer Leinwand ist eine Präsentation zu sehen. Auf Bannern steht DIDAYS 2026 Hamburg.",
attribution: "CC-4.0 BY-SA traumweh",
},
traumweh_5: {
image: traumweh_1,
alt: "Ein Foto der Veranstaltung. Eine Speakerin steht auf einer Bühe. Auf einer Leinwand ist eine Präsentation zu sehen. Auf Bannern steht DIDAYS 2026 Hamburg.",
attribution: "CC-4.0 BY-SA traumweh",
},
}
const images: Record<string, Image> = {}
for (const image_name in images_raw) {
const image = images_raw[image_name]
let buffer
if (import.meta.env.DEV) {
const imagePath = new URL(image.image.src, Astro.url)
const imageResponse = await fetch(imagePath)
buffer = Buffer.from(await imageResponse.arrayBuffer())
} else {
const path = image.image.src.substring((import.meta.env.BASE_URL).length).replace(/(^[\/]*|[\/]*$)/g, '')
const imagePath = "./dist/" + path
buffer = await readFile(imagePath)
}
image["blur"] = (await getPlaiceholder(buffer, {
size: 10,
})).base64
images[image_name] = image
}
const impressions = ["traumweh_1", "traumweh_2", "traumweh_3", "traumweh_4", "traumweh_5"]
const slides = [
{
name: "Vortragstitel",
path: "/hamburg/2026/slides/vortrag.pdf",
},
{
name: "Vortragstitel",
path: "/hamburg/2026/slides/vortrag.pdf",
},
{
name: "Vortragstitel",
path: "/hamburg/2026/slides/vortrag.pdf",
},
{
name: "Vortragstitel",
path: "/hamburg/2026/slides/vortrag.pdf",
},
]
---
<Layout>
<div class="flex flex-col">
<h1 class="text-6xl font-bold mt-8 mb-4 flex justify-center">
<img src={customPath(import.meta.env.BASE_URL, "/hamburg/2026/logo.svg")}
alt="Logo von den DiDays 2026 in Hamburg"
class="h-full"/>
</h1>
<div class="mask-[url(/transitions/big.svg)] bg-base-200 h-30 mask-repeat-x mask-[auto_100%]"/>
</div>
<div class="bg-base-200 pt-8 pb-16">
<div class="container p-8 max-w-5xl mx-auto flex flex-col md:flex-row gap-10 items-center md:items-start">
<p class="text-xl/8 text-center">
[Platzhaltertext Rückblick Event]
</p>
</div>
</div>
<div class="bg-white relative overflow-hidden">
<div
class="mask-[url(/transitions/small.svg)] bg-base-200 h-10 mask-repeat-x mask-[auto_100%] absolute top-0 w-full z-20"/>
<img
aria-hidden
alt=""
src={images["traumweh_1"].blur}
class="absolute inset-0 w-full h-full transform scale-150 filter blur-2xl"
/>
<Picture
formats={["avif", "webp", "jpg"]}
widths={[540, 720, images["traumweh_1"].image.width]}
src={images["traumweh_1"].image}
alt={images["traumweh_1"].alt}
layout="full-width"
class="w-full max-h-[70vh] object-cover"
pictureAttributes={{class: "relative z-10 text-transparent"}}
/>
{images["traumweh_1"].attribution &&
<span class="absolute z-10 px-3 text-xs py-1 bg-white/50 bottom-11 right-0 rounded-l text-black">
{images["traumweh_1"].attribution}
</span>
}
<div
class="mask-[url(/transitions/small.svg)] bg-base-200 h-10 mask-repeat-x mask-[auto_100%] rotate-180 absolute bottom-0 w-full z-20"/>
</div>
<div class="bg-base-200 pb-20 w-screen overflow-x-hidden">
<div class="container p-8 max-w-2xl mx-auto">
<h2 class="text-4xl font-semibold mb-8">
[Platzhaltertext Titel]
</h2>
<p>
[Platzhaltertext Inhalt]
</p>
</div>
</div>
<div class="bg-base-100 pb-20 w-screen overflow-x-hidden">
<div class="mask-[url(/transitions/small.svg)] bg-base-200 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="container p-8 max-w-2xl mx-auto">
<h2 class="text-4xl font-semibold mb-8">
[Platzhaltertext Titel]
</h2>
<p>
[Platzhaltertext Inhalt]
</p>
</div>
</div>
<div class="bg-base-200 pb-20 w-screen overflow-x-hidden">
<div class="mask-[url(/transitions/small.svg)] bg-base-100 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="container p-8 mx-auto">
<h2 class="text-4xl font-semibold my-8 mx-auto text-center">
Eindrücke vom Event
</h2>
<div class="flex gap-4 overflow-x-auto w-full justify-start py-4">
{impressions.map(async (impression_name) => {
const impression = images[impression_name]
return (
<button command="show-modal" commandfor={`impression-${impression_name}`}
class="mx-auto shrink-0 w-lg overflow-hidden shadow-lg rounded-xl relative">
<img
aria-hidden
alt=""
src={impression.blur}
class="absolute inset-0 w-full h-full transform scale-150 filter blur-2xl"
/>
<Picture
formats={["avif", "webp", "jpg"]}
widths={[540, 720, impression.image.width]}
src={impression.image}
alt={impression.alt}
layout="full-width"
pictureAttributes={{class: "relative z-10 text-transparent"}}
/>
{impression.attribution &&
<span
class="absolute z-10 px-3 text-xs py-1 bg-white/50 bottom-0 right-0 rounded-tl text-black">
{impression.attribution}
</span>}
</button>
<dialog id={`impression-${impression_name}`}
class="mx-auto my-auto rounded-xl max-w-6xl bg-base-100 backdrop:bg-black/50"
closedby="any">
<Picture
src={impression.image}
alt={impression.alt}
/>
<div class="p-2 flex justify-between items-center">
{
impression.attribution &&
<span class="px-3 text-xs py-1">
{impression.attribution}
</span>
}
<button commandfor={`impression-${impression_name}`} command="close"
class="btn btn-base-200 ml-auto">
Schließen
</button>
</div>
</dialog>)
},
)}
</div>
</div>
</div>
<div class="bg-base-100 pb-20 w-screen overflow-x-hidden">
<div class="mask-[url(/transitions/small.svg)] bg-base-200 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="container p-8 max-w-4xl mx-auto">
<h2 class="text-4xl font-semibold mb-8">
[Platzhaltertitel Vortragsfolien]
</h2>
<p>
[Platzhaltertext Inhalt]
</p>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 w-full py-6">
{slides.map(slide =>
<a href={customPath(import.meta.env.BASE_URL, slide.path)}
class="card shrink-0 bg-base-100 card-md shadow-lg border-base-200 border-2">
<div class="card-body">
<h2 class="card-title">{slide.name}</h2>
<div class="justify-end card-actions">
<button class="btn btn-base-200">
<File/>
Folien Ansehen
</button>
</div>
</div>
</a>,
)}
</div>
</div>
</div>
<Footer/>
</Layout>

View file

@ -12,7 +12,7 @@ import Layout from "../../../layouts/Layout.astro"
</div>
<div class="bg-white">
<pretalx-schedule event-url="https://pretalx.hamburg.ccc.de/didays-hamburg-2026/" locale="de" format="grid"
style="--pretalx-clr-primary: #ffad12; --pretalx-sticky-top-offset: 80px;">
style="--pretalx-clr-primary: #ffad12; --pretalx-sticky-top-offset: 68px;">
</pretalx-schedule>
<noscript>
<div class="pretalx-widget">

View file

@ -7,7 +7,7 @@ import path from "../../../utils/path.ts"
const orgs = [
{
url: "https://hamburg.ccc.de",
image: "/hamburg/2026/ccchh.svg",
image: "/ccchh.svg",
alt: "Logo des Chaos Computer Club Hamburg e.V.",
name: "Chaos Computer Club Hamburg",
info: "Wir sind die lokale Gruppe des Chaos Computer Club in Hamburg: Eine Gruppe von Menschen, die ein Interesse am kreativen Umgang mit Technik teilen. Unsere Gesprächsthemen und Projekte reichen von Soft- und Hardware zu Datenschutz und Netzpolitik.",
@ -17,7 +17,7 @@ const orgs = [
const support = [
{
url: "https://www.wauland.de",
image: "/hamburg/2026/wauland.svg",
image: "/wauland.svg",
alt: "Logo der Wau-Holland-Stiftung",
name: "Wau-Holland-Stiftung",
info: "Unser Anliegen ist es, die freidenkerischen Ansätze Wau Hollands zu bewahren und weiterzuführen.",
@ -27,77 +27,77 @@ const support = [
const partners = [
{
url: "https://digitalcourage.de/treffen-vor-ort/hamburg",
image: "/hamburg/2026/digitalcourage.svg",
image: "/digitalcourage.svg",
alt: "Logo der Digitalcourage e.V. Ortsgruppe Hamburg",
name: "Digitalcourage e.V. Ortsgruppe Hamburg",
info: "Wir engagieren uns in Hamburg gegen Digitalzwang und für digitale Souveränität.",
},
{
url: "https://wiki.openstreetmap.org/w/index.php?title=Hamburg",
image: "/hamburg/2026/osm.svg",
image: "/osm.svg",
alt: "Logo der Hamburger OpenStreetMap Community",
name: "Hamburger OpenStreetMap Community",
info: "Wir sind keine feste Organisation aber eine Gruppe von Menschen, die gemeinsam in Hamburg und Umgebung Daten zum OpenStreetMap Projekt beitragen.",
},
{
url: "https://mastodon.online/@citydata",
image: "/hamburg/2026/citydataexplosion.svg",
image: "/citydataexplosion.svg",
alt: "Logo von city/data/explosion",
name: "city/data/explosion",
info: "Projekte und Veranstaltungen zu Stadt, Öffentlichkeit und Digitalisierung",
},
{
url: "https://ogrbund.de/",
image: "/hamburg/2026/ogr.svg",
image: "/ogr.svg",
alt: "Logo der OMAS GEGEN RECHTS",
name: "OMAS GEGEN RECHTS",
info: "Zivilgesellschaftliche Initiative zum Schutz der Demokratie",
},
{
url: "https://endof10hh.de/",
image: "/hamburg/2026/endof10.svg",
image: "/endof10.svg",
alt: "Logo von End of 10",
name: "End of 10 Hamburg",
info: "Wir veranstalten regelmäßig an unterschiedlichen Orten in Hamburg Linux-Workshops, wo wir Interessierte beim Umstieg von Windows zu Linux unterstützen.",
},
{
url: "https://www.vhs-hamburg.de/",
image: "/hamburg/2026/vhs.svg",
image: "/vhs.svg",
alt: "Logo der Hamburger Volkshochschule",
name: "Hamburger Volkshochschule",
info: "Hamburgs größter Weiterbildungsanbieter mit über 9000 Kursen im Jahr - darunter ein breites digitales Angebot von der Computer-Einführung bis Programmieren.",
},
{
url: "https://www.bezahlkarte-nein.de/",
image: "/hamburg/2026/bezahlkarte.png",
image: "/bezahlkarte.png",
alt: "Logo von NEIN zur Bezahlkarte",
name: "NEIN zur Bezahlkarte",
info: "",
},
{
url: "https://www.vzhh.de/",
image: "/hamburg/2026/vzhh.png",
image: "vzhh.png",
alt: "Logo der Verbraucherzentrale Hamburg",
name: "Verbraucherzentrale Hamburg",
info: "",
},
{
url: "https://annaelbe.net/",
image: "/hamburg/2026/annaelbe.svg",
image: "annaelbe.svg",
alt: "Logo von anna elbe",
name: "anna elbe",
info: "Wir sagen NEIN zum Ausverkauf von öffentlichen Räumen",
},
{
url: "https://repaircafe-eidelstedt.de/",
image: "/hamburg/2026/repaircafe.svg",
image: "repaircafe.svg",
alt: "Logo vom Repair Café Eidelstedt",
name: "Repair Café Eidelstedt",
info: "Wegwerfen? Denkste! Wir haben die Nachhaltigkeit im Blick.",
},
{
url: "https://www.instagram.com/teeplushamburg/",
image: "/hamburg/2026/teeplus.png",
image: "teeplus.png",
alt: "Logo von Tee& Hamburg",
name: "Tee& Hamburg",
info: "Ein Blick unter die Oberfläche, Tee im Dialog mit Kunst, Kultur und Philosophie. Von Mai bis September im japanischen Teehaus Planten un Blomen",
@ -109,13 +109,17 @@ const partners = [
<div class="bg-base-100">
<div class="container p-8 max-w-2xl mx-auto">
<h2 class="text-4xl text-center font-semibold mb-6">Veranstaltet von</h2>
<h2 class="text-4xl text-center font-semibold">Veranstaltet von</h2>
</div>
</div>
<div class="bg-base-200 pb-20 w-screen overflow-x-hidden">
<div class="mask-[url(/transitions/small.svg)] bg-base-100 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="container p-8 mx-auto">
<div class="grid grid-cols-1 place-content-center place-items-center">
{orgs.map(org => (
<a href={org.url}
class="flex flex-col items-center text-center h-full transition-colors max-w-md hover:bg-white/20 p-4 rounded-xl">
<a href={org.url} class="flex flex-col items-center text-center h-full transition-colors max-w-md hover:bg-white/20 p-4 rounded-xl">
<img alt={org.alt} src={path(import.meta.env.BASE_URL, org.image)}
class="max-w-60 h-20 mb-4 invert"/>
class="max-w-60 h-40 mb-4 invert"/>
<h3 class="font-bold link">{org.name}</h3>
<p>
{org.info}
@ -126,14 +130,18 @@ const partners = [
</div>
</div>
<div class="bg-base-200">
<div class="mask-[url(/transitions/small.svg)] bg-base-100 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="bg-base-100">
<div class="mask-[url(/transitions/small.svg)] bg-base-200 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="container p-8 max-w-2xl mx-auto">
<h2 class="text-4xl text-center font-semibold mb-6">In Zusammenarbeit mit</h2>
<h2 class="text-4xl text-center font-semibold">In Zusammenarbeit mit</h2>
</div>
</div>
<div class="bg-base-200 pb-20 w-screen overflow-x-hidden">
<div class="mask-[url(/transitions/small.svg)] bg-base-100 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="container p-8 mx-auto">
<div class="grid grid-cols-1 place-content-center place-items-center">
{support.map(org => (
<a href={org.url}
class="flex flex-col items-center text-center h-full transition-colors max-w-md hover:bg-white/20 p-4 rounded-xl">
<a href={org.url} class="flex flex-col items-center text-center h-full transition-colors max-w-md hover:bg-white/20 p-4 rounded-xl">
<img alt={org.alt} src={path(import.meta.env.BASE_URL, org.image)}
class="max-w-60 h-40 mb-4 invert"/>
<h3 class="font-bold link">{org.name}</h3>

View file

@ -3,14 +3,6 @@ import Footer from "../components/Footer.astro"
import Layout from "../layouts/Layout.astro"
import {Calendar, ChevronDown} from "@lucide/astro"
import path from "../utils/path.ts"
const events = [
{
name: "DIDAYS 2026 Hamburg",
path: "/hamburg/2026/",
text: "02.-04. Oktober 2026, Kultur Palast Harburg",
},
]
---
<Layout>
@ -24,50 +16,106 @@ const events = [
<div class="bg-base-200 pt-8 pb-16">
<div class="container p-8 max-w-5xl mx-auto flex flex-col md:flex-row gap-10 items-center md:items-start">
<div class="bg-black/20 text-white rounded-2xl min-w-fit p-4 flex flex-col items-center gap-4">
<div class="flex flex-col items-center gap-2">
<span class="text-xl leading-10 text-center font-bold">
02.-04.10.2026
</span>
<span class="text-lg leading-5 text-center">
Freitag 16-21:30 Uhr<br>
Samstag 12-21:30 Uhr<br>
Sonntag 12-17:30 Uhr<br>
</span><br>
<a class="link text-xl" href="https://www.kulturpalast-harburg.com">Kultur Palast Harburg</a><br>
<span class="text-xl">
Eintritt frei
</span>
</div>
<div class="motion-safe:aura motion-safe:aura-rainbow">
<a href={path(import.meta.env.BASE_URL, "didays2026.ics")}
class="btn btn-lg motion-reduce:btn-outline shrink-0"
target="_blank">
<Calendar/>
Im Kalender speichern
</a>
</div>
</div>
<p class="text-xl/8 text-center">
Ein Wochenende digitale Selbstbestimmung: Handy, Tablet und Laptop: längst geht ohne nichts mehr. Und die Apps
sammeln Daten und tun ihr Möglichstes, um uns nicht mehr loszulassen.
In Vorträgen und Workshops erklären wir, wie man einen alternativen Messenger, ein freies Office oder eine
sichere Passwortverwaltung nutzen kann. Und wir informieren über Chancen und Gefahren der digitalen Welt.<br>
Kommt vorbei, lernt etwas und diskutiert mit uns!
In <a class="link" href={path(import.meta.env.BASE_URL, "/hamburg/2026/programm")}>
Vorträgen und Workshops </a> erklären wir, wie man einen alternativen Messenger, ein freies Office oder eine
sichere Passwortverwaltung nutzen kann. Und wir informieren über Chancen und Gefahren der digitalen Welt. Kommt
vorbei, lernt etwas und diskutiert mit uns!
</p>
</div>
</div>
<div class="bg-base-100 pb-20 w-screen overflow-x-hidden">
<div class="mask-[url(/transitions/small.svg)] bg-base-200 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="container p-8 mx-auto text-center text-xl/8">
<h2 class="text-4xl font-semibold mb-8">
Kommende Events
</h2>
<p class="mb-4">
Hier veröffentlichen wir, sobald weitere Events geplant sind.<br>
Schau solange gerne bei dem nächsten DIDay vorbei:
<div class="container p-8 max-w-2xl mx-auto text-center text-xl/8">
<p>
Der <a class="link" href="https://hamburg.ccc.de">CCC Hansestadt Hamburg e.V.</a>
veranstaltet vom 2. bis 4. Oktober zusammen mit der <a class="link" href="https://www.wauland.de">Wau Holland Stiftung</a>,
Hamburger Stadtteilinitiativen,
Maker- und Hackerspaces und weiteren zivilgesellschaftlichen Organisationen aus der Region die ersten Digital
Independence Days in Hamburg.<br><br>
Euch erwartet ein Programm rund um digitale Unabhängigkeit: Messenger,
Office-Programme, Datenschutz oder die eigene Cloud.
</p>
<a href="https://diday.org/de/" class="btn btn-secondary">
diday.org
</a>
<h2 class="text-4xl font-semibold my-8">
Vergangene Events
</h2>
<div class="flex gap-4 overflow-x-auto w-full justify-start py-6">
{events.map(event =>
<a href={path(import.meta.env.BASE_URL, event.path)}
class="card mx-auto shrink-0 w-96 bg-base-100 card-md shadow-lg border-base-200 border-2">
<div class="card-body">
<h2 class="card-title">{event.name}</h2>
<p>{event.text}</p>
<div class="justify-end card-actions">
<button class="btn btn-base-200">Ansehen</button>
</div>
</div>
</a>,
)}
</div>
</div>
</div>
<div class="bg-base-200 pb-20 w-screen overflow-x-hidden">
<div class="mask-[url(/transitions/small.svg)] bg-base-100 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="container p-8 max-w-2xl mx-auto">
<h2 class="text-4xl font-semibold mb-8">
Digitale Unabhängigkeit
</h2>
<p>
Im Dezember 2025 wurde die Initiative Digital Independence Day ins Leben gerufen, um allen Menschen
Möglichkeiten zu zeigen, sich von Big Tech unabhängig zu machen: Bessere Messenger, freie Office-Software,
unabhängige Clouds.<br>
In über 100 Städten in Deutschland und darüber hinaus gibt es regelmäßig zum ersten Sonntag im Monat
Veranstaltungen mit Vorträgen, Workshops und Austauschformaten. Und auf <a
class="link"
href="https://diday.org">
DIDAY.org
</a> gibt es viele Informationen,
wie man selbst den Wechsel zu offeneren Alternativen hinbekommen kann.<br><br>
Das Ziel ist es, mehr Kompetenz und Mündigkeit im Umgang mit moderner Technik zu vermitteln.
</p>
</div>
</div>
<div class="bg-base-100 pb-20">
<div class="mask-[url(/transitions/small.svg)] bg-base-200 h-10 mask-repeat-x mask-[auto_100%]"/>
<div class="container p-8 max-w-2xl mx-auto">
<h2 class="text-4xl font-semibold mb-8">
DIDAYS - Ein Wochenende digitale Selbstbestimmung
</h2>
<p>
Am Wochenende vom 2. bis 4. Oktober gibt es diese und noch mehr Themen kompakt: Vorträge, Workshops und
Austausch
zwischen Interessierten. Neben dem praktischen „Wie“ wollen wir auch über gesellschaftliche und politische
Themen
reden, wie z.B. den Einfluss von Künstlicher Intelligenz oder die Digitalisierung von Stadt und Verwaltung in
Hamburg.
Wir haben dazu den Kultur Palast Harburg (ehem. Rieckhof) als Location gewinnen können. Von Freitagnachmittag
bis
Sonntagnachmittag haben Besucher*innen die Möglichkeit, in Vorträgen und Workshops zu erfahren, wie sie sich
unabhängiger machen können. Natürlich ist der Eintritt frei.
Das Programm ist abgestimmt auf Menschen, die mehr oder minder spontan für ein paar Stunden vorbeikommen und
„mal schauen“ möchten.
</p>
</div>
</div>
<Footer/>
</Layout>

View file

@ -13,8 +13,8 @@
--color-base-content: var(--color-didays-c);
--color-primary: oklch(80% 0.114 19.571);
--color-primary-content: oklch(39% 0.141 25.723);
--color-secondary: var(--color-diday);
--color-secondary-content: #fff;
--color-secondary: oklch(92% 0.084 155.995);
--color-secondary-content: oklch(44% 0.119 151.328);
--color-accent: oklch(68% 0.162 75.834);
--color-accent-content: oklch(41% 0.112 45.904);
--color-neutral: oklch(44% 0.011 73.639);
@ -49,5 +49,4 @@
--color-didays-a: #f8c662;
--color-didays-b: #ffad12;
--color-didays-c: #563b07;
--color-diday: #4338ca;
}