3 Extensions + Abhängigkeiten + Ordnerstruktur
Hier liegt alles, was du projektübergreifend als „Default“ nutzen willst: RTE/CKEditor-Preset, grundlegende TCA-Erweiterungen,
Base-Set mit TypoScript und PageTS.
Kurz: Fundament & Regeln, damit Inhalte und Styling konsistent bleiben.
| Klasse | Zweck |
|---|---|
| SalAttributesProcessor | Baut aus den tx_md_base_sal_* Feldern ein Array und einen String mit data-sal-Attributen. Wird genutzt, um SAL.js-Animationen sauber und wiederverwendbar an Wrapper, Links etc. zu hängen. |
| AppearanceClassProcessor | All-in-One-Processor für Background (Farbe/Bild/Animation/SVG), Effekte (blur/dim/noise/gradient/fixed), automatische Textfarbe und Layout-Wrapping. Wertet nur aktive Felder basierend auf tx_md_base_bg_type aus – ignoriert stale DB-Werte aus inaktiven Feldern. Erzeugt CSS-Klassen (bg-, text-, is-bg-, rounded-, p-3) und CSS-Variablen (--bg-image, --md-bg-blur, --md-bg-anim-c1 etc.) – emittiert nur die Variablen, die die gewählte Animation/Effekt-Kombination tatsächlich nutzt. Verteilt Klassen und Styles auf drei Ebenen (outer/layer/inner) je nach fullwidth-Modus (Content/BG) und fixed-Effekt. Liefert $processedData['appearance'] mit shouldWrap, isContentFullwidth, isBgFullwidth, equalHeightClass und strukturierten outer/layer/inner-Arrays (class + style) für saubere Template-Integration. |
| Klasse | Zweck |
|---|---|
| BackendAppearanceAssets | Lädt im Backend BackendAppearance.js als JavaScript-Modul nach dem Initialisieren des FormEngine-Page-Controllers. Hängt sich an das AfterFormEnginePageInitializedEvent und fügt damit das Script automatisch in alle TCA-Formulare ein (Content-Elemente, Seiten, Records etc.). Nutzt addJsFooterFile mit 'module'-Parameter, damit das Script als ES6-Modul geladen wird und moderne Import/Export-Syntax verwenden kann. |
| Klasse | Zweck |
|---|---|
| HtmlMinifier | Greift in der Response-Pipeline ein, prüft Kontext (Production) und Site-Setting. Minimiert HTML (Kommentare und Whitespace), um Ausgabe im Live-Betrieb zu verschlanken. |
| Klasse | Zweck |
|---|---|
| ScssViewHelper | Kompiliert SCSS-Dateien oder Inline-SCSS zu CSS über ws_scss und registriert das Ergebnis im AssetCollector. Unterstützt Variablen, Pfad-Handling und wahlweise Inline- oder File-Ausgabe im Head. |
| AnyViewHelper | Prüft, ob eines oder mehrere gesuchte Tokens in einer CSV/Whitespace-Liste vorkommt. Typischer Einsatz: „Ist einer dieser Effekte aktiv?“, z.B. für Condition-Checks in Fluid. |
| ClassListViewHelper | Wandelt eine CSV/Whitespace-Liste in eine Klassenliste mit Prefix/Suffix um. Praktisch für einfache Fälle direkt im Template; in der neuen Struktur eher in Processors gekapselt. |
| Klasse | Zweck |
|---|---|
| DynamicColumnsProcessor | Verarbeitet das b13/container-Element dynamic_columns und berechnet für jede Spalte (1–6) responsive Bootstrap-Widths (xxl/lg/xs mit Vererbung nach unten). Holt via ContainerProcessor die Children je colPos (200–205) und baut ein children-Array mit content (gerendert), widths und index. Setzt außerdem columnCount, columnWidths, containerUid und childrenCount für das Fluid-Template. |
| ParentContainerProcessor | Liest den Parent-Container (via tx_container_parent) aus der Datenbank und stellt dessen vollständige Rohdaten in parentContainer bereit. Berechnet zusätzlich drei Flags: isCardsGroup, isCardsGrid (beide nur wenn Parent CType=cards mit entsprechendem Layout) und isButtonLink (wenn Parent CType=button_group). Nutzt rohe tt_content-Daten ($cObj->data), nicht ContentBlocks-Objekte, für zuverlässige Parent-Erkennung. |
| Klasse | Zweck |
|---|---|
| BackendAssetLoader | Lädt im Backend für jede Seite mit dynamic_columns-Containern die Container-Konfiguration und generiert dynamische CSS-Regeln für die TCA-Spalten (200–205). Blendet initial alle colPos 200–205 aus (Flicker-Prevention) und macht sie erst sichtbar, wenn body.md-columns-loaded gesetzt wird. Erzeugt für jeden Container individuelle CSS-Regeln für Spaltenbreiten, Min-Widths und Header-Labels (col-X (Y%)) im Page-Modul. Liest auch deaktivierte (hidden=1) Container, damit das Backend-Grid funktioniert. Injiziert window.MD_CONTAINER_DATA als JSON + Backend.css + backend.js (als Modul). |
Hier lebt das konkrete Projekt: Page-Templates, Header/Footer, Navigation (inkl. Mega-Menü), Hero-Ausgabe, ToC/ScrollSpy, SCSS-Struktur – und vor allem die
Site Settings als zentrale Steuerung.
Kurz: Look & Feel + Projektlogik.
| Klasse | Zweck |
|---|---|
| MegaMenuProcessor | Reichert ein bestehendes MenuProcessor-Ergebnis (z.B. mainMenu) um gerenderte Mega-Menu-Inhalte an. Prüft je Menu-Item das Feld tx_md_megamenu_enabled und rendert dann alle tt_content-Elemente aus colPos=0 der konfigurierten tx_md_megamenu_source_pid (Fallback: Page-UID selbst). Das Ergebnis landet in item['megaHtml'] als String. Funktioniert rekursiv auch für Untermenüs, ist aber primär für Level-1-Navigation gedacht. |
| TocProcessor | Generiert ein hierarchisches Table-of-Contents aus Content-Element-Headern (tt_content.header) einer Seite. Liest die gewünschten Heading-Levels (1–6) aus tx_md_project_toc_levels (Fallback: H2+H3) und durchsucht nur die konfigurierten colPos (tx_md_project_toc_source_colpos oder Heuristik: mdproject_2col → colPos=1, sonst colPos=0). Berücksichtigt Container-Children (via tx_container_parent-Walk) und filtert ausgeblendete Header (header_layout=100) sowie explizit ausgeschlossene (tx_md_project_toc_exclude). Baut einen verschachtelten Tree (children-Arrays) basierend auf Heading-Hierarchie und verankert jedes Item per id="c{uid}". |
| Klasse | Zweck |
|---|---|
| MegaMenuBackendLayoutListener | Hört auf AfterRecordCreatedEvent und AfterRecordUpdatedEvent der pages-Tabelle und schaltet automatisch das Backend Layout um, wenn tx_md_megamenu_enabled geändert wird. Maps zwischen Base-Layouts (mdproject_1col, mdproject_2col, mdproject_3col) und ihren Mega-Varianten (*_mega), die eine zusätzliche Content-Spalte (colPos=910) für Mega-Menu-Inhalte bereitstellen. Unterstützt sowohl PageTS-Layouts (pagets__<key>) als auch DB-Layouts. Lässt fremde/custom Layouts unangetastet. |
md_base/
├─ Classes/
│ ├─ DataProcessing/
│ │ ├─ AppearanceClassProcessor.php
│ │ └─ SalAttributesProcessor.php
│ ├─ EventListener/
│ │ └─ BackendAppearanceAssets.php
│ ├─ Middleware/
│ │ └─ HtmlMinifier.php
│ └─ ViewHelpers/
│ ├─ Asset/
│ │ └─ ScssViewHelper.php
│ └─ Csv/
│ ├─ AnyViewHelper.php
│ └─ ClassListViewHelper.php
├─ Configuration/
│ ├─ RTE/
│ │ └─ Default.yaml
│ ├─ Routes/
│ │ ├─ News.yaml
│ │ └─ Seo.yaml
│ ├─ Sets/
│ │ └─ Base/
│ │ ├─ config.yaml
│ │ ├─ constants.typoscript
│ │ ├─ page.tsconfig
│ │ ├─ settings.definitions.yaml
│ │ └─ setup.typoscript
│ ├─ TCA/
│ │ └─ Overrides/
│ │ ├─ pages.php
│ │ └─ tt_content.php
│ ├─ Yaml/
│ │ └─ FormSetup.yaml
│ ├─ RequestMiddlewares.php
│ └─ Services.yaml
├─ Resources/
│ ├─ Private/
│ │ ├─ Felogin/
│ │ │ ├─ Partials/
│ │ │ │ ├─ RenderLabelOrMessage.html
│ │ │ │ └─ ValidationErrors.html
│ │ │ └─ Templates/
│ │ │ ├─ Login/
│ │ │ │ ├─ Login.html
│ │ │ │ ├─ Logout.html
│ │ │ │ └─ Overview.html
│ │ │ └─ PasswordRecovery/
│ │ │ ├─ Recovery.html
│ │ │ └─ ShowChangePassword.html
│ │ ├─ Forms/
│ │ │ └─ Frontend/
│ │ │ ├─ Partials/
│ │ │ │ ├─ Email.html
│ │ │ │ ├─ Page.html
│ │ │ │ ├─ Text.html
│ │ │ │ └─ Textarea.html
│ │ │ └─ Templates/
│ │ │ └─ Form.html
│ │ ├─ Language/
│ │ │ ├─ de.locallang_db.xlf
│ │ │ └─ locallang_db.xlf
│ │ ├─ Layouts/
│ │ │ ├─ Content/
│ │ │ │ ├─ Default.html
│ │ │ │ └─ NoWrap.html
│ │ │ └─ ContentNoWrap/
│ │ │ └─ Default.html
│ │ └─ TemplateOverrides/
│ │ ├─ friendsoftypo3/
│ │ │ └─ content-blocks/
│ │ │ └─ Layouts/
│ │ │ └─ Preview.html
│ │ └─ typo3/
│ │ └─ cms-backend/
│ │ └─ Partials/
│ │ └─ PageLayout/
│ │ └─ RecordDefault/
│ │ └─ Footer.html
│ └─ Public/
│ ├─ Icons/
│ │ └─ Extension.svg
│ └─ JavaScript/
│ └─ BackendAppearance.js
├─ Tests/
│ └─ Unit/
│ └─ DataProcessing/
│ └─ AppearanceClassProcessorTest.php
├─ README.md
├─ composer.json
├─ ext_emconf.php
├─ ext_localconf.php
├─ ext_tables.sql
└─ phpunit.xml
md_elements/
├─ Classes/
│ ├─ DataProcessing/
│ │ ├─ B13ContainerChildrenRenderer.php
│ │ ├─ ContainerChildrenRendererInterface.php
│ │ ├─ DynamicColumnsProcessor.php
│ │ └─ ParentContainerProcessor.php
│ └─ EventListener/
│ └─ BackendAssetLoader.php
├─ Configuration/
│ ├─ TCA/
│ │ └─ Overrides/
│ │ ├─ tt_content/
│ │ │ ├─ types/
│ │ │ │ ├─ alert.php
│ │ │ │ ├─ box.php
│ │ │ │ ├─ button_group.php
│ │ │ │ ├─ cards.php
│ │ │ │ ├─ dynamic_columns.php
│ │ │ │ └─ modal.php
│ │ │ ├─ columns.php
│ │ │ ├─ containers.php
│ │ │ └─ palettes.php
│ │ └─ tt_content.php
│ ├─ TypoScript/
│ │ └─ setup.typoscript
│ ├─ Icons.php
│ ├─ Services.yaml
│ └─ page.tsconfig
├─ ContentBlocks/
│ └─ ContentElements/
│ ├─ accordion/
│ │ ├─ assets/
│ │ │ └─ icon.svg
│ │ ├─ language/
│ │ │ ├─ de.labels.xlf
│ │ │ └─ labels.xlf
│ │ ├─ templates/
│ │ │ ├─ backend-preview.html
│ │ │ └─ frontend.html
│ │ └─ config.yaml
│ ├─ button-link/
│ │ ├─ assets/
│ │ │ └─ icon.svg
│ │ ├─ language/
│ │ │ ├─ de.labels.xlf
│ │ │ └─ labels.xlf
│ │ ├─ templates/
│ │ │ ├─ backend-preview.html
│ │ │ └─ frontend.html
│ │ └─ config.yaml
│ ├─ card/
│ │ ├─ assets/
│ │ │ ├─ card.scss
│ │ │ └─ icon.svg
│ │ ├─ language/
│ │ │ ├─ de.labels.xlf
│ │ │ └─ labels.xlf
│ │ ├─ templates/
│ │ │ ├─ backend-preview.html
│ │ │ └─ frontend.html
│ │ └─ config.yaml
│ ├─ compare-slider/
│ │ ├─ assets/
│ │ │ ├─ frontend.css
│ │ │ ├─ frontend.js
│ │ │ └─ icon.svg
│ │ ├─ language/
│ │ │ ├─ de.labels.xlf
│ │ │ └─ labels.xlf
│ │ ├─ templates/
│ │ │ ├─ backend-preview.html
│ │ │ └─ frontend.html
│ │ └─ config.yaml
│ ├─ flipbook/
│ │ ├─ assets/
│ │ │ ├─ flipbook/
│ │ │ │ ├─ Css/
│ │ │ │ │ ├─ All.css
│ │ │ │ │ ├─ Flipbook.css
│ │ │ │ │ └─ FontAwesome.css
│ │ │ │ ├─ Fonts/
│ │ │ │ │ ├─ FontAwesome.otf
│ │ │ │ │ ├─ fontawesome-webfont.eot
│ │ │ │ │ ├─ fontawesome-webfont.svg
│ │ │ │ │ ├─ fontawesome-webfont.ttf
│ │ │ │ │ ├─ fontawesome-webfont.woff
│ │ │ │ │ └─ fontawesome-webfont.woff2
│ │ │ │ ├─ Images/
│ │ │ │ │ ├─ book2/
│ │ │ │ │ │ ├─ page1.jpg
│ │ │ │ │ │ ├─ page2.jpg
│ │ │ │ │ │ ├─ ...
│ │ │ │ │ │ └─ ...
│ │ │ │ │ ├─ patterns/
│ │ │ │ │ │ ├─ black_lozenge.png
│ │ │ │ │ │ ├─ ...
│ │ │ │ │ │ └─ woven.png
│ │ │ │ │ └─ ...
│ │ │ │ ├─ Js/
│ │ │ │ │ ├─ cmaps/
│ │ │ │ │ │ ├─ 78-EUC-H.bcmap
│ │ │ │ │ │ ├─ ...
│ │ │ │ │ │ └─ ...
│ │ │ │ │ ├─ constants.js
│ │ │ │ │ ├─ flipbook.js
│ │ │ │ │ ├─ pdf.js
│ │ │ │ │ ├─ pdf.worker.js
│ │ │ │ │ └─ ...
│ │ │ │ └─ ...
│ │ ├─ language/
│ │ │ ├─ de.labels.xlf
│ │ │ └─ labels.xlf
│ │ ├─ templates/
│ │ │ ├─ backend-preview.html
│ │ │ └─ frontend.html
│ │ └─ config.yaml
│ ├─ icon-text/
│ │ ├─ assets/
│ │ │ ├─ frontend.css
│ │ │ ├─ frontend.js
│ │ │ └─ icon.svg
│ │ ├─ language/
│ │ │ ├─ de.labels.xlf
│ │ │ └─ labels.xlf
│ │ ├─ templates/
│ │ │ ├─ backend-preview.html
│ │ │ └─ frontend.html
│ │ └─ config.yaml
│ ├─ social-share/
│ │ ├─ assets/
│ │ │ ├─ frontend.css
│ │ │ ├─ frontend.js
│ │ │ └─ icon.svg
│ │ ├─ language/
│ │ │ ├─ de.labels.xlf
│ │ │ └─ labels.xlf
│ │ ├─ templates/
│ │ │ ├─ backend-preview.html
│ │ │ └─ frontend.html
│ │ └─ config.yaml
│ ├─ swiper/
│ │ ├─ assets/
│ │ │ ├─ frontend.css
│ │ │ ├─ frontend.js
│ │ │ └─ icon.svg
│ │ ├─ language/
│ │ │ ├─ de.labels.xlf
│ │ │ └─ labels.xlf
│ │ ├─ templates/
│ │ │ ├─ backend-preview.html
│ │ │ └─ frontend.html
│ │ └─ config.yaml
│ ├─ tabs/
│ │ ├─ assets/
│ │ │ ├─ frontend.css
│ │ │ ├─ frontend.js
│ │ │ └─ icon.svg
│ │ ├─ language/
│ │ │ ├─ de.labels.xlf
│ │ │ └─ labels.xlf
│ │ ├─ templates/
│ │ │ ├─ backend-preview.html
│ │ │ └─ frontend.html
│ │ └─ config.yaml
│ └─ timeline/
│ ├─ assets/
│ │ ├─ frontend.css
│ │ ├─ frontend.js
│ │ └─ icon.svg
│ ├─ language/
│ │ ├─ de.labels.xlf
│ │ └─ labels.xlf
│ ├─ templates/
│ │ ├─ backend-preview.html
│ │ └─ frontend.html
│ └─ config.yaml
├─ Resources/
│ ├─ Private/
│ │ ├─ Language/
│ │ │ ├─ de.locallang.xlf
│ │ │ └─ locallang.xlf
│ │ └─ Templates/
│ │ ├─ Alert.html
│ │ ├─ Box.html
│ │ ├─ ButtonGroup.html
│ │ ├─ Cards.html
│ │ ├─ DynamicColumns.html
│ │ └─ Modal.html
│ └─ Public/
│ ├─ ContentBlocks/
│ │ └─ md/
│ ├─ Css/
│ │ └─ Backend.css
│ ├─ Icons/
│ │ ├─ Extension.svg
│ │ ├─ alert.svg
│ │ ├─ box.svg
│ │ ├─ button-group.svg
│ │ ├─ cards.svg
│ │ ├─ dynamic-columns.svg
│ │ └─ modal.svg
│ ├─ JavaScript/
│ │ ├─ backend.js
│ │ └─ md_containers_modal.js
│ └─ SCSS/
│ ├─ alert.scss
│ ├─ box.scss
│ └─ md_elements.scss
├─ Tests/
│ └─ Unit/
│ └─ DynamicColumnsProcessorTest.php
├─ README.md
├─ composer.json
├─ ext_emconf.php
├─ ext_localconf.php
├─ ext_tables.sql
└─ phpunit.xmlmd_project/
├─ Classes/
│ ├─ DataProcessing/
│ │ ├─ MegaMenuProcessor.php
│ │ └─ TocProcessor.php
│ └─ EventListener/
│ └─ MegaMenuBackendLayoutListener.php
├─ Configuration/
│ ├─ Sets/
│ │ └─ Project/
│ │ ├─ config.yaml
│ │ ├─ constants.typoscript
│ │ ├─ page.tsconfig
│ │ ├─ settings.definitions.yaml
│ │ ├─ settings.yaml
│ │ └─ setup.typoscript
│ ├─ TCA/
│ │ └─ Overrides/
│ │ ├─ pages.php
│ │ └─ tt_content.php
│ ├─ TsConfig/
│ │ └─ Page/
│ │ └─ Extensions/
│ │ ├─ News.tsconfig
│ │ └─ SfEventMgt.tsconfig
│ ├─ TypoScript/
│ │ └─ Extensions/
│ │ ├─ News.typoscript
│ │ └─ SfEventMgt.typoscript
│ └─ Services.yaml
├─ Resources/
│ ├─ Private/
│ │ ├─ Extensions/
│ │ │ ├─ News/
│ │ │ │ ├─ Layouts/
│ │ │ │ │ ├─ Detail.html
│ │ │ │ │ └─ General.html
│ │ │ │ ├─ Partials/
│ │ │ │ │ ├─ Detail/
│ │ │ │ │ │ ├─ LayoutModern.html
│ │ │ │ │ │ ├─ LayoutOriginal.html
│ │ │ │ │ │ ├─ LayoutOverlay.html
│ │ │ │ │ │ └─ LayoutSplit.html
│ │ │ │ │ ├─ General/
│ │ │ │ │ │ ├─ AdditionalInformation.html
│ │ │ │ │ │ └─ Share.html
│ │ │ │ │ └─ List/
│ │ │ │ │ ├─ Card.html
│ │ │ │ │ ├─ CleanCard.html
│ │ │ │ │ ├─ Featured.html
│ │ │ │ │ ├─ HoverCard.html
│ │ │ │ │ ├─ Item.html
│ │ │ │ │ ├─ Pagination.html
│ │ │ │ │ ├─ SwiperCleanCards.html
│ │ │ │ │ ├─ SwiperHoverCards.html
│ │ │ │ │ └─ Timeline.html
│ │ │ │ └─ Templates/
│ │ │ │ └─ News/
│ │ │ │ ├─ Detail.html
│ │ │ │ └─ List.html
│ │ │ └─ SfEventMgt/
│ │ │ ├─ Layouts/
│ │ │ │ └─ Default.html
│ │ │ ├─ Partials/
│ │ │ │ └─ List/
│ │ │ │ ├─ EventCalendar.html
│ │ │ │ ├─ EventCard.html
│ │ │ │ ├─ EventListItem.html
│ │ │ │ └─ EventSwiper.html
│ │ │ └─ Templates/
│ │ │ └─ Event/
│ │ │ ├─ Detail.html
│ │ │ └─ List.html
│ │ ├─ Language/
│ │ │ ├─ de.locallang_be.xlf
│ │ │ ├─ de.locallang_db.xlf
│ │ │ ├─ locallang_be.xlf
│ │ │ └─ locallang_db.xlf
│ │ ├─ Layouts/
│ │ │ └─ Page/
│ │ │ └─ Site.html
│ │ ├─ Partials/
│ │ │ └─ Page/
│ │ │ ├─ Header/
│ │ │ │ ├─ Navigation/
│ │ │ │ │ ├─ Default.html
│ │ │ │ │ ├─ Desktop.html
│ │ │ │ │ ├─ Sidebar.html
│ │ │ │ │ └─ Split.html
│ │ │ │ ├─ Brand.html
│ │ │ │ ├─ Offcanvas.html
│ │ │ │ ├─ ThemeToggle.html
│ │ │ │ └─ Toggler.html
│ │ │ ├─ Toc/
│ │ │ │ └─ Items.html
│ │ │ ├─ BackToTop.html
│ │ │ ├─ Breadcrumbs.html
│ │ │ ├─ Footer.html
│ │ │ ├─ Header.html
│ │ │ ├─ Hero.html
│ │ │ ├─ MobileMenu.html
│ │ │ ├─ Toc.html
│ │ │ └─ TopMenu.html
│ │ └─ Templates/
│ │ ├─ FluidStyledContent/
│ │ │ ├─ Image.html
│ │ │ ├─ MenuAbstract.html
│ │ │ ├─ MenuSubpages.html
│ │ │ ├─ Textmedia.html
│ │ │ └─ Uploads.html
│ │ └─ Page/
│ │ ├─ OneColumn.html
│ │ ├─ ThreeColumn.html
│ │ └─ TwoColumn.html
│ └─ Public/
│ ├─ Css/
│ │ ├─ glightbox.css
│ │ ├─ sal.css
│ │ ├─ sal.css.map
│ │ ├─ swiper-bundle.min.css
│ │ └─ toastui-calendar.min.css
│ ├─ Fonts/
│ │ ├─ EtelkaMediumPro.woff
│ │ ├─ EtelkaMediumPro.woff2
│ │ ├─ EtelkaTextPro.woff
│ │ └─ EtelkaTextPro.woff2
│ ├─ Icons/
│ │ ├─ Extension.svg
│ │ ├─ backendlayout-1col.svg
│ │ ├─ backendlayout-2col.svg
│ │ └─ backendlayout-3col.svg
│ ├─ Images/
│ │ ├─ dividers/
│ │ ├─ a-logo.png
│ │ ├─ apple-touch-icon.png
│ │ ├─ atlas-logo.svg
│ │ ├─ atlas-sign.svg
│ │ ├─ favicon-96x96.png
│ │ ├─ favicon.ico
│ │ ├─ favicon.svg
│ │ ├─ logo-w.svg
│ │ ├─ logo.svg
│ │ ├─ mediadata-Logo2z.svg
│ │ └─ ...
│ ├─ Js/
│ │ ├─ components/
│ │ │ ├─ back-to-top.js
│ │ │ ├─ calendar-init.js
│ │ │ ├─ hero-vh.js
│ │ │ └─ toc-scrollspy.js
│ │ ├─ global/
│ │ │ ├─ glightbox-init.js
│ │ │ ├─ glightbox.min.js
│ │ │ ├─ offcanvas-hamburger.js
│ │ │ ├─ theme-init.js
│ │ │ ├─ theme-toggle.js
│ │ │ └─ theme-toggle.js
│ │ ├─ sidebar/
│ │ │ ├─ sidebar-collapse.js
│ │ │ └─ sidebar-flyout.js
│ │ └─ ...
│ └─ SCSS/
│ ├─ abstracts/
│ ├─ base/
│ ├─ components/
│ ├─ layout/
│ ├─ overrides/
│ ├─ themes/
│ ├─ vendors/
│ │ ├─ bootstrap/
│ │ │ ├─ ...
│ │ │ └─ ...
│ │ ├─ hamburgers/
│ │ └─ _bootstrap.scss
│ ├─ _custom.scss
│ ├─ main.scss
│ └─ rte.scss
├─ README.md
├─ composer.json
├─ ext_emconf.php
├─ ext_localconf.php
├─ ext_tables.php
├─ ext_tables.sql
└─ phpunit.xml