{"id":21330518,"url":"https://github.com/friendsofredaxo/mblock","last_synced_at":"2026-02-27T23:48:46.382Z","repository":{"id":45598853,"uuid":"64494406","full_name":"FriendsOfREDAXO/mblock","owner":"FriendsOfREDAXO","description":"Beliebig viele Teilblöcke innerhalb eines Moduls, per Drag \u0026 Drop verschiebbar, kopierbar und aktivier- und deaktivierbar! - REDAXO Repeater","archived":false,"fork":false,"pushed_at":"2026-02-15T18:45:26.000Z","size":1793,"stargazers_count":86,"open_issues_count":1,"forks_count":9,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-02-16T00:51:06.063Z","etag":null,"topics":["backend","content","editing","forms","hacktoberfest","redaxo","redaxo-addon","repeating","repeating-blocks"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FriendsOfREDAXO.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-07-29T16:20:31.000Z","updated_at":"2026-02-15T18:42:35.000Z","dependencies_parsed_at":"2025-07-27T12:16:31.045Z","dependency_job_id":"3f421962-da95-49f2-b73e-2e66cf3ceb7e","html_url":"https://github.com/FriendsOfREDAXO/mblock","commit_stats":null,"previous_names":[],"tags_count":73,"template":false,"template_full_name":null,"purl":"pkg:github/FriendsOfREDAXO/mblock","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Fmblock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Fmblock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Fmblock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Fmblock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FriendsOfREDAXO","download_url":"https://codeload.github.com/FriendsOfREDAXO/mblock/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FriendsOfREDAXO%2Fmblock/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29919655,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T19:37:42.220Z","status":"ssl_error","status_checked_at":"2026-02-27T19:37:41.463Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend","content","editing","forms","hacktoberfest","redaxo","redaxo-addon","repeating","repeating-blocks"],"created_at":"2024-11-21T22:20:38.002Z","updated_at":"2026-02-27T23:48:46.376Z","avatar_url":"https://github.com/FriendsOfREDAXO.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"REDAXO AddOn :: MBlock\n======\n\nMit MBlock ist es möglich, innerhalb eines Moduls beliebig viele Datenblöcke zu erzeugen. Diese können dann einfach per Button oder Drag \u0026 Drop sortiert werden. Die erweiterte Version bietet Copy \u0026 Paste Funktionalität und einen Offline/Online Toggle für einzelne Blöcke.\n\n_English:_ MBlock lets you create an unlimited number of data blocks within a single module. These data blocks can be sorted per click or drag \u0026 drop. The enhanced version provides copy \u0026 paste functionality and an offline/online toggle for individual blocks.\n\n\u003e Please note: The examples are valid for MForm version 8 and higher. MBlock now requires the bloecks addon (^5.2.0) for modern drag \u0026 drop functionality.\n\n## 🚨 Hinweis für markitup- und ckeditor-Nutzer \n\nCopy \u0026 Paste funktioniert leider nicht! \n\nEs sollte in den betreffenden Modulen deaktiviert werden. \n\nBeispiel \n```\necho MBlock::show(1, $form, [\n    'min' =\u003e 1,              // Minimale Anzahl Items (werden initial angezeigt)\n    'max' =\u003e 10,             // Maximale Anzahl Items  \n    'template' =\u003e 'modern',  // Template-Name\n    'copy_paste' =\u003e false,    // Copy \u0026 Paste aktivieren\n    'online_offline' =\u003e true // Online/Offline Toggle , hidden field muss angelegt sein. \n]);\n```\n\n## Features / Funktionen\n\n### Grundfunktionen / Core Features\n\n- [x] **Beliebig viele Datenblöcke** pro Modul erstellen\n- [x] **Drag \u0026 Drop Sortierung** mit bloecks addon (^5.2.0)\n- [x] **Minimale/Maximale Anzahl** von Blöcken definierbar\n- [x] **MForm Integration** für professionelle Formulare\n- [x] **Template System** mit Prioritätsladung\n- [x] **Mehrsprachigkeit** (DE/EN)\n\n### Erweiterte Funktionen / Advanced Features (MBlock 4.0)\n\n- [x] **Online/Offline Toggle** - Blöcke aktivieren/deaktivieren ohne löschen\n- [x] **Copy \u0026 Paste** - Komfortable Duplizierung von Inhalten\n- [x] **Frontend API Methoden** - `filterByField()`, `sortByField()`, `groupByField()`\n- [x] **Schema.org Support** - SEO-optimierte JSON-LD Generierung\n- [x] **Erweiterte Datenabfrage** - Online/Offline/All Modi\n- [x] **Template-Priorität** - Custom templates überschreiben defaults\n- [x] **Media-ID Konflikt-Schutz** - Bessere Warnung bei ID-Überschneidungen\n\n### Editor Support (MBlock 4.5)\n\n- [x] **TinyMCE Support** - Volle Unterstützung für TinyMCE (v4-v8)\n- [x] **CKEditor 5** - Verbesserte Copy \u0026 Paste Funktionalität\n\n## Namespace Migration (Version 4.0)\n\n**MBlock führt Namespaces ein!** Für neue Projekte wird die Verwendung des Namespace empfohlen:\n\n```php\n\u003c?php\n// Empfohlen: Neue Namespace-Syntax\nuse FriendsOfRedaxo\\MBlock\\MBlock;\n\n$items = MBlock::getDataArray(\"REX_VALUE[1]\");\necho MBlock::show(1, $mform-\u003eshow());\n```\n\n**Vollständig rückwärtskompatibel!** Bestehende Module funktionieren weiterhin ohne Änderungen:\n\n```php\n\u003c?php\n// Weiterhin unterstützt: Legacy-Syntax (für Bestandscode)\n$items = MBlock::getDataArray(\"REX_VALUE[1]\");\necho MBlock::show(1, $mform-\u003eshow());\n```\n\n### Migration Guide\n- **Neue Module**: Verwenden die `use FriendsOfRedaxo\\MBlock\\MBlock;` Syntax\n- **Bestehende Module**: Funktionieren ohne Änderungen weiter\n- **Deprecated-Warnung**: Alte Syntax wird in Version 5.0 entfernt\n\n## Installation\n\nMBlock erfordert:\n\n```bash\n# Via REDAXO Installer\n# 1. Gehe zu System \u003e Installer\n# 2. Suche nach \"mblock\"\n# 3. Installiere mblock zusammen mit bloecks\n```\n\n## API \u0026 Datenabfrage\n\n### Zentrale getDataArray() Methode\n\n**Mit Namespace (empfohlen für neue Projekte):**\n```php\n\u003c?php\nuse FriendsOfRedaxo\\MBlock\\MBlock;\n\n// Alle MBlock-Daten abrufen\n$allItems = MBlock::getDataArray(\"REX_VALUE[1]\");\n\n// Nur Online-Blöcke (für Frontend) - EMPFOHLEN\n$onlineItems = MBlock::getDataArray(\"REX_VALUE[1]\", 'online');\n\n// Nur Offline-Blöcke (für Backend-Previews)\n$offlineItems = MBlock::getDataArray(\"REX_VALUE[1]\", 'offline');\n\n// Convenience-Methoden\n$onlineItems = MBlock::getOnlineDataArray(\"REX_VALUE[1]\");\n$offlineItems = MBlock::getOfflineDataArray(\"REX_VALUE[1]\");\n```\n\n**Legacy-Syntax (weiterhin unterstützt):**\n```php\n\u003c?php\n// Alle MBlock-Daten abrufen\n$allItems = MBlock::getDataArray(\"REX_VALUE[1]\");\n\n// Nur Online-Blöcke (für Frontend) - EMPFOHLEN\n$onlineItems = MBlock::getDataArray(\"REX_VALUE[1]\", 'online');\n\n// Nur Offline-Blöcke (für Backend-Previews)\n$offlineItems = MBlock::getDataArray(\"REX_VALUE[1]\", 'offline');\n\n// Convenience-Methoden\n$onlineItems = MBlock::getOnlineDataArray(\"REX_VALUE[1]\");\n$offlineItems = MBlock::getOfflineDataArray(\"REX_VALUE[1]\");\n``` \n\n### Frontend API - Datenverarbeitung\n\n**Mit Namespace (empfohlen):**\n```php\n\u003c?php\nuse FriendsOfRedaxo\\MBlock\\MBlock;\n\n$items = MBlock::getOnlineDataArray(\"REX_VALUE[1]\");\n\n// Nach Feld filtern\n$newsItems = MBlock::filterByField($items, 'category', 'news');\n$activeItems = MBlock::filterByField($items, 'status', 'active');\n\n// Nach Feld sortieren\n$sortedByName = MBlock::sortByField($items, 'name', 'ASC');\n$sortedByDate = MBlock::sortByField($items, 'date', 'DESC', 'date');\n$sortedByPrice = MBlock::sortByField($items, 'price', 'DESC', 'numeric');\n\n// Nach Feld gruppieren\n$grouped = MBlock::groupByField($items, 'category');\nforeach ($grouped as $category =\u003e $categoryItems) {\n    echo \"\u003ch2\u003e\" . rex_escape($category) . \"\u003c/h2\u003e\";\n    foreach ($categoryItems as $item) {\n        echo \"\u003cp\u003e\" . rex_escape($item['title']) . \"\u003c/p\u003e\";\n    }\n}\n\n// Anzahl begrenzen (Pagination)\n$topItems = MBlock::limitItems($items, 5);\n$nextItems = MBlock::limitItems($items, 5, 5);\n\n// SEO Schema.org JSON-LD generieren\n$schema = MBlock::generateSchema($items, 'Person', [\n    'name' =\u003e 'name',\n    'jobTitle' =\u003e 'position',\n    'image' =\u003e 'photo',\n    'email' =\u003e 'email'\n]);\necho '\u003cscript type=\"application/ld+json\"\u003e' . json_encode($schema) . '\u003c/script\u003e';\n```\n\n### Legacy Array-Filterung (falls Array schon vorhanden)\n\n```php\n$data = rex_var::toArray(\"REX_VALUE[1]\");\n\n// Online/Offline Check (MBlock 4.0)\nforeach ($data as $item) {\n    if (MBlock::isOnline($item)) {\n        // Item ist online\n        echo rex_escape($item['title']);\n    }\n}\n\n// Legacy-Methoden (deprecated, bitte getDataArray() verwenden)\n$onlineItems = MBlock::getOnlineItems($data);\n$offlineItems = MBlock::getOfflineItems($data);\n```\n\n## Templates \u0026 Theming\n\n### Template-System mit Dropdown-Auswahl\nMBlock bietet ein modernes Template-System mit grafischer Auswahl über ein Dropdown-Menü in den AddOn-Einstellungen. Das System kopiert automatisch die CSS-Dateien in den `assets/` Ordner und sorgt für optimale Performance.\n\n### Template-Auswahl\nDie Template-Auswahl erfolgt über die **MBlock-Einstellungen**:\n\n1. **Gehe zu** `Addons \u003e MBlock \u003e Einstellungen`\n2. **Wähle ein Template** aus der Dropdown-Liste\n3. **Klicke \"Speichern\"** - Das CSS wird automatisch kopiert\n4. **Das Template ist sofort aktiv**\n\n\n### Dark Mode Support\n**Die mitgelieferten Templates** unterstützen Dark Mode:\n\n- **REDAXO Theme Detection** (`body.rex-theme-dark`)\n- **Browser Preference** (`@media (prefers-color-scheme: dark)`)\n- **Bootstrap 5 Dark Mode** (`[data-bs-theme=\"dark\"]`)\n\n### Custom Templates erstellen\nEigene Templates können im `data/` Ordner erstellt werden:\n\n```bash\nredaxo/data/addons/mblock/templates/\n├── my_custom_theme/\n│   ├── template.ini           # Template-Konfiguration\n│   ├── mblock_wrapper.ini     # HTML-Wrapper für alle Items\n│   ├── mblock_element.ini     # HTML-Template für einzelne Items\n│   └── my_custom_theme.css    # Template-Styling (gleicher Name wie Ordner!)\n```\n\n**Wichtig:** Die CSS-Datei muss den **gleichen Namen wie der Template-Ordner** haben!\n\n\n## Modulbeispiele / Module examples\n\nMBlock enthält einige Modulbeispiele. Diese finden sich auf der MBlock-Seite im REDAXO-Backend. An dieser Stelle werden nur zwei Beispiele aufgelistet — mit Unterstützung durch [MForm](https://github.com/FriendsOfREDAXO/mform) und ohne —, um zu zeigen, wie MBlock funktioniert.\n\n_English:_ MBlock contains several module examples. You’ll find them on the MBlock page within the REDAXO backend. At this point, we want to show two examples only — one with [MForm](https://github.com/FriendsOfREDAXO/mform) support and another one without — to demonstrate how MBlock works.\n\n### Example 1: team members (requires [MForm](https://github.com/FriendsOfREDAXO/mform) addon)\n\n__Input:__\n\n```php\n\u003c?php\n// Modernisiertes Beispiel mit MForm\n\nuse FriendsOfRedaxo\\MForm;\n\n// base ID\n$id = 1;\n\n// init mform mit moderner MForm Syntax\n$mform = MForm::factory();\n\n// fieldset\n$mform-\u003eaddFieldsetArea('Team member');\n\n// textinput\n$mform-\u003eaddTextField(\"$id.0.name\", array('label'=\u003e'Name'));\n\n// media button\n$mform-\u003eaddMediaField(1, array('label'=\u003e'Avatar'));\n\n// Online/Offline Status (hidden field für Toggle-Funktion)\n$mform-\u003eaddHiddenField(\"$id.0.mblock_offline\", '0');\n\n// MBlock anzeigen (Copy \u0026 Paste ist automatisch aktiv)\necho MBlock::show($id, $mform-\u003eshow(), array(\n    'min' =\u003e 2,\n    'max' =\u003e 4\n));\n```\n\n__Output:__\n\n```php\n\u003c?php\nuse FriendsOfRedaxo\\MBlock\\MBlock;\n// Verbesserte Ausgabe\n$items = MBlock::getOnlineDataArray(\"REX_VALUE[1]\"); // Nur Online-Items\n\nforeach ($items as $item) {\n    $name = rex_escape($item['name'] ?? '');\n    $mediaId = $item['REX_MEDIA_1'] ?? '';\n    \n    echo '\u003cdiv class=\"team-member\"\u003e';\n    if ($name) {\n        echo '\u003ch3\u003e' . $name . '\u003c/h3\u003e';\n    }\n    if ($mediaId) {\n        $media = rex_media::get($mediaId);\n        if ($media) {\n            echo '\u003cimg src=\"' . rex_media_manager::getUrl('rex_media_medium', $media-\u003egetFileName()) . '\" \n                       alt=\"' . rex_escape($media-\u003egetTitle()) . '\" class=\"img-responsive\" /\u003e';\n        }\n    }\n    echo '\u003c/div\u003e';\n}\n\n// Debug (nur während Entwicklung)\n// echo '\u003cpre\u003e';\n// dump(MBlock::getDataArray(\"REX_VALUE[1]\")); // Alle Items inkl. Offline\n// echo '\u003c/pre\u003e';\n```\n\n### Example 2: team members (without [MForm](https://github.com/FriendsOfREDAXO/mform))\n\n__Input:__\n\n```php\n\u003c?php\nuse FriendsOfRedaxo\\MBlock\\MBlock;\n// base ID\n$id = 1;\n\n// html form\n$form = \u003c\u003c\u003cEOT\n    \u003cfieldset class=\"form-horizontal \"\u003e\n        \u003clegend\u003eTeam member\u003c/legend\u003e\n        \u003cdiv class=\"form-group\"\u003e\n            \u003cdiv class=\"col-sm-2 control-label\"\u003e\u003clabel for=\"rv2_1_0_name\"\u003eName\u003c/label\u003e\u003c/div\u003e\n            \u003cdiv class=\"col-sm-10\"\u003e\u003cinput id=\"rv2_1_0_name\" type=\"text\" name=\"REX_INPUT_VALUE[$id][0][name]\" value=\"\" class=\"form-control \"\u003e\u003c/div\u003e\n        \u003c/div\u003e\n        \u003cdiv class=\"form-group\"\u003e\n            \u003cdiv class=\"col-sm-2 control-label\"\u003e\u003clabel\u003eAvatar\u003c/label\u003e\u003c/div\u003e\n            \u003cdiv class=\"col-sm-10\"\u003e\n                REX_MEDIA[id=\"1\" widget=\"1\"]\n            \u003c/div\u003e\n        \u003c/div\u003e\n    \u003c/fieldset\u003e\nEOT;\n\n// MBlock mit Features\necho MBlock::show($id, $form, array(\n    'online_offline' =\u003e true,\n    'copy_paste' =\u003e true\n));\n```\n\n__Output:__\n\n```php\n\u003c?php\nuse FriendsOfRedaxo\\MBlock\\MBlock;\n// Sicher und modern\n$items = MBlock::getOnlineDataArray(\"REX_VALUE[1]\");\n\nforeach ($items as $item) {\n    $name = rex_escape($item['name'] ?? '');\n    $mediaId = $item['REX_MEDIA_1'] ?? '';\n    \n    echo '\u003cdiv class=\"team-member\"\u003e';\n    echo '\u003ch3\u003e' . $name . '\u003c/h3\u003e';\n    \n    if ($mediaId \u0026\u0026 ($media = rex_media::get($mediaId))) {\n        echo '\u003cimg src=\"' . rex_media_manager::getUrl('rex_media_small', $media-\u003egetFileName()) . '\" \n                   alt=\"' . rex_escape($media-\u003egetTitle()) . '\" /\u003e';\n    }\n    echo '\u003c/div\u003e';\n}\n```\n\n## Development \u0026 Build\n\n### Modulare JavaScript-Architektur\n\nMBlock verwendet eine **modulare JavaScript-Architektur**, die den Code in drei logische Module aufteilt:\n\n- **`mblock-core.js`** - Base utilities, Validierung, Übersetzungen (384 Zeilen)\n- **`mblock-management.js`** - DOM-Manipulation, Sortable-Handling (1008 Zeilen)  \n- **`mblock-features.js`** - Copy/Paste, Online/Offline Toggle, REDAXO Widgets (815 Zeilen)\n\nDies verbessert die **Wartbarkeit**, reduziert **Code-Redundanz** und ermöglicht besseres **Debugging**.\n\n### Build-System\n\nDas Build-System kombiniert automatisch die modularen Dateien und erstellt optimierte Versionen:\n\n#### Voraussetzungen\n\n- **Node.js** (Version 14 oder höher)  \n- **npm** (wird normalerweise mit Node.js installiert)\n\n#### Build-Prozess ausführen\n\n1. **Terminal öffnen** und in das Build-Verzeichnis wechseln:\n   ```bash\n   cd redaxo/src/addons/mblock/build\n   ```\n\n2. **Build-Script ausführen**:\n   ```bash\n   ./build.sh\n   ```\n\n3. **Automatischer Prozess**:\n   - Kombiniert die 3 modularen Dateien zu einer einzigen Datei\n   - Erstellt `mblock-combined.js` (Zwischenergebnis)\n   - Aktualisiert `mblock.js` (Development-Version) \n   - Erstellt `mblock.min.js` (Production-Version mit Terser-Minifizierung)\n   - Generiert Source Map für Debugging\n\n#### Build-Ausgabe\n```\n� MBlock Build Process gestartet\n═══════════════════════════════════\n✅ Node.js gefunden: v23.9.0\n✅ Dependencies bereits vorhanden\n� Quelldatei gefunden: ../assets/mblock.js\n🔗 Erstelle kombinierte Datei aus modularen Komponenten...\n✅ Kombinierte Datei erstellt: mblock-combined.js\n🔗 Aktualisiere mblock.js für Entwicklungsmodus...\n✅ mblock.js aktualisiert\n⚙️  Starte Minification der kombinierten Datei...\n\n� Minification Statistiken:\n────────────────────────────────────────\n📏 Originalgröße:     105.23 KB\n🗜️  Minified Größe:   36.37 KB  \n💾 Ersparnis:         68.85 KB (65.43%)\n⏱️  Verarbeitungszeit: 238ms\n────────────────────────────────────────\n\n✅ MBlock JavaScript erfolgreich minified!\n🎉 MBlock Build Process abgeschlossen!\n```\n\n#### Asset Loading Modi\n\nDas System unterstützt verschiedene Asset-Loading Modi (konfigurierbar in `boot.php`):\n\n```php\n$assetMode = 'auto'; // Options: 'auto', 'modular', 'combined', 'prod'\n```\n\n- **`auto`** (Standard) - Automatische Erkennung basierend auf Debug-Modus\n  - **Development**: `mblock.js` (kombinierte Datei)\n  - **Production**: `mblock.min.js` (minifiziert)\n  \n- **`modular`** - Lädt 3 separate Dateien (erweiterte Debugging-Möglichkeiten)\n  - `mblock-core.js` → `mblock-management.js` → `mblock-features.js`\n  \n- **`combined`** - Immer kombinierte Datei (`mblock.js`)\n- **`prod`** - Immer minifizierte Datei (`mblock.min.js`)\n\n#### Code-Verbesserungen\n\nDie modulare Architektur bringt folgende **Verbesserungen**:\n\n✅ **Code-Reduktion**: ~200 Zeilen Redundanz eliminiert  \n✅ **Reusable Functions**: `MBlockUtils`, `MBlockClipboard`, `MBlockOnlineToggle`  \n✅ **Unified Event Handling**: Zentralisierte Event-Konfiguration  \n✅ **Better Error Handling**: Konsistente Fehlerbehandlung  \n✅ **Memory Management**: Automatisches Event-Cleanup  \n✅ **Performance**: Cached Selectors und optimierte Algorithmen  \n\n#### Enhanced REX_LINK/REX_MEDIA Support\n\nDas neue System bietet **verbesserte REDAXO Widget-Unterstützung**:\n\n- ✅ **REX_LINK Copy/Paste** - Artikel-IDs und Namen werden korrekt kopiert\n- ✅ **REX_MEDIA Copy/Paste** - Media-Dateien mit Metadaten  \n- ✅ **Widget-Reinitialization** - Onclick-Handler werden automatisch aktualisiert\n- ✅ **Auto Name Fetching** - Artikel-Namen werden automatisch per AJAX geholt\n\n#### Build-System Features\n\n- **🔗 Smart Combining** - Intelligente Kombination der modularen Dateien\n- **⚙️  Advanced Minification** - Terser mit optimierten Settings (2 Compression-Passes)\n- **🗺️  Source Maps** - Für einfaches Debugging der minifizierten Datei\n- **📊 Performance Stats** - Detaillierte Größen- und Kompressions-Statistiken\n- **🔧 Error Handling** - Robuste Fehlerbehandlung und Validierung\n- **♻️  Auto-Update** - Synchronisation zwischen Development- und Production-Dateien\n\n#### Troubleshooting\n\nFalls Probleme auftreten:\n\n1. **Node.js Version prüfen**:\n   ```bash\n   node --version  # sollte \u003e= 14.0.0 sein\n   ```\n\n2. **Dependencies neu installieren**:\n   ```bash\n   cd redaxo/src/addons/mblock/build\n   rm -rf node_modules\n   npm install\n   ```\n\n3. **Modulare Dateien prüfen**:\n   ```bash\n   ls -la ../assets/mblock-*.js\n   # Sollte alle 3 modularen Dateien anzeigen\n   ```\n\n4. **Manuelle Terser Installation**:\n   ```bash\n   npm install terser\n   ```\n\n#### Development Workflow\n\n**Für MBlock-Entwicklung**:\n\n1. **Bearbeite die modularen Dateien**:\n   - `assets/mblock-core.js`\n   - `assets/mblock-management.js` \n   - `assets/mblock-features.js`\n\n2. **Build ausführen** nach Änderungen:\n   ```bash\n   cd build \u0026\u0026 ./build.sh\n   ```\n\n3. **Testen** in REDAXO (Debug-Modus nutzt automatisch die Development-Version)\n\n4. **Production-Deploy**: Die minifizierte Version wird automatisch generiert\n\n---\n\n## Author\n\n**Friends Of REDAXO**\n\n* [REDAXO](http://www.redaxo.org)\n* [FriendsOfREDAXO](https://github.com/FriendsOfREDAXO)\n\n\n## Credits\n\n**Project Leads**\n\n* [Joachim Dörr](https://github.com/joachimdoerr)  \n* [Thomas Skerbis](https://github.com/skerbis)  \n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffriendsofredaxo%2Fmblock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffriendsofredaxo%2Fmblock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffriendsofredaxo%2Fmblock/lists"}