fix: kein s.w.org-emoji-request + kein weissraum unter dem blocker (v1.4.3)

1) Das Warn-Emoji "⚠" im platzhalter-text loeste WordPress' wp-emoji aus, das
   die grafik von s.w.org nachlud (drittanbieter-request). Emoji aus den texten
   entfernt; das warn-dreieck wird jetzt rein per CSS gezeichnet (kein netzwerk).
   Hinweis: s.w.org ist der WP-emoji-CDN, NICHT Google.
2) Der platzhalter reservierte die hoehe des eingebetteten elements -> bei
   kuerzerem inhalt entstand weissraum darunter. Hoehen-reservierung entfernt
   (PHP min-height-style, JS minHeight, CSS min-height:180px) - der content
   blocker ist jetzt exakt so hoch wie sein eigener inhalt. Die original-masse
   bleiben als data-attribute fuer das iframe nach einwilligung erhalten.
3) Redundante, partielle de_DE-.po/.mo (mit altem emoji) entfernt - deutsche
   locales nutzen direkt die deutschen quell-strings.

+ version 1.4.3 (assets cache-busting).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-06-08 13:23:34 +02:00
parent 176ded0228
commit 494518e98e
10 changed files with 27 additions and 144 deletions

View File

@@ -23,7 +23,6 @@
display: flex;
align-items: flex-start; /* pin content to the top */
justify-content: center;
min-height: 180px; /* fallback only; real height is set inline */
width: 100%;
background-color: var(--cb-bg);
color: var(--cb-text);
@@ -31,7 +30,7 @@
padding: 24px 8px 20px; /* min 20px top/bottom, 8px sides */
font-family: inherit;
border-radius: 4px;
overflow: auto; /* if text is taller than the embed, scroll, don't clip */
/* No reserved height: the placeholder is exactly as tall as its content. */
}
/* ── Inner content ── */
@@ -62,6 +61,18 @@
color: #f0b429; /* amber — universal caution, brand-neutral */
font-weight: 600;
}
/* Caution marker drawn in pure CSS (no emoji → no s.w.org/emoji request). */
.cb-blocker .cb-blocker__third-country::before {
content: "";
display: inline-block;
width: 0;
height: 0;
margin-right: 6px;
vertical-align: -2px;
border-left: 0.45em solid transparent;
border-right: 0.45em solid transparent;
border-bottom: 0.8em solid currentColor;
}
/* ── Privacy link ── */
.cb-blocker .cb-blocker__privacy-link {

View File

@@ -169,11 +169,10 @@
wrap.className = 'cb-blocker';
wrap.setAttribute( 'data-cb-id', svc.id );
wrap.dataset.src = src;
// Keep the dims for the iframe we create on consent, but do NOT reserve
// height — the placeholder is sized to its own content (no empty space).
if ( dims.width ) wrap.dataset.width = dims.width;
if ( dims.height ) wrap.dataset.height = dims.height;
if ( dims.height && /^\d+$/.test( String( dims.height ) ) ) {
wrap.style.minHeight = dims.height + 'px';
}
const inner = document.createElement( 'div' );
inner.className = 'cb-blocker__inner';

View File

@@ -3,7 +3,7 @@
* Plugin Name: GDPR Content Blocker
* Plugin URI: https://lucas-orth.de
* Description: DSGVO-konformer Consent-Blocker für externe iframes. Lädt Drittinhalte erst nach aktiver Einwilligung.
* Version: 1.4.2
* Version: 1.4.3
* Author: Lucas Orth
* Author URI: https://lucas-orth.de
* Text Domain: gdpr-content-blocker
@@ -15,7 +15,7 @@
defined( 'ABSPATH' ) || exit;
define( 'CB_VERSION', '1.4.2' );
define( 'CB_VERSION', '1.4.3' );
define( 'CB_FILE', __FILE__ );
define( 'CB_DIR', plugin_dir_path( __FILE__ ) );
define( 'CB_URL', plugin_dir_url( __FILE__ ) );

View File

@@ -111,7 +111,7 @@ class CB_Renderer {
'i18n' => [
'recipient' => __( 'Empfänger:', 'gdpr-content-blocker' ),
'purpose' => __( 'Zweck:', 'gdpr-content-blocker' ),
'thirdCountry' => __( '⚠ Datenübermittlung in ein Drittland außerhalb der EU/des EWR', 'gdpr-content-blocker' ),
'thirdCountry' => __( 'Datenübermittlung in ein Drittland außerhalb der EU/des EWR', 'gdpr-content-blocker' ),
'privacy' => __( 'Datenschutzerklärung des Anbieters', 'gdpr-content-blocker' ),
'load' => __( '%s jetzt laden', 'gdpr-content-blocker' ),
'remember' => __( 'Diesen Dienst künftig immer laden', 'gdpr-content-blocker' ),
@@ -314,7 +314,7 @@ class CB_Renderer {
$third_note = '';
if ( $third ) {
$third_note = '<span class="cb-blocker__third-country">'
. esc_html__( '⚠ Datenübermittlung in ein Drittland außerhalb der EU/des EWR', 'gdpr-content-blocker' )
. esc_html__( 'Datenübermittlung in ein Drittland außerhalb der EU/des EWR', 'gdpr-content-blocker' )
. '</span>';
}
@@ -327,14 +327,12 @@ class CB_Renderer {
$data_src = $src !== '' ? ' data-src="' . esc_attr( $src ) . '"' : '';
// Reserve the embed's height so the layout doesn't jump, and remember the
// original dimensions for the iframe that gets created on consent.
// Remember the original dimensions for the iframe that gets created on
// consent. The placeholder itself is sized to its own content (no reserved
// height), so there is no empty space below it.
$width = isset( $dims['width'] ) ? (string) $dims['width'] : '';
$height = isset( $dims['height'] ) ? (string) $dims['height'] : '';
$style_at = '';
if ( $height !== '' && ctype_digit( $height ) ) {
$style_at = ' style="min-height:' . esc_attr( $height ) . 'px"';
}
$data_dims = '';
if ( $width !== '' ) {
$data_dims .= ' data-width="' . esc_attr( $width ) . '"';

View File

@@ -1,125 +0,0 @@
# Content Blocker – German (de_DE)
# Copyright (C) 2024 Lucas Orth
# This file is distributed under the same license as the Content Blocker plugin.
msgid ""
msgstr ""
"Project-Id-Version: Content Blocker 1.0.0\n"
"Report-Msgid-Bugs-To: privat@lucas-orth.de\n"
"POT-Creation-Date: 2024-01-01 00:00+0000\n"
"PO-Revision-Date: 2024-01-01 00:00+0000\n"
"Last-Translator: Lucas Orth <privat@lucas-orth.de>\n"
"Language-Team: German\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Manual\n"
msgid "Content Blocker"
msgstr "Content Blocker"
msgid "DSGVO-konformer Consent-Blocker für externe iframes. Lädt Drittinhalte erst nach aktiver Einwilligung."
msgstr "DSGVO-konformer Consent-Blocker für externe iframes. Lädt Drittinhalte erst nach aktiver Einwilligung."
msgid "Keine Berechtigung."
msgstr "Keine Berechtigung."
msgid "Einstellungen gespeichert."
msgstr "Einstellungen gespeichert."
msgid "Dienste"
msgstr "Dienste"
msgid "Darstellung"
msgstr "Darstellung"
msgid "+ Dienst hinzufügen"
msgstr "+ Dienst hinzufügen"
msgid "Dienste speichern"
msgstr "Dienste speichern"
msgid "Darstellung speichern"
msgstr "Darstellung speichern"
msgid "Neuer Dienst"
msgstr "Neuer Dienst"
msgid "ID (Slug, intern)"
msgstr "ID (Slug, intern)"
msgid "Anbietername"
msgstr "Anbietername"
msgid "Erkennungsmuster (Domain/Pfad)"
msgstr "Erkennungsmuster (Domain/Pfad)"
msgid "Empfänger (inkl. Land)"
msgstr "Empfänger (inkl. Land)"
msgid "Datenschutz-URL des Anbieters"
msgstr "Datenschutz-URL des Anbieters"
msgid "Verarbeitungszweck"
msgstr "Verarbeitungszweck"
msgid "Individueller Platzhaltertext (leer = Standard)"
msgstr "Individueller Platzhaltertext (leer = Standard)"
msgid "Datenübermittlung in Drittland (außerhalb EU/EWR)"
msgstr "Datenübermittlung in Drittland (außerhalb EU/EWR)"
msgid "Setzt Cookies"
msgstr "Setzt Cookies"
msgid "Lädt externe Skripte"
msgstr "Lädt externe Skripte"
msgid "Entfernen"
msgstr "Entfernen"
msgid "Textfarbe Platzhalter"
msgstr "Textfarbe Platzhalter"
msgid "Hintergrundfarbe Platzhalter"
msgstr "Hintergrundfarbe Platzhalter"
msgid "Button: Hintergrundfarbe"
msgstr "Button: Hintergrundfarbe"
msgid "Button: Textfarbe"
msgstr "Button: Textfarbe"
msgid "Button Hover: Hintergrundfarbe"
msgstr "Button Hover: Hintergrundfarbe"
msgid "Button Hover: Textfarbe"
msgstr "Button Hover: Textfarbe"
msgid "Custom CSS"
msgstr "Custom CSS"
msgid "Wird nach den CSS-Variablen eingebunden und kann diese überschreiben."
msgstr "Wird nach den CSS-Variablen eingebunden und kann diese überschreiben."
msgid "Um diesen Inhalt von %s zu laden, ist Ihre Einwilligung erforderlich. Dabei werden personenbezogene Daten (z. B. Ihre IP-Adresse) an den Anbieter übertragen."
msgstr "Um diesen Inhalt von %s zu laden, ist Ihre Einwilligung erforderlich. Dabei werden personenbezogene Daten (z. B. Ihre IP-Adresse) an den Anbieter übertragen."
msgid "⚠ Datenübermittlung in ein Drittland außerhalb der EU/des EWR"
msgstr "⚠ Datenübermittlung in ein Drittland außerhalb der EU/des EWR"
msgid "Datenschutzerklärung des Anbieters"
msgstr "Datenschutzerklärung des Anbieters"
msgid "Empfänger:"
msgstr "Empfänger:"
msgid "Zweck:"
msgstr "Zweck:"
msgid "%s jetzt laden"
msgstr "%s jetzt laden"
msgid "Alle Einwilligungen widerrufen"
msgstr "Alle Einwilligungen widerrufen"

View File

@@ -93,8 +93,8 @@ msgstr "Recipient:"
msgid "Zweck:"
msgstr "Purpose:"
msgid "⚠ Datenübermittlung in ein Drittland außerhalb der EU/des EWR"
msgstr "⚠ Data transfer to a third country outside the EU/EEA"
msgid "Datenübermittlung in ein Drittland außerhalb der EU/des EWR"
msgstr "Data transfer to a third country outside the EU/EEA"
msgid "Datenschutzerklärung des Anbieters"
msgstr "Provider's privacy policy"

View File

@@ -28,7 +28,7 @@ MSGID Erneut versuchen
MSGID Lizenz aktivieren
MSGID Empfänger:
MSGID Zweck:
MSGID ⚠ Datenübermittlung in ein Drittland außerhalb der EU/des EWR
MSGID Datenübermittlung in ein Drittland außerhalb der EU/des EWR
MSGID Datenschutzerklärung des Anbieters
MSGID %s jetzt laden
MSGID Diesen Dienst künftig immer laden

View File

@@ -26,7 +26,6 @@
"Lizenz aktivieren": "Activate license",
"Empfänger:": "Recipient:",
"Zweck:": "Purpose:",
"⚠ Datenübermittlung in ein Drittland außerhalb der EU/des EWR": "⚠ Data transfer to a third country outside the EU/EEA",
"Datenschutzerklärung des Anbieters": "Provider's privacy policy",
"%s jetzt laden": "Load %s now",
"Diesen Dienst künftig immer laden": "Always load this service from now on",
@@ -126,5 +125,6 @@
"Blockiert zusätzlich passende <script>-Einbindungen (auch per JavaScript nachgeladene, z. B. die YouTube-/Vimeo-API) bis zur Einwilligung.": "Additionally blocks matching <script> includes (including ones injected via JavaScript, e.g. the YouTube/Vimeo API) until consent.",
"Externe Inhalte aktivieren": "Enable external content",
"Einwilligungs-Button (für reine Skript-Dienste)": "Consent button (for script-only services)",
"Erteilt die Einwilligung für einen Dienst und lädt die Seite neu. Gedacht für Dienste, die nur Skripte blockieren und keinen sichtbaren Platzhalter haben. Optionen: id=\"…\" (Dienst-ID, Pflicht), text=\"…\", style=\"button|link\".": "Grants consent for a service and reloads the page. Intended for services that only block scripts and have no visible placeholder. Options: id=\"…\" (service ID, required), text=\"…\", style=\"button|link\"."
"Erteilt die Einwilligung für einen Dienst und lädt die Seite neu. Gedacht für Dienste, die nur Skripte blockieren und keinen sichtbaren Platzhalter haben. Optionen: id=\"…\" (Dienst-ID, Pflicht), text=\"…\", style=\"button|link\".": "Grants consent for a service and reloads the page. Intended for services that only block scripts and have no visible placeholder. Options: id=\"…\" (service ID, required), text=\"…\", style=\"button|link\".",
"Datenübermittlung in ein Drittland außerhalb der EU/des EWR": "Data transfer to a third country outside the EU/EEA"
}