108 Commits
Author SHA1 Message Date
M_Viper d1057b513e Upload via GUI (5 Dateien) 2026-08-13 21:23:43 +00:00
M_Viper 5e0c026da0 Upload via GUI (182 Dateien) 2026-08-13 21:22:59 +00:00
M_Viper 0fda461bec Upload via GUI (182 Dateien) 2026-08-13 21:22:58 +00:00
M_Viper e41f21b515 Upload via GUI (182 Dateien) 2026-08-13 21:22:57 +00:00
M_Viper 681ff4c9eb Upload via GUI (182 Dateien) 2026-08-13 21:22:55 +00:00
Git Manager GUI 3d0c7ce557 Upload via Git Manager GUI 2026-05-11 09:52:23 +02:00
Git Manager GUI acb12a15bf Upload via Git Manager GUI 2026-05-11 09:52:14 +02:00
Git Manager GUI 287ee0da24 Upload via Git Manager GUI 2026-05-11 09:51:36 +02:00
Git Manager GUI b3db0b99b7 Upload via Git Manager GUI 2026-04-10 08:17:58 +02:00
Git Manager GUI 0eaec091b4 Upload via Git Manager GUI 2026-04-10 08:17:52 +02:00
Git Manager GUI 3acc0e1c99 Upload via Git Manager GUI 2026-04-05 07:17:09 +02:00
Git Manager GUI fb3b9fe5ec Upload via Git Manager GUI 2026-04-05 07:17:07 +02:00
Git Manager GUI 26cf58df55 Upload via Git Manager GUI 2026-04-05 07:17:05 +02:00
Git Manager GUI 3836f5a876 Upload via Git Manager GUI 2026-04-05 07:16:43 +02:00
Git Manager GUI 39786ab837 Upload via Git Manager GUI 2026-04-05 07:16:41 +02:00
Git Manager GUI b78f0679bb Upload via Git Manager GUI 2026-04-05 07:16:38 +02:00
Git Manager GUI 44af7d4131 Upload via Git Manager GUI 2026-04-05 07:16:32 +02:00
M_Viper 43ee6153dd Upload via Git Manager GUI - single-faq.php 2026-03-30 18:43:09 +00:00
M_Viper 042a526aba Upload via Git Manager GUI - single.php 2026-03-30 18:43:08 +00:00
M_Viper bc5e131749 Upload via Git Manager GUI - searchform.php 2026-03-30 18:43:08 +00:00
M_Viper 5bbba99f3b Upload via Git Manager GUI - search.php 2026-03-30 18:43:07 +00:00
M_Viper 46362b5355 Upload via Git Manager GUI - page-login.php 2026-03-30 18:42:55 +00:00
M_Viper af25b0a2b0 Upload via Git Manager GUI - page-bewerbung.php 2026-03-30 18:42:54 +00:00
M_Viper 6d3152047a Upload via Git Manager GUI - page.php 2026-03-30 18:42:54 +00:00
M_Viper e1a8074e99 Upload via Git Manager GUI - list-posts.php 2026-03-30 18:42:53 +00:00
M_Viper 43f40a39b0 Upload via Git Manager GUI - index.php 2026-03-30 18:42:53 +00:00
M_Viper 9f20b9433f Upload via Git Manager GUI - header.php 2026-03-30 18:42:52 +00:00
M_Viper b9b6e5fa57 Upload via Git Manager GUI - get-channel-id.php 2026-03-30 18:42:52 +00:00
M_Viper c08b3d6506 Upload via Git Manager GUI - functions.php 2026-03-30 18:42:51 +00:00
M_Viper 9db3bdff17 Upload via Git Manager GUI - front-page.php 2026-03-30 18:42:51 +00:00
M_Viper 6b6cf4e76f Upload via Git Manager GUI - footer.php 2026-03-30 18:42:50 +00:00
M_Viper 4ef8d4a393 Upload via Git Manager GUI - dynamic-styles.php 2026-03-30 18:42:50 +00:00
M_Viper 2b13b937ec Upload via Git Manager GUI - comments.php 2026-03-30 18:42:49 +00:00
M_Viper 85f96ea145 Upload via Git Manager GUI - clear-livestream-cache.php 2026-03-30 18:42:49 +00:00
M_Viper 4a12a88d2c Upload via Git Manager GUI - clear-cache.php 2026-03-30 18:42:48 +00:00
M_Viper b67a6f2d52 Upload via Git Manager GUI - archive-video.php 2026-03-30 18:42:48 +00:00
M_Viper 82877cb410 Upload via Git Manager GUI - archive-team.php 2026-03-30 18:42:47 +00:00
M_Viper 2425b154cb Upload via Git Manager GUI - archive-faq.php 2026-03-30 18:42:47 +00:00
M_Viper 170ad670bc Upload via Git Manager GUI - archive.php 2026-03-30 18:42:46 +00:00
M_Viper c74800a91e Upload via Git Manager GUI - 404.php 2026-03-30 18:42:46 +00:00
M_Viper e417f31c99 Update from Git Manager GUI 2026-03-30 20:42:44 +02:00
M_Viper 85d12e832d Update from Git Manager GUI 2026-03-30 20:42:42 +02:00
M_Viper 12d1da2818 Upload via Git Manager GUI - update-dreamtripspk.php 2026-03-30 18:42:41 +00:00
M_Viper 3563752968 Upload via Git Manager GUI - test-youtube.php 2026-03-30 18:42:41 +00:00
M_Viper 095e3b5990 Upload via Git Manager GUI - test-video-id.php 2026-03-30 18:42:40 +00:00
M_Viper abb711abbe Upload via Git Manager GUI - test-render.php 2026-03-30 18:42:40 +00:00
M_Viper 558f827fa5 Upload via Git Manager GUI - test-live.php 2026-03-30 18:42:39 +00:00
M_Viper db2ca87135 Upload via Git Manager GUI - test-filter.php 2026-03-30 18:42:39 +00:00
M_Viper 62bab14817 Upload via Git Manager GUI - test-extraction.php 2026-03-30 18:42:38 +00:00
M_Viper 5008184633 Upload via Git Manager GUI - test-direct-url.php 2026-03-30 18:42:38 +00:00
M_Viper 83bff40565 Upload via Git Manager GUI - test-api-live.php 2026-03-30 18:42:38 +00:00
M_Viper 5a4115222e Upload via Git Manager GUI - test-api-key.php 2026-03-30 18:42:37 +00:00
M_Viper 2ccd1f5769 Upload via Git Manager GUI - style.css 2026-03-30 18:42:37 +00:00
M_Viper 94975c41fb Update from Git Manager GUI 2026-03-29 22:30:22 +02:00
M_Viper 8be73b9764 Update from Git Manager GUI 2026-03-29 22:30:20 +02:00
M_Viper c2f366e391 Upload file update-dreamtripspk.php via GUI 2026-03-29 22:30:18 +02:00
M_Viper e530922071 Upload file test-youtube.php via GUI 2026-03-29 22:30:06 +02:00
M_Viper 07b09a83c3 Upload file test-video-id.php via GUI 2026-03-29 22:29:55 +02:00
M_Viper 2487405491 Upload file test-render.php via GUI 2026-03-29 22:29:43 +02:00
M_Viper 853e9be519 Upload file test-live.php via GUI 2026-03-29 22:29:32 +02:00
M_Viper 11f7621ea9 Upload file test-filter.php via GUI 2026-03-29 22:29:20 +02:00
M_Viper 40ef763823 Upload file test-extraction.php via GUI 2026-03-29 22:29:09 +02:00
M_Viper bb818139b2 Upload file test-direct-url.php via GUI 2026-03-29 22:28:57 +02:00
M_Viper 3e7aaf3560 Upload file test-api-live.php via GUI 2026-03-29 22:28:46 +02:00
M_Viper 32fb4c8204 Upload file test-api-key.php via GUI 2026-03-29 22:28:35 +02:00
M_Viper 2a70e23c6b Upload via Git Manager GUI - style.css 2026-03-29 20:28:25 +00:00
M_Viper 3fdf178a4b Upload via Git Manager GUI - single-faq.php 2026-03-29 20:28:25 +00:00
M_Viper 9fc7507037 Upload via Git Manager GUI - single.php 2026-03-29 20:28:24 +00:00
M_Viper 5beb82d9dd Upload via Git Manager GUI - searchform.php 2026-03-29 20:28:24 +00:00
M_Viper 50ebde6b70 Upload via Git Manager GUI - search.php 2026-03-29 20:28:23 +00:00
M_Viper 2ba14ed9a9 Upload via Git Manager GUI - page-login.php 2026-03-29 20:28:12 +00:00
M_Viper 4e16f543a5 Upload via Git Manager GUI - page-bewerbung.php 2026-03-29 20:28:11 +00:00
M_Viper 7e3f7303c4 Upload via Git Manager GUI - page.php 2026-03-29 20:28:11 +00:00
M_Viper 0a494f8148 Upload file list-posts.php via GUI 2026-03-29 22:28:09 +02:00
M_Viper 75c3583b11 Upload via Git Manager GUI - index.php 2026-03-29 20:27:59 +00:00
M_Viper 387ee5586f Upload via Git Manager GUI - header.php 2026-03-29 20:27:59 +00:00
M_Viper 5e087bb07a Upload file get-channel-id.php via GUI 2026-03-29 22:27:57 +02:00
M_Viper 21d9e0f56c Upload via Git Manager GUI - functions.php 2026-03-29 20:27:48 +00:00
M_Viper 37b01a5135 Upload via Git Manager GUI - front-page.php 2026-03-29 20:27:47 +00:00
M_Viper cc0de6b5dd Upload via Git Manager GUI - footer.php 2026-03-29 20:27:47 +00:00
M_Viper 1a9f2ba8f2 Upload via Git Manager GUI - dynamic-styles.php 2026-03-29 20:27:46 +00:00
M_Viper be9c444ba2 Upload via Git Manager GUI - comments.php 2026-03-29 20:27:46 +00:00
M_Viper 7870995bab Upload file clear-livestream-cache.php via GUI 2026-03-29 22:27:44 +02:00
M_Viper 16a4577e6b Upload file clear-cache.php via GUI 2026-03-29 22:27:33 +02:00
M_Viper e319e91290 Upload via Git Manager GUI - archive-video.php 2026-03-29 20:27:24 +00:00
M_Viper b2ba06c1f3 Upload via Git Manager GUI - archive-team.php 2026-03-29 20:27:23 +00:00
M_Viper dce1de3f68 Upload via Git Manager GUI - archive-faq.php 2026-03-29 20:27:23 +00:00
M_Viper 65f6fbb0a2 Upload via Git Manager GUI - archive.php 2026-03-29 20:27:22 +00:00
M_Viper 9c6931d25d Upload via Git Manager GUI - 404.php 2026-03-29 20:27:22 +00:00
M_Viper 2882231550 Update from Git Manager GUI 2026-03-29 22:27:20 +02:00
M_Viper 7684cae147 Upload file header.php via GUI 2026-03-19 23:53:04 +01:00
M_Viper c2e7ef1b46 Upload file functions.php via GUI 2026-03-19 23:52:58 +01:00
M_Viper 1c9b19acda Upload file front-page.php via GUI 2026-03-19 23:52:52 +01:00
M_Viper 96a71b0254 Upload file footer.php via GUI 2026-03-19 23:52:46 +01:00
M_Viper e1dc54463a Upload file comments.php via GUI 2026-03-19 23:52:34 +01:00
M_Viper 15403ac652 Upload file archive-video.php via GUI 2026-03-19 23:52:28 +01:00
M_Viper 50343f6dca Upload file archive-team.php via GUI 2026-03-19 23:52:21 +01:00
M_Viper 9ee1e662ea Upload file archive.php via GUI 2026-03-19 23:52:10 +01:00
M_Viper 1f8fffb58a Upload file 404.php via GUI 2026-03-19 23:52:03 +01:00
M_Viper 2855fbada5 Update from Git Manager GUI 2026-03-19 23:51:57 +01:00
M_Viper 3d08d57d64 Update from Git Manager GUI 2026-03-19 23:51:55 +01:00
M_Viper 5e155c8398 Upload file style.css via GUI 2026-03-19 23:51:52 +01:00
M_Viper c858112d7f Upload file single.php via GUI 2026-03-19 23:51:41 +01:00
M_Viper b90684aa22 Upload file searchform.php via GUI 2026-03-19 23:51:35 +01:00
M_Viper 9aa5fc2507 Upload file search.php via GUI 2026-03-19 23:51:28 +01:00
M_Viper 53f5d57b32 Upload file page-login.php via GUI 2026-03-19 23:51:16 +01:00
M_Viper f9bd5558b7 Upload file page-bewerbung.php via GUI 2026-03-19 23:51:10 +01:00
M_Viper 18c07628f5 Upload file index.php via GUI 2026-03-19 23:50:58 +01:00
182 changed files with 17829 additions and 3441 deletions
+15 -19
View File
@@ -1,31 +1,28 @@
<?php get_header(); ?> <!-- HIER WIRD DER HEADER EINGEBUNDEN -->
<?php get_header(); ?>
<div class="container site-main">
<div class="content-area">
<!-- Hülle um den gesamten FAQ-Inhalt für einen festen Hintergrund -->
<div class="faq-archive-container">
<header class="page-header">
<h1 class="page-title"><?php _e( 'Häufig gestellte Fragen (FAQ)', 'minecraft-modern-theme' ); ?></h1>
<p><?php _e( 'Wählen Sie eine Kategorie, um die passenden Fragen zu sehen.', 'minecraft-modern-theme' ); ?></p>
</header>
<?php
// Alle FAQ-Kategorien abrufen
$categories = get_terms( array(
'taxonomy' => 'faq_category',
'orderby' => 'name',
'order' => 'ASC'
'order' => 'ASC',
) );
if ( ! empty( $categories ) && ! is_wp_error( $categories ) ) : ?>
<!-- Tab-Navigation -->
<ul class="faq-tabs">
<?php
<?php
$is_first = true;
foreach ( $categories as $category ) :
foreach ( $categories as $category ) :
$active_class = $is_first ? 'active' : '';
?>
<li>
@@ -33,20 +30,19 @@
<?php echo esc_html( $category->name ); ?>
</button>
</li>
<?php
$is_first = false;
<?php
$is_first = false;
endforeach; ?>
</ul>
<!-- Container für alle Tab-Inhalte -->
<div class="faq-tab-content-container">
<?php
<?php
$is_first_pane = true;
foreach ( $categories as $category ) :
foreach ( $categories as $category ) :
$active_pane_class = $is_first_pane ? 'active' : '';
?>
<div class="faq-tab-pane <?php echo esc_attr($active_pane_class); ?>" data-category="<?php echo esc_attr($category->slug); ?>">
<?php
$faqs = new WP_Query( array(
'post_type' => 'faq',
@@ -58,8 +54,8 @@
'terms' => $category->slug,
),
),
'orderby' => 'menu_order',
'order' => 'ASC',
'orderby' => 'menu_order',
'order' => 'ASC',
) );
if ( $faqs->have_posts() ) : ?>
@@ -77,8 +73,8 @@
<?php endif; ?>
</div>
<?php
$is_first_pane = false;
<?php
$is_first_pane = false;
endforeach; ?>
</div>
@@ -91,4 +87,4 @@
</div>
</div>
<?php get_footer(); ?> <!-- HIER WIRD DER FOOTER EINGEBUNDEN -->
<?php get_footer(); ?>
+37 -74
View File
@@ -1,74 +1,37 @@
<?php
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* =============================================================================
* HAUPTFUNKTION: Stylesheets korrekt laden
* =============================================================================
*
* Diese Funktion lädt das Stylesheet des Parents zuerst.
* Danach wird das Stylesheet des Childs geladen.
* So können CSS-Regeln im Child Theme das Parent Theme gezielt überschreiben.
*/
function minecraft_modern_child_enqueue_styles() {
// 1. Das Stylesheet des Parent Themes laden
// get_template_directory_uri() zeigt auf den Ordner des Parent Themes.
// Der Handle 'minecraft-modern-style' sollte exakt dem im Parent übereinstimmen.
$parent_style = 'minecraft-modern-style';
wp_enqueue_style(
$parent_style,
get_template_directory_uri() . '/style.css',
array(),
wp_get_theme( get_template() )->get( 'Version' ) // WICHTIG: Wir nutzen die Version des Parents
);
// 2. Das Stylesheet des Child Themes laden
// get_stylesheet_directory_uri() zeigt auf den Ordner des Child Themes.
// Die Abhängigkeit 'parent-style' stellt sicher, dass es NACH dem Parent geladen wird.
wp_enqueue_style(
'minecraft-modern-child-style',
get_stylesheet_directory_uri() . '/style.css',
array( $parent_style ),
wp_get_theme()->get( 'Version' ) // Die Version des Childs (für Cache-Reset)
);
}
add_action( 'wp_enqueue_scripts', 'minecraft_modern_child_enqueue_styles' );
/**
* =============================================================================
* (OPTIONAL) Beispiel: Ein Skript des Parent Themes überschreiben
* =============================================================================
*
* Falls du die Logik des Sliders (z.B. die slider-init.js) im Child Theme
* anpassen möchtest, könntest du diese Technik nutzen.
* Dies ist NUR NOTWENDIG, wenn du Änderungen am JavaScript des Sliders vornehmen willst.
*
* Um dies zu aktivieren, entferne die Slashs (/) am Anfang und Ende dieses Blocks.
*/
/*
function minecraft_modern_child_swap_faq_script() {
// Entfernt das Skript, das vom Parent Theme mit dem Handle 'faq-accordion-script' registriert wurde.
wp_deregister_script( 'faq-accordion-script' );
// Lädt dein neues Skript aus dem Child Theme.
// Wir verwenden denselben Namen ('Handle'), um WordPress klar zu machen,
// dass dieses Skript das Original ersetzt.
wp_enqueue_script(
'faq-accordion-script', // Derselbe Handle wie im Parent Theme
get_stylesheet_directory_uri() . '/js/faq-accordion.js', // Pfad zur neuen JS-Datei im Child Theme
array( 'jquery' ), // Abhängigkeiten (hier jQuery)
'1.0', // Version deines Skripts
true // Im Footer laden
);
}
// Diese Funktion wird mit einer höheren Priorität (20) ausgeführt,
// also NACHDEM das Parent Theme sein Skript geladen hat.
add_action( 'wp_enqueue_scripts', 'minecraft_modern_child_swap_faq_script', 20 );
*/
?>
<?php
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* =============================================================================
* HAUPTFUNKTION: Stylesheets korrekt laden
* =============================================================================
*/
function minecraft_modern_child_enqueue_styles() {
$parent_style = 'minecraft-modern-style';
// Cache-Busting über filemtime() statt der statischen Theme-Version:
// sonst liefern Browser nach einer CSS-Änderung weiter die alte Datei aus.
wp_enqueue_style(
$parent_style,
get_template_directory_uri() . '/style.css',
array(),
filemtime( get_template_directory() . '/style.css' )
);
wp_enqueue_style(
'minecraft-modern-child-style',
get_stylesheet_directory_uri() . '/style.css',
array( $parent_style ),
filemtime( get_stylesheet_directory() . '/style.css' )
);
// BUG-FIX: Der Nav-Fix-CSS für .submenu-toggle (Desktop-Ausblendung) stand
// bereits vollständig in child/style.css. Das wp_add_inline_style() hier
// hat exakt denselben CSS-Block ein zweites Mal in den <head> injiziert.
// Entfernt – style.css ist die einzige Quelle der Wahrheit.
}
add_action( 'wp_enqueue_scripts', 'minecraft_modern_child_enqueue_styles' );
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

+171 -55
View File
@@ -1,55 +1,171 @@
/*
Theme Name: Minecraft Modern Theme Child
Theme URI: https://git.viper.ipv64.net/M_Viper/Minecraft-Modern-Theme
Description: Ein Child Theme für das Minecraft Modern Theme.
Author: M_Viper
Author URI: https://M-Viper.de
Template: Minecraft-Modern-Theme
Version: 1.1.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: minecraft-modern-theme-child
*/
/* =Hier kommen Ihre CSS-Anpassungen hin
-------------------------------------------------------------- */
/* Kopieren Sie Ihre geänderten CSS-Regeln hierhin.
Zum Beispiel die neuen Regeln für die FAQ-Tabs:
*/
.faq-tab-content-container {
display: grid; /* Wichtig: Erzeugt ein Gitter-Layout */
/* Alle direkten Kinder (.faq-tab-pane) werden automatisch auf die gleiche Höhe gesetzt */
}
.faq-tab-pane {
/* Grid-Item-Styling */
grid-area: 1 / 1 / 2 / 2; /* Alle Panes belegen dieselbe Gitterzelle */
/* Visuelles Ein- und Ausblenden */
opacity: 0; /* Standardmäßig unsichtbar */
pointer-events: none; /* Nicht klickbar, wenn unsichtbar */
transition: opacity 0.4s ease-in-out;
}
.faq-tab-pane.active {
opacity: 1; /* Sichtbar machen */
pointer-events: auto; /* Wieder klickbar machen */
}
/* ===================================================================
LAYOUT-SHIFT-FIX: Slider verstecken, bis er initialisiert ist
=================================================================== */
.hero-slider {
/* Verstecke den Slider initial, um ein "Zusammenschnappen" zu verhindern */
opacity: 0;
/* Füge einen sanften Übergangseffekt für das Einblenden hinzu */
transition: opacity 0.4s ease-in-out;
}
/* Diese Klasse wird vom JavaScript hinzugefügt, wenn der Slider bereit ist */
.hero-slider.swiper-initialized {
/* Mache den Slider sichtbar */
opacity: 1;
}
/* Fügen Sie hier zukünftig weiteres eigenes CSS hinzu */
/*
Theme Name: Minecraft Modern Theme Child
Theme URI: https://git.viper.ipv64.net/M_Viper/Minecraft-Modern-Theme
Description: Ein Child Theme für das Minecraft Modern Theme.
Author: M_Viper
Author URI: https://M-Viper.de
Template: Minecraft-Modern-Theme
Version: 1.1.1
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: minecraft-modern-theme-child
*/
/* ===================================================================
SIDEBAR FLYOUT: Sichtbarkeit
=================================================================== */
/* Standardmäßig versteckt aber NICHT display:none damit
getBoundingClientRect() korrekte Werte liefert */
.header-sidebar .sub-menu {
opacity: 0 !important;
pointer-events: none !important;
display: block !important;
transition: opacity 0.15s ease !important;
}
/* Sichtbar wenn li gehoverd oder flyout-open gesetzt */
.header-sidebar .primary-menu > li.menu-item-has-children:hover > .sub-menu,
.header-sidebar .primary-menu > li.menu-item-has-children.flyout-open > .sub-menu,
.header-sidebar .menu-item.active > .sub-menu {
opacity: 1 !important;
pointer-events: auto !important;
}
/* ===================================================================
FAQ TABS
=================================================================== */
.faq-tab-content-container { display: grid; }
.faq-tab-pane {
grid-area: 1 / 1 / 2 / 2;
opacity: 0;
pointer-events: none;
transition: opacity 0.4s ease-in-out;
}
.faq-tab-pane.active { opacity: 1; pointer-events: auto; }
/* ===================================================================
SLIDER
=================================================================== */
.hero-slider { opacity: 0; transition: opacity 0.4s ease-in-out; }
.hero-slider.swiper-initialized { opacity: 1; }
/* ===================================================================
NAVIGATION: submenu-toggle auf Desktop nur für Classic/Centered/Mega
ausblenden — Sidebar-Layout braucht den Button
=================================================================== */
@media (min-width: 993px) {
.site-header--classic .submenu-toggle,
.site-header--centered .submenu-toggle,
.site-header--mega .submenu-toggle {
display: none !important;
width: 0 !important;
height: 0 !important;
padding: 0 !important;
margin: 0 !important;
overflow: hidden !important;
pointer-events: none !important;
}
}
@media (max-width: 992px) {
.submenu-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
background: none;
border: none;
cursor: pointer;
padding: 4px 8px;
color: inherit;
font-size: 0.8em;
}
.menu-item-has-children.active > .submenu-toggle i {
transform: rotate(180deg);
}
}/*
Theme Name: Minecraft Modern Theme Child
Theme URI: https://git.viper.ipv64.net/M_Viper/Minecraft-Modern-Theme
Description: Ein Child Theme für das Minecraft Modern Theme.
Author: M_Viper
Author URI: https://M-Viper.de
Template: Minecraft-Modern-Theme
Version: 1.1.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: minecraft-modern-theme-child
*/
/* ===================================================================
SIDEBAR FLYOUT: Sichtbarkeit
=================================================================== */
/* Standardmäßig versteckt aber NICHT display:none damit
getBoundingClientRect() korrekte Werte liefert */
.header-sidebar .sub-menu {
opacity: 0 !important;
pointer-events: none !important;
display: block !important;
transition: opacity 0.15s ease !important;
}
/* Sichtbar wenn li gehoverd oder flyout-open gesetzt */
.header-sidebar .primary-menu > li.menu-item-has-children:hover > .sub-menu,
.header-sidebar .primary-menu > li.menu-item-has-children.flyout-open > .sub-menu,
.header-sidebar .menu-item.active > .sub-menu {
opacity: 1 !important;
pointer-events: auto !important;
}
/* ===================================================================
FAQ TABS
=================================================================== */
.faq-tab-content-container { display: grid; }
.faq-tab-pane {
grid-area: 1 / 1 / 2 / 2;
opacity: 0;
pointer-events: none;
transition: opacity 0.4s ease-in-out;
}
.faq-tab-pane.active { opacity: 1; pointer-events: auto; }
/* ===================================================================
SLIDER
=================================================================== */
.hero-slider { opacity: 0; transition: opacity 0.4s ease-in-out; }
.hero-slider.swiper-initialized { opacity: 1; }
/* ===================================================================
NAVIGATION: submenu-toggle auf Desktop nur für Classic/Centered/Mega
ausblenden — Sidebar-Layout braucht den Button
=================================================================== */
@media (min-width: 993px) {
.site-header--classic .submenu-toggle,
.site-header--centered .submenu-toggle,
.site-header--mega .submenu-toggle {
display: none !important;
width: 0 !important;
height: 0 !important;
padding: 0 !important;
margin: 0 !important;
overflow: hidden !important;
pointer-events: none !important;
}
}
@media (max-width: 992px) {
.submenu-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
background: none;
border: none;
cursor: pointer;
padding: 4px 8px;
color: inherit;
font-size: 0.8em;
}
.menu-item-has-children.active > .submenu-toggle i {
transform: rotate(180deg);
}
}
+192
View File
@@ -0,0 +1,192 @@
<?php get_header(); ?>
<main id="primary" class="site-main">
<div class="container">
<div class="content-area">
<div class="error-404-container">
<div class="error-404-visual">
<div class="error-404-code">404</div>
<div class="error-404-blocks">
<!-- Minecraft-style Blöcke als Dekoration -->
<span class="block block-grass"></span>
<span class="block block-dirt"></span>
<span class="block block-stone"></span>
</div>
</div>
<div class="error-404-content">
<h1 class="error-404-title">
<?php _e('Diese Seite ist verloren gegangen...', 'minecraft-modern-theme'); ?>
</h1>
<p class="error-404-subtitle">
<?php _e('Wie eine Map ohne Spawn-Punkt – diese Seite existiert nicht (mehr).', 'minecraft-modern-theme'); ?>
</p>
<div class="error-404-actions">
<a href="<?php echo esc_url( home_url('/') ); ?>" class="error-404-btn primary">
<i class="fas fa-home"></i> <?php _e('Zur Startseite', 'minecraft-modern-theme'); ?>
</a>
<a href="javascript:history.back()" class="error-404-btn secondary">
<i class="fas fa-arrow-left"></i> <?php _e('Zurück', 'minecraft-modern-theme'); ?>
</a>
</div>
<!-- Suchformular -->
<div class="error-404-search">
<p><?php _e('Oder suche direkt nach dem was du brauchst:', 'minecraft-modern-theme'); ?></p>
<?php get_search_form(); ?>
</div>
<!-- Letzte Beiträge als Hilfestellung -->
</div>
</div>
</div>
</div>
</main>
<style>
.error-404-container {
display: flex;
gap: 60px;
align-items: center;
padding: 60px 0;
min-height: 60vh;
}
.error-404-visual {
flex-shrink: 0;
text-align: center;
}
.error-404-code {
font-size: clamp(80px, 15vw, 160px);
font-weight: 900;
line-height: 1;
color: var(--primary-accent, #00d4ff);
text-shadow: 0 0 40px rgba(0, 212, 255, 0.3);
letter-spacing: -4px;
}
.error-404-blocks {
display: flex;
justify-content: center;
gap: 6px;
margin-top: 16px;
}
.block {
width: 32px;
height: 32px;
border-radius: 4px;
display: inline-block;
image-rendering: pixelated;
}
.block-grass { background: linear-gradient(to bottom, #5c8a1e 40%, #6b4c2a 40%); }
.block-dirt { background: #6b4c2a; }
.block-stone { background: #888; }
.error-404-content {
flex: 1;
}
.error-404-title {
font-size: clamp(1.4rem, 3vw, 2rem);
margin: 0 0 12px;
}
.error-404-subtitle {
color: var(--text-muted, #a0a0a0);
margin-bottom: 30px;
font-size: 1.05rem;
}
.error-404-actions {
display: flex;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 30px;
}
.error-404-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 12px 24px;
border-radius: 6px;
font-weight: 600;
text-decoration: none;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.error-404-btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.2);
}
.error-404-btn.primary {
background: var(--primary-accent, #00d4ff);
color: #fff;
}
.error-404-btn.secondary {
background: var(--card-bg);
color: inherit;
border: 1px solid rgba(255,255,255,0.1);
}
.error-404-search {
margin-bottom: 30px;
}
.error-404-search p {
color: var(--text-muted, #a0a0a0);
margin-bottom: 10px;
}
.error-404-recent h3 {
font-size: 1rem;
color: var(--text-muted, #a0a0a0);
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.error-404-recent-list {
list-style: none;
padding: 0;
margin: 0;
}
.error-404-recent-list li {
padding: 8px 0;
border-bottom: 1px solid rgba(255,255,255,0.06);
display: flex;
align-items: center;
gap: 10px;
}
.error-404-recent-list li i {
color: var(--primary-accent, #00d4ff);
font-size: 0.75rem;
flex-shrink: 0;
}
.error-404-recent-list a {
text-decoration: none;
transition: color 0.2s;
}
.error-404-recent-list a:hover {
color: var(--primary-accent, #00d4ff);
}
@media (max-width: 768px) {
.error-404-container {
flex-direction: column;
gap: 30px;
padding: 40px 0;
text-align: center;
}
.error-404-actions {
justify-content: center;
}
}
</style>
<?php get_footer(); ?>
+15 -20
View File
@@ -1,31 +1,27 @@
<?php get_header(); ?> <!-- HIER WIRD DER HEADER EINGEBUNDEN -->
<?php get_header(); ?>
<div class="container site-main">
<div class="content-area">
<!-- Hülle um den gesamten FAQ-Inhalt für einen festen Hintergrund -->
<div class="faq-archive-container">
<header class="page-header">
<h1 class="page-title"><?php _e( 'Häufig gestellte Fragen (FAQ)', 'minecraft-modern-theme' ); ?></h1>
<p><?php _e( 'Wählen Sie eine Kategorie, um die passenden Fragen zu sehen.', 'minecraft-modern-theme' ); ?></p>
</header>
<?php
// Alle FAQ-Kategorien abrufen
$categories = get_terms( array(
'taxonomy' => 'faq_category',
'orderby' => 'name',
'order' => 'ASC'
'order' => 'ASC',
) );
if ( ! empty( $categories ) && ! is_wp_error( $categories ) ) : ?>
<!-- Tab-Navigation -->
<ul class="faq-tabs">
<?php
<?php
$is_first = true;
foreach ( $categories as $category ) :
foreach ( $categories as $category ) :
$active_class = $is_first ? 'active' : '';
?>
<li>
@@ -33,20 +29,19 @@
<?php echo esc_html( $category->name ); ?>
</button>
</li>
<?php
$is_first = false;
<?php
$is_first = false;
endforeach; ?>
</ul>
<!-- Container für alle Tab-Inhalte -->
<div class="faq-tab-content-container">
<?php
<?php
$is_first_pane = true;
foreach ( $categories as $category ) :
foreach ( $categories as $category ) :
$active_pane_class = $is_first_pane ? 'active' : '';
?>
<div class="faq-tab-pane <?php echo esc_attr($active_pane_class); ?>" data-category="<?php echo esc_attr($category->slug); ?>">
<?php
$faqs = new WP_Query( array(
'post_type' => 'faq',
@@ -58,8 +53,8 @@
'terms' => $category->slug,
),
),
'orderby' => 'menu_order',
'order' => 'ASC',
'orderby' => 'menu_order',
'order' => 'ASC',
) );
if ( $faqs->have_posts() ) : ?>
@@ -77,8 +72,8 @@
<?php endif; ?>
</div>
<?php
$is_first_pane = false;
<?php
$is_first_pane = false;
endforeach; ?>
</div>
@@ -91,4 +86,4 @@
</div>
</div>
<?php get_footer(); ?> <!-- HIER WIRD DER FOOTER EINGEBUNDEN -->
<?php get_footer(); ?>
+73 -12
View File
@@ -3,45 +3,106 @@
<div class="container site-main">
<div class="content-area">
<div class="team-archive-container">
<header class="page-header">
<h1 class="page-title">Unser Team</h1>
<p class="page-description">Lerne die Leute kennen, die diesen Server am Laufen halten.</p>
</header>
<?php
$query = new WP_Query(array('post_type' => 'team_member', 'posts_per_page' => -1, 'orderby' => 'menu_order', 'order' => 'ASC'));
$query = new WP_Query( array(
'post_type' => 'team_member',
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
) );
if ( $query->have_posts() ) : ?>
<div class="team-grid">
<?php while ( $query->have_posts() ) : $query->the_post();
$rank_string = get_post_meta( get_the_ID(), '_team_member_rank', true );
$img = get_the_post_thumbnail_url( get_the_ID(), 'medium' );
if ( !$img ) $img = get_template_directory_uri() . '/images/default-avatar.png';
$uuid = get_post_meta( get_the_ID(), '_team_member_uuid', true );
$banner_id = get_post_meta( get_the_ID(), '_team_member_banner', true );
$img = get_the_post_thumbnail_url( get_the_ID(), 'medium' );
$banner_url = $banner_id ? wp_get_attachment_image_url( $banner_id, 'medium_large' ) : false;
// UUID hat Vorrang – Minecraft Avatar via visage.surgeplay.com
if ( $uuid ) {
$avatar_url = 'https://visage.surgeplay.com/bust/' . esc_attr( $uuid ) . '.png';
} elseif ( $img ) {
$avatar_url = $img;
} else {
$avatar_url = false;
}
$use_placeholder = ! $avatar_url;
$initials = mb_strtoupper( mb_substr( get_the_title(), 0, 1 ) );
?>
<article class="team-card">
<div class="team-image-wrapper">
<img src="<?php echo esc_url($img); ?>" alt="<?php echo esc_attr(get_the_title()); ?>">
<!-- Banner -->
<div class="team-card-banner" <?php if ( $banner_url ) echo 'style="background-image:url(' . esc_url($banner_url) . ')"'; ?>>
</div>
<!-- Avatar -->
<div class="team-image-wrapper">
<?php if ( $avatar_url ) : ?>
<img src="<?php echo esc_url( $avatar_url ); ?>"
alt="<?php echo esc_attr( get_the_title() ); ?>"
loading="lazy">
<?php else : ?>
<div class="team-avatar-placeholder">
<?php echo esc_html( $initials ); ?>
</div>
<?php endif; ?>
</div>
<div class="team-info">
<h3 class="team-name"><?php the_title(); ?></h3>
<div class="team-ranks-wrapper">
<?php if ( !empty($rank_string) ) {
$ranks = explode(',', $rank_string);
<?php if ( ! empty( $rank_string ) ) {
$ranks = explode( ',', $rank_string );
foreach ( $ranks as $r ) {
echo '<span class="team-rank">' . esc_html(trim($r)) . '</span>';
echo '<span class="team-rank">' . esc_html( trim( $r ) ) . '</span>';
}
} ?>
</div>
<div class="team-bio"><?php the_excerpt(); ?></div>
</div>
</article>
<?php endwhile; ?>
<?php endwhile; wp_reset_postdata(); ?>
</div>
<?php wp_reset_postdata(); ?>
<?php else : ?>
<p>Noch keine Teammitglieder.</p>
<p><?php _e('Noch keine Teammitglieder.', 'minecraft-modern-theme'); ?></p>
<?php endif; ?>
</div>
</div>
</div>
<style>
/* Avatar-Placeholder wenn kein Bild gesetzt ist */
.team-avatar-placeholder {
width: 100%;
aspect-ratio: 1;
background: var(--card-bg);
border-radius: 8px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: var(--primary-accent, #00d4ff);
font-size: 2.5rem;
font-weight: 700;
gap: 4px;
}
.team-avatar-placeholder svg {
width: 60%;
height: 60%;
color: var(--primary-accent, #00d4ff);
}
.team-avatar-placeholder span {
font-size: 2rem;
line-height: 1;
}
</style>
<?php get_footer(); ?>
+461
View File
@@ -0,0 +1,461 @@
<?php get_header(); ?>
<style>
/* Basis-Styles für Player */
#yt-player-container {
position: relative;
width: 100%;
padding-bottom: 56.25%; /* 16:9 */
height: 0;
overflow: hidden;
}
#yt-player-container iframe,
#yt-player-container #yt-player {
position: absolute;
top: 0;
left: 0;
width: 100% !important;
height: 100% !important;
}
#other-player-container {
position: relative;
width: 100%;
padding-bottom: 56.25%;
height: 0;
overflow: hidden;
}
#other-player-container iframe,
#other-player-container video {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
/* === NEU: Styles für das Livestream Popup (Lightbox) === */
.livestream-lightbox {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 10000;
display: none; /* Wird via JS auf flex gesetzt */
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.3s ease;
}
.livestream-lightbox.is-open {
display: flex;
opacity: 1;
}
.livestream-lightbox-backdrop {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(8px);
}
.livestream-lightbox-box {
position: relative;
width: 90%;
max-width: 1100px;
background: #1a1a1a;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
transform: translateY(20px);
transition: transform 0.3s ease;
}
.livestream-lightbox.is-open .livestream-lightbox-box {
transform: translateY(0);
}
.livestream-lightbox-head {
padding: 15px 25px;
display: flex;
justify-content: space-between;
align-items: center;
background: #222;
border-bottom: 1px solid #333;
}
.livestream-lightbox-title {
margin: 0;
font-size: 1.2rem;
color: #fff;
}
.livestream-lightbox-close {
background: none;
border: none;
color: #aaa;
font-size: 24px;
cursor: pointer;
transition: color 0.2s;
}
.livestream-lightbox-close:hover {
color: #fff;
}
.livestream-lightbox-player {
position: relative;
padding-bottom: 56.25%;
height: 0;
background: #000;
}
.livestream-lightbox-player iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: none;
}
.livestream-lightbox-meta {
padding: 15px 25px;
background: #222;
text-align: right;
}
.livestream-lightbox-meta a {
color: #00dcff;
text-decoration: none;
font-weight: bold;
}
/* Klick-Indikator für die Karten */
.video-livestream-list > div {
cursor: pointer;
transition: transform 0.2s ease;
}
.video-livestream-list > div:hover {
transform: scale(1.02);
}
</style>
<div class="container site-main">
<div class="content-area">
<div class="video-archive-container">
<header class="page-header">
<h1 class="page-title">
<i class="fas fa-play-circle"></i> <?php _e( 'Videos', 'minecraft-modern-theme' ); ?>
</h1>
<p class="page-description">
<?php _e( 'Alle Videos auf einem Blick. Klicke auf ein Video um es direkt hier anzusehen.', 'minecraft-modern-theme' ); ?>
</p>
<?php
$categories = array();
$all_vids = get_posts( array( 'post_type' => 'mm_video', 'posts_per_page' => -1, 'fields' => 'ids' ) );
foreach ( $all_vids as $vid_id ) {
$cat = get_post_meta( $vid_id, '_mm_video_category', true );
if ( $cat ) $categories[ $cat ] = $cat;
}
if ( count( $categories ) > 1 ) : ?>
<div class="video-filter-bar">
<button class="video-filter-btn active" data-filter="all">
<?php _e( 'Alle', 'minecraft-modern-theme' ); ?>
</button>
<?php foreach ( $categories as $cat ) : ?>
<button class="video-filter-btn" data-filter="<?php echo esc_attr( $cat ); ?>">
<?php echo esc_html( $cat ); ?>
</button>
<?php endforeach; ?>
</div>
<?php endif; ?>
</header>
<?php
$livestream_groups = mm_video_get_livestream_groups();
?>
<?php if ( ! empty( $livestream_groups ) ) : ?>
<div class="video-livestream-section">
<h2 class="section-livestream-title">
<span class="live-indicator"></span>
<span><?php _e( 'JETZT LIVE', 'minecraft-modern-theme' ); ?></span>
</h2>
<div class="video-livestream-list">
<?php foreach ( $livestream_groups as $group_index => $livestream_group ) : ?>
<?php echo mm_video_render_livestream_group( $livestream_group, $group_index ); ?>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<?php
$query = new WP_Query( array(
'post_type' => 'mm_video',
'posts_per_page' => -1,
'orderby' => 'menu_order date',
'order' => 'ASC',
) );
if ( $query->have_posts() ) : ?>
<div class="video-grid" id="video-grid">
<?php while ( $query->have_posts() ) : $query->the_post();
$url = get_post_meta( get_the_ID(), '_mm_video_url', true );
$category = get_post_meta( get_the_ID(), '_mm_video_category', true );
$thumb = get_the_post_thumbnail_url( get_the_ID(), 'medium_large' );
$type = $url ? mm_video_get_type( $url ) : 'unknown';
if ( ! $thumb && $url && $type === 'youtube' ) {
if ( preg_match( '/(?:youtube\.com\/(?:watch\?v=|shorts\/)|youtu\.be\/)([a-zA-Z0-9_-]{11})/', $url, $m ) ) {
$thumb = 'https://img.youtube.com/vi/' . $m[1] . '/maxresdefault.jpg';
}
}
$platform_icons = array(
'youtube' => array( 'icon' => 'fab fa-youtube', 'color' => '#ff0000' ),
'vimeo' => array( 'icon' => 'fab fa-vimeo-v', 'color' => '#1ab7ea' ),
'twitch' => array( 'icon' => 'fab fa-twitch', 'color' => '#9146ff' ),
'mp4' => array( 'icon' => 'fas fa-film', 'color' => '#aaa' ),
);
$platform = isset( $platform_icons[$type] ) ? $platform_icons[$type] : array( 'icon' => 'fas fa-play', 'color' => '#aaa' );
?>
<div class="video-card" data-category="<?php echo esc_attr( $category ); ?>">
<div class="video-card-thumb"
data-url="<?php echo esc_attr( $url ); ?>"
data-type="<?php echo esc_attr( $type ); ?>"
data-title="<?php echo esc_attr( get_the_title() ); ?>">
<?php if ( $thumb ) : ?>
<img src="<?php echo esc_url( $thumb ); ?>" alt="<?php echo esc_attr( get_the_title() ); ?>" loading="lazy">
<?php else : ?>
<div class="video-card-no-thumb"><i class="fas fa-play-circle"></i></div>
<?php endif; ?>
<div class="video-card-hover">
<i class="fas fa-play"></i>
</div>
<span class="video-platform-badge" style="color:<?php echo esc_attr($platform['color']); ?>">
<i class="<?php echo esc_attr($platform['icon']); ?>"></i>
</span>
</div>
<div class="video-card-body">
<h3 class="video-card-title"><?php the_title(); ?></h3>
<?php if ( has_excerpt() ) : ?>
<p class="video-card-excerpt"><?php echo wp_trim_words( get_the_excerpt(), 12 ); ?></p>
<?php endif; ?>
<?php if ( $category ) : ?>
<span class="video-card-tag"><?php echo esc_html( $category ); ?></span>
<?php endif; ?>
</div>
</div>
<?php endwhile; wp_reset_postdata(); ?>
</div>
<div id="video-lightbox" class="video-lightbox" style="display:none;" aria-hidden="true">
<div class="video-lightbox-backdrop"></div>
<div class="video-lightbox-box">
<div class="video-lightbox-head">
<h3 class="video-lightbox-title"></h3>
<button class="video-lightbox-close" aria-label="<?php esc_attr_e('Schließen','minecraft-modern-theme'); ?>">
<i class="fas fa-times"></i>
</button>
</div>
<div class="video-lightbox-player">
<div id="yt-player-container" style="display:none;">
<div id="yt-player"></div>
</div>
<div id="other-player-container" style="display:none;"></div>
</div>
</div>
</div>
<?php else : ?>
<div class="video-empty">
<i class="fas fa-video-slash"></i>
<p><?php _e( 'Noch keine Videos vorhanden.', 'minecraft-modern-theme' ); ?></p>
<?php if ( current_user_can('publish_posts') ) : ?>
<a href="<?php echo esc_url( admin_url('post-new.php?post_type=mm_video') ); ?>" class="btn-primary">
<i class="fas fa-plus"></i> <?php _e('Erstes Video hinzufügen','minecraft-modern-theme'); ?>
</a>
<?php endif; ?>
</div>
<?php endif; ?>
</div>
</div>
</div>
<script src="https://www.youtube.com/iframe_api"></script>
<script>
var ytPlayer = null;
var ytPlayerReady = false;
var pendingVideoId = null;
var livestreamPlayers = new Map();
var livestreamPlayerCallbacks = [];
function onYouTubeIframeAPIReady() {
ytPlayer = new YT.Player('yt-player', {
height: '100%',
width: '100%',
playerVars: { autoplay: 1, rel: 0, modestbranding: 1 },
events: {
onReady: function(e) {
ytPlayerReady = true;
if (pendingVideoId) {
e.target.loadVideoById(pendingVideoId);
pendingVideoId = null;
}
}
}
});
livestreamPlayerCallbacks.forEach(function(callback) { callback(); });
livestreamPlayerCallbacks = [];
}
document.addEventListener('DOMContentLoaded', function() {
var lb = document.getElementById('video-lightbox');
var lbTitle = lb ? lb.querySelector('.video-lightbox-title') : null;
var ytContainer = document.getElementById('yt-player-container');
var otContainer = document.getElementById('other-player-container');
function extractYouTubeId(url) {
var m = url.match(/(?:youtube\.com\/(?:watch\?v=|shorts\/|embed\/)|youtu\.be\/)([a-zA-Z0-9_-]{11})/);
return m ? m[1] : null;
}
function buildOtherEmbed(url, title) {
var t = (title||'Video').replace(/"/g,'&quot;');
var viM = url.match(/vimeo\.com\/(?:video\/)?(\d+)/);
if (viM) return '<iframe src="https://player.vimeo.com/video/'+viM[1]+'?autoplay=1&dnt=1" title="'+t+'" frameborder="0" allowfullscreen allow="autoplay; encrypted-media"></iframe>';
var tvM = url.match(/twitch\.tv\/videos\/(\d+)/);
if (tvM) return '<iframe src="https://player.twitch.tv/?video=v'+tvM[1]+'&parent='+location.hostname+'&autoplay=true" title="'+t+'" frameborder="0" allowfullscreen></iframe>';
var tcM = url.match(/twitch\.tv\/([a-zA-Z0-9_]+)$/);
if (tcM) return '<iframe src="https://player.twitch.tv/?channel='+tcM[1]+'&parent='+location.hostname+'&autoplay=true" title="'+t+'" frameborder="0" allowfullscreen></iframe>';
if (/\.(mp4|webm|ogv)(\?.*)?$/i.test(url)) return '<video controls autoplay playsinline><source src="'+url+'" type="video/mp4"></video>';
return '<p style="color:#aaa;text-align:center;padding:30px;">Ungültige URL</p>';
}
function openLb(url, title, type) {
if (!lb) return;
if (lbTitle) lbTitle.textContent = title || '';
lb.style.display = 'flex';
lb.setAttribute('aria-hidden','false');
document.body.style.overflow = 'hidden';
setTimeout(function(){ lb.classList.add('is-open'); }, 10);
var ytId = extractYouTubeId(url);
if (ytId) {
otContainer.style.display = 'none';
otContainer.innerHTML = '';
ytContainer.style.display = 'block';
if (ytPlayerReady && ytPlayer) ytPlayer.loadVideoById(ytId); else pendingVideoId = ytId;
} else {
ytContainer.style.display = 'none';
if (ytPlayerReady && ytPlayer) ytPlayer.stopVideo();
otContainer.style.display = 'block';
otContainer.innerHTML = buildOtherEmbed(url, title);
}
}
function closeLb() {
if (!lb) return;
lb.classList.remove('is-open');
setTimeout(function(){
lb.style.display = 'none';
lb.setAttribute('aria-hidden','true');
document.body.style.overflow = '';
if (ytPlayerReady && ytPlayer) ytPlayer.stopVideo();
ytContainer.style.display = 'none';
otContainer.innerHTML = '';
otContainer.style.display = 'none';
}, 300);
}
document.querySelectorAll('.video-card-thumb').forEach(function(el) {
el.addEventListener('click', function() { openLb(this.dataset.url, this.dataset.title, this.dataset.type); });
});
if (lb) {
lb.querySelector('.video-lightbox-close').addEventListener('click', closeLb);
lb.querySelector('.video-lightbox-backdrop').addEventListener('click', closeLb);
}
document.addEventListener('keydown', function(e){ if (e.key==='Escape') closeLb(); });
// Filter
document.querySelectorAll('.video-filter-btn').forEach(function(btn) {
btn.addEventListener('click', function() {
document.querySelectorAll('.video-filter-btn').forEach(function(b){ b.classList.remove('active'); });
this.classList.add('active');
var f = this.dataset.filter;
document.querySelectorAll('.video-card').forEach(function(c) {
c.style.display = (f === 'all' || c.dataset.category === f) ? '' : 'none';
});
});
});
// === Livestream Lightbox System ===
var livestreamLightbox = document.createElement('div');
livestreamLightbox.id = 'livestream-lightbox';
livestreamLightbox.className = 'livestream-lightbox';
livestreamLightbox.setAttribute('aria-hidden', 'true');
livestreamLightbox.innerHTML = `
<div class="livestream-lightbox-backdrop"></div>
<div class="livestream-lightbox-box">
<div class="livestream-lightbox-head">
<h3 class="livestream-lightbox-title"></h3>
<button class="livestream-lightbox-close" aria-label="Schließen"><i class="fas fa-times"></i></button>
</div>
<div class="livestream-lightbox-player"></div>
<div class="livestream-lightbox-meta"></div>
</div>
`;
document.body.appendChild(livestreamLightbox);
var lsLightbox = document.getElementById('livestream-lightbox');
var lsTitle = lsLightbox.querySelector('.livestream-lightbox-title');
var lsPlayer = lsLightbox.querySelector('.livestream-lightbox-player');
var lsMeta = lsLightbox.querySelector('.livestream-lightbox-meta');
function openLivestreamLightbox(embedUrl, title, profileUrl, platform) {
lsTitle.textContent = title || 'Livestream';
// Wir nutzen ein sauberes Iframe für das Popup
lsPlayer.innerHTML = '<iframe src="' + embedUrl + '" allow="autoplay; encrypted-media" allowfullscreen></iframe>';
var icon = platform === 'youtube' ? 'fab fa-youtube' : (platform === 'twitch' ? 'fab fa-twitch' : 'fas fa-play');
lsMeta.innerHTML = profileUrl ? '<a href="' + profileUrl + '" target="_blank" rel="noopener"><i class="' + icon + '"></i> Zum Kanal</a>' : '';
lsLightbox.style.display = 'flex';
lsLightbox.setAttribute('aria-hidden', 'false');
document.body.style.overflow = 'hidden';
setTimeout(function() { lsLightbox.classList.add('is-open'); }, 10);
}
function closeLivestreamLightbox() {
lsLightbox.classList.remove('is-open');
setTimeout(function() {
lsLightbox.style.display = 'none';
lsLightbox.setAttribute('aria-hidden', 'true');
document.body.style.overflow = '';
lsPlayer.innerHTML = '';
}, 300);
}
lsLightbox.querySelector('.livestream-lightbox-close').addEventListener('click', closeLivestreamLightbox);
lsLightbox.querySelector('.livestream-lightbox-backdrop').addEventListener('click', closeLivestreamLightbox);
// Klick-Event für die "Jetzt Live" Karten
document.querySelectorAll('.video-livestream-list > div').forEach(function(card) {
card.addEventListener('click', function(e) {
// Falls auf den echten Button im Card geklickt wird, Standardverhalten lassen
if (e.target.closest('.btn-primary')) return;
e.preventDefault();
var iframe = card.querySelector('iframe');
var embedUrl = iframe ? iframe.src : '';
var title = card.querySelector('h3') ? card.querySelector('h3').textContent : 'Livestream';
var link = card.querySelector('.btn-primary') ? card.querySelector('.btn-primary').href : '';
var platform = embedUrl.includes('twitch') ? 'twitch' : 'youtube';
if (embedUrl && !embedUrl.includes('about:blank')) {
openLivestreamLightbox(embedUrl, title, link, platform);
}
});
});
});
</script>
<?php get_footer(); ?>
+115
View File
@@ -0,0 +1,115 @@
<?php get_header(); ?>
<main id="primary" class="site-main">
<div class="container">
<div class="content-area">
<header class="archive-header">
<?php
if ( is_category() ) {
echo '<div class="archive-type-badge"><i class="fas fa-folder-open"></i> ' . __('Kategorie', 'minecraft-modern-theme') . '</div>';
the_archive_description( '<div class="archive-description">', '</div>' );
} elseif ( is_tag() ) {
echo '<div class="archive-type-badge"><i class="fas fa-hashtag"></i> ' . __('Tag', 'minecraft-modern-theme') . '</div>';
the_archive_description( '<div class="archive-description">', '</div>' );
} elseif ( is_author() ) {
$author = get_queried_object();
echo '<div class="archive-type-badge"><i class="fas fa-user"></i> ' . __('Autor', 'minecraft-modern-theme') . '</div>';
?>
<div class="archive-author-header">
<?php echo get_avatar( $author->ID, 80, '', '', array('class' => 'archive-author-avatar') ); ?>
<div>
<?php if ( $author->description ) : ?>
<p class="archive-description"><?php echo esc_html( $author->description ); ?></p>
<?php endif; ?>
</div>
</div>
<?php
} elseif ( is_date() ) {
echo '<div class="archive-type-badge"><i class="fas fa-calendar"></i> ' . __('Archiv', 'minecraft-modern-theme') . '</div>';
} else {
the_archive_description( '<div class="archive-description">', '</div>' );
}
?>
</header>
<?php if ( have_posts() ) : ?>
<div class="archive-posts-grid">
<?php while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class('post archive-post-card'); ?>>
<?php if ( has_post_thumbnail() ) : ?>
<div class="archive-card-thumb">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail('medium_large', array('loading' => 'lazy')); ?>
</a>
</div>
<?php endif; ?>
<div class="archive-card-body">
<?php $cats = get_the_category(); if ( $cats ) : ?>
<div class="archive-card-cats">
<a href="<?php echo esc_url( get_category_link( $cats[0]->term_id ) ); ?>" class="post-category-badge">
<?php echo esc_html( $cats[0]->name ); ?>
</a>
</div>
<?php endif; ?>
<h2 class="archive-card-title">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h2>
<div class="archive-card-meta">
<span><i class="fas fa-calendar-alt"></i> <?php echo esc_html( get_the_date() ); ?></span>
<span><i class="fas fa-user"></i> <?php the_author(); ?></span>
<?php
$wc = str_word_count( strip_tags( get_post_field('post_content', get_the_ID()) ) );
$rt = max(1, ceil($wc / 200));
?>
<span><i class="fas fa-clock"></i> <?php printf( _n('%d Min.', '%d Min.', $rt, 'minecraft-modern-theme'), $rt ); ?></span>
</div>
<div class="archive-card-excerpt">
<?php the_excerpt(); ?>
</div>
<a href="<?php the_permalink(); ?>" class="archive-card-read-more">
<?php _e('Weiterlesen', 'minecraft-modern-theme'); ?> <i class="fas fa-arrow-right"></i>
</a>
</div>
</article>
<?php endwhile; ?>
</div>
<!-- Pagination -->
<div class="archive-pagination">
<?php
the_posts_pagination( array(
'mid_size' => 2,
'prev_text' => '<i class="fas fa-chevron-left"></i> ' . __('Zurück', 'minecraft-modern-theme'),
'next_text' => __('Weiter', 'minecraft-modern-theme') . ' <i class="fas fa-chevron-right"></i>',
'before_page_number' => '<span class="page-num">',
'after_page_number' => '</span>',
) );
?>
</div>
<?php else : ?>
<div class="no-posts-found">
<i class="fas fa-search fa-2x"></i>
<p><?php _e('Keine Beiträge gefunden.', 'minecraft-modern-theme'); ?></p>
</div>
<?php endif; ?>
</div>
</div>
</main>
<?php get_footer(); ?>
+14
View File
@@ -0,0 +1,14 @@
<?php
define('WP_USE_THEMES', false);
require('../../../wp-load.php');
if ( php_sapi_name() !== 'cli' && ! current_user_can( 'manage_options' ) ) {
http_response_code( 403 );
exit( 'Forbidden: Admin-Login erforderlich.' );
}
global $wpdb;
$deleted1 = $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_mm_yt_live%'");
$deleted2 = $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_mm_yt_live%'");
echo "Cache cleared: Deleted $deleted1 transients and $deleted2 timeouts\n";
@@ -0,0 +1,98 @@
<?php
/**
* Löscht alle Livestream-Caches
*/
define('WP_USE_THEMES', false);
require('../../../wp-load.php');
if ( php_sapi_name() !== 'cli' && ! current_user_can( 'manage_options' ) ) {
http_response_code( 403 );
exit( 'Forbidden: Admin-Login erforderlich.' );
}
echo "=== Cache löschen ===\n\n";
// Zähler
$deleted = 0;
global $wpdb;
// 1. Alle alten Channel-ID Caches löschen (mm_channel_id_* - alt)
$results = $wpdb->get_results(
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_mm_channel_id_%'"
);
foreach ($results as $row) {
$key = str_replace('_transient_', '', $row->option_name);
delete_transient($key);
$deleted++;
}
echo "✓ Gelöscht: $deleted Channel-ID Caches (alt)\n";
// 2. Alle Live-Status Caches löschen (mm_live_status_*)
$deleted = 0;
$results = $wpdb->get_results(
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_mm_live_status_%'"
);
foreach ($results as $row) {
$key = str_replace('_transient_', '', $row->option_name);
delete_transient($key);
$deleted++;
}
echo "✓ Gelöscht: $deleted Live-Status Caches\n";
// 3. Alte Live-ID Caches löschen (mm_live_id_* - alt)
$deleted = 0;
$results = $wpdb->get_results(
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_mm_live_id_%'"
);
foreach ($results as $row) {
$key = str_replace('_transient_', '', $row->option_name);
delete_transient($key);
$deleted++;
}
echo "✓ Gelöscht: $deleted Live-ID Caches (alt)\n";
// 4. Alte Channel-ID Caches löschen (mm_id_for_* - neu)
$deleted = 0;
$results = $wpdb->get_results(
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_mm_id_for_%'"
);
foreach ($results as $row) {
$key = str_replace('_transient_', '', $row->option_name);
delete_transient($key);
$deleted++;
}
echo "✓ Gelöscht: $deleted Channel-ID Caches (neu)\n";
// 3. Alte Video-Resolution Caches löschen (mm_yt_live_v2_*)
$deleted = 0;
$results = $wpdb->get_results(
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_mm_yt_live_v2_%'"
);
foreach ($results as $row) {
$key = str_replace('_transient_', '', $row->option_name);
delete_transient($key);
$deleted++;
}
echo "✓ Gelöscht: $deleted YouTube Video Caches\n";
// 4. Alte Live-Status Caches löschen (mm_yt_status_*)
$deleted = 0;
$results = $wpdb->get_results(
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_mm_yt_status_%'"
);
foreach ($results as $row) {
$key = str_replace('_transient_', '', $row->option_name);
delete_transient($key);
$deleted++;
}
echo "✓ Gelöscht: $deleted YouTube Status Caches\n";
echo "\n✓ Alle Caches wurden gelöscht!\n";
echo "Die Seite kann jetzt neu geladen werden.\n";
+158
View File
@@ -0,0 +1,158 @@
<?php
// Kein direkter Zugriff
if ( ! defined('ABSPATH') ) exit;
// Wenn Passwort erforderlich, nichts anzeigen
if ( post_password_required() ) {
return;
}
?>
<div id="comments" class="comments-area">
<?php if ( have_comments() ) : ?>
<h3 class="comments-title">
<i class="fas fa-comments"></i>
<?php
$comment_count = get_comments_number();
printf(
_n(
'%d Kommentar zu &ldquo;%s&rdquo;',
'%d Kommentare zu &ldquo;%s&rdquo;',
$comment_count,
'minecraft-modern-theme'
),
$comment_count,
'<span>' . get_the_title() . '</span>'
);
?>
</h3>
<!-- Ältere Kommentare / Pagination oben -->
<?php if ( get_comment_pages_count() > 1 && get_option('page_comments') ) : ?>
<nav class="comment-navigation" aria-label="<?php esc_attr_e('Kommentar-Navigation', 'minecraft-modern-theme'); ?>">
<div class="comment-nav-prev"><?php previous_comments_link( '<i class="fas fa-chevron-left"></i> ' . __('Ältere Kommentare', 'minecraft-modern-theme') ); ?></div>
<div class="comment-nav-next"><?php next_comments_link( __('Neuere Kommentare', 'minecraft-modern-theme') . ' <i class="fas fa-chevron-right"></i>' ); ?></div>
</nav>
<?php endif; ?>
<ol class="comment-list">
<?php
wp_list_comments( array(
'style' => 'ol',
'short_ping' => true,
'avatar_size' => 48,
'callback' => 'minecraft_modern_comment_template',
) );
?>
</ol>
<!-- Neuere Kommentare / Pagination unten -->
<?php if ( get_comment_pages_count() > 1 && get_option('page_comments') ) : ?>
<nav class="comment-navigation" aria-label="<?php esc_attr_e('Kommentar-Navigation', 'minecraft-modern-theme'); ?>">
<div class="comment-nav-prev"><?php previous_comments_link( '<i class="fas fa-chevron-left"></i> ' . __('Ältere Kommentare', 'minecraft-modern-theme') ); ?></div>
<div class="comment-nav-next"><?php next_comments_link( __('Neuere Kommentare', 'minecraft-modern-theme') . ' <i class="fas fa-chevron-right"></i>' ); ?></div>
</nav>
<?php endif; ?>
<?php endif; // have_comments() ?>
<?php
// Kommentarformular
if ( comments_open() ) :
comment_form( array(
'title_reply' => '<span><i class="fas fa-pencil-alt"></i> ' . __('Hinterlasse einen Kommentar', 'minecraft-modern-theme') . '</span>',
'title_reply_to' => __('Antworten auf %s', 'minecraft-modern-theme'),
'cancel_reply_link' => __('Abbrechen', 'minecraft-modern-theme'),
'label_submit' => __('Kommentar absenden', 'minecraft-modern-theme'),
'comment_notes_before' => '',
'comment_notes_after' => '',
'class_form' => 'comment-form',
'class_submit' => 'submit btn-comment-submit',
) );
elseif ( ! is_user_logged_in() ) :
?>
<div class="comments-closed-notice">
<i class="fas fa-lock"></i>
<?php _e('Kommentare sind für diesen Beitrag deaktiviert.', 'minecraft-modern-theme'); ?>
</div>
<?php
endif;
?>
</div><!-- #comments -->
<?php
/**
* Callback für den Kommentar-Template.
* Wird in functions.php nicht definiert, daher hier.
*/
if ( ! function_exists('minecraft_modern_comment_template') ) :
function minecraft_modern_comment_template( $comment, $args, $depth ) {
$tag = ( 'div' === $args['style'] ) ? 'div' : 'li';
?>
<<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( empty($args['has_children']) ? '' : 'parent', $comment ); ?>>
<article id="div-comment-<?php comment_ID(); ?>" class="comment-body">
<div class="comment-meta">
<div class="comment-author-avatar">
<?php echo get_avatar( $comment, $args['avatar_size'], '', '', array('class' => 'comment-avatar') ); ?>
</div>
<div class="comment-author-info">
<span class="comment-author-name">
<?php
$author_url = get_comment_author_url($comment);
if ( $author_url ) {
echo '<a href="' . esc_url($author_url) . '" rel="external nofollow">' . get_comment_author($comment) . '</a>';
} else {
echo esc_html( get_comment_author($comment) );
}
?>
</span>
<span class="comment-date">
<i class="fas fa-calendar-alt"></i>
<a href="<?php echo esc_url( get_comment_link($comment, $args) ); ?>">
<time datetime="<?php comment_date('c'); ?>">
<?php
printf(
__('%1$s um %2$s Uhr', 'minecraft-modern-theme'),
get_comment_date('', $comment),
get_comment_time('', false, false, $comment)
);
?>
</time>
</a>
</span>
</div>
<?php if ( '0' === $comment->comment_approved ) : ?>
<div class="comment-awaiting-moderation">
<i class="fas fa-clock"></i> <?php _e('Dein Kommentar wartet auf Freigabe.', 'minecraft-modern-theme'); ?>
</div>
<?php endif; ?>
</div>
<div class="comment-content">
<?php comment_text(); ?>
</div>
<footer class="comment-footer">
<?php
comment_reply_link( array_merge( $args, array(
'add_below' => 'div-comment',
'depth' => $depth,
'max_depth' => $args['max_depth'],
'before' => '<div class="reply">',
'after' => '</div>',
) ) );
edit_comment_link( '<i class="fas fa-pencil-alt"></i> ' . __('Bearbeiten', 'minecraft-modern-theme'), '<div class="edit-link">', '</div>' );
?>
</footer>
</article>
<?php
}
endif;
?>
@@ -0,0 +1,74 @@
#mm-assistant-chat {
display: none;
position: absolute;
bottom: 110px;
right: 0;
width: 320px;
background: #1a1d22; /* Dunklerer Hintergrund */
border-radius: 15px;
box-shadow: 0 15px 45px rgba(0,0,0,0.5);
border: 1px solid #333;
overflow: hidden;
z-index: 10000;
}
.chat-header {
background: #0099ff;
padding: 12px 15px;
display: flex;
align-items: center;
font-weight: bold;
color: white;
}
.status-dot {
height: 10px;
width: 10px;
background-color: #00ff00;
border-radius: 50%;
display: inline-block;
margin-right: 10px;
box-shadow: 0 0 5px #00ff00;
}
#mm-assistant-content {
padding: 20px;
max-height: 350px;
overflow-y: auto;
color: #e0e0e0;
line-height: 1.6;
font-size: 14px;
}
.chat-input-area {
background: #111;
padding: 10px;
display: flex;
gap: 8px;
border-top: 1px solid #333;
}
#mm-assistant-input {
flex: 1;
background: #222;
border: 1px solid #444;
color: white;
padding: 8px 12px;
border-radius: 8px;
outline: none;
}
#mm-assistant-send {
background: #0099ff;
border: none;
color: white;
padding: 5px 12px;
border-radius: 8px;
cursor: pointer;
display: flex;
align-items: center;
transition: background 0.2s;
}
#mm-assistant-send:hover { background: #0077cc; }
File diff suppressed because one or more lines are too long
+275 -275
View File
@@ -1,276 +1,276 @@
/* Minecraft Modern Theme Login & Registrierungs-Styles */
body.login, body.login-action-register {
background-color: #14151a; /* Fallback-Farbe */
background-size: cover;
background-position: center;
background-repeat: no-repeat;
font-family: 'Raleway', sans-serif;
}
/* Dunkler Overlay für bessere Lesbarkeit */
body.login::before, body.login-action-register::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(20, 21, 26, 0.8);
z-index: -1;
}
/* Logo zentrieren */
body.login h1, body.login-action-register h1 {
text-align: center;
margin-bottom: 50px;
}
body.login h1 a, body.login-action-register h1 a {
width: auto;
height: 160px;
background-size: contain;
}
/* Haupt-Container, der alles umschließt */
body.login #login, body.login-action-register #login {
width: 80%;
max-width: 800px;
margin: 0 auto;
padding: 0;
background: none;
box-shadow: none;
}
/* Der Wrapper, der vom Skript erstellt wird. */
body.login #login-content-wrapper, body.login-action-register #login-content-wrapper {
display: flex;
align-items: stretch;
background-color: #252830;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
overflow: hidden;
}
/* Linke Spalte: Minecraft Avatar Slider (27.8%) */
body.login #minecraft-avatar-slider, body.login-action-register #minecraft-avatar-slider {
flex: 0 0 27.8%;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
padding-top: 50px;
background-color: #1a1c23;
height: auto;
position: relative;
overflow: hidden;
}
body.login #minecraft-avatar-slider .avatar-slide, body.login-action-register #minecraft-avatar-slider .avatar-slide {
width: 100%;
height: auto;
max-height: 400px;
border-radius: 4px;
position: absolute;
top: 25px;
left: 0;
opacity: 0;
transition: opacity 0.7s ease-in-out;
}
body.login #minecraft-avatar-slider .avatar-slide-active, body.login-action-register #minecraft-avatar-slider .avatar-slide-active {
opacity: 1;
}
/* Rechte Spalte: Login/Registrierungs-Formular (72.2%) */
body.login #loginform, body.login-action-register #registerform, body.login #loginform, body.login-action-register #registerform {
flex: 1;
padding: 40px;
background: none;
border: none;
box-shadow: none;
}
/* Formular-Felder */
body.login #loginform p, body.login-action-register #registerform p,
body.login #loginform label, body.login-action-register #registerform label {
margin-bottom: 20px;
color: #e4e4e4;
font-weight: 600;
display: block;
margin-bottom: 8px;
}
body.login #loginform input[type="text"], body.login #loginform input[type="password"], body.login-action-register #registerform input[type="text"], body.login-action-register #registerform input[type="password"], body.login #loginform input[type="email"], body.login-action-register #registerform input[type="email"] {
width: 100%;
padding: 14px;
background-color: #1e2029;
border: 1px solid #333;
border-radius: 4px;
color: #e4e4e4;
font-family: 'Raleway', sans-serif;
font-size: 16px;
transition: border-color 0.3s, box-shadow 0.3s;
}
body.login #loginform input[type="text"]:focus, body.login #loginform input[type="password"]:focus, body.login-action-register #registerform input[type="text"]:focus, body.login-action-register #registerform input[type="password"]:focus, body.login-action-register #registerform input[type="email"]:focus {
border-color: #00d4ff;
box-shadow: 0 0 0 2px rgba(0, 212, 255, 0.2);
outline: none;
}
/* "Angemeldet bleiben" Checkbox (nur Login) */
body.login .forgetmenot label, body.login .forgetmenot input[type="checkbox"] {
font-weight: 400;
font-size: 14px;
color: #a0a0a0;
display: flex;
align-items: center;
}
body.login .forgetmenot input[type="checkbox"] {
margin-right: 8px;
}
/* NEU: Stile für die Registrierungsseite */
.auth-title {
text-align: center;
color: #e4e4e4;
margin-bottom: 10px;
}
.auth-subtitle {
text-align: center;
color: #a0a0a0;
margin-bottom: 40px;
}
.login-form-link {
text-align: center;
margin-top: 30px;
}
.login-form-link p {
margin-bottom: 0;
}
.login-form-link a {
color: #00d4ff;
text-decoration: none;
font-weight: 600;
}
.login-form-link a:hover {
color: #fff;
}
.logged-in-message {
text-align: center;
padding: 40px;
background-color: #252830;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
}
.logged-in-message h2 {
margin-top: 0;
color: #00d4ff;
}
.logged-in-message .button {
display: inline-block;
margin: 10px;
padding: 12px 25px;
background-color: #00d4ff;
color: #fff;
text-decoration: none;
border-radius: 4px;
font-weight: 600;
transition: background-color 0.3s;
}
.logged-in-message .button:hover {
background-color: #00a8cc;
}
/* Container für "Angemeldet bleiben" und "Passwort vergessen" (nur Login) */
body.login .login-options-container {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
body.login .login-options-container .forgetmenot,
body.login .login-options-container #nav {
margin: 0;
}
body.login .login-options-container #nav a {
color: #a0a0a0;
text-decoration: none;
font-weight: 400;
font-size: 14px;
transition: color 0.2s;
}
body.login .login-options-container #nav a:hover {
color: #00d4ff;
}
/* Submit-Button (gilt für Login & Registrierung) */
body.login #loginform .submit input[type="submit"], body.login-action-register #registerform .submit input[type="submit"] {
width: 100%;
padding: 14px;
background-color: #00d4ff;
border: none;
border-radius: 4px;
color: #fff;
font-family: 'Raleway', sans-serif;
font-weight: 600;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s;
}
body.login #loginform .submit input[type="submit"]:hover, body.login-action-register #registerform .submit input[type="submit"]:hover {
background-color: #00a8cc;
}
/* Anpassungen für kleinere Bildschirme */
@media screen and (max-width: 768px) {
body.login #login-content-wrapper, body.login-action-register #login-content-wrapper {
flex-direction: column;
}
body.login #minecraft-avatar-slider, body.login-action-register #minecraft-avatar-slider {
flex: none;
width: 100%;
padding: 30px;
padding-top: 30px;
}
body.login #minecraft-avatar-slider .avatar-slide, body.login-action-register #minecraft-avatar-slider .avatar-slide {
max-height: 300px;
max-width: 200px;
top: 30px;
}
}
/* Fehlermeldungen und Hinweise */
body.login .message, body.login #login_error, body.login-action-register .message, body.login-action-register #login_error {
background-color: rgba(0, 212, 255, 0.1);
border-left: 4px solid #00d4ff;
padding: 15px;
margin-bottom: 20px;
border-radius: 0 4px 4px 0;
color: #e4e4e4;
}
/* =========================================================================
=== STIL FÜR DIE LINKS UNTER DEM ANMELDE-BUTTON ====================
========================================================================= */
body.login .post-login-links, body.login-action-register .post-login-links {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 15px;
padding-top: 15px;
border-top: 1px solid #333;
}
body.login .post-login-links a, body.login-action-register .post-login-links a {
color: #a0a0a0;
text-decoration: none;
font-size: 14px;
transition: color 0.2s ease;
}
body.login .post-login-links a:hover, body.login-action-register .post-login-links a:hover {
color: #00d4ff;
/* Minecraft Modern Theme Login & Registrierungs-Styles */
body.login, body.login-action-register {
background-color: #14151a; /* Fallback-Farbe */
background-size: cover;
background-position: center;
background-repeat: no-repeat;
font-family: 'Raleway', sans-serif;
}
/* Dunkler Overlay für bessere Lesbarkeit */
body.login::before, body.login-action-register::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(20, 21, 26, 0.8);
z-index: -1;
}
/* Logo zentrieren */
body.login h1, body.login-action-register h1 {
text-align: center;
margin-bottom: 50px;
}
body.login h1 a, body.login-action-register h1 a {
width: auto;
height: 160px;
background-size: contain;
}
/* Haupt-Container, der alles umschließt */
body.login #login, body.login-action-register #login {
width: 80%;
max-width: 800px;
margin: 0 auto;
padding: 0;
background: none;
box-shadow: none;
}
/* Der Wrapper, der vom Skript erstellt wird. */
body.login #login-content-wrapper, body.login-action-register #login-content-wrapper {
display: flex;
align-items: stretch;
background-color: #252830;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
overflow: hidden;
}
/* Linke Spalte: Minecraft Avatar Slider (27.8%) */
body.login #minecraft-avatar-slider, body.login-action-register #minecraft-avatar-slider {
flex: 0 0 27.8%;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
padding-top: 50px;
background-color: #1a1c23;
height: auto;
position: relative;
overflow: hidden;
}
body.login #minecraft-avatar-slider .avatar-slide, body.login-action-register #minecraft-avatar-slider .avatar-slide {
width: 100%;
height: auto;
max-height: 400px;
border-radius: 4px;
position: absolute;
top: 25px;
left: 0;
opacity: 0;
transition: opacity 0.7s ease-in-out;
}
body.login #minecraft-avatar-slider .avatar-slide-active, body.login-action-register #minecraft-avatar-slider .avatar-slide-active {
opacity: 1;
}
/* Rechte Spalte: Login/Registrierungs-Formular (72.2%) */
body.login #loginform, body.login-action-register #registerform, body.login #loginform, body.login-action-register #registerform {
flex: 1;
padding: 40px;
background: none;
border: none;
box-shadow: none;
}
/* Formular-Felder */
body.login #loginform p, body.login-action-register #registerform p,
body.login #loginform label, body.login-action-register #registerform label {
margin-bottom: 20px;
color: #e4e4e4;
font-weight: 600;
display: block;
margin-bottom: 8px;
}
body.login #loginform input[type="text"], body.login #loginform input[type="password"], body.login-action-register #registerform input[type="text"], body.login-action-register #registerform input[type="password"], body.login #loginform input[type="email"], body.login-action-register #registerform input[type="email"] {
width: 100%;
padding: 14px;
background-color: #1e2029;
border: 1px solid #333;
border-radius: 4px;
color: #e4e4e4;
font-family: 'Raleway', sans-serif;
font-size: 16px;
transition: border-color 0.3s, box-shadow 0.3s;
}
body.login #loginform input[type="text"]:focus, body.login #loginform input[type="password"]:focus, body.login-action-register #registerform input[type="text"]:focus, body.login-action-register #registerform input[type="password"]:focus, body.login-action-register #registerform input[type="email"]:focus {
border-color: #00d4ff;
box-shadow: 0 0 0 2px rgba(0, 212, 255, 0.2);
outline: none;
}
/* "Angemeldet bleiben" Checkbox (nur Login) */
body.login .forgetmenot label, body.login .forgetmenot input[type="checkbox"] {
font-weight: 400;
font-size: 14px;
color: #a0a0a0;
display: flex;
align-items: center;
}
body.login .forgetmenot input[type="checkbox"] {
margin-right: 8px;
}
/* NEU: Stile für die Registrierungsseite */
.auth-title {
text-align: center;
color: #e4e4e4;
margin-bottom: 10px;
}
.auth-subtitle {
text-align: center;
color: #a0a0a0;
margin-bottom: 40px;
}
.login-form-link {
text-align: center;
margin-top: 30px;
}
.login-form-link p {
margin-bottom: 0;
}
.login-form-link a {
color: #00d4ff;
text-decoration: none;
font-weight: 600;
}
.login-form-link a:hover {
color: #fff;
}
.logged-in-message {
text-align: center;
padding: 40px;
background-color: #252830;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
}
.logged-in-message h2 {
margin-top: 0;
color: #00d4ff;
}
.logged-in-message .button {
display: inline-block;
margin: 10px;
padding: 12px 25px;
background-color: #00d4ff;
color: #fff;
text-decoration: none;
border-radius: 4px;
font-weight: 600;
transition: background-color 0.3s;
}
.logged-in-message .button:hover {
background-color: #00a8cc;
}
/* Container für "Angemeldet bleiben" und "Passwort vergessen" (nur Login) */
body.login .login-options-container {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
body.login .login-options-container .forgetmenot,
body.login .login-options-container #nav {
margin: 0;
}
body.login .login-options-container #nav a {
color: #a0a0a0;
text-decoration: none;
font-weight: 400;
font-size: 14px;
transition: color 0.2s;
}
body.login .login-options-container #nav a:hover {
color: #00d4ff;
}
/* Submit-Button (gilt für Login & Registrierung) */
body.login #loginform .submit input[type="submit"], body.login-action-register #registerform .submit input[type="submit"] {
width: 100%;
padding: 14px;
background-color: #00d4ff;
border: none;
border-radius: 4px;
color: #fff;
font-family: 'Raleway', sans-serif;
font-weight: 600;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s;
}
body.login #loginform .submit input[type="submit"]:hover, body.login-action-register #registerform .submit input[type="submit"]:hover {
background-color: #00a8cc;
}
/* Anpassungen für kleinere Bildschirme */
@media screen and (max-width: 768px) {
body.login #login-content-wrapper, body.login-action-register #login-content-wrapper {
flex-direction: column;
}
body.login #minecraft-avatar-slider, body.login-action-register #minecraft-avatar-slider {
flex: none;
width: 100%;
padding: 30px;
padding-top: 30px;
}
body.login #minecraft-avatar-slider .avatar-slide, body.login-action-register #minecraft-avatar-slider .avatar-slide {
max-height: 300px;
max-width: 200px;
top: 30px;
}
}
/* Fehlermeldungen und Hinweise */
body.login .message, body.login #login_error, body.login-action-register .message, body.login-action-register #login_error {
background-color: rgba(0, 212, 255, 0.1);
border-left: 4px solid #00d4ff;
padding: 15px;
margin-bottom: 20px;
border-radius: 0 4px 4px 0;
color: #e4e4e4;
}
/* =========================================================================
=== STIL FÜR DIE LINKS UNTER DEM ANMELDE-BUTTON ====================
========================================================================= */
body.login .post-login-links, body.login-action-register .post-login-links {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 15px;
padding-top: 15px;
border-top: 1px solid #333;
}
body.login .post-login-links a, body.login-action-register .post-login-links a {
color: #a0a0a0;
text-decoration: none;
font-size: 14px;
transition: color 0.2s ease;
}
body.login .post-login-links a:hover, body.login-action-register .post-login-links a:hover {
color: #00d4ff;
}
@@ -0,0 +1,167 @@
/*
* Verwaltungsseite "Menü-Links" (Backend)
*/
.mm-menu-links-admin .mm-liste {
max-width: 1200px;
}
/* --- Zeilen --- */
.mm-menu-links-admin .mm-liste-zeile {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
gap: 12px;
padding: 14px;
margin-bottom: 10px;
border: 1px solid #dcdcde;
border-left: 4px solid #c3c4c7;
border-radius: 5px;
background: #fff;
}
.mm-menu-links-admin .mm-liste-zeile:hover {
border-left-color: #2271b1;
}
/* --- Symbolvorschau --- */
.mm-menu-links-admin .mm-vorschau {
flex: 0 0 auto;
width: 30px;
height: 30px;
font-size: 22px;
line-height: 30px;
text-align: center;
color: #50575e;
background: #f0f0f1;
border-radius: 4px;
margin-bottom: 2px;
}
/* --- Felder --- */
.mm-menu-links-admin .mm-spalte {
display: flex;
flex-direction: column;
gap: 4px;
flex: 1 1 150px;
min-width: 0;
}
.mm-menu-links-admin .mm-spalte-breit { flex: 2 1 240px; }
.mm-menu-links-admin .mm-spalte-schmal { flex: 0 0 110px; }
.mm-menu-links-admin .mm-spalte > span {
font-size: 12px;
font-weight: 600;
color: #50575e;
}
.mm-menu-links-admin .mm-spalte input[type="text"],
.mm-menu-links-admin .mm-spalte select {
width: 100%;
box-sizing: border-box;
}
.mm-menu-links-admin .mm-checkbox {
align-items: flex-start;
}
.mm-menu-links-admin .mm-checkbox input {
margin: 6px 0 0;
}
/* --- Entfernen --- */
.mm-menu-links-admin .mm-liste-entfernen {
flex: 0 0 auto;
padding: 0;
margin-bottom: 6px;
color: #b32d2e;
background: none;
border: none;
line-height: 1;
cursor: pointer;
}
.mm-menu-links-admin .mm-liste-entfernen:hover,
.mm-menu-links-admin .mm-liste-entfernen:focus {
color: #8a2424;
}
.mm-menu-links-admin .mm-liste-entfernen .dashicons {
width: 20px;
height: 20px;
font-size: 20px;
}
/* --- Hinzufügen-Knopf: "+" sauber auf der Textlinie --- */
.mm-menu-links-admin .mm-liste-hinzufuegen {
display: inline-flex !important;
align-items: center;
gap: 7px;
}
.mm-menu-links-admin .mm-liste-hinzufuegen .mm-plus {
display: inline-block;
font-size: 16px;
font-weight: 600;
line-height: 1;
transform: translateY(-1px);
}
/* --- Hinweis bei leerer Liste --- */
.mm-menu-links-admin .mm-leer {
padding: 16px;
border: 1px dashed #c3c4c7;
border-radius: 5px;
color: #787c82;
font-style: italic;
max-width: 1200px;
}
/* --- Symbolliste --- */
.mm-menu-links-admin .mm-icon-liste {
display: flex;
flex-wrap: wrap;
gap: 8px 12px;
max-width: 1200px;
margin: 0;
}
.mm-menu-links-admin .mm-icon-liste li {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 10px;
background: #fff;
border: 1px solid #dcdcde;
border-radius: 4px;
margin: 0;
}
.mm-menu-links-admin .mm-icon-liste code {
cursor: pointer;
background: #f0f0f1;
}
.mm-menu-links-admin .mm-icon-liste code:hover {
background: #dbe8f5;
}
.mm-menu-links-admin .mm-icon-name {
color: #787c82;
font-size: 12px;
}
/* --- Schmale Bildschirme --- */
@media (max-width: 782px) {
.mm-menu-links-admin .mm-liste-zeile {
flex-direction: column;
align-items: stretch;
}
.mm-menu-links-admin .mm-spalte-schmal { flex: 1 1 auto; }
.mm-menu-links-admin .mm-liste-entfernen {
align-self: flex-end;
}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,139 @@
/* Modernes Design für Virtuellen Assistenten (unten rechts) */
/* Positionierung wird jetzt dynamisch über die Klasse mm-bot-pos-* am #mm-bot-root gesetzt */
#mm-assistant-btn {
background: transparent;
border: none;
cursor: pointer;
box-shadow: 0 2px 8px rgba(0,0,0,0.18);
border-radius: 16px;
padding: 0;
transition: box-shadow 0.2s;
}
#mm-assistant-btn:hover {
box-shadow: 0 4px 16px rgba(0,153,255,0.25);
}
#mm-assistant-btn img {
display: block;
background: #181c22;
border-radius: 16px;
width: 70px;
height: 70px;
box-shadow: 0 2px 8px rgba(0,0,0,0.12);
}
#mm-assistant-chat {
display: none;
position: absolute;
bottom: 110px;
right: 0;
width: 340px;
max-width: 95vw;
background: #23272e;
color: #fff;
border-radius: 18px;
box-shadow: 0 8px 32px rgba(0,0,0,0.35);
padding: 0;
overflow: hidden;
animation: mmFadeIn 0.25s;
}
@keyframes mmFadeIn {
from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); }
}
#mm-assistant-chat > div:first-child {
background: #0099ff;
color: #fff;
font-weight: 600;
font-size: 1.1rem;
padding: 14px 18px 10px 18px;
border-bottom: 1px solid #1a1d22;
border-radius: 18px 18px 0 0;
}
#mm-assistant-content {
min-height: 40px;
font-size: 1rem;
padding: 18px 18px 8px 18px;
background: #23272e;
}
#mm-assistant-input {
width: 100%;
padding: 10px 14px;
border-radius: 8px;
border: none;
outline: none;
font-size: 1rem;
background: #1a1d22;
color: #fff;
margin-bottom: 8px;
box-sizing: border-box;
}
#mm-assistant-input::placeholder {
color: #aaa;
}
#mm-assistant-send {
width: 100%;
background: #0099ff;
color: #fff;
font-weight: bold;
border: none;
border-radius: 8px;
padding: 10px 0;
font-size: 1.1rem;
cursor: pointer;
transition: background 0.2s;
}
#mm-assistant-send:hover {
background: #007acc;
}
@media (max-width: 600px) {
#mm-assistant-chat {
width: 98vw;
min-width: 0;
border-radius: 12px;
right: -8px;
}
#mm-virtual-assistant {
right: 8px;
bottom: 8px;
}
}
/* BUG-FIX: Doppelter #mm-assistant-chat Block und veraltete Chat-Stile entfernt.
Die Regeln .chat-header, .status-dot, .chat-input-area sind Relikte des alten
Widget-Designs und werden vom aktuellen mm-bot-* Markup nicht mehr verwendet.
Sie wurden entfernt um Konflikte mit den modernen Stilen oben zu vermeiden. */
#mm-bot-root { position:fixed; bottom:30px; right:30px; z-index:999999; font-family:-apple-system,system-ui,sans-serif; }
#mm-bot-launcher { background:#0099ff; border:none; border-radius:50%; width:60px; height:60px; cursor:pointer; box-shadow:0 4px 12px rgba(0,0,0,.25); transition:.3s ease; display:flex; align-items:center; justify-content:center; overflow:hidden; }
#mm-bot-launcher:hover { transform:scale(1.08); background:#0088ee; }
#mm-bot-launcher img { width:42px; height:42px; border-radius:4px; }
#mm-bot-chat { position:absolute; bottom:80px; right:0; width:340px; background:#1e2124; border-radius:15px; box-shadow:0 12px 40px rgba(0,0,0,.45); display:flex; flex-direction:column; overflow:hidden; border:1px solid #333; }
.mm-bot-header { background:#2f3136; color:#fff; padding:14px 18px; display:flex; align-items:center; gap:12px; font-weight:700; border-bottom:1px solid #111; }
.mm-bot-status { width:10px; height:10px; background:#43b581; border-radius:50%; box-shadow:0 0 8px #43b581; flex-shrink:0; }
#mm-bot-content { height:320px; padding:16px; overflow-y:auto; background:#36393f; display:flex; flex-direction:column; gap:10px; scroll-behavior:smooth; }
.mm-msg { padding:10px 14px; border-radius:12px; font-size:14px; line-height:1.5; max-width:88%; word-break:break-word; }
.mm-msg.bot { background:#40444b; color:#dcddde; align-self:flex-start; border-bottom-left-radius:3px; }
.mm-msg.user { background:#0099ff; color:#fff; align-self:flex-end; border-bottom-right-radius:3px; }
.mm-msg a { color:#00b0f4; text-decoration:none; font-weight:600; }
.mm-msg a:hover { text-decoration:underline; }
.mm-loading { opacity:.6; font-size:20px; letter-spacing:4px; }
.mm-bot-quick { display:flex; flex-wrap:wrap; gap:6px; margin-top:4px; }
.mm-quick-btn { background:#2f3136; color:#dcddde; border:1px solid #444; border-radius:20px; padding:5px 12px; font-size:12px; cursor:pointer; transition:.2s; white-space:nowrap; }
.mm-quick-btn:hover { background:#0099ff; color:#fff; border-color:#0099ff; }
.mm-bot-input-area { padding:12px 14px; background:#2f3136; display:flex; gap:8px; border-top:1px solid #222; }
#mm-bot-field { flex:1; background:#40444b; border:1px solid #222; border-radius:8px; color:#fff; padding:9px 12px; outline:none; font-size:14px; }
#mm-bot-field:focus { border-color:#0099ff; }
/* BUG-FIX: ID war '#id-mm-bot-send', korrektes HTML-Element hat id="mm-bot-send" */
#mm-bot-send { background:#0099ff; border:none; color:#fff; border-radius:8px; padding:0 16px; cursor:pointer; font-size:16px; }
#mm-bot-send:hover { background:#00b0f4; }
#mm-bot-close { margin-left:auto; background:none; border:none; color:#888; font-size:24px; cursor:pointer; line-height:1; padding:0; }
#mm-bot-close:hover { color:#fff; }
#mm-bot-chat code { background:#222; padding:2px 6px; border-radius:4px; color:#ffa500; font-family:monospace; font-size:13px; }
@media (max-width:400px) {
#mm-bot-chat { width:calc(100vw - 20px); right:-10px; }
}
@@ -0,0 +1,17 @@
/* Alex Brush – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Alex Brush';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('alex-brush-latin-ext-a484545f.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Alex Brush';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('alex-brush-latin-74823526.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,17 @@
/* Allura – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Allura';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('allura-latin-ext-cf553651.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Allura';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('allura-latin-f2f253e0.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Archivo – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('archivo-latin-ext-20ba07dc.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('archivo-latin-79dc5e10.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('archivo-latin-ext-20ba07dc.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('archivo-latin-79dc5e10.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('archivo-latin-ext-20ba07dc.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('archivo-latin-79dc5e10.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,9 @@
/* Cookie – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Cookie';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('cookie-latin-cedd2798.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Dancing Script – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Dancing Script';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('dancing-script-latin-ext-438f68b6.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Dancing Script';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('dancing-script-latin-958aab68.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Dancing Script';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('dancing-script-latin-ext-438f68b6.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Dancing Script';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('dancing-script-latin-958aab68.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Dancing Script';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('dancing-script-latin-ext-438f68b6.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Dancing Script';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('dancing-script-latin-958aab68.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Fira Sans – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Fira Sans';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('fira-sans-latin-ext-48f6df01.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Fira Sans';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('fira-sans-latin-28978245.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Fira Sans';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('fira-sans-latin-ext-e7f40dd9.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Fira Sans';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('fira-sans-latin-4be51a37.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Fira Sans';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('fira-sans-latin-ext-ad62430c.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Fira Sans';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('fira-sans-latin-f7b89b6b.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,17 @@
/* Great Vibes – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Great Vibes';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('great-vibes-latin-ext-e5a62ade.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Great Vibes';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('great-vibes-latin-1402a25d.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Inter – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('inter-latin-ext-39529051.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('inter-latin-56724408.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('inter-latin-ext-39529051.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('inter-latin-56724408.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('inter-latin-ext-39529051.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('inter-latin-56724408.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Karla – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Karla';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('karla-latin-ext-e6e23c51.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Karla';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('karla-latin-ca0ae6c1.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Karla';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('karla-latin-ext-e6e23c51.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Karla';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('karla-latin-ca0ae6c1.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Karla';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('karla-latin-ext-e6e23c51.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Karla';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('karla-latin-ca0ae6c1.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,33 @@
/* Lato – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('lato-latin-ext-47b3d2f4.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('lato-latin-1ceff43a.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('lato-latin-ext-e10402ed.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('lato-latin-1e749525.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Merriweather – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Merriweather';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('merriweather-latin-ext-da7d3499.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Merriweather';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('merriweather-latin-920604ae.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Merriweather';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('merriweather-latin-ext-da7d3499.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Merriweather';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('merriweather-latin-920604ae.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Merriweather';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('merriweather-latin-ext-da7d3499.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Merriweather';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('merriweather-latin-920604ae.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Montserrat – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('montserrat-latin-ext-ccd96bf8.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('montserrat-latin-e56e84e5.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('montserrat-latin-ext-ccd96bf8.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('montserrat-latin-e56e84e5.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('montserrat-latin-ext-ccd96bf8.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Montserrat';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('montserrat-latin-e56e84e5.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Noto Sans – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('noto-sans-latin-ext-3c1f6190.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('noto-sans-latin-811cef89.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('noto-sans-latin-ext-3c1f6190.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('noto-sans-latin-811cef89.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('noto-sans-latin-ext-3c1f6190.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('noto-sans-latin-811cef89.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Nunito – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Nunito';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('nunito-latin-ext-012b6110.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Nunito';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('nunito-latin-798ec6b6.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Nunito';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('nunito-latin-ext-012b6110.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Nunito';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('nunito-latin-798ec6b6.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Nunito';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('nunito-latin-ext-012b6110.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Nunito';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('nunito-latin-798ec6b6.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Open Sans – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('open-sans-latin-ext-27125ddf.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('open-sans-latin-52962c5d.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('open-sans-latin-ext-27125ddf.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('open-sans-latin-52962c5d.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('open-sans-latin-ext-27125ddf.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('open-sans-latin-52962c5d.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Oswald – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Oswald';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('oswald-latin-ext-31399ed9.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Oswald';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('oswald-latin-ed56cbd3.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Oswald';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('oswald-latin-ext-31399ed9.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Oswald';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('oswald-latin-ed56cbd3.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Oswald';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('oswald-latin-ext-31399ed9.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Oswald';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('oswald-latin-ed56cbd3.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,17 @@
/* Pacifico – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Pacifico';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('pacifico-latin-ext-59e558e1.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Pacifico';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('pacifico-latin-296fd221.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Playfair Display – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Playfair Display';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('playfair-display-latin-ext-4136269b.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Playfair Display';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('playfair-display-latin-48d1e9cd.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Playfair Display';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('playfair-display-latin-ext-4136269b.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Playfair Display';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('playfair-display-latin-48d1e9cd.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Playfair Display';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('playfair-display-latin-ext-4136269b.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Playfair Display';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('playfair-display-latin-48d1e9cd.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Poppins – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('poppins-latin-ext-5078a175.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('poppins-latin-5a641377.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('poppins-latin-ext-4445c0c3.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('poppins-latin-fd1924ca.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('poppins-latin-ext-293d06c4.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('poppins-latin-ddd02247.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,33 @@
/* PT Sans – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'PT Sans';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('pt-sans-latin-ext-484fa1a4.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'PT Sans';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('pt-sans-latin-177d0d73.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'PT Sans';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('pt-sans-latin-ext-abb66e79.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'PT Sans';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('pt-sans-latin-75ce67f5.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Quicksand – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('quicksand-latin-ext-9d611ed3.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('quicksand-latin-d8da431a.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('quicksand-latin-ext-9d611ed3.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('quicksand-latin-d8da431a.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('quicksand-latin-ext-9d611ed3.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Quicksand';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('quicksand-latin-d8da431a.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Raleway – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('raleway-latin-ext-7d2ee92c.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('raleway-latin-faccb37f.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('raleway-latin-ext-7d2ee92c.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('raleway-latin-faccb37f.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('raleway-latin-ext-7d2ee92c.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Raleway';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('raleway-latin-faccb37f.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Roboto – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('roboto-latin-ext-0fb06be4.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('roboto-latin-cb43c055.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('roboto-latin-ext-0fb06be4.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('roboto-latin-cb43c055.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('roboto-latin-ext-0fb06be4.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('roboto-latin-cb43c055.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@@ -0,0 +1,49 @@
/* Rubik – lokal gehostet (DSGVO). Generiert, nicht manuell bearbeiten. */
@font-face {
font-family: 'Rubik';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('rubik-latin-ext-b7b482e1.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Rubik';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('rubik-latin-f673d854.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Rubik';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('rubik-latin-ext-b7b482e1.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Rubik';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('rubik-latin-f673d854.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Rubik';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('rubik-latin-ext-b7b482e1.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Rubik';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('rubik-latin-f673d854.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

Some files were not shown because too many files have changed in this diff Show More