diff --git a/assets/images/blog/cicd-devx/tk-blogpost-cicd-devx-3000x2000.png b/assets/images/blog/cicd-devx/tk-blogpost-cicd-devx-3000x2000.png new file mode 100644 index 00000000..0120b0bf Binary files /dev/null and b/assets/images/blog/cicd-devx/tk-blogpost-cicd-devx-3000x2000.png differ diff --git a/assets/images/blog/openshift-virtualization/tk-blogpost-ocp-virtualization-some.jpg b/assets/images/blog/openshift-virtualization/tk-blogpost-ocp-virtualization-some.jpg new file mode 100644 index 00000000..12e17259 Binary files /dev/null and b/assets/images/blog/openshift-virtualization/tk-blogpost-ocp-virtualization-some.jpg differ diff --git a/assets/images/blog/openshift-virtualization/tk-blogpost-ocp-virtualization.jpg b/assets/images/blog/openshift-virtualization/tk-blogpost-ocp-virtualization.jpg new file mode 100644 index 00000000..b3fd0d98 Binary files /dev/null and b/assets/images/blog/openshift-virtualization/tk-blogpost-ocp-virtualization.jpg differ diff --git a/assets/images/blog/review24/tk-blogpost-review-1200x630.jpg b/assets/images/blog/review24/tk-blogpost-review-1200x630.jpg new file mode 100644 index 00000000..cfdd553d Binary files /dev/null and b/assets/images/blog/review24/tk-blogpost-review-1200x630.jpg differ diff --git a/assets/images/blog/review24/tk-blogpost-review-1500x1000.jpg b/assets/images/blog/review24/tk-blogpost-review-1500x1000.jpg new file mode 100644 index 00000000..1cf7c4d7 Binary files /dev/null and b/assets/images/blog/review24/tk-blogpost-review-1500x1000.jpg differ diff --git a/assets/images/blog/unsere-werte/tk-blogpost-werte-some.png b/assets/images/blog/unsere-werte/tk-blogpost-werte-some.png new file mode 100644 index 00000000..7bce006d Binary files /dev/null and b/assets/images/blog/unsere-werte/tk-blogpost-werte-some.png differ diff --git a/assets/images/blog/unsere-werte/tk-blogpost-werte.jpg b/assets/images/blog/unsere-werte/tk-blogpost-werte.jpg new file mode 100644 index 00000000..036e9aef Binary files /dev/null and b/assets/images/blog/unsere-werte/tk-blogpost-werte.jpg differ diff --git a/assets/images/blog/unsere-werte/unsere-werte.jpg b/assets/images/blog/unsere-werte/unsere-werte.jpg new file mode 100644 index 00000000..d429efc8 Binary files /dev/null and b/assets/images/blog/unsere-werte/unsere-werte.jpg differ diff --git a/assets/images/landing-pages/ocpv-accelerator/de-accelerator-discovery.svg b/assets/images/landing-pages/ocpv-accelerator/de-accelerator-discovery.svg new file mode 100644 index 00000000..7988c0d8 --- /dev/null +++ b/assets/images/landing-pages/ocpv-accelerator/de-accelerator-discovery.svg @@ -0,0 +1 @@ + diff --git a/assets/images/landing-pages/ocpv-accelerator/de-accelerator-enablement.svg b/assets/images/landing-pages/ocpv-accelerator/de-accelerator-enablement.svg new file mode 100644 index 00000000..67ca67f4 --- /dev/null +++ b/assets/images/landing-pages/ocpv-accelerator/de-accelerator-enablement.svg @@ -0,0 +1 @@ + diff --git a/assets/images/landing-pages/ocpv-accelerator/de-accelerator-migration.svg b/assets/images/landing-pages/ocpv-accelerator/de-accelerator-migration.svg new file mode 100644 index 00000000..2125e8a6 --- /dev/null +++ b/assets/images/landing-pages/ocpv-accelerator/de-accelerator-migration.svg @@ -0,0 +1 @@ + diff --git a/assets/images/landing-pages/ocpv-accelerator/en-accelerator-discovery.svg b/assets/images/landing-pages/ocpv-accelerator/en-accelerator-discovery.svg new file mode 100644 index 00000000..67e6de5c --- /dev/null +++ b/assets/images/landing-pages/ocpv-accelerator/en-accelerator-discovery.svg @@ -0,0 +1 @@ + diff --git a/assets/images/landing-pages/ocpv-accelerator/en-accelerator-enablement.svg b/assets/images/landing-pages/ocpv-accelerator/en-accelerator-enablement.svg new file mode 100644 index 00000000..efc51149 --- /dev/null +++ b/assets/images/landing-pages/ocpv-accelerator/en-accelerator-enablement.svg @@ -0,0 +1 @@ + diff --git a/assets/images/landing-pages/ocpv-accelerator/en-accelerator-migration.svg b/assets/images/landing-pages/ocpv-accelerator/en-accelerator-migration.svg new file mode 100644 index 00000000..d43656d5 --- /dev/null +++ b/assets/images/landing-pages/ocpv-accelerator/en-accelerator-migration.svg @@ -0,0 +1 @@ + diff --git a/assets/images/landing-pages/tk-landingpage-kubetrain-1200x630.png b/assets/images/landing-pages/tk-landingpage-kubetrain-1200x630.png new file mode 100755 index 00000000..91766654 Binary files /dev/null and b/assets/images/landing-pages/tk-landingpage-kubetrain-1200x630.png differ diff --git a/assets/images/landing-pages/tk-landingpage-kubetrain-1500x600.png b/assets/images/landing-pages/tk-landingpage-kubetrain-1500x600.png new file mode 100755 index 00000000..782f13fe Binary files /dev/null and b/assets/images/landing-pages/tk-landingpage-kubetrain-1500x600.png differ diff --git a/assets/images/landing-pages/tk-puzzle-lunchbag-post-1500x1000.png b/assets/images/landing-pages/tk-puzzle-lunchbag-post-1500x1000.png new file mode 100755 index 00000000..5297fa0f Binary files /dev/null and b/assets/images/landing-pages/tk-puzzle-lunchbag-post-1500x1000.png differ diff --git a/assets/images/partner/puzzle_itc.png b/assets/images/partner/puzzle_itc.png new file mode 100755 index 00000000..1ecaa169 Binary files /dev/null and b/assets/images/partner/puzzle_itc.png differ diff --git a/assets/scss/layouts/_forms.scss b/assets/scss/layouts/_forms.scss index 164492df..e36278d9 100644 --- a/assets/scss/layouts/_forms.scss +++ b/assets/scss/layouts/_forms.scss @@ -27,6 +27,10 @@ } } +option { + color: initial; +} + label { font-size: 1.6rem; line-height: 1.5; diff --git a/config/postcss.config.js b/config/postcss.config.js index d5024e93..06d998b8 100644 --- a/config/postcss.config.js +++ b/config/postcss.config.js @@ -37,6 +37,9 @@ module.exports = { 'btn', 'btn-primary', 'jobs', + 'page-item', + 'page-link', + 'option', ...whitelister([ './assets/scss/components/_alerts.scss', // './assets/scss/components/_buttons.scss', diff --git a/content/de/blog/2024-kubevirt-introduction.md b/content/de/blog/2024-kubevirt-introduction.md index 435ee287..7cbecc07 100644 --- a/content/de/blog/2024-kubevirt-introduction.md +++ b/content/de/blog/2024-kubevirt-introduction.md @@ -10,6 +10,8 @@ img_border: true Sitemap: Priority: 0.9 +additionalblogposts: [ 'kubevirt-training', 'kubevirt-usecases'] + categories: ["Technologie", "KubeVirt", "Kubernetes"] authors: ['christof-luethi'] post_img: "images/blog/kubevirt/tk-blogpost-kubevirt.jpg" @@ -138,7 +140,9 @@ starker Partner für Enterprise-Kunden zur Verfügung. Gerne stehen wir für Fragen zur Verfügung. Du erreichst uns am besten unter [hallo@tim-koko.ch](mailto:hallo@tim-koko.ch) oder auf [LinkedIn](https://www.linkedin.com/company/tim-koko). -Zudem werden wir an den folgenden Meetups unsere Erfahrungen mit der Community teilen: +Weiter bieten wir dir die folgenden Möglichkeiten, dich vertieft mit dem Thema KubeVirt oder OpenShift Virtualization auseinander zu setzen: -- 19.11.2024 - 17:00: [Cloud Native Bern Meetup](https://www.meetup.com/cloudnativebern/events/299829917/) in Bern -- 28.11.2024 - 16:00: [Cloud Native Switzerland Meetup](https://www.meetup.com/cloud-native-computing-switzerland/events/302784454) in Luzern +- [tim&koko labs](https://tim-koko.ch/labs/): An einem Nachmittag die Grundlagen von KubeVirt kennenlernen und in praktischen hands-on labs direkt anwenden. +- [KubeVirt Basics Training](https://acend.ch/trainings/kubevirt/): Zweitägiges abwechslungsreiches Training mit Präsentationen und hands-on labs. +- [OpenShift Virtualization Accelerator Package](https://tim-koko.ch/services/openshift-virtualization-accelerator/): Wir helfen dir, die Möglichkeiten von OpenShift Virtualization zu erkunden und herauszufinden, wie hoch das Potenzial für eine neue oder parallele Strategie sein + könnte. diff --git a/content/de/blog/2024-kubevirt-training.md b/content/de/blog/2024-kubevirt-training.md index f413a406..d05cbe8f 100644 --- a/content/de/blog/2024-kubevirt-training.md +++ b/content/de/blog/2024-kubevirt-training.md @@ -10,6 +10,9 @@ img_border: false Sitemap: Priority: 0.9 + +additionalblogposts: [ 'kubevirt-introduction', 'kubevirt-usecases'] + categories: ["Technologie", "KubeVirt", "Kubernetes"] authors: ['thomas-philipona'] post_img: "images/blog/kubevirt-training/kubevirt-training-blogpost-1500x1000.png" @@ -71,7 +74,9 @@ Die Teilnehmenden benötigen einen Laptop mit direktem Zugang zum Internet. Gerne stehen wir für Fragen zur Verfügung. Du erreichst uns am besten unter [hallo@tim-koko.ch](mailto:hallo@tim-koko.ch) oder auf [LinkedIn](https://www.linkedin.com/company/tim-koko). Die genauen Konditionen zum Training findest Du auf der [Website von acend](https://acend.ch/trainings/kubevirt/). -Zudem werden wir an den folgenden Meetups unsere Erfahrungen mit der Community teilen: +Weiter bieten wir dir die folgenden Möglichkeiten, dich vertieft mit dem Thema KubeVirt oder OpenShift Virtualization auseinander zu setzen: -* 19.11.2024 - 17:00: [Cloud Native Bern Meetup](https://www.meetup.com/cloudnativebern/events/299829917/) in Bern -* 28.11.2024 - 16:00: [Cloud Native Switzerland Meetup](https://www.meetup.com/cloud-native-computing-switzerland/events/302784454) in Luzern +* [tim&koko labs](https://tim-koko.ch/labs/): An einem Nachmittag die Grundlagen von KubeVirt kennenlernen und in praktischen hands-on labs direkt anwenden. +* [KubeVirt Basics Training](https://acend.ch/trainings/kubevirt/): Zweitägiges abwechslungsreiches Training mit Präsentationen und hands-on labs. +* [OpenShift Virtualization Accelerator Package](https://tim-koko.ch/services/openshift-virtualization-accelerator/): Wir helfen dir, die Möglichkeiten von OpenShift Virtualization zu erkunden und herauszufinden, wie hoch das Potenzial für eine neue oder parallele Strategie sein + könnte. diff --git a/content/de/blog/2024-kubevirt-usecases.md b/content/de/blog/2024-kubevirt-usecases.md new file mode 100644 index 00000000..24900d68 --- /dev/null +++ b/content/de/blog/2024-kubevirt-usecases.md @@ -0,0 +1,147 @@ +--- +title: "KubeVirt Journey - Potenzial und Einsatzgebiete von KubeVirt" +slug: "kubevirt-usecases" +description: "" +date: 2024-11-21T00:00:00+00:00 +lastmod: 2024-11-21T00:00:00+00:00 +draft: false +images: ["images/blog/kubevirt/tk-blogpost-kubevirt_share-image.jpg"] +img_border: true +Sitemap: +Priority: 0.9 + +additionalblogposts: [ 'kubevirt-introduction', 'kubevirt-training'] + +categories: ["Technologie", "KubeVirt", "Kubernetes"] +authors: ['christof-luethi'] +post_img: "images/blog/kubevirt/tk-blogpost-kubevirt.jpg" +lead: "Der Einsatz von virtuellen Maschinen ist heutzutage nicht mehr wegzudenken. Neben dem Ersatz von bestehenden Virtualisierungslösungen bietet KubeVirt das Potenzial um Infrastrukturen und Workflows zu modernisieren." +--- + +Im zweiten Blogpost unserer KubeVirt-Serie (Teil 1: [KubeVirt Journey - Einführung in die Verwaltung von virtuellen Maschinen in Kubernetes]({{< ref "blog/2024-kubevirt-introduction" >}})) schauen wir uns die Einsatztgebiete von KubeVirt an. Die Technologie hat sich zum Ziel gesetzt, die Verwendung von virtuelle Maschinen +mit modernen Patterns neu zu definieren. Wir bei Tim&Koko sind überzeugt, dass der Cloud-Native-Ansatz von KubeVirt der +richtige Weg ist, um Infrastrukturen, Workloads und Workflows von traditionellen virtuellen Maschinen zu modernisieren. + +Nun schauen wir uns das Potenzial von KubeVirt anhand einiger Einsatzgebiete etwas genauer an. + +### Vereinheitlichung und Modernisierung der Infrastruktur + +Oft werden technologisch komplett unterschiedliche Infrastrukturen für virtuelle Maschinen sowie Container-Workload +aufgebaut und betrieben. + +{{< svg "assets/images/blog/kubevirt/infrastructure-convergence.svg" >}} +

+ +Durch die Verwendung von Kubernetes als Grundlage für VM- und Container-Workload kann das Tooling rund um die Infrastruktur +vereinheitlicht werden. So können zum Beispiel Log-, Monitoring- und Storage-Systeme sowie Netzwerke zusammengeführt +werden. Der Betrieb der zwei Infrastruktur-Stacks und dessen Ökosysteme entfällt somit. Dies hat den Vorteil, dass sich +die Infrastruktur vereinfacht und durch die Konsolidierung können Betriebskosten eingespart werden. Gleichzeitig erhöhen +Container-Plattformen die Flexibilität und Portabilität der Workload und ermöglichen es somit, schneller auf Veränderungen +zu reagieren. + +### Vereinheitlichung des Workflows + +Nicht weniger zentral als die Vereinheitlichung von Infrastruktur und Hardware-Komponenten ist der Einfluss auf der +Workflow-Ebene. Bekannte Tools und Workflows aus der Container-Welt können identisch auf virtuelle Maschinen angewandt +werden. Das Definieren und Verwalten von virtuellen Maschinen ist deklarativ möglich und Infrastrukturen können so +komplett als YAML-Ressourcen beschrieben und versioniert werden. + +```yaml +apiVersion: kubevirt.io/v1 +kind: VirtualMachine +metadata: + name: fedora-vm +spec: + running: true + template: + metadata: + labels: + kubevirt.io/domain: fedora-vm + spec: + domain: + devices: + disks: + - name: fedora-disk + disk: + bus: virtio + interfaces: + - name: default + masquerade: {} + resources: + requests: + memory: 1Gi + networks: + - name: default + pod: {} + volumes: + - name: fedora-disk + containerDisk: + image: quay.io/containerdisks/fedora:40 +``` + +Einer der grössten Vorteile der deklarativen Beschreibung und der Versionierung ist die Reproduzierbarkeit von Umgebungen. +Änderungen können so konsistent und nachvollziehbar umgesetzt werden. Durch die Einbindung in automatisierte Prozesse +wie CI/CD-Pipelines können Änderungen automatisch getestet werden, was im Endeffekt die Verlässlichkeit bei der +Bereitstellung und Wartung von Systemen erhöht. Die Automatisierung kann ebenfalls dazu verwendet werden, um +betriebsinterne Prozesse, manuelle Schritte und Abhängigkeiten zu reduzieren, was zu einer schnelleren Bereitstellung +der Ressourcen führt. + +### Application Migration + +Werden Monolithen in VMs in Container-Architekturen überführt, ist während der Migration oft ein +Parallelbetrieb nötig. Durch den Betrieb des Monolithen als KubeVirt-VM kann bereits während der Transition eine +einheitliche Infrastruktur verwendet werden. Dies kann für eine kostengünstigere und ressourcenschonendere Umsetzung +der Migration sorgen. + +{{< svg "assets/images/blog/kubevirt/application-migration.svg" >}} +

+ +Ist eine Ablösung einer Applikation in einer VM aufgrund wirtschaftlicher oder technischer Aspekte nicht sinnvoll, kann +der Betrieb auf Container-Plattformen dafür sorgen, dass Applikationen besser und einfacher integriert werden können. + +### Verwendung und direkter Zugriff auf dedizierte Hardware + +Normaler Container-Workload ermöglicht es nicht, spezielle Hardware einzubinden. Virtuelle Maschinen haben diese +Fähigkeit. Mittels KubeVirt können virtuelle Maschinen ebenfalls direkten Zugriff auf Geräte des Host-Systems erlangen. +Beispiele sind hier direkte Netzwerkkarten oder die Verwendung von Grafikkarten in VMs. Nvidia ist ein grosser Treiber +des KubeVirt Projektes und verwendet KubeVirt für das Nvidia GeForce Now. Der Vorteil für Unternehmen liegt in einer +effizienteren und kostengünstigeren Ressourcennutzung und der erhöhten Flexibilität, da spezialisierte Geräte dynamisch +an die VMs zugewiesen werden können. + +### Kubernetes-as-a-Service (KaaS) + +Das Konzept Kubernetes auf Kubernetes bietet interessante Anwendungsfälle. Insbesondere in Szenarien, in denen +Multi-Tenancy und Isolation eine grosse Rolle spielen. So kann zum Beispiel ein Anbieter isolierte Kubernetes-Tenants +anbieten, welche auf virtuellen KubeVirt Maschinen auf Kubernetes basieren. Diese Kubernetes-Tenants können bei Bedarf +skaliert und durch weitere virtuelle Maschinen erweitert werden. Dadurch kann die Bereitstellung von Tenants schneller, zentral +und komplett automatisiert erfolgen. Durch die starke Isolation von VMs können geforderte Sicherheitsaspekte besser abgedeckt +werden. + +### Kein Vendor-Lock-In + +Das KubeVirt-Projekt is Open-Source und wird von mehreren grossen Firmen wie zum Beispiel Red Hat, Nvidia oder +Cloudflare konstant weiterentwickelt. Die KubeVirt-Community wächst derzeit rasant. Kommt der Einsatz von +Community-Supported Software nicht infrage, kann zum Beispiel Red Hat OpenShift Virtualization, welches auf KubeVirt +basiert, eingesetzt werden. Für OpenShift Virtualization ist wiederum kommerzieller Enterprise-Grade Support von Red Hat +vorhanden. + +### Zusammenfassung + +KubeVirt ist eine interessante Alternative zu den bestehenden Virtualisierungslösungen. Das Ziel von KubeVirt ist nicht +primär der eins zu eins Ersatz von bestehenden Virtualisierungslösungen. Das volle Potenzial entwickelt sich, wenn der +VM-Workload so definiert ist, dass er mit denselben Tools und Workflows der Container-Welt gemanagt werden kann. Dies +erlaubt es Unternehmen Infrastruktur zu vereinheitlichen sowie die Ressourcen effizienter zu nutzen und dadurch operative +Kosten zu sparen. Durch die Konsolidierung kann auch die Produktvielfalt reduziert werden. Einheitliches Tooling, +Automatisierung und Integration in CI/CD-Pipelines fördert die Developer Experience und sorgt dafür, dass Ressourcen +schneller zur Verfügung stehen. + +## Möchtest Du mehr erfahren? + +Gerne stehen wir für Fragen zur Verfügung. Du erreichst uns am besten unter [hallo@tim-koko.ch](mailto:hallo@tim-koko.ch) oder auf [LinkedIn](https://www.linkedin.com/company/tim-koko). + +Weiter bieten wir dir die folgenden Möglichkeiten, dich vertieft mit dem Thema KubeVirt oder OpenShift Virtualization auseinander zu setzen: + +- [tim&koko labs](https://tim-koko.ch/labs/): An einem Nachmittag die Grundlagen von OpenShift Virtualization kennenlernen und in praktischen hands-on labs direkt anwenden. +- [KubeVirt Basics Training](https://acend.ch/trainings/kubevirt/): Zweitägiges abwechslungsreiches Training mit Präsentationen und hands-on labs. +- [OpenShift Virtualization Accelerator Package](https://tim-koko.ch/services/openshift-virtualization-accelerator/): Wir helfen dir, die Möglichkeiten von OpenShift Virtualization zu erkunden und herauszufinden, wie hoch das Potenzial für eine neue oder parallele Strategie sein + könnte. diff --git a/content/de/blog/2024-tim-koko-jahresrueckblick.md b/content/de/blog/2024-tim-koko-jahresrueckblick.md new file mode 100644 index 00000000..bf9f9396 --- /dev/null +++ b/content/de/blog/2024-tim-koko-jahresrueckblick.md @@ -0,0 +1,82 @@ +--- +title: "tim&koko Jahresrückblick 2024" +slug: "tim-koko-jahresrueckblick" +description: "" +date: 2024-12-16T00:00:00+00:00 +lastmod: 2024-12-16T00:00:00+00:00 +draft: false +images: ["images/blog/review24/tk-blogpost-review-1200x630.jpg"] +Sitemap: +Priority: 0.9 + +categories: ["News", "tim&koko", "Jahresrückblick"] +authors: ['livia-affolter'] +post_img: "images/blog/review24/tk-blogpost-review-1500x1000.jpg" +lead: "Das Jahr 2024 neigt sich dem Ende zu, und bei tim&koko blicken wir auf ein Jahr voller spannender Entwicklungen, inspirierender Momente und grossartiger Erlebnisse zurück. Für uns war 2024 geprägt von Wachstum – als Team, als Unternehmen und in unseren Partnerschaften. Für unseren Jahresrückblick, haben wir unser Team gefragt, was ihre ganz persönlichen Highlights des Jahres waren." +--- + +### Unser wachsendes Team + +Wir sind jetzt sechs motivierte Köpfe bei tim&koko. Jede/r Einzelne bringt einzigartige Stärken, Kreativität und +Leidenschaft mit. Gemeinsam arbeiten wir daran, unseren Kund:innen die besten Lösungen zu bieten. + +### Renaming zu tim&koko + +Einer der grössten Meilensteine war unser [Renaming](https://tim-koko.ch/blog/neuer-brand-name/). Aus unserem alten Namen wurde tim&koko – ein frischer, klarer +Ausdruck dessen, wer wir sind und wofür wir stehen. Unser Name tim&koko ehrt den britischen Informatiker Tim Berners-Lee, +Schöpfer des World Wide Web, wie auch das Gorilla-Weibchen Koko, das in Gebärdensprache kommunizierte. Der Name steht für +technologische Lösungen und Kommunikation auf Augenhöhe – genau wie unsere Arbeitsweise. + +{{< custom-image "../images/review24/apero-tk-launch.jpg" "600" >}} + +### Sommer Workshop + +Im Sommer kamen wir zusammen, um zu lernen, zu brainstormen und uns als Team weiterzuentwickeln. Kreative Ansätze, neue +Ideen und jede Menge Teamgeist prägten diesen [Workshop](https://tim-koko.ch/blog/tim-koko-sommerworkshop/). Es war ein +inspirierender Moment, der uns enger zusammengeschweisst hat. Während des Workshops stärkten wir an den drei gemeinsamen +Tagen unser Teamgefühl, reflektierten über die Übereinstimmung persönlicher und Firmenwerte als Basis für eine gemeinsame +Ausrichtung und entwickelten eine klare Vision für unsere Zukunft sowie unsere interne Organisation. + +{{< custom-image "../images/review24/sommerworkshop.jpg" "600" >}} + +### Kund:innen-Event im Oktober + +Unsere Büroräumlichkeiten verwandelten sich im Oktober in einen lebendigen Treffpunkt. Beim Kund:innen-Event konnten wir +spannende Gespräche führen, Ideen austauschen und auf unsere Zusammenarbeit anstossen. Wir danken allen, die mit dabei +waren und das Event zu einem Erfolg gemacht haben! + +{{< custom-image "../images/review24/herbst-event.jpg" "600" >}} + +### Baloise Codecamp + +Technologie und Gemeinschaft standen beim Baloise Codecamp im Mittelpunkt. Hier konnten wir mit Gleichgesinnten netzwerken, +Wissen teilen und uns von neuen Ansätzen inspirieren lassen. Ein Event, das uns gezeigt hat, wie viel Power in einer +Community steckt. + +{{< custom-image "../images/review24/baloise-codecamp.jpg" "600" >}} + +### Puzzle /mid - tim&koko Feierabendbier + +Bereits vor der offiziellen Bekanntgabe unserer Partnerschaft mit Puzzle im Dezember haben wir die Zusammenarbeit +gebührend gefeiert – bei Pizza und einem entspannten Feierabendbier. Gemeinsam bündeln wir unsere Stärken, um für +unsere Kund:innen die besten Lösungen zu entwickeln: mit gebündeltem Know-how, massgeschneiderten Strategien und +zusätzlicher Power für innovative Projekte. + +### Fokusthema KubeVirt + +Ein grosses Thema für uns war 2024 die Virtualisierung in der Cloud – konkret: OpenShift Virtualization / KubeVirt. Wir +haben unser Know-how in Blogposts auf unserer Webseite geteilt und freuen uns, dass dieses Thema so viel Resonanz +gefunden hat. Für alle, die noch nicht reingelesen haben: Schaut unbedingt in unserem Blog vorbei oder meldet euch am +besten direkt zu unserem kostenlosen Hands-on Labs an: [https://tim-koko.ch/labs](https://tim-koko.ch/labs) + +### Danke für ein grossartiges Jahr! + +All diese Meilensteine wären ohne unsere Kund:innen und Partner:innen nicht möglich gewesen. Ihr seid der Grund, warum +wir tun, was wir tun – und warum wir es lieben. + +2025 steht vor der Tür, und wir freuen uns darauf, gemeinsam mit euch weitere spannende Projekte zu realisieren, neue +Ideen zu entwickeln und als Team weiterzuwachsen. + +Vielen Dank für eure Unterstützung und euer Vertrauen – wir können es kaum erwarten, das nächste Kapitel mit euch zu schreiben! + +Euer tim&koko-Team diff --git a/content/de/blog/2024-unsere-werte.md b/content/de/blog/2024-unsere-werte.md new file mode 100644 index 00000000..0b6a58eb --- /dev/null +++ b/content/de/blog/2024-unsere-werte.md @@ -0,0 +1,48 @@ +--- +title: "Unsere Werte: Das Fundament in unserer Arbeit" +slug: "unsere-werte" +description: "" +date: 2024-12-02T00:00:00+00:00 +lastmod: 2024-12-02T00:00:00+00:00 +draft: false +images: ["images/blog/unsere-werte/tk-blogpost-werte-some.png"] +img_border: false +Sitemap: +Priority: 0.9 + +categories: ["News", "tim&koko", "Werte", "Behind the Scenes"] +authors: ['livia-affolter'] +post_img: "images/blog/unsere-werte/tk-blogpost-werte.jpg" +lead: "Unsere Werte prägen, wie wir arbeiten und miteinander umgehen. Sie sind nicht nur Leitlinien, sondern Teil unseres Alltags. Sie helfen uns, gemeinsam Ziele zu erreichen, und bieten Orientierung für die Zusammenarbeit mit unseren Kund:innen." +--- + + +## Authentizität und Qualität – Unser Anspruch + +Für uns bedeutet Authentizität, ehrlich und transparent zu sein, sowohl im Team als auch gegenüber unseren Kund:innen und Partner:innen. Wir stehen zu dem, was wir tun, und setzen uns dafür ein, dass unsere Arbeit nachvollziehbar bleibt. Diese Haltung ist die Grundlage für die Qualität, die wir in unsere Projekte einbringen. Mit Sorgfalt und einem klaren Blick für Details streben wir nach dem bestmöglichen Ergebnis. + +## Gemeinsam stark – Teamarbeit als Basis + +Erfolge entstehen bei uns im Team. Wir glauben daran, dass Zusammenarbeit auf Vertrauen, Respekt und gegenseitiger Unterstützung beruht. Jede/r kann ihre/seine Stärken einbringen, und genau das macht uns als Team stark. Ob im täglichen Miteinander oder in der Arbeit mit Kund:innen – wir arbeiten zusammen, um nachhaltige Lösungen zu finden. + +Dabei setzen wir nicht nur in unserer Arbeitsweise auf Offenheit und Zusammenarbeit, sondern auch in den Technologien, die wir einsetzen. Unser Anspruch ist, dass diese dem Open-Source-Spirit entsprechen und damit für alle zugänglich und entwicklungsfähig bleiben. + +## Professionalität und Engagement + +Professionalität bedeutet für uns, dass wir zuverlässig und strukturiert arbeiten. Aber es geht um mehr: Mit vollem Engagement setzen wir uns für unsere Ziele ein. Dabei geben wir uns nicht mit dem Nötigsten zufrieden, sondern suchen immer nach Wegen, uns weiterzuentwickeln und besser zu werden. Die Reflektion unserer Arbeit hilft uns, nicht stehenzubleiben. + +## Spass und Enthusiasmus – Mit Freude bei der Arbeit + +Auch wenn wir professionell und zielorientiert arbeiten, ist uns wichtig, dass der Spass nicht zu kurz kommt. Nur wenn Arbeit Freude macht, kann echte Kreativität entstehen. Unser Enthusiasmus motiviert uns, Projekte mit Leidenschaft anzugehen, und diese Begeisterung spüren auch unsere Kund:innen und Partner:innen. + +## Optimismus und Nachhaltigkeit – Mit Blick in die Zukunft + +Wir sind optimistisch und sehen Herausforderungen als Chancen. Dabei ist es uns wichtig, langfristig zu denken. Nachhaltigkeit bedeutet für uns, Entscheidungen so zu treffen, dass sie positive und dauerhafte Auswirkungen haben – für unser Team, unsere Kund:innen und die Umwelt. + +## Anspruchsvoll und offen für Neues + +Wir setzen uns hohe Ziele und bleiben dabei offen für Veränderungen. Pioniergeist heisst für uns, neue Wege zu gehen und nicht vor Risiken zurückzuschrecken. Wir wissen, dass Innovation und Fortschritt nur durch Neugier und Mut entstehen. + +## Fazit: Unsere Werte als Kompass + +Unsere Werte sind der Leitfaden, der uns in unserer täglichen Arbeit begleitet. Sie verbinden Authentizität, Qualität, Teamarbeit und Engagement mit einer klaren Ausrichtung auf die Zukunft. Mit Spass und Enthusiasmus setzen wir uns für nachhaltige und innovative Lösungen ein, die sowohl uns als auch unsere Kund:innen weiterbringen. diff --git a/content/de/blog/2025-cicd-devx.md b/content/de/blog/2025-cicd-devx.md new file mode 100644 index 00000000..98efc6bf --- /dev/null +++ b/content/de/blog/2025-cicd-devx.md @@ -0,0 +1,193 @@ +--- +title: "Effiziente CI/CD-Pipelines mit GitLab: Produktivität und Sicherheit vereint" +slug: "cicd-devx" +description: "" +date: 2025-01-29T00:00:00+00:00 +lastmod: 2025-01-29T00:00:00+00:00 +draft: false +images: ["images/blog/cicd-devx/tk-blogpost-cicd-devx-3000x2000.png"] +img_border: true +Sitemap: +Priority: 0.91 + +categories: ["Technologie", "GitlabCI", "Kubernetes"] +authors: ['raffael-hertle'] +post_img: "images/blog/cicd-devx/tk-blogpost-cicd-devx-3000x2000.png" +lead: "GitLab wird in breiter Masse als beliebtes VCS Tool und Continuous Integration Tool verwendet. In diesem Beitrag möchten wir einen Erfahrungsbericht vorstellen, wie wir die Möglichkeiten der Plattform ausschöpfen, um die Developer Produktivität massgebend zu verbessern und zudem durch Automatisierung die Supply Chain Security zu erhöhen." +--- + + +Automatisierte Code-Integration ist längst ein unverzichtbarer Bestandteil der modernen Cloud-Native Welt. Doch gerade in grossen Enterprise-Umgebungen stellt sich oft die Frage: Wie behält man den Überblick über Pipelines und Jobs, ohne dabei die Produktivität oder den Spass an der Entwicklung zu verlieren? Entwickler:innen wollen in einem initialen Setup ihren Stack für die Entwicklung einsatzbereit haben, ohne in einer ersten Phase die ganze CI/CD Landschaft aufzusetzen. Für unseren Kunden war das definierte Ziel klar: Änderungen sollen zeitnah integriert, für das Deployment bereitgestellt werden und automatisch ausgerollt werden. Durch Automatisierung wird direkt die Produktivität erhöht, bietet jedoch viel Angriffsfläche für Supply Chain Attacks. In einem früheren Blogpost haben wir die Grundlagen der Supply Chain Security, sowie Toolings und deren Wichtigkeit in modernen Umgebungen vorgestellt. Diese Grundlage haben wir weiterverwendet um unsere Supply Chain in GitLab Pipelines zu sichern. + +In diesem Beitrag möchten wir unsere Erfahrungen teilen, die wir bei einem Kunden im Bankensektor gemacht haben. Das deklarierte Ziel war es eine DevSecOps Landschaft zu gestalten, die vollautomatisiert und ohne Securitybedenken auf alle Systeme mit Continuous Deployment ausrollen kann. + +### DevSecOps als Motivation + +Um DevSecOps zu leben und damit auch von allen Benefits von Microservicearchitekturen und agiler Entwicklungsmethode zu profitieren, muss Software zeitnah und regelmässig auf die Zielsysteme ausgerollt werden. Dies erfordert ein hohes Mass an Automatisierung und Standardisierung. +Entwickler:innen sollen sich auf ihre tägliche Tätigkeit fokussieren können und ihre Projekte mit wenig Zusatzaufwand in den CI/CD Prozess integrieren können. + +### Standardisierung mit GitLab CI/CD Components + +GitLab führte in Version 17.0 das Konzept der CI/CD Components ein. Diese wiederverwendbaren Templates bieten eine Möglichkeit, Pipelineelemente als Template zur Verfügung zu stellen. Diese Komponenten definieren in einer leicht zu verstehenden Templatesprache CI/CD Komponenten, die über Variablen parametrisiert in Projekten verwendet werden können. CI/CD Components können aus dem zentralen Hub (https://gitlab.com/components) bezogen werden, oder in einer eigenen Komponente gepflegt werden. In unserem Fall wurden die Komponenten selbst entwickelt, um die Kontrolle und Variabilität für projektspezifische Anforderungen gerecht zu werden. +Grundsätzlich ist eine CI/CD Component ein GitLab Repository mit einem /templates Verzeichnis. In diesem Verzeichnis liegen die Templates für die Komponenten. Eine Komponente hat folgende Struktur: + +```yaml +# component/templates/test.yml +spec: + inputs: + stage: + default: test +--- +unit-test: + stage: $[[ inputs.stage ]] + script: echo unit tests + +integration-test: + stage: $[[ inputs.stage ]] + script: echo integration tests +``` + +Dieses Template kann über den include Block in einer Pipeline integriert und parametrisiert werden: + +```yaml +# other-project/.gitlab-ci.yml +stages: [verify, release] + +include: + - component: $CI_SERVER_FQDN/compnent/test@main + inputs: + stage: verify +``` + +So können Pipeline Templates über zentrale Komponenten verwaltet und gepflegt werden. Dies erhöht die Wiederverwendbarkeit und die Wartbarkeit, verringert gleichzeitig den Aufwand für neue Projekte. + +### Renovate + +Grundsätzlich sollen Projekte ihre Dependencies up-to-date halten. Dies bringt einen enormen Aufwand mit sich, der den meisten Entwickler:innen selten Spass bereitet und reine Fleissarbeit ist. Ein idealer Fall für eine Automatisierungslösung! Hier verwenden wir eine zentrale Renovate CI/CD Component, die verwendet werden kann, um automatisch Pullrequests mit neuen Dependencies zu erhalten. Renovate mit einem Service Account bestückt, der in andere Projekte eingeladen werden kann, um diese mit Dependency Updates zu versehen. Durch eine Autodiscovery Funktion wird Renovate alle Projekte, auf die der Service Account Zugriff hat, Pull Requests mit neuen Dependencies verfassen. +Somit haben wir schon einen wichtigen Punkt für eine sichere Pipeline erledigt. + +### Signieren von Images mit Cosign + +Um sicherzustellen, dass nur Images publiziert und verwendet werden, die wir auch selber gebaut haben, benötigen wir Image Signaturen. Mit dem Cosign Image bekommen wir die benötigten Binaries, die wir benötigen um Signaturen von publizierten Images zu erstellen und in der Container Registry abzulegen. + +```yaml +# components/cosign/templates/cosign.yml +spec: + inputs: + image: + description: "The image to be signed." + registry-user: + description: "The username to authenticate with the docker registry" + registry-password: + description: "The password to authenticate with the docker registry" + needs: + type: array + default: ["image:build"] + description: "The jobs that this job depends on" + stage: + default: image:sign + description: "The stage in which the job will run" +--- +cosign-sign: + stage: $[[ inputs.stage ]] + needs: $[[ inputs.needs ]] + image: ghcr.io/sigstore/cosign/cosign + script: + - ./cosign sign + --registry-username="$[[inputs.registry-user]]" + --registry-password="$[[inputs.registry-password]]" + --yes + $[[ inputs.image ]] +``` + +Mit dieser CI/CD Component können gebaute Images durch cosign signiert werden. Nachdem unsere Dependencies mit Renovate mit Updates versehen werden und unsere Images durch cosign signiert werden, widmen wir uns noch dem Deployment mit ArgoCD. + +### Deployments mit dynamischen Pipelines + +Das Deployment mit ArgoCD kann je nach Anzahl Umgebungen und Clustern zu einer Herausforderung werden. Um die Herausforderung mit mehreren Umgebungen und eventuell auch anderen ArgoCD Instanzen zu meistern benötigen wir ein weiteres Konstrukt: Downstream Pipelines. GitLab erlaubt es uns in der Laufzeit einer Pipeline weitere Pipelines dynamisch mit generierten gitlab-ci.yml Manifesten zu triggern. +Das zentrale Problem ist, dass Teams ihre Applikationen auf unterschiedlichen Stages in jeweils unterschiedlichen Kubernetes Umgebungen sowie ArgoCD Instanzen deployen. Die Lösung besteht darin, dass wir diese Deploymentstages während der Laufzeit der Pipeline dynamisch erzeugen und eine Child-Pipeline mit einem generierten Manifest triggern. +Das Projekt mit den zu deployenden Umgebungen besitzt ein Config File environments.yml mit den verschiedenen Umgebung und deren Parametern definiert: + +```yaml +# environments.yml +dev: + stage: dev + argoUrl: argo.local + argoApp: demo-app-dev + kubernetesUrl: kubernetes.local + kubernetesToken: token +int: + stage: int + argoUrl: argo.local + argoApp: demo-app-int + kubernetesUrl: kubernetes.local + kubernetesToken: token +``` + +Zudem haben wir ein Boilerplate File für die Downstream Pipeline downstream-template.yml, welches wir in der Pipeline befüllen werden: + +```yaml +# downstream-template.yml +STAGE:deploy: + image: bash + stage: argo + script: + - echo "Deploying argoAPP" + +``` + +Einfachheitshalber haben wir noch das zu befüllende Pipelinefile rendered-downstream.yml vorbereitet und nur mit der initialen Stagedefinition im Repository eingecheckt: + +```yaml +# rendered-downstream.yml +stages: + - argo + +``` + +Die effektiv laufende Pipeline erzeugt in einer ersten Stage das resultierende Pipelinefile und erzeugt ein Artefakt daraus. Dieses Artefakt wird direkt verwendet um die Childpipelines zu erzeugen und somit die einzelnen Umgebungen zu deployen. + +```yaml +# .gitlab-ci.yml +stages: + - template + - deploy + +deploy:createDownstream: + stage: template + image: + name: bash + before_script: + - apk add yq + script: + - echo "Reading environments" + - readarray envs < <(yq e -o=j -I=0 '.[]' environments.yml) + - for env in "${envs[@]}"; do stage=$(echo "$env" | yq e '.stage' -); argoApp=$(echo "$env" | yq e '.argoApp' -); sed "s/STAGE/$stage/g; s/argoAPP/$argoApp/g" downstream-template.yml >> rendered-downstream.yml; done + artifacts: + paths: + - rendered-downstream.yml + +deploy:triggerDownstream: + stage: deploy + trigger: + include: + - artifact: rendered-downstream.yml + job: deploy:createDownstream + strategy: depend + +``` + +Die resultierende Pipeline erzeugt nun mit dieser Konfiguration zwei Childpipelines, die jeweils verschiedene Umgebungen deployen können. Einfachheitshalber ist die Deploymentlogik weggelassen. + +{{< custom-image "../images/cicd-devx/pipeline.png" >}} +
+ +Wie wir sehen, erzeugt der erste Pipeline Job `deploy:createDownstream` das Template in der Stage `template` und in der `deploy` Stage werden durch die zwei generierten Artefakte die Downstream Pipelines erzeugt. Somit können wir dynamisch aus einer Konfigurationsmatrix Umgebungen mit verschiedenen Parametern ausrollen. Falls ihr dieses Beispiel live sehen oder testen möchtet, ihr findet es hier auf [GitLab](https://gitlab.com/g1raffi/cicd-example). + +### Fazit + +Mit vielen kleinen Verbesserungen kann das Potenzial der CI/CD Umgebung maximiert werden! Durch den Einsatz von CI Components werden GitLab Pipelines besser wartbar und verwaltbar. Teams können durch einfache Templates ihre gewünschten Pipeline zusammenstellen und müssen keine Entwicklungsgeschwindigkeit einbüssen. Mit Hilfe der dynamischen Downstream Pipelines von GitLab konnten komplexere Continuous Deployment Prozesse mit ArgoCD in Pipelines integriert werden. + +### Können wir auch dich unterstützen + +Möchtest auch du deine CI/CD Landschaft auf das nächste Level bringen oder hast du Fragen zu den verwendeten Komponenten? Dann melde dich bei uns! diff --git a/content/de/blog/2025-openshift-virtualization.md b/content/de/blog/2025-openshift-virtualization.md new file mode 100644 index 00000000..7772f722 --- /dev/null +++ b/content/de/blog/2025-openshift-virtualization.md @@ -0,0 +1,59 @@ +--- +title: "OpenShift Virtualization" +slug: "openshift-virtualization" +description: "" +date: 2025-01-09T00:00:00+00:00 +lastmod: 2025-01-09T00:00:00+00:00 +draft: false +images: ["images/blog/openshift-virtualization/tk-blogpost-ocp-virtualization-some.jpg"] +img_border: true +Sitemap: +Priority: 0.9 + +additionalblogposts: [ 'kubevirt-introduction', 'kubevirt-usecases', 'kubevirt-training' ] + +categories: ["Technologie", "KubeVirt", "Kubernetes"] +authors: ['raffael-hertle'] +post_img: "images/blog/openshift-virtualization/tk-blogpost-ocp-virtualization.jpg" +lead: "Red Hat OpenShift Virtualization bietet als eine Erweiterung von Red Hat OpenShift eine Möglichkeit, virtuelle Maschinen einfach und effizient in dein bestehendes OpenShift Umfeld standardisiert zu integrieren. Es erlaubt, die traditionellen Virtualisierungslösungen und die Cloud Native Welt zu einer zuverlässigen, konsistenten und standardisierten Hybrid Cloud Anwendungsplattform zusammenzuführen." +--- + + +In der KubeVirt-Serie [KubeVirt Journey - Einführung in die Verwaltung von virtuellen Maschinen in Kubernetes]({{< ref "blog/2024-kubevirt-introduction" >}}) haben wir schon über Vorteile, Anwendungen und die Konzepte von KubeVirt berichtet. Das Projekt wird open-source von der Cloud Native Computing Foundation (CNCF) weiterentwickelt und unterhalten. Ähnlich wie bei OpenShift Pipelines oder OpenShift GitOps, integriert OpenShift Virtualization das upstream Projekt KubeVirt nahtlos in die OpenShift Plattform. + +### Vorteile von Red Hat OpenShift Virtualization + +Durch die Implementation von OpenShift Virtualization in deinem OpenShift Cluster kannst du von den folgenden Vorteilen profitieren: + +* **Unterstützte Migration:** OpenShift Virtualization kommt mit einem hauseigenen [Migrations-Toolkit](https://developers.redhat.com/products/mtv/overview), um einfach von anderen Hypervisoren zu migrieren. +* **Schneller in Produktion:** Durch OpenShift Virtualization kann die Bereitstellung der Infrastruktur durch Self Service Portale und die nahtlose Integration mit CI/CD-Pipelines unterstützt und vereinfacht werden. Entwickler:innen können durch OpenShift Virtualization einfacher VMs erstellen, testen und in ihre Systeme integrieren. +* **Einheitliche Plattform:** Durch OpenShift Virtualization werden VMs genau wie Container, Pipelines und Serverless Workload gleich integriert. Die Integration in die OpenShift Umgebung erlaubt eine einfache und übersichtliche Art virtuelle Maschinen standardisiert zu verwalten. + +
+ +{{< custom-image "../images/openshift-virtualization/migration-ui.png" 1000 >}} + +

+ +### Installation und Features + +OpenShift Virtualization wird als Operator auf der OpenShift Plattform installiert. Durch den OperatorHub kann der Operator installiert und verwendet werden. Durch die Installation werden in dem OpenShift Cluster weitere CustomResourceDefinitions (CRDs) und Features freigeschaltet. +Zu diesen Features gehören: + +* Erstellen und Verwalten von virtuellen Maschinen +* Verbindung zu VMs mit UI- oder CLI-Tools +* Klonen und Importieren von bereits vorhandenen VMs +* Verwaltung von Netzwerkschnittstellen-Controllern und Storage an VMs +* Live Migration der VMs über OpenShift Nodes +* Migrations Toolkit for Virtualization + +### Möchtest Du mehr erfahren? + +Gerne stehen wir für Fragen zur Verfügung. Du erreichst uns am besten unter [hallo@tim-koko.ch](mailto:hallo@tim-koko.ch) oder auf [LinkedIn](https://www.linkedin.com/company/tim-koko). + +Weiter bieten wir dir die folgenden Möglichkeiten, dich vertieft mit dem Thema KubeVirt oder OpenShift Virtualization auseinander zu setzen: + +* [tim&koko labs](https://tim-koko.ch/labs/): An einem Nachmittag die Grundlagen von KubeVirt kennenlernen und in praktischen hands-on labs direkt anwenden. +* [KubeVirt Basics Training](https://acend.ch/trainings/kubevirt/): Zweitägiges abwechslungsreiches Training mit Präsentationen und hands-on labs. +* [OpenShift Virtualization Accelerator Package](https://tim-koko.ch/services/openshift-virtualization-accelerator/): Wir helfen dir, die Möglichkeiten von OpenShift Virtualization zu erkunden und herauszufinden, wie hoch das Potenzial für eine neue oder parallele Strategie sein + könnte. diff --git a/content/de/blog/_index.md b/content/de/blog/_index.md index 08d78ff5..86043fd9 100644 --- a/content/de/blog/_index.md +++ b/content/de/blog/_index.md @@ -8,6 +8,7 @@ draft: false images: [] Sitemap: Priority: 0.3 +dataScroll: true --- In unserem Blog lassen wir hinter die Kulissen blicken, teilen unser Wissen in Posts zu technologischen Themen und erlauben den Besucher:innen mehr über uns und unsere Kultur zu erfahren. diff --git a/content/de/blog/images/cicd-devx/pipeline.png b/content/de/blog/images/cicd-devx/pipeline.png new file mode 100644 index 00000000..af4cef38 Binary files /dev/null and b/content/de/blog/images/cicd-devx/pipeline.png differ diff --git a/content/de/blog/images/openshift-virtualization/migration-ui.png b/content/de/blog/images/openshift-virtualization/migration-ui.png new file mode 100644 index 00000000..009c9b46 Binary files /dev/null and b/content/de/blog/images/openshift-virtualization/migration-ui.png differ diff --git a/content/de/blog/images/review24/apero-tk-launch.jpg b/content/de/blog/images/review24/apero-tk-launch.jpg new file mode 100644 index 00000000..c0dd89b5 Binary files /dev/null and b/content/de/blog/images/review24/apero-tk-launch.jpg differ diff --git a/content/de/blog/images/review24/baloise-codecamp.jpg b/content/de/blog/images/review24/baloise-codecamp.jpg new file mode 100644 index 00000000..982e6c59 Binary files /dev/null and b/content/de/blog/images/review24/baloise-codecamp.jpg differ diff --git a/content/de/blog/images/review24/herbst-event.jpg b/content/de/blog/images/review24/herbst-event.jpg new file mode 100644 index 00000000..a7756929 Binary files /dev/null and b/content/de/blog/images/review24/herbst-event.jpg differ diff --git a/content/de/blog/images/review24/sommerworkshop.jpg b/content/de/blog/images/review24/sommerworkshop.jpg new file mode 100644 index 00000000..a26b656f Binary files /dev/null and b/content/de/blog/images/review24/sommerworkshop.jpg differ diff --git a/content/de/blog/test-blog-artikel.md b/content/de/blog/test-blog-artikel.md index 0df70115..95d16b1d 100644 --- a/content/de/blog/test-blog-artikel.md +++ b/content/de/blog/test-blog-artikel.md @@ -19,3 +19,8 @@ _build: list: never render: never --- + + +{{< blogposts blogslugs="kubevirt-training,kubevirt-introduction" displaytype="bloglistsmall" >}} + +{{< blogposts blogslugs="kubevirt-training,kubevirt-introduction,kubevirt-usecases" displaytype="normal" >}} diff --git a/content/de/datenschutzerklaerung.md b/content/de/datenschutzerklaerung.md index dc2b5116..e938beda 100644 --- a/content/de/datenschutzerklaerung.md +++ b/content/de/datenschutzerklaerung.md @@ -194,7 +194,7 @@ Darüber hinaus gelten jeweils die Allgemeinen Geschäftsbedingungen (AGB) und N ## 9. Cookies und weitere Tracking-Technologien -Diese Website verwendet keine Cookies oder andere Tracking-Tools. +Diese Website verwendet keine Cookies. Zur Analyse des Nutzungsverhalten der Website Besucher setzen wir das Cookie freie Analyticstool von ein. +{{- $slugparam := (.Get "blogslugs") -}} +{{- $displaytype := (.Get "displaytype") -}} +{{- $slugs := split $slugparam "," -}} +{{ if $slugs }} + {{ if eq $displaytype "bloglistsmall" }} +
+ {{ range $post := $slugs }} + {{ range where (where $.Site.RegularPages "Section" "blog") ".Params.slug" "in" ($post) }} + {{- partial "additional-content-blog" . -}} + {{ end }} + {{ end }} +
+ {{ else }} +
+ {{ range $post :=$slugs }} + {{ range where (where $.Site.RegularPages "Section" "blog") ".Params.slug" "in" ($post) }} + {{- partial "content-blog" . -}} + {{ end }} + {{ end }} +
+ {{ end }} +{{ end }} \ No newline at end of file diff --git a/netlify.toml b/netlify.toml index 0b2bee89..2fb4a03d 100644 --- a/netlify.toml +++ b/netlify.toml @@ -43,7 +43,5 @@ publish = "public" autoLaunch = false -[[headers]] - for = "/*" - [headers.values] - Content-Security-Policy = "connect-src * 'self';" + + # Content-Security-Policy: default-src 'self'; manifest-src 'self'; connect-src 'self'; font-src 'self'; img-src 'self' data:; script-src 'self' 'nonce-dXNlcj0iaGVsbG8iLGRvbWFpbj0iaGVua3ZlcmxpbmRlLmNvbSIsZG9jdW1lbnQud3JpdGUodXNlcisiQCIrZG9tYWluKTs=' 'sha256-aWZ3y/RxbBYKHXH0z8+8ljrHG1mSBvyzSfxSMjBSaXk=' 'sha256-Sz0IuK/4LfFJVp69F4UHK80xoxDZLOBPMJhPi0XZl3A='; style-src 'self' 'unsafe-inline' \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 944405fb..e7abe1ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@lottiefiles/dotlottie-web": "^0.35.0", + "@lottiefiles/dotlottie-web": "^0.38.1", "animejs": "^3.2.1", "flickity": "^2.3.0", "headroom.js": "^0.12.0", @@ -30,7 +30,7 @@ "exec-bin": "^1.0.0", "hugo-installer": "^4.0", "lazysizes": "^5.3", - "markdownlint-cli2": "^0.14.0", + "markdownlint-cli2": "^0.16.0", "postcss": "^8.4", "postcss-cli": "^11.0", "purgecss-whitelister": "^2.4", @@ -111,12 +111,13 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.9.tgz", - "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", + "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", "dev": true, "dependencies": { - "@babel/highlight": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -124,30 +125,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.9.tgz", - "integrity": "sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz", + "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.9.tgz", - "integrity": "sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helpers": "^7.25.9", - "@babel/parser": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", "@babel/template": "^7.25.9", "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -169,12 +170,13 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.9.tgz", - "integrity": "sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz", + "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9", + "@babel/parser": "^7.26.0", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -320,13 +322,12 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz", - "integrity": "sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, @@ -460,40 +461,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.9.tgz", - "integrity": "sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", - "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz", + "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -594,9 +580,9 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz", - "integrity": "sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -609,9 +595,9 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz", - "integrity": "sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -735,9 +721,9 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz", - "integrity": "sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", @@ -1258,6 +1244,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", @@ -1413,12 +1415,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.9.tgz", - "integrity": "sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.0", "@babel/helper-compilation-targets": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-validator-option": "^7.25.9", @@ -1428,8 +1430,8 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.25.9", - "@babel/plugin-syntax-import-attributes": "^7.25.9", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.9", "@babel/plugin-transform-async-generator-functions": "^7.25.9", @@ -1437,7 +1439,7 @@ "@babel/plugin-transform-block-scoped-functions": "^7.25.9", "@babel/plugin-transform-block-scoping": "^7.25.9", "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", "@babel/plugin-transform-classes": "^7.25.9", "@babel/plugin-transform-computed-properties": "^7.25.9", "@babel/plugin-transform-destructuring": "^7.25.9", @@ -1470,6 +1472,7 @@ "@babel/plugin-transform-private-property-in-object": "^7.25.9", "@babel/plugin-transform-property-literals": "^7.25.9", "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", "@babel/plugin-transform-reserved-words": "^7.25.9", "@babel/plugin-transform-shorthand-properties": "^7.25.9", "@babel/plugin-transform-spread": "^7.25.9", @@ -1553,9 +1556,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", - "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -1864,9 +1867,9 @@ } }, "node_modules/@lottiefiles/dotlottie-web": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.35.0.tgz", - "integrity": "sha512-dXyQzNGaNOovJ23skUaLs0RU1Hpr+e4JKCBW4Wq/HTVnTCqfhV4uYaG1lLloZy50QdPsUB3UyIgd656pcQwTQA==" + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.38.1.tgz", + "integrity": "sha512-k7l2nLxGvFCD4ckJFxYI7KSvLvT5HtvGkejk6VuGTuUfcQpS+e29fOF+oNRVW5Wjgdh/1QvyxLpqDg57CcJqgw==" }, "node_modules/@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", @@ -2111,18 +2114,6 @@ "node": ">=8" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -2586,20 +2577,6 @@ } ] }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -2674,21 +2651,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -3135,15 +3097,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", @@ -4130,15 +4083,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/headroom.js": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/headroom.js/-/headroom.js-0.12.0.tgz", @@ -4814,13 +4758,13 @@ } }, "node_modules/markdownlint": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.35.0.tgz", - "integrity": "sha512-wgp8yesWjFBL7bycA3hxwHRdsZGJhjhyP1dSxKVKrza0EPFYtn+mHtkVy6dvP1kGSjovyG5B8yNP6Frj0UFUJg==", + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.36.1.tgz", + "integrity": "sha512-s73fU2CQN7WCgjhaQUQ8wYESQNzGRNOKDd+3xgVqu8kuTEhmwepd/mxOv1LR2oV046ONrTLBFsM7IoKWNvmy5g==", "dev": true, "dependencies": { "markdown-it": "14.1.0", - "markdownlint-micromark": "0.1.10" + "markdownlint-micromark": "0.1.12" }, "engines": { "node": ">=18" @@ -4830,15 +4774,15 @@ } }, "node_modules/markdownlint-cli2": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.14.0.tgz", - "integrity": "sha512-2cqdWy56frU2FTpbuGb83mEWWYuUIYv6xS8RVEoUAuKNw/hXPar2UYGpuzUhlFMngE8Omaz4RBH52MzfRbGshw==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.16.0.tgz", + "integrity": "sha512-oy5dJdOxGMKSwrlouxdEGf6N4O2Iz8oJ4/HO2Ix67o4vTK1AQNGjZUNwTIzfa5x+XbJ++dfgR1gLfILajsW+1Q==", "dev": true, "dependencies": { "globby": "14.0.2", "js-yaml": "4.1.0", "jsonc-parser": "3.3.1", - "markdownlint": "0.35.0", + "markdownlint": "0.36.1", "markdownlint-cli2-formatter-default": "0.0.5", "micromatch": "4.0.8" }, @@ -4921,9 +4865,9 @@ } }, "node_modules/markdownlint-micromark": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.10.tgz", - "integrity": "sha512-no5ZfdqAdWGxftCLlySHSgddEjyW4kui4z7amQcGsSKfYC5v/ou+8mIQVyg9KQMeEZLNtz9OPDTj7nnTnoR4FQ==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.12.tgz", + "integrity": "sha512-RlB6EwMGgc0sxcIhOQ2+aq7Zw1V2fBnzbXKGgYK/mVWdT7cz34fteKSwfYeo4rL6+L/q2tyC9QtD/PgZbkdyJQ==", "dev": true, "engines": { "node": ">=18" @@ -5397,9 +5341,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -5445,9 +5389,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -5465,7 +5409,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -6731,18 +6675,6 @@ "node": ">=8" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/supports-hyperlinks": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", @@ -7412,37 +7344,38 @@ } }, "@babel/code-frame": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.9.tgz", - "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", + "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", "dev": true, "requires": { - "@babel/highlight": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.9.tgz", - "integrity": "sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz", + "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==", "dev": true }, "@babel/core": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.9.tgz", - "integrity": "sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helpers": "^7.25.9", - "@babel/parser": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", "@babel/template": "^7.25.9", "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -7459,12 +7392,13 @@ } }, "@babel/generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.9.tgz", - "integrity": "sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz", + "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==", "dev": true, "requires": { - "@babel/types": "^7.25.9", + "@babel/parser": "^7.26.0", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -7579,13 +7513,12 @@ } }, "@babel/helper-module-transforms": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz", - "integrity": "sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" } @@ -7677,34 +7610,22 @@ } }, "@babel/helpers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.9.tgz", - "integrity": "sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "requires": { "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.26.0" } }, "@babel/parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", - "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz", + "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==", "dev": true, "requires": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.26.0" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { @@ -7764,18 +7685,18 @@ "requires": {} }, "@babel/plugin-syntax-import-assertions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz", - "integrity": "sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-syntax-import-attributes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz", - "integrity": "sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.25.9" @@ -7851,9 +7772,9 @@ } }, "@babel/plugin-transform-class-static-block": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz", - "integrity": "sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.25.9", @@ -8176,6 +8097,16 @@ "regenerator-transform": "^0.15.2" } }, + "@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, "@babel/plugin-transform-reserved-words": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", @@ -8271,12 +8202,12 @@ } }, "@babel/preset-env": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.9.tgz", - "integrity": "sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "dev": true, "requires": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.0", "@babel/helper-compilation-targets": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-validator-option": "^7.25.9", @@ -8286,8 +8217,8 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.25.9", - "@babel/plugin-syntax-import-attributes": "^7.25.9", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.9", "@babel/plugin-transform-async-generator-functions": "^7.25.9", @@ -8295,7 +8226,7 @@ "@babel/plugin-transform-block-scoped-functions": "^7.25.9", "@babel/plugin-transform-block-scoping": "^7.25.9", "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", "@babel/plugin-transform-classes": "^7.25.9", "@babel/plugin-transform-computed-properties": "^7.25.9", "@babel/plugin-transform-destructuring": "^7.25.9", @@ -8328,6 +8259,7 @@ "@babel/plugin-transform-private-property-in-object": "^7.25.9", "@babel/plugin-transform-property-literals": "^7.25.9", "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", "@babel/plugin-transform-reserved-words": "^7.25.9", "@babel/plugin-transform-shorthand-properties": "^7.25.9", "@babel/plugin-transform-spread": "^7.25.9", @@ -8393,9 +8325,9 @@ } }, "@babel/types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", - "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.25.9", @@ -8607,9 +8539,9 @@ } }, "@lottiefiles/dotlottie-web": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.35.0.tgz", - "integrity": "sha512-dXyQzNGaNOovJ23skUaLs0RU1Hpr+e4JKCBW4Wq/HTVnTCqfhV4uYaG1lLloZy50QdPsUB3UyIgd656pcQwTQA==" + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.38.1.tgz", + "integrity": "sha512-k7l2nLxGvFCD4ckJFxYI7KSvLvT5HtvGkejk6VuGTuUfcQpS+e29fOF+oNRVW5Wjgdh/1QvyxLpqDg57CcJqgw==" }, "@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", @@ -8798,15 +8730,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -9101,17 +9024,6 @@ "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -9165,21 +9077,6 @@ "mimic-response": "^1.0.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -9523,12 +9420,6 @@ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, "eslint": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", @@ -10264,12 +10155,6 @@ "function-bind": "^1.1.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, "headroom.js": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/headroom.js/-/headroom.js-0.12.0.tgz", @@ -10777,25 +10662,25 @@ } }, "markdownlint": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.35.0.tgz", - "integrity": "sha512-wgp8yesWjFBL7bycA3hxwHRdsZGJhjhyP1dSxKVKrza0EPFYtn+mHtkVy6dvP1kGSjovyG5B8yNP6Frj0UFUJg==", + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.36.1.tgz", + "integrity": "sha512-s73fU2CQN7WCgjhaQUQ8wYESQNzGRNOKDd+3xgVqu8kuTEhmwepd/mxOv1LR2oV046ONrTLBFsM7IoKWNvmy5g==", "dev": true, "requires": { "markdown-it": "14.1.0", - "markdownlint-micromark": "0.1.10" + "markdownlint-micromark": "0.1.12" } }, "markdownlint-cli2": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.14.0.tgz", - "integrity": "sha512-2cqdWy56frU2FTpbuGb83mEWWYuUIYv6xS8RVEoUAuKNw/hXPar2UYGpuzUhlFMngE8Omaz4RBH52MzfRbGshw==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.16.0.tgz", + "integrity": "sha512-oy5dJdOxGMKSwrlouxdEGf6N4O2Iz8oJ4/HO2Ix67o4vTK1AQNGjZUNwTIzfa5x+XbJ++dfgR1gLfILajsW+1Q==", "dev": true, "requires": { "globby": "14.0.2", "js-yaml": "4.1.0", "jsonc-parser": "3.3.1", - "markdownlint": "0.35.0", + "markdownlint": "0.36.1", "markdownlint-cli2-formatter-default": "0.0.5", "micromatch": "4.0.8" }, @@ -10842,9 +10727,9 @@ "requires": {} }, "markdownlint-micromark": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.10.tgz", - "integrity": "sha512-no5ZfdqAdWGxftCLlySHSgddEjyW4kui4z7amQcGsSKfYC5v/ou+8mIQVyg9KQMeEZLNtz9OPDTj7nnTnoR4FQ==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.12.tgz", + "integrity": "sha512-RlB6EwMGgc0sxcIhOQ2+aq7Zw1V2fBnzbXKGgYK/mVWdT7cz34fteKSwfYeo4rL6+L/q2tyC9QtD/PgZbkdyJQ==", "dev": true }, "mathml-tag-names": { @@ -11172,9 +11057,9 @@ "dev": true }, "picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -11205,13 +11090,13 @@ } }, "postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, @@ -12137,15 +12022,6 @@ "postcss-value-parser": "^4.1.0" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "supports-hyperlinks": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", diff --git a/package.json b/package.json index 09a0b4a8..b5eda36b 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "exec-bin": "^1.0.0", "hugo-installer": "^4.0", "lazysizes": "^5.3", - "markdownlint-cli2": "^0.14.0", + "markdownlint-cli2": "^0.16.0", "postcss": "^8.4", "postcss-cli": "^11.0", "purgecss-whitelister": "^2.4", @@ -65,7 +65,7 @@ "hugo": "0.136.2" }, "dependencies": { - "@lottiefiles/dotlottie-web": "^0.35.0", + "@lottiefiles/dotlottie-web": "^0.38.1", "animejs": "^3.2.1", "flickity": "^2.3.0", "headroom.js": "^0.12.0",