From 863ae41dad6819da3ceeb72337a8fb357915a542 Mon Sep 17 00:00:00 2001 From: Philip Molloy Date: Sun, 15 Feb 2026 22:45:20 +0100 Subject: [PATCH 01/14] feat: Add ecosystem page with interactive map - Create ecosystem section listing local businesses and communities - Add Leaflet map integration to visualize locations - Add German and English content files with entity data - Update navigation menu and translations --- config.toml | 2 + content/ecosystem/_index.en.md | 48 +++++++++++++++++ content/ecosystem/_index.md | 48 +++++++++++++++++ static/css/style.css | 98 ++++++++++++++++++++++++++++++++++ templates/_macros.html | 2 + templates/ecosystem.html | 83 ++++++++++++++++++++++++++++ 6 files changed, 281 insertions(+) create mode 100644 content/ecosystem/_index.en.md create mode 100644 content/ecosystem/_index.md create mode 100644 templates/ecosystem.html diff --git a/config.toml b/config.toml index 9730b06..101620e 100644 --- a/config.toml +++ b/config.toml @@ -26,6 +26,7 @@ all_rights_reserved = "All rights reserved" conference = "Conference" archive = "Archive" community = "Community" +ecosystem = "Ecosystem" [translations] linkedin_tooltip = "Unserer LinkedIn Seite folgen" @@ -40,6 +41,7 @@ all_rights_reserved = "Alle Rechte vorbehalten" conference = "Konferenz" archive = "Archiv" community = "Community" +ecosystem = "Ökosystem" [markdown.highlighting] light_theme = "github-light-default" diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md new file mode 100644 index 0000000..984f153 --- /dev/null +++ b/content/ecosystem/_index.en.md @@ -0,0 +1,48 @@ ++++ +title = "Ecosystem" +template = "ecosystem.html" + +[[extra.groups]] +title = "Large Business" +entities = [ + { name = "Analog Devices", url = "https://www.analog.com", description = "Global semiconductor leader bridging the physical and digital worlds to enable breakthroughs at the Intelligent Edge.", address = "Otl-Aicher-Straße 60-64, 80807 München", lat = 48.1868, lon = 11.5985 }, + { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München", lat = 48.1430, lon = 11.5412 }, + { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München", lat = 48.1431, lon = 11.5649 }, + { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg", lat = 48.0785, lon = 11.6155 }, + { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn", lat = 48.1015, lon = 11.7455 } +] + +[[extra.groups]] +title = "Medium/Small Business" +entities = [ + { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring", lat = 48.1778, lon = 11.6333 }, + { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "High power charging for e-mobility.", address = "Alte Landstraße 29, 85521 Ottobrunn", lat = 48.0788, lon = 11.6538 }, + { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn", lat = 48.0525, lon = 11.6602 }, + { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München", lat = 48.1485, lon = 11.4782 }, + { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München", lat = 48.1282, lon = 11.6108 }, + { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim", lat = 48.2841, lon = 11.5672 } +] + +[[extra.groups]] +title = "Consulting" +entities = [ + { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München", lat = 48.1018, lon = 11.5400 }, + { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell", lat = 48.1945, lon = 11.3735 }, + { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn", lat = 48.0620, lon = 11.6690 }, + { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München", lat = 48.1018, lon = 11.5400 } +] + +[[extra.groups]] +title = "Non-profit" +entities = [ + { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Open workshop with digital fabrication tools.", address = "Gollierstraße 70, 80339 München", lat = 48.1348, lon = 11.5345 }, + { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Community network for free wireless internet.", address = "Parkstraße 28, 82131 Gauting", lat = 48.0689, lon = 11.3721 }, + { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Open workshop and community space.", address = "Rosenheimer Str. 5, 81667 München", lat = 48.1315, lon = 11.5915 } +] + +[[extra.groups]] +title = "Meet-ups" +entities = [ + { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München", lat = 48.2645, lon = 11.6715 } +] ++++ diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md new file mode 100644 index 0000000..caca7b9 --- /dev/null +++ b/content/ecosystem/_index.md @@ -0,0 +1,48 @@ ++++ +title = "Ökosystem" +template = "ecosystem.html" + +[[extra.groups]] +title = "Großunternehmen" +entities = [ + { name = "Analog Devices", url = "https://www.analog.com", description = "Global semiconductor leader bridging the physical and digital worlds to enable breakthroughs at the Intelligent Edge.", address = "Otl-Aicher-Straße 60-64, 80807 München", lat = 48.1868, lon = 11.5985 }, + { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München", lat = 48.1430, lon = 11.5412 }, + { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München", lat = 48.1431, lon = 11.5649 }, + { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg", lat = 48.0785, lon = 11.6155 }, + { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn", lat = 48.1015, lon = 11.7455 } +] + +[[extra.groups]] +title = "Mittelstand / KMU" +entities = [ + { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring", lat = 48.1778, lon = 11.6333 }, + { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "High power charging for e-mobility.", address = "Alte Landstraße 29, 85521 Ottobrunn", lat = 48.0788, lon = 11.6538 }, + { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn", lat = 48.0525, lon = 11.6602 }, + { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München", lat = 48.1485, lon = 11.4782 }, + { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München", lat = 48.1282, lon = 11.6108 }, + { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim", lat = 48.2841, lon = 11.5672 } +] + +[[extra.groups]] +title = "Beratung / Dienstleistung" +entities = [ + { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München", lat = 48.1018, lon = 11.5400 }, + { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell", lat = 48.1945, lon = 11.3735 }, + { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn", lat = 48.0620, lon = 11.6690 }, + { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München", lat = 48.1018, lon = 11.5400 } +] + +[[extra.groups]] +title = "Gemeinnützige Organisationen" +entities = [ + { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Open workshop with digital fabrication tools.", address = "Gollierstraße 70, 80339 München", lat = 48.1348, lon = 11.5345 }, + { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Community network for free wireless internet.", address = "Parkstraße 28, 82131 Gauting", lat = 48.0689, lon = 11.3721 }, + { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Open workshop and community space.", address = "Rosenheimer Str. 5, 81667 München", lat = 48.1315, lon = 11.5915 } +] + +[[extra.groups]] +title = "Meetups" +entities = [ + { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München", lat = 48.2645, lon = 11.6715 } +] ++++ diff --git a/static/css/style.css b/static/css/style.css index 57d3f71..4672650 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -36,6 +36,8 @@ --container-3xl: 48rem; --container-5xl: 64rem; --container-6xl: 72rem; + --text-xs: 0.75rem; + --text-xs--line-height: calc(1 / 0.75); --text-sm: 0.875rem; --text-sm--line-height: calc(1.25 / 0.875); --text-lg: 1.125rem; @@ -224,6 +226,9 @@ .static { position: static; } + .z-0 { + z-index: 0; + } .container { width: 100%; @media (width >= 40rem) { @@ -251,6 +256,12 @@ .ms-4 { margin-inline-start: calc(var(--spacing) * 4); } + .mt-0 { + margin-top: calc(var(--spacing) * 0); + } + .mt-0\.5 { + margin-top: calc(var(--spacing) * 0.5); + } .mt-1 { margin-top: calc(var(--spacing) * 1); } @@ -293,6 +304,9 @@ .mb-12 { margin-bottom: calc(var(--spacing) * 12); } + .mb-16 { + margin-bottom: calc(var(--spacing) * 16); + } .button { display: inline-block; border-radius: var(--radius-lg); @@ -334,6 +348,9 @@ .inline-block { display: inline-block; } + .table { + display: table; + } .aspect-square { aspect-ratio: 1 / 1; } @@ -355,6 +372,9 @@ .h-80 { height: calc(var(--spacing) * 80); } + .h-96 { + height: calc(var(--spacing) * 96); + } .h-auto { height: auto; } @@ -400,15 +420,27 @@ .flex-1 { flex: 1; } + .flex-shrink { + flex-shrink: 1; + } .shrink-0 { flex-shrink: 0; } + .flex-grow { + flex-grow: 1; + } .grow { flex-grow: 1; } + .border-collapse { + border-collapse: collapse; + } .transform { transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); } + .resize { + resize: both; + } .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } @@ -427,6 +459,12 @@ .justify-center { justify-content: center; } + .gap-1 { + gap: calc(var(--spacing) * 1); + } + .gap-2 { + gap: calc(var(--spacing) * 2); + } .gap-3 { gap: calc(var(--spacing) * 3); } @@ -455,6 +493,13 @@ margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); } } + .space-y-16 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 16) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 16) * calc(1 - var(--tw-space-y-reverse))); + } + } .divide-y { :where(& > :not(:last-child)) { --tw-divide-y-reverse: 0; @@ -519,6 +564,9 @@ .border-gray-200 { border-color: var(--color-gray-200); } + .border-gray-300 { + border-color: var(--color-gray-300); + } .bg-blue-50 { background-color: var(--color-blue-50); } @@ -616,6 +664,10 @@ font-size: var(--text-2xl); line-height: var(--tw-leading, var(--text-2xl--line-height)); } + .text-3xl { + font-size: var(--text-3xl); + line-height: var(--tw-leading, var(--text-3xl--line-height)); + } .text-lg { font-size: var(--text-lg); line-height: var(--tw-leading, var(--text-lg--line-height)); @@ -628,6 +680,10 @@ font-size: var(--text-xl); line-height: var(--tw-leading, var(--text-xl--line-height)); } + .text-xs { + font-size: var(--text-xs); + line-height: var(--tw-leading, var(--text-xs--line-height)); + } .leading-0 { --tw-leading: calc(var(--spacing) * 0); line-height: calc(var(--spacing) * 0); @@ -679,6 +735,9 @@ .text-gray-800 { color: var(--color-gray-800); } + .text-gray-900 { + color: var(--color-gray-900); + } .text-green-800 { color: var(--color-green-800); } @@ -694,6 +753,9 @@ .underline-offset-4 { text-underline-offset: 4px; } + .opacity-0 { + opacity: 0%; + } .shadow-lg { --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); @@ -706,6 +768,10 @@ --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } + .outline { + outline-style: var(--tw-outline-style); + outline-width: 1px; + } .transition-all { transition-property: all; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); @@ -716,6 +782,11 @@ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } + .transition-opacity { + transition-property: opacity; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } .transition-shadow { transition-property: box-shadow; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); @@ -754,6 +825,13 @@ } } } + .group-hover\:opacity-100 { + &:is(:where(.group):hover *) { + @media (hover: hover) { + opacity: 100%; + } + } + } .hover\:-translate-y-1 { &:hover { @media (hover: hover) { @@ -793,6 +871,14 @@ } } } + .hover\:shadow-md { + &:hover { + @media (hover: hover) { + --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + } + } .hover\:shadow-xl { &:hover { @media (hover: hover) { @@ -863,6 +949,12 @@ line-height: var(--tw-leading, var(--text-3xl--line-height)); } } + .md\:text-4xl { + @media (width >= 48rem) { + font-size: var(--text-4xl); + line-height: var(--tw-leading, var(--text-4xl--line-height)); + } + } .lg\:block { @media (width >= 64rem) { display: block; @@ -1255,6 +1347,11 @@ inherits: false; initial-value: 0 0 #0000; } +@property --tw-outline-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} @property --tw-translate-x { syntax: "*"; inherits: false; @@ -1302,6 +1399,7 @@ --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; + --tw-outline-style: solid; --tw-translate-x: 0; --tw-translate-y: 0; --tw-translate-z: 0; diff --git a/templates/_macros.html b/templates/_macros.html index 12ee54e..0f38d4b 100644 --- a/templates/_macros.html +++ b/templates/_macros.html @@ -26,6 +26,7 @@

{{ trans(key="conference", lang=lang) }} {{ trans(key="archive", lang=lang) }} {{ trans(key="community", lang=lang) }} + {{ trans(key="ecosystem", lang=lang) }}
@@ -98,6 +99,7 @@

{{ trans(key="conference", lang=lang) }} {{ trans(key="archive", lang=lang) }} {{ trans(key="community", lang=lang) }} + {{ trans(key="ecosystem", lang=lang) }}
diff --git a/templates/ecosystem.html b/templates/ecosystem.html new file mode 100644 index 0000000..9092de0 --- /dev/null +++ b/templates/ecosystem.html @@ -0,0 +1,83 @@ +{% extends "_base.html" %} + +{% block page_title %}{{ section.title }} - Munich Embedded{% endblock %} + +{% block content %} + + + +
+ +
+ + +{% endblock %} From d86e30b0d715a5ddbd557b854449c5d9503136c9 Mon Sep 17 00:00:00 2001 From: JuliDi <20155974+JuliDi@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:10:34 +0100 Subject: [PATCH 02/14] switch to OSM directly and serve leaflet from server --- static/vendor/leaflet/leaflet.css | 661 +++++++++++++++++++++++ static/vendor/leaflet/leaflet.js | 6 + static/vendor/leaflet/marker-icon-2x.png | Bin 0 -> 2464 bytes static/vendor/leaflet/marker-icon.png | Bin 0 -> 1466 bytes static/vendor/leaflet/marker-shadow.png | Bin 0 -> 618 bytes templates/ecosystem.html | 17 +- 6 files changed, 678 insertions(+), 6 deletions(-) create mode 100644 static/vendor/leaflet/leaflet.css create mode 100644 static/vendor/leaflet/leaflet.js create mode 100644 static/vendor/leaflet/marker-icon-2x.png create mode 100644 static/vendor/leaflet/marker-icon.png create mode 100644 static/vendor/leaflet/marker-shadow.png diff --git a/static/vendor/leaflet/leaflet.css b/static/vendor/leaflet/leaflet.css new file mode 100644 index 0000000..2961b76 --- /dev/null +++ b/static/vendor/leaflet/leaflet.css @@ -0,0 +1,661 @@ +/* required styles */ + +.leaflet-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-container, +.leaflet-pane > svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +/* Prevents IE11 from highlighting tiles in blue */ +.leaflet-tile::selection { + background: transparent; +} +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; + } +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg { + max-width: none !important; + max-height: none !important; + } +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer, +.leaflet-container .leaflet-tile { + max-width: none !important; + max-height: none !important; + width: auto; + padding: 0; + } + +.leaflet-container img.leaflet-tile { + /* See: https://bugs.chromium.org/p/chromium/issues/detail?id=600120 */ + mix-blend-mode: plus-lighter; +} + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; + } +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + /* Fallback for FF which doesn't support pinch-zoom */ + touch-action: none; + touch-action: pinch-zoom; +} +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} +.leaflet-container { + -webkit-tap-highlight-color: transparent; +} +.leaflet-container a { + -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); +} +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-pane { z-index: 400; } + +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-tooltip-pane { z-index: 650; } +.leaflet-popup-pane { z-index: 700; } + +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } + +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } +svg.leaflet-zoom-animated { + will-change: transform; +} + +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; + } +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; + } +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; + } + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; + } + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive, +svg.leaflet-image-layer.leaflet-interactive path { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline-offset: 1px; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + font-size: 12px; + font-size: 0.75rem; + line-height: 1.5; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover, +.leaflet-bar a:focus { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; + } +.leaflet-touch .leaflet-bar a:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } +.leaflet-touch .leaflet-bar a:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + } + +.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { + font-size: 22px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.leaflet-control-layers-toggle { + background-image: url(images/layers.png); + width: 36px; + height: 36px; + } +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(images/layers-2x.png); + background-size: 26px 26px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + font-size: 13px; + font-size: 1.08333em; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */ + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.8); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + line-height: 1.4; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover, +.leaflet-control-attribution a:focus { + text-decoration: underline; + } +.leaflet-attribution-flag { + display: inline !important; + vertical-align: baseline !important; + width: 1em; + height: 0.6669em; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + white-space: nowrap; + -moz-box-sizing: border-box; + box-sizing: border-box; + background: rgba(255, 255, 255, 0.8); + text-shadow: 1px 1px #fff; + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 24px 13px 20px; + line-height: 1.3; + font-size: 13px; + font-size: 1.08333em; + min-height: 1px; + } +.leaflet-popup-content p { + margin: 17px 0; + margin: 1.3em 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-top: -1px; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + pointer-events: auto; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + border: none; + text-align: center; + width: 24px; + height: 24px; + font: 16px/24px Tahoma, Verdana, sans-serif; + color: #757575; + text-decoration: none; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover, +.leaflet-container a.leaflet-popup-close-button:focus { + color: #585858; + } +.leaflet-popup-scrolled { + overflow: auto; + } + +.leaflet-oldie .leaflet-popup-content-wrapper { + -ms-zoom: 1; + } +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + } + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } +.leaflet-tooltip.leaflet-interactive { + cursor: pointer; + pointer-events: auto; + } +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; + } + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} +.leaflet-tooltip-top { + margin-top: -6px; +} +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; + } +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; + } +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; + } +.leaflet-tooltip-left { + margin-left: -6px; +} +.leaflet-tooltip-right { + margin-left: 6px; +} +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; + } +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; + } +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; + } + +/* Printing */ + +@media print { + /* Prevent printers from removing background-images of controls. */ + .leaflet-control { + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + } + } diff --git a/static/vendor/leaflet/leaflet.js b/static/vendor/leaflet/leaflet.js new file mode 100644 index 0000000..a3bf693 --- /dev/null +++ b/static/vendor/leaflet/leaflet.js @@ -0,0 +1,6 @@ +/* @preserve + * Leaflet 1.9.4, a JS library for interactive maps. https://leafletjs.com + * (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).leaflet={})}(this,function(t){"use strict";function l(t){for(var e,i,n=1,o=arguments.length;n=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>=e.x&&n.x<=i.x,t=t.y>=e.y&&n.y<=i.y;return o&&t},overlaps:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>e.x&&n.xe.y&&n.y=n.lat&&i.lat<=o.lat&&e.lng>=n.lng&&i.lng<=o.lng},intersects:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>=e.lat&&n.lat<=i.lat,t=t.lng>=e.lng&&n.lng<=i.lng;return o&&t},overlaps:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>e.lat&&n.late.lng&&n.lng","http://www.w3.org/2000/svg"===(Wt.firstChild&&Wt.firstChild.namespaceURI));function y(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var b={ie:pt,ielt9:mt,edge:n,webkit:ft,android:gt,android23:vt,androidStock:yt,opera:xt,chrome:wt,gecko:bt,safari:Pt,phantom:Lt,opera12:o,win:Tt,ie3d:Mt,webkit3d:zt,gecko3d:_t,any3d:Ct,mobile:Zt,mobileWebkit:St,mobileWebkit3d:Et,msPointer:kt,pointer:Ot,touch:Bt,touchNative:At,mobileOpera:It,mobileGecko:Rt,retina:Nt,passiveEvents:Dt,canvas:jt,svg:Ht,vml:!Ht&&function(){try{var t=document.createElement("div"),e=(t.innerHTML='',t.firstChild);return e.style.behavior="url(#default#VML)",e&&"object"==typeof e.adj}catch(t){return!1}}(),inlineSvg:Wt,mac:0===navigator.platform.indexOf("Mac"),linux:0===navigator.platform.indexOf("Linux")},Ft=b.msPointer?"MSPointerDown":"pointerdown",Ut=b.msPointer?"MSPointerMove":"pointermove",Vt=b.msPointer?"MSPointerUp":"pointerup",qt=b.msPointer?"MSPointerCancel":"pointercancel",Gt={touchstart:Ft,touchmove:Ut,touchend:Vt,touchcancel:qt},Kt={touchstart:function(t,e){e.MSPOINTER_TYPE_TOUCH&&e.pointerType===e.MSPOINTER_TYPE_TOUCH&&O(e);ee(t,e)},touchmove:ee,touchend:ee,touchcancel:ee},Yt={},Xt=!1;function Jt(t,e,i){return"touchstart"!==e||Xt||(document.addEventListener(Ft,$t,!0),document.addEventListener(Ut,Qt,!0),document.addEventListener(Vt,te,!0),document.addEventListener(qt,te,!0),Xt=!0),Kt[e]?(i=Kt[e].bind(this,i),t.addEventListener(Gt[e],i,!1),i):(console.warn("wrong event specified:",e),u)}function $t(t){Yt[t.pointerId]=t}function Qt(t){Yt[t.pointerId]&&(Yt[t.pointerId]=t)}function te(t){delete Yt[t.pointerId]}function ee(t,e){if(e.pointerType!==(e.MSPOINTER_TYPE_MOUSE||"mouse")){for(var i in e.touches=[],Yt)e.touches.push(Yt[i]);e.changedTouches=[e],t(e)}}var ie=200;function ne(t,i){t.addEventListener("dblclick",i);var n,o=0;function e(t){var e;1!==t.detail?n=t.detail:"mouse"===t.pointerType||t.sourceCapabilities&&!t.sourceCapabilities.firesTouchEvents||((e=Ne(t)).some(function(t){return t instanceof HTMLLabelElement&&t.attributes.for})&&!e.some(function(t){return t instanceof HTMLInputElement||t instanceof HTMLSelectElement})||((e=Date.now())-o<=ie?2===++n&&i(function(t){var e,i,n={};for(i in t)e=t[i],n[i]=e&&e.bind?e.bind(t):e;return(t=n).type="dblclick",n.detail=2,n.isTrusted=!1,n._simulated=!0,n}(t)):n=1,o=e))}return t.addEventListener("click",e),{dblclick:i,simDblclick:e}}var oe,se,re,ae,he,le,ue=we(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ce=we(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),de="webkitTransition"===ce||"OTransition"===ce?ce+"End":"transitionend";function _e(t){return"string"==typeof t?document.getElementById(t):t}function pe(t,e){var i=t.style[e]||t.currentStyle&&t.currentStyle[e];return"auto"===(i=i&&"auto"!==i||!document.defaultView?i:(t=document.defaultView.getComputedStyle(t,null))?t[e]:null)?null:i}function P(t,e,i){t=document.createElement(t);return t.className=e||"",i&&i.appendChild(t),t}function T(t){var e=t.parentNode;e&&e.removeChild(t)}function me(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function fe(t){var e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)}function ge(t){var e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)}function ve(t,e){return void 0!==t.classList?t.classList.contains(e):0<(t=xe(t)).length&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t)}function M(t,e){var i;if(void 0!==t.classList)for(var n=F(e),o=0,s=n.length;othis.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,e){this._enforcingBounds=!0;var i=this.getCenter(),t=this._limitCenter(i,this._zoom,g(t));return i.equals(t)||this.panTo(t,e),this._enforcingBounds=!1,this},panInside:function(t,e){var i=m((e=e||{}).paddingTopLeft||e.padding||[0,0]),n=m(e.paddingBottomRight||e.padding||[0,0]),o=this.project(this.getCenter()),t=this.project(t),s=this.getPixelBounds(),i=_([s.min.add(i),s.max.subtract(n)]),s=i.getSize();return i.contains(t)||(this._enforcingBounds=!0,n=t.subtract(i.getCenter()),i=i.extend(t).getSize().subtract(s),o.x+=n.x<0?-i.x:i.x,o.y+=n.y<0?-i.y:i.y,this.panTo(this.unproject(o),e),this._enforcingBounds=!1),this},invalidateSize:function(t){if(!this._loaded)return this;t=l({animate:!1,pan:!0},!0===t?{animate:!0}:t);var e=this.getSize(),i=(this._sizeChanged=!0,this._lastCenter=null,this.getSize()),n=e.divideBy(2).round(),o=i.divideBy(2).round(),n=n.subtract(o);return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(a(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){var e,i;return t=this._locateOptions=l({timeout:1e4,watch:!1},t),"geolocation"in navigator?(e=a(this._handleGeolocationResponse,this),i=a(this._handleGeolocationError,this),t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t)):this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e;this._container._leaflet_id&&(e=t.code,t=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout"),this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+t+"."}))},_handleGeolocationResponse:function(t){if(this._container._leaflet_id){var e,i,n=new v(t.coords.latitude,t.coords.longitude),o=n.toBounds(2*t.coords.accuracy),s=this._locateOptions,r=(s.setView&&(e=this.getBoundsZoom(o),this.setView(n,s.maxZoom?Math.min(e,s.maxZoom):e)),{latlng:n,bounds:o,timestamp:t.timestamp});for(i in t.coords)"number"==typeof t.coords[i]&&(r[i]=t.coords[i]);this.fire("locationfound",r)}},addHandler:function(t,e){return e&&(e=this[t]=new e(this),this._handlers.push(e),this.options[t]&&e.enable()),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}for(var t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),T(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(r(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)T(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,e){e=P("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),e||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new s(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=g(t),i=m(i||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),t=t.getSouthEast(),i=this.getSize().subtract(i),t=_(this.project(t,n),this.project(r,n)).getSize(),r=b.any3d?this.options.zoomSnap:1,a=i.x/t.x,i=i.y/t.y,t=e?Math.max(a,i):Math.min(a,i),n=this.getScaleZoom(t,n);return r&&(n=Math.round(n/(r/100))*(r/100),n=e?Math.ceil(n/r)*r:Math.floor(n/r)*r),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new p(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,e){t=this._getTopLeftPoint(t,e);return new f(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,e){var i=this.options.crs;return e=void 0===e?this._zoom:e,i.scale(t)/i.scale(e)},getScaleZoom:function(t,e){var i=this.options.crs,t=(e=void 0===e?this._zoom:e,i.zoom(t*i.scale(e)));return isNaN(t)?1/0:t},project:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.latLngToPoint(w(t),e)},unproject:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.pointToLatLng(m(t),e)},layerPointToLatLng:function(t){t=m(t).add(this.getPixelOrigin());return this.unproject(t)},latLngToLayerPoint:function(t){return this.project(w(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(w(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(g(t))},distance:function(t,e){return this.options.crs.distance(w(t),w(e))},containerPointToLayerPoint:function(t){return m(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return m(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){t=this.containerPointToLayerPoint(m(t));return this.layerPointToLatLng(t)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(w(t)))},mouseEventToContainerPoint:function(t){return De(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){t=this._container=_e(t);if(!t)throw new Error("Map container not found.");if(t._leaflet_id)throw new Error("Map container is already initialized.");S(t,"scroll",this._onScroll,this),this._containerId=h(t)},_initLayout:function(){var t=this._container,e=(this._fadeAnimated=this.options.fadeAnimation&&b.any3d,M(t,"leaflet-container"+(b.touch?" leaflet-touch":"")+(b.retina?" leaflet-retina":"")+(b.ielt9?" leaflet-oldie":"")+(b.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":"")),pe(t,"position"));"absolute"!==e&&"relative"!==e&&"fixed"!==e&&"sticky"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),Z(this._mapPane,new p(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(M(t.markerPane,"leaflet-zoom-hide"),M(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,e,i){Z(this._mapPane,new p(0,0));var n=!this._loaded,o=(this._loaded=!0,e=this._limitZoom(e),this.fire("viewprereset"),this._zoom!==e);this._moveStart(o,i)._move(t,e)._moveEnd(o),this.fire("viewreset"),n&&this.fire("load")},_moveStart:function(t,e){return t&&this.fire("zoomstart"),e||this.fire("movestart"),this},_move:function(t,e,i,n){void 0===e&&(e=this._zoom);var o=this._zoom!==e;return this._zoom=e,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),n?i&&i.pinch&&this.fire("zoom",i):((o||i&&i.pinch)&&this.fire("zoom",i),this.fire("move",i)),this},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return r(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){Z(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={};var e=t?k:S;e((this._targets[h(this._container)]=this)._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&e(window,"resize",this._onResize,this),b.any3d&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){r(this._resizeRequest),this._resizeRequest=x(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var i,n=[],o="mouseout"===e||"mouseover"===e,s=t.target||t.srcElement,r=!1;s;){if((i=this._targets[h(s)])&&("click"===e||"preclick"===e)&&this._draggableMoved(i)){r=!0;break}if(i&&i.listens(e,!0)){if(o&&!We(s,t))break;if(n.push(i),o)break}if(s===this._container)break;s=s.parentNode}return n=n.length||r||o||!this.listens(e,!0)?n:[this]},_isClickDisabled:function(t){for(;t&&t!==this._container;){if(t._leaflet_disable_click)return!0;t=t.parentNode}},_handleDOMEvent:function(t){var e,i=t.target||t.srcElement;!this._loaded||i._leaflet_disable_events||"click"===t.type&&this._isClickDisabled(i)||("mousedown"===(e=t.type)&&Me(i),this._fireDOMEvent(t,e))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,i){"click"===t.type&&((a=l({},t)).type="preclick",this._fireDOMEvent(a,a.type,i));var n=this._findEventTargets(t,e);if(i){for(var o=[],s=0;sthis.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),n=this._getCenterOffset(t)._divideBy(1-1/n);if(!0!==i.animate&&!this.getSize().contains(n))return!1;x(function(){this._moveStart(!0,i.noMoveStart||!1)._animateZoom(t,e,!0)},this)}return!0},_animateZoom:function(t,e,i,n){this._mapPane&&(i&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,M(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:n}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(a(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&z(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Ue(t){return new B(t)}var B=et.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),t=t._controlCorners[i];return M(e,"leaflet-control"),-1!==i.indexOf("bottom")?t.insertBefore(e,t.firstChild):t.appendChild(e),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(T(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",e=document.createElement("div");return e.innerHTML=t,e.firstChild},_addItem:function(t){var e,i=document.createElement("label"),n=this._map.hasLayer(t.layer),n=(t.overlay?((e=document.createElement("input")).type="checkbox",e.className="leaflet-control-layers-selector",e.defaultChecked=n):e=this._createRadioElement("leaflet-base-layers_"+h(this),n),this._layerControlInputs.push(e),e.layerId=h(t.layer),S(e,"click",this._onInputClick,this),document.createElement("span")),o=(n.innerHTML=" "+t.name,document.createElement("span"));return i.appendChild(o),o.appendChild(e),o.appendChild(n),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(i),this._checkDisabledLayers(),i},_onInputClick:function(){if(!this._preventClick){var t,e,i=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=i.length-1;0<=s;s--)t=i[s],e=this._getLayer(t.layerId).layer,t.checked?n.push(e):t.checked||o.push(e);for(s=0;se.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var t=this._section,e=(this._preventClick=!0,S(t,"click",O),this.expand(),this);setTimeout(function(){k(t,"click",O),e._preventClick=!1})}})),qe=B.extend({options:{position:"topleft",zoomInText:'',zoomInTitle:"Zoom in",zoomOutText:'',zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=P("div",e+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,e+"-in",i,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,e+"-out",i,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,i,n,o){i=P("a",i,n);return i.innerHTML=t,i.href="#",i.title=e,i.setAttribute("role","button"),i.setAttribute("aria-label",e),Ie(i),S(i,"click",Re),S(i,"click",o,this),S(i,"click",this._refocusOnMap,this),i},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";z(this._zoomInButton,e),z(this._zoomOutButton,e),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),!this._disabled&&t._zoom!==t.getMinZoom()||(M(this._zoomOutButton,e),this._zoomOutButton.setAttribute("aria-disabled","true")),!this._disabled&&t._zoom!==t.getMaxZoom()||(M(this._zoomInButton,e),this._zoomInButton.setAttribute("aria-disabled","true"))}}),Ge=(A.mergeOptions({zoomControl:!0}),A.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new qe,this.addControl(this.zoomControl))}),B.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e="leaflet-control-scale",i=P("div",e),n=this.options;return this._addScales(n,e+"-line",i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=P("div",e,i)),t.imperial&&(this._iScale=P("div",e,i))},_update:function(){var t=this._map,e=t.getSize().y/2,t=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(t)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t);this._updateScale(this._mScale,e<1e3?e+" m":e/1e3+" km",e/t)},_updateImperial:function(t){var e,i,t=3.2808399*t;5280'+(b.inlineSvg?' ':"")+"Leaflet"},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var e in(t.attributionControl=this)._container=P("div","leaflet-control-attribution"),Ie(this._container),t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),t.on("layeradd",this._addAttribution,this),this._container},onRemove:function(t){t.off("layeradd",this._addAttribution,this)},_addAttribution:function(t){t.layer.getAttribution&&(this.addAttribution(t.layer.getAttribution()),t.layer.once("remove",function(){this.removeAttribution(t.layer.getAttribution())},this))},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t,e=[];for(t in this._attributions)this._attributions[t]&&e.push(t);var i=[];this.options.prefix&&i.push(this.options.prefix),e.length&&i.push(e.join(", ")),this._container.innerHTML=i.join(' ')}}}),n=(A.mergeOptions({attributionControl:!0}),A.addInitHook(function(){this.options.attributionControl&&(new Ke).addTo(this)}),B.Layers=Ve,B.Zoom=qe,B.Scale=Ge,B.Attribution=Ke,Ue.layers=function(t,e,i){return new Ve(t,e,i)},Ue.zoom=function(t){return new qe(t)},Ue.scale=function(t){return new Ge(t)},Ue.attribution=function(t){return new Ke(t)},et.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}})),ft=(n.addTo=function(t,e){return t.addHandler(e,this),this},{Events:e}),Ye=b.touch?"touchstart mousedown":"mousedown",Xe=it.extend({options:{clickTolerance:3},initialize:function(t,e,i,n){c(this,n),this._element=t,this._dragStartTarget=e||t,this._preventOutline=i},enable:function(){this._enabled||(S(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Xe._dragging===this&&this.finishDrag(!0),k(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var e,i;this._enabled&&(this._moved=!1,ve(this._element,"leaflet-zoom-anim")||(t.touches&&1!==t.touches.length?Xe._dragging===this&&this.finishDrag():Xe._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((Xe._dragging=this)._preventOutline&&Me(this._element),Le(),re(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=Ce(this._element),this._startPoint=new p(i.clientX,i.clientY),this._startPos=Pe(this._element),this._parentScale=Ze(e),i="mousedown"===t.type,S(document,i?"mousemove":"touchmove",this._onMove,this),S(document,i?"mouseup":"touchend touchcancel",this._onUp,this)))))},_onMove:function(t){var e;this._enabled&&(t.touches&&1e&&(i.push(t[n]),o=n);oe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i}function ri(t,e,i,n){var o=e.x,e=e.y,s=i.x-o,r=i.y-e,a=s*s+r*r;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(l=!l);return l||yi.prototype._containsPoint.call(this,t,!0)}});var wi=ci.extend({initialize:function(t,e){c(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,o=d(t)?t:t.features;if(o){for(e=0,i=o.length;es.x&&(r=i.x+a-s.x+o.x),i.x-r-n.x<(a=0)&&(r=i.x-n.x),i.y+e+o.y>s.y&&(a=i.y+e-s.y+o.y),i.y-a-n.y<0&&(a=i.y-n.y),(r||a)&&(this.options.keepInView&&(this._autopanning=!0),t.fire("autopanstart").panBy([r,a]))))},_getAnchor:function(){return m(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}})),Ii=(A.mergeOptions({closePopupOnClick:!0}),A.include({openPopup:function(t,e,i){return this._initOverlay(Bi,t,e,i).openOn(this),this},closePopup:function(t){return(t=arguments.length?t:this._popup)&&t.close(),this}}),o.include({bindPopup:function(t,e){return this._popup=this._initOverlay(Bi,this._popup,t,e),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t){return this._popup&&(this instanceof ci||(this._popup._source=this),this._popup._prepareOpen(t||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e;this._popup&&this._map&&(Re(t),e=t.layer||t.target,this._popup._source!==e||e instanceof fi?(this._popup._source=e,this.openPopup(t.latlng)):this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}}),Ai.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(t){Ai.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(t){Ai.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var t=Ai.prototype.getEvents.call(this);return this.options.permanent||(t.preclick=this.close),t},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=P("div",t),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+h(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e,i=this._map,n=this._container,o=i.latLngToContainerPoint(i.getCenter()),i=i.layerPointToContainerPoint(t),s=this.options.direction,r=n.offsetWidth,a=n.offsetHeight,h=m(this.options.offset),l=this._getAnchor(),i="top"===s?(e=r/2,a):"bottom"===s?(e=r/2,0):(e="center"===s?r/2:"right"===s?0:"left"===s?r:i.xthis.options.maxZoom||nthis.options.maxZoom||void 0!==this.options.minZoom&&oi.max.x)||!e.wrapLat&&(t.yi.max.y))return!1}return!this.options.bounds||(e=this._tileCoordsToBounds(t),g(this.options.bounds).overlaps(e))},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var e=this._map,i=this.getTileSize(),n=t.scaleBy(i),i=n.add(i);return[e.unproject(n,t.z),e.unproject(i,t.z)]},_tileCoordsToBounds:function(t){t=this._tileCoordsToNwSe(t),t=new s(t[0],t[1]);return t=this.options.noWrap?t:this._map.wrapLatLngBounds(t)},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var t=t.split(":"),e=new p(+t[0],+t[1]);return e.z=+t[2],e},_removeTile:function(t){var e=this._tiles[t];e&&(T(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){M(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=u,t.onmousemove=u,b.ielt9&&this.options.opacity<1&&C(t,this.options.opacity)},_addTile:function(t,e){var i=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),a(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&x(a(this._tileReady,this,t,null,o)),Z(o,i),this._tiles[n]={el:o,coords:t,current:!0},e.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,e,i){e&&this.fire("tileerror",{error:e,tile:i,coords:t});var n=this._tileCoordsToKey(t);(i=this._tiles[n])&&(i.loaded=+new Date,this._map._fadeAnimated?(C(i.el,0),r(this._fadeFrame),this._fadeFrame=x(this._updateOpacity,this)):(i.active=!0,this._pruneTiles()),e||(M(i.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:i.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),b.ielt9||!this._map._fadeAnimated?x(this._pruneTiles,this):setTimeout(a(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new p(this._wrapX?H(t.x,this._wrapX):t.x,this._wrapY?H(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new f(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var Di=Ni.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(t,e){this._url=t,(e=c(this,e)).detectRetina&&b.retina&&0')}}catch(t){}return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}(),zt={_initContainer:function(){this._container=P("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(Wi.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=Vi("shape");M(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=Vi("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;T(e),t.removeInteractiveTarget(e),delete this._layers[h(t)]},_updateStyle:function(t){var e=t._stroke,i=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(e=e||(t._stroke=Vi("stroke")),o.appendChild(e),e.weight=n.weight+"px",e.color=n.color,e.opacity=n.opacity,n.dashArray?e.dashStyle=d(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):e.dashStyle="",e.endcap=n.lineCap.replace("butt","flat"),e.joinstyle=n.lineJoin):e&&(o.removeChild(e),t._stroke=null),n.fill?(i=i||(t._fill=Vi("fill")),o.appendChild(i),i.color=n.fillColor||n.color,i.opacity=n.fillOpacity):i&&(o.removeChild(i),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),i=Math.round(t._radius),n=Math.round(t._radiusY||i);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+i+","+n+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){fe(t._container)},_bringToBack:function(t){ge(t._container)}},qi=b.vml?Vi:ct,Gi=Wi.extend({_initContainer:function(){this._container=qi("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=qi("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){T(this._container),k(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){var t,e,i;this._map._animatingZoom&&this._bounds||(Wi.prototype._update.call(this),e=(t=this._bounds).getSize(),i=this._container,this._svgSize&&this._svgSize.equals(e)||(this._svgSize=e,i.setAttribute("width",e.x),i.setAttribute("height",e.y)),Z(i,t.min),i.setAttribute("viewBox",[t.min.x,t.min.y,e.x,e.y].join(" ")),this.fire("update"))},_initPath:function(t){var e=t._path=qi("path");t.options.className&&M(e,t.options.className),t.options.interactive&&M(e,"leaflet-interactive"),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){T(t._path),t.removeInteractiveTarget(t._path),delete this._layers[h(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var e=t._path,t=t.options;e&&(t.stroke?(e.setAttribute("stroke",t.color),e.setAttribute("stroke-opacity",t.opacity),e.setAttribute("stroke-width",t.weight),e.setAttribute("stroke-linecap",t.lineCap),e.setAttribute("stroke-linejoin",t.lineJoin),t.dashArray?e.setAttribute("stroke-dasharray",t.dashArray):e.removeAttribute("stroke-dasharray"),t.dashOffset?e.setAttribute("stroke-dashoffset",t.dashOffset):e.removeAttribute("stroke-dashoffset")):e.setAttribute("stroke","none"),t.fill?(e.setAttribute("fill",t.fillColor||t.color),e.setAttribute("fill-opacity",t.fillOpacity),e.setAttribute("fill-rule",t.fillRule||"evenodd")):e.setAttribute("fill","none"))},_updatePoly:function(t,e){this._setPath(t,dt(t._parts,e))},_updateCircle:function(t){var e=t._point,i=Math.max(Math.round(t._radius),1),n="a"+i+","+(Math.max(Math.round(t._radiusY),1)||i)+" 0 1,0 ",e=t._empty()?"M0 0":"M"+(e.x-i)+","+e.y+n+2*i+",0 "+n+2*-i+",0 ";this._setPath(t,e)},_setPath:function(t,e){t._path.setAttribute("d",e)},_bringToFront:function(t){fe(t._path)},_bringToBack:function(t){ge(t._path)}});function Ki(t){return b.svg||b.vml?new Gi(t):null}b.vml&&Gi.include(zt),A.include({getRenderer:function(t){t=(t=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(t)||this.addLayer(t),t},_getPaneRenderer:function(t){var e;return"overlayPane"!==t&&void 0!==t&&(void 0===(e=this._paneRenderers[t])&&(e=this._createRenderer({pane:t}),this._paneRenderers[t]=e),e)},_createRenderer:function(t){return this.options.preferCanvas&&Ui(t)||Ki(t)}});var Yi=xi.extend({initialize:function(t,e){xi.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=g(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});Gi.create=qi,Gi.pointsToPath=dt,wi.geometryToLayer=bi,wi.coordsToLatLng=Li,wi.coordsToLatLngs=Ti,wi.latLngToCoords=Mi,wi.latLngsToCoords=zi,wi.getFeature=Ci,wi.asFeature=Zi,A.mergeOptions({boxZoom:!0});var _t=n.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){S(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){k(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){T(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),re(),Le(),this._startPoint=this._map.mouseEventToContainerPoint(t),S(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=P("div","leaflet-zoom-box",this._container),M(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var t=new f(this._point,this._startPoint),e=t.getSize();Z(this._box,t.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(T(this._box),z(this._container,"leaflet-crosshair")),ae(),Te(),k(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(a(this._resetState,this),0),t=new s(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(t).fire("boxzoomend",{boxZoomBounds:t})))},_onKeyDown:function(t){27===t.keyCode&&(this._finish(),this._clearDeferredResetState(),this._resetState())}}),Ct=(A.addInitHook("addHandler","boxZoom",_t),A.mergeOptions({doubleClickZoom:!0}),n.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom(),n=e.options.zoomDelta,i=t.originalEvent.shiftKey?i-n:i+n;"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}})),Zt=(A.addInitHook("addHandler","doubleClickZoom",Ct),A.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0}),n.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new Xe(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),M(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){z(this._map._container,"leaflet-grab"),z(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,e=this._map;e._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=g(this._map.options.maxBounds),this._offsetLimit=_(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,e.fire("movestart").fire("dragstart"),e.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var e,i;this._map.options.inertia&&(e=this._lastTime=+new Date,i=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(i),this._times.push(e),this._prunePositions(e)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1e.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,n=(n+e+i)%t-e-i,t=Math.abs(o+i)e.getMaxZoom()&&1YnU^5s62$4H-fe}gSR(=wKRaTHh!@*b)YV6mo|a4Fn6Rgc&Rpk zvn_X|3VY?v=>nJ{slE^V1GaGWk}m@aIWGIpghbfPh8m@aIWEo_%AZI>==moIFVE^L=C zZJ91?mo03UEp3-BY?wBGur6$uD{Yr9Y?m%SHF8Fk1pc(Nva%QJ+{FLkalfypz3&M|||Fn`7|g3c~4(nXHKFmRnwn$J#_$xE8i z|Ns9!kC;(oC1qQk>LMp3_a2(odYyMT@>voX=UI)k>1cJdn;gjmJ-|6v4nb1Oryh)eQMwHP(i@!36%vGJyFK(JTj?Vb{{C=jx&)@1l zlFmnw%0`&bqruifkkHKC=vbiAM3&E`#Mv>2%tw;VK8?_|&E89cs{a1}$J*!f_xd-C z&F%B|oxRgPlh0F!txkxrQjNA`m9~?&&|jw4W0<`_iNHsX$VQXVK!B}Xkh4>av|f_8 zLY2?t?ejE=%(TnfV5iqOjm?d;&qI~ZGl|SzU77a)002XDQchC<95+*MjE@82?VLm= z3xf6%Vd@99z|q|-ua5l3kJxvZwan-8K1cPiwQAtlcNX~ZqLeoMB+a;7)WA|O#HOB% zg6SX;754xD1{Fy}K~#8Ntklac&zTpadXZ& zC*_=T&g7hfbI$R?v%9?sknIb97gJOJ=`-8YyS3ndqN+Jm+x33!p&Hc@@L$w))s2@N ztv~i}Emc?DykgwFWwma($8+~b>l?tqj$dh13R^nMZnva9 zn0Vflzv2Dvp`oVQw{Guby~i`JGbyBGTEC{y>yzCkg>K&CIeQ$u;lyQ+M{O~gEJ^)Z zrF3p)^>|uT;57}WY&IRwyOQ=dq%Az}_t=_hKowP!Z79q0;@Zu(SWEJJcHY+5T6I({ zw)wj*SNi4wrd+POUfZe4gF77vW?j zoFS}|r2n&$U9Y!S4VEOyN}OpZZi|?cr1VcE_tHsDQgp-ga(SwkBrkCm{|*-yb=}ZW zvcYvLvfA90TPn|!-TuYJV<6`}+RJeRgP3EA=qQcF9k0*#*{f&I_pjam%I6Dd#YE|G zqB!R}tW-K!wV1w+4JcFA_s6~=@9F&j8`u$-ifLN3vK;`lvaA-`jRn_}(8|)!3?-}I zvFi{H;@A$gEZYh?%|Qr_y#*UkOPjwiRCsJQ>mb6h5yGIk6C5_XA=8T?IBfm_?+P0; zhhUs)-(0R*H<&Kku(1>#cGtOpk&Z&kQcw&SJv-4VY<+;=8hYnoX zfNJMCa9)^5Z0;2dCUk;x-%#yS!I~Jr3pNuI!g_tHz!$hKwt1GL~sFvx)3u4TA zv>CLGdQtoZ7Du7ctJRfTqY;FPxs1G{ZJ?73D5J@OO{6BHcPbk{_mjg&p2QFeke%QI zlAJ-kvjuwy1<5D-6>su68A+i998aSZNnQX)+Q}6(GK-C%8G-!1bOJBONU{gT%IOOE z;Yk24YC@^lFW77>r6x7eS1Omc;8=GUp#&zLQ&L{ zv8$hGC`wp~$9pR>f%-_Ps3>YhzP(+vC(E*zr1CVO8ChN^MI-VGMX7+|(r!SGZ9gd5 zzO9sQd>sm|f1|X&oh=8lOzd6+ITvo zCXInR?>RZ#>Hb*PO=7dI!dZ(wY4O}ZGv zdfQFio7+0~PN*RFCZGM6@9-o~y*@?;k00NvOsw54t1^tt{*ATMs^2j}4Wp=4t3RH* z_+8b`F-{E=0sOgM<;VHTo!Ij3u zmmI`2?K7g(GOcGA)@h?$SW&pwHdtj1n57PLI8&6RHhx4R%Q7b z^JEqR)@06V!pbS*@D_ZyRMo_LlT}r{#sXOx4kM-V<_V{!5SSuM^SIVCA37|nY7LWQ zZA#B1h4l`6asz=Lvax_#GMRX|NF>=$=p{Qn0i@ExX1jGhy@B8a*_uR+ODEbVi8ObL zezG?azy>E~S~dl43&8<$(2H}P&*tuBdESUP83KQ?8B z?K(!uS>H1wlWQz;qOfB`T#TZ=EoSp~vZ5XtCvwm1h*Ex6mzTsn_y@_=xREIslV-%- zpdWkEzMjeNOGWrSM32gpBt27*O29NdhGzuDgYxcf`Jjjqw@B;Vmdb@fxdhCRi`Kg> zmUTr$=&@#i!%F4Q6mb&4QKfR^95KJ!<6~fqx-f^66AV!|ywG{6D^Vay-3b99>XOe# e-I|>x8~*?ZhF3snGbtJX0000cOl4 literal 0 HcmV?d00001 diff --git a/static/vendor/leaflet/marker-icon.png b/static/vendor/leaflet/marker-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..950edf24677ded147df13b26f91baa2b0fa70513 GIT binary patch literal 1466 zcmV;r1x5OaP)P001cn1^@s6z>|W`000GnNklGNuHDcIX17Zdjl&3`L?0sTjIws<{((Dh&g-s0<@jYQyl?D*X^?%13;ml^gy> ziMrY_^1WI=(g@LMizu=zCoA>C`6|QEq1eV92k*7m>G65*&@&6)aC&e}G zI)pf-Za|N`DT&Cn1J|o`19mumxW~hiKiKyc-P`S@q)rdTo84@QI@;0yXrG%9uhI>A zG5QHb6s4=<6xy{1 z@NMxEkryp{LS44%z$3lP^cX!9+2-;CTt3wM4(k*#C{aiIiLuB>jJj;KPhPzIC00bL zU3a#;aJld94lCW=`4&aAy8M7PY=HQ>O%$YEP4c4UY#CRxfgbE~(|uiI=YS8q;O9y6 zmIkXzR`}p7ti|PrM3a}WMnR=3NVnWdAAR>b9X@)DKL6=YsvmH%?I24wdq?Gh54_;# z$?_LvgjEdspdQlft#4CQ z`2Zyvy?*)N1Ftw|{_hakhG9WjS?Az@I@+IZ8JbWewR!XUK4&6346+d#~gsE0SY(LX8&JfY>Aj)RxGy96nwhs2rv zzW6pTnMpFkDSkT*a*6Dx|u@ds6ISVn0@^RmIsKZ5Y;bazbc;tTSq(kg(=481ODrPyNB6n z-$+U}(w$m6U6H$w17Bw+wDaFIe~GvNMYvnw31MpY0eQKT9l>SU``8k7w4)z!GZKMI z#_cEKq7k~i%nlK@6c-K?+R;B#5$?T#YpKD`t_4bAs^#E+@5QW$@OX3*`;(#{U^d-vY)&xEE>n5lYl&T?Amke9$Lam@{1K@O ze*LXqlKQHiv=gx+V^Cbb2?z@ISBQ*3amF;9UJ3SBg(N|710TLamQmYZ&Qjn2LuO<* zCZlB4n%@pc&7NNnY1}x+NWpHlq`OJEo|`aYN9<`RBUB+79g;>dgb6YlfN#kGL?lO_ z!6~M^7sOnbsUkKk<@Ysie&`G>ruxH&Mgy&8;i=A zB9OO!xR{AyODw>DS-q5YM{0ExFEAzt zm>RdS+ssW(-8|?xr0(?$vBVB*%(xDLtq3Hf0I5yFm<_g=W2`QWAax{1rWVH=I!VrP zs(rTFX@W#t$hXNvbgX`gK&^w_YD;CQ!B@e0QbLIWaKAXQe2-kkloo;{iF#6}z!4=W zi$giRj1{ zt;2w`VSCF#WE&*ev7jpsC=6175@(~nTE2;7M-L((0bH@yG}-TB$R~WXd?tA$s3|%y zA`9$sA(>F%J3ioz<-LJl*^o1|w84l>HBR`>3l9c8$5Xr@xCiIQ7{x$fMCzOk_-M=% z+{a_Q#;42`#KfUte@$NT77uaTz?b-fBe)1s5XE$yA79fm?KqM^VgLXD07*qoM6N<$ Ef<_J(9smFU literal 0 HcmV?d00001 diff --git a/templates/ecosystem.html b/templates/ecosystem.html index 9092de0..2daf86d 100644 --- a/templates/ecosystem.html +++ b/templates/ecosystem.html @@ -3,8 +3,8 @@ {% block page_title %}{{ section.title }} - Munich Embedded{% endblock %} {% block content %} - - + +
@@ -52,12 +52,17 @@

OpenStreetMap contributors © CARTO', - subdomains: 'abcd', - maxZoom: 20 + L.tileLayer('https://tile.openstreetmap.de/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors', + maxZoom: 18 }).addTo(map); var markers = []; From 5637c40dc31cc89bf2b5d27a032c1760baa7a7c2 Mon Sep 17 00:00:00 2001 From: JuliDi <20155974+JuliDi@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:18:33 +0100 Subject: [PATCH 03/14] add geocode script that automatically adds the lat/lon attributes so the pins are at the correct position. --- content/ecosystem/_index.en.md | 38 ++++++++--------- content/ecosystem/_index.md | 38 ++++++++--------- scripts/geocode.sh | 78 ++++++++++++++++++++++++++++++++++ static/css/style.css | 25 ----------- 4 files changed, 116 insertions(+), 63 deletions(-) create mode 100755 scripts/geocode.sh diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index 984f153..100c386 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -5,44 +5,44 @@ template = "ecosystem.html" [[extra.groups]] title = "Large Business" entities = [ - { name = "Analog Devices", url = "https://www.analog.com", description = "Global semiconductor leader bridging the physical and digital worlds to enable breakthroughs at the Intelligent Edge.", address = "Otl-Aicher-Straße 60-64, 80807 München", lat = 48.1868, lon = 11.5985 }, - { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München", lat = 48.1430, lon = 11.5412 }, - { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München", lat = 48.1431, lon = 11.5649 }, - { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg", lat = 48.0785, lon = 11.6155 }, - { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn", lat = 48.1015, lon = 11.7455 } + { name = "Analog Devices", url = "https://www.analog.com", description = "Global semiconductor leader bridging the physical and digital worlds to enable breakthroughs at the Intelligent Edge.", address = "Otl-Aicher-Straße 60-64, 80807 München" , lat = 48.1818, lon = 11.5872 }, + { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, + { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München" , lat = 48.1431, lon = 11.5649 }, + { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg" , lat = 48.0811, lon = 11.6162 }, + { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 } ] [[extra.groups]] title = "Medium/Small Business" entities = [ - { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring", lat = 48.1778, lon = 11.6333 }, - { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "High power charging for e-mobility.", address = "Alte Landstraße 29, 85521 Ottobrunn", lat = 48.0788, lon = 11.6538 }, - { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn", lat = 48.0525, lon = 11.6602 }, - { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München", lat = 48.1485, lon = 11.4782 }, - { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München", lat = 48.1282, lon = 11.6108 }, - { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim", lat = 48.2841, lon = 11.5672 } + { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, + { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "High power charging for e-mobility.", address = "Alte Landstraße 29, 85521 Ottobrunn" , lat = 48.0746, lon = 11.6522 }, + { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, + { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, + { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, + { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } ] [[extra.groups]] title = "Consulting" entities = [ - { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München", lat = 48.1018, lon = 11.5400 }, - { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell", lat = 48.1945, lon = 11.3735 }, - { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn", lat = 48.0620, lon = 11.6690 }, - { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München", lat = 48.1018, lon = 11.5400 } + { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, + { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, + { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 } ] [[extra.groups]] title = "Non-profit" entities = [ - { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Open workshop with digital fabrication tools.", address = "Gollierstraße 70, 80339 München", lat = 48.1348, lon = 11.5345 }, - { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Community network for free wireless internet.", address = "Parkstraße 28, 82131 Gauting", lat = 48.0689, lon = 11.3721 }, - { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Open workshop and community space.", address = "Rosenheimer Str. 5, 81667 München", lat = 48.1315, lon = 11.5915 } + { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Open workshop with digital fabrication tools.", address = "Gollierstraße 70, 80339 München" , lat = 48.1369, lon = 11.5341 }, + { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Community network for free wireless internet.", address = "Parkstraße 28, 82131 Gauting" , lat = 48.0689, lon = 11.3721 }, + { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Open workshop and community space.", address = "Rosenheimer Str. 5, 81667 München" , lat = 48.1316, lon = 11.5908 } ] [[extra.groups]] title = "Meet-ups" entities = [ - { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München", lat = 48.2645, lon = 11.6715 } + { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } ] +++ diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index caca7b9..a3d4984 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -5,44 +5,44 @@ template = "ecosystem.html" [[extra.groups]] title = "Großunternehmen" entities = [ - { name = "Analog Devices", url = "https://www.analog.com", description = "Global semiconductor leader bridging the physical and digital worlds to enable breakthroughs at the Intelligent Edge.", address = "Otl-Aicher-Straße 60-64, 80807 München", lat = 48.1868, lon = 11.5985 }, - { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München", lat = 48.1430, lon = 11.5412 }, - { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München", lat = 48.1431, lon = 11.5649 }, - { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg", lat = 48.0785, lon = 11.6155 }, - { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn", lat = 48.1015, lon = 11.7455 } + { name = "Analog Devices", url = "https://www.analog.com", description = "Global semiconductor leader bridging the physical and digital worlds to enable breakthroughs at the Intelligent Edge.", address = "Otl-Aicher-Straße 60-64, 80807 München" , lat = 48.1818, lon = 11.5872 }, + { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, + { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München" , lat = 48.1431, lon = 11.5649 }, + { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg" , lat = 48.0811, lon = 11.6162 }, + { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 } ] [[extra.groups]] title = "Mittelstand / KMU" entities = [ - { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring", lat = 48.1778, lon = 11.6333 }, - { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "High power charging for e-mobility.", address = "Alte Landstraße 29, 85521 Ottobrunn", lat = 48.0788, lon = 11.6538 }, - { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn", lat = 48.0525, lon = 11.6602 }, - { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München", lat = 48.1485, lon = 11.4782 }, - { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München", lat = 48.1282, lon = 11.6108 }, - { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim", lat = 48.2841, lon = 11.5672 } + { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, + { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "High power charging for e-mobility.", address = "Alte Landstraße 29, 85521 Ottobrunn" , lat = 48.0746, lon = 11.6522 }, + { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, + { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, + { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, + { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } ] [[extra.groups]] title = "Beratung / Dienstleistung" entities = [ - { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München", lat = 48.1018, lon = 11.5400 }, - { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell", lat = 48.1945, lon = 11.3735 }, - { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn", lat = 48.0620, lon = 11.6690 }, - { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München", lat = 48.1018, lon = 11.5400 } + { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, + { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, + { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 } ] [[extra.groups]] title = "Gemeinnützige Organisationen" entities = [ - { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Open workshop with digital fabrication tools.", address = "Gollierstraße 70, 80339 München", lat = 48.1348, lon = 11.5345 }, - { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Community network for free wireless internet.", address = "Parkstraße 28, 82131 Gauting", lat = 48.0689, lon = 11.3721 }, - { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Open workshop and community space.", address = "Rosenheimer Str. 5, 81667 München", lat = 48.1315, lon = 11.5915 } + { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Open workshop with digital fabrication tools.", address = "Gollierstraße 70, 80339 München" , lat = 48.1369, lon = 11.5341 }, + { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Community network for free wireless internet.", address = "Parkstraße 28, 82131 Gauting" , lat = 48.0689, lon = 11.3721 }, + { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Open workshop and community space.", address = "Rosenheimer Str. 5, 81667 München" , lat = 48.1316, lon = 11.5908 } ] [[extra.groups]] title = "Meetups" entities = [ - { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München", lat = 48.2645, lon = 11.6715 } + { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } ] +++ diff --git a/scripts/geocode.sh b/scripts/geocode.sh new file mode 100755 index 0000000..ef7bbef --- /dev/null +++ b/scripts/geocode.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +# Geocodes entities in ecosystem markdown files that have an address but no lat/lon. +# Uses OpenStreetMap Nominatim (free, no API key needed). +# Usage: ./scripts/geocode.sh [-f] [file ...] +# -f Force: re-geocode all entities, even those that already have lat/lon +# If no files given, processes all ecosystem _index*.md files. + +set -euo pipefail +export LC_NUMERIC=C + +force=false +if [ "${1:-}" = "-f" ]; then + force=true + shift +fi + +if [ $# -gt 0 ]; then + files=("$@") +else + files=(content/ecosystem/_index*.md) +fi + +if ! command -v jq &>/dev/null; then + echo "Error: jq is required. Install it with: sudo apt install jq" >&2 + exit 1 +fi + +for file in "${files[@]}"; do + echo "Processing $file ..." + tmpfile=$(mktemp) + changed=false + + while IFS= read -r line; do + # Match lines with address (skip if lat exists, unless -f) + if echo "$line" | grep -q 'address\s*=' && { [ "$force" = true ] || ! echo "$line" | grep -q 'lat\s*='; }; then + # Strip existing lat/lon if forcing + if [ "$force" = true ]; then + line=$(echo "$line" | sed 's/,\s*lat\s*=\s*[0-9.-]*//; s/,\s*lon\s*=\s*[0-9.-]*//') + fi + # Extract the address value + address=$(echo "$line" | sed -n 's/.*address\s*=\s*"\([^"]*\)".*/\1/p') + if [ -n "$address" ]; then + echo " Geocoding: $address" + # Query Nominatim with 1s delay to respect usage policy + sleep 1 + result=$(curl -sG "https://nominatim.openstreetmap.org/search" \ + --data-urlencode "q=$address" \ + -d "format=json" \ + -d "limit=1" \ + -H "User-Agent: munich-embedded-geocoder") + + lat=$(echo "$result" | jq -r '.[0].lat // empty') + lon=$(echo "$result" | jq -r '.[0].lon // empty') + + if [ -n "$lat" ] && [ -n "$lon" ]; then + # Round to 4 decimal places + lat=$(printf "%.4f" "$lat") + lon=$(printf "%.4f" "$lon") + echo " -> lat = $lat, lon = $lon" + # Insert lat and lon before the closing } + line=$(echo "$line" | sed "s/}/, lat = $lat, lon = $lon }/") + changed=true + else + echo " -> No result found, skipping" >&2 + fi + fi + fi + echo "$line" >> "$tmpfile" + done < "$file" + + if [ "$changed" = true ]; then + mv "$tmpfile" "$file" + echo " Updated $file" + else + rm "$tmpfile" + echo " No changes needed" + fi +done diff --git a/static/css/style.css b/static/css/style.css index 4672650..e6edb0e 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -256,9 +256,6 @@ .ms-4 { margin-inline-start: calc(var(--spacing) * 4); } - .mt-0 { - margin-top: calc(var(--spacing) * 0); - } .mt-0\.5 { margin-top: calc(var(--spacing) * 0.5); } @@ -348,9 +345,6 @@ .inline-block { display: inline-block; } - .table { - display: table; - } .aspect-square { aspect-ratio: 1 / 1; } @@ -420,9 +414,6 @@ .flex-1 { flex: 1; } - .flex-shrink { - flex-shrink: 1; - } .shrink-0 { flex-shrink: 0; } @@ -432,15 +423,9 @@ .grow { flex-grow: 1; } - .border-collapse { - border-collapse: collapse; - } .transform { transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); } - .resize { - resize: both; - } .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } @@ -768,10 +753,6 @@ --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } - .outline { - outline-style: var(--tw-outline-style); - outline-width: 1px; - } .transition-all { transition-property: all; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); @@ -1347,11 +1328,6 @@ inherits: false; initial-value: 0 0 #0000; } -@property --tw-outline-style { - syntax: "*"; - inherits: false; - initial-value: solid; -} @property --tw-translate-x { syntax: "*"; inherits: false; @@ -1399,7 +1375,6 @@ --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; - --tw-outline-style: solid; --tw-translate-x: 0; --tw-translate-y: 0; --tw-translate-z: 0; From abc704ec3e72bbfa793812f92504a61f94caf5c3 Mon Sep 17 00:00:00 2001 From: JuliDi <20155974+JuliDi@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:20:11 +0100 Subject: [PATCH 04/14] update readme to document geocode script --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index d085b98..3ea4f05 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,10 @@ It is a static website, built with Zola and hosted at Cloudflare pages. - If css was changed: rebuild with tailwind by running `just css` - Preview website locally with `zola serve` +## Scripts + +- `./scripts/geocode.sh` — Resolves coordinates for ecosystem entities that have an `address` but no `lat`/`lon`. Uses OpenStreetMap Nominatim. Pass `-f` to re-geocode all entries. Requires `curl` and `jq`. + *** Systemscape GmbH | 2025\ https://www.systemscape.com From c42ee4b3656989f555f3a702071a3d421c37e9c2 Mon Sep 17 00:00:00 2001 From: JuliDi <20155974+JuliDi@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:31:17 +0100 Subject: [PATCH 05/14] Add systemscape to list of companies, add disclaimer --- content/ecosystem/_index.en.md | 6 +- content/ecosystem/_index.md | 6 +- static/css/style.css | 101 +++++++++++++++++++++++++++++++++ templates/ecosystem.html | 11 ++-- 4 files changed, 118 insertions(+), 6 deletions(-) diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index 100c386..fa3f85a 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -29,7 +29,8 @@ entities = [ { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, - { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 } + { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "Systemscape", url = "https://www.systemscape.com/", description = "Rust for embedded systems.", address = "Bergmannstr. 12, 80339 München" , lat = 48.1387, lon = 11.5377 } ] [[extra.groups]] @@ -46,3 +47,6 @@ entities = [ { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } ] +++ + +Collection of companies in and around Munich that are active in the embedded sector. This list is not exhaustive. +There is no connection whatsoever between the companies listed and Munich Embedded or Systemscape. diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index a3d4984..9eeaf3e 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -29,7 +29,8 @@ entities = [ { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, - { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 } + { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "Systemscape", url = "https://www.systemscape.com/", description = "Rust für eingebettete Systeme.", address = "Bergmannstr. 12, 80339 München" , lat = 48.1387, lon = 11.5377 } ] [[extra.groups]] @@ -46,3 +47,6 @@ entities = [ { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } ] +++ + +Sammlung von Unternehmen in und um München, die im Embedded Bereich aktiv sind. Ohne Anspruch auf Vollständigkeit.\ +Es besteht keinerlei Verbindung zwischen den aufgeführten Unternehmen und Munich Embedded bzw. Systemscape. diff --git a/static/css/style.css b/static/css/style.css index e6edb0e..c1d9483 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -223,9 +223,21 @@ } } @layer utilities { + .absolute { + position: absolute; + } + .fixed { + position: fixed; + } + .relative { + position: relative; + } .static { position: static; } + .sticky { + position: sticky; + } .z-0 { z-index: 0; } @@ -426,6 +438,9 @@ .transform { transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); } + .resize { + resize: both; + } .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } @@ -741,6 +756,10 @@ .opacity-0 { opacity: 0%; } + .shadow { + --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } .shadow-lg { --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); @@ -753,6 +772,22 @@ --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } + .ring { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .blur { + --tw-blur: blur(8px); + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); + } + .filter { + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); + } + .transition { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } .transition-all { transition-property: all; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); @@ -1328,6 +1363,59 @@ inherits: false; initial-value: 0 0 #0000; } +@property --tw-blur { + syntax: "*"; + inherits: false; +} +@property --tw-brightness { + syntax: "*"; + inherits: false; +} +@property --tw-contrast { + syntax: "*"; + inherits: false; +} +@property --tw-grayscale { + syntax: "*"; + inherits: false; +} +@property --tw-hue-rotate { + syntax: "*"; + inherits: false; +} +@property --tw-invert { + syntax: "*"; + inherits: false; +} +@property --tw-opacity { + syntax: "*"; + inherits: false; +} +@property --tw-saturate { + syntax: "*"; + inherits: false; +} +@property --tw-sepia { + syntax: "*"; + inherits: false; +} +@property --tw-drop-shadow { + syntax: "*"; + inherits: false; +} +@property --tw-drop-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-drop-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; +} +@property --tw-drop-shadow-size { + syntax: "*"; + inherits: false; +} @property --tw-translate-x { syntax: "*"; inherits: false; @@ -1375,6 +1463,19 @@ --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; + --tw-blur: initial; + --tw-brightness: initial; + --tw-contrast: initial; + --tw-grayscale: initial; + --tw-hue-rotate: initial; + --tw-invert: initial; + --tw-opacity: initial; + --tw-saturate: initial; + --tw-sepia: initial; + --tw-drop-shadow: initial; + --tw-drop-shadow-color: initial; + --tw-drop-shadow-alpha: 100%; + --tw-drop-shadow-size: initial; --tw-translate-x: 0; --tw-translate-y: 0; --tw-translate-z: 0; diff --git a/templates/ecosystem.html b/templates/ecosystem.html index 2daf86d..a8c1fdc 100644 --- a/templates/ecosystem.html +++ b/templates/ecosystem.html @@ -7,12 +7,15 @@
-
+

{{ section.title }}

- -
+
+ {{ section.content | safe }} +
+ +
-
+
{% for group in section.extra.groups %}

{{ group.title }}

From 96614ee6c05bdd4c13760dc10001c7c31552c7ec Mon Sep 17 00:00:00 2001 From: JuliDi <20155974+JuliDi@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:42:24 +0100 Subject: [PATCH 06/14] add german translations for company descriptions, add R&S --- content/ecosystem/_index.en.md | 3 ++- content/ecosystem/_index.md | 39 +++++++++++++++++----------------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index fa3f85a..acf651b 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -9,7 +9,8 @@ entities = [ { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München" , lat = 48.1431, lon = 11.5649 }, { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg" , lat = 48.0811, lon = 11.6162 }, - { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 } + { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 }, + { name = "Rohde & Schwarz", url = "https://www.rohde-schwarz.com", description = "Global leader in test and measurement, broadcast and media, cybersecurity, and radio communications.", address = "Mühldorfstraße 15, 81671 München" } ] [[extra.groups]] diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index 9eeaf3e..6d94f1d 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -5,46 +5,47 @@ template = "ecosystem.html" [[extra.groups]] title = "Großunternehmen" entities = [ - { name = "Analog Devices", url = "https://www.analog.com", description = "Global semiconductor leader bridging the physical and digital worlds to enable breakthroughs at the Intelligent Edge.", address = "Otl-Aicher-Straße 60-64, 80807 München" , lat = 48.1818, lon = 11.5872 }, - { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, - { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München" , lat = 48.1431, lon = 11.5649 }, - { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg" , lat = 48.0811, lon = 11.6162 }, - { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 } + { name = "Analog Devices", url = "https://www.analog.com", description = "Weltweit führender Halbleiterhersteller, der die physische und digitale Welt verbindet.", address = "Otl-Aicher-Straße 60-64, 80807 München" , lat = 48.1818, lon = 11.5872 }, + { name = "Google", url = "https://about.google/", description = "Organisiert die Informationen der Welt und macht sie allgemein zugänglich und nutzbar.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, + { name = "Apple", url = "https://www.apple.com", description = "Entwicklung und Herstellung von Unterhaltungselektronik, Software und Online-Diensten.", address = "Katharina-von-Bora-Straße 3, 80333 München" , lat = 48.1431, lon = 11.5649 }, + { name = "Intel", url = "https://www.intel.com", description = "Entwickelt Technologien, die das Leben jedes Menschen auf der Welt verbessern.", address = "Am Campeon 10-12, 85579 Neubiberg" , lat = 48.0811, lon = 11.6162 }, + { name = "Red Hat", url = "https://www.redhat.com", description = "Weltweit führender Anbieter von Enterprise-Open-Source-Lösungen.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 }, + { name = "Rohde & Schwarz", url = "https://www.rohde-schwarz.com", description = "Weltweit führend in Messtechnik, Broadcast, Cybersicherheit und Funkkommunikation.", address = "Mühldorfstraße 15, 81671 München" } ] [[extra.groups]] title = "Mittelstand / KMU" entities = [ - { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, - { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "High power charging for e-mobility.", address = "Alte Landstraße 29, 85521 Ottobrunn" , lat = 48.0746, lon = 11.6522 }, - { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, - { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, - { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, - { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } + { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Entwickelt Computer für KI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, + { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "Hochleistungsladetechnik für Elektromobilität.", address = "Alte Landstraße 29, 85521 Ottobrunn" , lat = 48.0746, lon = 11.6522 }, + { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Flexibler und nachhaltiger Zugang zum Weltraum für kleine und mittlere Satelliten.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, + { name = "Codasip", url = "https://codasip.com/", description = "Führender Anbieter von RISC-V-Prozessor-IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, + { name = "Helsing", url = "https://helsing.ai/", description = "KI-Unternehmen für Verteidigung und nationale Sicherheit.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, + { name = "Zerophase", url = "https://zerophase.de/", description = "Spezialisiert auf Embedded-Systeme und Softwareentwicklung.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } ] [[extra.groups]] title = "Beratung / Dienstleistung" entities = [ - { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, - { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, - { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, - { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Ingenieurdienstleistungen für eingebettete Systeme.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "DENX", url = "https://www.denx.de/", description = "Experten für Embedded Linux und U-Boot.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, + { name = "Ilbers", url = "https://ilbers.de/", description = "Beratung und Entwicklung für Embedded-Linux-Systeme.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, + { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrielle IoT-Lösungen und Xentara-Plattform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "Systemscape", url = "https://www.systemscape.com/", description = "Rust für eingebettete Systeme.", address = "Bergmannstr. 12, 80339 München" , lat = 48.1387, lon = 11.5377 } ] [[extra.groups]] title = "Gemeinnützige Organisationen" entities = [ - { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Open workshop with digital fabrication tools.", address = "Gollierstraße 70, 80339 München" , lat = 48.1369, lon = 11.5341 }, - { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Community network for free wireless internet.", address = "Parkstraße 28, 82131 Gauting" , lat = 48.0689, lon = 11.3721 }, - { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Open workshop and community space.", address = "Rosenheimer Str. 5, 81667 München" , lat = 48.1316, lon = 11.5908 } + { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Offene Werkstatt mit digitalen Fertigungswerkzeugen.", address = "Gollierstraße 70, 80339 München" , lat = 48.1369, lon = 11.5341 }, + { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Gemeinschaftsnetzwerk für freies WLAN.", address = "Parkstraße 28, 82131 Gauting" , lat = 48.0689, lon = 11.3721 }, + { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Offene Werkstatt und Gemeinschaftsraum.", address = "Rosenheimer Str. 5, 81667 München" , lat = 48.1316, lon = 11.5908 } ] [[extra.groups]] title = "Meetups" entities = [ - { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } + { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Lokale Community für das Zephyr-RTOS-Projekt.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } ] +++ From 24e1d59ff4c3e10cc43fe01a5d4486cb56ce25c6 Mon Sep 17 00:00:00 2001 From: JuliDi <20155974+JuliDi@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:46:26 +0100 Subject: [PATCH 07/14] alphabetic ordering, add lat/lon for R&S --- content/ecosystem/_index.en.md | 16 ++++++++-------- content/ecosystem/_index.md | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index acf651b..3e2f12a 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -6,40 +6,40 @@ template = "ecosystem.html" title = "Large Business" entities = [ { name = "Analog Devices", url = "https://www.analog.com", description = "Global semiconductor leader bridging the physical and digital worlds to enable breakthroughs at the Intelligent Edge.", address = "Otl-Aicher-Straße 60-64, 80807 München" , lat = 48.1818, lon = 11.5872 }, - { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München" , lat = 48.1431, lon = 11.5649 }, + { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg" , lat = 48.0811, lon = 11.6162 }, { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 }, - { name = "Rohde & Schwarz", url = "https://www.rohde-schwarz.com", description = "Global leader in test and measurement, broadcast and media, cybersecurity, and radio communications.", address = "Mühldorfstraße 15, 81671 München" } + { name = "Rohde & Schwarz", url = "https://www.rohde-schwarz.com", description = "Global leader in test and measurement, broadcast and media, cybersecurity, and radio communications.", address = "Mühldorfstraße 15, 81671 München" , lat = 48.1278, lon = 11.6127 } ] [[extra.groups]] title = "Medium/Small Business" entities = [ - { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "High power charging for e-mobility.", address = "Alte Landstraße 29, 85521 Ottobrunn" , lat = 48.0746, lon = 11.6522 }, - { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, + { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, + { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } ] [[extra.groups]] title = "Consulting" entities = [ - { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, - { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, + { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "Systemscape", url = "https://www.systemscape.com/", description = "Rust for embedded systems.", address = "Bergmannstr. 12, 80339 München" , lat = 48.1387, lon = 11.5377 } ] [[extra.groups]] title = "Non-profit" entities = [ + { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Open workshop and community space.", address = "Rosenheimer Str. 5, 81667 München" , lat = 48.1316, lon = 11.5908 }, { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Open workshop with digital fabrication tools.", address = "Gollierstraße 70, 80339 München" , lat = 48.1369, lon = 11.5341 }, - { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Community network for free wireless internet.", address = "Parkstraße 28, 82131 Gauting" , lat = 48.0689, lon = 11.3721 }, - { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Open workshop and community space.", address = "Rosenheimer Str. 5, 81667 München" , lat = 48.1316, lon = 11.5908 } + { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Community network for free wireless internet.", address = "Parkstraße 28, 82131 Gauting" , lat = 48.0689, lon = 11.3721 } ] [[extra.groups]] diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index 6d94f1d..db12f62 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -6,40 +6,40 @@ template = "ecosystem.html" title = "Großunternehmen" entities = [ { name = "Analog Devices", url = "https://www.analog.com", description = "Weltweit führender Halbleiterhersteller, der die physische und digitale Welt verbindet.", address = "Otl-Aicher-Straße 60-64, 80807 München" , lat = 48.1818, lon = 11.5872 }, - { name = "Google", url = "https://about.google/", description = "Organisiert die Informationen der Welt und macht sie allgemein zugänglich und nutzbar.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, { name = "Apple", url = "https://www.apple.com", description = "Entwicklung und Herstellung von Unterhaltungselektronik, Software und Online-Diensten.", address = "Katharina-von-Bora-Straße 3, 80333 München" , lat = 48.1431, lon = 11.5649 }, + { name = "Google", url = "https://about.google/", description = "Organisiert die Informationen der Welt und macht sie allgemein zugänglich und nutzbar.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, { name = "Intel", url = "https://www.intel.com", description = "Entwickelt Technologien, die das Leben jedes Menschen auf der Welt verbessern.", address = "Am Campeon 10-12, 85579 Neubiberg" , lat = 48.0811, lon = 11.6162 }, { name = "Red Hat", url = "https://www.redhat.com", description = "Weltweit führender Anbieter von Enterprise-Open-Source-Lösungen.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 }, - { name = "Rohde & Schwarz", url = "https://www.rohde-schwarz.com", description = "Weltweit führend in Messtechnik, Broadcast, Cybersicherheit und Funkkommunikation.", address = "Mühldorfstraße 15, 81671 München" } + { name = "Rohde & Schwarz", url = "https://www.rohde-schwarz.com", description = "Weltweit führend in Messtechnik, Broadcast, Cybersicherheit und Funkkommunikation.", address = "Mühldorfstraße 15, 81671 München" , lat = 48.1278, lon = 11.6127 } ] [[extra.groups]] title = "Mittelstand / KMU" entities = [ - { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Entwickelt Computer für KI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, { name = "Alpitronic", url = "https://www.alpitronic.it/", description = "Hochleistungsladetechnik für Elektromobilität.", address = "Alte Landstraße 29, 85521 Ottobrunn" , lat = 48.0746, lon = 11.6522 }, - { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Flexibler und nachhaltiger Zugang zum Weltraum für kleine und mittlere Satelliten.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, { name = "Codasip", url = "https://codasip.com/", description = "Führender Anbieter von RISC-V-Prozessor-IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, { name = "Helsing", url = "https://helsing.ai/", description = "KI-Unternehmen für Verteidigung und nationale Sicherheit.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, + { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Flexibler und nachhaltiger Zugang zum Weltraum für kleine und mittlere Satelliten.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, + { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Entwickelt Computer für KI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, { name = "Zerophase", url = "https://zerophase.de/", description = "Spezialisiert auf Embedded-Systeme und Softwareentwicklung.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } ] [[extra.groups]] title = "Beratung / Dienstleistung" entities = [ - { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Ingenieurdienstleistungen für eingebettete Systeme.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "DENX", url = "https://www.denx.de/", description = "Experten für Embedded Linux und U-Boot.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, - { name = "Ilbers", url = "https://ilbers.de/", description = "Beratung und Entwicklung für Embedded-Linux-Systeme.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrielle IoT-Lösungen und Xentara-Plattform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "Ilbers", url = "https://ilbers.de/", description = "Beratung und Entwicklung für Embedded-Linux-Systeme.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, + { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Ingenieurdienstleistungen für eingebettete Systeme.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "Systemscape", url = "https://www.systemscape.com/", description = "Rust für eingebettete Systeme.", address = "Bergmannstr. 12, 80339 München" , lat = 48.1387, lon = 11.5377 } ] [[extra.groups]] title = "Gemeinnützige Organisationen" entities = [ + { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Offene Werkstatt und Gemeinschaftsraum.", address = "Rosenheimer Str. 5, 81667 München" , lat = 48.1316, lon = 11.5908 }, { name = "FabLab München", url = "https://www.fablab-muenchen.de/", description = "Offene Werkstatt mit digitalen Fertigungswerkzeugen.", address = "Gollierstraße 70, 80339 München" , lat = 48.1369, lon = 11.5341 }, - { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Gemeinschaftsnetzwerk für freies WLAN.", address = "Parkstraße 28, 82131 Gauting" , lat = 48.0689, lon = 11.3721 }, - { name = "Erfindergarden", url = "https://erfindergarden.de/", description = "Offene Werkstatt und Gemeinschaftsraum.", address = "Rosenheimer Str. 5, 81667 München" , lat = 48.1316, lon = 11.5908 } + { name = "Freifunk München (ffmuc)", url = "https://ffmuc.net/", description = "Gemeinschaftsnetzwerk für freies WLAN.", address = "Parkstraße 28, 82131 Gauting" , lat = 48.0689, lon = 11.3721 } ] [[extra.groups]] From 195c4d0537b23b63354922084b84f2e9c6c135f7 Mon Sep 17 00:00:00 2001 From: JuliDi <20155974+JuliDi@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:48:47 +0100 Subject: [PATCH 08/14] Add OpenStreetMap privacy policy section for GDPR compliance --- content/privacy.en.md | 6 ++++++ content/privacy.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/content/privacy.en.md b/content/privacy.en.md index 6175cc3..8bb9b72 100644 --- a/content/privacy.en.md +++ b/content/privacy.en.md @@ -50,6 +50,12 @@ The processing of the data specified in this section is neither legally nor cont Cloudflare has implemented compliance measures for international data transfers. These apply to all worldwide activities where Cloudflare processes personal data of natural persons in the EU. These measures are based on the EU Standard Contractual Clauses (SCCs) and participation in the EU-US Data Privacy Framework. For more information, visit: [https://www.cloudflare.com/cloudflare_customer_SCCs.pdf](https://www.cloudflare.com/cloudflare_customer_SCCs.pdf) +## Map Display with OpenStreetMap + +On our ecosystem page, we use an interactive map that loads map tiles from the German OpenStreetMap tile server (`tile.openstreetmap.de`). This server is operated by FOSSGIS e.V. (a registered association based in Germany). When loading the map tiles, your IP address is transmitted to the servers of FOSSGIS e.V. No data transfer to third countries takes place. + +The use is based on our legitimate interest pursuant to Art. 6(1)(f) GDPR in providing an appealing presentation of locations on our website. Further information on the data protection of FOSSGIS e.V. can be found at: [https://www.fossgis.de/datenschutzerkl%C3%A4rung](https://www.fossgis.de/datenschutzerkl%C3%A4rung) + ## Your Rights as a Data Subject As a data subject, you have the right to information, the right to rectification or erasure, the right to restriction of processing, and the right to object to the processing of your data. If you have given us consent, you can revoke it at any time with effect for the future. diff --git a/content/privacy.md b/content/privacy.md index 8f72520..e2940a8 100644 --- a/content/privacy.md +++ b/content/privacy.md @@ -50,6 +50,12 @@ Die Verarbeitung der in diesem Abschnitt genannten Daten ist weder gesetzlich no Cloudflare hat Compliance-Maßnahmen für internationale Datenübermittlungen umgesetzt. Diese gelten für alle weltweiten Aktivitäten, bei denen Cloudflare personenbezogene Daten von natürlichen Personen in der EU verarbeitet. Diese Maßnahmen basieren auf den EU-Standardvertragsklauseln (SCCs) und der Teilnahme am EU-US Data Privacy Framework. Weitere Informationen finden Sie unter: [https://www.cloudflare.com/cloudflare_customer_SCCs.pdf](https://www.cloudflare.com/cloudflare_customer_SCCs.pdf) +## Kartendarstellung mit OpenStreetMap + +Auf unserer Ökosystem-Seite verwenden wir eine interaktive Karte, die Kartenkacheln vom deutschen OpenStreetMap-Tileserver (`tile.openstreetmap.de`) lädt. Dieser wird vom FOSSGIS e.V. (ein eingetragener Verein mit Sitz in Deutschland) betrieben. Beim Laden der Kartenkacheln wird Ihre IP-Adresse an die Server des FOSSGIS e.V. übermittelt. Es findet keine Datenübermittlung in Drittländer statt. + +Die Nutzung erfolgt auf Grundlage unseres berechtigten Interesses gem. Art. 6 Abs. 1 lit. f DSGVO an einer ansprechenden Darstellung der Standorte auf unserer Website. Weitere Informationen zum Datenschutz des FOSSGIS e.V. finden Sie unter: [https://www.fossgis.de/datenschutzerkl%C3%A4rung](https://www.fossgis.de/datenschutzerkl%C3%A4rung) + ## Ihre Rechte als betroffene Person Als betroffene Person haben Sie das Recht auf Auskunft, das Recht auf Berichtigung oder Löschung, das Recht auf Einschränkung der Verarbeitung und das Recht auf Widerspruch gegen die Verarbeitung Ihrer Daten. Sofern Sie uns eine Einwilligung erteilt haben, können Sie diese jederzeit mit Wirkung für die Zukunft widerrufen. From c8ba64e5ef34805514fccb1a829d4a01d0166e9f Mon Sep 17 00:00:00 2001 From: Philip Molloy Date: Mon, 16 Feb 2026 11:33:22 +0100 Subject: [PATCH 09/14] fix(ecosystem): Update Intel address to Dornacher Str. 1, 85622 Feldkirchen --- content/ecosystem/_index.en.md | 2 +- content/ecosystem/_index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index 3e2f12a..66d90a3 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -8,7 +8,7 @@ entities = [ { name = "Analog Devices", url = "https://www.analog.com", description = "Global semiconductor leader bridging the physical and digital worlds to enable breakthroughs at the Intelligent Edge.", address = "Otl-Aicher-Straße 60-64, 80807 München" , lat = 48.1818, lon = 11.5872 }, { name = "Apple", url = "https://www.apple.com", description = "Designing and manufacturing consumer electronics, computer software, and online services.", address = "Katharina-von-Bora-Straße 3, 80333 München" , lat = 48.1431, lon = 11.5649 }, { name = "Google", url = "https://about.google/", description = "Organizing the world's information and making it universally accessible and useful.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, - { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Am Campeon 10-12, 85579 Neubiberg" , lat = 48.0811, lon = 11.6162 }, + { name = "Intel", url = "https://www.intel.com", description = "Creating world-changing technology that improves the life of every person on the planet.", address = "Dornacher Str. 1, 85622 Feldkirchen", lat = 48.1485, lon = 11.7185 }, { name = "Red Hat", url = "https://www.redhat.com", description = "The world's leading provider of enterprise open source solutions.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 }, { name = "Rohde & Schwarz", url = "https://www.rohde-schwarz.com", description = "Global leader in test and measurement, broadcast and media, cybersecurity, and radio communications.", address = "Mühldorfstraße 15, 81671 München" , lat = 48.1278, lon = 11.6127 } ] diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index db12f62..fd0dd1b 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -8,7 +8,7 @@ entities = [ { name = "Analog Devices", url = "https://www.analog.com", description = "Weltweit führender Halbleiterhersteller, der die physische und digitale Welt verbindet.", address = "Otl-Aicher-Straße 60-64, 80807 München" , lat = 48.1818, lon = 11.5872 }, { name = "Apple", url = "https://www.apple.com", description = "Entwicklung und Herstellung von Unterhaltungselektronik, Software und Online-Diensten.", address = "Katharina-von-Bora-Straße 3, 80333 München" , lat = 48.1431, lon = 11.5649 }, { name = "Google", url = "https://about.google/", description = "Organisiert die Informationen der Welt und macht sie allgemein zugänglich und nutzbar.", address = "Erika-Mann-Straße 33, 80636 München" , lat = 48.1429, lon = 11.5408 }, - { name = "Intel", url = "https://www.intel.com", description = "Entwickelt Technologien, die das Leben jedes Menschen auf der Welt verbessern.", address = "Am Campeon 10-12, 85579 Neubiberg" , lat = 48.0811, lon = 11.6162 }, + { name = "Intel", url = "https://www.intel.com", description = "Entwickelt Technologien, die das Leben jedes Menschen auf der Welt verbessern.", address = "Dornacher Str. 1, 85622 Feldkirchen", lat = 48.1485, lon = 11.7185 }, { name = "Red Hat", url = "https://www.redhat.com", description = "Weltweit führender Anbieter von Enterprise-Open-Source-Lösungen.", address = "Werner-von-Siemens-Ring 12, 85630 Grasbrunn" , lat = 48.1012, lon = 11.7587 }, { name = "Rohde & Schwarz", url = "https://www.rohde-schwarz.com", description = "Weltweit führend in Messtechnik, Broadcast, Cybersicherheit und Funkkommunikation.", address = "Mühldorfstraße 15, 81671 München" , lat = 48.1278, lon = 11.6127 } ] From 85b7739e190d26eda800fa0b66018a0e83fed963 Mon Sep 17 00:00:00 2001 From: Philip Molloy Date: Mon, 16 Feb 2026 11:35:00 +0100 Subject: [PATCH 10/14] =?UTF-8?q?fix(ecosystem):=20Update=20Tenstorrent=20?= =?UTF-8?q?location=20to=20Unterf=C3=B6hring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/ecosystem/_index.en.md | 2 +- content/ecosystem/_index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index 66d90a3..e19d7ca 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -20,7 +20,7 @@ entities = [ { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, - { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, + { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Unterföhring", lat = 48.1917, lon = 11.6460 }, { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } ] diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index fd0dd1b..92dd239 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -20,7 +20,7 @@ entities = [ { name = "Codasip", url = "https://codasip.com/", description = "Führender Anbieter von RISC-V-Prozessor-IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, { name = "Helsing", url = "https://helsing.ai/", description = "KI-Unternehmen für Verteidigung und nationale Sicherheit.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Flexibler und nachhaltiger Zugang zum Weltraum für kleine und mittlere Satelliten.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, - { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Entwickelt Computer für KI.", address = "Feringastrasse 6, 85774 Unterföhring" , lat = 48.1778, lon = 11.6332 }, + { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Entwickelt Computer für KI.", address = "Unterföhring", lat = 48.1917, lon = 11.6460 }, { name = "Zerophase", url = "https://zerophase.de/", description = "Spezialisiert auf Embedded-Systeme und Softwareentwicklung.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } ] From da04b2cc4aa40f769e323a3e7283a2354687e013 Mon Sep 17 00:00:00 2001 From: Philip Molloy Date: Mon, 16 Feb 2026 11:35:53 +0100 Subject: [PATCH 11/14] fix(ecosystem): Update nabla to Augsburg location --- content/ecosystem/_index.en.md | 2 +- content/ecosystem/_index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index e19d7ca..8de1a25 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -30,7 +30,7 @@ entities = [ { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, - { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Engineering services for embedded systems.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "nabla", url = "https://nabladev.com/", description = "Engineering services for embedded systems.", address = "Hirschstr. 111a, 86156 Augsburg", lat = 48.3715, lon = 10.8985 }, { name = "Systemscape", url = "https://www.systemscape.com/", description = "Rust for embedded systems.", address = "Bergmannstr. 12, 80339 München" , lat = 48.1387, lon = 11.5377 } ] diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index 92dd239..d2eeb00 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -30,7 +30,7 @@ entities = [ { name = "DENX", url = "https://www.denx.de/", description = "Experten für Embedded Linux und U-Boot.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrielle IoT-Lösungen und Xentara-Plattform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "Ilbers", url = "https://ilbers.de/", description = "Beratung und Entwicklung für Embedded-Linux-Systeme.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, - { name = "Nabla Delta", url = "https://nabladelta.de/", description = "Ingenieurdienstleistungen für eingebettete Systeme.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "nabla", url = "https://nabladev.com/", description = "Engineering services for embedded systems.", address = "Hirschstr. 111a, 86156 Augsburg", lat = 48.3715, lon = 10.8985 }, { name = "Systemscape", url = "https://www.systemscape.com/", description = "Rust für eingebettete Systeme.", address = "Bergmannstr. 12, 80339 München" , lat = 48.1387, lon = 11.5377 } ] From 88fedd8aac466349d75e8cec401d747f80687c8b Mon Sep 17 00:00:00 2001 From: Philip Molloy Date: Mon, 16 Feb 2026 11:36:32 +0100 Subject: [PATCH 12/14] fix(ecosystem): Update Zephyr Project Meetup URL --- content/ecosystem/_index.en.md | 2 +- content/ecosystem/_index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index 8de1a25..fa1d06e 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -45,7 +45,7 @@ entities = [ [[extra.groups]] title = "Meet-ups" entities = [ - { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } + { name = "Zephyr Project Meetup", url = "https://www.zephyrproject.org/event/zephyr-project-meetup-november-20-2025-garching-munich-germany/", description = "Local community for the Zephyr RTOS project.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } ] +++ diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index d2eeb00..4a2a344 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -45,7 +45,7 @@ entities = [ [[extra.groups]] title = "Meetups" entities = [ - { name = "Zephyr Project Meetup", url = "https://www.meetup.com/zephyr-project-munich/", description = "Lokale Community für das Zephyr-RTOS-Projekt.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } + { name = "Zephyr Project Meetup", url = "https://www.zephyrproject.org/event/zephyr-project-meetup-november-20-2025-garching-munich-germany/", description = "Lokale Community für das Zephyr-RTOS-Projekt.", address = "Friedrich-Ludwig-Bauer-Straße 3, 85748 Garching bei München" , lat = 48.2650, lon = 11.6610 } ] +++ From 0c2094b633bb163ab2bf168e0b5f528335afbcb6 Mon Sep 17 00:00:00 2001 From: JuliDi <20155974+JuliDi@users.noreply.github.com> Date: Mon, 16 Feb 2026 14:58:07 +0100 Subject: [PATCH 13/14] remove tenstorrent --- content/ecosystem/_index.en.md | 1 - content/ecosystem/_index.md | 1 - 2 files changed, 2 deletions(-) diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index fa1d06e..c8729c9 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -20,7 +20,6 @@ entities = [ { name = "Codasip", url = "https://codasip.com/", description = "Leading provider of RISC-V processor IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, { name = "Helsing", url = "https://helsing.ai/", description = "AI company for defense and national security.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Offering flexible and sustainable access to space for small and medium satellites.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, - { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Building computers for AI.", address = "Unterföhring", lat = 48.1917, lon = 11.6460 }, { name = "Zerophase", url = "https://zerophase.de/", description = "Specialized in embedded systems and software engineering.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } ] diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index 4a2a344..9567af1 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -20,7 +20,6 @@ entities = [ { name = "Codasip", url = "https://codasip.com/", description = "Führender Anbieter von RISC-V-Prozessor-IP.", address = "Paul-Gerhardt-Allee 50, 81245 München" , lat = 48.1539, lon = 11.4788 }, { name = "Helsing", url = "https://helsing.ai/", description = "KI-Unternehmen für Verteidigung und nationale Sicherheit.", address = "Mühldorfstraße 8, 81671 München" , lat = 48.1280, lon = 11.6100 }, { name = "Isar Aerospace", url = "https://www.isaraerospace.com/", description = "Flexibler und nachhaltiger Zugang zum Weltraum für kleine und mittlere Satelliten.", address = "Caroline-Herschel-Straße 2, 85521 Ottobrunn" , lat = 48.0527, lon = 11.6603 }, - { name = "Tenstorrent", url = "https://tenstorrent.com/", description = "Entwickelt Computer für KI.", address = "Unterföhring", lat = 48.1917, lon = 11.6460 }, { name = "Zerophase", url = "https://zerophase.de/", description = "Spezialisiert auf Embedded-Systeme und Softwareentwicklung.", address = "Max-Planck-Straße 5, 85716 Unterschleißheim" , lat = 48.2841, lon = 11.5671 } ] From 32e93f288ac0c7a29438ad96852d5b067b6bd89f Mon Sep 17 00:00:00 2001 From: JuliDi <20155974+JuliDi@users.noreply.github.com> Date: Mon, 16 Feb 2026 15:02:17 +0100 Subject: [PATCH 14/14] fix broken link to embedded ocean --- content/ecosystem/_index.en.md | 2 +- content/ecosystem/_index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ecosystem/_index.en.md b/content/ecosystem/_index.en.md index c8729c9..d20accd 100644 --- a/content/ecosystem/_index.en.md +++ b/content/ecosystem/_index.en.md @@ -27,7 +27,7 @@ entities = [ title = "Consulting" entities = [ { name = "DENX", url = "https://www.denx.de/", description = "Embedded Linux and U-Boot experts.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, - { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "Embedded Ocean (Xentara)", url = "https://xentara.io/", description = "Industrial IoT solutions and Xentara platform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "Ilbers", url = "https://ilbers.de/", description = "Consulting and development for embedded Linux systems.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, { name = "nabla", url = "https://nabladev.com/", description = "Engineering services for embedded systems.", address = "Hirschstr. 111a, 86156 Augsburg", lat = 48.3715, lon = 10.8985 }, { name = "Systemscape", url = "https://www.systemscape.com/", description = "Rust for embedded systems.", address = "Bergmannstr. 12, 80339 München" , lat = 48.1387, lon = 11.5377 } diff --git a/content/ecosystem/_index.md b/content/ecosystem/_index.md index 9567af1..ca92f9d 100644 --- a/content/ecosystem/_index.md +++ b/content/ecosystem/_index.md @@ -27,7 +27,7 @@ entities = [ title = "Beratung / Dienstleistung" entities = [ { name = "DENX", url = "https://www.denx.de/", description = "Experten für Embedded Linux und U-Boot.", address = "Kirchenstr. 5, 82194 Gröbenzell" , lat = 48.1950, lon = 11.3730 }, - { name = "Embedded Ocean (Xentara)", url = "https://embedded-ocean.com/", description = "Industrielle IoT-Lösungen und Xentara-Plattform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, + { name = "Embedded Ocean (Xentara)", url = "https://xentara.io/", description = "Industrielle IoT-Lösungen und Xentara-Plattform.", address = "Steinerstr. 15, 81369 München" , lat = 48.1028, lon = 11.5371 }, { name = "Ilbers", url = "https://ilbers.de/", description = "Beratung und Entwicklung für Embedded-Linux-Systeme.", address = "Maria-Merian-Str. 8, 85521 Ottobrunn" , lat = 48.0532, lon = 11.6570 }, { name = "nabla", url = "https://nabladev.com/", description = "Engineering services for embedded systems.", address = "Hirschstr. 111a, 86156 Augsburg", lat = 48.3715, lon = 10.8985 }, { name = "Systemscape", url = "https://www.systemscape.com/", description = "Rust für eingebettete Systeme.", address = "Bergmannstr. 12, 80339 München" , lat = 48.1387, lon = 11.5377 }