PHPackages                             sitegeist/turncoat - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Templating &amp; Views](/categories/templating)
4. /
5. sitegeist/turncoat

ActiveNeos-package[Templating &amp; Views](/categories/templating)

sitegeist/turncoat
==================

Theming for Neos CMS

10PHP

Since May 6Pushed 4y ago1 watchersCompare

[ Source](https://github.com/sitegeist/Sitegeist.Turncoat)[ Packagist](https://packagist.org/packages/sitegeist/turncoat)[ RSS](/packages/sitegeist-turncoat/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Sitegeist.Turncoat
==================

[](#sitegeistturncoat)

Theming for Neos CMS ... by separating the implementation of features from the rendering.

!!! This is an experimental approach to test the feasibility of the concept !!!

The main idea is separation of packages providing features (nodetypes and integration) with packages providing themes (presentation) to render those features. A feature package can be whole site package with documents and menus or small package providing just a single specific nodetype.

### Authors &amp; Sponsors

[](#authors--sponsors)

- Martin Ficzel -

*The development and the public-releases of this package is generously sponsored by our employer .*

Installation
------------

[](#installation)

Sitegeist.Turncoat is available via packagist and can be installed with the command `composer require sitegeist/turncoat`.

We use semantic-versioning so every breaking change will increase the major-version number.

Usage
-----

[](#usage)

### Selecting a Theme

[](#selecting-a-theme)

Themes are selected for the site of each document. To do this the `Sitegeist.Turncoat:Mixin.ThemeSelector` has to be added to the site document.

```
'Vendor.Site:Document.Homepage':
  superTypes:
    'Sitegeist.Turncoat:Mixin.ThemeSelector': true
```

This adds the `theme` property to your site which allows to choose between all installed theme packages.

Features
--------

[](#features)

### Providing a Feature

[](#providing-a-feature)

Feature implement the nodetype and the integration layer but forward the rendering to the prototype `Sitegeist.Turncoat:ThemeRenderer`

```
prototype(Vendor.Site:Content.Example) < prototype(Neos.Neos:ContentComponent) {
    renderer = Sitegeist.Turncoat:ThemeRenderer {
        feature = "Example"
        props {
            title = Neos.Fusion:Editable {
                property 'title'
            }
        }
    }
}

```

### Implementing a Theme

[](#implementing-a-theme)

Theme packages provide the rendering for all supported features and use the package-type `neos-themes`.

You can kickstart such a package with the command:

```
./flow package:create --package-type neos-themes Vendor.Theme

```

In the theme-package you have to create a file Settings.yaml with the following content to ensure the fusion from your package will be loaded.

```
Neos:
  Neos:
    fusion:
      autoInclude:
        Vendor.Theme: true

```

To include all features from you fusion folder you should add the following line to your root.fusion

```
include: ./**/*.fusion

```

Now you can start implementing features.

### Implementing a Feature in a Theme

[](#implementing-a-feature-in-a-theme)

Each feature is implemented by providing a prototype in the `Feature` namespace of the theme-package.

```
prototype(Vendor.Theme:Feature.Example) < prototype(Neos.Fusion:Component) {
    title = null
    renderer = afx`

            {props.title}

    `
}

```

### Providing a fallback rendering

[](#providing-a-fallback-rendering)

Features can provide a default rendering that can be overridden by themes to do so a fallback package can be defined that provides a rendering. It makes sense that this fallback either is inside the package providing the feature or in a package this depends on.

```
prototype(Vendor.Site:Content.Example) < prototype(Neos.Neos:ContentComponent) {
    renderer = Sitegeist.Turncoat:ThemeRenderer {
        feature = "Example"
        fallback = "Vendor.Theme"
        props {
            ...
        }
    }
}

prototype(Vendor.Theme:Feature.Example) < prototype(Neos.Fusion:Component) {
    title = null
    renderer = afx`

            {props.title}

    `
}

```

Contribution
------------

[](#contribution)

We will gladly accept contributions. Please send us pull requests.

###  Health Score

14

—

LowBetter than 2% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity2

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity26

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/829b4ccb51e8cff3c1e4b59d60cfe8d1b86f6d77fc31a6b3fc99227f432542ca?d=identicon)[mficzel](/maintainers/mficzel)

---

Top Contributors

[![mficzel](https://avatars.githubusercontent.com/u/1309380?v=4)](https://github.com/mficzel "mficzel (6 commits)")

---

Tags

nsocms

### Embed Badge

![Health badge](/badges/sitegeist-turncoat/health.svg)

```
[![Health](https://phpackages.com/badges/sitegeist-turncoat/health.svg)](https://phpackages.com/packages/sitegeist-turncoat)
```

###  Alternatives

[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9682.1M97](/packages/roots-acorn)[whitecube/nova-flexible-content

Flexible Content &amp; Repeater Fields for Laravel Nova.

8053.0M25](/packages/whitecube-nova-flexible-content)[mopa/bootstrap-bundle

Easy integration of twitters bootstrap into symfony2

7042.9M33](/packages/mopa-bootstrap-bundle)[limenius/react-bundle

Client and Server-side react rendering in a Symfony Bundle

3871.2M](/packages/limenius-react-bundle)[nicmart/string-template

StringTemplate is a very simple string template engine for php. I've written it to have a thing like sprintf, but with named and nested substutions.

2101.7M30](/packages/nicmart-string-template)[symfony/ux-icons

Renders local and remote SVG icons in your Twig templates.

555.8M69](/packages/symfony-ux-icons)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
