PHPackages                             openeuropa/oe\_bootstrap\_theme - 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. openeuropa/oe\_bootstrap\_theme

ActiveDrupal-theme

openeuropa/oe\_bootstrap\_theme
===============================

OpenEuropa Bootstrap base theme.

1.34.0(1mo ago)760.4k↓46.3%13[6 issues](https://github.com/openeuropa/oe_bootstrap_theme/issues)[17 PRs](https://github.com/openeuropa/oe_bootstrap_theme/pulls)1EUPL-1.2PHPPHP &gt;=8.1

Since Oct 6Pushed 1mo ago19 watchersCompare

[ Source](https://github.com/openeuropa/oe_bootstrap_theme)[ Packagist](https://packagist.org/packages/openeuropa/oe_bootstrap_theme)[ RSS](/packages/openeuropa-oe-bootstrap-theme/feed)WikiDiscussions 1.x Synced 1mo ago

READMEChangelog (10)Dependencies (28)Versions (452)Used By (1)

OpenEuropa Bootstrap base theme
===============================

[](#openeuropa-bootstrap-base-theme)

Drupal 8/9 theme based on [Bootstrap 5](https://v5.getbootstrap.com/), [UI Patterns](https://github.com/nuvoleweb/ui_patterns/) and the [OpenEuropa Bootstrap Component Library](https://github.com/openeuropa/bootstrap-component-library).

Usage as a dependency
---------------------

[](#usage-as-a-dependency)

### Requirements

[](#requirements)

The package is meant for Drupal projects that [manage their Drupal dependencies via Composer](https://www.drupal.org/docs/develop/using-composer/using-composer-to-manage-drupal-site-dependencies#managing-contributed).

The usage of [Docker](https://www.docker.com/get-docker) in the dependent project is suggested, but not required.

Check the [composer.json](composer.json) for required PHP version and other dependencies.

### Add the composer package

[](#add-the-composer-package)

Add this manually in composer.json, or combine with existing entries:

```
    "extra": {
        "artifacts": {
            "openeuropa/oe_bootstrap_theme": {
                "dist": {
                    "url": "https://github.com/{name}/releases/download/{pretty-version}/{project-name}-{pretty-version}.zip",
                    "type": "zip"
                }
            }
        }
    }

```

Require with composer:

```
composer require openeuropa/oe_bootstrap_theme:^1.0@alpha
```

### Review the installation

[](#review-the-installation)

Review the installed version with `composer info | grep oe_`.

Review the installation directory with `composer info openeuropa/oe_bootstrap_theme | grep path`. Depending on your setup, this could be `build/themes/contrib/oe_bootstrap_theme`.

If installation was successful, the instance of `oe_bootstrap_theme` should contain a number of subdirectories within `/assets/`, including `/assets/bcl/`.

### Enable and configure

[](#enable-and-configure)

Enable the required helper module:

```
./vendor/bin/drush en oe_bootstrap_theme_helper
```

Enable the theme itself and set it as default:

```
./vendor/bin/drush config-set system.theme default oe_bootstrap_theme
```

### Generate a sub-theme

[](#generate-a-sub-theme)

The package provides a [task-runner](https://github.com/openeuropa/task-runner) command to generate a sub-theme.

```
# Install the task runner:
composer require openeuropa/task-runner
# Learn more about the create-subtheme command:
./vendor/bin/run help oe_bootstrap_theme:create-subtheme
# Generate a sub-theme
./vendor/bin/run oe_bootstrap_theme:create-subtheme [...]
```

After using the command, first commit the generated sub-theme in git, then review *all of it*, and determine which parts you can remove or you have to alter.

An older, manual way to create a sub-theme is described in [kits/README.md](kits/README.md).

### Backward compatibility layer

[](#backward-compatibility-layer)

This component [follows semantic versioning](https://github.com/openeuropa/documentation/blob/master/docs/initiative/release-cycle.md) as per OpenEuropa initiative.
The theme provides an API to its sub-themes, which consists of PHP classes and methods, Twig templates, JavaScript, and CSS/SASS, which can all be altered or overridden by the sub-theme.

Bug fixes and improvements that break backward compatibility on the theme layer (Twig, JS, CSS) are shipped in minor versions.
Backward compatibility is assured by dedicated "Backward compatibility settings", configurable in the theme settings page. These settings allow to restore the previous backward compatible behaviour.
When upgrading the theme in an existing installation, new backward compatibility settings will be automatically enabled. They can be disabled when a developer updates the sub-theme code.
For new installations, all the backward compatibility settings are disabled.

This approach eases the adoption of changes or improvements that would be otherwise tied to a new major. It allows developers to contribute changes to the current major and selectively enable them without having to update the theme completely to a new major release.

### "Version 2.x" patterns

[](#version-2x-patterns)

For version 2.x of this theme, we want to reduce the number of preprocess needed to use the patterns, and instead be able to use formatters and view modes directly as much as possible.
We started to ship in version 1.x patterns that already embrace this new approach. They have been tagged with category "Version 2.x".
We will do the best to avoid any breaking changes to these patterns during the 1.x lifecycle. But it might be that some changes will be still needed. We will communicate such changes together with the release.

### Media copyright text

[](#media-copyright-text)

Patterns that render media accept a `copyright` parameter to display copyright text under the media. See the pattern documentation for usage details. The field and recipe setup for media entities is documented in `oe_whitelabel`.

Development setup
-----------------

[](#development-setup)

### Using LAMP stack or similar

[](#using-lamp-stack-or-similar)

This is not officially supported. You are on your own.

### Using Docker Compose

[](#using-docker-compose)

Alternatively, you can build a development site using [Docker](https://www.docker.com/get-docker) and [Docker Compose](https://docs.docker.com/compose/) with the provided configuration.

Docker provides the necessary services and tools such as a web server and a database server to get the site running, regardless of your local host configuration.

#### Requirements

[](#requirements-1)

- [Docker](https://www.docker.com/get-docker)
- [Docker Compose](https://docs.docker.com/compose/)

#### Override docker settings

[](#override-docker-settings)

The package provides default settings for Docker Compose in `docker-compose.yml`. Most of the time these are sufficient.

An optional `docker-compose.override.yml` file can be created to selectively override specific values, or to define entirely new services.

For services that are defined in both files, Docker Compose applies merge rules that are documented in [the official Docker Compose documentation](https://docs.docker.com/compose/extends/).

#### Start the container

[](#start-the-container)

If you have other (daemonized) containers running, you might want to stop them first:

```
docker stop $(docker ps -q)
```

To start, run:

```
docker-compose up
```

It's advised to not daemonize `docker-compose` so you can turn it off (`CTRL+C`) quickly when you're done working. However, if you'd like to daemonize it, you have to add the flag `-d`:

```
docker-compose up -d
```

#### Optionally purge existing installation

[](#optionally-purge-existing-installation)

If you already had the package installed, and want a clean start:

```
docker-compose exec web rm composer.lock
docker-compose exec web rm -rf vendor/
docker-compose exec web rm -rf build/
```

#### Install and build

[](#install-and-build)

Install dependencies, build artifacts, and install Drupal.

```
# This will trigger npm commands to build assets.
docker-compose exec web composer install
docker-compose exec web ./vendor/bin/run drupal:site-install
```

#### Visit the development site

[](#visit-the-development-site)

Using default configuration, the development site files should be available in the `build` directory and the development site should be available at:  or .

#### Run code review

[](#run-code-review)

Run the grumphp checks:

```
docker-compose exec web ./vendor/bin/grumphp run
```

or

```
docker-compose exec web ./vendor/bin/run toolkit:code-review
```

#### Run phpunit tests

[](#run-phpunit-tests)

Run the phpunit tests:

```
docker-compose exec web ./vendor/bin/phpunit
```

or, using the toolkit command as in the pipeline:

```
docker-compose exec web ./vendor/bin/run toolkit:test-phpunit --junit
```

Rebuild assets during development
---------------------------------

[](#rebuild-assets-during-development)

To rebuild assets with npm during development, without having to run `composer install` or `composer update`:

```
docker-compose exec web npm install
docker-compose exec web npm run build
# or, for continuous updates:
docker-compose exec web npm run watch
```

Patch BCL components
--------------------

[](#patch-bcl-components)

BCL components can be patched by using the [`patch-package`](https://www.npmjs.com/package/patch-package) NPM project.

To patch a component:

1. Modify its source files directly in `./node_modules/@openeuropa/bcl-theme-default`
2. Run:

```
docker-compose exec web npx patch-package @openeuropa/bcl-theme-default --patch-dir=patches/npm
```

Patches will be generated in `./patches/npm` and applied when running `npm install`.
**Note:** generate patches **only** inside the docker container to use the same version of npm/npx.

Contribute
----------

[](#contribute)

Please read [the full documentation](https://github.com/openeuropa/openeuropa) for details on our code of conduct, and the process for submitting pull requests to us.

Versioning
----------

[](#versioning)

We use [SemVer](http://semver.org/) for versioning. For the available versions, see the [tags on this repository](https://github.com/openeuropa/oe_bootstrap_theme/tags).

Upgrade from older versions
---------------------------

[](#upgrade-from-older-versions)

### Upgrade to 1.0.0-beta2

[](#upgrade-to-100-beta2)

Dependencies to the following packages have been removed in composer.json:

- drupal/description\_list\_field
- openeuropa/oe\_content
- openeuropa/oe\_media
- openeuropa/oe\_paragraphs

Be sure to require the component if you need any of them.

### Upgrade to 1.0.0-alpha8

[](#upgrade-to-100-alpha8)

#### Paragraphs migration

[](#paragraphs-migration)

Paragraphs-related theming and functionality has been moved from the [OpenEuropa Bootstrap base theme](https://github.com/openeuropa/oe_bootstrap_theme) to [OpenEuropa Whitelabel](https://github.com/openeuropa/oe_whitelabel).

If you are using `openeuropa/oe_whitelabel`, and you want paragraphs functionality, you should upgrade it to `1.0.0-alpha6` or higher, and refer to the upgrade instructions found there.

###  Health Score

59

—

FairBetter than 99% of packages

Maintenance73

Regular maintenance activity

Popularity38

Limited adoption so far

Community32

Small or concentrated contributor base

Maturity82

Battle-tested with a long release history

 Bus Factor4

4 contributors hold 50%+ of commits

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.

###  Release Activity

Cadence

Every ~6 days

Total

274

Last Release

54d ago

Major Versions

0.4068.202510281030 → 1.30.02025-10-30

0.4230.202512021730 → 1.31.02025-12-04

0.3342.202501161800 → 1.32.02026-01-20

0.3342.202602242015 → 1.33.02026-02-25

0.4511.202603092200 → 1.34.02026-03-25

PHP version history (6 changes)1.0.0-alpha1PHP &gt;=7.2

0.060920211739PHP &gt;=7.3

0.71.0PHP &gt;=7.1

0.1.202202231550PHP &gt;=7.4

1.2.0PHP &gt;=8.0

1.8.0PHP &gt;=8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/d3b1f4079f9a82f6dd88fe6577d1256b4ecbbccbcd4a4ec9bea7c2fd6f72b99a?d=identicon)[DIGIT-CORE](/maintainers/DIGIT-CORE)

---

Top Contributors

[![escuriola](https://avatars.githubusercontent.com/u/6751237?v=4)](https://github.com/escuriola "escuriola (424 commits)")[![tibi2303](https://avatars.githubusercontent.com/u/36895476?v=4)](https://github.com/tibi2303 "tibi2303 (364 commits)")[![brummbar](https://avatars.githubusercontent.com/u/8488617?v=4)](https://github.com/brummbar "brummbar (325 commits)")[![drishu](https://avatars.githubusercontent.com/u/11507647?v=4)](https://github.com/drishu "drishu (315 commits)")[![abel-santos-corral](https://avatars.githubusercontent.com/u/34939110?v=4)](https://github.com/abel-santos-corral "abel-santos-corral (305 commits)")[![papegaill](https://avatars.githubusercontent.com/u/1289480?v=4)](https://github.com/papegaill "papegaill (204 commits)")[![donquixote](https://avatars.githubusercontent.com/u/150032?v=4)](https://github.com/donquixote "donquixote (201 commits)")[![Maxfire](https://avatars.githubusercontent.com/u/6443180?v=4)](https://github.com/Maxfire "Maxfire (77 commits)")[![msnassar](https://avatars.githubusercontent.com/u/15343499?v=4)](https://github.com/msnassar "msnassar (65 commits)")[![claudiu-cristea](https://avatars.githubusercontent.com/u/473868?v=4)](https://github.com/claudiu-cristea "claudiu-cristea (52 commits)")[![vever001](https://avatars.githubusercontent.com/u/1317919?v=4)](https://github.com/vever001 "vever001 (26 commits)")[![piotrsmykaj](https://avatars.githubusercontent.com/u/10449853?v=4)](https://github.com/piotrsmykaj "piotrsmykaj (19 commits)")[![AaronGilMartinez](https://avatars.githubusercontent.com/u/7264392?v=4)](https://github.com/AaronGilMartinez "AaronGilMartinez (14 commits)")[![vengador](https://avatars.githubusercontent.com/u/433632?v=4)](https://github.com/vengador "vengador (10 commits)")[![kp77](https://avatars.githubusercontent.com/u/648045?v=4)](https://github.com/kp77 "kp77 (8 commits)")[![GilNovacomm](https://avatars.githubusercontent.com/u/57403283?v=4)](https://github.com/GilNovacomm "GilNovacomm (6 commits)")[![gingapa](https://avatars.githubusercontent.com/u/16687167?v=4)](https://github.com/gingapa "gingapa (4 commits)")[![Aporie](https://avatars.githubusercontent.com/u/3462591?v=4)](https://github.com/Aporie "Aporie (3 commits)")[![saidatom](https://avatars.githubusercontent.com/u/2377368?v=4)](https://github.com/saidatom "saidatom (2 commits)")[![hernani](https://avatars.githubusercontent.com/u/707860?v=4)](https://github.com/hernani "hernani (1 commits)")

### Embed Badge

![Health badge](/badges/openeuropa-oe-bootstrap-theme/health.svg)

```
[![Health](https://phpackages.com/badges/openeuropa-oe-bootstrap-theme/health.svg)](https://phpackages.com/packages/openeuropa-oe-bootstrap-theme)
```

###  Alternatives

[farmos/farmos

A web-based farm record keeping application.

1.2k6.7k1](/packages/farmos-farmos)[drupal/core-recommended

Locked core dependencies; require this project INSTEAD OF drupal/core.

6939.5M343](/packages/drupal-core-recommended)[openeuropa/oe_theme

OpenEuropa base theme.

37163.4k5](/packages/openeuropa-oe-theme)[wingsuit-designsystem/wingsuit-kickstarter

Starterkit for Wingsuit and Layout Builder.

131.2k](/packages/wingsuit-designsystem-wingsuit-kickstarter)

PHPackages © 2026

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