diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml new file mode 100644 index 0000000..dd15bfb --- /dev/null +++ b/.forgejo/workflows/build.yaml @@ -0,0 +1,21 @@ +on: + push: + branches: + - main +jobs: + build: + runs-on: docker + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Podman Login + run: | + echo "${{ secrets.DOCKER_PASSWORD }}" | podman login git.interhacker.space --username "${{ secrets.DOCKER_USERNAME }}" --password-stdin + + - name: Build and Push Container Image + run: | + trap 'rm -f dist.zip' EXIT + wget -q -O dist.zip https://git.interhacker.space/epickiwi/2026.camp.carte/releases/download/latest/dist.zip + podman build -t git.interhacker.space/interhack/camp-website-2026:latest . + podman push git.interhacker.space/interhack/camp-website-2026:latest diff --git a/.gitignore b/.gitignore index b936b79..01550dd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ guide.html +dist.zip diff --git a/Dockerfile b/Dockerfile index 519aff8..c95570d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,19 @@ FROM docker.io/nginx:1.29-alpine -COPY index.html poster.html guide.html /usr/share/nginx/html +RUN apk add --update --no-cache unzip bash pandoc sed + +COPY dist.zip /tmp/dist.zip +RUN unzip -q /tmp/dist.zip -d /tmp/carte +RUN mkdir -p /usr/share/nginx/html/carte +RUN cp -r /tmp/carte/dist/* /usr/share/nginx/html/carte/ +RUN rm -rf /tmp/carte /tmp/dist.zip + +COPY guide.template.html . +COPY update-guide.sh . +RUN bash update-guide.sh + +COPY *.html /usr/share/nginx/html +RUN mv guide.html /usr/share/nginx/html COPY assets /usr/share/nginx/html/assets COPY css /usr/share/nginx/html/css COPY js /usr/share/nginx/html/js diff --git a/README.md b/README.md index 9bd2043..829992a 100644 --- a/README.md +++ b/README.md @@ -40,11 +40,13 @@ First, login to the Docker registry: docker login git.interhacker.space ``` -Then, build and push to the registry: +Then, download the map bundle, build and push to the registry: ```bash +wget -q -O dist.zip https://git.interhacker.space/epickiwi/2026.camp.carte/releases/download/latest/dist.zip docker build -t git.interhacker.space/interhack/camp-website-2026:latest . docker push git.interhacker.space/interhack/camp-website-2026:latest +rm -f dist.zip ``` The pull process is triggered every five minutes. diff --git a/assets/Thunometre-participanxes.pdf b/assets/Thunometre-participanxes.pdf new file mode 100755 index 0000000..2ff81bc Binary files /dev/null and b/assets/Thunometre-participanxes.pdf differ diff --git a/assets/camp-interhack.ics b/assets/camp-interhack.ics new file mode 100644 index 0000000..d995765 --- /dev/null +++ b/assets/camp-interhack.ics @@ -0,0 +1,39 @@ +BEGIN:VCALENDAR +X-LOTUS-CHARSET:UTF-8 +VERSION:2.0 +PRODID:ZMS-Berlin +BEGIN:VTIMEZONE +TZID:Europe/Berlin +X-LIC-LOCATION:Europe/Berlin +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +TZNAME:CEST +DTSTART:19700329T020000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +TZNAME:CET +DTSTART:19701025T030000 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 +END:STANDARD +END:VTIMEZONE +METHOD:REQUEST +BEGIN:VEVENT +UID:ics.terminsysteme.de1769434840 +DTSTAMP:20260126T144040 +CLASS:PUBLIC +DTSTART;TZID=Europe/Berlin:20260702T100000 +DTEND;TZID=Europe/Berlin:20260705T230000 +LOCATION:15 route de Saint Dolay 44530 Sévérac | 47.5437595, -2.0916116 +SUMMARY:Camp Interhack +DESCRIPTION: Le Camp Interhack 2026 est un événement festif de hacking ! Le hack c’est le détournement des machines, des pratiques et des systèmes (au sens large) qui nous entourent. De la musique à la couture en passant par l’informatique et l’éléctronique mais aussi les structure sociales, les institutions et les organisations politiques, venez hacker le monde avec nous. https://camp.interhacker.space \n\n +BEGIN:VALARM +ACTION:DISPLAY +TRIGGER:-PT1440M +DESCRIPTION:Erinnerung +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/assets/logos/fdn.png b/assets/logos/fdn.png new file mode 100644 index 0000000..a1df2c2 Binary files /dev/null and b/assets/logos/fdn.png differ diff --git a/assets/pause-solid-full.svg b/assets/pause-solid-full.svg new file mode 100644 index 0000000..a45f416 --- /dev/null +++ b/assets/pause-solid-full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/play-solid-full.svg b/assets/play-solid-full.svg new file mode 100644 index 0000000..460cdbb --- /dev/null +++ b/assets/play-solid-full.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/reglement-charte.pdf b/assets/reglement-charte.pdf new file mode 100755 index 0000000..ceb24d5 Binary files /dev/null and b/assets/reglement-charte.pdf differ diff --git a/contact.html b/contact.html new file mode 100644 index 0000000..4711ae8 --- /dev/null +++ b/contact.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + Camp Interhack 2026 – Contact + + + + + +
+ + + + +

+ camp +
+ interhack + contact +

+

+

+
+
+

Mail :

+ orga@camp.interhacker.space +
+
+

Matrix :

+ #camp-space:matrix.interhacker.space +
+
+
+ + + + \ No newline at end of file diff --git a/css/base.css b/css/base.css index 0a16d2d..add29bc 100644 --- a/css/base.css +++ b/css/base.css @@ -33,7 +33,11 @@ img { } a { - color: var(--accent-yellow); + color: inherit; +} + +nav a, footer a { + color: black; text-decoration: none; } @@ -43,6 +47,11 @@ main h1, main h2, main h3 { z-index: 20; } +main h1 span, main h2 span, main h3 { + background-color: #000000b8; + padding: auto; +} + main h1 { position: relative; text-align: center; @@ -55,30 +64,44 @@ main h1 { main h2 { position: relative; - margin: 4% auto; + margin: 12% auto 5% auto; text-align: center; - font-size: clamp(1.5em, 4vw, 3em); + font-size: clamp(1.5em, 12vw, 4em); font-family: segoesc; } +main h2:first-of-type { + font-size: clamp(1.5em, 5vw, 5em); + margin: 1em auto 0.5em auto; +} + main h3 { position: relative; - text-align: center; margin: auto; width: 100%; - font-size: clamp(2em, 4vw, 4em); + font-size: clamp(1.8em, 3vw, 4em); margin-top: 5%; + margin-bottom: 2%; + font-weight: lighter; + text-align: center; +} + +main section h3 { + text-align: center; +} + +main h4 { + margin: 0.8em 0; } main p { - margin: 1%; - padding: 1%; - /* border: solid 1px; */ - opacity: 0.90; + margin: 0 0 min(1em, 2%) 1%; display: inline-block; z-index: 3; - background-color: black; +} +main p:last-child { + margin-bottom: 0; } section { @@ -89,9 +112,14 @@ section { margin: auto; margin-bottom: 100px; padding: 2%; - padding-left: 0px; + padding-left: min(1em, 2%); z-index: 1000; box-shadow: -5px 5px 0px var(--accent-yellow), -10px 10px 0px var(--accent-orange), -15px 15px 0px var(--accent-violet); + background-color: #000000b8; +} + +section :is(h1, h2, h3, h4, h5, h6) { + line-height: 1em; } nav, footer, aside { @@ -139,27 +167,76 @@ main > img { object-fit: scale-down; } +figcaption { + font-size: 0.6em; + line-height: initial; +} + .btn-nice { color: #FFFFFF; - text-shadow: -5px 5px 0px var(--accent-orange), -10px 10px 0px var(--accent-violet); + text-shadow: -2px 2px 0px var(--accent-orange), -4px 4px 0px var(--accent-violet); color: var(--accent-yellow); font-size: 1.2em; text-align: center; margin: auto; position: relative; display: block; + font-weight: bold; } #camp { font-family: segoesc; float: left; margin-left: 10%; - line-height: 0.8em; } #interhack { text-shadow: -5px 5px 0px var(--accent-orange), -10px 10px 0px var(--accent-violet); color: var(--accent-yellow); margin-right: 10%; - line-height: 0.5em; +} + +#progress { + display: block; + text-align: center; +} + +#gauge-bar { + float: left; +} + +#fundraising-bar { + float: left; +} + +code { + background: #ffffff1f; + padding: 0.2em 0.4em; + border-radius: 0.2em; + margin-right: 0.5ex; +} + +.btn-nice code { + background: none; + padding: 0; + margin-right: 0; +} + +div#maj-guide { + text-align: center; + margin: 2em 1em; +} + +.center { + display: flex; + justify-content: center; + align-items: center; +} + + +@media (max-width: 500px) { + /* Hide stickers on mobile */ + .randomStart { + display: none; + } } diff --git a/css/contact.css b/css/contact.css new file mode 100644 index 0000000..f6c09b8 --- /dev/null +++ b/css/contact.css @@ -0,0 +1,15 @@ +#contact { + display: flex; + align-items: last baseline; + gap: 2em; + justify-content: space-between; +} + +h1 span:nth-of-type(n+3) { + position: relative; + text-align: center; + font-size: clamp(1.5rem, 5vw, 5rem); + font-family: segoesc; + display: block; + margin: 1em auto 0.5em auto; +} \ No newline at end of file diff --git a/css/home.css b/css/home.css index f637eb9..d6b71ec 100644 --- a/css/home.css +++ b/css/home.css @@ -10,9 +10,173 @@ position: relative; } +/* Section des participants */ + .participants { display: flex; justify-content: center; align-items: center; height: 200px; +} + +#participe > div.txt { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-evenly; +} + +#participe p { + text-align: center; +} + + +/* Section des dons */ + +#don > div { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-evenly; +} + +#don button { + flex-grow: 1; + width: 3em; + color: white; + font-size: 2em; + border: none; + font-family: MonTrappist; + margin: 0.2em; + padding: 0.3em; + background: var(--primary-bg-color); + background: linear-gradient(0deg,rgba(136, 0, 255, 1) 0%, rgba(255, 191, 62, 1) 50%, rgba(255, 78, 0, 1) 100%); + box-shadow: -5px 5px 0px var(--accent-yellow), -10px 10px 0px var(--accent-orange), -15px 15px 0px var(--accent-violet); + cursor: pointer; +} + +#don > hr { + margin-top: 1em; +} + +#don p { + text-align: justify; + text-align: center; +} + +@keyframes bang { + from { + transform: translate3d(0,0,0); + opacity: 1; + } +} + +.btn-pop i { + /* position: ; */ + display:run-in; + left: 0px; + top: 0px; + width: 1px; + height: 1px; + background: red; + opacity: 0; +} + +/* Barre de progression */ + +.progression { +animation: 3s loadbar; +width:auto; +background-color: white; +display: inline-block; +padding: 0.7em 0.5em 0.5em 0.5em; +text-wrap: nowrap; +} + +@keyframes loadbar { + 0% { width:0%; } +} + +.bar { +width : 50%; +margin : auto; +border : 2px solid white; +display: inline-block; +} +.progression > span { + +display: inline-block; +width: 100%; +font-family: MonTrappist; +font-size : 1.5em; +} + +.lessthanhalf span { + padding-left: 100%; + color: white; + padding-left: calc(100% + 1em); +} + +.morethanhalf { + text-align : end; + background: linear-gradient(90deg,rgba(136, 0, 255, 1) 0%, rgba(255, 78, 0, 1) 42%, rgba(255, 191, 62, 1) 100%); +} + +.stamp { + overflow: hidden; + position: initial; + top: 100px; + right: 300px; + padding: 10px 20px; + background-color: rgba(255, 0, 0, 0.4); + border: 2px dashed rgba(255, 0, 0, 0.8); + border-radius: 2px; + transform: rotate(10deg); + font-family: 'Courier New', Courier, monospace; + font-size: 1em; + font-weight: bold; + color: rgba(255, 0, 0, 0.9); + text-transform: uppercase; + z-index: 10; + text-shadow: 2px 2px 0px rgba(0, 0, 0, 0.8); + opacity: 1; + transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); + + background-image: linear-gradient( + 135deg, + rgba(128, 0, 0, 0.1) 25%, + rgba(128, 0, 0, 0.4) 50%, + rgba(128, 0, 0, 0.1) 75% + ); + background-size: 200% 200%; + animation: scan 3s ease infinite; +} + +@keyframes scan { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +/* Radio Interhack */ + +#radio-player { + float: left; + z-index: 100000; + background-color: aqua; + height: 1em; + width: 1em; + position: absolute; + bottom: 1em; + right: 1em; + position: fixed; + border-radius: 10%; +} + +#radio-button { + background: none; + display: flex; + justify-content: center; + align-items: center; + border: none; } \ No newline at end of file diff --git a/guide.template.html b/guide.template.html index f5a33db..f9c73ec 100644 --- a/guide.template.html +++ b/guide.template.html @@ -22,24 +22,27 @@ BISOUS
- - - - + + + + - - - - + + + + - - - - + + + +

camp @@ -55,6 +58,10 @@ BISOUS + +
+ Dernière mise à jour du guide: +

diff --git a/index.html b/index.html index 37e334b..c96aa04 100644 --- a/index.html +++ b/index.html @@ -1,4 +1,5 @@ - + + @@ -7,6 +8,9 @@ + + + Camp Interhack @@ -15,24 +19,22 @@
- - - - + + + + - - - - - - - - - + + + +

camp @@ -83,33 +85,131 @@ collective.
Seule exigence, respecter toutes les marginalités, originalités, bizarreries et normaleries de chacun·es.

+ +

+ 📅 Ajouter l'évènement à son calendrier (.ics) +

+ + + +
+

+ Où en est-on ? +
COMPLET
+

+ + +
+

+ C'est complet ! +
+ Nous avons reçu en amont

+
+ + + ? % + + +
+

des dons dont nous avons besoin.

+ +

+ Merci !! +
+ Et nous comptons sur vous pour continuer à vous mobiliser avant et durant le camp, pour que l'on puisse atteindre les 100% ! +

-

- Iels y participent -

-
- - - - - - - + +
+

+ Faire un don +

+

Nous avons besoin de sous avant le débût du Camp pour financer l'achat de fournitures, payer la réservation du lieu et monter la logistique.

+
+ + + + + + + + + + + + +
-
- - - +
+
+

Si vous préférez faire un virement, demandez-nous l'IBAN sur orga [arobase] camp.interhacker.space. Nous payons autour de ~2% de frais lors des paiements par carte bancaire.

+
+
+
+

Nous estimons avoir un budget de ~ 15 000€ et être autour de 200 personnes, et aurons donc besoin d'au moins autant pour que le camp soit à l'équilibre.

+ Voir le détail des comptes +
+ +
-
+
+

+ Iels y participent +

+ +
+ + + + + + + +
+ +
+ + + + +
+ +
+

et bien d'autres !
Rejoignez le canal Matrix sur #interhack:matrix.interhacker.space

+
+
+ +
+ + + play button + +
+ diff --git a/js/pop.js b/js/pop.js new file mode 100644 index 0000000..345b250 --- /dev/null +++ b/js/pop.js @@ -0,0 +1,31 @@ +document.querySelectorAll('button').forEach(function(button) { + button.addEventListener('mouseenter', function() { + function random(max) { + return Math.random() * (max - 0) + 0; + } + + var c = document.createDocumentFragment(); + for (var i = 0; i < 100; i++) { + var styles = 'position: absolute;' + + 'left: ' + (random(100)) + '30%;' + // Limit the position to within the button + 'top: ' + (random(60)) + '30%;' + // Limit the position to within the button + 'width: 3px; height: 6px; ' + // Increase size + 'transform: translate(-50%, -50%) rotate(' + random(360) + 'deg);' + + 'background: hsla(' + random(360) + ', 100%, 50%, 1);' + + 'animation: bang 2000ms ease-out forwards;' + + 'opacity: 0;' + + 'z-index: 10;'; // Set a high z-index + + var e = document.createElement("i"); + e.style.cssText = styles; + c.appendChild(e); + } + button.appendChild(c); + setTimeout(() => { + // Create an array of the elements to remove + let childrenToRemove = Array.from(button.querySelectorAll('i')); + // Remove each element + childrenToRemove.forEach(child => button.removeChild(child)); + }, 3000); + }); +}); diff --git a/js/progress.js b/js/progress.js new file mode 100644 index 0000000..fe05cd7 --- /dev/null +++ b/js/progress.js @@ -0,0 +1,91 @@ +const gauge_url = "https://api.camp.interhacker.space/api/gauge" +const fundraising_url = "https://api.camp.interhacker.space/api/fundraising" +const gaugeMax = 200; +const fundraisingTotalMax = 13355.82; + +async function getGauge() { + // // REMOVE WHEN SIGNUP FORM IS OPEN + // return 0; + + try { + const response = await fetch(gauge_url); + if (!response.ok) { + throw new Error(`Response status: ${response.status}`); + } + + const result = await response.json(); + + return result.gauge + } catch (error) { + console.error(error.message); + + return null; + } +} + +async function getFundraisingTotal() { + try { + const response = await fetch(fundraising_url); + if (!response.ok) { + throw new Error(`Response status: ${response.status}`); + } + + const result = await response.json(); + + return result.total + } catch (error) { + console.error(error.message); + + return null; + } +} + +function percentRatio(ratio) { + return Math.floor(ratio * 100); +} + +function setAboveHalf(ratio, element) { + if (ratio > 0.5) { + element.classList.remove("lessthanhalf"); + element.classList.add("morethanhalf"); + } +} + +async function setGauge() { + const gauge = await getGauge(); + + if (gauge !== null) { + const gaugeBar = document.getElementById("gauge-bar"); + const gaugeText = document.getElementById("gauge-text"); + + const gaugeRatio = gauge / gaugeMax; + + gaugeBar.style.setProperty("width", percentRatio(gaugeRatio) + "%"); + gaugeText.innerText = gauge + " / " + gaugeMax; + + setAboveHalf(gaugeRatio, gaugeBar); + } +} + +async function setFundraisingTotal() { + const fundraising_total = await getFundraisingTotal(); + + if (fundraising_total !== null) { + const fundraisingBar = document.getElementById("fundraising-bar"); + const fundraisingText = document.getElementById("fundraising-text"); + + const fundraisingRatio = fundraising_total / fundraisingTotalMax; + + fundraisingBar.style.setProperty("width", percentRatio(fundraisingRatio) + "%"); + fundraisingText.innerText = percentRatio(fundraisingRatio) + " %"; + + setAboveHalf(fundraisingRatio, fundraisingBar); + } +} + +async function setProgress() { + setGauge(); + setFundraisingTotal(); +} + +document.addEventListener("DOMContentLoaded", setProgress); diff --git a/js/radio.js b/js/radio.js new file mode 100644 index 0000000..e503230 --- /dev/null +++ b/js/radio.js @@ -0,0 +1,23 @@ +// Code Javascript pour la radio du Camp Interhack +// Hébergé par P-Node +// Propulsé par le Radio Operation Center +// En live depuis l'Antenne + +const radioPlayer = document.getElementById("radio-player"); +const audio = document.querySelector('audio'); +const radioButton = document.getElementById("radio-button"); + +let state = "paused" // Can be : "playing" or "paused" + +radioPlayer.addEventListener('click', () => { + if(state == "paused"){ + state = "playing"; + audio.play(); + radioButton.innerHTML = 'pause button'; + + } else { + state = "paused" + audio.pause(); + radioButton.innerHTML = 'play button'; + } +}); \ No newline at end of file diff --git a/manual-ci.sh b/manual-ci.sh new file mode 100755 index 0000000..bc0fb30 --- /dev/null +++ b/manual-ci.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +set -euo pipefail + +IMAGE="git.interhacker.space/interhack/camp-website-2026:latest" +REGISTRY="git.interhacker.space" + +need_cmd() { + command -v "$1" >/dev/null 2>&1 || { + echo "Missing required command: $1" >&2 + exit 1 + } +} + +need_cmd bash +need_cmd wget +need_cmd pandoc +need_cmd docker + +if [[ ! -x ./update-guide.sh ]]; then + echo "Missing or non-executable ./update-guide.sh" >&2 + exit 1 +fi + +echo "==> Generating guide.html" +bash ./update-guide.sh + +trap 'rm -f dist.zip' EXIT + +echo "==> Downloading map bundle" +wget -q -O dist.zip https://git.interhacker.space/epickiwi/2026.camp.carte/releases/download/latest/dist.zip + +echo "==> Logging in to ${REGISTRY}" +if [[ -n "${DOCKER_USERNAME:-}" && -n "${DOCKER_PASSWORD:-}" ]]; then + printf '%s' "$DOCKER_PASSWORD" | docker login "$REGISTRY" --username "$DOCKER_USERNAME" --password-stdin +else + docker login "$REGISTRY" +fi + +echo "==> Building image: ${IMAGE}" +docker build --no-cache -t "$IMAGE" . + +echo "==> Pushing image: ${IMAGE}" +docker push "$IMAGE" + +rm -f dist.zip + +echo "Done." diff --git a/poster.html b/poster.html index 1217a80..1a5ccb5 100644 --- a/poster.html +++ b/poster.html @@ -1,4 +1,5 @@ - + + @@ -14,8 +15,11 @@ diff --git a/programme.html b/programme.html new file mode 100644 index 0000000..d93a568 --- /dev/null +++ b/programme.html @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + Camp Interhack + + + + +
+ + + + + + + + + + + +

+ camp +
+ interhack +

+ +

+ Le Programme +

+ +
+

Demandez le programme !

+

+ Vous pouvez voir le programme sur le Pretalx. +

+ + +

+

+ Le Programme +

+

+ +
+ +
+

Soyez le programme !

+

Vous pouvez proposer ce que vous souhaitez pendant le Camp Interhack ! Que ce soit un atelier, une conférence, une rencontre ou une oeuvre d'art, toute proposition est bonne à entendre.

+ +

+

+ Ajouter une proposition +

+

+ +

Si jamais ce n'ai pas encore fait, n'oubliez pas de vous inscrire.

+
+ +
+

Réalisez le programme !

+

Vous pouvez nous aider à préparer le programme en analysant les propositions, ajuster l'agenda, contacter les intervenant·es et bien d'autre encore, en rejoignant la commission [m] Programme et éditorialisation

+
+ +
+ + + + diff --git a/update-guide.sh b/update-guide.sh index f1c4990..0bdd1bb 100755 --- a/update-guide.sh +++ b/update-guide.sh @@ -8,7 +8,7 @@ echo "Mise a jour du guide dans guide.html a partir du edgedoc" echo "$GUIDE_EDGEDOC_URL" set -e -curl --silent --fail-with-body "$GUIDE_EDGEDOC_URL/download" > guide.tmp.md +curl --silent --fail "$GUIDE_EDGEDOC_URL/download" > guide.tmp.md pandoc --from markdown --to html guide.tmp.md > guide.tmp.html cat guide.template.html \ | sed '/EDGEDOC/{