Update documentation and add new generic starterkit

Issue #2852156 by markcarver: Move "overrides" source files and generated CSS to separate project
parent e8516c45
......@@ -16,32 +16,32 @@ Below are some topics to help get you started using the [Drupal Bootstrap] base
theme. They are ordered based on the level one typically progresses while using
a base theme like this.
#### @link contributing Contributing @endlink
#### [Contributing](<!-- @url contributing -->)
#### @link getting_started Getting Started @endlink
#### [Getting Started](<!-- @url getting_started -->)
#### @link theme_settings Theme Settings @endlink
#### [Theme Settings](<!-- @url theme_settings -->)
#### @link sub_theming Sub-Theming @endlink
- @link sub_theming_cdn CDN Starterkit @endlink
- @link sub_theming_less Less Starterkit @endlink
- @link sub_theming_sass Sass Starterkit @endlink
#### [Sub-Theming](<!-- @url sub_theming -->)
- [CDN Starterkit](<!-- @url sub_theming_cdn -->)
- [Less Starterkit](<!-- @url sub_theming_less -->)
- [Sass Starterkit](<!-- @url sub_theming_sass -->)
#### @link templates Templates @endlink
#### [Templates](<!-- @url templates -->)
#### @link utility Utilities @endlink
#### [Utilities](<!-- @url utility -->)
#### @link plugins Plugin System @endlink
- @link plugins_alter @BootstrapAlter @endlink
- @link plugins_form @BootstrapForm @endlink
- @link plugins_preprocess @BootstrapPreprocess @endlink
- @link plugins_prerender @BootstrapPrerender @endlink
- @link plugins_process @BootstrapProcess @endlink
- @link plugins_provider @BootstrapProvider @endlink
- @link plugins_setting @BootstrapSetting @endlink
- @link plugins_update @BootstrapUpdate @endlink
#### [Plugin System](<!-- @url plugins -->)
- [@BootstrapAlter](<!-- @url plugins_alter -->)
- [@BootstrapForm](<!-- @url plugins_form -->)
- [@BootstrapPreprocess](<!-- @url plugins_preprocess -->)
- [@BootstrapPrerender](<!-- @url plugins_prerender -->)
- [@BootstrapProcess](<!-- @url plugins_process -->)
- [@BootstrapProvider](<!-- @url plugins_provider -->)
- [@BootstrapSetting](<!-- @url plugins_setting -->)
- [@BootstrapUpdate](<!-- @url plugins_update -->)
#### @link maintainers Project Maintainers @endlink
#### [Project Maintainers](<!-- @url maintainers -->)
---
......@@ -52,20 +52,28 @@ documentation. For clarity, we will always attempt to use this word verbosely
in one of the following ways:
- **[Drupal Bootstrap]** refers to the Drupal base theme project.
- **[Bootstrap Framework](https://getbootstrap.com/docs/3.4/)** refers to the external
front end framework.
- **[Bootstrap Framework](https://getbootstrap.com/docs/3.4/)** refers to the
external front end framework.
- **[drupal_bootstrap](https://api.drupal.org/apis/drupal_bootstrap)** refers
to Drupal's bootstrapping process or phase.
When referring to files inside the [Drupal Bootstrap] project directory, they
will always start with `./bootstrap` and continue to specify the full path to
the file or directory inside it. For example, the file that is responsible for
displaying the text on this page is located at `./bootstrap/docs/README.md`.
will always start with `./themes/bootstrap` and continue to specify the full
path to the file or directory inside it. The dot (`.`) is representative of
your Drupal installation's `DOCROOT` folder. For example, the file that is
responsible for displaying the text on this page is located at
`./themes/bootstrap/docs/README.md`.
When referring to files inside a sub-theme, they will always start with
`./THEMENAME/`, where `THEMENAME` is the machine name of your sub-theme. They
will continue to specify the full path to the file or directory inside it. For
example, the primary file Drupal uses to determine if a theme
exists is: `./THEMENAME/THEMENAME.info.yml`.
`./themes/THEMENAME/`, where `THEMENAME` is the machine name of your sub-theme.
They will continue to specify the full path to the file or directory inside it.
For example, the primary file Drupal uses to determine if a theme exists is:
`./themes/THEMENAME/THEMENAME.info.yml`.
{.alert.alert-info} **NOTE:** It is common practice to place projects found on
Drupal.org inside a sub-folder named `contrib` and custom/site-specific code
inside a `custom` folder. If your site is set up this way, please adjust all
paths accordingly (i.e. `./themes/contrib/bootstrap` and
`./themes/custom/THEMENAME`).
[Drupal Bootstrap]: https://www.drupal.org/project/bootstrap
......@@ -2,11 +2,11 @@
<!-- @defgroup sub_theming -->
# Sub-Theming
If you haven't already installed the Drupal Bootstrap theme, read
the @link getting_started Getting Started @endlink topic. Below
are instructions on how to create a [Drupal Bootstrap] based sub-theme.
There are several different variations on how to accomplish this task, but this
topic will focus on the two primarily and most common ways.
If you haven't already installed the Drupal Bootstrap theme, read the
[Getting Started](<!-- @url getting_started -->) topic. Below are instructions
on how to create a [Drupal Bootstrap] based sub-theme. There are several
different variations on how to accomplish this task, but this topic will focus
on the two primarily and most common ways.
You should never modify any theme or sub-theme that is packaged and released
from Drupal.org, such as Drupal Bootstrap. If you do, all changes you have made
......@@ -14,50 +14,65 @@ will be lost once that theme is updated. Instead, you should create a sub-theme
from one of the provided starterkits (this is considered a best practice). Once
you've done that, you can override CSS, templates, and theme processing.
#### Choose a Starterkit {#starterkit}
- @link sub_theming_cdn CDN Starterkit @endlink - uses the "out-of-the-box"
CSS and JavaScript files served by a CDN Provider (like [jsDelivr]).
- @link sub_theming_less Less Starterkit @endlink - uses the
[Bootstrap Framework] [Less] source files and a local [Less] preprocessor.
- @link sub_theming_sass Sass Starterkit @endlink - uses the
[Bootstrap Framework] [Sass] source files and a local [Sass] preprocessor.
{.alert.alert-info} **NOTE:** Using the "CDN Starterkit" is the preferred method
for loading Bootstrap CSS and JS on simpler sites that do not use a site-wide
CDN. There are advantages and disadvantages to using a CDN Provider and you will
need to weigh the benefits based on your site's requirements. Using a CDN
Provider does mean that it depends on a third-party service. There is no
obligation or commitment made by this project or these third-party CDN services
that guarantees up-time or quality of service. If you need to customize
Bootstrap, you must choose one of the Less or Sass Starterkits, compile the
source code locally, and disable the "CDN Provider" theme setting.
- [Using the Starterkit](#starterkit)
- [Using Source Files](#source)
- [LESS](#less)
- [SASS](#sass)
- [Compile](#compile)
- [Override Settings](#settings)
- [Override Templates](#templates)
## Using the Starterkit {#starterkit}
The starterkit provided by this base-theme supplies the basic file structure on
how to construct a proper Bootstrap based sub-theme for use with a [CDN Provider]
(like [jsDelivr]) or for use with compiling [Bootstrap Framework] source files.
{.alert.alert-info} **NOTE:** Using a [CDN Provider] is the preferred method
for loading the [Bootstrap Framework] CSS and JS on simpler sites that do not
use a site-wide CDN. There are advantages and disadvantages to using a
[CDN Provider] and you will need to weigh the benefits based on your site's own
requirements. Using a [CDN Provider] does mean that it depends on a third-party
service. There is no obligation or commitment made by this project or these
third-party services that guarantees up-time or quality of service. If you need
to customize Bootstrap, you must compile the [Bootstrap Framework] source code
locally and disable the
[`cdn_provider` theme setting](<!-- @url theme_settings#cdn_provider -->).
{.alert.alert-warning} **WARNING:** All locally compiled versions of Bootstrap
will be superseded by any enabled "CDN Provider"; **do not use both**.
Once you've selected one of the above starterkits, here's how to install it:
1. Copy over one of the starterkits you have chosen from the
`./bootstrap/starterkits` directory into the `themes` directory.
2. Rename the directory to a unique machine readable name. This is your
sub-theme's "machine name". When referring to files inside a sub-theme,
they will always start with `./THEMENAME/`, where `THEMENAME` is the machine
name of your sub-theme. They will continue to specify the full path to the
file or directory inside it. For example, the primary file Drupal uses to
determine if a theme exists is: `./THEMENAME/THEMENAME.info.yml`.
3. Rename `./THEMENAME/THEMENAME.starterkit.yml` to match
`./THEMENAME/THEMENAME.info.yml`.
4. Rename `./THEMENAME/THEMENAME.libraries.yml`
5. Rename `./THEMENAME/THEMENAME.theme`.
6. Open `./THEMENAME/THEMENAME.info.yml` and change the name, description and
any other properties to suite your needs. Make sure to rename the library
extension name as well: `THEMENAME/framework`.
7. Rename the sub-theme configuration files, located at:
`./THEMENAME/config/install/THEMENAME.settings.yml` and
`./THEMENAME/config/schema/THEMENAME.schema.yml`.
8. Open `./THEMENAME/config/schema/THEMENAME.schema.yml` and rename
`- THEMENAME.settings:` and `'THEMETITLE settings'`
will be superseded by any enabled [CDN Provider]; **do not use both**.
1. Copy `./themes/bootstrap/starterkits/THEMENAME` to `./themes`.
* Rename the `THEMENAME` directory to a unique machine readable name. This is
your sub-theme's "machine name". When referring to files inside a sub-theme,
they will always start with `./themes/THEMENAME/`, where `THEMENAME` is the
machine name of your sub-theme. They will continue to specify the full path
to the file or directory inside it. For example, the primary file Drupal
uses to determine if a theme exists is:
`./themes/THEMENAME/THEMENAME.info.yml`.
2. Rename `./themes/THEMENAME/THEMENAME.starterkit.yml` to match
`./themes/THEMENAME/THEMENAME.info.yml`.
* Open this file and change the name, description and any other properties
to suite your needs. Make sure to rename the library extension name as
well: `THEMENAME/framework`.
3. Rename `./themes/THEMENAME/THEMENAME.libraries.yml`.
* (Optional) If you plan on using a local precompiler (i.e. [Less] or [Sass])
then uncomment the appropriate JavaScript entries inside this file to
enable the assets provided by the [Bootstrap Framework].
4. Rename `./themes/THEMENAME/THEMENAME.theme`.
5. Rename `./themes/THEMENAME/config/schema/THEMENAME.schema.yml`
* Open this file and rename `- THEMENAME.settings:` and `'THEMETITLE settings'`
6. Rename `./themes/THEMENAME/config/install/THEMENAME.settings.yml`
* (Optional) If you plan on using a local precompiler (i.e. [Less] or [Sass])
then you will need to disable the `cdn_provider`
[`cdn_provider` theme setting](<!-- @url theme_settings#cdn_provider -->).
You can do this several different ways, but it's recommended that you
uncomment the following line in this file so the [CDN Provider] is
automatically disabled when your sub-theme is installed:
```yaml
# Disable the CDN provider so compiled source files can be used.
cdn_provider: ''
```
{.alert.alert-warning} **WARNING:** Ensure that the `.starterkit` suffix is
not present on your sub-theme's `.info.yml` filename. This suffix is simply a
......@@ -66,14 +81,71 @@ enabled or used directly. This helps people unfamiliar with Drupal avoid
modifying the starter kit sub-theme directly and instead forces them to create
a new sub-theme to modify.
#### Enable Your New Sub-theme {#enable}
## Using Source Files {#source}
By default, the starterkit is designed to be used with a [CDN Provider] for
quick setup.
While there are a multitude of different approaches on how to actually compile
the [Bootstrap Framework] source files, this base-theme does not and will not
provide templates or suggest specific tools to use. It is up to you, the
developer, to figure out which solution is best for your particular needs.
### LESS (#less)
- You must understand the basic concept of using the [Less] CSS pre-processor.
- You must use a **[local Less compiler](https://www.google.com/search?q=less+compiler)**.
- You must use the latest `3.x.x` version of [Bootstrap Framework LESS Source Files]
ending in the `.less` extension, not files ending in `.css`.
- You must download a copy of [Drupal Bootstrap Styles] and copy over the `less`
folder located at `./drupal-bootstrap-styles/src/3.x.x/8.x-3.x/less`.
### SASS (#sass)
- You must understand the basic concept of using the [Sass] CSS pre-processor.
- You must use a **[local Sass compiler](https://www.google.com/search?q=sass+compiler)**.
- You must use the latest `3.x.x` version of [Bootstrap Framework SASS Source Files]
ending in the `.scss` extension, not files ending in `.css`.
- You must download a copy of [Drupal Bootstrap Styles] and copy over the `scss`
folder located at `./drupal-bootstrap-styles/src/3.x.x/8.x-3.x/scss`.
### Compile (#compile)
Download and extract the source files into the root of your new sub-theme:
`./themes/THEMENAME`. After it has been extracted, the directory should be
renamed (if needed) so it reads `./themes/THEMENAME/bootstrap`.
If for whatever reason you have an additional `bootstrap` directory wrapping
the first `bootstrap` directory (e.g. `./themes/THEMENAME/bootstrap/bootstrap`),
remove the wrapping `bootstrap` directory. You will only ever need to touch
these files if or when you upgrade your version of the [Bootstrap Framework].
{.alert.alert-warning} **WARNING:** Do not modify the files inside of
`./themes/THEMENAME/bootstrap` directly. Doing so may cause issues when
upgrading the [Bootstrap Framework] in the future.
Depending on which precompiler you chose, you should have a `less/style.less`
or `scss/style.scss` file respectively. This file is the main compiling entry
point. Follow further instructions provided by the `README.md` inside the
`less` or `scss` folder.
## Override Settings {#settings}
Please refer to the [Theme Settings](<!-- @url theme_settings -->) topic.
## Override Templates {#templates}
Please refer to the [Templates](<!-- @url templates -->) and
[Plugin System](<!-- @url plugins -->) topics.
## Enable Your New Sub-theme {#enable}
In your Drupal site, navigate to `admin/appearance` and click the `Enable and
set default` link next to your newly created sub-theme. Now that you've
enabled your starterkit, please refer to the starterkit's documentation page
to customize.
[Drupal Bootstrap]: https://www.drupal.org/project/bootstrap
[Drupal Bootstrap Styles]: https://github.com/unicorn-fail/drupal-bootstrap-styles
[Bootstrap Framework]: https://getbootstrap.com/docs/3.4/
[Bootstrap Framework LESS Source Files]: https://github.com/twbs/bootstrap/releases
[Bootstrap Framework SASS Source Files]: https://github.com/twbs/bootstrap-sass
[jsDelivr]: http://www.jsdelivr.com
[Less]: http://lesscss.org
[Sass]: http://sass-lang.com
[CDN Provider]: <!-- @url plugins_provider -->
......@@ -10,7 +10,7 @@ stored and at what point in the process they are accessed.
There are essentially four places where theme settings do or could reside:
1. **Install Config** - `./THEMENAME/config/install/THEMENAME.settings.yml`
1. **Install Config** - `./themes/THEMENAME/config/install/THEMENAME.settings.yml`
This is the install config only. They will only be set upon the initial
installation of a theme. This is **not** like previous Drupal implementations
where changes made here are reflected after a cache rebuild. The only way
......
......@@ -44,7 +44,7 @@ themes and are automatically supported out-of-the-box.
Once a base theme has implemented an alter hook, like mentioned above, all
subsequent sub-themes will have the ability to implement a plugin for that
alter hook directly. All you have to do is simply create the plugin file in
`./THEMENAME/src/Plugin/Alter`. No need to implement any code in
`./themes/THEMENAME/src/Plugin/Alter`. No need to implement any code in
`THEMENAME.theme`:
- `hook_bootstrap_colorize_text_alter`
......@@ -85,7 +85,7 @@ how to add a library from your sub-theme to every page request.
Replace all following instances of `THEMENAME` with the actual machine name of
your sub-theme.
Create a file at `./THEMENAME/src/Plugin/Alter/PageAttachments.php` with the
Create a file at `./themes/THEMENAME/src/Plugin/Alter/PageAttachments.php` with the
following contents:
```php
......
......@@ -16,7 +16,7 @@ how to remove `#input_group_button` from `search_block_form`.
Replace all following instances of `THEMENAME` with the actual machine name of
your sub-theme.
Create a file at `./THEMENAME/src/Plugin/Form/SearchBlockForm.php` with the
Create a file at `./themes/THEMENAME/src/Plugin/Form/SearchBlockForm.php` with the
following contents:
```php
......
......@@ -17,7 +17,7 @@ under certain conditions.
Replace all following instances of `THEMENAME` with the actual machine name of
your sub-theme.
Create a file at `./THEMENAME/src/Plugin/Preprocess/Page.php` with the
Create a file at `./themes/THEMENAME/src/Plugin/Preprocess/Page.php` with the
following contents:
```php
......
......@@ -33,7 +33,7 @@ $build['my_button'] = [
Replace all following instances of `THEMENAME` with the actual machine name of
your sub-theme.
Create a file at `./THEMENAME/src/Plugin/Prerender/Link.php` with the
Create a file at `./themes/THEMENAME/src/Plugin/Prerender/Link.php` with the
following contents:
```php
......
......@@ -25,7 +25,7 @@ for the "format tips" section.
Replace all following instances of `THEMENAME` with the actual machine name of
your sub-theme.
Create a file at `./THEMENAME/src/Plugin/Process/TextFormat.php` with the
Create a file at `./themes/THEMENAME/src/Plugin/Process/TextFormat.php` with the
following contents:
```php
......
......@@ -26,7 +26,7 @@ recommended that you read the accompanying PHP based documentation on the
classes and methods responsible for actually retrieving, parsing and caching
the data from the CDN's API.
Create a file at `./THEMENAME/src/Plugin/Provider/MyCdn.php` with the
Create a file at `./themes/THEMENAME/src/Plugin/Provider/MyCdn.php` with the
following contents:
```php
......
......@@ -33,14 +33,14 @@ to leverage the powerful inheritance capabilities of PHP class instances.
All of these plugins can be found in the following directories and are
discussed, in length, below in their respective sub-topics:
- `./bootstrap/src/Plugin/Alter`
- `./bootstrap/src/Plugin/Form`
- `./bootstrap/src/Plugin/Preprocess`
- `./bootstrap/src/Plugin/Prerender`
- `./bootstrap/src/Plugin/Process`
- `./bootstrap/src/Plugin/Provider`
- `./bootstrap/src/Plugin/Setting`
- `./bootstrap/src/Plugin/Update`
- `./themes/bootstrap/src/Plugin/Alter`
- `./themes/bootstrap/src/Plugin/Form`
- `./themes/bootstrap/src/Plugin/Preprocess`
- `./themes/bootstrap/src/Plugin/Prerender`
- `./themes/bootstrap/src/Plugin/Process`
- `./themes/bootstrap/src/Plugin/Provider`
- `./themes/bootstrap/src/Plugin/Setting`
- `./themes/bootstrap/src/Plugin/Update`
While sub-themes are not required to do so, they can easily emulate this same
type of file structure/workflow and take advantage of this base theme's unique
......
......@@ -18,7 +18,7 @@ Replace all of the following instances of `THEMENAME` with the actual machine
name of your sub-theme.
Create a file at
`./THEMENAME/src/Plugin/Setting/THEMENAME/Accessibility/SkipLink.php`
`./themes/THEMENAME/src/Plugin/Setting/THEMENAME/Accessibility/SkipLink.php`
with the following contents:
```php
......
......@@ -20,12 +20,13 @@ function _find_autoloader($dir) {
else if (empty($dir) || $dir === DIRECTORY_SEPARATOR) {
return FALSE;
}
return _find_autoloader(realpath("$dir/.."));
return _find_autoloader(dirname($dir));
}
$autoloader = _find_autoloader(empty($_SERVER['PWD']) ? getcwd() : $_SERVER['PWD']);
if (!$autoloader || !class_exists('\Drupal\Core\DrupalKernel')) {
throw new \Exception("This script must be invoked inside a Drupal 8 environment. Unable to continue.");
print "This script must be invoked inside a Drupal 8 environment. Unable to continue.\n";
exit();
}
// Create a DrupalKernel instance.
......
framework:
css:
theme:
css/style.css: {}
# Uncomment for LESS source JavaScript files.
# js:
# bootstrap/js/affix.js: {}
# bootstrap/js/alert.js: {}
# bootstrap/js/button.js: {}
# bootstrap/js/carousel.js: {}
# bootstrap/js/collapse.js: {}
# bootstrap/js/dropdown.js: {}
# bootstrap/js/modal.js: {}
# bootstrap/js/tooltip.js: {}
# bootstrap/js/popover.js: {}
# bootstrap/js/scrollspy.js: {}
# bootstrap/js/tab.js: {}
# bootstrap/js/transition.js: {}
# Uncomment for SASS source JavaScript files.
# js:
# bootstrap/assets/javascripts/bootstrap/affix.js: {}
# bootstrap/assets/javascripts/bootstrap/alert.js: {}
# bootstrap/assets/javascripts/bootstrap/button.js: {}
# bootstrap/assets/javascripts/bootstrap/carousel.js: {}
# bootstrap/assets/javascripts/bootstrap/collapse.js: {}
# bootstrap/assets/javascripts/bootstrap/dropdown.js: {}
# bootstrap/assets/javascripts/bootstrap/modal.js: {}
# bootstrap/assets/javascripts/bootstrap/tooltip.js: {}
# bootstrap/assets/javascripts/bootstrap/popover.js: {}
# bootstrap/assets/javascripts/bootstrap/scrollspy.js: {}
# bootstrap/assets/javascripts/bootstrap/tab.js: {}
# bootstrap/assets/javascripts/bootstrap/transition.js: {}
core: 8.x
type: theme
base theme: bootstrap
name: 'THEMETITLE'
description: 'A Drupal Bootstrap 3 based sub-theme.'
package: 'Bootstrap'
regions:
navigation: 'Navigation'
navigation_collapsible: 'Navigation (Collapsible)'
header: 'Top Bar'
highlighted: 'Highlighted'
help: 'Help'
content: 'Content'
sidebar_first: 'Primary'
sidebar_second: 'Secondary'
footer: 'Footer'
page_top: 'Page top'
page_bottom: 'Page bottom'
libraries-extend:
bootstrap/framework:
- THEMENAME/framework
<?php
/**
* @file
* Bootstrap sub-theme.
*
* Place your custom PHP code in this file.
*/
# Default settings should not be located here. This file is only used to
# install initial setting values. If your theme is the one that introduces a
# new theme setting, it should use the Drupal Bootstrap base theme's
# @BootstrapSetting annotation discovery process. This ensures that sub-theme
# settings are inherited from base themes themes properly and to determine when
# a setting should be saved to config as "overridden".
#
# @see \Drupal\bootstrap\Plugin\SettingBase
# @see \Drupal\bootstrap\Plugin\SettingInterface
# @see \Drupal\bootstrap\Plugin\SettingManager
# @see \Drupal\bootstrap\Plugin\Form\SystemThemeSettings
# @see \Drupal\bootstrap\ThemeSettings
# This file cannot be empty, so install an initial empty array for "schemas".
# @see https://www.drupal.org/node/2813829
schemas: []
# Disable the CDN provider so compiled source files can be used.
#cdn_provider: ''
# Schema for the theme setting configuration file of the THEMETITLE theme.
THEMENAME.settings:
type: theme_settings
label: 'THEMETITLE settings'
/**
* If using a CSS pre-processor, tell it to overwrite this file. If not, place
* your custom CSS modifications here.
*/
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#EE0000" d="M0,7.562l1.114-3.438c2.565,0.906,4.43,1.688,5.59,2.35C6.398,3.553,6.237,1.544,6.22,0.447h3.511 c-0.05,1.597-0.234,3.6-0.558,6.003c1.664-0.838,3.566-1.613,5.714-2.325L16,7.562c-2.05,0.678-4.06,1.131-6.028,1.356 c0.984,0.856,2.372,2.381,4.166,4.575l-2.906,2.059c-0.935-1.274-2.041-3.009-3.316-5.206c-1.194,2.275-2.244,4.013-3.147,5.206 l-2.856-2.059c1.872-2.307,3.211-3.832,4.017-4.575C3.849,8.516,1.872,8.062,0,7.562"/></svg>
<svg
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="32px" height="32px"
viewBox="0 0 32 32" preserveAspectRatio="none">
<g>
<image width="32" height="32" xlink:href="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAAohJREFUeNrEl1tIVGEQx12L0BQjoXwpoRfxIQUJuhAIvVRLIRQELYj1
oKDgpQgVNQhBChQfLFDLoovVS0RQYuqLPUgFgTcQia5CSBBERUiKuv0+GGGJPd/l7Nkc+DNn98w3
8/++mXNmTigajaasp4T8Ejhx+GIWavOTkbaviRBITWBtIbgDkfT1InAGHAGDkNj2X1NAwFLU3ZgN
fATnSMezpBIgcAaqWRBPHoFLEJlNVgpWRC943D8FJiDaA3IDOQEc5aNK5Ocou3vDf3u5HgFbNEu/
gzrs7/smQKAa1BWQEfN3L06ruFcmdWCSa+A8a1acUkCAetTVf4IrqeReBIf3pPhMojbR41QDBDiO
atc4LRU9ZVk7FXKaZgLyhus2OExbS6FDAV+OV5jxTqAa7DQ4e4qzTegiBwKZoFFLAKdqZ+UGR8Pk
vwu9A7i+AU8TY6vuBNTjtcvgJB0nJyGhCvAgeO9AIBsc0hHYb+GkGDyGxG1ITHIdlmfeVop1BAoc
HJ2FxENIqBOodVhXoCOw3TGnEfVCgsQDrmcc0uBJYNVHR20S3R/EPDDvw0c+p6AK94Wl/aKOwLTP
uSIPfAHLFrYfdAReJzBZ2abvpY7ABHjrg8AcyAEbDXZL4LknAapZGdxyDD4vpPdZ2A7JC0zbC3pl
R7bSJ70+YjFNtVoNJNKObQbMcXAA7AFjhhGvA6INVvMAhgOoBkNwNQsck5Z8wxB8wGuQ9VwEiQ7U
BSmcWPkGOiXnv2QS3q0Jru6rCWrZ71BaKH0/JLXxCmd/+F8RuKkJ/gO0YNsd6IcJgcPSfI56mLxT
3RJcJ/jnoD9MNsg3oZobcqWxqGf/J/gkdTFJ4N9J/zoOSv4KMAC++teHNUg1rQAAAABJRU5ErkJg
gg==
"/>
</g>
</svg>
This directory is used to implement various Bootstrap annotated plugins.
Please refer to the [Plugin System](<!-- @url plugins -->) topic for more info.
This directory is used to implement various core, contrib, Bootstrap and custom
templates.
Please refer to the [Templates](<!-- @url templates -->) topic for more info.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment