diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e0a029..27799cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,55 @@ +# v1.7.14 +## 04/29/2021 + +1. [](#new) + * Added `MediaUploadTrait::checkFileMetadata()` method +1. [](#improved) + * Updating a theme should always keep the custom files [getgrav/grav-plugin-admin#2135](https://github.com/getgrav/grav-plugin-admin/issues/2135) +1. [](#bugfix) + * Fixed broken numeric language codes in Flex Pages [#3332](https://github.com/getgrav/grav/issues/3332) + * Fixed broken `exif_imagetype()` twig function + +# v1.7.13 +## 04/23/2021 + +1. [](#new) + * Added support for getting translated collection of Flex Pages using `$collection->withTranslated('de')` +1. [](#improved) + * Moved `gregwar/Image` and `gregwar/Cache` in-house to official `getgrav/Image` and `getgrav/Cache` packagist packages. This will help environments with very strict proxy setups that don't allow VCS setup. [#3289](https://github.com/getgrav/grav/issues/3289) + * Improved XSS Invalid Protocol detection regex [#3298](https://github.com/getgrav/grav/issues/3298) + * Added support for user provided folder in Flex `$page->copy()` +1. [](#bugfix) + * Fixed `The "Grav/Common/Twig/TwigExtension" extension is not enabled` when using markdown twig tag [#3317](https://github.com/getgrav/grav/issues/3317) + * Fixed text field maxlength validation newline issue [#3324](https://github.com/getgrav/grav/issues/3324) + * Fixed a bug in Flex Object `refresh()` method + +# v1.7.12 +## 04/15/2021 + +1. [](#improved) + * Improve JSON support for the request +1. [](#bugfix) + * Fixed absolute path support for Windows [#3297](https://github.com/getgrav/grav/issues/3297) + * Fixed adding tags in admin after upgrading Grav [#3315](https://github.com/getgrav/grav/issues/3315) + +# v1.7.11 +## 04/13/2021 + +1. [](#new) + * Added configuration options to allow PHP methods to be used in Twig functions (`system.twig.safe_functions`) and filters (`system.twig.safe_filters`) + * Deprecated using PHP methods in Twig without them being in the safe lists + * Prevent dangerous PHP methods from being used as Twig functions and filters + * Restrict filesystem Twig functions to accept only local filesystem and grav streams +1. [](#improved) + * Better GPM detection of unauthorized installations +1. [](#bugfix) + * **IMPORTANT** Fixed security vulnerability with Twig allowing dangerous PHP functions by default [GHSA-g8r4-p96j-xfxc](https://github.com/getgrav/grav/security/advisories/GHSA-g8r4-p96j-xfxc) + * Fixed nxinx appending repeating `?_url=` in some redirects + * Fixed deleting page with language code not removing the folder if it was the last language [#3305](https://github.com/getgrav/grav/issues/3305) + * Fixed fatal error when using markdown links with `image://` stream [#3285](https://github.com/getgrav/grav/issues/3285) + * Fixed `system.languages.session_store_active` not having any effect [#3269](https://github.com/getgrav/grav/issues/3269) + * Fixed fatal error if `system.pages.types` is not an array [#2984](https://github.com/getgrav/grav/issues/2984) + # v1.7.10 ## 04/06/2021 diff --git a/README.md b/README.md index c9eebbe..562349f 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,150 @@ +# ![](https://avatars1.githubusercontent.com/u/8237355?v=2&s=50) Grav -#Installation site GIP EPAU +[![PHPStan](https://img.shields.io/badge/PHPStan-enabled-brightgreen.svg?style=flat)](https://github.com/phpstan/phpstan) +[![SensioLabsInsight](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad/mini.png)](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad) +[![Discord](https://img.shields.io/discord/501836936584101899.svg?logo=discord&colorB=728ADA&label=Discord%20Chat)](https://chat.getgrav.org) + [![PHP Tests](https://github.com/getgrav/grav/workflows/PHP%20Tests/badge.svg?branch=develop)](https://github.com/getgrav/grav/actions?query=workflow%3A%22PHP+Tests%22) [![OpenCollective](https://opencollective.com/grav/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/grav/sponsors/badge.svg)](#sponsors) -### intall grav avec composer +Grav is a **Fast**, **Simple**, and **Flexible**, file-based Web-platform. There is **Zero** installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful **Package Management System** to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself. + +The underlying architecture of Grav is designed to use well-established and _best-in-class_ technologies to ensure that Grav is simple to use and easy to extend. Some of these key technologies include: + +* [Twig Templating](https://twig.sensiolabs.org/): for powerful control of the user interface +* [Markdown](https://en.wikipedia.org/wiki/Markdown): for easy content creation +* [YAML](https://yaml.org): for simple configuration +* [Parsedown](https://parsedown.org/): for fast Markdown and Markdown Extra support +* [Doctrine Cache](https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html): layer for performance +* [Pimple Dependency Injection Container](https://pimple.sensiolabs.org/): for extensibility and maintainability +* [Symfony Event Dispatcher](https://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling +* [Symfony Console](https://symfony.com/doc/current/components/console/introduction.html): for CLI interface +* [Gregwar Image Library](https://github.com/Gregwar/Image): for dynamic image manipulation + +# Requirements + +- PHP 7.3.6 or higher. Check the [required modules list](https://learn.getgrav.org/basics/requirements#php-requirements) +- Check the [Apache](https://learn.getgrav.org/basics/requirements#apache-requirements) or [IIS](https://learn.getgrav.org/basics/requirements#iis-requirements) requirements + +# Documentation + +The full documentation can be found from [learn.getgrav.org](https://learn.getgrav.org). + +# QuickStart + +These are the options to get Grav: + +### Downloading a Grav Package + +You can download a **ready-built** package from the [Downloads page on https://getgrav.org](https://getgrav.org/downloads) + +### With Composer + +You can create a new project with the latest **stable** Grav release with the following command: ``` -composer create-project getgrav/grav ~/webroot/grav +$ composer create-project getgrav/grav ~/webroot/grav ``` +### From GitHub +1. Clone the Grav repository from [https://github.com/getgrav/grav]() to a folder in the webroot of your server, e.g. `~/webroot/grav`. Launch a **terminal** or **console** and navigate to the webroot folder: + ``` + $ cd ~/webroot + $ git clone https://github.com/getgrav/grav.git + ``` -#### installer version admin +2. Install the **plugin** and **theme dependencies** by using the [Grav CLI application](https://learn.getgrav.org/advanced/grav-cli) `bin/grav`: + ``` + $ cd ~/webroot/grav + $ bin/grav install + ``` -mise à jours -``` -cd ~/webroot/nomdusite -bin/gpm selfupgrade -``` -installe l’admin -``` -bin/gpm install admin -``` -créer un nouvel utilisateur -``` -bin/plugin login newuser -``` +Check out the [install procedures](https://learn.getgrav.org/basics/installation) for more information. -#### installe devtools et créer nouveau theme +# Adding Functionality + +You can download [plugins](https://getgrav.org/downloads/plugins) or [themes](https://getgrav.org/downloads/themes) manually from the appropriate tab on the [Downloads page on https://getgrav.org](https://getgrav.org/downloads), but the preferred solution is to use the [Grav Package Manager](https://learn.getgrav.org/advanced/grav-gpm) or `GPM`: ``` -bin/gpm install devtools - -bin/plugin devtools new-theme +$ bin/gpm index ``` - -# Dans le navigateur - -aller sur http://localhost:8000/ -pour voir le site - -aller sur http://localhost:8000/admin -pour accéder au back office - - - -\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ - - - -# Compilé les SCSS +This will display all the available plugins and then you can install one or more with: ``` -$ cd chemin/du/dossier/dev-epau.archi.fr +$ bin/gpm install ``` -``` -$ npm install -``` -(uniquement la première fois) -puis à chaque fois, dans une 2e fenêtre de Terminal, qui doit également restée ouverte: +# Updating + +To update Grav you should use the [Grav Package Manager](https://learn.getgrav.org/advanced/grav-gpm) or `GPM`: ``` -$ cd chemin/du/dossier/dev-epau.archi.fr/user/theme/epau-antimatter -$ npm run sass +$ bin/gpm selfupgrade ``` + +To update plugins and themes: + +``` +$ bin/gpm update +``` + +## Upgrading from older version + +* [Upgrading to Grav 1.7](https://learn.getgrav.org/16/advanced/grav-development/grav-17-upgrade-guide) +* [Upgrading to Grav 1.6](https://learn.getgrav.org/16/advanced/grav-development/grav-16-upgrade-guide) +* [Upgrading from Grav <1.6](https://learn.getgrav.org/16/advanced/grav-development/grav-15-upgrade-guide) + +# Contributing +We appreciate any contribution to Grav, whether it is related to bugs, grammar, or simply a suggestion or improvement! Please refer to the [Contributing guide](CONTRIBUTING.md) for more guidance on this topic. + +## Security issues +If you discover a possible security issue related to Grav or one of its plugins, please email the core team at contact@getgrav.org and we'll address it as soon as possible. + +# Getting Started + +* [What is Grav?](https://learn.getgrav.org/basics/what-is-grav) +* [Install](https://learn.getgrav.org/basics/installation) Grav in few seconds +* Understand the [Configuration](https://learn.getgrav.org/basics/grav-configuration) +* Take a peek at our available free [Skeletons](https://getgrav.org/downloads/skeletons) +* If you have questions, jump on our [Discord Chat Server](https://chat.getgrav.org)! +* Have fun! + +# Exploring More + +* Have a look at our [Basic Tutorial](https://learn.getgrav.org/basics/basic-tutorial) +* Dive into more [advanced](https://learn.getgrav.org/advanced) functions +* Learn about the [Grav CLI](https://learn.getgrav.org/cli-console/grav-cli) +* Review examples in the [Grav Cookbook](https://learn.getgrav.org/cookbook) +* More [Awesome Grav Stuff](https://github.com/getgrav/awesome-grav) + +# Backers +Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav#backer)] + + + +# Sponsors +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/grav#sponsor)] + + + +# License + +See [LICENSE](LICENSE.txt) + + +[gitflow-model]: http://nvie.com/posts/a-successful-git-branching-model/ +[gitflow-extensions]: https://github.com/nvie/gitflow + +# Running Tests + +First install the dev dependencies by running `composer install` from the Grav root. + +Then `composer test` will run the Unit Tests, which should be always executed successfully on any site. +Windows users should use the `composer test-windows` command. +You can also run a single unit test file, e.g. `composer test tests/unit/Grav/Common/AssetsTest.php` + +To run phpstan tests, you should run: + +* `composer phpstan` for global tests +* `composer phpstan-framework` for more strict tests +* `composer phpstan-plugins` to test all installed plugins diff --git a/composer.json b/composer.json index 34d1e7e..c3fb23e 100644 --- a/composer.json +++ b/composer.json @@ -44,8 +44,8 @@ "filp/whoops": "~2.9", "matthiasmullie/minify": "^1.3", "monolog/monolog": "~1.25", - "gregwar/image": "dev-php8", - "gregwar/cache": "dev-php8", + "getgrav/image": "^3.0", + "getgrav/cache": "^2.0", "donatj/phpuseragentparser": "~1.1", "pimple/pimple": "~3.3.0", "rockettheme/toolbox": "~1.5", @@ -67,7 +67,7 @@ "phpstan/phpstan": "^0.12", "phpstan/phpstan-deprecation-rules": "^0.12", "phpunit/php-code-coverage": "~9.2", - "victorjonsson/markdowndocs": "dev-master", + "getgrav/markdowndocs": "^2.0", "codeception/module-asserts": "^1.3", "codeception/module-phpbrowser": "^1.0", "symfony/service-contracts": "*" @@ -91,20 +91,6 @@ "php": "7.3.6" } }, - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/trilbymedia/PHP-Markdown-Documentation-Generator" - }, - { - "type": "vcs", - "url": "https://github.com/getgrav/Cache" - }, - { - "type": "vcs", - "url": "https://github.com/getgrav/Image" - } - ], "autoload": { "psr-4": { "Grav\\": "system/src/Grav" diff --git a/composer.lock b/composer.lock index 350b627..1d51262 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4ae6fc7274c018b1bb34bb1b80bd62c5", + "content-hash": "36375d8a5daf3aef0341f9a2b023f4e9", "packages": [ { "name": "antoligy/dom-string-iterators", @@ -212,40 +212,39 @@ }, { "name": "doctrine/cache", - "version": "1.10.2", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" + "reference": "a9c1b59eba5a08ca2770a76eddb88922f504e8e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", + "url": "https://api.github.com/repos/doctrine/cache/zipball/a9c1b59eba5a08ca2770a76eddb88922f504e8e0", + "reference": "a9c1b59eba5a08ca2770a76eddb88922f504e8e0", "shasum": "" }, "require": { "php": "~7.1 || ^8.0" }, "conflict": { - "doctrine/common": ">2.2,<2.4" + "doctrine/common": ">2.2,<2.4", + "psr/cache": ">=3" }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0", + "symfony/cache": "^4.4 || ^5.2" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" @@ -292,7 +291,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.10.x" + "source": "https://github.com/doctrine/cache/tree/1.11.0" }, "funding": [ { @@ -308,7 +307,7 @@ "type": "tidelift" } ], - "time": "2020-07-07T18:54:01+00:00" + "time": "2021-04-13T14:46:17+00:00" }, { "name": "doctrine/collections", @@ -642,16 +641,16 @@ }, { "name": "filp/whoops", - "version": "2.12.0", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "d501fd2658d55491a2295ff600ae5978eaad7403" + "reference": "c13c0be93cff50f88bbd70827d993026821914dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/d501fd2658d55491a2295ff600ae5978eaad7403", - "reference": "d501fd2658d55491a2295ff600ae5978eaad7403", + "url": "https://api.github.com/repos/filp/whoops/zipball/c13c0be93cff50f88bbd70827d993026821914dd", + "reference": "c13c0be93cff50f88bbd70827d993026821914dd", "shasum": "" }, "require": { @@ -701,7 +700,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.12.0" + "source": "https://github.com/filp/whoops/tree/2.12.1" }, "funding": [ { @@ -709,21 +708,21 @@ "type": "github" } ], - "time": "2021-03-30T12:00:00+00:00" + "time": "2021-04-25T12:00:00+00:00" }, { - "name": "gregwar/cache", - "version": "dev-php8", + "name": "getgrav/cache", + "version": "v2.0.0", "target-dir": "Gregwar/Cache", "source": { "type": "git", "url": "https://github.com/getgrav/Cache.git", - "reference": "49ccdf9ae760b009a192bc3c7b417980c8a8cc2e" + "reference": "56fd63f752779928fcd1074ab7d12f406dde8861" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getgrav/Cache/zipball/49ccdf9ae760b009a192bc3c7b417980c8a8cc2e", - "reference": "49ccdf9ae760b009a192bc3c7b417980c8a8cc2e", + "url": "https://api.github.com/repos/getgrav/Cache/zipball/56fd63f752779928fcd1074ab7d12f406dde8861", + "reference": "56fd63f752779928fcd1074ab7d12f406dde8861", "shasum": "" }, "require": { @@ -735,6 +734,7 @@ "Gregwar\\Cache": "" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -742,6 +742,11 @@ { "name": "Gregwar", "email": "g.passault@gmail.com" + }, + { + "name": "Grav CMS", + "email": "hello@getgrav.org", + "homepage": "https://getgrav.org" } ], "description": "A lightweight file-system cache system", @@ -752,28 +757,28 @@ "system" ], "support": { - "source": "https://github.com/getgrav/Cache/tree/php8" + "source": "https://github.com/getgrav/Cache/tree/v2.0.0" }, - "time": "2020-12-02T10:54:35+00:00" + "time": "2021-04-20T05:48:00+00:00" }, { - "name": "gregwar/image", - "version": "dev-php8", + "name": "getgrav/image", + "version": "v3.0.0", "target-dir": "Gregwar/Image", "source": { "type": "git", "url": "https://github.com/getgrav/Image.git", - "reference": "ea23859700f32447a85e79d96f331e3d6c8897a8" + "reference": "02c1bb2c179dd894c4f6610c9c49da364ee7d264" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getgrav/Image/zipball/ea23859700f32447a85e79d96f331e3d6c8897a8", - "reference": "ea23859700f32447a85e79d96f331e3d6c8897a8", + "url": "https://api.github.com/repos/getgrav/Image/zipball/02c1bb2c179dd894c4f6610c9c49da364ee7d264", + "reference": "02c1bb2c179dd894c4f6610c9c49da364ee7d264", "shasum": "" }, "require": { "ext-gd": "*", - "gregwar/cache": "dev-php8", + "getgrav/cache": "^2.0", "php": "^5.6 || ^7.0 || ^8.0" }, "require-dev": { @@ -789,6 +794,7 @@ "Gregwar\\Image": "" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -797,6 +803,11 @@ "name": "Grégoire Passault", "email": "g.passault@gmail.com", "homepage": "http://www.gregwar.com/" + }, + { + "name": "Grav CMS", + "email": "hello@getgrav.org", + "homepage": "https://getgrav.org" } ], "description": "Image handling", @@ -806,9 +817,9 @@ "image" ], "support": { - "source": "https://github.com/getgrav/Image/tree/php8" + "source": "https://github.com/getgrav/Image/tree/v3.0.0" }, - "time": "2021-03-15T17:03:52+00:00" + "time": "2021-04-20T05:50:18+00:00" }, { "name": "guzzlehttp/psr7", @@ -2135,16 +2146,16 @@ }, { "name": "rockettheme/toolbox", - "version": "1.5.7", + "version": "1.5.9", "source": { "type": "git", "url": "https://github.com/rockettheme/toolbox.git", - "reference": "8d3ebc4d982595d6eac90e851f2b4d5c0cec0399" + "reference": "2d6693235aaca2efaadb61c84dac927aaf4eabfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rockettheme/toolbox/zipball/8d3ebc4d982595d6eac90e851f2b4d5c0cec0399", - "reference": "8d3ebc4d982595d6eac90e851f2b4d5c0cec0399", + "url": "https://api.github.com/repos/rockettheme/toolbox/zipball/2d6693235aaca2efaadb61c84dac927aaf4eabfa", + "reference": "2d6693235aaca2efaadb61c84dac927aaf4eabfa", "shasum": "" }, "require": { @@ -2185,9 +2196,9 @@ ], "support": { "issues": "https://github.com/rockettheme/toolbox/issues", - "source": "https://github.com/rockettheme/toolbox/tree/1.5.7" + "source": "https://github.com/rockettheme/toolbox/tree/1.5.9" }, - "time": "2021-02-17T17:58:36+00:00" + "time": "2021-04-14T19:52:40+00:00" }, { "name": "seld/cli-prompt", @@ -3415,16 +3426,16 @@ }, { "name": "codeception/codeception", - "version": "4.1.19", + "version": "4.1.20", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "138dc9345a81ec994dcd6b9680c501a752a37b00" + "reference": "d8b16e13e1781dbc3a7ae8292117d520c89a9c5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/138dc9345a81ec994dcd6b9680c501a752a37b00", - "reference": "138dc9345a81ec994dcd6b9680c501a752a37b00", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/d8b16e13e1781dbc3a7ae8292117d520c89a9c5a", + "reference": "d8b16e13e1781dbc3a7ae8292117d520c89a9c5a", "shasum": "" }, "require": { @@ -3498,7 +3509,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.1.19" + "source": "https://github.com/Codeception/Codeception/tree/4.1.20" }, "funding": [ { @@ -3506,7 +3517,7 @@ "type": "open_collective" } ], - "time": "2021-03-28T13:26:08+00:00" + "time": "2021-04-02T16:41:51+00:00" }, { "name": "codeception/lib-asserts", @@ -3564,16 +3575,16 @@ }, { "name": "codeception/lib-innerbrowser", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/Codeception/lib-innerbrowser.git", - "reference": "693e116f81ef98eae98c43ef785a726faf87394e" + "reference": "4b0d89b37fe454e060a610a85280a87ab4f534f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/693e116f81ef98eae98c43ef785a726faf87394e", - "reference": "693e116f81ef98eae98c43ef785a726faf87394e", + "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/4b0d89b37fe454e060a610a85280a87ab4f534f1", + "reference": "4b0d89b37fe454e060a610a85280a87ab4f534f1", "shasum": "" }, "require": { @@ -3618,9 +3629,9 @@ ], "support": { "issues": "https://github.com/Codeception/lib-innerbrowser/issues", - "source": "https://github.com/Codeception/lib-innerbrowser/tree/1.4.1" + "source": "https://github.com/Codeception/lib-innerbrowser/tree/1.5.0" }, - "time": "2021-03-02T08:01:54+00:00" + "time": "2021-04-23T06:18:29+00:00" }, { "name": "codeception/module-asserts", @@ -3891,6 +3902,58 @@ ], "time": "2020-11-10T18:47:58+00:00" }, + { + "name": "getgrav/markdowndocs", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/getgrav/PHP-Markdown-Documentation-Generator.git", + "reference": "4a24d1b64a88da17e8f1696dc64969f5ca769064" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getgrav/PHP-Markdown-Documentation-Generator/zipball/4a24d1b64a88da17e8f1696dc64969f5ca769064", + "reference": "4a24d1b64a88da17e8f1696dc64969f5ca769064", + "shasum": "" + }, + "require": { + "php": ">=5.5.0", + "symfony/console": ">=2.6" + }, + "require-dev": { + "phpunit/phpunit": "3.7.23" + }, + "bin": [ + "bin/phpdoc-md" + ], + "type": "library", + "autoload": { + "psr-0": { + "PHPDocsMD": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Victor Jonsson", + "email": "kontakt@victorjonsson.se" + }, + { + "name": "Grav CMS", + "email": "hello@getgrav.org", + "homepage": "https://getgrav.org" + } + ], + "description": "Command line tool for generating markdown-formatted class documentation", + "homepage": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator", + "support": { + "source": "https://github.com/getgrav/PHP-Markdown-Documentation-Generator/tree/2.0.1" + }, + "time": "2021-04-20T06:04:42+00:00" + }, { "name": "guzzlehttp/guzzle", "version": "7.3.0", @@ -4501,16 +4564,16 @@ }, { "name": "phpstan/phpstan", - "version": "0.12.82", + "version": "0.12.84", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "3920f0fb0aff39263d3a4cb0bca120a67a1a6a11" + "reference": "9c43f15da8798c8f30a4b099e6a94530a558cfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3920f0fb0aff39263d3a4cb0bca120a67a1a6a11", - "reference": "3920f0fb0aff39263d3a4cb0bca120a67a1a6a11", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9c43f15da8798c8f30a4b099e6a94530a558cfd5", + "reference": "9c43f15da8798c8f30a4b099e6a94530a558cfd5", "shasum": "" }, "require": { @@ -4541,7 +4604,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/0.12.82" + "source": "https://github.com/phpstan/phpstan/tree/0.12.84" }, "funding": [ { @@ -4557,7 +4620,7 @@ "type": "tidelift" } ], - "time": "2021-03-19T06:08:17+00:00" + "time": "2021-04-19T17:10:54+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -6368,53 +6431,6 @@ ], "time": "2020-07-12T23:59:07+00:00" }, - { - "name": "victorjonsson/markdowndocs", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/trilbymedia/PHP-Markdown-Documentation-Generator.git", - "reference": "c9fa153b28a79f5da89ec32aa501be92db212aed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/trilbymedia/PHP-Markdown-Documentation-Generator/zipball/c9fa153b28a79f5da89ec32aa501be92db212aed", - "reference": "c9fa153b28a79f5da89ec32aa501be92db212aed", - "shasum": "" - }, - "require": { - "php": ">=5.5.0", - "symfony/console": ">=2.6" - }, - "require-dev": { - "phpunit/phpunit": "3.7.23" - }, - "default-branch": true, - "bin": [ - "bin/phpdoc-md" - ], - "type": "library", - "autoload": { - "psr-0": { - "PHPDocsMD": "src/" - } - }, - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Victor Jonsson", - "email": "kontakt@victorjonsson.se" - } - ], - "description": "Command line tool for generating markdown-formatted class documentation", - "homepage": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator", - "support": { - "source": "https://github.com/trilbymedia/PHP-Markdown-Documentation-Generator/tree/master" - }, - "time": "2017-09-20T13:29:22+00:00" - }, { "name": "webmozart/assert", "version": "1.10.0", @@ -6476,11 +6492,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "gregwar/image": 20, - "gregwar/cache": 20, - "victorjonsson/markdowndocs": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/system/blueprints/flex/user-groups.yaml b/system/blueprints/flex/user-groups.yaml index a09a821..05ba87b 100644 --- a/system/blueprints/flex/user-groups.yaml +++ b/system/blueprints/flex/user-groups.yaml @@ -18,6 +18,7 @@ config: configure: path: '/accounts/configure' redirects: + '/groups': '/accounts/groups' '/accounts': '/accounts/groups' # Permissions diff --git a/system/blueprints/pages/default.yaml b/system/blueprints/pages/default.yaml index 0e7b8c3..f3ef29f 100644 --- a/system/blueprints/pages/default.yaml +++ b/system/blueprints/pages/default.yaml @@ -121,7 +121,7 @@ form: underline: true folder: - type: text + type: folder-slug label: PLUGIN_ADMIN.FOLDER_NAME validate: rule: slug diff --git a/system/config/system.yaml b/system/config/system.yaml index c314614..08b17fb 100644 --- a/system/config/system.yaml +++ b/system/config/system.yaml @@ -113,6 +113,8 @@ twig: autoescape: true # Autoescape Twig vars (DEPRECATED, always enabled in strict mode) undefined_functions: true # Allow undefined functions undefined_filters: true # Allow undefined filters + safe_functions: [] # List of PHP functions which are allowed to be used as Twig functions + safe_filters: [] # List of PHP functions which are allowed to be used as Twig filters umask_fix: false # By default Twig creates cached files as 755, fix switches this to 775 assets: # Configuration for Assets Manager (JS, CSS) diff --git a/system/defines.php b/system/defines.php index 6bdcb24..2b592b5 100644 --- a/system/defines.php +++ b/system/defines.php @@ -1,4 +1,5 @@ select($list) : $this->unselect($list); } + /** + * @param string|null $languageCode + * @param bool|null $fallback + * @return PageIndex + */ + public function withTranslated(string $languageCode = null, bool $fallback = null) + { + return $this->getIndex()->withTranslated($languageCode, $fallback); + } + /** * Filter pages by given filters. * diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php index b43b886..b536c4c 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php @@ -18,6 +18,7 @@ use Grav\Common\File\CompiledYamlFile; use Grav\Common\Flex\Traits\FlexGravTrait; use Grav\Common\Flex\Traits\FlexIndexTrait; use Grav\Common\Grav; +use Grav\Common\Language\Language; use Grav\Common\Page\Header; use Grav\Common\Page\Interfaces\PageCollectionInterface; use Grav\Common\Page\Interfaces\PageInterface; @@ -164,6 +165,31 @@ class PageIndex extends FlexPageIndex implements PageCollectionInterface return $root; } + /** + * @param string|null $languageCode + * @param bool|null $fallback + * @return PageIndex + */ + public function withTranslated(string $languageCode = null, bool $fallback = null) + { + if (null === $languageCode) { + return $this; + } + + $entries = $this->translateEntries($this->getEntries(), $languageCode, $fallback); + $params = ['language' => $languageCode, 'language_fallback' => $fallback] + $this->getParams(); + + return $this->createFrom($entries)->setParams($params); + } + + /** + * @return string|null + */ + public function getLanguage(): ?string + { + return $this->_params['language'] ?? null; + } + /** * Get the collection params * @@ -174,6 +200,17 @@ class PageIndex extends FlexPageIndex implements PageCollectionInterface return $this->_params ?? []; } + /** + * Get the collection param + * + * @param string $name + * @return mixed + */ + public function getParam(string $name) + { + return $this->_params[$name] ?? null; + } + /** * Set parameters to the Collection * @@ -187,6 +224,20 @@ class PageIndex extends FlexPageIndex implements PageCollectionInterface return $this; } + /** + * Set a parameter to the Collection + * + * @param string $name + * @param mixed $value + * @return $this + */ + public function setParam(string $name, $value) + { + $this->_params[$name] = $value; + + return $this; + } + /** * Get the collection params * @@ -197,6 +248,15 @@ class PageIndex extends FlexPageIndex implements PageCollectionInterface return $this->getParams(); } + /** + * {@inheritdoc} + * @see FlexCollectionInterface::getCacheKey() + */ + public function getCacheKey(): string + { + return $this->getTypePrefix() . $this->getFlexType() . '.' . sha1(json_encode($this->getKeys()) . $this->getKeyField() . $this->getLanguage()); + } + /** * Filter pages by given filters. * @@ -345,6 +405,96 @@ class PageIndex extends FlexPageIndex implements PageCollectionInterface return $index; } + /** + * @param array $entries + * @param string $lang + * @param bool|null $fallback + * @return array + */ + protected function translateEntries(array $entries, string $lang, bool $fallback = null): array + { + $languages = $this->getFallbackLanguages($lang, $fallback); + foreach ($entries as $key => &$entry) { + // Find out which version of the page we should load. + $translations = $this->getLanguageTemplates((string)$key); + if (!$translations) { + // No translations found, is this a folder? + continue; + } + + // Find a translation. + $template = null; + foreach ($languages as $code) { + if (isset($translations[$code])) { + $template = $translations[$code]; + break; + } + } + + // We couldn't find a translation, remove entry from the list. + if (!isset($code, $template)) { + unset($entries['key']); + continue; + } + + // Get the main key without template and langauge. + [$main_key,] = explode('|', $entry['storage_key'] . '|', 2); + + // Update storage key and language. + $entry['storage_key'] = $main_key . '|' . $template . '.' . $code; + $entry['lang'] = $code; + } + unset($entry); + + return $entries; + } + + /** + * @return array + */ + protected function getLanguageTemplates(string $key): array + { + $meta = $this->getMetaData($key); + $template = $meta['template'] ?? 'folder'; + $translations = $meta['markdown'] ?? []; + $list = []; + foreach ($translations as $code => $search) { + if (isset($search[$template])) { + // Use main template if possible. + $list[$code] = $template; + } elseif (!empty($search)) { + // Fall back to first matching template. + $list[$code] = key($search); + } + } + + return $list; + } + + /** + * @param string|null $languageCode + * @param bool|null $fallback + * @return array + */ + protected function getFallbackLanguages(string $languageCode = null, bool $fallback = null): array + { + $fallback = $fallback ?? true; + if (!$fallback && null !== $languageCode) { + return [$languageCode]; + } + + $grav = Grav::instance(); + + /** @var Language $language */ + $language = $grav['language']; + $languageCode = $languageCode ?? ''; + if ($languageCode === '' && $fallback) { + return $language->getFallbackLanguages(null, true); + } + + return $fallback ? $language->getFallbackLanguages($languageCode, true) : [$languageCode]; + } + /** * @param array $options * @return array diff --git a/system/src/Grav/Common/Flex/Types/Pages/Storage/PageStorage.php b/system/src/Grav/Common/Flex/Types/Pages/Storage/PageStorage.php index 1311e04..ba7fa06 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/Storage/PageStorage.php +++ b/system/src/Grav/Common/Flex/Types/Pages/Storage/PageStorage.php @@ -474,17 +474,28 @@ class PageStorage extends FolderStorage } /** + * Check if page folder should be deleted. + * + * Deleting page can be done either by deleting everything or just a single language. + * If key contains the language, delete only it, unless it is the last language. + * * @param string $key * @return bool */ protected function canDeleteFolder(string $key): bool { + // Return true if there's no language in the key. $keys = $this->extractKeysFromStorageKey($key); - if ($keys['lang']) { - return false; + if (!$keys['lang']) { + return true; } - return true; + // Get the main key and reload meta. + $key = $this->buildStorageKey($keys); + $meta = $this->getObjectMeta($key, true); + + // Return true if there aren't any markdown files left. + return empty($meta['markdown'] ?? []); } /** diff --git a/system/src/Grav/Common/Flex/Types/Users/UserObject.php b/system/src/Grav/Common/Flex/Types/Users/UserObject.php index 4109eec..40e6101 100644 --- a/system/src/Grav/Common/Flex/Types/Users/UserObject.php +++ b/system/src/Grav/Common/Flex/Types/Users/UserObject.php @@ -22,7 +22,6 @@ use Grav\Common\Grav; use Grav\Common\Media\Interfaces\MediaCollectionInterface; use Grav\Common\Media\Interfaces\MediaUploadInterface; use Grav\Common\Page\Media; -use Grav\Common\Page\Medium\Medium; use Grav\Common\Page\Medium\MediumFactory; use Grav\Common\User\Access; use Grav\Common\User\Authentication; @@ -78,16 +77,12 @@ class UserObject extends FlexObject implements UserInterface, Countable /** @var array|null */ protected $_uploads_original; - /** @var FileInterface|null */ protected $_storage; - /** @var UserGroupIndex */ protected $_groups; - /** @var Access */ protected $_access; - /** @var array|null */ protected $access; diff --git a/system/src/Grav/Common/GPM/GPM.php b/system/src/Grav/Common/GPM/GPM.php index 1b15e5d..222aa0a 100644 --- a/system/src/Grav/Common/GPM/GPM.php +++ b/system/src/Grav/Common/GPM/GPM.php @@ -527,7 +527,7 @@ class GPM extends Iterator $plugins = $this->getRepositoryPlugins(); if (null === $themes || null === $plugins) { - if (!is_writable(ROOT_DIR . '/cache/gpm')) { + if (!is_writable(GRAV_ROOT . '/cache/gpm')) { throw new RuntimeException('The cache/gpm folder is not writable. Please check the folder permissions.'); } diff --git a/system/src/Grav/Common/GPM/Installer.php b/system/src/Grav/Common/GPM/Installer.php index 9cdea52..639240b 100644 --- a/system/src/Grav/Common/GPM/Installer.php +++ b/system/src/Grav/Common/GPM/Installer.php @@ -135,7 +135,10 @@ class Installer } if (!$options['sophisticated']) { - if ($options['theme']) { + $isTheme = $options['theme'] ?? false; + // Make sure that themes are always being copied, even if option was not set! + $isTheme = $isTheme || preg_match('|/themes/[^/]+|ui', $install_path); + if ($isTheme) { self::copyInstall($extracted, $install_path); } else { self::moveInstall($extracted, $install_path); diff --git a/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php b/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php index 3a0181a..6da77ee 100644 --- a/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php @@ -71,15 +71,6 @@ trait MediaUploadTrait */ public function checkUploadedFile(UploadedFileInterface $uploadedFile, string $filename = null, array $settings = null): string { - // Add the defaults to the settings. - $settings = $this->getUploadSettings($settings); - - // Destination is always needed (but it can be set in defaults). - $self = $settings['self'] ?? false; - if (!isset($settings['destination']) && $self === false) { - throw new RuntimeException($this->translate('PLUGIN_ADMIN.DESTINATION_NOT_SPECIFIED'), 400); - } - // Check if there is an upload error. switch ($uploadedFile->getError()) { case UPLOAD_ERR_OK: @@ -101,10 +92,38 @@ trait MediaUploadTrait throw new RuntimeException($this->translate('PLUGIN_ADMIN.UNKNOWN_ERRORS'), 400); } + $metadata = [ + 'filename' => $uploadedFile->getClientFilename(), + 'mime' => $uploadedFile->getClientMediaType(), + 'size' => $uploadedFile->getSize(), + ]; + + return $this->checkFileMetadata($metadata, $filename, $settings); + } + + /** + * Checks that file metadata meets the requirements. Returns new filename. + * + * @param array $metadata + * @param array|null $settings + * @return string|null + * @throws RuntimeException + */ + public function checkFileMetadata(array $metadata, string $filename = null, array $settings = null): string + { + // Add the defaults to the settings. + $settings = $this->getUploadSettings($settings); + + // Destination is always needed (but it can be set in defaults). + $self = $settings['self'] ?? false; + if (!isset($settings['destination']) && $self === false) { + throw new RuntimeException($this->translate('PLUGIN_ADMIN.DESTINATION_NOT_SPECIFIED'), 400); + } + if (null === $filename) { // If no filename is given, use the filename from the uploaded file (path is not allowed). $folder = ''; - $filename = $uploadedFile->getClientFilename() ?? ''; + $filename = $metadata['filename'] ?? ''; } else { // If caller sets the filename, we will accept any custom path. $folder = dirname($filename); @@ -128,7 +147,7 @@ trait MediaUploadTrait $filename = date('YmdHis') . '-' . $filename; } } - $filepath = $folder !== '' ? $folder . $filename : $filename; + $filepath = $folder . $filename; // Check if the filename is allowed. if (!Utils::checkFilename($filename)) { @@ -148,14 +167,14 @@ trait MediaUploadTrait $filesize = $settings['filesize']; if ($filesize) { $max_filesize = $filesize * 1048576; - if ($uploadedFile->getSize() > $max_filesize) { + if ($metadata['size'] > $max_filesize) { // TODO: use own language string throw new RuntimeException($this->translate('PLUGIN_ADMIN.EXCEEDED_GRAV_FILESIZE_LIMIT'), 400); } } elseif (null === $filesize) { // Check size against the Grav upload limit. $grav_limit = Utils::getUploadLimit(); - if ($grav_limit > 0 && $uploadedFile->getSize() > $grav_limit) { + if ($grav_limit > 0 && $metadata['size'] > $grav_limit) { throw new RuntimeException($this->translate('PLUGIN_ADMIN.EXCEEDED_GRAV_FILESIZE_LIMIT'), 400); } } @@ -165,6 +184,11 @@ trait MediaUploadTrait $errors = []; // Do not trust mime type sent by the browser. $mime = Utils::getMimeByFilename($filename); + $mimeTest = $metadata['mime'] ?? $mime; + if ($mime !== $mimeTest) { + throw new RuntimeException('The mime type does not match to file extension', 400); + } + foreach ((array)$settings['accept'] as $type) { // Force acceptance of any file when star notation if ($type === '*') { diff --git a/system/src/Grav/Common/Page/Markdown/Excerpts.php b/system/src/Grav/Common/Page/Markdown/Excerpts.php index 3317217..e8afd36 100644 --- a/system/src/Grav/Common/Page/Markdown/Excerpts.php +++ b/system/src/Grav/Common/Page/Markdown/Excerpts.php @@ -95,8 +95,8 @@ class Excerpts */ public function processLinkExcerpt(array $excerpt, string $type = 'link'): array { + $grav = Grav::instance(); $url = htmlspecialchars_decode(rawurldecode($excerpt['element']['attributes']['href'])); - $url_parts = $this->parseUrl($url); // If there is a query, then parse it and build action calls. @@ -114,7 +114,7 @@ class Excerpts ); // Valid attributes supported. - $valid_attributes = Grav::instance()['config']->get('system.pages.markdown.valid_link_attributes'); + $valid_attributes = $grav['config']->get('system.pages.markdown.valid_link_attributes') ?? []; $skip = []; // Unless told to not process, go through actions. @@ -155,9 +155,11 @@ class Excerpts // If scheme isn't http(s).. if (!empty($url_parts['scheme']) && !in_array($url_parts['scheme'], ['http', 'https'])) { // Handle custom streams. - if ($type !== 'image' && !empty($url_parts['stream']) && !empty($url_parts['path'])) { - $grav = Grav::instance(); - $url_parts['path'] = $grav['base_url_relative'] . '/' . $this->resolveStream("{$url_parts['scheme']}://{$url_parts['path']}"); + /** @var UniformResourceLocator $locator */ + $locator = $grav['locator']; + if ($locator->isStream($url)) { + $path = $locator->findResource($url, false) ?: $locator->findResource($url, false, true); + $url_parts['path'] = $grav['base_url_relative'] . '/' . $path; unset($url_parts['stream'], $url_parts['scheme']); } @@ -338,20 +340,4 @@ class Excerpts return $url_parts; } - - /** - * @param string $url - * @return string - */ - protected function resolveStream(string $url) - { - /** @var UniformResourceLocator $locator */ - $locator = Grav::instance()['locator']; - - if ($locator->isStream($url)) { - return $locator->findResource($url, false) ?: $locator->findResource($url, false, true); - } - - return $url; - } } diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 5c92cba..a035613 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -2095,7 +2095,7 @@ class Page implements PageInterface */ public function filePathClean() { - return str_replace(ROOT_DIR, '', $this->filePath()); + return str_replace(GRAV_ROOT . DS, '', $this->filePath()); } /** diff --git a/system/src/Grav/Common/Plugins.php b/system/src/Grav/Common/Plugins.php index be8f43b..cc6f7ea 100644 --- a/system/src/Grav/Common/Plugins.php +++ b/system/src/Grav/Common/Plugins.php @@ -311,7 +311,7 @@ class Plugins extends Iterator } } else { $grav['log']->addWarning( - sprintf("Plugin '%s' enabled but not found! Try clearing cache with `bin/grav clear-cache`", $name) + sprintf("Plugin '%s' enabled but not found! Try clearing cache with `bin/grav clearcache`", $name) ); return null; } diff --git a/system/src/Grav/Common/Processors/InitializeProcessor.php b/system/src/Grav/Common/Processors/InitializeProcessor.php index 0f8567f..cc8e4f2 100644 --- a/system/src/Grav/Common/Processors/InitializeProcessor.php +++ b/system/src/Grav/Common/Processors/InitializeProcessor.php @@ -101,7 +101,14 @@ class InitializeProcessor extends ProcessorBase // Load pages. $this->initializePages($config); - // Initialize URI. + // Load accounts (decides class to be used). + // TODO: remove in 2.0. + $this->container['accounts']; + + // Initialize session. + $this->initializeSession($config); + + // Initialize URI (uses session, see issue #3269). $this->initializeUri($config); // Grav may return redirect response right away. @@ -115,13 +122,6 @@ class InitializeProcessor extends ProcessorBase } } - // Load accounts (decides class to be used). - // TODO: remove in 2.0. - $this->container['accounts']; - - // Initialize session. - $this->initializeSession($config); - $this->stopTimer('_init'); // Wrap call to next handler so that debugger can profile it. diff --git a/system/src/Grav/Common/Security.php b/system/src/Grav/Common/Security.php index 21d059e..fe33d79 100644 --- a/system/src/Grav/Common/Security.php +++ b/system/src/Grav/Common/Security.php @@ -210,7 +210,7 @@ class Security 'on_events' => '#(<[^>]+[[a-z\x00-\x20\"\'\/])([\s\/]on|\sxmlns)[a-z].*=>?#iUu', // Match javascript:, livescript:, vbscript:, mocha:, feed: and data: protocols - 'invalid_protocols' => '#(' . implode('|', array_map('preg_quote', $invalid_protocols, ['#'])) . '):.*?#iUu', + 'invalid_protocols' => '#(' . implode('|', array_map('preg_quote', $invalid_protocols, ['#'])) . '):\S.*?#iUu', // Match -moz-bindings 'moz_binding' => '#-moz-binding[a-z\x00-\x20]*:#u', diff --git a/system/src/Grav/Common/Service/RequestServiceProvider.php b/system/src/Grav/Common/Service/RequestServiceProvider.php index 1cc03ed..17b3149 100644 --- a/system/src/Grav/Common/Service/RequestServiceProvider.php +++ b/system/src/Grav/Common/Service/RequestServiceProvider.php @@ -10,10 +10,18 @@ namespace Grav\Common\Service; use Grav\Common\Uri; +use JsonException; use Nyholm\Psr7\Factory\Psr17Factory; use Nyholm\Psr7Server\ServerRequestCreator; use Pimple\Container; use Pimple\ServiceProviderInterface; +use function explode; +use function fopen; +use function function_exists; +use function in_array; +use function is_array; +use function strtolower; +use function trim; /** * Class RequestServiceProvider @@ -36,7 +44,56 @@ class RequestServiceProvider implements ServiceProviderInterface $psr17Factory // StreamFactory ); - return $creator->fromGlobals(); + $server = $_SERVER; + if (false === isset($server['REQUEST_METHOD'])) { + $server['REQUEST_METHOD'] = 'GET'; + } + $method = $server['REQUEST_METHOD']; + + $headers = function_exists('getallheaders') ? getallheaders() : $creator::getHeadersFromServer($_SERVER); + + $post = null; + if (in_array($method, ['POST', 'PUT', 'PATCH', 'DELETE'])) { + foreach ($headers as $headerName => $headerValue) { + if ('content-type' !== strtolower($headerName)) { + continue; + } + + $contentType = strtolower(trim(explode(';', $headerValue, 2)[0])); + switch ($contentType) { + case 'application/x-www-form-urlencoded': + case 'multipart/form-data': + $post = $_POST; + break 2; + case 'application/json': + case 'application/vnd.api+json': + try { + $json = file_get_contents('php://input'); + $post = json_decode($json, true, 512, JSON_THROW_ON_ERROR); + if (!is_array($post)) { + $post = null; + } + } catch (JsonException $e) { + $post = null; + } + break 2; + } + } + } + + // Remove _url from ngnix routes. + $get = $_GET; + unset($get['_url']); + if (isset($server['QUERY_STRING'])) { + $query = $server['QUERY_STRING']; + if (strpos($query, '_url=') !== false) { + parse_str($query, $query); + unset($query['_url']); + $server['QUERY_STRING'] = http_build_query($query); + } + } + + return $creator->fromArrays($server, $headers, $_COOKIE, $get, $post, $_FILES, fopen('php://input', 'rb') ?: null); }; $container['route'] = $container->factory(function () { diff --git a/system/src/Grav/Common/Twig/Extension/FilesystemExtension.php b/system/src/Grav/Common/Twig/Extension/FilesystemExtension.php new file mode 100644 index 0000000..e31b5fb --- /dev/null +++ b/system/src/Grav/Common/Twig/Extension/FilesystemExtension.php @@ -0,0 +1,351 @@ +locator = Grav::instance()['locator']; + } + + /** + * @return TwigFunction[] + */ + public function getFilters() + { + return $this->getFunctions(); + } + + /** + * Return a list of all functions. + * + * @return TwigFunction[] + */ + public function getFunctions() + { + return [ + new TwigFunction('file_exists', [$this, 'file_exists']), + new TwigFunction('fileatime', [$this, 'fileatime']), + new TwigFunction('filectime', [$this, 'filectime']), + new TwigFunction('filemtime', [$this, 'filemtime']), + new TwigFunction('filesize', [$this, 'filesize']), + new TwigFunction('filetype', [$this, 'filetype']), + new TwigFunction('is_dir', [$this, 'is_dir']), + new TwigFunction('is_file', [$this, 'is_file']), + new TwigFunction('is_link', [$this, 'is_link']), + new TwigFunction('is_readable', [$this, 'is_readable']), + new TwigFunction('is_writable', [$this, 'is_writable']), + new TwigFunction('is_writeable', [$this, 'is_writable']), + new TwigFunction('lstat', [$this, 'lstat']), + new TwigFunction('getimagesize', [$this, 'getimagesize']), + new TwigFunction('exif_read_data', [$this, 'exif_read_data']), + new TwigFunction('read_exif_data', [$this, 'exif_read_data']), + new TwigFunction('exif_imagetype', [$this, 'exif_imagetype']), + new TwigFunction('hash_file', [$this, 'hash_file']), + new TwigFunction('hash_hmac_file', [$this, 'hash_hmac_file']), + new TwigFunction('md5_file', [$this, 'md5_file']), + new TwigFunction('sha1_file', [$this, 'sha1_file']), + new TwigFunction('get_meta_tags', [$this, 'get_meta_tags']), + ]; + } + + /** + * @param string $filename + * @return bool + */ + public function file_exists($filename): bool + { + if (!$this->checkFilename($filename)) { + return false; + } + + return file_exists($filename); + } + + /** + * @param string $filename + * @return int|false + */ + public function fileatime($filename) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return fileatime($filename); + } + + /** + * @param string $filename + * @return int|false + */ + public function filectime($filename) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return filectime($filename); + } + + /** + * @param string $filename + * @return int|false + */ + public function filemtime($filename) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return filemtime($filename); + } + + /** + * @param string $filename + * @return int|false + */ + public function filesize($filename) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return filesize($filename); + } + + /** + * @param string $filename + * @return string|false + */ + public function filetype($filename) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return filetype($filename); + } + + /** + * @param string $filename + * @return bool + */ + public function is_dir($filename): bool + { + if (!$this->checkFilename($filename)) { + return false; + } + + return is_dir($filename); + } + + /** + * @param string $filename + * @return bool + */ + public function is_file($filename): bool + { + if (!$this->checkFilename($filename)) { + return false; + } + + return is_file($filename); + } + + /** + * @param string $filename + * @return bool + */ + public function is_link($filename): bool + { + if (!$this->checkFilename($filename)) { + return false; + } + + return is_link($filename); + } + + /** + * @param string $filename + * @return bool + */ + public function is_readable($filename): bool + { + if (!$this->checkFilename($filename)) { + return false; + } + + return is_readable($filename); + } + + /** + * @param string $filename + * @return bool + */ + public function is_writable($filename): bool + { + if (!$this->checkFilename($filename)) { + return false; + } + + return is_writable($filename); + } + + /** + * @param string $filename + * @return array|false + */ + public function lstat($filename) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return lstat($filename); + } + + /** + * @param string $filename + * @return array|false + */ + public function getimagesize($filename) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return getimagesize($filename); + } + + /** + * @param string $file + * @param string|null $required_sections + * @param bool $as_arrays + * @param bool $read_thumbnail + * @return array|false + */ + public function exif_read_data($file, ?string $required_sections, bool $as_arrays = false, bool $read_thumbnail = false) + { + if (!Utils::functionExists('exif_read_data') || !$this->checkFilename($file)) { + return false; + } + + return exif_read_data($file, $required_sections, $as_arrays, $read_thumbnail); + } + + /** + * @param string $filename + * @return string|false + */ + public function exif_imagetype($filename) + { + if (!Utils::functionExists('exif_imagetype') || !$this->checkFilename($filename)) { + return false; + } + + return @exif_imagetype($filename); + } + + /** + * @param string $algo + * @param string $filename + * @param bool $binary + * @return string|false + */ + public function hash_file(string $algo, string $filename, bool $binary = false) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return hash_file($algo, $filename, $binary); + } + + /** + * @param string $algo + * @param string $data + * @param string $key + * @param bool $binary + * @return string|false + */ + public function hash_hmac_file(string $algo, string $data, string $key, bool $binary = false) + { + if (!$this->checkFilename($data)) { + return false; + } + + return hash_hmac_file($algo, $data, $key, $binary); + } + + /** + * @param string $filename + * @param bool $binary + * @return string|false + */ + public function md5_file($filename, bool $binary = false) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return md5_file($filename, $binary); + } + + /** + * @param string $filename + * @param bool $binary + * @return string|false + */ + public function sha1_file($filename, bool $binary = false) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return sha1_file($filename, $binary); + } + + /** + * @param string $filename + * @return array|false + */ + public function get_meta_tags($filename) + { + if (!$this->checkFilename($filename)) { + return false; + } + + return get_meta_tags($filename); + } + + /** + * @param string $filename + * @return bool + */ + private function checkFilename($filename): bool + { + return is_string($filename) && (!str_contains($filename, '://') || $this->locator->isStream($filename)); + } +} diff --git a/system/src/Grav/Common/Twig/Extension/GravExtension.php b/system/src/Grav/Common/Twig/Extension/GravExtension.php new file mode 100644 index 0000000..d076973 --- /dev/null +++ b/system/src/Grav/Common/Twig/Extension/GravExtension.php @@ -0,0 +1,1597 @@ +grav = Grav::instance(); + $this->debugger = $this->grav['debugger'] ?? null; + $this->config = $this->grav['config']; + } + + /** + * Register some standard globals + * + * @return array + */ + public function getGlobals() + { + return [ + 'grav' => $this->grav, + ]; + } + + /** + * Return a list of all filters. + * + * @return array + */ + public function getFilters() + { + return [ + new TwigFilter('*ize', [$this, 'inflectorFilter']), + new TwigFilter('absolute_url', [$this, 'absoluteUrlFilter']), + new TwigFilter('contains', [$this, 'containsFilter']), + new TwigFilter('chunk_split', [$this, 'chunkSplitFilter']), + new TwigFilter('nicenumber', [$this, 'niceNumberFunc']), + new TwigFilter('nicefilesize', [$this, 'niceFilesizeFunc']), + new TwigFilter('nicetime', [$this, 'nicetimeFunc']), + new TwigFilter('defined', [$this, 'definedDefaultFilter']), + new TwigFilter('ends_with', [$this, 'endsWithFilter']), + new TwigFilter('fieldName', [$this, 'fieldNameFilter']), + new TwigFilter('ksort', [$this, 'ksortFilter']), + new TwigFilter('ltrim', [$this, 'ltrimFilter']), + new TwigFilter('markdown', [$this, 'markdownFunction'], ['needs_context' => true, 'is_safe' => ['html']]), + new TwigFilter('md5', [$this, 'md5Filter']), + new TwigFilter('base32_encode', [$this, 'base32EncodeFilter']), + new TwigFilter('base32_decode', [$this, 'base32DecodeFilter']), + new TwigFilter('base64_encode', [$this, 'base64EncodeFilter']), + new TwigFilter('base64_decode', [$this, 'base64DecodeFilter']), + new TwigFilter('randomize', [$this, 'randomizeFilter']), + new TwigFilter('modulus', [$this, 'modulusFilter']), + new TwigFilter('rtrim', [$this, 'rtrimFilter']), + new TwigFilter('pad', [$this, 'padFilter']), + new TwigFilter('regex_replace', [$this, 'regexReplace']), + new TwigFilter('safe_email', [$this, 'safeEmailFilter'], ['is_safe' => ['html']]), + new TwigFilter('safe_truncate', [Utils::class, 'safeTruncate']), + new TwigFilter('safe_truncate_html', [Utils::class, 'safeTruncateHTML']), + new TwigFilter('sort_by_key', [$this, 'sortByKeyFilter']), + new TwigFilter('starts_with', [$this, 'startsWithFilter']), + new TwigFilter('truncate', [Utils::class, 'truncate']), + new TwigFilter('truncate_html', [Utils::class, 'truncateHTML']), + new TwigFilter('json_decode', [$this, 'jsonDecodeFilter']), + new TwigFilter('array_unique', 'array_unique'), + new TwigFilter('basename', 'basename'), + new TwigFilter('dirname', 'dirname'), + new TwigFilter('print_r', [$this, 'print_r']), + new TwigFilter('yaml_encode', [$this, 'yamlEncodeFilter']), + new TwigFilter('yaml_decode', [$this, 'yamlDecodeFilter']), + new TwigFilter('nicecron', [$this, 'niceCronFilter']), + + // Translations + new TwigFilter('t', [$this, 'translate'], ['needs_environment' => true]), + new TwigFilter('tl', [$this, 'translateLanguage']), + new TwigFilter('ta', [$this, 'translateArray']), + + // Casting values + new TwigFilter('string', [$this, 'stringFilter']), + new TwigFilter('int', [$this, 'intFilter'], ['is_safe' => ['all']]), + new TwigFilter('bool', [$this, 'boolFilter']), + new TwigFilter('float', [$this, 'floatFilter'], ['is_safe' => ['all']]), + new TwigFilter('array', [$this, 'arrayFilter']), + + // Object Types + new TwigFilter('get_type', [$this, 'getTypeFunc']), + new TwigFilter('of_type', [$this, 'ofTypeFunc']) + ]; + } + + /** + * Return a list of all functions. + * + * @return array + */ + public function getFunctions() + { + return [ + new TwigFunction('array', [$this, 'arrayFilter']), + new TwigFunction('array_key_value', [$this, 'arrayKeyValueFunc']), + new TwigFunction('array_key_exists', 'array_key_exists'), + new TwigFunction('array_unique', 'array_unique'), + new TwigFunction('array_intersect', [$this, 'arrayIntersectFunc']), + new TwigFunction('array_diff', 'array_diff'), + new TwigFunction('authorize', [$this, 'authorize']), + new TwigFunction('debug', [$this, 'dump'], ['needs_context' => true, 'needs_environment' => true]), + new TwigFunction('dump', [$this, 'dump'], ['needs_context' => true, 'needs_environment' => true]), + new TwigFunction('vardump', [$this, 'vardumpFunc']), + new TwigFunction('print_r', [$this, 'print_r']), + new TwigFunction('http_response_code', 'http_response_code'), + new TwigFunction('evaluate', [$this, 'evaluateStringFunc'], ['needs_context' => true]), + new TwigFunction('evaluate_twig', [$this, 'evaluateTwigFunc'], ['needs_context' => true]), + new TwigFunction('gist', [$this, 'gistFunc']), + new TwigFunction('nonce_field', [$this, 'nonceFieldFunc']), + new TwigFunction('pathinfo', 'pathinfo'), + new TwigFunction('random_string', [$this, 'randomStringFunc']), + new TwigFunction('repeat', [$this, 'repeatFunc']), + new TwigFunction('regex_replace', [$this, 'regexReplace']), + new TwigFunction('regex_filter', [$this, 'regexFilter']), + new TwigFunction('regex_match', [$this, 'regexMatch']), + new TwigFunction('regex_split', [$this, 'regexSplit']), + new TwigFunction('string', [$this, 'stringFilter']), + new TwigFunction('url', [$this, 'urlFunc']), + new TwigFunction('json_decode', [$this, 'jsonDecodeFilter']), + new TwigFunction('get_cookie', [$this, 'getCookie']), + new TwigFunction('redirect_me', [$this, 'redirectFunc']), + new TwigFunction('range', [$this, 'rangeFunc']), + new TwigFunction('isajaxrequest', [$this, 'isAjaxFunc']), + new TwigFunction('exif', [$this, 'exifFunc']), + new TwigFunction('media_directory', [$this, 'mediaDirFunc']), + new TwigFunction('body_class', [$this, 'bodyClassFunc'], ['needs_context' => true]), + new TwigFunction('theme_var', [$this, 'themeVarFunc'], ['needs_context' => true]), + new TwigFunction('header_var', [$this, 'pageHeaderVarFunc'], ['needs_context' => true]), + new TwigFunction('read_file', [$this, 'readFileFunc']), + new TwigFunction('nicenumber', [$this, 'niceNumberFunc']), + new TwigFunction('nicefilesize', [$this, 'niceFilesizeFunc']), + new TwigFunction('nicetime', [$this, 'nicetimeFunc']), + new TwigFunction('cron', [$this, 'cronFunc']), + new TwigFunction('svg_image', [$this, 'svgImageFunction']), + new TwigFunction('xss', [$this, 'xssFunc']), + + // Translations + new TwigFunction('t', [$this, 'translate'], ['needs_environment' => true]), + new TwigFunction('tl', [$this, 'translateLanguage']), + new TwigFunction('ta', [$this, 'translateArray']), + + // Object Types + new TwigFunction('get_type', [$this, 'getTypeFunc']), + new TwigFunction('of_type', [$this, 'ofTypeFunc']) + ]; + } + + /** + * @return array + */ + public function getTokenParsers() + { + return [ + new TwigTokenParserRender(), + new TwigTokenParserThrow(), + new TwigTokenParserTryCatch(), + new TwigTokenParserScript(), + new TwigTokenParserStyle(), + new TwigTokenParserMarkdown(), + new TwigTokenParserSwitch(), + new TwigTokenParserCache(), + ]; + } + + public function print_r($var) + { + return print_r($var, true); + } + + /** + * Filters field name by changing dot notation into array notation. + * + * @param string $str + * @return string + */ + public function fieldNameFilter($str) + { + $path = explode('.', rtrim($str, '.')); + + return array_shift($path) . ($path ? '[' . implode('][', $path) . ']' : ''); + } + + /** + * Protects email address. + * + * @param string $str + * @return string + */ + public function safeEmailFilter($str) + { + static $list = [ + '"' => '"', + "'" => ''', + '&' => '&', + '<' => '<', + '>' => '>', + '@' => '@' + ]; + + $characters = mb_str_split($str, 1, 'UTF-8'); + + $encoded = ''; + foreach ($characters as $chr) { + $encoded .= $list[$chr] ?? (random_int(0, 1) ? '&#' . mb_ord($chr) . ';' : $chr); + } + + return $encoded; + } + + /** + * Returns array in a random order. + * + * @param array|Traversable $original + * @param int $offset Can be used to return only slice of the array. + * @return array + */ + public function randomizeFilter($original, $offset = 0) + { + if ($original instanceof Traversable) { + $original = iterator_to_array($original, false); + } + + if (!is_array($original)) { + return $original; + } + + $sorted = []; + $random = array_slice($original, $offset); + shuffle($random); + + $sizeOf = count($original); + for ($x = 0; $x < $sizeOf; $x++) { + if ($x < $offset) { + $sorted[] = $original[$x]; + } else { + $sorted[] = array_shift($random); + } + } + + return $sorted; + } + + /** + * Returns the modulus of an integer + * + * @param string|int $number + * @param int $divider + * @param array|null $items array of items to select from to return + * @return int + */ + public function modulusFilter($number, $divider, $items = null) + { + if (is_string($number)) { + $number = strlen($number); + } + + $remainder = $number % $divider; + + if (is_array($items)) { + return $items[$remainder] ?? $items[0]; + } + + return $remainder; + } + + /** + * Inflector supports following notations: + * + * `{{ 'person'|pluralize }} => people` + * `{{ 'shoes'|singularize }} => shoe` + * `{{ 'welcome page'|titleize }} => "Welcome Page"` + * `{{ 'send_email'|camelize }} => SendEmail` + * `{{ 'CamelCased'|underscorize }} => camel_cased` + * `{{ 'Something Text'|hyphenize }} => something-text` + * `{{ 'something_text_to_read'|humanize }} => "Something text to read"` + * `{{ '181'|monthize }} => 5` + * `{{ '10'|ordinalize }} => 10th` + * + * @param string $action + * @param string $data + * @param int|null $count + * @return string + */ + public function inflectorFilter($action, $data, $count = null) + { + $action .= 'ize'; + + /** @var Inflector $inflector */ + $inflector = $this->grav['inflector']; + + if (in_array( + $action, + ['titleize', 'camelize', 'underscorize', 'hyphenize', 'humanize', 'ordinalize', 'monthize'], + true + )) { + return $inflector->{$action}($data); + } + + if (in_array($action, ['pluralize', 'singularize'], true)) { + return $count ? $inflector->{$action}($data, $count) : $inflector->{$action}($data); + } + + return $data; + } + + /** + * Return MD5 hash from the input. + * + * @param string $str + * @return string + */ + public function md5Filter($str) + { + return md5($str); + } + + /** + * Return Base32 encoded string + * + * @param string $str + * @return string + */ + public function base32EncodeFilter($str) + { + return Base32::encode($str); + } + + /** + * Return Base32 decoded string + * + * @param string $str + * @return string + */ + public function base32DecodeFilter($str) + { + return Base32::decode($str); + } + + /** + * Return Base64 encoded string + * + * @param string $str + * @return string + */ + public function base64EncodeFilter($str) + { + return base64_encode($str); + } + + /** + * Return Base64 decoded string + * + * @param string $str + * @return string|false + */ + public function base64DecodeFilter($str) + { + return base64_decode($str); + } + + /** + * Sorts a collection by key + * + * @param array $input + * @param string $filter + * @param int $direction + * @param int $sort_flags + * @return array + */ + public function sortByKeyFilter($input, $filter, $direction = SORT_ASC, $sort_flags = SORT_REGULAR) + { + return Utils::sortArrayByKey($input, $filter, $direction, $sort_flags); + } + + /** + * Return ksorted collection. + * + * @param array|null $array + * @return array + */ + public function ksortFilter($array) + { + if (null === $array) { + $array = []; + } + ksort($array); + + return $array; + } + + /** + * Wrapper for chunk_split() function + * + * @param string $value + * @param int $chars + * @param string $split + * @return string + */ + public function chunkSplitFilter($value, $chars, $split = '-') + { + return chunk_split($value, $chars, $split); + } + + /** + * determine if a string contains another + * + * @param string $haystack + * @param string $needle + * @return string|bool + * @todo returning $haystack here doesn't make much sense + */ + public function containsFilter($haystack, $needle) + { + if (empty($needle)) { + return $haystack; + } + + return (strpos($haystack, (string) $needle) !== false); + } + + /** + * Gets a human readable output for cron syntax + * + * @param string $at + * @return string + */ + public function niceCronFilter($at) + { + $cron = new Cron($at); + return $cron->getText('en'); + } + + /** + * Get Cron object for a crontab 'at' format + * + * @param string $at + * @return CronExpression + */ + public function cronFunc($at) + { + return CronExpression::factory($at); + } + + /** + * displays a facebook style 'time ago' formatted date/time + * + * @param string $date + * @param bool $long_strings + * @param bool $show_tense + * @return string + */ + public function nicetimeFunc($date, $long_strings = true, $show_tense = true) + { + if (empty($date)) { + return $this->grav['language']->translate('GRAV.NICETIME.NO_DATE_PROVIDED'); + } + + if ($long_strings) { + $periods = [ + 'NICETIME.SECOND', + 'NICETIME.MINUTE', + 'NICETIME.HOUR', + 'NICETIME.DAY', + 'NICETIME.WEEK', + 'NICETIME.MONTH', + 'NICETIME.YEAR', + 'NICETIME.DECADE' + ]; + } else { + $periods = [ + 'NICETIME.SEC', + 'NICETIME.MIN', + 'NICETIME.HR', + 'NICETIME.DAY', + 'NICETIME.WK', + 'NICETIME.MO', + 'NICETIME.YR', + 'NICETIME.DEC' + ]; + } + + $lengths = ['60', '60', '24', '7', '4.35', '12', '10']; + + $now = time(); + + // check if unix timestamp + if ((string)(int)$date === (string)$date) { + $unix_date = $date; + } else { + $unix_date = strtotime($date); + } + + // check validity of date + if (empty($unix_date)) { + return $this->grav['language']->translate('GRAV.NICETIME.BAD_DATE'); + } + + // is it future date or past date + if ($now > $unix_date) { + $difference = $now - $unix_date; + $tense = $this->grav['language']->translate('GRAV.NICETIME.AGO'); + } elseif ($now == $unix_date) { + $difference = $now - $unix_date; + $tense = $this->grav['language']->translate('GRAV.NICETIME.JUST_NOW'); + } else { + $difference = $unix_date - $now; + $tense = $this->grav['language']->translate('GRAV.NICETIME.FROM_NOW'); + } + + for ($j = 0; $difference >= $lengths[$j] && $j < count($lengths) - 1; $j++) { + $difference /= $lengths[$j]; + } + + $difference = round($difference); + + if ($difference != 1) { + $periods[$j] .= '_PLURAL'; + } + + if ($this->grav['language']->getTranslation( + $this->grav['language']->getLanguage(), + $periods[$j] . '_MORE_THAN_TWO' + ) + ) { + if ($difference > 2) { + $periods[$j] .= '_MORE_THAN_TWO'; + } + } + + $periods[$j] = $this->grav['language']->translate('GRAV.'.$periods[$j]); + + if ($now == $unix_date) { + return $tense; + } + + $time = "{$difference} {$periods[$j]}"; + $time .= $show_tense ? " {$tense}" : ''; + + return $time; + } + + /** + * Allow quick check of a string for XSS Vulnerabilities + * + * @param string|array $data + * @return bool|string|array + */ + public function xssFunc($data) + { + if (!is_array($data)) { + return Security::detectXss($data); + } + + $results = Security::detectXssFromArray($data); + $results_parts = array_map(static function ($value, $key) { + return $key.': \''.$value . '\''; + }, array_values($results), array_keys($results)); + + return implode(', ', $results_parts); + } + + /** + * @param string $string + * @return string + */ + public function absoluteUrlFilter($string) + { + $url = $this->grav['uri']->base(); + $string = preg_replace('/((?:href|src) *= *[\'"](?!(http|ftp)))/i', "$1$url", $string); + + return $string; + } + + /** + * @param array $context + * @param string $string + * @param bool $block Block or Line processing + * @return string + */ + public function markdownFunction($context, $string, $block = true) + { + $page = $context['page'] ?? null; + return Utils::processMarkdown($string, $block, $page); + } + + /** + * @param string $haystack + * @param string $needle + * @return bool + */ + public function startsWithFilter($haystack, $needle) + { + return Utils::startsWith($haystack, $needle); + } + + /** + * @param string $haystack + * @param string $needle + * @return bool + */ + public function endsWithFilter($haystack, $needle) + { + return Utils::endsWith($haystack, $needle); + } + + /** + * @param mixed $value + * @param null $default + * @return mixed|null + */ + public function definedDefaultFilter($value, $default = null) + { + return $value ?? $default; + } + + /** + * @param string $value + * @param string|null $chars + * @return string + */ + public function rtrimFilter($value, $chars = null) + { + return null !== $chars ? rtrim($value, $chars) : rtrim($value); + } + + /** + * @param string $value + * @param string|null $chars + * @return string + */ + public function ltrimFilter($value, $chars = null) + { + return null !== $chars ? ltrim($value, $chars) : ltrim($value); + } + + /** + * Returns a string from a value. If the value is array, return it json encoded + * + * @param mixed $value + * @return string + */ + public function stringFilter($value) + { + // Format the array as a string + if (is_array($value)) { + return json_encode($value); + } + + // Boolean becomes '1' or '0' + if (is_bool($value)) { + $value = (int)$value; + } + + // Cast the other values to string. + return (string)$value; + } + + /** + * Casts input to int. + * + * @param mixed $input + * @return int + */ + public function intFilter($input) + { + return (int) $input; + } + + /** + * Casts input to bool. + * + * @param mixed $input + * @return bool + */ + public function boolFilter($input) + { + return (bool) $input; + } + + /** + * Casts input to float. + * + * @param mixed $input + * @return float + */ + public function floatFilter($input) + { + return (float) $input; + } + + /** + * Casts input to array. + * + * @param mixed $input + * @return array + */ + public function arrayFilter($input) + { + if (is_array($input)) { + return $input; + } + + if (is_object($input)) { + if (method_exists($input, 'toArray')) { + return $input->toArray(); + } + + if ($input instanceof Iterator) { + return iterator_to_array($input); + } + } + + return (array)$input; + } + + /** + * @param Environment $twig + * @return string + */ + public function translate(Environment $twig) + { + // shift off the environment + $args = func_get_args(); + array_shift($args); + + // If admin and tu filter provided, use it + if (isset($this->grav['admin'])) { + $numargs = count($args); + $lang = null; + + if (($numargs === 3 && is_array($args[1])) || ($numargs === 2 && !is_array($args[1]))) { + $lang = array_pop($args); + } elseif ($numargs === 2 && is_array($args[1])) { + $subs = array_pop($args); + $args = array_merge($args, $subs); + } + + return $this->grav['admin']->translate($args, $lang); + } + + // else use the default grav translate functionality + return $this->grav['language']->translate($args); + } + + /** + * Translate Strings + * + * @param string|array $args + * @param array|null $languages + * @param bool $array_support + * @param bool $html_out + * @return string + */ + public function translateLanguage($args, array $languages = null, $array_support = false, $html_out = false) + { + /** @var Language $language */ + $language = $this->grav['language']; + + return $language->translate($args, $languages, $array_support, $html_out); + } + + /** + * @param string $key + * @param string $index + * @param array|null $lang + * @return string + */ + public function translateArray($key, $index, $lang = null) + { + /** @var Language $language */ + $language = $this->grav['language']; + + return $language->translateArray($key, $index, $lang); + } + + /** + * Repeat given string x times. + * + * @param string $input + * @param int $multiplier + * + * @return string + */ + public function repeatFunc($input, $multiplier) + { + return str_repeat($input, $multiplier); + } + + /** + * Return URL to the resource. + * + * @example {{ url('theme://images/logo.png')|default('http://www.placehold.it/150x100/f4f4f4') }} + * + * @param string $input Resource to be located. + * @param bool $domain True to include domain name. + * @param bool $failGracefully If true, return URL even if the file does not exist. + * @return string|false Returns url to the resource or null if resource was not found. + */ + public function urlFunc($input, $domain = false, $failGracefully = false) + { + return Utils::url($input, $domain, $failGracefully); + } + + /** + * This function will evaluate Twig $twig through the $environment, and return its results. + * + * @param array $context + * @param string $twig + * @return mixed + */ + public function evaluateTwigFunc($context, $twig) + { + + $loader = new FilesystemLoader('.'); + $env = new Environment($loader); + $env->addExtension($this); + + $template = $env->createTemplate($twig); + + return $template->render($context); + } + + /** + * This function will evaluate a $string through the $environment, and return its results. + * + * @param array $context + * @param string $string + * @return mixed + */ + public function evaluateStringFunc($context, $string) + { + return $this->evaluateTwigFunc($context, "{{ $string }}"); + } + + /** + * Based on Twig\Extension\Debug / twig_var_dump + * (c) 2011 Fabien Potencier + * + * @param Environment $env + * @param array $context + */ + public function dump(Environment $env, $context) + { + if (!$env->isDebug() || !$this->debugger) { + return; + } + + $count = func_num_args(); + if (2 === $count) { + $data = []; + foreach ($context as $key => $value) { + if (is_object($value)) { + if (method_exists($value, 'toArray')) { + $data[$key] = $value->toArray(); + } else { + $data[$key] = 'Object (' . get_class($value) . ')'; + } + } else { + $data[$key] = $value; + } + } + $this->debugger->addMessage($data, 'debug'); + } else { + for ($i = 2; $i < $count; $i++) { + $var = func_get_arg($i); + $this->debugger->addMessage($var, 'debug'); + } + } + } + + /** + * Output a Gist + * + * @param string $id + * @param string|false $file + * @return string + */ + public function gistFunc($id, $file = false) + { + $url = 'https://gist.github.com/' . $id . '.js'; + if ($file) { + $url .= '?file=' . $file; + } + return ''; + } + + /** + * Generate a random string + * + * @param int $count + * @return string + */ + public function randomStringFunc($count = 5) + { + return Utils::generateRandomString($count); + } + + /** + * Pad a string to a certain length with another string + * + * @param string $input + * @param int $pad_length + * @param string $pad_string + * @param int $pad_type + * @return string + */ + public static function padFilter($input, $pad_length, $pad_string = ' ', $pad_type = STR_PAD_RIGHT) + { + return str_pad($input, (int)$pad_length, $pad_string, $pad_type); + } + + /** + * Workaround for twig associative array initialization + * Returns a key => val array + * + * @param string $key key of item + * @param string $val value of item + * @param array|null $current_array optional array to add to + * @return array + */ + public function arrayKeyValueFunc($key, $val, $current_array = null) + { + if (empty($current_array)) { + return array($key => $val); + } + + $current_array[$key] = $val; + + return $current_array; + } + + /** + * Wrapper for array_intersect() method + * + * @param array|Collection $array1 + * @param array|Collection $array2 + * @return array|Collection + */ + public function arrayIntersectFunc($array1, $array2) + { + if ($array1 instanceof Collection && $array2 instanceof Collection) { + return $array1->intersect($array2)->toArray(); + } + + return array_intersect($array1, $array2); + } + + /** + * Translate a string + * + * @return string + */ + public function translateFunc() + { + return $this->grav['language']->translate(func_get_args()); + } + + /** + * Authorize an action. Returns true if the user is logged in and + * has the right to execute $action. + * + * @param string|array $action An action or a list of actions. Each + * entry can be a string like 'group.action' + * or without dot notation an associative + * array. + * @return bool Returns TRUE if the user is authorized to + * perform the action, FALSE otherwise. + */ + public function authorize($action) + { + // Admin can use Flex users even if the site does not; make sure we use the right version of the user. + $admin = $this->grav['admin'] ?? null; + if ($admin) { + $user = $admin->user; + } else { + /** @var UserInterface|null $user */ + $user = $this->grav['user'] ?? null; + } + + if (!$user) { + return false; + } + + if (is_array($action)) { + if (Utils::isAssoc($action)) { + // Handle nested access structure. + $actions = Utils::arrayFlattenDotNotation($action); + } else { + // Handle simple access list. + $actions = array_combine($action, array_fill(0, count($action), true)); + } + } else { + // Handle single action. + $actions = [(string)$action => true]; + } + + $count = count($actions); + foreach ($actions as $act => $authenticated) { + // Ignore 'admin.super' if it's not the only value to be checked. + if ($act === 'admin.super' && $count > 1 && $user instanceof FlexObjectInterface) { + continue; + } + + $auth = $user->authorize($act) ?? false; + if (is_bool($auth) && $auth === Utils::isPositive($authenticated)) { + return true; + } + } + + return false; + } + + /** + * Used to add a nonce to a form. Call {{ nonce_field('action') }} specifying a string representing the action. + * + * For maximum protection, ensure that the string representing the action is as specific as possible + * + * @param string $action the action + * @param string $nonceParamName a custom nonce param name + * @return string the nonce input field + */ + public function nonceFieldFunc($action, $nonceParamName = 'nonce') + { + $string = ''; + + return $string; + } + + /** + * Decodes string from JSON. + * + * @param string $str + * @param bool $assoc + * @param int $depth + * @param int $options + * @return array + */ + public function jsonDecodeFilter($str, $assoc = false, $depth = 512, $options = 0) + { + return json_decode(html_entity_decode($str, ENT_COMPAT | ENT_HTML401, 'UTF-8'), $assoc, $depth, $options); + } + + /** + * Used to retrieve a cookie value + * + * @param string $key The cookie name to retrieve + * @return string + */ + public function getCookie($key) + { + return filter_input(INPUT_COOKIE, $key, FILTER_SANITIZE_STRING); + } + + /** + * Twig wrapper for PHP's preg_replace method + * + * @param string|string[] $subject the content to perform the replacement on + * @param string|string[] $pattern the regex pattern to use for matches + * @param string|string[] $replace the replacement value either as a string or an array of replacements + * @param int $limit the maximum possible replacements for each pattern in each subject + * @return string|string[]|null the resulting content + */ + public function regexReplace($subject, $pattern, $replace, $limit = -1) + { + return preg_replace($pattern, $replace, $subject, $limit); + } + + /** + * Twig wrapper for PHP's preg_grep method + * + * @param array $array + * @param string $regex + * @param int $flags + * @return array + */ + public function regexFilter($array, $regex, $flags = 0) + { + return preg_grep($regex, $array, $flags); + } + + /** + * Twig wrapper for PHP's preg_match method + * + * @param string $subject the content to perform the match on + * @param string $pattern the regex pattern to use for match + * @param int $flags + * @param int $offset + * @return array|false returns the matches if there is at least one match in the subject for a given pattern or null if not. + */ + public function regexMatch($subject, $pattern, $flags = 0, $offset = 0) + { + if (preg_match($pattern, $subject, $matches, $flags, $offset) === false) { + return false; + } + + return $matches; + } + + /** + * Twig wrapper for PHP's preg_split method + * + * @param string $subject the content to perform the split on + * @param string $pattern the regex pattern to use for split + * @param int $limit the maximum possible splits for the given pattern + * @param int $flags + * @return array|false the resulting array after performing the split operation + */ + public function regexSplit($subject, $pattern, $limit = -1, $flags = 0) + { + return preg_split($pattern, $subject, $limit, $flags); + } + + /** + * redirect browser from twig + * + * @param string $url the url to redirect to + * @param int $statusCode statusCode, default 303 + * @return void + */ + public function redirectFunc($url, $statusCode = 303) + { + $response = new Response($statusCode, ['location' => $url]); + + $this->grav->close($response); + } + + /** + * Generates an array containing a range of elements, optionally stepped + * + * @param int $start Minimum number, default 0 + * @param int $end Maximum number, default `getrandmax()` + * @param int $step Increment between elements in the sequence, default 1 + * @return array + */ + public function rangeFunc($start = 0, $end = 100, $step = 1) + { + return range($start, $end, $step); + } + + /** + * Check if HTTP_X_REQUESTED_WITH has been set to xmlhttprequest, + * in which case we may unsafely assume ajax. Non critical use only. + * + * @return bool True if HTTP_X_REQUESTED_WITH exists and has been set to xmlhttprequest + */ + public function isAjaxFunc() + { + return ( + !empty($_SERVER['HTTP_X_REQUESTED_WITH']) + && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); + } + + /** + * Get the Exif data for a file + * + * @param string $image + * @param bool $raw + * @return mixed + */ + public function exifFunc($image, $raw = false) + { + if (isset($this->grav['exif'])) { + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + if ($locator->isStream($image)) { + $image = $locator->findResource($image); + } + + $exif_reader = $this->grav['exif']->getReader(); + + if ($image && file_exists($image) && $this->config->get('system.media.auto_metadata_exif') && $exif_reader) { + $exif_data = $exif_reader->read($image); + + if ($exif_data) { + if ($raw) { + return $exif_data->getRawData(); + } + + return $exif_data->getData(); + } + } + } + + return null; + } + + /** + * Simple function to read a file based on a filepath and output it + * + * @param string $filepath + * @return bool|string + */ + public function readFileFunc($filepath) + { + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + if ($locator->isStream($filepath)) { + $filepath = $locator->findResource($filepath); + } + + if ($filepath && file_exists($filepath)) { + return file_get_contents($filepath); + } + + return false; + } + + /** + * Process a folder as Media and return a media object + * + * @param string $media_dir + * @return Media|null + */ + public function mediaDirFunc($media_dir) + { + /** @var UniformResourceLocator $locator */ + $locator = $this->grav['locator']; + + if ($locator->isStream($media_dir)) { + $media_dir = $locator->findResource($media_dir); + } + + if ($media_dir && file_exists($media_dir)) { + return new Media($media_dir); + } + + return null; + } + + /** + * Dump a variable to the browser + * + * @param mixed $var + * @return void + */ + public function vardumpFunc($var) + { + var_dump($var); + } + + /** + * Returns a nicer more readable filesize based on bytes + * + * @param int $bytes + * @return string + */ + public function niceFilesizeFunc($bytes) + { + return Utils::prettySize($bytes); + } + + /** + * Returns a nicer more readable number + * + * @param int|float|string $n + * @return string|bool + */ + public function niceNumberFunc($n) + { + if (!is_float($n) && !is_int($n)) { + if (!is_string($n) || $n === '') { + return false; + } + + // Strip any thousand formatting and find the first number. + $list = array_filter(preg_split("/\D+/", str_replace(',', '', $n))); + $n = reset($list); + + if (!is_numeric($n)) { + return false; + } + + $n = (float)$n; + } + + // now filter it; + if ($n > 1000000000000) { + return round($n/1000000000000, 2).' t'; + } + if ($n > 1000000000) { + return round($n/1000000000, 2).' b'; + } + if ($n > 1000000) { + return round($n/1000000, 2).' m'; + } + if ($n > 1000) { + return round($n/1000, 2).' k'; + } + + return number_format($n); + } + + /** + * Get a theme variable + * Will try to get the variable for the current page, if not found, it tries it's parent page on up to root. + * If still not found, will use the theme's configuration value, + * If still not found, will use the $default value passed in + * + * @param array $context Twig Context + * @param string $var variable to be found (using dot notation) + * @param null $default the default value to be used as last resort + * @param null $page an optional page to use for the current page + * @param bool $exists toggle to simply return the page where the variable is set, else null + * @return mixed + */ + public function themeVarFunc($context, $var, $default = null, $page = null, $exists = false) + { + $page = $page ?? $context['page'] ?? Grav::instance()['page'] ?? null; + + // Try to find var in the page headers + if ($page instanceof PageInterface && $page->exists()) { + // Loop over pages and look for header vars + while ($page && !$page->root()) { + $header = new Data((array)$page->header()); + $value = $header->get($var); + if (isset($value)) { + if ($exists) { + return $page; + } + + return $value; + } + $page = $page->parent(); + } + } + + if ($exists) { + return false; + } + + return Grav::instance()['config']->get('theme.' . $var, $default); + } + + /** + * Look for a page header variable in an array of pages working its way through until a value is found + * + * @param array $context + * @param string $var the variable to look for in the page header + * @param string|string[]|null $pages array of pages to check (current page upwards if not null) + * @return mixed + * @deprecated 1.7 Use themeVarFunc() instead + */ + public function pageHeaderVarFunc($context, $var, $pages = null) + { + if (is_array($pages)) { + $page = array_shift($pages); + } else { + $page = null; + } + return $this->themeVarFunc($context, $var, null, $page); + } + + /** + * takes an array of classes, and if they are not set on body_classes + * look to see if they are set in theme config + * + * @param array $context + * @param string|string[] $classes + * @return string + */ + public function bodyClassFunc($context, $classes) + { + + $header = $context['page']->header(); + $body_classes = $header->body_classes ?? ''; + + foreach ((array)$classes as $class) { + if (!empty($body_classes) && Utils::contains($body_classes, $class)) { + continue; + } + + $val = $this->config->get('theme.' . $class, false) ? $class : false; + $body_classes .= $val ? ' ' . $val : ''; + } + + return $body_classes; + } + + /** + * Returns the content of an SVG image and adds extra classes as needed + * + * @param string $path + * @param string|null $classes + * @return string|string[]|null + */ + public static function svgImageFunction($path, $classes = null, $strip_style = false) + { + $path = Utils::fullPath($path); + + $classes = $classes ?: ''; + + if (file_exists($path) && !is_dir($path)) { + $svg = file_get_contents($path); + $classes = " inline-block $classes"; + $matched = false; + + //Remove xml tag if it exists + $svg = preg_replace('/^<\?xml.*\?>/','', $svg); + + //Strip style if needed + if ($strip_style) { + $svg = preg_replace('//s', '', $svg); + } + + //Look for existing class + $svg = preg_replace_callback('/^]*(class=\")([^"]*)(\")[^>]*>/', function($matches) use ($classes, &$matched) { + if (isset($matches[2])) { + $new_classes = $matches[2] . $classes; + $matched = true; + return str_replace($matches[1], "class=\"$new_classes\"", $matches[0]); + } + return $matches[0]; + }, $svg + ); + + // no matches found just add the class + if (!$matched) { + $classes = trim($classes); + $svg = str_replace('jsonSerialize(); + } elseif (method_exists($data, 'toArray')) { + $data = $data->toArray(); + } else { + $data = json_decode(json_encode($data), true); + } + } + + return Yaml::dump($data, $inline); + } + + /** + * Decode/Parse data from YAML format + * + * @param string $data + * @return array + */ + public function yamlDecodeFilter($data) + { + return Yaml::parse($data); + } + + /** + * Function/Filter to return the type of variable + * + * @param mixed $var + * @return string + */ + public function getTypeFunc($var) + { + return gettype($var); + } + + /** + * Function/Filter to test type of variable + * + * @param mixed $var + * @param string|null $typeTest + * @param string|null $className + * @return bool + */ + public function ofTypeFunc($var, $typeTest = null, $className = null) + { + + switch ($typeTest) { + default: + return false; + + case 'array': + return is_array($var); + + case 'bool': + return is_bool($var); + + case 'class': + return is_object($var) === true && get_class($var) === $className; + + case 'float': + return is_float($var); + + case 'int': + return is_int($var); + + case 'numeric': + return is_numeric($var); + + case 'object': + return is_object($var); + + case 'scalar': + return is_scalar($var); + + case 'string': + return is_string($var); + } + } +} diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeMarkdown.php b/system/src/Grav/Common/Twig/Node/TwigNodeMarkdown.php index 38194e6..81cecae 100644 --- a/system/src/Grav/Common/Twig/Node/TwigNodeMarkdown.php +++ b/system/src/Grav/Common/Twig/Node/TwigNodeMarkdown.php @@ -47,6 +47,6 @@ class TwigNodeMarkdown extends Node implements NodeOutputInterface ->write('$lines = explode("\n", $content);' . PHP_EOL) ->write('$content = preg_replace(\'/^\' . $matches[0]. \'/\', "", $lines);' . PHP_EOL) ->write('$content = join("\n", $content);' . PHP_EOL) - ->write('echo $this->env->getExtension(\'Grav\Common\Twig\TwigExtension\')->markdownFunction($context, $content);' . PHP_EOL); + ->write('echo $this->env->getExtension(\'Grav\Common\Twig\Extension\GravExtension\')->markdownFunction($context, $content);' . PHP_EOL); } } diff --git a/system/src/Grav/Common/Twig/Twig.php b/system/src/Grav/Common/Twig/Twig.php index d4f710b..2796c0d 100644 --- a/system/src/Grav/Common/Twig/Twig.php +++ b/system/src/Grav/Common/Twig/Twig.php @@ -16,6 +16,9 @@ use Grav\Common\Language\Language; use Grav\Common\Language\LanguageCodes; use Grav\Common\Page\Interfaces\PageInterface; use Grav\Common\Page\Pages; +use Grav\Common\Twig\Extension\FilesystemExtension; +use Grav\Common\Twig\Extension\GravExtension; +use Grav\Common\Utils; use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator; use RocketTheme\Toolbox\Event\Event; use Phive\Twig\Extensions\Deferred\DeferredExtension; @@ -34,6 +37,8 @@ use Twig\Profiler\Profile; use Twig\TwigFilter; use Twig\TwigFunction; use function function_exists; +use function in_array; +use function is_array; /** * Class Twig @@ -154,27 +159,53 @@ class Twig $this->twig = new TwigEnvironment($loader_chain, $params); - if ($config->get('system.twig.undefined_functions')) { - $this->twig->registerUndefinedFunctionCallback(function ($name) { + $this->twig->registerUndefinedFunctionCallback(function ($name) use ($config) { + $allowed = $config->get('system.twig.safe_functions'); + if (is_array($allowed) && in_array($name, $allowed, true) && function_exists($name)) { + return new TwigFunction($name, $name); + } + if ($config->get('system.twig.undefined_functions')) { if (function_exists($name)) { - return new TwigFunction($name, $name); + if (!Utils::isDangerousFunction($name)) { + user_error("PHP function {$name}() was used as Twig function. This is deprecated in Grav 1.7. Please add it to system configuration: `system.twig.safe_functions`", E_USER_DEPRECATED); + + return new TwigFunction($name, $name); + } + + /** @var Debugger $debugger */ + $debugger = $this->grav['debugger']; + $debugger->addException(new RuntimeException("Blocked potentially dangerous PHP function {$name}() being used as Twig function. If you really want to use it, please add it to system configuration: `system.twig.safe_functions`")); } - return new TwigFunction($name, static function () { - }); - }); - } + return new TwigFunction($name, static function () {}); + } - if ($config->get('system.twig.undefined_filters')) { - $this->twig->registerUndefinedFilterCallback(function ($name) { + return false; + }); + + $this->twig->registerUndefinedFilterCallback(function ($name) use ($config) { + $allowed = $config->get('system.twig.safe_filters'); + if (is_array($allowed) && in_array($name, $allowed, true) && function_exists($name)) { + return new TwigFilter($name, $name); + } + if ($config->get('system.twig.undefined_filters')) { if (function_exists($name)) { - return new TwigFilter($name, $name); + if (!Utils::isDangerousFunction($name)) { + user_error("PHP function {$name}() used as Twig filter. This is deprecated in Grav 1.7. Please add it to system configuration: `system.twig.safe_filters`", E_USER_DEPRECATED); + + return new TwigFilter($name, $name); + } + + /** @var Debugger $debugger */ + $debugger = $this->grav['debugger']; + $debugger->addException(new RuntimeException("Blocked potentially dangerous PHP function {$name}() being used as Twig filter. If you really want to use it, please add it to system configuration: `system.twig.safe_filters`")); } - return new TwigFilter($name, static function () { - }); - }); - } + return new TwigFilter($name, static function () {}); + } + + return false; + }); $this->grav->fireEvent('onTwigInitialized'); @@ -188,7 +219,8 @@ class Twig if ($config->get('system.twig.debug')) { $this->twig->addExtension(new DebugExtension()); } - $this->twig->addExtension(new TwigExtension()); + $this->twig->addExtension(new GravExtension()); + $this->twig->addExtension(new FilesystemExtension()); $this->twig->addExtension(new DeferredExtension()); $this->twig->addExtension(new StringLoaderExtension()); @@ -211,7 +243,7 @@ class Twig 'assets' => $this->grav['assets'], 'taxonomy' => $this->grav['taxonomy'], 'browser' => $this->grav['browser'], - 'base_dir' => rtrim(ROOT_DIR, '/'), + 'base_dir' => GRAV_ROOT, 'home_url' => $pages->homeUrl($active_language), 'base_url' => $pages->baseUrl($active_language), 'base_url_absolute' => $pages->baseUrl($active_language, true), diff --git a/system/src/Grav/Common/Twig/TwigExtension.php b/system/src/Grav/Common/Twig/TwigExtension.php index 4c6fa9e..698858b 100644 --- a/system/src/Grav/Common/Twig/TwigExtension.php +++ b/system/src/Grav/Common/Twig/TwigExtension.php @@ -9,1591 +9,13 @@ namespace Grav\Common\Twig; -use Cron\CronExpression; -use Grav\Common\Config\Config; -use Grav\Common\Data\Data; -use Grav\Common\Debugger; -use Grav\Common\Grav; -use Grav\Common\Inflector; -use Grav\Common\Language\Language; -use Grav\Common\Page\Collection; -use Grav\Common\Page\Interfaces\PageInterface; -use Grav\Common\Page\Media; -use Grav\Common\Scheduler\Cron; -use Grav\Common\Security; -use Grav\Common\Twig\TokenParser\TwigTokenParserCache; -use Grav\Common\Twig\TokenParser\TwigTokenParserRender; -use Grav\Common\Twig\TokenParser\TwigTokenParserScript; -use Grav\Common\Twig\TokenParser\TwigTokenParserStyle; -use Grav\Common\Twig\TokenParser\TwigTokenParserSwitch; -use Grav\Common\Twig\TokenParser\TwigTokenParserThrow; -use Grav\Common\Twig\TokenParser\TwigTokenParserTryCatch; -use Grav\Common\Twig\TokenParser\TwigTokenParserMarkdown; -use Grav\Common\User\Interfaces\UserInterface; -use Grav\Common\Utils; -use Grav\Common\Yaml; -use Grav\Common\Helpers\Base32; -use Grav\Framework\Flex\Interfaces\FlexObjectInterface; -use Grav\Framework\Psr7\Response; -use Iterator; -use JsonSerializable; -use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator; -use Traversable; -use Twig\Environment; -use Twig\Extension\AbstractExtension; -use Twig\Extension\GlobalsInterface; -use Twig\Loader\FilesystemLoader; -use Twig\TwigFilter; -use Twig\TwigFunction; -use function array_slice; -use function count; -use function func_get_args; -use function func_num_args; -use function get_class; -use function gettype; -use function in_array; -use function is_array; -use function is_bool; -use function is_float; -use function is_int; -use function is_numeric; -use function is_object; -use function is_scalar; -use function is_string; -use function ord; -use function strlen; +use Grav\Common\Twig\Extension\GravExtension; /** * Class TwigExtension * @package Grav\Common\Twig + * @deprecated 1.7 Use GravExtension instead */ -class TwigExtension extends AbstractExtension implements GlobalsInterface +class TwigExtension extends GravExtension { - /** @var Grav */ - protected $grav; - /** @var Debugger|null */ - protected $debugger; - /** @var Config */ - protected $config; - - /** - * TwigExtension constructor. - */ - public function __construct() - { - $this->grav = Grav::instance(); - $this->debugger = $this->grav['debugger'] ?? null; - $this->config = $this->grav['config']; - } - - /** - * Register some standard globals - * - * @return array - */ - public function getGlobals() - { - return [ - 'grav' => $this->grav, - ]; - } - - /** - * Return a list of all filters. - * - * @return array - */ - public function getFilters() - { - return [ - new TwigFilter('*ize', [$this, 'inflectorFilter']), - new TwigFilter('absolute_url', [$this, 'absoluteUrlFilter']), - new TwigFilter('contains', [$this, 'containsFilter']), - new TwigFilter('chunk_split', [$this, 'chunkSplitFilter']), - new TwigFilter('nicenumber', [$this, 'niceNumberFunc']), - new TwigFilter('nicefilesize', [$this, 'niceFilesizeFunc']), - new TwigFilter('nicetime', [$this, 'nicetimeFunc']), - new TwigFilter('defined', [$this, 'definedDefaultFilter']), - new TwigFilter('ends_with', [$this, 'endsWithFilter']), - new TwigFilter('fieldName', [$this, 'fieldNameFilter']), - new TwigFilter('ksort', [$this, 'ksortFilter']), - new TwigFilter('ltrim', [$this, 'ltrimFilter']), - new TwigFilter('markdown', [$this, 'markdownFunction'], ['needs_context' => true, 'is_safe' => ['html']]), - new TwigFilter('md5', [$this, 'md5Filter']), - new TwigFilter('base32_encode', [$this, 'base32EncodeFilter']), - new TwigFilter('base32_decode', [$this, 'base32DecodeFilter']), - new TwigFilter('base64_encode', [$this, 'base64EncodeFilter']), - new TwigFilter('base64_decode', [$this, 'base64DecodeFilter']), - new TwigFilter('randomize', [$this, 'randomizeFilter']), - new TwigFilter('modulus', [$this, 'modulusFilter']), - new TwigFilter('rtrim', [$this, 'rtrimFilter']), - new TwigFilter('pad', [$this, 'padFilter']), - new TwigFilter('regex_replace', [$this, 'regexReplace']), - new TwigFilter('safe_email', [$this, 'safeEmailFilter'], ['is_safe' => ['html']]), - new TwigFilter('safe_truncate', [Utils::class, 'safeTruncate']), - new TwigFilter('safe_truncate_html', [Utils::class, 'safeTruncateHTML']), - new TwigFilter('sort_by_key', [$this, 'sortByKeyFilter']), - new TwigFilter('starts_with', [$this, 'startsWithFilter']), - new TwigFilter('truncate', [Utils::class, 'truncate']), - new TwigFilter('truncate_html', [Utils::class, 'truncateHTML']), - new TwigFilter('json_decode', [$this, 'jsonDecodeFilter']), - new TwigFilter('array_unique', 'array_unique'), - new TwigFilter('basename', 'basename'), - new TwigFilter('dirname', 'dirname'), - new TwigFilter('print_r', [$this, 'print_r']), - new TwigFilter('yaml_encode', [$this, 'yamlEncodeFilter']), - new TwigFilter('yaml_decode', [$this, 'yamlDecodeFilter']), - new TwigFilter('nicecron', [$this, 'niceCronFilter']), - - // Translations - new TwigFilter('t', [$this, 'translate'], ['needs_environment' => true]), - new TwigFilter('tl', [$this, 'translateLanguage']), - new TwigFilter('ta', [$this, 'translateArray']), - - // Casting values - new TwigFilter('string', [$this, 'stringFilter']), - new TwigFilter('int', [$this, 'intFilter'], ['is_safe' => ['all']]), - new TwigFilter('bool', [$this, 'boolFilter']), - new TwigFilter('float', [$this, 'floatFilter'], ['is_safe' => ['all']]), - new TwigFilter('array', [$this, 'arrayFilter']), - - // Object Types - new TwigFilter('get_type', [$this, 'getTypeFunc']), - new TwigFilter('of_type', [$this, 'ofTypeFunc']) - ]; - } - - /** - * Return a list of all functions. - * - * @return array - */ - public function getFunctions() - { - return [ - new TwigFunction('array', [$this, 'arrayFilter']), - new TwigFunction('array_key_value', [$this, 'arrayKeyValueFunc']), - new TwigFunction('array_key_exists', 'array_key_exists'), - new TwigFunction('array_unique', 'array_unique'), - new TwigFunction('array_intersect', [$this, 'arrayIntersectFunc']), - new TwigFunction('array_diff', 'array_diff'), - new TwigFunction('authorize', [$this, 'authorize']), - new TwigFunction('debug', [$this, 'dump'], ['needs_context' => true, 'needs_environment' => true]), - new TwigFunction('dump', [$this, 'dump'], ['needs_context' => true, 'needs_environment' => true]), - new TwigFunction('vardump', [$this, 'vardumpFunc']), - new TwigFunction('print_r', [$this, 'print_r']), - new TwigFunction('http_response_code', 'http_response_code'), - new TwigFunction('evaluate', [$this, 'evaluateStringFunc'], ['needs_context' => true]), - new TwigFunction('evaluate_twig', [$this, 'evaluateTwigFunc'], ['needs_context' => true]), - new TwigFunction('gist', [$this, 'gistFunc']), - new TwigFunction('nonce_field', [$this, 'nonceFieldFunc']), - new TwigFunction('pathinfo', 'pathinfo'), - new TwigFunction('random_string', [$this, 'randomStringFunc']), - new TwigFunction('repeat', [$this, 'repeatFunc']), - new TwigFunction('regex_replace', [$this, 'regexReplace']), - new TwigFunction('regex_filter', [$this, 'regexFilter']), - new TwigFunction('regex_match', [$this, 'regexMatch']), - new TwigFunction('regex_split', [$this, 'regexSplit']), - new TwigFunction('string', [$this, 'stringFilter']), - new TwigFunction('url', [$this, 'urlFunc']), - new TwigFunction('json_decode', [$this, 'jsonDecodeFilter']), - new TwigFunction('get_cookie', [$this, 'getCookie']), - new TwigFunction('redirect_me', [$this, 'redirectFunc']), - new TwigFunction('range', [$this, 'rangeFunc']), - new TwigFunction('isajaxrequest', [$this, 'isAjaxFunc']), - new TwigFunction('exif', [$this, 'exifFunc']), - new TwigFunction('media_directory', [$this, 'mediaDirFunc']), - new TwigFunction('body_class', [$this, 'bodyClassFunc'], ['needs_context' => true]), - new TwigFunction('theme_var', [$this, 'themeVarFunc'], ['needs_context' => true]), - new TwigFunction('header_var', [$this, 'pageHeaderVarFunc'], ['needs_context' => true]), - new TwigFunction('read_file', [$this, 'readFileFunc']), - new TwigFunction('nicenumber', [$this, 'niceNumberFunc']), - new TwigFunction('nicefilesize', [$this, 'niceFilesizeFunc']), - new TwigFunction('nicetime', [$this, 'nicetimeFunc']), - new TwigFunction('cron', [$this, 'cronFunc']), - new TwigFunction('svg_image', [$this, 'svgImageFunction']), - new TwigFunction('xss', [$this, 'xssFunc']), - - - // Translations - new TwigFunction('t', [$this, 'translate'], ['needs_environment' => true]), - new TwigFunction('tl', [$this, 'translateLanguage']), - new TwigFunction('ta', [$this, 'translateArray']), - - // Object Types - new TwigFunction('get_type', [$this, 'getTypeFunc']), - new TwigFunction('of_type', [$this, 'ofTypeFunc']) - ]; - } - - /** - * @return array - */ - public function getTokenParsers() - { - return [ - new TwigTokenParserRender(), - new TwigTokenParserThrow(), - new TwigTokenParserTryCatch(), - new TwigTokenParserScript(), - new TwigTokenParserStyle(), - new TwigTokenParserMarkdown(), - new TwigTokenParserSwitch(), - new TwigTokenParserCache(), - ]; - } - - public function print_r($var) - { - return print_r($var, true); - } - - /** - * Filters field name by changing dot notation into array notation. - * - * @param string $str - * @return string - */ - public function fieldNameFilter($str) - { - $path = explode('.', rtrim($str, '.')); - - return array_shift($path) . ($path ? '[' . implode('][', $path) . ']' : ''); - } - - /** - * Protects email address. - * - * @param string $str - * @return string - */ - public function safeEmailFilter($str) - { - static $list = [ - '"' => '"', - "'" => ''', - '&' => '&', - '<' => '<', - '>' => '>', - '@' => '@' - ]; - - $characters = mb_str_split($str, 1, 'UTF-8'); - - $encoded = ''; - foreach ($characters as $chr) { - $encoded .= $list[$chr] ?? (random_int(0, 1) ? '&#' . mb_ord($chr) . ';' : $chr); - } - - return $encoded; - } - - /** - * Returns array in a random order. - * - * @param array|Traversable $original - * @param int $offset Can be used to return only slice of the array. - * @return array - */ - public function randomizeFilter($original, $offset = 0) - { - if ($original instanceof Traversable) { - $original = iterator_to_array($original, false); - } - - if (!is_array($original)) { - return $original; - } - - $sorted = []; - $random = array_slice($original, $offset); - shuffle($random); - - $sizeOf = count($original); - for ($x = 0; $x < $sizeOf; $x++) { - if ($x < $offset) { - $sorted[] = $original[$x]; - } else { - $sorted[] = array_shift($random); - } - } - - return $sorted; - } - - /** - * Returns the modulus of an integer - * - * @param string|int $number - * @param int $divider - * @param array|null $items array of items to select from to return - * @return int - */ - public function modulusFilter($number, $divider, $items = null) - { - if (is_string($number)) { - $number = strlen($number); - } - - $remainder = $number % $divider; - - if (is_array($items)) { - return $items[$remainder] ?? $items[0]; - } - - return $remainder; - } - - /** - * Inflector supports following notations: - * - * `{{ 'person'|pluralize }} => people` - * `{{ 'shoes'|singularize }} => shoe` - * `{{ 'welcome page'|titleize }} => "Welcome Page"` - * `{{ 'send_email'|camelize }} => SendEmail` - * `{{ 'CamelCased'|underscorize }} => camel_cased` - * `{{ 'Something Text'|hyphenize }} => something-text` - * `{{ 'something_text_to_read'|humanize }} => "Something text to read"` - * `{{ '181'|monthize }} => 5` - * `{{ '10'|ordinalize }} => 10th` - * - * @param string $action - * @param string $data - * @param int|null $count - * @return string - */ - public function inflectorFilter($action, $data, $count = null) - { - $action .= 'ize'; - - /** @var Inflector $inflector */ - $inflector = $this->grav['inflector']; - - if (in_array( - $action, - ['titleize', 'camelize', 'underscorize', 'hyphenize', 'humanize', 'ordinalize', 'monthize'], - true - )) { - return $inflector->{$action}($data); - } - - if (in_array($action, ['pluralize', 'singularize'], true)) { - return $count ? $inflector->{$action}($data, $count) : $inflector->{$action}($data); - } - - return $data; - } - - /** - * Return MD5 hash from the input. - * - * @param string $str - * @return string - */ - public function md5Filter($str) - { - return md5($str); - } - - /** - * Return Base32 encoded string - * - * @param string $str - * @return string - */ - public function base32EncodeFilter($str) - { - return Base32::encode($str); - } - - /** - * Return Base32 decoded string - * - * @param string $str - * @return string - */ - public function base32DecodeFilter($str) - { - return Base32::decode($str); - } - - /** - * Return Base64 encoded string - * - * @param string $str - * @return string - */ - public function base64EncodeFilter($str) - { - return base64_encode($str); - } - - /** - * Return Base64 decoded string - * - * @param string $str - * @return string|false - */ - public function base64DecodeFilter($str) - { - return base64_decode($str); - } - - /** - * Sorts a collection by key - * - * @param array $input - * @param string $filter - * @param int $direction - * @param int $sort_flags - * @return array - */ - public function sortByKeyFilter($input, $filter, $direction = SORT_ASC, $sort_flags = SORT_REGULAR) - { - return Utils::sortArrayByKey($input, $filter, $direction, $sort_flags); - } - - /** - * Return ksorted collection. - * - * @param array|null $array - * @return array - */ - public function ksortFilter($array) - { - if (null === $array) { - $array = []; - } - ksort($array); - - return $array; - } - - /** - * Wrapper for chunk_split() function - * - * @param string $value - * @param int $chars - * @param string $split - * @return string - */ - public function chunkSplitFilter($value, $chars, $split = '-') - { - return chunk_split($value, $chars, $split); - } - - /** - * determine if a string contains another - * - * @param string $haystack - * @param string $needle - * @return string|bool - * @todo returning $haystack here doesn't make much sense - */ - public function containsFilter($haystack, $needle) - { - if (empty($needle)) { - return $haystack; - } - - return (strpos($haystack, (string) $needle) !== false); - } - - /** - * Gets a human readable output for cron syntax - * - * @param string $at - * @return string - */ - public function niceCronFilter($at) - { - $cron = new Cron($at); - return $cron->getText('en'); - } - - /** - * Get Cron object for a crontab 'at' format - * - * @param string $at - * @return CronExpression - */ - public function cronFunc($at) - { - return CronExpression::factory($at); - } - - /** - * displays a facebook style 'time ago' formatted date/time - * - * @param string $date - * @param bool $long_strings - * @param bool $show_tense - * @return string - */ - public function nicetimeFunc($date, $long_strings = true, $show_tense = true) - { - if (empty($date)) { - return $this->grav['language']->translate('GRAV.NICETIME.NO_DATE_PROVIDED'); - } - - if ($long_strings) { - $periods = [ - 'NICETIME.SECOND', - 'NICETIME.MINUTE', - 'NICETIME.HOUR', - 'NICETIME.DAY', - 'NICETIME.WEEK', - 'NICETIME.MONTH', - 'NICETIME.YEAR', - 'NICETIME.DECADE' - ]; - } else { - $periods = [ - 'NICETIME.SEC', - 'NICETIME.MIN', - 'NICETIME.HR', - 'NICETIME.DAY', - 'NICETIME.WK', - 'NICETIME.MO', - 'NICETIME.YR', - 'NICETIME.DEC' - ]; - } - - $lengths = ['60', '60', '24', '7', '4.35', '12', '10']; - - $now = time(); - - // check if unix timestamp - if ((string)(int)$date === (string)$date) { - $unix_date = $date; - } else { - $unix_date = strtotime($date); - } - - // check validity of date - if (empty($unix_date)) { - return $this->grav['language']->translate('GRAV.NICETIME.BAD_DATE'); - } - - // is it future date or past date - if ($now > $unix_date) { - $difference = $now - $unix_date; - $tense = $this->grav['language']->translate('GRAV.NICETIME.AGO'); - } elseif ($now == $unix_date) { - $difference = $now - $unix_date; - $tense = $this->grav['language']->translate('GRAV.NICETIME.JUST_NOW'); - } else { - $difference = $unix_date - $now; - $tense = $this->grav['language']->translate('GRAV.NICETIME.FROM_NOW'); - } - - for ($j = 0; $difference >= $lengths[$j] && $j < count($lengths) - 1; $j++) { - $difference /= $lengths[$j]; - } - - $difference = round($difference); - - if ($difference != 1) { - $periods[$j] .= '_PLURAL'; - } - - if ($this->grav['language']->getTranslation( - $this->grav['language']->getLanguage(), - $periods[$j] . '_MORE_THAN_TWO' - ) - ) { - if ($difference > 2) { - $periods[$j] .= '_MORE_THAN_TWO'; - } - } - - $periods[$j] = $this->grav['language']->translate('GRAV.'.$periods[$j]); - - if ($now == $unix_date) { - return $tense; - } - - $time = "{$difference} {$periods[$j]}"; - $time .= $show_tense ? " {$tense}" : ''; - - return $time; - } - - /** - * Allow quick check of a string for XSS Vulnerabilities - * - * @param string|array $data - * @return bool|string|array - */ - public function xssFunc($data) - { - if (!is_array($data)) { - return Security::detectXss($data); - } - - $results = Security::detectXssFromArray($data); - $results_parts = array_map(static function ($value, $key) { - return $key.': \''.$value . '\''; - }, array_values($results), array_keys($results)); - - return implode(', ', $results_parts); - } - - /** - * @param string $string - * @return string - */ - public function absoluteUrlFilter($string) - { - $url = $this->grav['uri']->base(); - $string = preg_replace('/((?:href|src) *= *[\'"](?!(http|ftp)))/i', "$1$url", $string); - - return $string; - } - - /** - * @param array $context - * @param string $string - * @param bool $block Block or Line processing - * @return string - */ - public function markdownFunction($context, $string, $block = true) - { - $page = $context['page'] ?? null; - return Utils::processMarkdown($string, $block, $page); - } - - /** - * @param string $haystack - * @param string $needle - * @return bool - */ - public function startsWithFilter($haystack, $needle) - { - return Utils::startsWith($haystack, $needle); - } - - /** - * @param string $haystack - * @param string $needle - * @return bool - */ - public function endsWithFilter($haystack, $needle) - { - return Utils::endsWith($haystack, $needle); - } - - /** - * @param mixed $value - * @param null $default - * @return mixed|null - */ - public function definedDefaultFilter($value, $default = null) - { - return $value ?? $default; - } - - /** - * @param string $value - * @param string|null $chars - * @return string - */ - public function rtrimFilter($value, $chars = null) - { - return null !== $chars ? rtrim($value, $chars) : rtrim($value); - } - - /** - * @param string $value - * @param string|null $chars - * @return string - */ - public function ltrimFilter($value, $chars = null) - { - return null !== $chars ? ltrim($value, $chars) : ltrim($value); - } - - /** - * Returns a string from a value. If the value is array, return it json encoded - * - * @param mixed $value - * @return string - */ - public function stringFilter($value) - { - // Format the array as a string - if (is_array($value)) { - return json_encode($value); - } - - // Boolean becomes '1' or '0' - if (is_bool($value)) { - $value = (int)$value; - } - - // Cast the other values to string. - return (string)$value; - } - - /** - * Casts input to int. - * - * @param mixed $input - * @return int - */ - public function intFilter($input) - { - return (int) $input; - } - - /** - * Casts input to bool. - * - * @param mixed $input - * @return bool - */ - public function boolFilter($input) - { - return (bool) $input; - } - - /** - * Casts input to float. - * - * @param mixed $input - * @return float - */ - public function floatFilter($input) - { - return (float) $input; - } - - /** - * Casts input to array. - * - * @param mixed $input - * @return array - */ - public function arrayFilter($input) - { - if (is_array($input)) { - return $input; - } - - if (is_object($input)) { - if (method_exists($input, 'toArray')) { - return $input->toArray(); - } - - if ($input instanceof Iterator) { - return iterator_to_array($input); - } - } - - return (array)$input; - } - - /** - * @param Environment $twig - * @return string - */ - public function translate(Environment $twig) - { - // shift off the environment - $args = func_get_args(); - array_shift($args); - - // If admin and tu filter provided, use it - if (isset($this->grav['admin'])) { - $numargs = count($args); - $lang = null; - - if (($numargs === 3 && is_array($args[1])) || ($numargs === 2 && !is_array($args[1]))) { - $lang = array_pop($args); - } elseif ($numargs === 2 && is_array($args[1])) { - $subs = array_pop($args); - $args = array_merge($args, $subs); - } - - return $this->grav['admin']->translate($args, $lang); - } - - // else use the default grav translate functionality - return $this->grav['language']->translate($args); - } - - /** - * Translate Strings - * - * @param string|array $args - * @param array|null $languages - * @param bool $array_support - * @param bool $html_out - * @return string - */ - public function translateLanguage($args, array $languages = null, $array_support = false, $html_out = false) - { - /** @var Language $language */ - $language = $this->grav['language']; - - return $language->translate($args, $languages, $array_support, $html_out); - } - - /** - * @param string $key - * @param string $index - * @param array|null $lang - * @return string - */ - public function translateArray($key, $index, $lang = null) - { - /** @var Language $language */ - $language = $this->grav['language']; - - return $language->translateArray($key, $index, $lang); - } - - /** - * Repeat given string x times. - * - * @param string $input - * @param int $multiplier - * - * @return string - */ - public function repeatFunc($input, $multiplier) - { - return str_repeat($input, $multiplier); - } - - /** - * Return URL to the resource. - * - * @example {{ url('theme://images/logo.png')|default('http://www.placehold.it/150x100/f4f4f4') }} - * - * @param string $input Resource to be located. - * @param bool $domain True to include domain name. - * @param bool $failGracefully If true, return URL even if the file does not exist. - * @return string|false Returns url to the resource or null if resource was not found. - */ - public function urlFunc($input, $domain = false, $failGracefully = false) - { - return Utils::url($input, $domain, $failGracefully); - } - - /** - * This function will evaluate Twig $twig through the $environment, and return its results. - * - * @param array $context - * @param string $twig - * @return mixed - */ - public function evaluateTwigFunc($context, $twig) - { - - $loader = new FilesystemLoader('.'); - $env = new Environment($loader); - $env->addExtension($this); - - $template = $env->createTemplate($twig); - - return $template->render($context); - } - - /** - * This function will evaluate a $string through the $environment, and return its results. - * - * @param array $context - * @param string $string - * @return mixed - */ - public function evaluateStringFunc($context, $string) - { - return $this->evaluateTwigFunc($context, "{{ $string }}"); - } - - /** - * Based on Twig\Extension\Debug / twig_var_dump - * (c) 2011 Fabien Potencier - * - * @param Environment $env - * @param array $context - */ - public function dump(Environment $env, $context) - { - if (!$env->isDebug() || !$this->debugger) { - return; - } - - $count = func_num_args(); - if (2 === $count) { - $data = []; - foreach ($context as $key => $value) { - if (is_object($value)) { - if (method_exists($value, 'toArray')) { - $data[$key] = $value->toArray(); - } else { - $data[$key] = 'Object (' . get_class($value) . ')'; - } - } else { - $data[$key] = $value; - } - } - $this->debugger->addMessage($data, 'debug'); - } else { - for ($i = 2; $i < $count; $i++) { - $var = func_get_arg($i); - $this->debugger->addMessage($var, 'debug'); - } - } - } - - /** - * Output a Gist - * - * @param string $id - * @param string|false $file - * @return string - */ - public function gistFunc($id, $file = false) - { - $url = 'https://gist.github.com/' . $id . '.js'; - if ($file) { - $url .= '?file=' . $file; - } - return ''; - } - - /** - * Generate a random string - * - * @param int $count - * @return string - */ - public function randomStringFunc($count = 5) - { - return Utils::generateRandomString($count); - } - - /** - * Pad a string to a certain length with another string - * - * @param string $input - * @param int $pad_length - * @param string $pad_string - * @param int $pad_type - * @return string - */ - public static function padFilter($input, $pad_length, $pad_string = ' ', $pad_type = STR_PAD_RIGHT) - { - return str_pad($input, (int)$pad_length, $pad_string, $pad_type); - } - - /** - * Workaround for twig associative array initialization - * Returns a key => val array - * - * @param string $key key of item - * @param string $val value of item - * @param array|null $current_array optional array to add to - * @return array - */ - public function arrayKeyValueFunc($key, $val, $current_array = null) - { - if (empty($current_array)) { - return array($key => $val); - } - - $current_array[$key] = $val; - - return $current_array; - } - - /** - * Wrapper for array_intersect() method - * - * @param array|Collection $array1 - * @param array|Collection $array2 - * @return array|Collection - */ - public function arrayIntersectFunc($array1, $array2) - { - if ($array1 instanceof Collection && $array2 instanceof Collection) { - return $array1->intersect($array2)->toArray(); - } - - return array_intersect($array1, $array2); - } - - /** - * Translate a string - * - * @return string - */ - public function translateFunc() - { - return $this->grav['language']->translate(func_get_args()); - } - - /** - * Authorize an action. Returns true if the user is logged in and - * has the right to execute $action. - * - * @param string|array $action An action or a list of actions. Each - * entry can be a string like 'group.action' - * or without dot notation an associative - * array. - * @return bool Returns TRUE if the user is authorized to - * perform the action, FALSE otherwise. - */ - public function authorize($action) - { - // Admin can use Flex users even if the site does not; make sure we use the right version of the user. - $admin = $this->grav['admin'] ?? null; - if ($admin) { - $user = $admin->user; - } else { - /** @var UserInterface|null $user */ - $user = $this->grav['user'] ?? null; - } - - if (!$user) { - return false; - } - - if (is_array($action)) { - if (Utils::isAssoc($action)) { - // Handle nested access structure. - $actions = Utils::arrayFlattenDotNotation($action); - } else { - // Handle simple access list. - $actions = array_combine($action, array_fill(0, count($action), true)); - } - } else { - // Handle single action. - $actions = [(string)$action => true]; - } - - $count = count($actions); - foreach ($actions as $act => $authenticated) { - // Ignore 'admin.super' if it's not the only value to be checked. - if ($act === 'admin.super' && $count > 1 && $user instanceof FlexObjectInterface) { - continue; - } - - $auth = $user->authorize($act) ?? false; - if (is_bool($auth) && $auth === Utils::isPositive($authenticated)) { - return true; - } - } - - return false; - } - - /** - * Used to add a nonce to a form. Call {{ nonce_field('action') }} specifying a string representing the action. - * - * For maximum protection, ensure that the string representing the action is as specific as possible - * - * @param string $action the action - * @param string $nonceParamName a custom nonce param name - * @return string the nonce input field - */ - public function nonceFieldFunc($action, $nonceParamName = 'nonce') - { - $string = ''; - - return $string; - } - - /** - * Decodes string from JSON. - * - * @param string $str - * @param bool $assoc - * @param int $depth - * @param int $options - * @return array - */ - public function jsonDecodeFilter($str, $assoc = false, $depth = 512, $options = 0) - { - return json_decode(html_entity_decode($str, ENT_COMPAT | ENT_HTML401, 'UTF-8'), $assoc, $depth, $options); - } - - /** - * Used to retrieve a cookie value - * - * @param string $key The cookie name to retrieve - * @return string - */ - public function getCookie($key) - { - return filter_input(INPUT_COOKIE, $key, FILTER_SANITIZE_STRING); - } - - /** - * Twig wrapper for PHP's preg_replace method - * - * @param string|string[] $subject the content to perform the replacement on - * @param string|string[] $pattern the regex pattern to use for matches - * @param string|string[] $replace the replacement value either as a string or an array of replacements - * @param int $limit the maximum possible replacements for each pattern in each subject - * @return string|string[]|null the resulting content - */ - public function regexReplace($subject, $pattern, $replace, $limit = -1) - { - return preg_replace($pattern, $replace, $subject, $limit); - } - - /** - * Twig wrapper for PHP's preg_grep method - * - * @param array $array - * @param string $regex - * @param int $flags - * @return array - */ - public function regexFilter($array, $regex, $flags = 0) - { - return preg_grep($regex, $array, $flags); - } - - /** - * Twig wrapper for PHP's preg_match method - * - * @param string $subject the content to perform the match on - * @param string $pattern the regex pattern to use for match - * @param int $flags - * @param int $offset - * @return array|false returns the matches if there is at least one match in the subject for a given pattern or null if not. - */ - public function regexMatch($subject, $pattern, $flags = 0, $offset = 0) - { - if (preg_match($pattern, $subject, $matches, $flags, $offset) === false) { - return false; - } - - return $matches; - } - - /** - * Twig wrapper for PHP's preg_split method - * - * @param string $subject the content to perform the split on - * @param string $pattern the regex pattern to use for split - * @param int $limit the maximum possible splits for the given pattern - * @param int $flags - * @return array|false the resulting array after performing the split operation - */ - public function regexSplit($subject, $pattern, $limit = -1, $flags = 0) - { - return preg_split($pattern, $subject, $limit, $flags); - } - - /** - * redirect browser from twig - * - * @param string $url the url to redirect to - * @param int $statusCode statusCode, default 303 - * @return void - */ - public function redirectFunc($url, $statusCode = 303) - { - $response = new Response($statusCode, ['location' => $url]); - - $this->grav->close($response); - } - - /** - * Generates an array containing a range of elements, optionally stepped - * - * @param int $start Minimum number, default 0 - * @param int $end Maximum number, default `getrandmax()` - * @param int $step Increment between elements in the sequence, default 1 - * @return array - */ - public function rangeFunc($start = 0, $end = 100, $step = 1) - { - return range($start, $end, $step); - } - - /** - * Check if HTTP_X_REQUESTED_WITH has been set to xmlhttprequest, - * in which case we may unsafely assume ajax. Non critical use only. - * - * @return bool True if HTTP_X_REQUESTED_WITH exists and has been set to xmlhttprequest - */ - public function isAjaxFunc() - { - return ( - !empty($_SERVER['HTTP_X_REQUESTED_WITH']) - && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); - } - - /** - * Get the Exif data for a file - * - * @param string $image - * @param bool $raw - * @return mixed - */ - public function exifFunc($image, $raw = false) - { - if (isset($this->grav['exif'])) { - /** @var UniformResourceLocator $locator */ - $locator = $this->grav['locator']; - - if ($locator->isStream($image)) { - $image = $locator->findResource($image); - } - - $exif_reader = $this->grav['exif']->getReader(); - - if ($image && file_exists($image) && $this->config->get('system.media.auto_metadata_exif') && $exif_reader) { - $exif_data = $exif_reader->read($image); - - if ($exif_data) { - if ($raw) { - return $exif_data->getRawData(); - } - - return $exif_data->getData(); - } - } - } - - return null; - } - - /** - * Simple function to read a file based on a filepath and output it - * - * @param string $filepath - * @return bool|string - */ - public function readFileFunc($filepath) - { - /** @var UniformResourceLocator $locator */ - $locator = $this->grav['locator']; - - if ($locator->isStream($filepath)) { - $filepath = $locator->findResource($filepath); - } - - if ($filepath && file_exists($filepath)) { - return file_get_contents($filepath); - } - - return false; - } - - /** - * Process a folder as Media and return a media object - * - * @param string $media_dir - * @return Media|null - */ - public function mediaDirFunc($media_dir) - { - /** @var UniformResourceLocator $locator */ - $locator = $this->grav['locator']; - - if ($locator->isStream($media_dir)) { - $media_dir = $locator->findResource($media_dir); - } - - if ($media_dir && file_exists($media_dir)) { - return new Media($media_dir); - } - - return null; - } - - /** - * Dump a variable to the browser - * - * @param mixed $var - * @return void - */ - public function vardumpFunc($var) - { - var_dump($var); - } - - /** - * Returns a nicer more readable filesize based on bytes - * - * @param int $bytes - * @return string - */ - public function niceFilesizeFunc($bytes) - { - return Utils::prettySize($bytes); - } - - /** - * Returns a nicer more readable number - * - * @param int|float|string $n - * @return string|bool - */ - public function niceNumberFunc($n) - { - if (!is_float($n) && !is_int($n)) { - if (!is_string($n) || $n === '') { - return false; - } - - // Strip any thousand formatting and find the first number. - $list = array_filter(preg_split("/\D+/", str_replace(',', '', $n))); - $n = reset($list); - - if (!is_numeric($n)) { - return false; - } - - $n = (float)$n; - } - - // now filter it; - if ($n > 1000000000000) { - return round($n/1000000000000, 2).' t'; - } - if ($n > 1000000000) { - return round($n/1000000000, 2).' b'; - } - if ($n > 1000000) { - return round($n/1000000, 2).' m'; - } - if ($n > 1000) { - return round($n/1000, 2).' k'; - } - - return number_format($n); - } - - /** - * Get a theme variable - * Will try to get the variable for the current page, if not found, it tries it's parent page on up to root. - * If still not found, will use the theme's configuration value, - * If still not found, will use the $default value passed in - * - * @param array $context Twig Context - * @param string $var variable to be found (using dot notation) - * @param null $default the default value to be used as last resort - * @param null $page an optional page to use for the current page - * @param bool $exists toggle to simply return the page where the variable is set, else null - * @return mixed - */ - public function themeVarFunc($context, $var, $default = null, $page = null, $exists = false) - { - $page = $page ?? $context['page'] ?? Grav::instance()['page'] ?? null; - - // Try to find var in the page headers - if ($page instanceof PageInterface && $page->exists()) { - // Loop over pages and look for header vars - while ($page && !$page->root()) { - $header = new Data((array)$page->header()); - $value = $header->get($var); - if (isset($value)) { - if ($exists) { - return $page; - } - - return $value; - } - $page = $page->parent(); - } - } - - if ($exists) { - return false; - } - - return Grav::instance()['config']->get('theme.' . $var, $default); - } - - /** - * Look for a page header variable in an array of pages working its way through until a value is found - * - * @param array $context - * @param string $var the variable to look for in the page header - * @param string|string[]|null $pages array of pages to check (current page upwards if not null) - * @return mixed - * @deprecated 1.7 Use themeVarFunc() instead - */ - public function pageHeaderVarFunc($context, $var, $pages = null) - { - if (is_array($pages)) { - $page = array_shift($pages); - } else { - $page = null; - } - return $this->themeVarFunc($context, $var, null, $page); - } - - /** - * takes an array of classes, and if they are not set on body_classes - * look to see if they are set in theme config - * - * @param array $context - * @param string|string[] $classes - * @return string - */ - public function bodyClassFunc($context, $classes) - { - - $header = $context['page']->header(); - $body_classes = $header->body_classes ?? ''; - - foreach ((array)$classes as $class) { - if (!empty($body_classes) && Utils::contains($body_classes, $class)) { - continue; - } - - $val = $this->config->get('theme.' . $class, false) ? $class : false; - $body_classes .= $val ? ' ' . $val : ''; - } - - return $body_classes; - } - - /** - * Returns the content of an SVG image and adds extra classes as needed - * - * @param string $path - * @param string|null $classes - * @return string|string[]|null - */ - public static function svgImageFunction($path, $classes = null, $strip_style = false) - { - $path = Utils::fullPath($path); - - $classes = $classes ?: ''; - - if (file_exists($path) && !is_dir($path)) { - $svg = file_get_contents($path); - $classes = " inline-block $classes"; - $matched = false; - - //Remove xml tag if it exists - $svg = preg_replace('/^<\?xml.*\?>/','', $svg); - - //Strip style if needed - if ($strip_style) { - $svg = preg_replace('//s', '', $svg); - } - - //Look for existing class - $svg = preg_replace_callback('/^]*(class=\")([^"]*)(\")[^>]*>/', function($matches) use ($classes, &$matched) { - if (isset($matches[2])) { - $new_classes = $matches[2] . $classes; - $matched = true; - return str_replace($matches[1], "class=\"$new_classes\"", $matches[0]); - } - return $matches[0]; - }, $svg - ); - - // no matches found just add the class - if (!$matched) { - $classes = trim($classes); - $svg = str_replace('jsonSerialize(); - } elseif (method_exists($data, 'toArray')) { - $data = $data->toArray(); - } else { - $data = json_decode(json_encode($data), true); - } - } - - return Yaml::dump($data, $inline); - } - - /** - * Decode/Parse data from YAML format - * - * @param string $data - * @return array - */ - public function yamlDecodeFilter($data) - { - return Yaml::parse($data); - } - - /** - * Function/Filter to return the type of variable - * - * @param mixed $var - * @return string - */ - public function getTypeFunc($var) - { - return gettype($var); - } - - /** - * Function/Filter to test type of variable - * - * @param mixed $var - * @param string|null $typeTest - * @param string|null $className - * @return bool - */ - public function ofTypeFunc($var, $typeTest = null, $className = null) - { - - switch ($typeTest) { - default: - return false; - - case 'array': - return is_array($var); - - case 'bool': - return is_bool($var); - - case 'class': - return is_object($var) === true && get_class($var) === $className; - - case 'float': - return is_float($var); - - case 'int': - return is_int($var); - - case 'numeric': - return is_numeric($var); - - case 'object': - return is_object($var); - - case 'scalar': - return is_scalar($var); - - case 'string': - return is_string($var); - } - } } diff --git a/system/src/Grav/Common/Utils.php b/system/src/Grav/Common/Utils.php index dac5cf7..edc093e 100644 --- a/system/src/Grav/Common/Utils.php +++ b/system/src/Grav/Common/Utils.php @@ -44,7 +44,7 @@ use function strlen; */ abstract class Utils { - /** @var array */ + /** @var array */ protected static $nonces = []; protected const ROOTURL_REGEX = '{^((?:http[s]?:\/\/[^\/]+)|(?:\/\/[^\/]+))(.*)}'; @@ -178,8 +178,8 @@ abstract class Utils /** * Check if the $haystack string starts with the substring $needle * - * @param string $haystack - * @param string|string[] $needle + * @param string $haystack + * @param string|string[] $needle * @param bool $case_sensitive * @return bool */ @@ -202,8 +202,8 @@ abstract class Utils /** * Check if the $haystack string ends with the substring $needle * - * @param string $haystack - * @param string|string[] $needle + * @param string $haystack + * @param string|string[] $needle * @param bool $case_sensitive * @return bool */ @@ -227,9 +227,9 @@ abstract class Utils /** * Check if the $haystack string contains the substring $needle * - * @param string $haystack - * @param string|string[] $needle - * @param bool $case_sensitive + * @param string $haystack + * @param string|string[] $needle + * @param bool $case_sensitive * @return bool */ public static function contains($haystack, $needle, $case_sensitive = true) @@ -266,19 +266,19 @@ abstract class Utils { $regex = str_replace( array("\*", "\?"), // wildcard chars - array('.*','.'), // regexp chars + array('.*', '.'), // regexp chars preg_quote($wildcard_pattern, '/') ); - return preg_match('/^'.$regex.'$/is', $haystack); + return preg_match('/^' . $regex . '$/is', $haystack); } /** * Render simple template filling up the variables in it. If value is not defined, leave it as it was. * - * @param string $template Template string - * @param array $variables Variables with values - * @param array $brackets Optional array of opening and closing brackets or symbols + * @param string $template Template string + * @param array $variables Variables with values + * @param array $brackets Optional array of opening and closing brackets or symbols * @return string Final string filled with values */ public static function simpleTemplate(string $template, array $variables, array $brackets = ['{', '}']): string @@ -376,8 +376,8 @@ abstract class Utils /** * Merge two objects into one. * - * @param object $obj1 - * @param object $obj2 + * @param object $obj1 + * @param object $obj2 * * @return object */ @@ -415,7 +415,7 @@ abstract class Utils */ public static function arrayRemoveValue(array $search, $value) { - foreach ((array) $value as $val) { + foreach ((array)$value as $val) { $key = array_search($val, $search); if ($key !== false) { unset($search[$key]); @@ -481,8 +481,8 @@ abstract class Utils /** * Array combine but supports different array lengths * - * @param array $arr1 - * @param array $arr2 + * @param array $arr1 + * @param array $arr2 * @return array|false */ public static function arrayCombine($arr1, $arr2) @@ -495,7 +495,7 @@ abstract class Utils /** * Array is associative or not * - * @param array $arr + * @param array $arr * @return bool */ public static function arrayIsAssociative($arr) @@ -517,15 +517,15 @@ abstract class Utils $now = new DateTime(); $date_formats = [ - 'd-m-Y H:i' => 'd-m-Y H:i (e.g. '.$now->format('d-m-Y H:i').')', - 'Y-m-d H:i' => 'Y-m-d H:i (e.g. '.$now->format('Y-m-d H:i').')', - 'm/d/Y h:i a' => 'm/d/Y h:i a (e.g. '.$now->format('m/d/Y h:i a').')', - 'H:i d-m-Y' => 'H:i d-m-Y (e.g. '.$now->format('H:i d-m-Y').')', - 'h:i a m/d/Y' => 'h:i a m/d/Y (e.g. '.$now->format('h:i a m/d/Y').')', - ]; + 'd-m-Y H:i' => 'd-m-Y H:i (e.g. ' . $now->format('d-m-Y H:i') . ')', + 'Y-m-d H:i' => 'Y-m-d H:i (e.g. ' . $now->format('Y-m-d H:i') . ')', + 'm/d/Y h:i a' => 'm/d/Y h:i a (e.g. ' . $now->format('m/d/Y h:i a') . ')', + 'H:i d-m-Y' => 'H:i d-m-Y (e.g. ' . $now->format('H:i d-m-Y') . ')', + 'h:i a m/d/Y' => 'h:i a m/d/Y (e.g. ' . $now->format('h:i a m/d/Y') . ')', + ]; $default_format = Grav::instance()['config']->get('system.pages.dateformat.default'); if ($default_format) { - $date_formats = array_merge([$default_format => $default_format.' (e.g. '.$now->format($default_format).')'], $date_formats); + $date_formats = array_merge([$default_format => $default_format . ' (e.g. ' . $now->format($default_format) . ')'], $date_formats); } return $date_formats; @@ -552,11 +552,11 @@ abstract class Utils /** * Truncate text by number of characters but can cut off words. * - * @param string $string - * @param int $limit Max number of characters. - * @param bool $up_to_break truncate up to breakpoint after char count - * @param string $break Break point. - * @param string $pad Appended padding to the end of the string. + * @param string $string + * @param int $limit Max number of characters. + * @param bool $up_to_break truncate up to breakpoint after char count + * @param string $break Break point. + * @param string $pad Appended padding to the end of the string. * @return string */ public static function truncate($string, $limit = 150, $up_to_break = false, $break = ' ', $pad = '…') @@ -582,7 +582,7 @@ abstract class Utils * Truncate text by number of characters in a "word-safe" manor. * * @param string $string - * @param int $limit + * @param int $limit * @return string */ public static function safeTruncate($string, $limit = 150) @@ -594,9 +594,9 @@ abstract class Utils /** * Truncate HTML by number of characters. not "word-safe"! * - * @param string $text - * @param int $length in characters - * @param string $ellipsis + * @param string $text + * @param int $length in characters + * @param string $ellipsis * @return string */ public static function truncateHtml($text, $length = 100, $ellipsis = '...') @@ -607,9 +607,9 @@ abstract class Utils /** * Truncate HTML by number of characters in a "word-safe" manor. * - * @param string $text - * @param int $length in words - * @param string $ellipsis + * @param string $text + * @param int $length in words + * @param string $ellipsis * @return string */ public static function safeTruncateHtml($text, $length = 25, $ellipsis = '...') @@ -633,8 +633,8 @@ abstract class Utils * * @param string $file the full path to the file to be downloaded * @param bool $force_download as opposed to letting browser choose if to download or render - * @param int $sec Throttling, try 0.1 for some speed throttling of downloads - * @param int $bytes Size of chunks to send in bytes. Default is 1024 + * @param int $sec Throttling, try 0.1 for some speed throttling of downloads + * @param int $bytes Size of chunks to send in bytes. Default is 1024 * @throws Exception */ public static function download($file, $force_download = true, $sec = 0, $bytes = 1024) @@ -645,7 +645,7 @@ abstract class Utils $file_parts = pathinfo($file); $mimetype = static::getMimeByExtension($file_parts['extension']); - $size = filesize($file); // File size + $size = filesize($file); // File size // clean all buffers while (ob_get_level()) { @@ -742,7 +742,7 @@ abstract class Utils // Set from uri extension $uri_extension = $uri->extension(); if (is_string($uri_extension) && $uri->isValidExtension($uri_extension)) { - return($uri_extension); + return ($uri_extension); } // Use content negotiation via the `accept:` header @@ -1060,7 +1060,7 @@ abstract class Utils $pretty_offset = "UTC${offset_prefix}${offset_formatted}"; - $timezone_list[$timezone] = "(${pretty_offset}) ".str_replace('_', ' ', $timezone); + $timezone_list[$timezone] = "(${pretty_offset}) " . str_replace('_', ' ', $timezone); } return $timezone_list; @@ -1069,11 +1069,11 @@ abstract class Utils /** * Recursively filter an array, filtering values by processing them through the $fn function argument * - * @param array $source the Array to filter - * @param callable $fn the function to pass through each array item + * @param array $source the Array to filter + * @param callable $fn the function to pass through each array item * @return array */ - public static function arrayFilterRecursive(Array $source, $fn) + public static function arrayFilterRecursive(array $source, $fn) { $result = []; foreach ($source as $key => $value) { @@ -1093,15 +1093,15 @@ abstract class Utils /** * Flatten a multi-dimensional associative array into query params. * - * @param array $array - * @param string $prepend + * @param array $array + * @param string $prepend * @return array */ public static function arrayToQueryParams($array, $prepend = '') { $results = []; foreach ($array as $key => $value) { - $name = $prepend ? $prepend . '[' . $key . ']' : $key; + $name = $prepend ? $prepend . '[' . $key . ']' : $key; if (is_array($value)) { $results = array_merge($results, static::arrayToQueryParams($value, $name)); @@ -1138,8 +1138,8 @@ abstract class Utils /** * Flatten a multi-dimensional associative array into dot notation * - * @param array $array - * @param string $prepend + * @param array $array + * @param string $prepend * @return array */ public static function arrayFlattenDotNotation($array, $prepend = '') @@ -1147,9 +1147,9 @@ abstract class Utils $results = array(); foreach ($array as $key => $value) { if (is_array($value)) { - $results = array_merge($results, static::arrayFlattenDotNotation($value, $prepend.$key.'.')); + $results = array_merge($results, static::arrayFlattenDotNotation($value, $prepend . $key . '.')); } else { - $results[$prepend.$key] = $value; + $results[$prepend . $key] = $value; } } @@ -1297,7 +1297,7 @@ abstract class Utils * with reverse proxy setups. * * @param string $action - * @param bool $previousTick if true, generates the token for the previous tick (the previous 12 hours) + * @param bool $previousTick if true, generates the token for the previous tick (the previous 12 hours) * @return string the nonce string */ private static function generateNonceString($action, $previousTick = false) @@ -1334,8 +1334,8 @@ abstract class Utils * Creates a hashed nonce tied to the passed action. Tied to the current user and time. The nonce for a given * action is the same for 12 hours. * - * @param string $action the action the nonce is tied to (e.g. save-user-admin or move-page-homepage) - * @param bool $previousTick if true, generates the token for the previous tick (the previous 12 hours) + * @param string $action the action the nonce is tied to (e.g. save-user-admin or move-page-homepage) + * @param bool $previousTick if true, generates the token for the previous tick (the previous 12 hours) * @return string the nonce */ public static function getNonce($action, $previousTick = false) @@ -1353,7 +1353,7 @@ abstract class Utils /** * Verify the passed nonce for the give action * - * @param string|string[] $nonce the nonce to verify + * @param string|string[] $nonce the nonce to verify * @param string $action the action to verify the nonce to * @return boolean verified or not */ @@ -1370,9 +1370,7 @@ abstract class Utils } //Nonce generated 12-24 hours ago - $previousTick = true; - - return $nonce === self::getNonce($action, $previousTick); + return $nonce === self::getNonce($action, true); } /** @@ -1382,11 +1380,7 @@ abstract class Utils */ public static function isAdminPlugin() { - if (isset(Grav::instance()['admin'])) { - return true; - } - - return false; + return isset(Grav::instance()['admin']); } /** @@ -1440,7 +1434,7 @@ abstract class Utils while (count($keys) > 1) { $key = array_shift($keys); - if (! isset($array[$key]) || ! is_array($array[$key])) { + if (!isset($array[$key]) || !is_array($array[$key])) { $array[$key] = array(); } @@ -1731,7 +1725,7 @@ abstract class Utils $size *= 1024 ** stripos('bkmgtpezy', $unit[0]); } - return (int) abs(round($size)); + return (int)abs(round($size)); } /** @@ -1776,7 +1770,7 @@ abstract class Utils public static function processMarkdown($string, $block = true, $page = null) { $grav = Grav::instance(); - $page = $page ?? $grav['page'] ?? null; + $page = $page ?? $grav['page'] ?? null; $defaults = [ 'markdown' => $grav['config']->get('system.pages.markdown', []), 'images' => $grav['config']->get('system.images', []) @@ -1818,12 +1812,12 @@ abstract class Utils $ip = (string)inet_pton($ip); // Maximum netmask length = same as packed address - $len = 8*strlen($ip); + $len = 8 * strlen($ip); if ($prefix > $len) { $prefix = $len; } - $mask = str_repeat('f', $prefix>>2); + $mask = str_repeat('f', $prefix >> 2); switch ($prefix & 3) { case 3: @@ -1836,7 +1830,7 @@ abstract class Utils $mask .= '8'; break; } - $mask = str_pad($mask, $len>>2, '0'); + $mask = str_pad($mask, $len >> 2, '0'); // Packed representation of netmask $mask = pack('H*', $mask); @@ -1850,11 +1844,14 @@ abstract class Utils * Wrapper to ensure html, htm in the front of the supported page types * * @param array|null $defaults - * @return array|mixed + * @return array */ public static function getSupportPageTypes(array $defaults = null) { $types = Grav::instance()['config']->get('system.pages.types', $defaults); + if (!is_array($types)) { + return []; + } // remove html/htm $types = static::arrayRemoveValue($types, ['html', 'htm']); @@ -1864,4 +1861,244 @@ abstract class Utils return $types; } + + /** + * @param string $name + * @return bool + */ + public static function isDangerousFunction(string $name): bool + { + static $commandExecutionFunctions = [ + 'exec', + 'passthru', + 'system', + 'shell_exec', + 'popen', + 'proc_open', + 'pcntl_exec', + ]; + + static $codeExecutionFunctions = [ + 'assert', + 'preg_replace', + 'create_function', + 'include', + 'include_once', + 'require', + 'require_once' + ]; + + static $callbackFunctions = [ + 'ob_start' => 0, + 'array_diff_uassoc' => -1, + 'array_diff_ukey' => -1, + 'array_filter' => 1, + 'array_intersect_uassoc' => -1, + 'array_intersect_ukey' => -1, + 'array_map' => 0, + 'array_reduce' => 1, + 'array_udiff_assoc' => -1, + 'array_udiff_uassoc' => [-1, -2], + 'array_udiff' => -1, + 'array_uintersect_assoc' => -1, + 'array_uintersect_uassoc' => [-1, -2], + 'array_uintersect' => -1, + 'array_walk_recursive' => 1, + 'array_walk' => 1, + 'assert_options' => 1, + 'uasort' => 1, + 'uksort' => 1, + 'usort' => 1, + 'preg_replace_callback' => 1, + 'spl_autoload_register' => 0, + 'iterator_apply' => 1, + 'call_user_func' => 0, + 'call_user_func_array' => 0, + 'register_shutdown_function' => 0, + 'register_tick_function' => 0, + 'set_error_handler' => 0, + 'set_exception_handler' => 0, + 'session_set_save_handler' => [0, 1, 2, 3, 4, 5], + 'sqlite_create_aggregate' => [2, 3], + 'sqlite_create_function' => 2, + ]; + + static $informationDiscosureFunctions = [ + 'phpinfo', + 'posix_mkfifo', + 'posix_getlogin', + 'posix_ttyname', + 'getenv', + 'get_current_user', + 'proc_get_status', + 'get_cfg_var', + 'disk_free_space', + 'disk_total_space', + 'diskfreespace', + 'getcwd', + 'getlastmo', + 'getmygid', + 'getmyinode', + 'getmypid', + 'getmyuid' + ]; + + static $otherFunctions = [ + 'extract', + 'parse_str', + 'putenv', + 'ini_set', + 'mail', + 'header', + 'proc_nice', + 'proc_terminate', + 'proc_close', + 'pfsockopen', + 'fsockopen', + 'apache_child_terminate', + 'posix_kill', + 'posix_mkfifo', + 'posix_setpgid', + 'posix_setsid', + 'posix_setuid', + ]; + + if (in_array($name, $commandExecutionFunctions)) { + return true; + } + + if (in_array($name, $codeExecutionFunctions)) { + return true; + } + + if (isset($callbackFunctions[$name])) { + return true; + } + + if (in_array($name, $informationDiscosureFunctions)) { + return true; + } + + if (in_array($name, $otherFunctions)) { + return true; + } + + return static::isFilesystemFunction($name); + } + + /** + * @param string $name + * @return bool + */ + public static function isFilesystemFunction(string $name): bool + { + static $fileWriteFunctions = [ + 'fopen', + 'tmpfile', + 'bzopen', + 'gzopen', + // write to filesystem (partially in combination with reading) + 'chgrp', + 'chmod', + 'chown', + 'copy', + 'file_put_contents', + 'lchgrp', + 'lchown', + 'link', + 'mkdir', + 'move_uploaded_file', + 'rename', + 'rmdir', + 'symlink', + 'tempnam', + 'touch', + 'unlink', + 'imagepng', + 'imagewbmp', + 'image2wbmp', + 'imagejpeg', + 'imagexbm', + 'imagegif', + 'imagegd', + 'imagegd2', + 'iptcembed', + 'ftp_get', + 'ftp_nb_get', + ]; + + static $fileContentFunctions = [ + 'file_get_contents', + 'file', + 'filegroup', + 'fileinode', + 'fileowner', + 'fileperms', + 'glob', + 'is_executable', + 'is_uploaded_file', + 'parse_ini_file', + 'readfile', + 'readlink', + 'realpath', + 'gzfile', + 'readgzfile', + 'stat', + 'imagecreatefromgif', + 'imagecreatefromjpeg', + 'imagecreatefrompng', + 'imagecreatefromwbmp', + 'imagecreatefromxbm', + 'imagecreatefromxpm', + 'ftp_put', + 'ftp_nb_put', + 'hash_update_file', + 'highlight_file', + 'show_source', + 'php_strip_whitespace', + ]; + + static $filesystemFunctions = [ + // read from filesystem + 'file_exists', + 'fileatime', + 'filectime', + 'filemtime', + 'filesize', + 'filetype', + 'is_dir', + 'is_file', + 'is_link', + 'is_readable', + 'is_writable', + 'is_writeable', + 'linkinfo', + 'lstat', + //'pathinfo', + 'getimagesize', + 'exif_read_data', + 'read_exif_data', + 'exif_thumbnail', + 'exif_imagetype', + 'hash_file', + 'hash_hmac_file', + 'md5_file', + 'sha1_file', + 'get_meta_tags', + ]; + + if (in_array($name, $fileWriteFunctions)) { + return true; + } + + if (in_array($name, $fileContentFunctions)) { + return true; + } + + if (in_array($name, $filesystemFunctions)) { + return true; + } + + return false; + } } diff --git a/system/src/Grav/Console/Cli/InstallCommand.php b/system/src/Grav/Console/Cli/InstallCommand.php index 08bc714..22258be 100644 --- a/system/src/Grav/Console/Cli/InstallCommand.php +++ b/system/src/Grav/Console/Cli/InstallCommand.php @@ -73,11 +73,11 @@ class InstallCommand extends GravCommand $io = $this->getIO(); $dependencies_file = '.dependencies'; - $this->destination = $input->getArgument('destination') ?: GRAV_ROOT; + $this->destination = $input->getArgument('destination') ?: GRAV_WEBROOT; // fix trailing slash $this->destination = rtrim($this->destination, DS) . DS; - $this->user_path = $this->destination . USER_PATH; + $this->user_path = $this->destination . GRAV_USER_PATH . DS; if ($local_config_file = $this->loadLocalConfig()) { $io->writeln('Read local config from ' . $local_config_file . ''); } diff --git a/system/src/Grav/Console/Gpm/InstallCommand.php b/system/src/Grav/Console/Gpm/InstallCommand.php index 202427c..92c8e07 100644 --- a/system/src/Grav/Console/Gpm/InstallCommand.php +++ b/system/src/Grav/Console/Gpm/InstallCommand.php @@ -600,7 +600,13 @@ class InstallCommand extends GpmCommand try { $output = Response::get($package->zipball_url . $query, [], [$this, 'progress']); } catch (Exception $e) { - $error = str_replace("\n", "\n | '- ", $e->getMessage()); + if (!empty($package->premium) && $e->getCode() === 401) { + $message = 'Unauthorized Premium License Key'; + } else { + $message = $e->getMessage(); + } + + $error = str_replace("\n", "\n | '- ", $message); $io->write("\x0D"); // extra white spaces to clear out the buffer properly $io->writeln(' |- Downloading package... error '); diff --git a/system/src/Grav/Console/Gpm/UninstallCommand.php b/system/src/Grav/Console/Gpm/UninstallCommand.php index ff91719..cb14c65 100644 --- a/system/src/Grav/Console/Gpm/UninstallCommand.php +++ b/system/src/Grav/Console/Gpm/UninstallCommand.php @@ -112,7 +112,7 @@ class UninstallCommand extends GpmCommand unset($this->data['not_found'], $this->data['total']); - // Plugins need to be initialized in order to make clear-cache to work. + // Plugins need to be initialized in order to make clearcache to work. try { $this->initializePlugins(); } catch (Throwable $e) { diff --git a/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php b/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php index bbc8f1a..62ed3e1 100644 --- a/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php +++ b/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php @@ -173,6 +173,7 @@ trait ControllerResponseTrait if ($method !== 'GET' && $method !== 'HEAD') { $this->setMessage($message, 'error'); $referer = $request->getHeaderLine('Referer'); + return $this->createRedirectResponse($referer, 303); } diff --git a/system/src/Grav/Framework/Flex/FlexForm.php b/system/src/Grav/Framework/Flex/FlexForm.php index 83c98d6..192f38f 100644 --- a/system/src/Grav/Framework/Flex/FlexForm.php +++ b/system/src/Grav/Framework/Flex/FlexForm.php @@ -119,7 +119,7 @@ class FlexForm implements FlexObjectFormInterface, JsonSerializable } $this->setUniqueId($uniqueId); $directory = $object->getFlexDirectory(); - $this->setFlashLookupFolder($directory->getBlueprint()->get('form/flash_folder') ?? 'tmp://forms/[SESSIONID]'); + $this->setFlashLookupFolder($options['flash_folder'] ?? $directory->getBlueprint()->get('form/flash_folder') ?? 'tmp://forms/[SESSIONID]'); $this->form = $options['form'] ?? null; if (!empty($options['reset'])) { diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index 09c5638..b65e5ae 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -196,9 +196,10 @@ class FlexObject implements FlexObjectInterface, FlexAuthorizeInterface /** * Refresh object from the storage. * + * @param bool $keepMissing * @return bool True if the object was refreshed */ - public function refresh(): bool + public function refresh(bool $keepMissing = false): bool { $key = $this->getStorageKey(); if ('' === $key) { @@ -216,20 +217,36 @@ class FlexObject implements FlexObjectInterface, FlexAuthorizeInterface return false; } + // Get current elements (if requested). + $current = $keepMissing ? $this->getElements() : []; + // Get elements from the filesystem. $elements = $storage->readRows([$key => null])[$key] ?? null; - if (null !== $elements || isset($elements['__ERROR'])) { - $meta = $elements['_META'] ?? $meta; + if (null !== $elements) { + $meta = $elements['__META'] ?? $meta; + unset($elements['__META']); $this->filterElements($elements); $newKey = $meta['key'] ?? $this->getKey(); if ($meta) { $this->setMetaData($meta); } $this->objectConstruct($elements, $newKey); - } - /** @var Debugger $debugger */ - $debugger = Grav::instance()['debugger']; - $debugger->addMessage("Refreshed {$this->getFlexType()} object {$this->getKey()}", 'debug'); + if ($current) { + // Inject back elements which are missing in the filesystem. + $data = $this->getBlueprint()->flattenData($current); + foreach ($data as $property => $value) { + if (strpos($property, '.') === false) { + $this->defProperty($property, $value); + } else { + $this->defNestedProperty($property, $value); + } + } + } + + /** @var Debugger $debugger */ + $debugger = Grav::instance()['debugger']; + $debugger->addMessage("Refreshed {$this->getFlexType()} object {$this->getKey()}", 'debug'); + } return true; } diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php index 1c32bf5..aff0257 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php @@ -320,14 +320,21 @@ trait PageLegacyTrait // Find non-existing key. $parentKey = $parent ? $parent->getKey() : ''; - $key = trim($parentKey . '/' . basename($this->getKey()), '/'); - $key = preg_replace('/-\d+$/', '', $key); - $i = 1; - do { - $i++; - $test = "{$key}-{$i}"; - } while ($index->containsKey($test)); - $key = $test; + if ($this instanceof FlexPageObject) { + $key = trim($parentKey . '/' . $this->folder(), '/'); + } else { + $key = trim($parentKey . '/' . basename($this->getKey()), '/'); + } + + if ($index->containsKey($key)) { + $key = preg_replace('/\d+$/', '', $key); + $i = 1; + do { + $i++; + $test = "{$key}{$i}"; + } while ($index->containsKey($test)); + $key = $test; + } $folder = basename($key); // Get the folder name. diff --git a/user/config/themes/antimatter.yaml b/user/config/themes/antimatter.yaml new file mode 100644 index 0000000..fdcf423 --- /dev/null +++ b/user/config/themes/antimatter.yaml @@ -0,0 +1,3 @@ +enabled: true +dropdown: + enabled: true diff --git a/user/pages/01.home/01._accueil/accueil.md b/user/pages/01.home/01._accueil/accueil.md index a132ddf..12130e9 100644 --- a/user/pages/01.home/01._accueil/accueil.md +++ b/user/pages/01.home/01._accueil/accueil.md @@ -2,6 +2,6 @@ title: Accueil body_classes: modular visible: true -debugger: true +debugger: false --- diff --git a/user/pages/01.home/02._programmes/programmes.md b/user/pages/01.home/02._programmes/programmes.md index cd7109b..a220252 100644 --- a/user/pages/01.home/02._programmes/programmes.md +++ b/user/pages/01.home/02._programmes/programmes.md @@ -14,7 +14,7 @@ programmes: site: 'http://www.popsu.archi.fr/' - nom_du_programme: 'Programme Coubertin' - texte_de_presentation: "Le programme de recherche-action Coubertin construit le récit, au fil de l’eau, de la conception des ouvrages et des opérations d’aménagement des Jeux Olympiques et Paralympiques de Paris 2024. À travers une observation embarquée au sein de la SOLIDEO, l’équipe de chercheurs analyse la production architecturale et urbaine et sa capacité à transformer les pratiques d’aménagement.\r\n \r\n " + texte_de_presentation: "Le programme de recherche-action Coubertin construit le récit, au fil de l’eau, de la conception des ouvrages et des opérations d’aménagement des Jeux Olympiques et Paralympiques de Paris 2024. À travers une observation embarquée au sein de la SOLIDEO, l’équipe de chercheurs analyse la production architecturale et urbaine et sa capacité à transformer les pratiques d’aménagement.\n \n " logo: logo_coubertin.png site: 'http://www.urbanisme-puca.gouv.fr/programme-coubertin-un-programme-de-recherche-a2089.html#:~:text=Un%20centre%20de%20ressources%20sur%20les%20Jeux%20Olympiques%20et%20Paralympiques,Olympiques%20et%20Paralympiques%20de%20Paris%E2%80%A6' - @@ -23,7 +23,7 @@ programmes: logo: forum_solution.png site: 'http://www.urbanisme-puca.gouv.fr/forums-des-solutions-en-videos-a1879.html' visible: true -debugger: true +debugger: false media_order: '14360_default_big.jpg,10361_web_01.jpg,hyperliens_marseille.PNG,popsu.png,forum_solution.png,europan_france.jpg,logo_coubertin.png,POPSU2018_LOGO_moinsde6cm.png' process: markdown: true diff --git a/user/pages/01.home/03._ressources/Couv note orientation.PNG b/user/pages/01.home/03._ressources/Couv note orientation.PNG new file mode 100644 index 0000000..29f7f3c Binary files /dev/null and b/user/pages/01.home/03._ressources/Couv note orientation.PNG differ diff --git a/user/pages/01.home/03._ressources/Couv rapport activités.PNG b/user/pages/01.home/03._ressources/Couv rapport activités.PNG new file mode 100644 index 0000000..afad2d5 Binary files /dev/null and b/user/pages/01.home/03._ressources/Couv rapport activités.PNG differ diff --git a/user/pages/01.home/03._ressources/Note d'orientation EPAU 2021-2023.pdf b/user/pages/01.home/03._ressources/Note d'orientation EPAU 2021-2023.pdf new file mode 100644 index 0000000..afdcd82 Binary files /dev/null and b/user/pages/01.home/03._ressources/Note d'orientation EPAU 2021-2023.pdf differ diff --git a/user/pages/01.home/03._ressources/Rapport d'activité EPAU 2020.pdf b/user/pages/01.home/03._ressources/Rapport d'activité EPAU 2020.pdf new file mode 100644 index 0000000..e7df107 Binary files /dev/null and b/user/pages/01.home/03._ressources/Rapport d'activité EPAU 2020.pdf differ diff --git a/user/pages/01.home/03._ressources/ressources.md b/user/pages/01.home/03._ressources/ressources.md index f9539a7..8509c9b 100644 --- a/user/pages/01.home/03._ressources/ressources.md +++ b/user/pages/01.home/03._ressources/ressources.md @@ -1,35 +1,20 @@ --- title: Ressources body_classes: modular -media_order: 'rapport_activite_V1.pdf,rapport_activite_V1.png,rapport_activite_V1.pdf' +media_order: 'Couv note orientation.PNG,Couv rapport activités.PNG,Note d''orientation EPAU 2021-2023.pdf,Rapport d''activité EPAU 2020.pdf' visible: true -debugger: true +debugger: false rapports: - - titre_du_rapport: 'rapport d''activité 2020' - texte_de_presentation: "Courte explicationVita estillis semper in fuga uxoresque mercenariae\r\n infugauxoresque mercenariae conductae ad tempus expacto atque, ut conductae ad tempus ex pacto atque, ut sit species matrimonii, dotis nomine futura coniunx hastam.\r\n" - couverture: rapport_activite_V1.png - pdf: rapport_activite_V1.pdf + titre_du_rapport: 'Rapport d''activité 2020' + texte_de_presentation: "Le rapport d’activité présente les principales actions réalisées par les programmes Europan, POPSU et Coubertin à l’occasion de l’année 2020. \n" + couverture: 'Couv rapport activités.PNG' + pdf: 'Rapport d''activité EPAU 2020.pdf' - - titre_du_rapport: 'rapport 3' - texte_de_presentation: "Courte explicationVita estillis semper in fuga uxoresque mercenariae\r\n infugauxoresque mercenariae conductae ad tempus expacto atque, ut conductae ad tempus ex pacto atque, ut sit species matrimonii, dotis nomine futura coniunx hastam.\r\n" - couverture: rapport_activite_V1.png - pdf: rapport_activite_V1.pdf - - - titre_du_rapport: 'exemple 3' - texte_de_presentation: "Courte explicationVita estillis semper in fuga uxoresque mercenariae\r\n infugauxoresque mercenariae conductae ad tempus expacto atque, ut conductae ad tempus ex pacto atque, ut sit species matrimonii, dotis nomine futura coniunx hastam.\r\n" - couverture: rapport_activite_V1.png - pdf: rapport_activite_V1.pdf - - - titre_du_rapport: 'exemple 4' - texte_de_presentation: "Courte explicationVita estillis semper in fuga uxoresque mercenariae\r\n infugauxoresque mercenariae conductae ad tempus expacto atque, ut conductae ad tempus ex pacto atque, ut sit species matrimonii, dotis nomine futura coniunx hastam.\r\n" - couverture: rapport_activite_V1.png - pdf: rapport_activite_V1.pdf - - - titre_du_rapport: 'exempl 5' - texte_de_presentation: "Courte explicationVita estillis semper in fuga uxoresque mercenariae\r\n infugauxoresque mercenariae conductae ad tempus expacto atque, ut conductae ad tempus ex pacto atque, ut sit species matrimonii, dotis nomine futura coniunx hastam.\r\n" - couverture: rapport_activite_V1.png - pdf: rapport_activite_V1.pdf + titre_du_rapport: 'Note d''orientation 2021-2023' + texte_de_presentation: "La note d’orientation présente la stratégie de l’Europe des projets architecturaux et urbains de 2021 à 2023. \n" + couverture: 'Couv note orientation.PNG' + pdf: 'Note d''orientation EPAU 2021-2023.pdf' process: markdown: true twig: false diff --git a/user/pages/01.home/04._gouvernance/01._presidence/personnes.md b/user/pages/01.home/04._gouvernance/01._presidence/personnes.md index af729ae..a9fe0da 100644 --- a/user/pages/01.home/04._gouvernance/01._presidence/personnes.md +++ b/user/pages/01.home/04._gouvernance/01._presidence/personnes.md @@ -6,7 +6,7 @@ personnes: - nom: 'Hélène Peskine' fonction: 'Secrétaire permanente du Plan Urbanisme Construction Architecture, Ministère de la Transition écologique, Ministère de la Cohésion des territoires et des Relations avec les Collectivités territoriales' - biographie: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam nec sagittis massa. Nulla facilisi. Cras id arcu lorem, et semper purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis vel enim mi, in lobortis sem. Vestibulum luctus elit eu libero ultrices id fermentum sem sagittis. Nulla imperdiet mauris sed sapien dignissim id aliquam est aliquam. Maecenas non odio ipsum, a elementum nisi. Mauris non erat eu erat placerat convallis. Mauris in pretium urna. Cras laoreet molestie odio, consequat consequat velit commodo eu. Integer vitae lectus ac nunc posuere pellentesque non at eros. Suspendisse non lectus lorem.' + biographie: null portrait: MB-3-crop.jpg admin: { } process: diff --git a/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/Alain Maugard.jpg b/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/Alain Maugard.jpg new file mode 100644 index 0000000..ed0d266 Binary files /dev/null and b/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/Alain Maugard.jpg differ diff --git a/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/catherine chevillot 274 (1).jpg b/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/catherine chevillot 274 (1).jpg new file mode 100644 index 0000000..7805dd9 Binary files /dev/null and b/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/catherine chevillot 274 (1).jpg differ diff --git a/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/personnes.md b/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/personnes.md index d4d0499..fbbbdf9 100644 --- a/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/personnes.md +++ b/user/pages/01.home/04._gouvernance/02._membres-du-conseil-dadministration/personnes.md @@ -11,22 +11,22 @@ personnes: - nom: 'Catherine Chevillot' fonction: 'Présidente de la Cité de l’Architecture et du Patrimoine' - biographie: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam nec sagittis massa. Nulla facilisi. Cras id arcu lorem, et semper purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis vel enim mi, in lobortis sem. Vestibulum luctus elit eu libero ultrices id fermentum sem sagittis. Nulla imperdiet mauris sed sapien dignissim id aliquam est aliquam. Maecenas non odio ipsum, a elementum nisi. Mauris non erat eu erat placerat convallis. Mauris in pretium urna. Cras laoreet molestie odio, consequat consequat velit commodo eu. Integer vitae lectus ac nunc posuere pellentesque non at eros. Suspendisse non lectus lorem.' - portrait: catherine-chevillot-nouvelle-presidente-de-cite.JPG + biographie: 'Conservateur du patrimoine depuis 1987, Catherine Chevillot a été successivement adjointe au directeur du musée de Grenoble (1988), conservateur au musée d’Orsay (1990), chef de la filière Sculpture au Centre de Recherche et de Restauration des Musées de France (1999), chef du service de la recherche du musée d’Orsay, où elle a créé le Prix du musée d’Orsay (2003), conservateur en chef au musée d’Orsay (2012) et directrice du musée Rodin (2012). Après trois mandats au musée Rodin, sur proposition de la ministre de la Culture Roselyne Bachelot-Narquin, elle accède le 8 mars 2021 à la présidence de la Cité de l’architecture & du patrimoine.' + portrait: 'catherine chevillot 274 (1).jpg' - nom: 'Aurélie Cousi' fonction: 'Directrice, adjointe au directeur général des patrimoines, chargée de l’architecture, Ministère de la Culture' - biographie: "Aurélie Cousi a rejoint le ministère de la Culture le 1 er février 2020 dans les fonctions de directrice, adjointe au directeur général des patrimoines, chargée de l’architecture. Diplômée de l’École polytehnique et ingénieure en chef des ponts, des eaux et des forêts, elle exerce depuis 15 ans au sein de l’État, de ses établissements publics et des collectivités dans les domaines de l’aménagement, l’urbanisme et la construction publique. \r\nCheffe de la mission immobilière auprès du directeur régional et interdépartementale de l’écologie et de l’aménagement d’Île-de-France de 2007 à 2009, puis directrice adjointe en charge de la stratégie opérationnelle à la direction de l’immobilier de l’établissement public Paris-Saclay, en charge du pilotage des projets de construction des grandes écoles et universités, Aurélie Cousi est nommée conseillère en charge de l’urbanisme au cabinet du maire de Paris en 2013, avant de prendre la direction du service de l’aménagement à la direction de l’urbanisme de 2015 à 2017. Depuis juillet 2017, elle était directrice générale adjointe en charge de l’aménagement au sein de Grand Paris Aménagement." + biographie: "Aurélie Cousi a rejoint le ministère de la Culture le 1 er février 2020 dans les fonctions de directrice, adjointe au directeur général des patrimoines, chargée de l’architecture. Diplômée de l’École polytehnique et ingénieure en chef des ponts, des eaux et des forêts, elle exerce depuis 15 ans au sein de l’État, de ses établissements publics et des collectivités dans les domaines de l’aménagement, l’urbanisme et la construction publique. \nCheffe de la mission immobilière auprès du directeur régional et interdépartementale de l’écologie et de l’aménagement d’Île-de-France de 2007 à 2009, puis directrice adjointe en charge de la stratégie opérationnelle à la direction de l’immobilier de l’établissement public Paris-Saclay, en charge du pilotage des projets de construction des grandes écoles et universités, Aurélie Cousi est nommée conseillère en charge de l’urbanisme au cabinet du maire de Paris en 2013, avant de prendre la direction du service de l’aménagement à la direction de l’urbanisme de 2015 à 2017. Depuis juillet 2017, elle était directrice générale adjointe en charge de l’aménagement au sein de Grand Paris Aménagement." portrait: aurelie-cousi-nommee-aux-fonctions-de-directrice.jpg - nom: 'Alain Maugard' fonction: 'Président de l’Association Europan France' - biographie: "Né le 23 avril 1943 à Nérac (Lot-et-Garonne), Alain Maugard est un ancien élève de l’École polytechnique et Ingénieur général des Ponts et Chaussées. Il débute sa carrière au ministère de l’Équipement au service des Affaires économiques et internationales et dans les services urbanisme construction des Directions Départementales. Chef du service de la politique technique à la direction de la Construction et secrétaire permanent du Plan Construction, de 1978 à 1981, il devient successivement directeur adjoint de cabinet des ministres de l’Urbanisme et du Logement Roger Quilliot et Paul Quilès puis directeur de la Construction au ministère de l’Équipement, du Logement, des Transports et de la Mer. En 1990, il est nommé directeur général de l’Établissement public d’aménagement de la Défense (epad), jusqu’en 1993 où il prend la présidence du cstb. Il quitte ces fonctions en 2008 pour rejoindre le Conseil général de l’environnement et du développement durable où il assure la présidence de la section « risques, sécurité, sûreté ». En septembre 2009, il accède à la présidence de Qualibat. \r\nEn outre, Alain Maugard est membre du conseil d’administration de l’Ademe. Il a également piloté le Comité opérationnel (comop) du chantier n°1 « Bâtiments neufs publics et privés » du Grenelle de l’Environnement. \r\n\r\nBibliographie\_:\r\n- Regards sur le bâtiment — Le futur en construction, éditions Le Moniteur, 2006\r\n - Regard sur la ville durable, Alain Maugard et Jean-Pierre Cuisinier, CSTB, mars 2010\r\n - Le BEPOS pour tous (livre électronique), http://outils.xpair.com/livre/bepos-pourtous/7.htm (25 juin 2015)" - portrait: 'Alain Maugard_TROUVE.jpg' + biographie: "Né le 23 avril 1943 à Nérac (Lot-et-Garonne), Alain Maugard est un ancien élève de l’École polytechnique et Ingénieur général des Ponts et Chaussées. Il débute sa carrière au ministère de l’Équipement au service des Affaires économiques et internationales et dans les services urbanisme construction des Directions Départementales. Chef du service de la politique technique à la direction de la Construction et secrétaire permanent du Plan Construction, de 1978 à 1981, il devient successivement directeur adjoint de cabinet des ministres de l’Urbanisme et du Logement Roger Quilliot et Paul Quilès puis directeur de la Construction au ministère de l’Équipement, du Logement, des Transports et de la Mer. En 1990, il est nommé directeur général de l’Établissement public d’aménagement de la Défense (epad), jusqu’en 1993 où il prend la présidence du cstb. Il quitte ces fonctions en 2008 pour rejoindre le Conseil général de l’environnement et du développement durable où il assure la présidence de la section « risques, sécurité, sûreté ». En septembre 2009, il accède à la présidence de Qualibat et de l'association Europan France. \nEn outre, Alain Maugard est membre du conseil d’administration de l’Ademe. Il a également piloté le Comité opérationnel (comop) du chantier n°1 « Bâtiments neufs publics et privés » du Grenelle de l’Environnement. " + portrait: 'Alain Maugard.jpg' debugger: true template: modular/personnes -media_order: 'photo_butlen.jpeg,aurelie-cousi-nommee-aux-fonctions-de-directrice.jpg,catherine-chevillot-nouvelle-presidente-de-cite.JPG,Alain Maugard_TROUVE.jpg' +media_order: 'photo_butlen.jpeg,aurelie-cousi-nommee-aux-fonctions-de-directrice.jpg,catherine chevillot 274 (1).jpg,Alain Maugard.jpg' --- -### Membres de l'assemblée générale du Groupement d’intérêt public Europe des projets architecturaux et urbains +### Membres de l'assemblée générale de l'Europe des projets architecturaux et urbains diff --git a/user/pages/01.home/04._gouvernance/03._equipe-epau/01._direction-generale-epau/personnes.md b/user/pages/01.home/04._gouvernance/03._equipe-epau/01._direction-generale-epau/personnes.md index 9f08eef..298edfb 100644 --- a/user/pages/01.home/04._gouvernance/03._equipe-epau/01._direction-generale-epau/personnes.md +++ b/user/pages/01.home/04._gouvernance/03._equipe-epau/01._direction-generale-epau/personnes.md @@ -5,17 +5,17 @@ personnes: - nom: 'Jean-Baptiste Marie' fonction: 'Directeur général Intégrer la bio du conseil stratégique POPSU' - biographie: "Jean-Baptiste MARIE, architecte, docteur en architecture, diplômé de l’Ecole nationale supérieure d’architecture de Versailles et de l’Ecole Boulle. Il est directeur de la Plateforme d'observation des projets et stratégies urbaines pilotée par le Puca (Plan Urbanisme Construction Architecture) au Ministère de la Transition écologique et au Ministère \Lde la Cohésion des territoires et des Relations avec les collectivités territoriales, au sein du GIP Europe des projets architecturaux et urbains (EPAU).\r\nIl assurait auparavant, depuis 2008, le secrétariat scientifique de la plateforme européenne Popsu et depuis 2011 de la plateforme française. Il est par ailleurs Professeur des Écoles nationales supérieures d'architecture (Ensa) où il enseigne dans le champ Théories et pratiques de la conception architecturale et urbaine à l'Ensa de Clermont-Ferrand et y dirige l’équipe de recherche Ressources. Il a auparavant enseigné dans les Ensa de Normandie et de Versailles.\r\njean-baptiste.marie@developpement-durable.gouv.fr\r\n+\_33\_(1)\_40\_81\_24\_68\_\r\n+\_33\_(6)\_64\_52\_75\_57" + biographie: "Jean-Baptiste MARIE, architecte, docteur en architecture, diplômé de l’Ecole nationale supérieure d’architecture de Versailles et de l’Ecole Boulle. Il est directeur de la Plateforme d'observation des projets et stratégies urbaines pilotée par le Puca (Plan Urbanisme Construction Architecture) au Ministère de la Transition écologique et au Ministère \Lde la Cohésion des territoires et des Relations avec les collectivités territoriales, au sein du GIP Europe des projets architecturaux et urbains (EPAU).\nIl assurait auparavant, depuis 2008, le secrétariat scientifique de la plateforme européenne Popsu et depuis 2011 de la plateforme française. Il est par ailleurs Professeur des Écoles nationales supérieures d'architecture (Ensa) où il enseigne dans le champ Théories et pratiques de la conception architecturale et urbaine à l'Ensa de Clermont-Ferrand et y dirige l’équipe de recherche Ressources. Il a auparavant enseigné dans les Ensa de Normandie et de Versailles.\njean-baptiste.marie@developpement-durable.gouv.fr\n+\_33\_(1)\_40\_81\_24\_68\_\n+\_33\_(6)\_64\_52\_75\_57" portrait: jb_marie_crop.jpg - nom: 'Fabienne Dran' fonction: 'Assistante de direction' - biographie: "Fabienne.Dran@developpement-durable.gouv.fr \r\n+ 33 (0)1 40 81 93 27\r\n+33 (0)7 86 50 33 31" + biographie: "Fabienne.Dran@developpement-durable.gouv.fr \n+ 33 (0)1 40 81 93 27\n+33 (0)7 86 50 33 31" portrait: null - nom: 'Jérôme Candevan' fonction: 'Responsable du service financier et facturier de l’EPAU, Agent comptable ENSA' - biographie: "jerome.candevan@paris-lavillette.archi.fr \r\n+33 (0)6 26 04 82 09\r\n" + biographie: "jerome.candevan@paris-lavillette.archi.fr \n+33 (0)6 26 04 82 09\n" portrait: null media_order: jb_marie_crop.jpg --- diff --git a/user/pages/01.home/04._gouvernance/03._equipe-epau/02._direction-europan-france/Louis Vitalis.png b/user/pages/01.home/04._gouvernance/03._equipe-epau/02._direction-europan-france/Louis Vitalis.png new file mode 100644 index 0000000..e54d4b8 Binary files /dev/null and b/user/pages/01.home/04._gouvernance/03._equipe-epau/02._direction-europan-france/Louis Vitalis.png differ diff --git a/user/pages/01.home/04._gouvernance/03._equipe-epau/02._direction-europan-france/personnes.md b/user/pages/01.home/04._gouvernance/03._equipe-epau/02._direction-europan-france/personnes.md index c17ce1f..d24cdf5 100644 --- a/user/pages/01.home/04._gouvernance/03._equipe-epau/02._direction-europan-france/personnes.md +++ b/user/pages/01.home/04._gouvernance/03._equipe-epau/02._direction-europan-france/personnes.md @@ -5,24 +5,24 @@ personnes: - nom: 'Isabelle Moulin' fonction: 'Secrétaire générale de l’Association Europan France, Directrice du programme Europan ' - biographie: "Isabelle Moulin a travaillé avec des agences telles que\_Guy Naizot&Ass., Atelier Ruelle, Latitude Nord, Christian Devillers&Ass., en tant que cheffe de projet conception et réalisation d'espaces publics et de paysage. Elle a exercé la profession d'architecte libérale, pour la réalisation (réhabilitation /reconstruction/ aménagement) de petits équipements publics (maison des associations, halte-garderie, atelier de mécanique, projets d'aménagements paysagers) et de réalisations architecturales privées (maisons d'habitation, réhabilitations intérieures, Bureau de Presse). L'imbrication des échelles de projets, les différents types de gouvernance rencontrés, la multiple dimension à la fois urbaine, paysagère et architecturale des projets étudiés et réalisés, des relations avec un large réseau d'acteurs urbains et architecturaux, l'ont amenée à se présenter à\_la direction du concours Europan en 2012. Elle est actuellement secrétaire générale de l'association Europan France, et mise à disposition pour la direction du programme Europan auprès du GIP EPAU, l'association étant membre fondatrice de cette structure.\r\n\r\ni.moulin@europanfrance.org\r\n+33 (0)6 42 65 75 04\r\n+33 (0)1 48 57 72 66" + biographie: "Isabelle Moulin a travaillé avec des agences telles que\_Guy Naizot&Ass., Atelier Ruelle, Latitude Nord, Christian Devillers&Ass., en tant que cheffe de projet conception et réalisation d'espaces publics et de paysage. Elle a exercé la profession d'architecte libérale, pour la réalisation (réhabilitation /reconstruction/ aménagement) de petits équipements publics (maison des associations, halte-garderie, atelier de mécanique, projets d'aménagements paysagers) et de réalisations architecturales privées (maisons d'habitation, réhabilitations intérieures, Bureau de Presse). L'imbrication des échelles de projets, les différents types de gouvernance rencontrés, la multiple dimension à la fois urbaine, paysagère et architecturale des projets étudiés et réalisés, des relations avec un large réseau d'acteurs urbains et architecturaux, l'ont amenée à se présenter à\_la direction du concours Europan en 2012. Elle est actuellement secrétaire générale de l'association Europan France, et mise à disposition pour la direction du programme Europan auprès du GIP EPAU, l'association étant membre fondatrice de cette structure.\n\ni.moulin@europanfrance.org\n+33 (0)6 42 65 75 04\n+33 (0)1 48 57 72 66" portrait: 'Isabelle Moulin.jpg' - nom: 'Louis Vitalis' fonction: 'Chargé de missions' - biographie: " • Photo et bio demandées\r\nl.vitalis@europanfrance.org \r\n+33 (0)1 48 57 72 66" - portrait: null + biographie: "Architecte formé à l'ENSA Paris Val de Seine, Docteur en architecture du Conservatoire National des Arts et Métiers et de l'UMR MAP (Modèles et simulations pour l'Architecture et le Patrimoine), Louis Vitalis est également enseignant-chercheur à l'ENSA Paris La Villette.\n\nl.vitalis@europanfrance.org \n+33 (0)1 48 57 72 66" + portrait: 'Louis Vitalis.png' - nom: 'Mimrose Akbar' fonction: 'Assistante de projets' - biographie: " • Photo et bio demandées\r\nm.akbar@europanfrance.org \r\n+33 (0)1 48 57 72 66" + biographie: " \nm.akbar@europanfrance.org \n+33 (0)1 48 57 72 66" portrait: null - nom: 'Mathilde Morize' fonction: 'Chargée de projet ' - biographie: "m.morize@europanfrance.org \r\n+33 (0)1 48 57 72 66\r\n Photo et bio demandées" + biographie: "m.morize@europanfrance.org \n+33 (0)1 48 57 72 66\n" portrait: null -media_order: 'Isabelle Moulin.jpg' +media_order: 'Isabelle Moulin.jpg,Louis Vitalis.png' --- ### Direction du programme Europan France \ No newline at end of file diff --git a/user/pages/01.home/04._gouvernance/03._equipe-epau/04._direction-coubertin/personnes.md b/user/pages/01.home/04._gouvernance/03._equipe-epau/04._direction-coubertin/personnes.md index 7513429..9ea8eae 100644 --- a/user/pages/01.home/04._gouvernance/03._equipe-epau/04._direction-coubertin/personnes.md +++ b/user/pages/01.home/04._gouvernance/03._equipe-epau/04._direction-coubertin/personnes.md @@ -5,7 +5,7 @@ personnes: - nom: 'Julien Moulard' fonction: 'Responsable de programme' - biographie: " Photo et bio demandées\r\njulien.moulard@popsu.archi.fr\r\n+ 33 (0)1 40 81 70 72\r\n+ 33 (0)7 86 50 43 17" + biographie: "julien.moulard@popsu.archi.fr\n+ 33 (0)1 40 81 70 72\n+ 33 (0)7 86 50 43 17" portrait: null --- diff --git a/user/pages/01.home/04._gouvernance/gouvernance.md b/user/pages/01.home/04._gouvernance/gouvernance.md index b4ca81d..3f03b1c 100644 --- a/user/pages/01.home/04._gouvernance/gouvernance.md +++ b/user/pages/01.home/04._gouvernance/gouvernance.md @@ -15,7 +15,6 @@ content: - _equipe-epau admin: children_display_order: collection -debugger: true +debugger: false --- - diff --git a/user/pages/01.home/05._contact/text.md b/user/pages/01.home/05._contact/text.md index 675045f..640fa1b 100644 --- a/user/pages/01.home/05._contact/text.md +++ b/user/pages/01.home/05._contact/text.md @@ -1,8 +1,9 @@ --- title: Contact body_classes: modular -media_order: 'puca.png,logo cité archi.jpg,logo ministère culture.png,europan_france.jpg,logo_gouvernment.png,logo MCTRCT.png,logo min logement.png' +media_order: 'logo_gouvernment.png,logo MCTRCT.png,logo min logement.png,logo ministère culture.png,europan_france.jpg,puca.png,logo cité archi.jpg' published: true +debugger: false --- -![logo_gouvernment](logo_gouvernment.png "logo_gouvernment") ![logo%20MCTRCT](logo%20MCTRCT.png "logo%20MCTRCT") ![logo%20minist%C3%A8re%20culture](logo%20minist%C3%A8re%20culture.png "logo%20minist%C3%A8re%20culture") ![logo%20min%20logement](logo%20min%20logement.png "logo%20min%20logement") ![europan_france](europan_france.jpg "europan_france") ![puca](puca.png "puca") ![logo%20cit%C3%A9%20archi](logo%20cit%C3%A9%20archi.jpg "logo%20cit%C3%A9%20archi") \ No newline at end of file +![logo_gouvernment](logo_gouvernment.png "logo_gouvernment")![logo%20MCTRCT](logo%20MCTRCT.png "logo%20MCTRCT")![logo%20minist%C3%A8re%20culture](logo%20minist%C3%A8re%20culture.png "logo%20minist%C3%A8re%20culture") ![logo%20min%20logement](logo%20min%20logement.png "logo%20min%20logement")![europan_france](europan_france.jpg "europan_france") ![puca](puca.png "puca")![logo%20cit%C3%A9%20archi](logo%20cit%C3%A9%20archi.jpg "logo%20cit%C3%A9%20archi") diff --git a/user/themes/antimatter/.gitignore b/user/themes/antimatter/.gitignore new file mode 100644 index 0000000..4b11432 --- /dev/null +++ b/user/themes/antimatter/.gitignore @@ -0,0 +1,2 @@ +.sass-cache +.DS_Store diff --git a/user/themes/antimatter/CHANGELOG.md b/user/themes/antimatter/CHANGELOG.md index 0aa0b57..bc879df 100644 --- a/user/themes/antimatter/CHANGELOG.md +++ b/user/themes/antimatter/CHANGELOG.md @@ -1,3 +1,83 @@ +# v2.2.1 +## 01/15/2021 + +1. [](#improved) + * Fixed autoescaping in preparation for Grav 1.7 +1. [](#bugfix) + * Fix deprecated messages from macros [#140](https://github.com/getgrav/grav-theme-antimatter/issues/140) + +# v2.2.0 +## 03/21/2019 + +1. [](#new) + * Set Dependency of Grav 1.5.10+ which has support for new **Deferred Block** Twig extension + * Implement assets rendering using **Deferred Block** Twig extension + +# v2.1.2 +## 9/28/2017 + +1. [](#improved) + * Added polish and brazilian portuguese translations + * Allow overriding the slidebar by moving it to its own `sidebar_navigation` block [#110](https://github.com/getgrav/grav-theme-antimatter/pull/110) +1. [](#bugfix) + * Fix showcase template overlapping when not at top [#99](https://github.com/getgrav/grav-theme-antimatter/pull/99) + +# v2.1.1 +## 02/26/2017 + +1. [](#bugfix) + * Allow to add a `external` class to site.yaml links to work on modular pages [#95](https://github.com/getgrav/grav-theme-antimatter/pull/95) + +# v2.1.0 +## 01/24/2017 + +1. [](#new) + * Updated to FontAwesome 4.7.0 with [Grav icon](http://fontawesome.io/icon/grav/) +1. [](#improved) + * Added croatian + * Changed "SimpleSearch" string in the sidebar to "Search" +1. [](#bugfix) + * Removed unreachable condition [#85](https://github.com/getgrav/grav-theme-antimatter/pull/85) + * Fixed a typo in the french translation + +# v2.0.0 +## 07/14/2016 + +1. [](#new) + * Added microformats2 support [#64](https://github.com/getgrav/grav-theme-antimatter/pull/64) +1. [](#improved) + * Updated to FontAwesome 4.6.3 + * Added romanian, russian and ukranian + +# v2.0.0-beta.1 +## 05/23/2016 + +1. [](#new) + * New and improved **dropdown** styling +1. [](#improved) + * Removed templates from `form` + `snipcart` plugins + * Added support for search button + * Updated some translations + * Automatically add comments if configured + * Relative path for favicon + * Slightly modified the blockquote background color + * Removed unneeded streams from YAML + * Use common language strings in Blueprint + +# v1.8.0 +## 11/20/2015 + +1. [](#new) + * Added logic to include site.menu items in modular pages + * Added a configurable lang field for HTML tag + * Added a `bottom` JS output call +1. [](#improved) + * Updated to FontAwesome 4.4.0 +1. [](#bugfix) + * Fixed extra `/` in some tag URLs + * Better support for PECL Yaml parser + * Fixes for blog page blueprint + # v1.7.6 ## 10/07/2015 @@ -46,7 +126,7 @@ 1. [](#new) * Blueprints that work with new admin plugin! 1. [](#bugfix) - * Favicon with full image URL + * Favicon with full image URL # v1.6.1 ## 07/24/2015 diff --git a/user/themes/antimatter/antimatter.yaml b/user/themes/antimatter/antimatter.yaml index 70ee849..2876588 100644 --- a/user/themes/antimatter/antimatter.yaml +++ b/user/themes/antimatter/antimatter.yaml @@ -1,10 +1,3 @@ enabled: true dropdown: enabled: false - -streams: - schemes: - theme: - type: ReadOnlyStream - paths: - - user/themes/antimatter diff --git a/user/themes/antimatter/blueprints.yaml b/user/themes/antimatter/blueprints.yaml index 2a93f71..ab0508f 100644 --- a/user/themes/antimatter/blueprints.yaml +++ b/user/themes/antimatter/blueprints.yaml @@ -1,5 +1,5 @@ name: Antimatter -version: 1.7.6 +version: 2.2.1 description: "Antimatter is the default theme included with **Grav**" icon: empire author: @@ -12,6 +12,9 @@ keywords: antimatter, theme, core, modern, fast, responsive, html5, css3 bugs: https://github.com/getgrav/grav-theme-antimatter/issues license: MIT +dependencies: + - { name: grav, version: '>=1.5.10' } + form: validation: loose fields: @@ -21,7 +24,7 @@ form: highlight: 1 default: 1 options: - 1: Enabled - 0: Disabled + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED validate: type: bool diff --git a/user/themes/antimatter/blueprints/asset/file.yaml b/user/themes/antimatter/blueprints/asset/file.yaml index e1f5005..7226c11 100644 --- a/user/themes/antimatter/blueprints/asset/file.yaml +++ b/user/themes/antimatter/blueprints/asset/file.yaml @@ -26,9 +26,9 @@ form: type: upload label: Upload allow: - @media.*.keys + '@media.*.keys' accept: - @media.*.values + '@media.*.values' filename: type: text diff --git a/user/themes/antimatter/blueprints/blog.yaml b/user/themes/antimatter/blueprints/blog.yaml index b5937f9..0abdab1 100644 --- a/user/themes/antimatter/blueprints/blog.yaml +++ b/user/themes/antimatter/blueprints/blog.yaml @@ -1,5 +1,5 @@ title: Blog -@extends: +'@extends': type: default context: blueprints://pages @@ -33,11 +33,10 @@ form: fields: header.content.items: - type: select + type: textarea + yaml: true label: Items - default: @self.children - options: - @self.children: Children + default: '@self.children' header.content.limit: type: text @@ -72,5 +71,19 @@ form: highlight: 1 default: 1 options: - 1: Enabled - 0: Disabled + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + + + header.content.url_taxonomy_filters: + type: toggle + label: URL Taxonomy Filters + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool diff --git a/user/themes/antimatter/blueprints/form.yaml b/user/themes/antimatter/blueprints/form.yaml index a3434a1..71e2a19 100644 --- a/user/themes/antimatter/blueprints/form.yaml +++ b/user/themes/antimatter/blueprints/form.yaml @@ -1,2 +1,2 @@ title: Nopad -@extends: default +'@extends': default diff --git a/user/themes/antimatter/blueprints/item.yaml b/user/themes/antimatter/blueprints/item.yaml index e0a2350..f4dc9c3 100644 --- a/user/themes/antimatter/blueprints/item.yaml +++ b/user/themes/antimatter/blueprints/item.yaml @@ -1,5 +1,5 @@ title: Item -@extends: +'@extends': type: default context: blueprints://pages @@ -26,8 +26,8 @@ form: help: Enabled displaying of a header image highlight: 1 options: - 1: Enabled - 0: Disabled + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED header.header_image_file: type: text @@ -73,8 +73,8 @@ form: label: Summary highlight: 1 options: - 1: Enabled - 0: Disabled + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED header.summary.format: type: select diff --git a/user/themes/antimatter/blueprints/modular/features.yaml b/user/themes/antimatter/blueprints/modular/features.yaml index 2c92ac5..efa8d89 100644 --- a/user/themes/antimatter/blueprints/modular/features.yaml +++ b/user/themes/antimatter/blueprints/modular/features.yaml @@ -1,5 +1,5 @@ title: Features -@extends: default +'@extends': default form: fields: @@ -13,12 +13,12 @@ form: fields: name: default: modular/features - @data-options: '\Grav\Common\Page\Pages::modularTypes' + '@data-options': '\Grav\Common\Page\Pages::modularTypes' overrides: fields: header.template: default: modular/features - @data-options: '\Grav\Common\Page\Pages::modularTypes' + '@data-options': '\Grav\Common\Page\Pages::modularTypes' features: type: tab title: Features diff --git a/user/themes/antimatter/blueprints/modular/showcase.yaml b/user/themes/antimatter/blueprints/modular/showcase.yaml index 785b6de..99019db 100644 --- a/user/themes/antimatter/blueprints/modular/showcase.yaml +++ b/user/themes/antimatter/blueprints/modular/showcase.yaml @@ -1,5 +1,5 @@ title: Showcase -@extends: default +'@extends': default form: fields: @@ -13,12 +13,12 @@ form: fields: name: default: modular/showcase - @data-options: '\Grav\Common\Page\Pages::modularTypes' + '@data-options': '\Grav\Common\Page\Pages::modularTypes' overrides: fields: header.template: default: modular/showcase - @data-options: '\Grav\Common\Page\Pages::modularTypes' + '@data-options': '\Grav\Common\Page\Pages::modularTypes' buttons: type: tab title: Buttons @@ -38,8 +38,9 @@ form: type: toggle label: Primary highlight: 1 + default: 1 options: - 1: Yes - 0: No + 1: 'Yes' + 0: 'No' validate: type: bool diff --git a/user/themes/antimatter/blueprints/modular/text.yaml b/user/themes/antimatter/blueprints/modular/text.yaml index 7defa88..7fbf21f 100644 --- a/user/themes/antimatter/blueprints/modular/text.yaml +++ b/user/themes/antimatter/blueprints/modular/text.yaml @@ -1,5 +1,5 @@ title: Text -@extends: default +'@extends': default form: fields: @@ -13,12 +13,12 @@ form: fields: name: default: modular/text - @data-options: '\Grav\Common\Page\Pages::modularTypes' + '@data-options': '\Grav\Common\Page\Pages::modularTypes' overrides: fields: header.template: default: modular/text - @data-options: '\Grav\Common\Page\Pages::modularTypes' + '@data-options': '\Grav\Common\Page\Pages::modularTypes' content: fields: uploads: diff --git a/user/themes/antimatter/css-compiled/nucleus.css b/user/themes/antimatter/css-compiled/nucleus.css index 3643d5d..fe4c0bb 100644 --- a/user/themes/antimatter/css-compiled/nucleus.css +++ b/user/themes/antimatter/css-compiled/nucleus.css @@ -1,629 +1,3 @@ -*, *::before, *::after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; } +*,*::before,*::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-webkit-viewport{width:device-width}@-moz-viewport{width:device-width}@-ms-viewport{width:device-width}@-o-viewport{width:device-width}@viewport{width:device-width}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent;text-decoration:none}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}mark{background:#ff0;color:#000}sub,sup{font-size:.75rem;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0}pre{overflow:auto}code,kbd,pre,samp{font-size:1rem}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0;table-layout:fixed;width:100%}tr,td,th{vertical-align:middle}th,td{padding:.425rem 0}th{text-align:left}.container{width:75em;margin:0 auto;padding:0}@media only all and (min-width: 60em) and (max-width: 74.938em){.container{width:60em}}@media only all and (min-width: 48em) and (max-width: 59.938em){.container{width:48em}}@media only all and (min-width: 30.063em) and (max-width: 47.938em){.container{width:30em}}@media only all and (max-width: 30em){.container{width:100%}}.grid{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-moz-flex-flow:row;flex-flow:row;list-style:none;margin:0;padding:0}@media only all and (max-width: 47.938em){.grid{-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;flex-flow:row wrap}}.block{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;-webkit-flex:1;-moz-flex:1;-ms-flex:1;flex:1;min-width:0;min-height:0}@media only all and (max-width: 47.938em){.block{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 100%;-moz-flex:0 100%;-ms-flex:0 100%;flex:0 100%}}.content{margin:.625rem;padding:.938rem}@media only all and (max-width: 47.938em){body [class*="size-"]{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 100%;-moz-flex:0 100%;-ms-flex:0 100%;flex:0 100%}}.size-1-2{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 50%;-moz-flex:0 50%;-ms-flex:0 50%;flex:0 50%}.size-1-3{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 33.33333%;-moz-flex:0 33.33333%;-ms-flex:0 33.33333%;flex:0 33.33333%}.size-1-4{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 25%;-moz-flex:0 25%;-ms-flex:0 25%;flex:0 25%}.size-1-5{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 20%;-moz-flex:0 20%;-ms-flex:0 20%;flex:0 20%}.size-1-6{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 16.66667%;-moz-flex:0 16.66667%;-ms-flex:0 16.66667%;flex:0 16.66667%}.size-1-7{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 14.28571%;-moz-flex:0 14.28571%;-ms-flex:0 14.28571%;flex:0 14.28571%}.size-1-8{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 12.5%;-moz-flex:0 12.5%;-ms-flex:0 12.5%;flex:0 12.5%}.size-1-9{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 11.11111%;-moz-flex:0 11.11111%;-ms-flex:0 11.11111%;flex:0 11.11111%}.size-1-10{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 10%;-moz-flex:0 10%;-ms-flex:0 10%;flex:0 10%}.size-1-11{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 9.09091%;-moz-flex:0 9.09091%;-ms-flex:0 9.09091%;flex:0 9.09091%}.size-1-12{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 8.33333%;-moz-flex:0 8.33333%;-ms-flex:0 8.33333%;flex:0 8.33333%}@media only all and (min-width: 48em) and (max-width: 59.938em){.size-tablet-1-2{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 50%;-moz-flex:0 50%;-ms-flex:0 50%;flex:0 50%}.size-tablet-1-3{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 33.33333%;-moz-flex:0 33.33333%;-ms-flex:0 33.33333%;flex:0 33.33333%}.size-tablet-1-4{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 25%;-moz-flex:0 25%;-ms-flex:0 25%;flex:0 25%}.size-tablet-1-5{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 20%;-moz-flex:0 20%;-ms-flex:0 20%;flex:0 20%}.size-tablet-1-6{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 16.66667%;-moz-flex:0 16.66667%;-ms-flex:0 16.66667%;flex:0 16.66667%}.size-tablet-1-7{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 14.28571%;-moz-flex:0 14.28571%;-ms-flex:0 14.28571%;flex:0 14.28571%}.size-tablet-1-8{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 12.5%;-moz-flex:0 12.5%;-ms-flex:0 12.5%;flex:0 12.5%}.size-tablet-1-9{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 11.11111%;-moz-flex:0 11.11111%;-ms-flex:0 11.11111%;flex:0 11.11111%}.size-tablet-1-10{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 10%;-moz-flex:0 10%;-ms-flex:0 10%;flex:0 10%}.size-tablet-1-11{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 9.09091%;-moz-flex:0 9.09091%;-ms-flex:0 9.09091%;flex:0 9.09091%}.size-tablet-1-12{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 8.33333%;-moz-flex:0 8.33333%;-ms-flex:0 8.33333%;flex:0 8.33333%}}@media only all and (max-width: 47.938em){@supports not (flex-wrap: wrap){.grid{display:block;-webkit-box-lines:inherit;-moz-box-lines:inherit;box-lines:inherit;-webkit-flex-wrap:inherit;-moz-flex-wrap:inherit;-ms-flex-wrap:inherit;flex-wrap:inherit}.block{display:block;-webkit-box-flex:inherit;-moz-box-flex:inherit;box-flex:inherit;-webkit-flex:inherit;-moz-flex:inherit;-ms-flex:inherit;flex:inherit}}}.first-block{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.last-block{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.fixed-blocks{-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;flex-flow:row wrap}.fixed-blocks .block{-webkit-box-flex:inherit;-moz-box-flex:inherit;box-flex:inherit;-webkit-flex:inherit;-moz-flex:inherit;-ms-flex:inherit;flex:inherit;width:25%}@media only all and (min-width: 60em) and (max-width: 74.938em){.fixed-blocks .block{width:33.33333%}}@media only all and (min-width: 48em) and (max-width: 59.938em){.fixed-blocks .block{width:50%}}@media only all and (max-width: 47.938em){.fixed-blocks .block{width:100%}}@supports not (flex-wrap: wrap){.fixed-blocks{display:block;-webkit-flex-flow:inherit;-moz-flex-flow:inherit;flex-flow:inherit}}body{font-size:1rem;line-height:1.7}h1,h2,h3,h4,h5,h6{margin:.85rem 0 1.7rem 0;text-rendering:optimizeLegibility}h1{font-size:3.2rem}h2{font-size:2.5rem}h3{font-size:2.1rem}h4{font-size:1.75rem}h5{font-size:1.35rem}h6{font-size:.85rem}p{margin:1.7rem 0}ul,ol{margin-top:1.7rem;margin-bottom:1.7rem}ul ul,ul ol,ol ul,ol ol{margin-top:0;margin-bottom:0}blockquote{margin:1.7rem 0;padding-left:.85rem}cite{display:block;font-size:.875rem}cite:before{content:"\2014 \0020"}pre{margin:1.7rem 0;padding:.938rem}code{vertical-align:bottom}small{font-size:.875rem}hr{border-left:none;border-right:none;border-top:none;margin:1.7rem 0}fieldset{border:0;padding:.938rem;margin:0 0 1.7rem 0}input,label,select{display:block}label{margin-bottom:.425rem}label.required:after{content:"*"}label abbr{display:none}textarea,input[type="email"],input[type="number"],input[type="password"],input[type="search"],input[type="tel"],input[type="text"],input[type="url"],input[type="color"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="time"],input[type="week"],select[multiple=multiple]{-webkit-transition:border-color;-moz-transition:border-color;transition:border-color;border-radius:.1875rem;margin-bottom:.85rem;padding:.425rem .425rem;width:100%}textarea:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="password"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="text"]:focus,input[type="url"]:focus,input[type="color"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,select[multiple=multiple]:focus{outline:none}textarea{resize:vertical}input[type="checkbox"],input[type="radio"]{display:inline;margin-right:.425rem}input[type="file"]{width:100%}select{width:auto;max-width:100%;margin-bottom:1.7rem}button,input[type="submit"]{cursor:pointer;user-select:none;vertical-align:middle;white-space:nowrap;border:inherit} -@-webkit-viewport { - width: device-width; } -@-moz-viewport { - width: device-width; } -@-ms-viewport { - width: device-width; } -@-o-viewport { - width: device-width; } -@viewport { - width: device-width; } -html { - font-size: 100%; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; } - -body { - margin: 0; } - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; } - -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; } - -audio:not([controls]) { - display: none; - height: 0; } - -[hidden], -template { - display: none; } - -a { - background: transparent; - text-decoration: none; } - -a:active, -a:hover { - outline: 0; } - -abbr[title] { - border-bottom: 1px dotted; } - -b, -strong { - font-weight: bold; } - -dfn { - font-style: italic; } - -mark { - background: #ff0; - color: #000; } - -sub, -sup { - font-size: 0.75rem; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sup { - top: -0.5em; } - -sub { - bottom: -0.25em; } - -img { - border: 0; - max-width: 100%; } - -svg:not(:root) { - overflow: hidden; } - -figure { - margin: 1em 40px; } - -hr { - height: 0; } - -pre { - overflow: auto; } - -code, -kbd, -pre, -samp { - font-size: 1rem; } - -button, -input, -optgroup, -select, -textarea { - color: inherit; - font: inherit; - margin: 0; } - -button { - overflow: visible; } - -button, -select { - text-transform: none; } - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; } - -button[disabled], -html input[disabled] { - cursor: default; } - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; } - -input { - line-height: normal; } - -input[type="checkbox"], -input[type="radio"] { - padding: 0; } - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; } - -input[type="search"] { - -webkit-appearance: textfield; } - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; } - -legend { - border: 0; - padding: 0; } - -textarea { - overflow: auto; } - -optgroup { - font-weight: bold; } - -table { - border-collapse: collapse; - border-spacing: 0; - table-layout: fixed; - width: 100%; } - -tr, td, th { - vertical-align: middle; } - -th, td { - padding: 0.425rem 0; } - -th { - text-align: left; } - -.container { - width: 75em; - margin: 0 auto; - padding: 0; } - @media only all and (min-width: 60em) and (max-width: 74.938em) { - .container { - width: 60em; } } - @media only all and (min-width: 48em) and (max-width: 59.938em) { - .container { - width: 48em; } } - @media only all and (min-width: 30.063em) and (max-width: 47.938em) { - .container { - width: 30em; } } - @media only all and (max-width: 30em) { - .container { - width: 100%; } } - -.grid { - display: -webkit-box; - display: -moz-box; - display: box; - display: -webkit-flex; - display: -moz-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: row; - -moz-flex-flow: row; - flex-flow: row; - list-style: none; - margin: 0; - padding: 0; } - @media only all and (max-width: 47.938em) { - .grid { - -webkit-flex-flow: row wrap; - -moz-flex-flow: row wrap; - flex-flow: row wrap; } } - -.block { - -webkit-box-flex: 1; - -moz-box-flex: 1; - box-flex: 1; - -webkit-flex: 1; - -moz-flex: 1; - -ms-flex: 1; - flex: 1; - min-width: 0; - min-height: 0; } - @media only all and (max-width: 47.938em) { - .block { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 100%; - -moz-flex: 0 100%; - -ms-flex: 0 100%; - flex: 0 100%; } } - -.content { - margin: 0.625rem; - padding: 0.938rem; } - -@media only all and (max-width: 47.938em) { - body [class*="size-"] { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 100%; - -moz-flex: 0 100%; - -ms-flex: 0 100%; - flex: 0 100%; } } - -.size-1-2 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 50%; - -moz-flex: 0 50%; - -ms-flex: 0 50%; - flex: 0 50%; } - -.size-1-3 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 33.33333%; - -moz-flex: 0 33.33333%; - -ms-flex: 0 33.33333%; - flex: 0 33.33333%; } - -.size-1-4 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 25%; - -moz-flex: 0 25%; - -ms-flex: 0 25%; - flex: 0 25%; } - -.size-1-5 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 20%; - -moz-flex: 0 20%; - -ms-flex: 0 20%; - flex: 0 20%; } - -.size-1-6 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 16.66667%; - -moz-flex: 0 16.66667%; - -ms-flex: 0 16.66667%; - flex: 0 16.66667%; } - -.size-1-7 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 14.28571%; - -moz-flex: 0 14.28571%; - -ms-flex: 0 14.28571%; - flex: 0 14.28571%; } - -.size-1-8 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 12.5%; - -moz-flex: 0 12.5%; - -ms-flex: 0 12.5%; - flex: 0 12.5%; } - -.size-1-9 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 11.11111%; - -moz-flex: 0 11.11111%; - -ms-flex: 0 11.11111%; - flex: 0 11.11111%; } - -.size-1-10 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 10%; - -moz-flex: 0 10%; - -ms-flex: 0 10%; - flex: 0 10%; } - -.size-1-11 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 9.09091%; - -moz-flex: 0 9.09091%; - -ms-flex: 0 9.09091%; - flex: 0 9.09091%; } - -.size-1-12 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 8.33333%; - -moz-flex: 0 8.33333%; - -ms-flex: 0 8.33333%; - flex: 0 8.33333%; } - -@media only all and (min-width: 48em) and (max-width: 59.938em) { - .size-tablet-1-2 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 50%; - -moz-flex: 0 50%; - -ms-flex: 0 50%; - flex: 0 50%; } - - .size-tablet-1-3 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 33.33333%; - -moz-flex: 0 33.33333%; - -ms-flex: 0 33.33333%; - flex: 0 33.33333%; } - - .size-tablet-1-4 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 25%; - -moz-flex: 0 25%; - -ms-flex: 0 25%; - flex: 0 25%; } - - .size-tablet-1-5 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 20%; - -moz-flex: 0 20%; - -ms-flex: 0 20%; - flex: 0 20%; } - - .size-tablet-1-6 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 16.66667%; - -moz-flex: 0 16.66667%; - -ms-flex: 0 16.66667%; - flex: 0 16.66667%; } - - .size-tablet-1-7 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 14.28571%; - -moz-flex: 0 14.28571%; - -ms-flex: 0 14.28571%; - flex: 0 14.28571%; } - - .size-tablet-1-8 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 12.5%; - -moz-flex: 0 12.5%; - -ms-flex: 0 12.5%; - flex: 0 12.5%; } - - .size-tablet-1-9 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 11.11111%; - -moz-flex: 0 11.11111%; - -ms-flex: 0 11.11111%; - flex: 0 11.11111%; } - - .size-tablet-1-10 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 10%; - -moz-flex: 0 10%; - -ms-flex: 0 10%; - flex: 0 10%; } - - .size-tablet-1-11 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 9.09091%; - -moz-flex: 0 9.09091%; - -ms-flex: 0 9.09091%; - flex: 0 9.09091%; } - - .size-tablet-1-12 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 8.33333%; - -moz-flex: 0 8.33333%; - -ms-flex: 0 8.33333%; - flex: 0 8.33333%; } } -@media only all and (max-width: 47.938em) { - @supports not (flex-wrap: wrap) { - .grid { - display: block; - -webkit-box-lines: inherit; - -moz-box-lines: inherit; - box-lines: inherit; - -webkit-flex-wrap: inherit; - -moz-flex-wrap: inherit; - -ms-flex-wrap: inherit; - flex-wrap: inherit; } - - .block { - display: block; - -webkit-box-flex: inherit; - -moz-box-flex: inherit; - box-flex: inherit; - -webkit-flex: inherit; - -moz-flex: inherit; - -ms-flex: inherit; - flex: inherit; } } } -.first-block { - -webkit-box-ordinal-group: 0; - -webkit-order: -1; - -ms-flex-order: -1; - order: -1; } - -.last-block { - -webkit-box-ordinal-group: 2; - -webkit-order: 1; - -ms-flex-order: 1; - order: 1; } - -.fixed-blocks { - -webkit-flex-flow: row wrap; - -moz-flex-flow: row wrap; - flex-flow: row wrap; } - .fixed-blocks .block { - -webkit-box-flex: inherit; - -moz-box-flex: inherit; - box-flex: inherit; - -webkit-flex: inherit; - -moz-flex: inherit; - -ms-flex: inherit; - flex: inherit; - width: 25%; } - @media only all and (min-width: 60em) and (max-width: 74.938em) { - .fixed-blocks .block { - width: 33.33333%; } } - @media only all and (min-width: 48em) and (max-width: 59.938em) { - .fixed-blocks .block { - width: 50%; } } - @media only all and (max-width: 47.938em) { - .fixed-blocks .block { - width: 100%; } } - -@supports not (flex-wrap: wrap) { - .fixed-blocks { - display: block; - -webkit-flex-flow: inherit; - -moz-flex-flow: inherit; - flex-flow: inherit; } } -body { - font-size: 1rem; - line-height: 1.7; } - -h1, h2, h3, h4, h5, h6 { - margin: 0.85rem 0 1.7rem 0; - text-rendering: optimizeLegibility; } - -h1 { - font-size: 3.2rem; } - -h2 { - font-size: 2.5rem; } - -h3 { - font-size: 2.1rem; } - -h4 { - font-size: 1.75rem; } - -h5 { - font-size: 1.35rem; } - -h6 { - font-size: 0.85rem; } - -p { - margin: 1.7rem 0; } - -ul, ol { - margin-top: 1.7rem; - margin-bottom: 1.7rem; } - ul ul, ul ol, ol ul, ol ol { - margin-top: 0; - margin-bottom: 0; } - -blockquote { - margin: 1.7rem 0; - padding-left: 0.85rem; } - -cite { - display: block; - font-size: 0.875rem; } - cite:before { - content: "\2014 \0020"; } - -pre { - margin: 1.7rem 0; - padding: 0.938rem; } - -code { - vertical-align: bottom; } - -small { - font-size: 0.875rem; } - -hr { - border-left: none; - border-right: none; - border-top: none; - margin: 1.7rem 0; } - -fieldset { - border: 0; - padding: 0.938rem; - margin: 0 0 1.7rem 0; } - -input, -label, -select { - display: block; } - -label { - margin-bottom: 0.425rem; } - label.required:after { - content: "*"; } - label abbr { - display: none; } - -textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] { - -webkit-transition: border-color; - -moz-transition: border-color; - transition: border-color; - border-radius: 0.1875rem; - margin-bottom: 0.85rem; - padding: 0.425rem 0.425rem; - width: 100%; } - textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { - outline: none; } - -textarea { - resize: vertical; } - -input[type="checkbox"], input[type="radio"] { - display: inline; - margin-right: 0.425rem; } - -input[type="file"] { - width: 100%; } - -select { - width: auto; - max-width: 100%; - margin-bottom: 1.7rem; } - -button, -input[type="submit"] { - cursor: pointer; - user-select: none; - vertical-align: middle; - white-space: nowrap; - border: inherit; } - -/*# sourceMappingURL=nucleus.css.map */ +/*# sourceMappingURL=nucleus.css.map */ \ No newline at end of file diff --git a/user/themes/antimatter/css-compiled/nucleus.css.map b/user/themes/antimatter/css-compiled/nucleus.css.map index c68a93b..f8a2f86 100644 --- a/user/themes/antimatter/css-compiled/nucleus.css.map +++ b/user/themes/antimatter/css-compiled/nucleus.css.map @@ -1,7 +1,92 @@ { -"version": 3, -"mappings": "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", -"sources": ["../scss/nucleus/_core.scss","../scss/vendor/bourbon/addons/_prefixer.scss","../scss/configuration/nucleus/_typography.scss","../scss/nucleus/_flex.scss","../scss/configuration/nucleus/_breakpoints.scss","../scss/nucleus/mixins/_breakpoints.scss","../scss/vendor/bourbon/css3/_flex-box.scss","../scss/configuration/nucleus/_layout.scss","../scss/nucleus/_typography.scss","../scss/nucleus/_forms.scss","../scss/configuration/nucleus/_core.scss"], -"names": [], -"file": "nucleus.css" + "version": 3, + "file": "nucleus.css", + "sources": [ + "../scss/nucleus.scss", + "../scss/vendor/bourbon/_bourbon.scss", + "../scss/vendor/bourbon/settings/_prefixer.scss", + "../scss/vendor/bourbon/settings/_px-to-em.scss", + "../scss/vendor/bourbon/helpers/_convert-units.scss", + "../scss/vendor/bourbon/helpers/_gradient-positions-parser.scss", + "../scss/vendor/bourbon/helpers/_is-num.scss", + "../scss/vendor/bourbon/helpers/_linear-angle-parser.scss", + "../scss/vendor/bourbon/helpers/_linear-gradient-parser.scss", + "../scss/vendor/bourbon/helpers/_linear-positions-parser.scss", + "../scss/vendor/bourbon/helpers/_linear-side-corner-parser.scss", + "../scss/vendor/bourbon/helpers/_radial-arg-parser.scss", + "../scss/vendor/bourbon/helpers/_radial-positions-parser.scss", + "../scss/vendor/bourbon/helpers/_radial-gradient-parser.scss", + "../scss/vendor/bourbon/helpers/_render-gradients.scss", + "../scss/vendor/bourbon/helpers/_shape-size-stripper.scss", + "../scss/vendor/bourbon/helpers/_str-to-num.scss", + "../scss/vendor/bourbon/functions/_assign.scss", + "../scss/vendor/bourbon/functions/_color-lightness.scss", + "../scss/vendor/bourbon/functions/_flex-grid.scss", + "../scss/vendor/bourbon/functions/_golden-ratio.scss", + "../scss/vendor/bourbon/functions/_grid-width.scss", + "../scss/vendor/bourbon/functions/_modular-scale.scss", + "../scss/vendor/bourbon/functions/_px-to-em.scss", + "../scss/vendor/bourbon/functions/_px-to-rem.scss", + "../scss/vendor/bourbon/functions/_strip-units.scss", + "../scss/vendor/bourbon/functions/_tint-shade.scss", + "../scss/vendor/bourbon/functions/_transition-property-name.scss", + "../scss/vendor/bourbon/functions/_unpack.scss", + "../scss/vendor/bourbon/css3/_animation.scss", + "../scss/vendor/bourbon/css3/_appearance.scss", + "../scss/vendor/bourbon/css3/_backface-visibility.scss", + "../scss/vendor/bourbon/css3/_background.scss", + "../scss/vendor/bourbon/css3/_background-image.scss", + "../scss/vendor/bourbon/css3/_border-image.scss", + "../scss/vendor/bourbon/css3/_border-radius.scss", + "../scss/vendor/bourbon/css3/_box-sizing.scss", + "../scss/vendor/bourbon/css3/_calc.scss", + "../scss/vendor/bourbon/css3/_columns.scss", + "../scss/vendor/bourbon/css3/_filter.scss", + "../scss/vendor/bourbon/css3/_flex-box.scss", + "../scss/vendor/bourbon/css3/_font-face.scss", + "../scss/vendor/bourbon/css3/_hyphens.scss", + "../scss/vendor/bourbon/css3/_hidpi-media-query.scss", + "../scss/vendor/bourbon/css3/_image-rendering.scss", + "../scss/vendor/bourbon/css3/_keyframes.scss", + "../scss/vendor/bourbon/css3/_linear-gradient.scss", + "../scss/vendor/bourbon/css3/_perspective.scss", + "../scss/vendor/bourbon/css3/_radial-gradient.scss", + "../scss/vendor/bourbon/css3/_transform.scss", + "../scss/vendor/bourbon/css3/_transition.scss", + "../scss/vendor/bourbon/css3/_user-select.scss", + "../scss/vendor/bourbon/css3/_placeholder.scss", + "../scss/vendor/bourbon/addons/_button.scss", + "../scss/vendor/bourbon/addons/_clearfix.scss", + "../scss/vendor/bourbon/addons/_directional-values.scss", + "../scss/vendor/bourbon/addons/_ellipsis.scss", + "../scss/vendor/bourbon/addons/_font-family.scss", + "../scss/vendor/bourbon/addons/_hide-text.scss", + "../scss/vendor/bourbon/addons/_html5-input-types.scss", + "../scss/vendor/bourbon/addons/_position.scss", + "../scss/vendor/bourbon/addons/_prefixer.scss", + "../scss/vendor/bourbon/addons/_retina-image.scss", + "../scss/vendor/bourbon/addons/_size.scss", + "../scss/vendor/bourbon/addons/_timing-functions.scss", + "../scss/vendor/bourbon/addons/_triangle.scss", + "../scss/vendor/bourbon/addons/_word-wrap.scss", + "../scss/vendor/bourbon/_bourbon-deprecated-upcoming.scss", + "../scss/configuration/nucleus/_base.scss", + "../scss/configuration/nucleus/_core.scss", + "../scss/configuration/nucleus/_breakpoints.scss", + "../scss/configuration/nucleus/_layout.scss", + "../scss/configuration/nucleus/_typography.scss", + "../scss/configuration/nucleus/_nav.scss", + "../scss/nucleus/functions/_base.scss", + "../scss/nucleus/functions/_direction.scss", + "../scss/nucleus/functions/_range.scss", + "../scss/nucleus/mixins/_base.scss", + "../scss/nucleus/mixins/_breakpoints.scss", + "../scss/nucleus/mixins/_utilities.scss", + "../scss/nucleus/_core.scss", + "../scss/nucleus/_flex.scss", + "../scss/nucleus/_typography.scss", + "../scss/nucleus/_forms.scss" + ], + "mappings": "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", + "names": [] } \ No newline at end of file diff --git a/user/themes/antimatter/css-compiled/particles.css b/user/themes/antimatter/css-compiled/particles.css index c86d1e1..c9edaf0 100644 --- a/user/themes/antimatter/css-compiled/particles.css +++ b/user/themes/antimatter/css-compiled/particles.css @@ -1,98 +1,3 @@ -.text-left { - text-align: left !important; } +.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media all and (min-width: 75em){.large-desktop-text-left{text-align:left !important}.large-desktop-text-right{text-align:right !important}.large-desktop-text-center{text-align:center !important}.large-desktop-text-justify{text-align:justify !important}}@media all and (min-width: 60em) and (max-width: 74.938em){.desktop-text-left{text-align:left !important}.desktop-text-right{text-align:right !important}.desktop-text-center{text-align:center !important}.desktop-text-justify{text-align:justify !important}}@media all and (min-width: 48em) and (max-width: 59.938em){.tablet-text-left{text-align:left !important}.tablet-text-right{text-align:right !important}.tablet-text-center{text-align:center !important}.tablet-text-justify{text-align:justify !important}}@media all and (min-width: 30.063em) and (max-width: 47.938em){.large-mobile-text-left{text-align:left !important}.large-mobile-text-right{text-align:right !important}.large-mobile-text-center{text-align:center !important}.large-mobile-text-justify{text-align:justify !important}}@media all and (max-width: 30em){.small-mobile-text-left{text-align:left !important}.small-mobile-text-right{text-align:right !important}.small-mobile-text-center{text-align:center !important}.small-mobile-text-justify{text-align:justify !important}}@media all and (min-width: 48em){.no-mobile-text-left{text-align:left !important}.no-mobile-text-right{text-align:right !important}.no-mobile-text-center{text-align:center !important}.no-mobile-text-justify{text-align:justify !important}}@media all and (max-width: 47.938em){.mobile-only-text-left{text-align:left !important}.mobile-only-text-right{text-align:right !important}.mobile-only-text-center{text-align:center !important}.mobile-only-text-justify{text-align:justify !important}} -.text-right { - text-align: right !important; } - -.text-center { - text-align: center !important; } - -.text-justify { - text-align: justify !important; } - -@media all and (min-width: 75em) { - .large-desktop-text-left { - text-align: left !important; } - - .large-desktop-text-right { - text-align: right !important; } - - .large-desktop-text-center { - text-align: center !important; } - - .large-desktop-text-justify { - text-align: justify !important; } } -@media all and (min-width: 60em) and (max-width: 74.938em) { - .desktop-text-left { - text-align: left !important; } - - .desktop-text-right { - text-align: right !important; } - - .desktop-text-center { - text-align: center !important; } - - .desktop-text-justify { - text-align: justify !important; } } -@media all and (min-width: 48em) and (max-width: 59.938em) { - .tablet-text-left { - text-align: left !important; } - - .tablet-text-right { - text-align: right !important; } - - .tablet-text-center { - text-align: center !important; } - - .tablet-text-justify { - text-align: justify !important; } } -@media all and (min-width: 30.063em) and (max-width: 47.938em) { - .large-mobile-text-left { - text-align: left !important; } - - .large-mobile-text-right { - text-align: right !important; } - - .large-mobile-text-center { - text-align: center !important; } - - .large-mobile-text-justify { - text-align: justify !important; } } -@media all and (max-width: 30em) { - .small-mobile-text-left { - text-align: left !important; } - - .small-mobile-text-right { - text-align: right !important; } - - .small-mobile-text-center { - text-align: center !important; } - - .small-mobile-text-justify { - text-align: justify !important; } } -@media all and (min-width: 48em) { - .no-mobile-text-left { - text-align: left !important; } - - .no-mobile-text-right { - text-align: right !important; } - - .no-mobile-text-center { - text-align: center !important; } - - .no-mobile-text-justify { - text-align: justify !important; } } -@media all and (max-width: 47.938em) { - .mobile-only-text-left { - text-align: left !important; } - - .mobile-only-text-right { - text-align: right !important; } - - .mobile-only-text-center { - text-align: center !important; } - - .mobile-only-text-justify { - text-align: justify !important; } } - -/*# sourceMappingURL=particles.css.map */ +/*# sourceMappingURL=particles.css.map */ \ No newline at end of file diff --git a/user/themes/antimatter/css-compiled/particles.css.map b/user/themes/antimatter/css-compiled/particles.css.map index b04cb80..602fad7 100644 --- a/user/themes/antimatter/css-compiled/particles.css.map +++ b/user/themes/antimatter/css-compiled/particles.css.map @@ -1,7 +1,95 @@ { -"version": 3, -"mappings": "AAsBC,UAAW;EACV,UAAU,EAAE,eAAe;;AAE5B,WAAY;EACX,UAAU,EAAE,gBAAgB;;AAE7B,YAAa;EACZ,UAAU,EAAE,iBAAiB;;AAE9B,aAAc;EACb,UAAU,EAAE,kBAAkB;;AAI9B,gCAA8C;EAC7C,wBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,yBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,0BAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,2BAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,0DAA8C;EAC7C,kBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,mBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,oBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,qBAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,0DAA8C;EAC7C,iBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,kBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,mBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,oBAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,8DAA8C;EAC7C,uBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,wBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,yBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,0BAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,gCAA8C;EAC7C,uBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,wBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,yBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,0BAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,gCAA8C;EAC7C,oBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,qBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,sBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,uBAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,oCAA8C;EAC7C,sBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,uBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,wBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,yBAA+C;IAAE,UAAU,EAAE,kBAAkB", -"sources": ["../scss/nucleus/particles/_align-text.scss"], -"names": [], -"file": "particles.css" + "version": 3, + "file": "particles.css", + "sources": [ + "../scss/particles.scss", + "../scss/vendor/bourbon/_bourbon.scss", + "../scss/vendor/bourbon/settings/_prefixer.scss", + "../scss/vendor/bourbon/settings/_px-to-em.scss", + "../scss/vendor/bourbon/helpers/_convert-units.scss", + "../scss/vendor/bourbon/helpers/_gradient-positions-parser.scss", + "../scss/vendor/bourbon/helpers/_is-num.scss", + "../scss/vendor/bourbon/helpers/_linear-angle-parser.scss", + "../scss/vendor/bourbon/helpers/_linear-gradient-parser.scss", + "../scss/vendor/bourbon/helpers/_linear-positions-parser.scss", + "../scss/vendor/bourbon/helpers/_linear-side-corner-parser.scss", + "../scss/vendor/bourbon/helpers/_radial-arg-parser.scss", + "../scss/vendor/bourbon/helpers/_radial-positions-parser.scss", + "../scss/vendor/bourbon/helpers/_radial-gradient-parser.scss", + "../scss/vendor/bourbon/helpers/_render-gradients.scss", + "../scss/vendor/bourbon/helpers/_shape-size-stripper.scss", + "../scss/vendor/bourbon/helpers/_str-to-num.scss", + "../scss/vendor/bourbon/functions/_assign.scss", + "../scss/vendor/bourbon/functions/_color-lightness.scss", + "../scss/vendor/bourbon/functions/_flex-grid.scss", + "../scss/vendor/bourbon/functions/_golden-ratio.scss", + "../scss/vendor/bourbon/functions/_grid-width.scss", + "../scss/vendor/bourbon/functions/_modular-scale.scss", + "../scss/vendor/bourbon/functions/_px-to-em.scss", + "../scss/vendor/bourbon/functions/_px-to-rem.scss", + "../scss/vendor/bourbon/functions/_strip-units.scss", + "../scss/vendor/bourbon/functions/_tint-shade.scss", + "../scss/vendor/bourbon/functions/_transition-property-name.scss", + "../scss/vendor/bourbon/functions/_unpack.scss", + "../scss/vendor/bourbon/css3/_animation.scss", + "../scss/vendor/bourbon/css3/_appearance.scss", + "../scss/vendor/bourbon/css3/_backface-visibility.scss", + "../scss/vendor/bourbon/css3/_background.scss", + "../scss/vendor/bourbon/css3/_background-image.scss", + "../scss/vendor/bourbon/css3/_border-image.scss", + "../scss/vendor/bourbon/css3/_border-radius.scss", + "../scss/vendor/bourbon/css3/_box-sizing.scss", + "../scss/vendor/bourbon/css3/_calc.scss", + "../scss/vendor/bourbon/css3/_columns.scss", + "../scss/vendor/bourbon/css3/_filter.scss", + "../scss/vendor/bourbon/css3/_flex-box.scss", + "../scss/vendor/bourbon/css3/_font-face.scss", + "../scss/vendor/bourbon/css3/_hyphens.scss", + "../scss/vendor/bourbon/css3/_hidpi-media-query.scss", + "../scss/vendor/bourbon/css3/_image-rendering.scss", + "../scss/vendor/bourbon/css3/_keyframes.scss", + "../scss/vendor/bourbon/css3/_linear-gradient.scss", + "../scss/vendor/bourbon/css3/_perspective.scss", + "../scss/vendor/bourbon/css3/_radial-gradient.scss", + "../scss/vendor/bourbon/css3/_transform.scss", + "../scss/vendor/bourbon/css3/_transition.scss", + "../scss/vendor/bourbon/css3/_user-select.scss", + "../scss/vendor/bourbon/css3/_placeholder.scss", + "../scss/vendor/bourbon/addons/_button.scss", + "../scss/vendor/bourbon/addons/_clearfix.scss", + "../scss/vendor/bourbon/addons/_directional-values.scss", + "../scss/vendor/bourbon/addons/_ellipsis.scss", + "../scss/vendor/bourbon/addons/_font-family.scss", + "../scss/vendor/bourbon/addons/_hide-text.scss", + "../scss/vendor/bourbon/addons/_html5-input-types.scss", + "../scss/vendor/bourbon/addons/_position.scss", + "../scss/vendor/bourbon/addons/_prefixer.scss", + "../scss/vendor/bourbon/addons/_retina-image.scss", + "../scss/vendor/bourbon/addons/_size.scss", + "../scss/vendor/bourbon/addons/_timing-functions.scss", + "../scss/vendor/bourbon/addons/_triangle.scss", + "../scss/vendor/bourbon/addons/_word-wrap.scss", + "../scss/vendor/bourbon/_bourbon-deprecated-upcoming.scss", + "../scss/configuration/nucleus/_base.scss", + "../scss/configuration/nucleus/_core.scss", + "../scss/configuration/nucleus/_breakpoints.scss", + "../scss/configuration/nucleus/_layout.scss", + "../scss/configuration/nucleus/_typography.scss", + "../scss/configuration/nucleus/_nav.scss", + "../scss/configuration/template/_base.scss", + "../scss/configuration/template/_colors.scss", + "../scss/configuration/template/_typography.scss", + "../scss/configuration/template/_bullets.scss", + "../scss/configuration/template/_variables.scss", + "../scss/nucleus/functions/_base.scss", + "../scss/nucleus/functions/_direction.scss", + "../scss/nucleus/functions/_range.scss", + "../scss/nucleus/mixins/_base.scss", + "../scss/nucleus/mixins/_breakpoints.scss", + "../scss/nucleus/mixins/_utilities.scss", + "../scss/nucleus/particles/_align-text.scss", + "../scss/nucleus/particles/_visibility.scss" + ], + "mappings": "AqFsBC,AAAA,UAAU,AAAC,CACV,UAAU,CAAE,eAAgB,CAC5B,AACD,AAAA,WAAW,AAAC,CACX,UAAU,CAAE,gBAAiB,CAC7B,AACD,AAAA,YAAY,AAAC,CACZ,UAAU,CAAE,iBAAkB,CAC9B,AACD,AAAA,aAAa,AAAC,CACb,UAAU,CAAE,kBAAmB,CAC/B,AAGA,MAAM,CAAN,GAAG,MAAM,SAAS,EAAC,IAAI,EACtB,AAAA,wBAAwB,AAAxB,CAAE,UAAU,CAAE,eAAgB,CAAI,AAClC,AAAA,yBAAyB,AAAzB,CAAE,UAAU,CAAE,gBAAiB,CAAI,AACnC,AAAA,0BAA0B,AAA1B,CAAE,UAAU,CAAE,iBAAkB,CAAI,AACpC,AAAA,2BAA2B,AAA3B,CAAE,UAAU,CAAE,kBAAmB,CAAI,CAJtC,MAAM,CAAN,GAAG,MAAM,SAAS,EAAC,IAAI,OAAO,SAAS,EAAC,QAAQ,EAC/C,AAAA,kBAAkB,AAAlB,CAAE,UAAU,CAAE,eAAgB,CAAI,AAClC,AAAA,mBAAmB,AAAnB,CAAE,UAAU,CAAE,gBAAiB,CAAI,AACnC,AAAA,oBAAoB,AAApB,CAAE,UAAU,CAAE,iBAAkB,CAAI,AACpC,AAAA,qBAAqB,AAArB,CAAE,UAAU,CAAE,kBAAmB,CAAI,CAJtC,MAAM,CAAN,GAAG,MAAM,SAAS,EAAC,IAAI,OAAO,SAAS,EAAC,QAAQ,EAC/C,AAAA,iBAAiB,AAAjB,CAAE,UAAU,CAAE,eAAgB,CAAI,AAClC,AAAA,kBAAkB,AAAlB,CAAE,UAAU,CAAE,gBAAiB,CAAI,AACnC,AAAA,mBAAmB,AAAnB,CAAE,UAAU,CAAE,iBAAkB,CAAI,AACpC,AAAA,oBAAoB,AAApB,CAAE,UAAU,CAAE,kBAAmB,CAAI,CAJtC,MAAM,CAAN,GAAG,MAAM,SAAS,EAAC,QAAQ,OAAO,SAAS,EAAC,QAAQ,EACnD,AAAA,uBAAuB,AAAvB,CAAE,UAAU,CAAE,eAAgB,CAAI,AAClC,AAAA,wBAAwB,AAAxB,CAAE,UAAU,CAAE,gBAAiB,CAAI,AACnC,AAAA,yBAAyB,AAAzB,CAAE,UAAU,CAAE,iBAAkB,CAAI,AACpC,AAAA,0BAA0B,AAA1B,CAAE,UAAU,CAAE,kBAAmB,CAAI,CAJtC,MAAM,CAAN,GAAG,MAAM,SAAS,EAAC,IAAI,EACtB,AAAA,uBAAuB,AAAvB,CAAE,UAAU,CAAE,eAAgB,CAAI,AAClC,AAAA,wBAAwB,AAAxB,CAAE,UAAU,CAAE,gBAAiB,CAAI,AACnC,AAAA,yBAAyB,AAAzB,CAAE,UAAU,CAAE,iBAAkB,CAAI,AACpC,AAAA,0BAA0B,AAA1B,CAAE,UAAU,CAAE,kBAAmB,CAAI,CAJtC,MAAM,CAAN,GAAG,MAAM,SAAS,EAAC,IAAI,EACtB,AAAA,oBAAoB,AAApB,CAAE,UAAU,CAAE,eAAgB,CAAI,AAClC,AAAA,qBAAqB,AAArB,CAAE,UAAU,CAAE,gBAAiB,CAAI,AACnC,AAAA,sBAAsB,AAAtB,CAAE,UAAU,CAAE,iBAAkB,CAAI,AACpC,AAAA,uBAAuB,AAAvB,CAAE,UAAU,CAAE,kBAAmB,CAAI,CAJtC,MAAM,CAAN,GAAG,MAAM,SAAS,EAAC,QAAQ,EAC1B,AAAA,sBAAsB,AAAtB,CAAE,UAAU,CAAE,eAAgB,CAAI,AAClC,AAAA,uBAAuB,AAAvB,CAAE,UAAU,CAAE,gBAAiB,CAAI,AACnC,AAAA,wBAAwB,AAAxB,CAAE,UAAU,CAAE,iBAAkB,CAAI,AACpC,AAAA,yBAAyB,AAAzB,CAAE,UAAU,CAAE,kBAAmB,CAAI", + "names": [] } \ No newline at end of file diff --git a/user/themes/antimatter/css-compiled/template.css b/user/themes/antimatter/css-compiled/template.css index 57ef5bb..a0dc276 100644 --- a/user/themes/antimatter/css-compiled/template.css +++ b/user/themes/antimatter/css-compiled/template.css @@ -1,5 +1,5 @@ @import url(//fonts.googleapis.com/css?family=Montserrat:400|Raleway:300,400,600|Inconsolata); -#header #logo h3, #header #navbar ul.navigation, #header #navbar .panel-activation, #footer p { +#header #logo h3, #header #navbar .panel-activation, #footer p { position: relative; top: 50%; -webkit-transform: translateY(-50%); @@ -51,7 +51,7 @@ b, strong, label, th { .right { float: right; } -.default-animation, #body, #header, #header #logo h3, .modular .showcase .button { +.default-animation, #body, #header, #header #logo h3, #header #navbar ul.navigation, .modular .showcase .button { -webkit-transition: all 0.5s ease; -moz-transition: all 0.5s ease; transition: all 0.5s ease; } @@ -94,6 +94,8 @@ b, strong, label, th { color: #0e6e90 !important; } #header.scrolled #navbar a:before, #header.scrolled #navbar a:after { background-color: #1BB3E9 !important; } + #header.scrolled .navigation { + margin-top: 0.5rem !important; } #header > .grid, #header #logo, #header #navbar { height: 100%; } #header #logo { @@ -106,21 +108,49 @@ b, strong, label, th { #header #logo h3 a { color: #444; } #header #navbar { - font-size: 0.9rem; } + font-size: 0.9rem; + /* Child Indicator */ } + #header #navbar .has-children > a > span { + display: inline-block; + padding-right: 8px; } + #header #navbar .has-children > a > span:after { + font-family: FontAwesome; + content: '\f107'; + position: absolute; + display: inline-block; + right: 8px; + top: 4px; } + #header #navbar .has-children > a:after, #header #navbar .has-children > a:before { + display: none; } + #header #navbar .has-children .has-children > a > span:after { + content: '\f105'; } + #header #navbar .navigation > .has-children:hover > a { + background: #f6f6f6; + border: 1px solid #ececec; + border-bottom-color: #f6f6f6; + margin: -1px -1px 0 -1px; + z-index: 1000; + position: relative; + padding-bottom: 1px; } #header #navbar ul { margin: 0; padding: 0; list-style: none; } #header #navbar ul.navigation { display: inline-block; - float: right; } + float: right; + margin-top: 1.4rem; } #header #navbar ul.navigation li { float: left; - position: relative; } + position: relative; + /*Active dropdown nav item */ + /* Dropdown CSS */ + /* Active on Hover */ } #header #navbar ul.navigation li a { font-family: "Montserrat", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; display: inline-block; - padding: 0.3rem 0.8rem; } + padding: 0.3rem 0.8rem; + -webkit-backface-visibility: hidden; } #header #navbar ul.navigation li a:before, #header #navbar ul.navigation li a:after { content: ""; position: absolute; @@ -162,29 +192,35 @@ b, strong, label, th { -o-transform: scaleX(0.75); transform: scaleX(0.75); } #header #navbar ul.navigation li ul { - display: none; - padding: 0; - box-shadow: 0 0.05rem 1rem rgba(0, 0, 0, 0.15) !important; } + position: absolute; + background-color: #f6f6f6; + border: 1px solid #ececec; + border-top: 0; + min-width: 12rem; + text-align: left; + z-index: 999; + left: -1px; + display: none; } + #header #navbar ul.navigation li ul li { + display: block; + float: none; + /* Active Dropdown nav item */ } + #header #navbar ul.navigation li ul li.active > a { + background-color: #ececec; + color: #1BB3E9; } + #header #navbar ul.navigation li ul li:hover > a { + background-color: #1BB3E9; + color: #fff; } + #header #navbar ul.navigation li ul li a { + display: block; + margin: 0 -1px; } + #header #navbar ul.navigation li ul li a:after, #header #navbar ul.navigation li ul li a:before { + display: none; } #header #navbar ul.navigation li ul ul { left: 100%; - top: 0; } + top: 0px; } #header #navbar ul.navigation li:hover > ul { - display: block; - position: absolute; - background: rgba(255, 255, 255, 0.9); - width: 10rem; } - #header #navbar ul.navigation li:hover li { - float: none; - margin: 0; - padding: 0; } - #header #navbar ul.navigation li:hover li a { - padding: 0.5rem 0.8rem; - display: block; } - #header #navbar ul.navigation li:hover li a:before, #header #navbar ul.navigation li:hover li a:after { - display: none; } - #header #navbar ul.navigation li:hover li.active > a { - background: #1BB3E9; - color: #fff; } + display: block; } @media only all and (max-width: 59.938em) { #header #navbar ul.navigation { display: none; } } @@ -214,16 +250,14 @@ b, strong, label, th { .header-image #header { background-color: rgba(255, 255, 255, 0); box-shadow: none; } + .header-image #header .navigation .has-children:hover a { + color: #1BB3E9; } .header-image #header #logo h3, .header-image #header #logo a { color: #FFFFFF; } .header-image #header a, .header-image #header .menu-btn { color: #FFFFFF; } .header-image #header a:before, .header-image #header a:after { background-color: rgba(255, 255, 255, 0.7) !important; } - .header-image #header #navbar ul.navigation ul li a { - color: #1BB3E9; } - .header-image #header #navbar ul.navigation ul li a:hover { - color: #0e6e90; } #footer { position: absolute; @@ -357,21 +391,37 @@ blockquote > blockquote > blockquote { border-left: 10px solid #F0AD4E; background: #FCF8F2; color: #df8a13; } + blockquote > blockquote > blockquote > p a { + color: #b06d0f; } + blockquote > blockquote > blockquote > p a:hover { + color: #f2b866; } blockquote > blockquote > blockquote > blockquote > p { margin-left: -94px; border-left: 10px solid #D9534F; background: #FDF7F7; color: #b52b27; } + blockquote > blockquote > blockquote > blockquote > p a { + color: #8b211e; } + blockquote > blockquote > blockquote > blockquote > p a:hover { + color: #de6764; } blockquote > blockquote > blockquote > blockquote > blockquote > p { margin-left: -118px; border-left: 10px solid #5BC0DE; background: #F4F8FA; color: #28a1c5; } + blockquote > blockquote > blockquote > blockquote > blockquote > p a { + color: #1f7e9a; } + blockquote > blockquote > blockquote > blockquote > blockquote > p a:hover { + color: #70c8e2; } blockquote > blockquote > blockquote > blockquote > blockquote > blockquote > p { margin-left: -142px; border-left: 10px solid #5CB85C; background: #F1F9F1; color: #3d8b3d; } + blockquote > blockquote > blockquote > blockquote > blockquote > blockquote > p a { + color: #2d672d; } + blockquote > blockquote > blockquote > blockquote > blockquote > blockquote > p a:hover { + color: #6ec06e; } code, kbd, @@ -385,7 +435,7 @@ code { pre { padding: 2rem; - background: #f6f6f6; + background: #f0f0f0; border: 1px solid #ddd; border-radius: 3px; } pre code { @@ -713,6 +763,11 @@ ul.pagination { @media only all and (max-width: 47.938em) { .simplesearch .search-item { margin-left: 0; } } +.simplesearch .search-wrapper .search-submit { + height: 52px; + padding: 0 10px; } + .simplesearch .search-wrapper .search-submit img { + width: 30px; } .simplesearch .search-details { float: right; margin-top: -2.5rem; diff --git a/user/themes/antimatter/css-compiled/template.css.map b/user/themes/antimatter/css-compiled/template.css.map index 4568d5b..3329b57 100644 --- a/user/themes/antimatter/css-compiled/template.css.map +++ b/user/themes/antimatter/css-compiled/template.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "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", +"mappings": "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", "sources": ["../scss/template/_fonts.scss","../scss/nucleus/mixins/_utilities.scss","../scss/template/modules/_buttons.scss","../scss/template/_core.scss","../scss/configuration/template/_colors.scss","../scss/configuration/template/_bullets.scss","../scss/configuration/template/_variables.scss","../scss/template/_extensions.scss","../scss/vendor/bourbon/addons/_prefixer.scss","../scss/nucleus/mixins/_breakpoints.scss","../scss/template/_header.scss","../scss/configuration/template/_typography.scss","../scss/template/_footer.scss","../scss/template/_typography.scss","../scss/configuration/nucleus/_typography.scss","../scss/template/_forms.scss","../scss/template/_tables.scss","../scss/template/_buttons.scss","../scss/template/_bullets.scss","../scss/template/_panel.scss","../scss/template/_blog.scss","../scss/template/_errors.scss","../scss/template/_simplesearch.scss","../scss/template/_custom.scss","../scss/template/modular/_showcase.scss","../scss/template/modular/_features.scss","../scss/vendor/bourbon/addons/_clearfix.scss","../scss/template/modular/_text.scss","../scss/template/modular/_all.scss"], "names": [], "file": "template.css" diff --git a/user/themes/antimatter/css/font-awesome.min.css b/user/themes/antimatter/css/font-awesome.min.css index 3d920fc..540440c 100644 --- a/user/themes/antimatter/css/font-awesome.min.css +++ b/user/themes/antimatter/css/font-awesome.min.css @@ -1,4 +1,4 @@ /*! - * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.1.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-square:before,.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"} \ No newline at end of file + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/user/themes/antimatter/fonts/fontawesome-webfont.eot b/user/themes/antimatter/fonts/fontawesome-webfont.eot index 6cfd566..e9f60ca 100644 Binary files a/user/themes/antimatter/fonts/fontawesome-webfont.eot and b/user/themes/antimatter/fonts/fontawesome-webfont.eot differ diff --git a/user/themes/antimatter/fonts/fontawesome-webfont.svg b/user/themes/antimatter/fonts/fontawesome-webfont.svg index a9f8469..855c845 100644 --- a/user/themes/antimatter/fonts/fontawesome-webfont.svg +++ b/user/themes/antimatter/fonts/fontawesome-webfont.svg @@ -1,504 +1,2671 @@ - - + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/user/themes/antimatter/fonts/fontawesome-webfont.ttf b/user/themes/antimatter/fonts/fontawesome-webfont.ttf index 5cd6cff..35acda2 100644 Binary files a/user/themes/antimatter/fonts/fontawesome-webfont.ttf and b/user/themes/antimatter/fonts/fontawesome-webfont.ttf differ diff --git a/user/themes/antimatter/fonts/fontawesome-webfont.woff b/user/themes/antimatter/fonts/fontawesome-webfont.woff index 9eaecb3..400014a 100644 Binary files a/user/themes/antimatter/fonts/fontawesome-webfont.woff and b/user/themes/antimatter/fonts/fontawesome-webfont.woff differ diff --git a/user/themes/antimatter/fonts/fontawesome-webfont.woff2 b/user/themes/antimatter/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/user/themes/antimatter/fonts/fontawesome-webfont.woff2 differ diff --git a/user/themes/antimatter/hebe.json b/user/themes/antimatter/hebe.json new file mode 100644 index 0000000..05aba71 --- /dev/null +++ b/user/themes/antimatter/hebe.json @@ -0,0 +1,15 @@ +{ + "project":"grav-theme-antimatter", + "platforms":{ + "grav":{ + "nodes":{ + "theme":[ + { + "source":"/", + "destination":"/user/themes/antimatter" + } + ] + } + } + } +} diff --git a/user/themes/antimatter/images/favicon.png b/user/themes/antimatter/images/favicon.png new file mode 100644 index 0000000..ec645f1 Binary files /dev/null and b/user/themes/antimatter/images/favicon.png differ diff --git a/user/themes/antimatter/images/logo.png b/user/themes/antimatter/images/logo.png new file mode 100644 index 0000000..64be1a9 Binary files /dev/null and b/user/themes/antimatter/images/logo.png differ diff --git a/user/themes/antimatter/languages.yaml b/user/themes/antimatter/languages.yaml index 1276920..d3f206b 100644 --- a/user/themes/antimatter/languages.yaml +++ b/user/themes/antimatter/languages.yaml @@ -1,2 +1,295 @@ en: - TRANSLATION_TEST: Antimatter! \ No newline at end of file + TRANSLATION_TEST: Antimatter! + BLOG: + ITEM: + CONTINUE_READING: Continue reading... + NEXT_POST: Next Post + PREV_POST: Previous Post + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: Search + RELATED_POSTS: + HEADLINE: Related Posts + RANDOM_ARTICLE: + HEADLINE: Random Article + FEELING_LUCKY: I'm Feeling Lucky! + SOME_TEXT_WIDGET: + HEADLINE: Some Text Widget + POPULAR_TAGS: + HEADLINE: Popular Tags + ARCHIVES: + HEADLINE: Archives + SYNDICATE: + HEADLINE: Syndicate + FORM_DATA: + SUMMARY: "Here is the summary of what you wrote to us:" + ERROR: Error + +de: + TRANSLATION_TEST: Antimatter! + BLOG: + ITEM: + CONTINUE_READING: Weiterlesen... + NEXT_POST: Nächster Beitrag + PREV_POST: Vorheriger Beitrag + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: SimpleSearch + RELATED_POSTS: + HEADLINE: Ähnliche Beiträge + RANDOM_ARTICLE: + HEADLINE: Zufälliger Artikel + FEELING_LUCKY: Auf gut Glück! + SOME_TEXT_WIDGET: + HEADLINE: Text Widget Beispiel + POPULAR_TAGS: + HEADLINE: Häufigste Tags + ARCHIVES: + HEADLINE: Archiv + SYNDICATE: + HEADLINE: Abonnements + FORM_DATA: + SUMMARY: "Folgendes haben Sie uns mitgeteilt:" + ERROR: Fehler + +es: + TRANSLATION_TEST: Antimatter! + BLOG: + ITEM: + CONTINUE_READING: Continuar leyendo... + NEXT_POST: Siguiente Entrada + PREV_POST: Entrada Anterior + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: Buscar + RELATED_POSTS: + HEADLINE: Entradas Relacionadas + RANDOM_ARTICLE: + HEADLINE: Artículo Aleatorio + FEELING_LUCKY: Voy a tener suerte! + SOME_TEXT_WIDGET: + HEADLINE: Algunos Widget de Texto + POPULAR_TAGS: + HEADLINE: Etiquetas Populares + ARCHIVES: + HEADLINE: Archivos + SYNDICATE: + HEADLINE: Distribuir + FORM_DATA: + SUMMARY: "Este es un resumen de lo escrito:" + ERROR: Error + +fr: + TRANSLATION_TEST: Antimatter ! + BLOG: + ITEM: + CONTINUE_READING: Continuer la lecture... + NEXT_POST: Article suivant + PREV_POST: Article précédent + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: Recherche simple + RELATED_POSTS: + HEADLINE: Articles en relation + RANDOM_ARTICLE: + HEADLINE: Article aléatoire + FEELING_LUCKY: J’ai de la chance ! + SOME_TEXT_WIDGET: + HEADLINE: Du texte gadget + POPULAR_TAGS: + HEADLINE: Tags populaires + ARCHIVES: + HEADLINE: Archives + SYNDICATE: + HEADLINE: Syndication + FORM_DATA: + SUMMARY: "Voici le résumé de ce que vous avez écrit pour nous :" + ERROR: Erreur + +it: + TRANSLATION_TEST: Antimatter! + BLOG: + ITEM: + CONTINUE_READING: Continua a leggere... + NEXT_POST: Prossimo articolo + PREV_POST: Articolo precedente + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: SimpleSearch + RELATED_POSTS: + HEADLINE: Articoli correlati + RANDOM_ARTICLE: + HEADLINE: Articolo a caso + FEELING_LUCKY: Mi sento fortunato! + SOME_TEXT_WIDGET: + HEADLINE: Widget di testo + POPULAR_TAGS: + HEADLINE: Tag popolari + ARCHIVES: + HEADLINE: Archivio + SYNDICATE: + HEADLINE: Feed + FORM_DATA: + SUMMARY: "Questo è il riassunto di quanto ci hai scritto:" + ERROR: Errore + +ro: + BLOG: + ITEM: + CONTINUE_READING: Mai multe... + NEXT_POST: Următorul articol + PREV_POST: Articolul anterior + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: Căutare + RELATED_POSTS: + HEADLINE: Articole corelate + RANDOM_ARTICLE: + HEADLINE: Articol aleator + FEELING_LUCKY: Mă simt norocos + SOME_TEXT_WIDGET: + HEADLINE: Text modular + POPULAR_TAGS: + HEADLINE: Etichete populare + ARCHIVES: + HEADLINE: Arhive + SYNDICATE: + HEADLINE: Abonați-vă + FORM_DATA: + SUMMARY: "Acesta este rezumatul mesajului Dvs:" + ERROR: Eroare + +ru: + TRANSLATION_TEST: Antimatter! + BLOG: + ITEM: + CONTINUE_READING: Читать далее... + NEXT_POST: Следующая запись + PREV_POST: Предыдущая запись + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: Поиск + RELATED_POSTS: + HEADLINE: Также читайте + RANDOM_ARTICLE: + HEADLINE: Случайная запись + FEELING_LUCKY: Мне повезёт! + SOME_TEXT_WIDGET: + HEADLINE: Текстовой виджет + POPULAR_TAGS: + HEADLINE: Популярные теги + ARCHIVES: + HEADLINE: Архив + SYNDICATE: + HEADLINE: Синдикация + FORM_DATA: + SUMMARY: "Вы написали нам:" + ERROR: Ошибка + +uk: + TRANSLATION_TEST: Antimatter! + BLOG: + ITEM: + CONTINUE_READING: Читати далі... + NEXT_POST: Наступний запис + PREV_POST: Попередній запис + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: Пошук + RELATED_POSTS: + HEADLINE: Також читайте + RANDOM_ARTICLE: + HEADLINE: Випадковий запис + FEELING_LUCKY: Мені пощастить! + SOME_TEXT_WIDGET: + HEADLINE: Текстовий віджет + POPULAR_TAGS: + HEADLINE: Популярні теги + ARCHIVES: + HEADLINE: Архів + SYNDICATE: + HEADLINE: Синдикація + FORM_DATA: + SUMMARY: "Ви написали нам:" + ERROR: Помилка + +hr: + TRANSLATION_TEST: Antimatter! + BLOG: + ITEM: + CONTINUE_READING: Nastavi s čitanjem... + NEXT_POST: Slijedeća objava + PREV_POST: Prethodna objava + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: Pretraživanje + RELATED_POSTS: + HEADLINE: Povezane objave + RANDOM_ARTICLE: + HEADLINE: Slučajni članak + FEELING_LUCKY: Osjećam se sretno! + SOME_TEXT_WIDGET: + HEADLINE: Neki tekst widget + POPULAR_TAGS: + HEADLINE: Popularni tagovi + ARCHIVES: + HEADLINE: Arhiva + SYNDICATE: + HEADLINE: Kanali + FORM_DATA: + SUMMARY: "Ovo je sažetak onog što ste nam napisali:" + ERROR: Greška + +pl: + TRANSLATION_TEST: Antimatter! + BLOG: + ITEM: + CONTINUE_READING: Czytaj dalej... + NEXT_POST: Następny wpis + PREV_POST: Poprzedni wpis + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: Szukaj + RELATED_POSTS: + HEADLINE: Powiązane wpisy + RANDOM_ARTICLE: + HEADLINE: Losowy wpis + FEELING_LUCKY: Szczęśliwy traf! + SOME_TEXT_WIDGET: + HEADLINE: Jakiś tekst - widget + POPULAR_TAGS: + HEADLINE: Popularne tagi + ARCHIVES: + HEADLINE: Archiwum + SYNDICATE: + HEADLINE: Feed + FORM_DATA: + SUMMARY: "Podsumowanie tego co do nas napisałeś:" + ERROR: Błąd + +pt-BR: + TRANSLATION_TEST: Antimatter! + BLOG: + ITEM: + CONTINUE_READING: Continue lendo... + NEXT_POST: Próximo Post + PREV_POST: Post anterior + SIDEBAR: + SIMPLE_SEARCH: + HEADLINE: Buscar + RELATED_POSTS: + HEADLINE: Posts relacionados + RANDOM_ARTICLE: + HEADLINE: Artigo aleatório + FEELING_LUCKY: Me sinto sortudo. + SOME_TEXT_WIDGET: + HEADLINE: Algum widget de texto + POPULAR_TAGS: + HEADLINE: Tags Populares + ARCHIVES: + HEADLINE: Arquivos + SYNDICATE: + HEADLINE: Feed + FORM_DATA: + SUMMARY: "Aqui está o resumo do que você nos escreveu:" + ERROR: Erro diff --git a/user/themes/antimatter/scss/configuration/template/_colors.scss b/user/themes/antimatter/scss/configuration/template/_colors.scss index 01aff52..392b25a 100644 --- a/user/themes/antimatter/scss/configuration/template/_colors.scss +++ b/user/themes/antimatter/scss/configuration/template/_colors.scss @@ -52,7 +52,7 @@ $rule-color: #F0F2F4; $code-text: #c7254e; $code-bg: #f9f2f4; $pre-text: #237794; -$pre-bg: #f6f6f6; +$pre-bg: #f0f0f0; // Dark Contrast variation $dark-navbar-text: #999; diff --git a/user/themes/antimatter/scss/template/_header.scss b/user/themes/antimatter/scss/template/_header.scss index 9d2ad8f..af60770 100644 --- a/user/themes/antimatter/scss/template/_header.scss +++ b/user/themes/antimatter/scss/template/_header.scss @@ -1,4 +1,5 @@ // Header styling +$dropdown-color: #f6f6f6; #header { @extend .default-animation; @@ -32,6 +33,10 @@ #navbar a:before, #navbar a:after { background-color: $core-accent !important; } + + .navigation { + margin-top: 0.5rem !important; + } } // set heights for vertical centering @@ -56,6 +61,44 @@ #navbar { font-size: $core-font-size - 0.1rem; + + /* Child Indicator */ + .has-children { + + & > a { + & > span { + display: inline-block; + padding-right: 8px; + + &:after { + font-family: FontAwesome; + content: '\f107'; + position: absolute; + display: inline-block; + right: 8px; + top: 4px; + } + } + &:after, &:before { + display: none; + } + } + + & .has-children > a > span:after { + content: '\f105'; + } + } + + .navigation > .has-children:hover > a { + background: $dropdown-color; + border: 1px solid darken($dropdown-color, 4%); + border-bottom-color: $dropdown-color; + margin: -1px -1px 0 -1px; + z-index: 1000; + position: relative; + padding-bottom: 1px; + } + ul { margin: 0; @@ -63,10 +106,12 @@ list-style: none; &.navigation { - @extend %vertical-align; display: inline-block; - float: right; + @extend .default-animation; + + margin-top: 1.4rem; + li { float: left; position: relative; @@ -76,6 +121,9 @@ display: inline-block; padding: 0.3rem 0.8rem; + -webkit-backface-visibility: hidden; + + &:before, &:after { content: ""; position: absolute; @@ -87,6 +135,7 @@ visibility: hidden; @include transform(scaleX(0)); @include transition(all 0.2s ease); + } &:hover:before { @@ -109,49 +158,55 @@ } } - // Dropdown Menu Styles + /*Active dropdown nav item */ ul { + position: absolute; + background-color: $dropdown-color; + border: 1px solid darken($dropdown-color, 4%); + border-top: 0; + min-width: 12rem; + text-align: left; + z-index: 999; + left: -1px; display: none; - padding: 0; - box-shadow: 0 0.05rem 1rem rgba(0,0,0, 0.15) !important; } + ul li { + display: block; + float: none; + + /* Active Dropdown nav item */ + &.active > a { + background-color: darken($dropdown-color, 4%); + color: $core-accent; + } + + &:hover > a { + background-color: $core-accent; + color: $white; + } + + a { + display: block; + margin: 0 -1px; + + &:after, &:before { + display: none; + } + } + } + + /* Dropdown CSS */ ul ul { left: 100%; - top: 0; - } - - - &:hover { - & > ul { - display: block; - position: absolute; - background: rgba($white, 0.9); - width: 10rem; - } - - li { - float: none; - margin: 0; - padding: 0; - - a { - padding: 0.5rem 0.8rem; - display: block; - - &:before, &:after { - display: none; - } - } - - &.active { - & > a { - background: $core-accent; - color: $white; - } - } - } + top: 0px; } + + /* Active on Hover */ + &:hover > ul { + display: block; + } + } @include breakpoint(desktop-only) { display: none; @@ -207,6 +262,10 @@ background-color: rgba($header-text,0); box-shadow: none; + .navigation .has-children:hover a { + color: $core-accent; + } + #logo h3, #logo a { color: $header-text; } @@ -217,15 +276,5 @@ background-color: rgba($header-text,0.7) !important; } - #navbar ul.navigation { - - ul li a { - - color: $core-accent; - &:hover { - color: darken($core-accent, 20%); - } - } - } } } diff --git a/user/themes/antimatter/scss/template/_simplesearch.scss b/user/themes/antimatter/scss/template/_simplesearch.scss index 65101c0..a586dd6 100644 --- a/user/themes/antimatter/scss/template/_simplesearch.scss +++ b/user/themes/antimatter/scss/template/_simplesearch.scss @@ -32,6 +32,17 @@ } } + .search-wrapper { + .search-submit { + height: 52px; + padding: 0 10px; + img { + width: 30px; + } + } + } + + .search-details { float: right; margin-top: -2.5rem; diff --git a/user/themes/antimatter/templates/blog.html.twig b/user/themes/antimatter/templates/blog.html.twig index d36d20f..b0612ac 100644 --- a/user/themes/antimatter/templates/blog.html.twig +++ b/user/themes/antimatter/templates/blog.html.twig @@ -10,7 +10,7 @@ {% else %}
{% endif %} - {{ page.content }} + {{ page.content|raw }}
{% if config.plugins.breadcrumbs.enabled %} @@ -18,7 +18,7 @@ {% endif %}
-
+
{% for child in collection %} {% include 'partials/blog_item.html.twig' with {'blog':page, 'page':child, 'truncate':true} %} {% endfor %} diff --git a/user/themes/antimatter/templates/default.html.twig b/user/themes/antimatter/templates/default.html.twig index 7bf9c0e..6d7edfa 100644 --- a/user/themes/antimatter/templates/default.html.twig +++ b/user/themes/antimatter/templates/default.html.twig @@ -1,5 +1,5 @@ {% extends 'partials/base.html.twig' %} {% block content %} - {{ page.content }} + {{ page.content|raw }} {% endblock %} diff --git a/user/themes/antimatter/templates/error.html.twig b/user/themes/antimatter/templates/error.html.twig index 55913fa..5429997 100644 --- a/user/themes/antimatter/templates/error.html.twig +++ b/user/themes/antimatter/templates/error.html.twig @@ -3,9 +3,9 @@ {% block content %}
-

Error {{ page.header.http_response_code }}

+

{{ 'ERROR'|t }} {{ page.header.http_response_code }}

- {{ page.content }} + {{ page.content|raw }}

diff --git a/user/themes/antimatter/templates/form.html.twig b/user/themes/antimatter/templates/form.html.twig index 7bedb48..3523d06 100644 --- a/user/themes/antimatter/templates/form.html.twig +++ b/user/themes/antimatter/templates/form.html.twig @@ -2,7 +2,7 @@ {% block content %} - {{ content }} + {{ content|raw }} {% include "forms/form.html.twig" %} {% endblock %} diff --git a/user/themes/antimatter/templates/item.html.twig b/user/themes/antimatter/templates/item.html.twig index b7990bf..bce071c 100644 --- a/user/themes/antimatter/templates/item.html.twig +++ b/user/themes/antimatter/templates/item.html.twig @@ -6,7 +6,7 @@ {% endif %}
-
+
{% include 'partials/blog_item.html.twig' with {'blog':page.parent, 'truncate':false} %}