From 259ad356ac7cccd772d550c72a317345461e776d Mon Sep 17 00:00:00 2001 From: RealStickman Date: Sat, 19 Nov 2022 15:55:01 +0100 Subject: [PATCH] (Grav GitSync) Automatic Commit from RealStickman --- plugins/devtools/CHANGELOG.md | 197 ++++++++++ plugins/devtools/LICENSE | 21 + plugins/devtools/README.md | 79 ++++ plugins/devtools/blueprints.yaml | 41 ++ plugins/devtools/classes/DevToolsCommand.php | 362 ++++++++++++++++++ plugins/devtools/cli/NewBlueprintCommand.php | 88 +++++ plugins/devtools/cli/NewPluginCommand.php | 146 +++++++ plugins/devtools/cli/NewThemeCommand.php | 171 +++++++++ .../blueprint/append/blueprint.yaml.twig | 21 + .../blueprint/newtab/blueprint.yaml.twig | 15 + .../components/plugin/blank/CHANGELOG.md.twig | 5 + .../components/plugin/blank/LICENSE.twig | 21 + .../components/plugin/blank/README.md.twig | 59 +++ .../plugin/blank/blueprints.yaml.twig | 37 ++ .../components/plugin/blank/classes/.gitkeep | 0 .../plugin/blank/composer.json.twig | 30 ++ .../plugin/blank/languages.yaml.twig | 4 + .../components/plugin/blank/plugin.php.twig | 59 +++ .../components/plugin/blank/plugin.yaml.twig | 2 + .../theme/inheritance/CHANGELOG.md.twig | 5 + .../components/theme/inheritance/LICENSE.twig | 21 + .../theme/inheritance/README.md.twig | 7 + .../theme/inheritance/blueprints.yaml.twig | 19 + .../components/theme/inheritance/css/.gitkeep | 0 .../components/theme/inheritance/js/.gitkeep | 0 .../theme/inheritance/screenshot.jpg | Bin 0 -> 15428 bytes .../theme/inheritance/templates/.gitkeep | 0 .../theme/inheritance/theme.php.twig | 9 + .../theme/inheritance/theme.yaml.twig | 10 + .../theme/inheritance/thumbnail.jpg | Bin 0 -> 3681 bytes .../theme/pure-blank/CHANGELOG.md.twig | 5 + .../components/theme/pure-blank/LICENSE.twig | 21 + .../theme/pure-blank/README.md.twig | 7 + .../theme/pure-blank/blueprints.yaml.twig | 33 ++ .../theme/pure-blank/css/custom.css | 175 +++++++++ .../theme/pure-blank/fonts/.gitkeep | 0 .../theme/pure-blank/images/logo.png | Bin 0 -> 8714 bytes .../components/theme/pure-blank/js/.gitkeep | 0 .../theme/pure-blank/screenshot.jpg | Bin 0 -> 15428 bytes .../pure-blank/templates/default.html.twig | 5 + .../pure-blank/templates/error.html.twig | 8 + .../templates/partials/base.html.twig | 70 ++++ .../templates/partials/navigation.html.twig | 47 +++ .../theme/pure-blank/theme.php.twig | 9 + .../theme/pure-blank/theme.yaml.twig | 3 + .../components/theme/pure-blank/thumbnail.jpg | Bin 0 -> 3681 bytes .../theme/tailwind/CHANGELOG.md.twig | 5 + .../components/theme/tailwind/LICENSE.twig | 21 + .../components/theme/tailwind/README.md.twig | 41 ++ .../theme/tailwind/blueprints.yaml.twig | 43 +++ .../components/theme/tailwind/css/site.css | 5 + .../components/theme/tailwind/fonts/.gitkeep | 0 .../components/theme/tailwind/images/logo.png | Bin 0 -> 8714 bytes .../components/theme/tailwind/js/.gitkeep | 0 .../theme/tailwind/languages/en.yaml.twig | 2 + .../theme/tailwind/package.json.twig | 30 ++ .../theme/tailwind/postcss.config.js | 11 + .../components/theme/tailwind/screenshot.jpg | Bin 0 -> 15428 bytes .../theme/tailwind/tailwind.config.js.twig | 70 ++++ .../tailwind/templates/default.html.twig | 5 + .../theme/tailwind/templates/error.html.twig | 8 + .../templates/partials/base.html.twig | 67 ++++ .../templates/partials/navigation.html.twig | 47 +++ .../components/theme/tailwind/theme.php.twig | 9 + .../components/theme/tailwind/theme.yaml.twig | 4 + .../components/theme/tailwind/thumbnail.jpg | Bin 0 -> 3681 bytes plugins/devtools/devtools.php | 13 + plugins/devtools/devtools.yaml | 2 + plugins/devtools/languages.yaml | 3 + 69 files changed, 2198 insertions(+) create mode 100644 plugins/devtools/CHANGELOG.md create mode 100644 plugins/devtools/LICENSE create mode 100644 plugins/devtools/README.md create mode 100644 plugins/devtools/blueprints.yaml create mode 100644 plugins/devtools/classes/DevToolsCommand.php create mode 100644 plugins/devtools/cli/NewBlueprintCommand.php create mode 100644 plugins/devtools/cli/NewPluginCommand.php create mode 100644 plugins/devtools/cli/NewThemeCommand.php create mode 100644 plugins/devtools/components/blueprint/append/blueprint.yaml.twig create mode 100644 plugins/devtools/components/blueprint/newtab/blueprint.yaml.twig create mode 100644 plugins/devtools/components/plugin/blank/CHANGELOG.md.twig create mode 100644 plugins/devtools/components/plugin/blank/LICENSE.twig create mode 100644 plugins/devtools/components/plugin/blank/README.md.twig create mode 100644 plugins/devtools/components/plugin/blank/blueprints.yaml.twig create mode 100644 plugins/devtools/components/plugin/blank/classes/.gitkeep create mode 100644 plugins/devtools/components/plugin/blank/composer.json.twig create mode 100644 plugins/devtools/components/plugin/blank/languages.yaml.twig create mode 100644 plugins/devtools/components/plugin/blank/plugin.php.twig create mode 100644 plugins/devtools/components/plugin/blank/plugin.yaml.twig create mode 100644 plugins/devtools/components/theme/inheritance/CHANGELOG.md.twig create mode 100644 plugins/devtools/components/theme/inheritance/LICENSE.twig create mode 100644 plugins/devtools/components/theme/inheritance/README.md.twig create mode 100644 plugins/devtools/components/theme/inheritance/blueprints.yaml.twig create mode 100644 plugins/devtools/components/theme/inheritance/css/.gitkeep create mode 100644 plugins/devtools/components/theme/inheritance/js/.gitkeep create mode 100644 plugins/devtools/components/theme/inheritance/screenshot.jpg create mode 100644 plugins/devtools/components/theme/inheritance/templates/.gitkeep create mode 100644 plugins/devtools/components/theme/inheritance/theme.php.twig create mode 100644 plugins/devtools/components/theme/inheritance/theme.yaml.twig create mode 100644 plugins/devtools/components/theme/inheritance/thumbnail.jpg create mode 100644 plugins/devtools/components/theme/pure-blank/CHANGELOG.md.twig create mode 100644 plugins/devtools/components/theme/pure-blank/LICENSE.twig create mode 100644 plugins/devtools/components/theme/pure-blank/README.md.twig create mode 100644 plugins/devtools/components/theme/pure-blank/blueprints.yaml.twig create mode 100644 plugins/devtools/components/theme/pure-blank/css/custom.css create mode 100644 plugins/devtools/components/theme/pure-blank/fonts/.gitkeep create mode 100644 plugins/devtools/components/theme/pure-blank/images/logo.png create mode 100644 plugins/devtools/components/theme/pure-blank/js/.gitkeep create mode 100644 plugins/devtools/components/theme/pure-blank/screenshot.jpg create mode 100644 plugins/devtools/components/theme/pure-blank/templates/default.html.twig create mode 100644 plugins/devtools/components/theme/pure-blank/templates/error.html.twig create mode 100644 plugins/devtools/components/theme/pure-blank/templates/partials/base.html.twig create mode 100644 plugins/devtools/components/theme/pure-blank/templates/partials/navigation.html.twig create mode 100644 plugins/devtools/components/theme/pure-blank/theme.php.twig create mode 100644 plugins/devtools/components/theme/pure-blank/theme.yaml.twig create mode 100644 plugins/devtools/components/theme/pure-blank/thumbnail.jpg create mode 100644 plugins/devtools/components/theme/tailwind/CHANGELOG.md.twig create mode 100644 plugins/devtools/components/theme/tailwind/LICENSE.twig create mode 100644 plugins/devtools/components/theme/tailwind/README.md.twig create mode 100644 plugins/devtools/components/theme/tailwind/blueprints.yaml.twig create mode 100644 plugins/devtools/components/theme/tailwind/css/site.css create mode 100644 plugins/devtools/components/theme/tailwind/fonts/.gitkeep create mode 100644 plugins/devtools/components/theme/tailwind/images/logo.png create mode 100644 plugins/devtools/components/theme/tailwind/js/.gitkeep create mode 100644 plugins/devtools/components/theme/tailwind/languages/en.yaml.twig create mode 100644 plugins/devtools/components/theme/tailwind/package.json.twig create mode 100644 plugins/devtools/components/theme/tailwind/postcss.config.js create mode 100644 plugins/devtools/components/theme/tailwind/screenshot.jpg create mode 100644 plugins/devtools/components/theme/tailwind/tailwind.config.js.twig create mode 100644 plugins/devtools/components/theme/tailwind/templates/default.html.twig create mode 100644 plugins/devtools/components/theme/tailwind/templates/error.html.twig create mode 100644 plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig create mode 100644 plugins/devtools/components/theme/tailwind/templates/partials/navigation.html.twig create mode 100644 plugins/devtools/components/theme/tailwind/theme.php.twig create mode 100644 plugins/devtools/components/theme/tailwind/theme.yaml.twig create mode 100644 plugins/devtools/components/theme/tailwind/thumbnail.jpg create mode 100644 plugins/devtools/devtools.php create mode 100644 plugins/devtools/devtools.yaml create mode 100644 plugins/devtools/languages.yaml diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md new file mode 100644 index 0000000..607b2c2 --- /dev/null +++ b/plugins/devtools/CHANGELOG.md @@ -0,0 +1,197 @@ +# v1.5.4 +## 10/26/2021 + +1. [](#improved) + * Moved offline check to CLI flag [#70](https://github.com/getgrav/grav-plugin-devtools/issues/70) + * Updated footer copyrights for Pure Blank + +# v1.5.3 +## 06/16/2021 + +1. [](#bugfix) + * Fixes over-zealous regex that caused duplication in copy tasks [#69](https://github.com/getgrav/grav-plugin-devtools/issues/69) + +# v1.5.2 +## 05/19/2021 + +1. [](#new) + * Added basic TailwindCSS theme [#65](https://github.com/getgrav/grav-plugin-devtools/pull/65) +1. [](#improved) + * Fixed typo [#67](https://github.com/getgrav/grav-plugin-devtools/pull/67) + * Use canonical URLs [#58](https://github.com/getgrav/grav-plugin-devtools/pull/58) + * Replace `theme_config` with `config.theme` [#60](https://github.com/getgrav/grav-plugin-devtools/pull/60) +1. [](#bugfix) + * Fixed a bad path regarding composer install after plugin creation + +# v1.5.1 +## 03/17/2021 + +1. [](#improved) + * Clearer instructions for composer initialization [#62](https://github.com/getgrav/grav-plugin-devtools/pull/62) + * Comment out autoload subscription event by default now that Grav 1.7 is out [#62](https://github.com/getgrav/grav-plugin-devtools/pull/62) + +# v1.5.0 +## 02/18/2021 + +1. [](#new) + * Updated CLI commands for latest standards + * Pass phpstan level 8 tests +1. [](#improved) + * Add default configuration to an inherited theme's YAML file [getgrav/grav-premium-issues#50](https://github.com/getgrav/grav-premium-issues/issues/50) +1. [](#bugfix) + * Output cmd does not correctly show colors [#56](https://github.com/getgrav/grav-plugin-devtools/issues/56) + +# v1.4.2 +## 12/02/2020 + +1. [](#improved) + * User return typehints in plugin.php + * Add proper twig escapes into a new theme + +# v1.4.1 +## 05/20/2020 + +1. [](#improved) + * Make name key Composer 2.0 compatible [#48](https://github.com/getgrav/grav-plugin-devtools/pull/48) +1. [](#bugfix) + * Correct type for themes [#49](https://github.com/getgrav/grav-plugin-devtools/pull/49) + +# v1.4.0 +## 04/27/2020 + +1. [](#new) + * Added new required `slug:` and `type:` attributes to blueprints +1. [](#improved) + * Fixed plugin autoload + +# v1.3.1 +## 02/24/2020 + +1. [](#improved) + * Set `validation: loose` in plugin blueprints by default + * Add Grav 1.6 dependency to all new plugins and themes + +# v1.3.0 +## 02/13/2020 + +1. [](#improved) + * Added composer-based autoloader to the `new-plugin` command + +# v1.2.4 +## 11/06/2019 + +1. [](#improved) + * Added the ability to use devtools without an online connection to GPM +1. [](#bugfix) + * Regression fix for missing `theme_config` in pure-blank [#45](https://github.com/getgrav/grav-plugin-devtools/issues/45) + +# v1.2.3 +## 06/20/2019 + +1. [](#improved) + * pure-blank: Use new 'deferred' blocks for header + * pure-blank: Use `home_url` variable + * pure-blank: Improved `README.md.twig` + +# v1.2.2 +## 04/21/2019 + +1. [](#bugfix) + * Add Github username field to new-theme template [#39](https://github.com/getgrav/grav-plugin-devtools/pull/39) + +# v1.2.1 +## 08/04/2018 + +1. [](#bugfix) + * Fixed incorrect folder name as a result of renaming typo of `inheritence` to `inheritance` [#32](https://github.com/getgrav/grav-plugin-devtools/issues/32) + +# v1.2.0 +## 07/25/2018 + +1. [](#new) + * Internationalization for blank plugin component [#30](https://github.com/getgrav/grav-plugin-devtools/issues/30) +1. [](#improved) + * Added a new check for reserved PHP words [#7](https://github.com/getgrav/grav-plugin-devtools/issues/7) + * Improved regex for valid emails [#21](https://github.com/getgrav/grav-plugin-devtools/issues/21) +1. [](#bugfix) + * Fix broken renaming when doing a theme 'copy' + * Typos [#31](https://github.com/getgrav/grav-plugin-devtools/pull/31) + +# v1.1.1 +## 03/29/2018 + +1. [](#bugfix) + * Fixed theme inheritance bug [#25](https://github.com/getgrav/grav-plugin-devtools/pull/25) + +# v1.1.0 +## 03/29/2018 + +1. [](#new) + * Added new Theme `copy` option to create a new theme from another +1. [](#improved) + * Stop flushing GPM cache on each call to speed things up considerably! +1. [](#bugfix) + * Updated README.md [#23](https://github.com/getgrav/grav-plugin-devtools/pull/23) + * Properly extend Theme or Plugin [#24](https://github.com/getgrav/grav-plugin-devtools/pull/24) + +# v1.0.8 +## 10/02/2017 + +1. [](#bugfix) + inherited theme is after new theme [#9](https://github.com/getgrav/grav-plugin-devtools/issues/9) + +# v1.0.7 +## 10/02/2017 + +1. [](#bugfix) + * Various fixes for things that broke with the blueprint generation PR [#20](https://github.com/getgrav/grav-plugin-devtools/issues/20) + +# v1.0.6 +## 09/28/2017 + +1. [](#new) + * Added blueprint generation [#17](https://github.com/getgrav/grav-plugin-devtools/pull/17) +1. [](#improved) + * changed Pure CDN location [#19](https://github.com/getgrav/grav-plugin-devtools/pull/19) +1. [](#bugfix) + * Fixed readme referencing `githubid` [#13](https://github.com/getgrav/grav-plugin-devtools/pull/13) + +# v1.0.5 +## 02/26/2017 + +1. [](#improved) + * Added GitHub ID prompt [#5](https://github.com/getgrav/grav-plugin-devtools/pull/5) +1. [](#bugfix) + * Added missing closing html tag [#12](https://github.com/getgrav/grav-plugin-devtools/pull/12) + +# v1.0.4 +## 10/19/2016 + +1. [](#improved) + * More complete README.md + * Typo in Error template + +# v1.0.3 +## 09/16/2016 + +1. [](#bugfix) + * Removed `Theme` from theme's class causing events to not process - https://github.com/getgrav/grav/issues/1047 + * Typo in README.md + +# v1.0.2 +## 07/20/2016 + +1. [](#bugfix) + * Removed old `header.html.twig` + +# v1.0.1 +## 05/06/2016 + +1. [](#bugfix) + * Fix for Grav 1.0.x + +# v1.0.0 +## 04/19/2016 + +1. [](#new) + * ChangeLog started... diff --git a/plugins/devtools/LICENSE b/plugins/devtools/LICENSE new file mode 100644 index 0000000..4bb7092 --- /dev/null +++ b/plugins/devtools/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Grav + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/devtools/README.md b/plugins/devtools/README.md new file mode 100644 index 0000000..c785a2b --- /dev/null +++ b/plugins/devtools/README.md @@ -0,0 +1,79 @@ +# Grav Devtools Plugin + +The `devtools` is a [Grav](http://github.com/getgrav/grav) Plugin that lets you quickly create a scaffolding for your new plugins and themes. The plugin provides CLI commands that allow for the quick and easy deployment of a sample scaffolding for your new plugin. + +# Installation + +## GPM Installation (Preferred) + +The simplest way to install this plugin is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm). From the root of your Grav install type: + + bin/gpm install devtools + +## Manual Installation + +If for some reason you can't use GPM you can manually install this plugin. Download the zip version of this repository and unzip it under `/your/site/grav/user/plugins`. Then, rename the folder to `devtools`. + +You should now have all the plugin files under + + /your/site/grav/user/plugins/devtools + +## Configuration + +By default, devtools will perform a check with the online gpm repository to ensure name-collision avoidance. If you wish to not perform this online check, change the devtools.yaml at `user/config/plugins` from `collision_check: true` to `collision_check: false`. + +# Usage + +## Plugin Scaffolding + +To create a new plugin you simply need to run: `bin/plugin devtools new-plugin` and fill in the few questions at the prompts: + +``` +> bin/plugin devtools new-plugin +Enter Plugin Name: MyPlugin +Enter Plugin Description: My New Custom Plugin +Enter Developer Name: Johnny Rotten +Enter GitHub ID (can be blank): pretty-vacant +Enter Developer Email: johnny@rotten.com + +SUCCESS plugin myplugin -> Created Successfully + +Path: /home/johnnyr/webroot/grav-installation/user/plugins/myplugin +``` + +## Theme Scaffolding + +To create a new theme you simply need to run: `bin/plugin devtools new-theme` and fill in the few questions at the prompts: + +``` +> bin/plugin devtools new-theme +Enter Theme Name: MyTheme +Enter Theme Description: My New Custom Theme +Enter Developer Name: Johnny Rotten +Enter GitHub ID (can be blank): pretty-vacant +Enter Developer Email: johnny@rotten.com +Please choose a template type + [pure-blank ] Basic Theme using Pure.css + [inheritance] Inherit from another theme + [copy ] Copy another theme + > pure-blank + +SUCCESS theme mytheme -> Created Successfully + +Path: /home/johnnyr/webroot/grav-installation/user/themes/mytheme +``` + +There are **three template creation options** + +1. `pure-blank` - This is a very basic blank theme that uses the [Pure CSS framework](http://purecss.io/) +2. `inheritance` - This creates a very basic template with minimal files that inherits a base theme. To find out more about theme inheritance, [check out the subject in more details on the Grav Learn site](https://learn.getgrav.org/themes/customization#theme-inheritance). +3. `copy` - This allows you to create a new theme based on an existing theme. This is the simplest way to get started with a new theme by using another theme as the basis. + +## Skipping Online Project Name Collision Checking + +By default, devtools will check your project's name with the existing gpm ecosystem to ensure no collisions. In order to skip this check, add an `--offline` or `-o` to your command: + + `bin/plugin devtools new-theme --offline` +or + + `bin/plugin devtools new-theme -o` diff --git a/plugins/devtools/blueprints.yaml b/plugins/devtools/blueprints.yaml new file mode 100644 index 0000000..33f8c40 --- /dev/null +++ b/plugins/devtools/blueprints.yaml @@ -0,0 +1,41 @@ +name: DevTools +slug: devtools +type: plugin +version: 1.5.4 +description: Plugin and Theme scaffolding utilities +icon: cogs +author: + name: Team Grav + email: devs@getgrav.org + url: http://getgrav.org +homepage: https://github.com/getgrav/grav-plugin-devtools +keywords: devtools, plugin, theme +bugs: https://github.com/getgrav/grav-plugin-devtools/issues +license: MIT + +dependencies: + - { name: grav, version: '>=1.7.0' } + +form: + validation: strict + fields: + enabled: + type: toggle + label: PLUGIN_ADMIN.PLUGIN_STATUS + highlight: 1 + default: 0 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + collision_check: + type: toggle + label: PLUGIN_DEVTOOLS.COLLISION_CHECK + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool diff --git a/plugins/devtools/classes/DevToolsCommand.php b/plugins/devtools/classes/DevToolsCommand.php new file mode 100644 index 0000000..1271f06 --- /dev/null +++ b/plugins/devtools/classes/DevToolsCommand.php @@ -0,0 +1,362 @@ +init(); + $grav['uri']->init(); + + $this->inflector = $grav['inflector']; + $this->locator = $grav['locator']; + $this->twig = $grav['twig']; + $this->gpm = new GPM(); + + //Add `theme://` to prevent fail + $this->locator->addPath('theme', '', []); + $this->locator->addPath('plugin', '', []); + $this->locator->addPath('blueprint', '', []); + // $this->config->set('theme', $config->get('themes.' . $name)); + } + + /** + * Backwards compatibility to Grav 1.6. + * + * @return InputInterface + */ + public function getInput(): InputInterface + { + return $this->input; + } + + /** + * Backwards compatibility to Grav 1.6. + * + * @return SymfonyStyle + */ + public function getIO(): SymfonyStyle + { + $output = $this->output; + if (!$output instanceof SymfonyStyle) { + $this->output = $output = new SymfonyStyle($this->input, $this->output); + } + + return $this->output; + } + + /** + * Copies the component type and renames accordingly + * + * @return bool + */ + protected function createComponent(): bool + { + $name = $this->component['name']; + $folder_name = strtolower($this->inflector::hyphenize($name)); + $new_theme = $folder_name; + $type = $this->component['type']; + $grav = Grav::instance(); + $config = $grav['config']; + $current_theme = $config->get('system.pages.theme'); + $template = $this->component['template']; + $source_theme = null; + + if (isset($this->component['copy'])) { + $current_theme = $this->component['copy']; + $source_theme = $this->locator->findResource('themes://' . $current_theme); + $template_folder = $source_theme; + } else { + $template_folder = __DIR__ . "/../components/{$type}/{$template}"; + } + + if ($type === 'blueprint') { + $component_folder = $this->locator->findResource('themes://' . $current_theme) . '/blueprints'; + } else { + $component_folder = $this->locator->findResource($type . 's://') . DS . $folder_name; + } + + if (false === $template_folder) { + $this->output->writeln("Theme {$current_theme} does not exist"); + return false; + } + + if ($template === 'inheritance') { + $parent_theme = $this->component['extends']; + $yaml_file = $this->locator->findResource('themes://' . $parent_theme) . '/' . $parent_theme . '.yaml'; + $this->component['config'] = file_get_contents($yaml_file);; + } + + if (isset($source_theme)) { + /** + * Copy existing theme and regex-replace old stuff with new + */ + + // Get source if a symlink + if (is_link($template_folder)) { + $template_folder = readlink($template_folder); + if (false === $template_folder) { + $this->output->writeln("Theme {$current_theme} is a bad symlink"); + return false; + } + } + + //Copy All files to component folder + try { + Folder::copy($template_folder, $component_folder, '/.git|node_modules/'); + } catch (\Exception $e) { + $this->output->writeln("" . $e->getMessage() . ""); + return false; + } + + // Do some filename renaming + $base_old_filename = $component_folder . '/' . $current_theme; + $base_new_filename = $component_folder . '/' . $new_theme; + @rename( $base_old_filename . '.php', $base_new_filename . '.php'); + @rename( $base_old_filename . '.yaml', $base_new_filename . '.yaml'); + + $camelized_current = $this->inflector::camelize($current_theme); + $camelized_new = $this->inflector::camelize($name); + + $hyphenized_current = $this->inflector::hyphenize($current_theme); + $hyphenized_new = $this->inflector::hyphenize($name); + + $titleized_current = $this->inflector::titleize($current_theme); + $titleized_new = $this->inflector::titleize($name); + + $underscoreized_current = $this->inflector::underscorize($current_theme); + $underscoreized_new = $this->inflector::underscorize($name); + + $variations_regex = [ + ["/$camelized_current/", "/$hyphenized_current/"], + [$camelized_new, $hyphenized_new] + ]; + + if (!in_array("/$titleized_current/", array_values($variations_regex[0]))) { + $current_regex = $variations_regex[0]; + $new_regex = $variations_regex[1]; + $current_regex[] = "/$titleized_current/"; + $new_regex[] = $titleized_new; + $variations_regex = [$current_regex, $new_regex]; + } + + if (!in_array("/$underscoreized_current/", array_values($variations_regex[0]))) { + $current_regex = $variations_regex[0]; + $new_regex = $variations_regex[1]; + $current_regex[] = "/$underscoreized_current/"; + $new_regex[] = $underscoreized_new; + $variations_regex = [$current_regex, $new_regex]; + } + + $regex_array = [ + $new_theme . '.php' => $variations_regex, + 'blueprints.yaml' => $variations_regex, + 'README.md' => $variations_regex, + ]; + + foreach ($regex_array as $filename => $data) { + $filename = $component_folder . '/' . $filename; + if (!file_exists($filename)) { + continue; + } + $file = file_get_contents($filename); + if ($file) { + $file = preg_replace($data[0], $data[1], $file); + } + file_put_contents($filename, $file); + } + + echo $source_theme; + + } else { + /** + * Use components folder and twig processing + */ + //Copy All files to component folder + try { + Folder::copy($template_folder, $component_folder); + } catch (\Exception $e) { + $this->output->writeln("" . $e->getMessage() . ""); + return false; + } + + //Add Twig vars and templates then initialize + $this->twig->twig_vars['component'] = $this->component; + $this->twig->twig_paths[] = $template_folder; + $this->twig->init(); + + //Get all templates of component then process each with twig and save + $templates = Folder::all($component_folder); + + try { + foreach($templates as $templateFile) { + if (Utils::endsWith($templateFile, '.twig') && !Utils::endsWith($templateFile, '.html.twig')) { + $content = $this->twig->processTemplate($templateFile); + $file = File::instance($component_folder . DS . str_replace('.twig', '', $templateFile)); + $file->content($content); + $file->save(); + + //Delete twig template + $file = File::instance($component_folder . DS . $templateFile); + $file->delete(); + } + } + } catch (\Exception $e) { + $this->output->writeln("" . $e->getMessage() . ""); + $this->output->writeln("Rolling back..."); + Folder::delete($component_folder); + $this->output->writeln($type . "creation failed!"); + return false; + } + if ($type !== 'blueprint') { + rename($component_folder . DS . $type . '.php', $component_folder . DS . $folder_name . '.php'); + rename($component_folder . DS . $type . '.yaml', $component_folder . DS . $folder_name . '.yaml'); + } else { + $bpname = $this->inflector::hyphenize($this->component['bpname']); + rename($component_folder . DS . $type . '.yaml', $component_folder . DS . $bpname . '.yaml'); + } + } + + $this->output->writeln(''); + $this->output->writeln('SUCCESS ' . $type . ' ' . $name . ' -> Created Successfully'); + $this->output->writeln(''); + $this->output->writeln('Path: ' . $component_folder . ''); + $this->output->writeln(''); + if ($type === 'plugin') { + $this->output->writeln('Please run `cd ' . $component_folder . '` and `composer update` to initialize the autoloader'); + $this->output->writeln(''); + } + + return true; + } + + /** + * Iterate through all options and validate + * + * @return void + */ + protected function validateOptions(): void + { + foreach (array_filter($this->options) as $type => $value) { + $this->validate($type, $value); + } + } + + /** + * @param string $type + * @param mixed $value + * @return mixed + */ + protected function validate(string $type, $value) + { + switch ($type) { + case 'name': + // Check If name + if ($value === null || trim($value) === '') { + throw new \RuntimeException('Name cannot be empty'); + } + + if (!$this->options['offline']) { + // Check for name collision with online gpm. + if (false !== $this->gpm->findPackage($value)) { + throw new \RuntimeException('Package name exists in GPM'); + } + } else { + $this->output->writeln(''); + $this->output->writeln(' Warning: Please note that by skipping the online check, your project\'s plugin or theme name may conflict with an existing plugin or theme.'); + } + + // Check if it's reserved + if ($this->isReservedWord(strtolower($value))) { + throw new \RuntimeException("\"" . $value . "\" is a reserved word and cannot be used as the name"); + } + + break; + + case 'description': + if($value === null || trim($value) === '') { + throw new \RuntimeException('Description cannot be empty'); + } + + break; + case 'themename': + if($value === null || trim($value) === '') { + throw new \RuntimeException('Theme Name cannot be empty'); + } + + break; + case 'developer': + if ($value === null || trim($value) === '') { + throw new \RuntimeException('Developer\'s Name cannot be empty'); + } + + break; + + case 'githubid': + // GitHubID can be blank, so nothing here + break; + + case 'email': + if (!preg_match('/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD', $value)) { + throw new \RuntimeException('Not a valid email address'); + } + + break; + } + + return $value; + } + + /** + * @param string $word + * @return bool + */ + public function isReservedWord(string $word): bool + { + return in_array($word, $this->reserved_keywords, true); + } +} diff --git a/plugins/devtools/cli/NewBlueprintCommand.php b/plugins/devtools/cli/NewBlueprintCommand.php new file mode 100644 index 0000000..f1dee47 --- /dev/null +++ b/plugins/devtools/cli/NewBlueprintCommand.php @@ -0,0 +1,88 @@ +setName('new-blueprint') + ->setAliases(['newblueprint','blueprint']) + ->addOption( + 'bpname', + null, + InputOption::VALUE_OPTIONAL, + 'The name of your new Grav theme' + ) + ->addOption( + 'name', + null, + InputOption::VALUE_OPTIONAL, + 'The name of your new Grav theme' + ) + ->addOption( + 'template', + null, + InputOption::VALUE_OPTIONAL, + 'The name/username of the developer' + ) + ->setDescription('Create a blueprint that extend the default.yaml blueprint files') + ->setHelp('The new-blueprint command creates a new blueprint file.'); + } + + /** + * @return int + */ + protected function serve(): int + { + $this->init(); + + $input = $this->getInput(); + $io = $this->getIO(); + + $this->component['type'] = 'blueprint'; + $this->component['template'] = 'modular'; + $this->component['version'] = '0.1.0'; + $this->component['themename'] = 'bonjour'; + + $this->options = [ + 'name' => $input->getOption('name'), + 'bpname' => $input->getOption('bpname'), + 'template' => $input->getOption('template'), + + ]; + + $this->validateOptions(); + + $this->component = array_replace($this->component, $this->options); + + if (!$this->options['template']) { + $question = new ChoiceQuestion('Please choose a template type', ['newtab', 'append']); + + $this->component['template'] = $io->askQuestion($question); + } + if (!$this->options['bpname']) { + $question = new Question('Enter Blueprint Name'); + + $this->component['bpname'] = $io->askQuestion($question); + } + + $this->createComponent(); + + return 0; + } +} diff --git a/plugins/devtools/cli/NewPluginCommand.php b/plugins/devtools/cli/NewPluginCommand.php new file mode 100644 index 0000000..f57ee23 --- /dev/null +++ b/plugins/devtools/cli/NewPluginCommand.php @@ -0,0 +1,146 @@ +setName('new-plugin') + ->setAliases(['newplugin']) + ->addOption( + 'name', + null, + InputOption::VALUE_OPTIONAL, + 'The name of your new Grav plugin' + ) + ->addOption( + 'desc', + null, + InputOption::VALUE_OPTIONAL, + 'A description of your new Grav plugin' + ) + ->addOption( + 'dev', + null, + InputOption::VALUE_OPTIONAL, + 'The name/username of the developer' + ) + ->addOption( + 'github', + null, + InputOption::VALUE_OPTIONAL, + 'The developer\'s GitHub ID' + ) + ->addOption( + 'email', + 'e', + InputOption::VALUE_OPTIONAL, + 'The developer\'s email' + ) + ->addOption( + 'offline', + 'o', + InputOption::VALUE_NONE, + 'Skip online name collision check' + ) + ->setDescription('Creates a new Grav plugin with the basic required files') + ->setHelp('The new-plugin command creates a new Grav instance and performs the creation of a plugin.'); + } + + /** + * @return int + */ + protected function serve(): int + { + $this->init(); + + $input = $this->getInput(); + $io = $this->getIO(); + + $this->component['type'] = 'plugin'; + $this->component['template'] = 'blank'; + $this->component['version'] = '0.1.0'; + + $this->options = [ + 'name' => $input->getOption('name'), + 'description' => $input->getOption('desc'), + 'author' => [ + 'name' => $input->getOption('dev'), + 'email' => $input->getOption('email'), + 'githubid' => $input->getOption('github') + ], + 'offline' => $input->getOption('offline'), + ]; + + $this->validateOptions(); + + $this->component = array_replace($this->component, $this->options); + + if (!$this->options['name']) { + $question = new Question('Enter Plugin Name'); + $question->setValidator(function ($value) { + return $this->validate('name', $value); + }); + + $this->component['name'] = $io->askQuestion($question); + } + + if (!$this->options['description']) { + $question = new Question('Enter Plugin Description'); + $question->setValidator(function ($value) { + return $this->validate('description', $value); + }); + + $this->component['description'] = $io->askQuestion($question); + } + + if (!$this->options['author']['name']) { + $question = new Question('Enter Developer Name'); + $question->setValidator(function ($value) { + return $this->validate('developer', $value); + }); + + $this->component['author']['name'] = $io->askQuestion($question); + } + + + if (!$this->options['author']['githubid']) { + $question = new Question('Enter GitHub ID (can be blank)'); + $question->setValidator(function ($value) { + return $this->validate('githubid', $value); + }); + + $this->component['author']['githubid'] = $io->askQuestion($question); + } + + if (!$this->options['author']['email']) { + $question = new Question('Enter Developer Email'); + $question->setValidator(function ($value) { + return $this->validate('email', $value); + }); + + $this->component['author']['email'] = $io->askQuestion($question); + } + + $this->component['template'] = 'blank'; + + $this->createComponent(); + + return 0; + } + +} diff --git a/plugins/devtools/cli/NewThemeCommand.php b/plugins/devtools/cli/NewThemeCommand.php new file mode 100644 index 0000000..fb479ef --- /dev/null +++ b/plugins/devtools/cli/NewThemeCommand.php @@ -0,0 +1,171 @@ +setName('new-theme') + ->setAliases(['newtheme']) + ->addOption( + 'name', + null, + InputOption::VALUE_OPTIONAL, + 'The name of your new Grav theme' + ) + ->addOption( + 'desc', + null, + InputOption::VALUE_OPTIONAL, + 'A description of your new Grav theme' + ) + ->addOption( + 'dev', + null, + InputOption::VALUE_OPTIONAL, + 'The name/username of the developer' + ) + ->addOption( + 'github', + null, + InputOption::VALUE_OPTIONAL, + 'The developer\'s GitHub ID' + ) + ->addOption( + 'email', + null, + InputOption::VALUE_OPTIONAL, + 'The developer\'s email' + ) + ->addOption( + 'offline', + 'o', + InputOption::VALUE_NONE, + 'Skip online name collision check' + ) + ->setDescription('Creates a new Grav theme with the basic required files') + ->setHelp('The new-theme command creates a new Grav instance and performs the creation of a theme.'); + } + + /** + * @return int + */ + protected function serve(): int + { + $this->init(); + + $input = $this->getInput(); + $io = $this->getIO(); + + $this->component['type'] = 'theme'; + $this->component['template'] = 'blank'; + $this->component['version'] = '0.1.0'; + + $this->options = [ + 'name' => $input->getOption('name'), + 'description' => $input->getOption('desc'), + 'author' => [ + 'name' => $input->getOption('dev'), + 'email' => $input->getOption('email'), + 'githubid' => $input->getOption('github'), + ], + 'offline' => $input->getOption('offline'), + ]; + + $this->validateOptions(); + + $this->component = array_replace($this->component, $this->options); + + if (!$this->options['name']) { + $question = new Question('Enter Theme Name'); + $question->setValidator(function ($value) { + return $this->validate('name', $value); + }); + + $this->component['name'] = $io->askQuestion($question); + } + + if (!$this->options['description']) { + $question = new Question('Enter Theme Description'); + $question->setValidator(function ($value) { + return $this->validate('description', $value); + }); + + $this->component['description'] = $io->askQuestion($question); + } + + if (!$this->options['author']['name']) { + $question = new Question('Enter Developer Name'); + $question->setValidator(function ($value) { + return $this->validate('developer', $value); + }); + + $this->component['author']['name'] = $io->askQuestion($question); + } + + if (!$this->options['author']['githubid']) { + $question = new Question('Enter GitHub ID (can be blank)'); + $question->setValidator(function ($value) { + return $this->validate('githubid', $value); + }); + + $this->component['author']['githubid'] = $io->askQuestion($question); + } + + if (!$this->options['author']['email']) { + $question = new Question('Enter Developer Email'); + $question->setValidator(function ($value) { + return $this->validate('email', $value); + }); + + $this->component['author']['email'] = $io->askQuestion($question); + } + + $question = new ChoiceQuestion( + 'Please choose an option', + ['pure-blank' => 'Basic Theme using Pure.css', 'tailwind' => 'Basic Theme using tailwind.css', 'inheritance' => 'Inherit from another theme', 'copy' => 'Copy another theme'] + ); + $this->component['template'] = $io->askQuestion($question); + + if ($this->component['template'] === 'inheritance') { + $themes = $this->gpm->getInstalledThemes(); + $installedThemes = []; + foreach ($themes as $key => $theme) { + $installedThemes[] = $key; + } + + $question = new ChoiceQuestion('Please choose a theme to extend', $installedThemes); + $this->component['extends'] = $io->askQuestion($question); + } elseif ($this->component['template'] === 'copy') { + $themes = $this->gpm->getInstalledThemes(); + $installedThemes = []; + foreach ($themes as $key => $theme) { + $installedThemes[] = $key; + } + + $question = new ChoiceQuestion( + 'Please choose a theme to copy', + $installedThemes + ); + $this->component['copy'] = $io->askQuestion($question); + } + $this->createComponent(); + + return 0; + } +} diff --git a/plugins/devtools/components/blueprint/append/blueprint.yaml.twig b/plugins/devtools/components/blueprint/append/blueprint.yaml.twig new file mode 100644 index 0000000..8db427f --- /dev/null +++ b/plugins/devtools/components/blueprint/append/blueprint.yaml.twig @@ -0,0 +1,21 @@ +title: {{ component.bpname }} +extends@: + type: default + context: blueprints://pages + +form: + fields: + tabs: + type: tabs + active: 1 + + fields: + content: + fields: + header.an_example_text_field: + type: text + label: Add a number + default: 5 + validate: + required: true + type: int \ No newline at end of file diff --git a/plugins/devtools/components/blueprint/newtab/blueprint.yaml.twig b/plugins/devtools/components/blueprint/newtab/blueprint.yaml.twig new file mode 100644 index 0000000..d110556 --- /dev/null +++ b/plugins/devtools/components/blueprint/newtab/blueprint.yaml.twig @@ -0,0 +1,15 @@ +title: Item +extends@: + type: default + context: blueprints://pages + +form: + fields: + tabs: + fields: + blog: + type: tab + title: {{ component.bpname }} + + fields: + header.mytextfield: \ No newline at end of file diff --git a/plugins/devtools/components/plugin/blank/CHANGELOG.md.twig b/plugins/devtools/components/plugin/blank/CHANGELOG.md.twig new file mode 100644 index 0000000..973fb27 --- /dev/null +++ b/plugins/devtools/components/plugin/blank/CHANGELOG.md.twig @@ -0,0 +1,5 @@ +# v0.1.0 +## {{ "now"|date("m/d/Y") }} + +1. [](#new) + * ChangeLog started... diff --git a/plugins/devtools/components/plugin/blank/LICENSE.twig b/plugins/devtools/components/plugin/blank/LICENSE.twig new file mode 100644 index 0000000..6f88097 --- /dev/null +++ b/plugins/devtools/components/plugin/blank/LICENSE.twig @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) {{ "now"|date("Y") }} {{ component.author.name }} + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/devtools/components/plugin/blank/README.md.twig b/plugins/devtools/components/plugin/blank/README.md.twig new file mode 100644 index 0000000..e9cae52 --- /dev/null +++ b/plugins/devtools/components/plugin/blank/README.md.twig @@ -0,0 +1,59 @@ +{% set component_title = (component.name|titleize) %} +{% set component_hyphenated = (component.name|hyphenize) %} +{% set developer_hyphenated = (component.author.githubid|hyphenize) %} +# {{ component_title }} Plugin + +**This README.md file should be modified to describe the features, installation, configuration, and general usage of the plugin.** + +The **{{ component_title }}** Plugin is an extension for [Grav CMS](http://github.com/getgrav/grav). {{ component.description }} + +## Installation + +Installing the {{ component_title }} plugin can be done in one of three ways: The GPM (Grav Package Manager) installation method lets you quickly install the plugin with a simple terminal command, the manual method lets you do so via a zip file, and the admin method lets you do so via the Admin Plugin. + +### GPM Installation (Preferred) + +To install the plugin via the [GPM](http://learn.getgrav.org/advanced/grav-gpm), through your system's terminal (also called the command line), navigate to the root of your Grav-installation, and enter: + + bin/gpm install {{ component_hyphenated }} + +This will install the {{ component_title }} plugin into your `/user/plugins`-directory within Grav. Its files can be found under `/your/site/grav/user/plugins/{{ component_hyphenated }}`. + +### Manual Installation + +To install the plugin manually, download the zip-version of this repository and unzip it under `/your/site/grav/user/plugins`. Then rename the folder to `{{ component_hyphenated }}`. You can find these files on [GitHub](https://github.com/{{ developer_hyphenated }}/grav-plugin-{{ component_hyphenated }}) or via [GetGrav.org](http://getgrav.org/downloads/plugins#extras). + +You should now have all the plugin files under + + /your/site/grav/user/plugins/{{ component_hyphenated }} + +> NOTE: This plugin is a modular component for Grav which may require other plugins to operate, please see its [blueprints.yaml-file on GitHub](https://github.com/{{ developer_hyphenated }}/grav-plugin-{{ component_hyphenated }}/blob/master/blueprints.yaml). + +### Admin Plugin + +If you use the Admin Plugin, you can install the plugin directly by browsing the `Plugins`-menu and clicking on the `Add` button. + +## Configuration + +Before configuring this plugin, you should copy the `user/plugins/{{ component_hyphenated }}/{{ component_hyphenated }}.yaml` to `user/config/plugins/{{ component_hyphenated }}.yaml` and only edit that copy. + +Here is the default configuration and an explanation of available options: + +```yaml +enabled: true +``` + +Note that if you use the Admin Plugin, a file with your configuration named {{component_hyphenated}}.yaml will be saved in the `user/config/plugins/`-folder once the configuration is saved in the Admin. + +## Usage + +**Describe how to use the plugin.** + +## Credits + +**Did you incorporate third-party code? Want to thank somebody?** + +## To Do + +- [ ] Future plans, if any + diff --git a/plugins/devtools/components/plugin/blank/blueprints.yaml.twig b/plugins/devtools/components/plugin/blank/blueprints.yaml.twig new file mode 100644 index 0000000..bd0defd --- /dev/null +++ b/plugins/devtools/components/plugin/blank/blueprints.yaml.twig @@ -0,0 +1,37 @@ +{% set githubid = component.author.githubid ?: component.author.name|hyphenize -%} +name: {{ component.name|titleize }} +slug: {{ component.name|hyphenize }} +type: plugin +version: 0.1.0 +description: {{ component.description }} +icon: plug +author: + name: {{ component.author.name }} + email: {{ component.author.email }} +homepage: https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }} +demo: http://demo.yoursite.com +keywords: grav, plugin, etc +bugs: https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }}/issues +docs: https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }}/blob/develop/README.md +license: MIT + +dependencies: + - { name: grav, version: '>=1.6.0' } + +form: + validation: loose + fields: + enabled: + type: toggle + label: PLUGIN_ADMIN.PLUGIN_STATUS + highlight: 1 + default: 0 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + text_var: + type: text + label: PLUGIN_{{ component.name|underscorize|upper }}.TEXT_VARIABLE + help: PLUGIN_{{ component.name|underscorize|upper }}.TEXT_VARIABLE_HELP diff --git a/plugins/devtools/components/plugin/blank/classes/.gitkeep b/plugins/devtools/components/plugin/blank/classes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtools/components/plugin/blank/composer.json.twig b/plugins/devtools/components/plugin/blank/composer.json.twig new file mode 100644 index 0000000..14cfe4f --- /dev/null +++ b/plugins/devtools/components/plugin/blank/composer.json.twig @@ -0,0 +1,30 @@ +{% set githubid = component.author.githubid ?: component.author.name|hyphenize -%} +{ + "name": "{{ githubid|lower }}/{{ component.name|hyphenize }}", + "type": "grav-plugin", + "description": "{{ component.description }}", + "keywords": ["plugin"], + "homepage": "https://github.com/{{ githubid }}/grav-plugin-{{ component.name|hyphenize }}", + "license": "MIT", + "authors": [ + { + "name": "{{ component.author.name }}", + "email": "{{ component.author.email }}", + "role": "Developer" + } + ], + "require": { + "php": ">=7.1.3" + }, + "autoload": { + "psr-4": { + "Grav\\Plugin\\{{ component.name|camelize }}\\": "classes/" + }, + "classmap": ["{{ component.name|hyphenize }}.php"] + }, + "config": { + "platform": { + "php": "7.1.3" + } + } +} diff --git a/plugins/devtools/components/plugin/blank/languages.yaml.twig b/plugins/devtools/components/plugin/blank/languages.yaml.twig new file mode 100644 index 0000000..855cd0e --- /dev/null +++ b/plugins/devtools/components/plugin/blank/languages.yaml.twig @@ -0,0 +1,4 @@ +en: + PLUGIN_{{ component.name|underscorize|upper }}: + TEXT_VARIABLE: Text Variable + TEXT_VARIABLE_HELP: Text to add to the top of a page diff --git a/plugins/devtools/components/plugin/blank/plugin.php.twig b/plugins/devtools/components/plugin/blank/plugin.php.twig new file mode 100644 index 0000000..0daecc4 --- /dev/null +++ b/plugins/devtools/components/plugin/blank/plugin.php.twig @@ -0,0 +1,59 @@ + [ + // Uncomment following line when plugin requires Grav < 1.7 + // ['autoload', 100000], + ['onPluginsInitialized', 0] + ] + ]; + } + + /** + * Composer autoload + * + * @return ClassLoader + */ + public function autoload(): ClassLoader + { + return require __DIR__ . '/vendor/autoload.php'; + } + + /** + * Initialize the plugin + */ + public function onPluginsInitialized(): void + { + // Don't proceed if we are in the admin plugin + if ($this->isAdmin()) { + return; + } + + // Enable the main events we are interested in + $this->enable([ + // Put your main events here + ]); + } +} diff --git a/plugins/devtools/components/plugin/blank/plugin.yaml.twig b/plugins/devtools/components/plugin/blank/plugin.yaml.twig new file mode 100644 index 0000000..55e2f2e --- /dev/null +++ b/plugins/devtools/components/plugin/blank/plugin.yaml.twig @@ -0,0 +1,2 @@ +enabled: true +text_var: Custom Text added by the **{{ component.name|titleize }}** plugin (disable plugin to remove) diff --git a/plugins/devtools/components/theme/inheritance/CHANGELOG.md.twig b/plugins/devtools/components/theme/inheritance/CHANGELOG.md.twig new file mode 100644 index 0000000..973fb27 --- /dev/null +++ b/plugins/devtools/components/theme/inheritance/CHANGELOG.md.twig @@ -0,0 +1,5 @@ +# v0.1.0 +## {{ "now"|date("m/d/Y") }} + +1. [](#new) + * ChangeLog started... diff --git a/plugins/devtools/components/theme/inheritance/LICENSE.twig b/plugins/devtools/components/theme/inheritance/LICENSE.twig new file mode 100644 index 0000000..6f88097 --- /dev/null +++ b/plugins/devtools/components/theme/inheritance/LICENSE.twig @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) {{ "now"|date("Y") }} {{ component.author.name }} + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/devtools/components/theme/inheritance/README.md.twig b/plugins/devtools/components/theme/inheritance/README.md.twig new file mode 100644 index 0000000..ee5c0b7 --- /dev/null +++ b/plugins/devtools/components/theme/inheritance/README.md.twig @@ -0,0 +1,7 @@ +# {{ component.name|titleize }} Theme + +The **{{ component.name|titleize }}** Theme is for [Grav CMS](http://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. + +## Description + +{{ component.description }} diff --git a/plugins/devtools/components/theme/inheritance/blueprints.yaml.twig b/plugins/devtools/components/theme/inheritance/blueprints.yaml.twig new file mode 100644 index 0000000..91700a3 --- /dev/null +++ b/plugins/devtools/components/theme/inheritance/blueprints.yaml.twig @@ -0,0 +1,19 @@ +{% set githubid = component.author.githubid ?: component.author.name|hyphenize -%} +name: {{ component.name|titleize }} +slug: {{ component.name|hyphenize }} +type: theme +version: 0.1.0 +description: {{ component.description }} +icon: rebel +author: + name: {{ component.author.name }} + email: {{ component.author.email }} +homepage: https://github.com/{{ githubid }}/grav-theme-{{ component.name|hyphenize }} +demo: http://demo.yoursite.com +keywords: grav, theme, etc +bugs: https://github.com/{{ githubid }}/grav-theme-{{ component.name|hyphenize }}/issues +readme: https://github.com/{{ githubid }}/grav-theme-{{ component.name|hyphenize }}/blob/develop/README.md +license: MIT + +dependencies: + - { name: grav, version: '>=1.6.0' } diff --git a/plugins/devtools/components/theme/inheritance/css/.gitkeep b/plugins/devtools/components/theme/inheritance/css/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtools/components/theme/inheritance/js/.gitkeep b/plugins/devtools/components/theme/inheritance/js/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtools/components/theme/inheritance/screenshot.jpg b/plugins/devtools/components/theme/inheritance/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5205ca51a97ac3299d523099ef55e29a5228f670 GIT binary patch literal 15428 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 literal 0 HcmV?d00001 diff --git a/plugins/devtools/components/theme/inheritance/templates/.gitkeep b/plugins/devtools/components/theme/inheritance/templates/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtools/components/theme/inheritance/theme.php.twig b/plugins/devtools/components/theme/inheritance/theme.php.twig new file mode 100644 index 0000000..c05016c --- /dev/null +++ b/plugins/devtools/components/theme/inheritance/theme.php.twig @@ -0,0 +1,9 @@ +1YDr_`md&!GCK1 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 literal 0 HcmV?d00001 diff --git a/plugins/devtools/components/theme/pure-blank/CHANGELOG.md.twig b/plugins/devtools/components/theme/pure-blank/CHANGELOG.md.twig new file mode 100644 index 0000000..973fb27 --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/CHANGELOG.md.twig @@ -0,0 +1,5 @@ +# v0.1.0 +## {{ "now"|date("m/d/Y") }} + +1. [](#new) + * ChangeLog started... diff --git a/plugins/devtools/components/theme/pure-blank/LICENSE.twig b/plugins/devtools/components/theme/pure-blank/LICENSE.twig new file mode 100644 index 0000000..6f88097 --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/LICENSE.twig @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) {{ "now"|date("Y") }} {{ component.author.name }} + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/devtools/components/theme/pure-blank/README.md.twig b/plugins/devtools/components/theme/pure-blank/README.md.twig new file mode 100644 index 0000000..ee5c0b7 --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/README.md.twig @@ -0,0 +1,7 @@ +# {{ component.name|titleize }} Theme + +The **{{ component.name|titleize }}** Theme is for [Grav CMS](http://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. + +## Description + +{{ component.description }} diff --git a/plugins/devtools/components/theme/pure-blank/blueprints.yaml.twig b/plugins/devtools/components/theme/pure-blank/blueprints.yaml.twig new file mode 100644 index 0000000..b127d15 --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/blueprints.yaml.twig @@ -0,0 +1,33 @@ +{% set githubid = component.author.githubid ?: component.author.name|hyphenize -%} +name: {{ component.name|titleize }} +slug: {{ component.name|hyphenize }} +type: theme +version: 0.1.0 +description: {{ component.description }} +icon: rebel +author: + name: {{ component.author.name }} + email: {{ component.author.email }} +homepage: https://github.com/{{ githubid }}/grav-theme-{{ component.name|hyphenize }} +demo: http://demo.yoursite.com +keywords: grav, theme, etc +bugs: https://github.com/{{ githubid }}/grav-theme-{{ component.name|hyphenize }}/issues +readme: https://github.com/{{ githubid }}/grav-theme-{{ component.name|hyphenize }}/blob/develop/README.md +license: MIT + +dependencies: + - { name: grav, version: '>=1.6.0' } + +form: + validation: loose + fields: + dropdown.enabled: + type: toggle + label: Dropdown in Menu + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool diff --git a/plugins/devtools/components/theme/pure-blank/css/custom.css b/plugins/devtools/components/theme/pure-blank/css/custom.css new file mode 100644 index 0000000..e796328 --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/css/custom.css @@ -0,0 +1,175 @@ +/* Core Stuff */ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +body { + font-size: 1rem; + line-height: 1.7; + color: #606d6e; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #454B4D; +} + +a { + color: #1F8CD6; + text-decoration: none; +} + +a:hover { + color: #175E91; +} + +pre { + background: #F0F0F0; + margin: 1rem 0; + border-radius: 2px; +} + +blockquote { + border-left: 10px solid #eee; + margin: 0; + padding: 0 2rem; +} + +/* Utility Classes */ +.wrapper { + margin: 0 3rem; +} + +.padding { + padding: 3rem 1rem; +} + +.left { + float: left; +} + +.right { + float: right +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-left { + text-align: left; +} + +/* Content Styling */ +.header .padding { + padding: 1rem 0; +} + +.header { + background-color: #1F8DD6; + color: #eee; +} + +.header a { + color: #fff; +} + +.header .logo { + font-size: 1.7rem; + text-transform: uppercase; +} + +.footer { + background-color: #eee; +} + +/* Menu Settings */ +.main-nav ul { + text-align: center; + letter-spacing: -1em; + margin: 0; + padding: 0; +} + +.main-nav ul li { + display: inline-block; + letter-spacing: normal; +} + +.main-nav ul li a { + position: relative; + display: block; + line-height: 45px; + color: #fff; + padding: 0 20px; + white-space: nowrap; +} + +.main-nav > ul > li > a { + border-radius: 2px; +} + +/*Active dropdown nav item */ +.main-nav ul li:hover > a { + background-color: #175E91; +} + +/* Selected Dropdown nav item */ +.main-nav ul li.selected > a { + background-color: #fff; + color: #175E91; +} + +/* Dropdown CSS */ +.main-nav ul li {position: relative;} + +.main-nav ul li ul { + position: absolute; + background-color: #1F8DD6; + min-width: 100%; + text-align: left; + z-index: 999; + + display: none; +} +.main-nav ul li ul li { + display: block; +} + +/* Dropdown CSS */ +.main-nav ul li ul ul { + left: 100%; + top: 0; +} + +/* Active on Hover */ +.main-nav li:hover > ul { + display: block; +} + +/* Child Indicator */ +.main-nav .has-children > a { + padding-right: 30px; +} +.main-nav .has-children > a:after { + font-family: FontAwesome; + content: '\f107'; + position: absolute; + display: inline-block; + right: 8px; + top: 0; +} + +.main-nav .has-children .has-children > a:after { + content: '\f105'; +} diff --git a/plugins/devtools/components/theme/pure-blank/fonts/.gitkeep b/plugins/devtools/components/theme/pure-blank/fonts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtools/components/theme/pure-blank/images/logo.png b/plugins/devtools/components/theme/pure-blank/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..64be1a96336228bbcb5dc3604ce7dbbe1e8d99c6 GIT binary patch literal 8714 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 literal 0 HcmV?d00001 diff --git a/plugins/devtools/components/theme/pure-blank/js/.gitkeep b/plugins/devtools/components/theme/pure-blank/js/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtools/components/theme/pure-blank/screenshot.jpg b/plugins/devtools/components/theme/pure-blank/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5205ca51a97ac3299d523099ef55e29a5228f670 GIT binary patch literal 15428 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 literal 0 HcmV?d00001 diff --git a/plugins/devtools/components/theme/pure-blank/templates/default.html.twig b/plugins/devtools/components/theme/pure-blank/templates/default.html.twig new file mode 100644 index 0000000..1e97738 --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/templates/default.html.twig @@ -0,0 +1,5 @@ +{% extends 'partials/base.html.twig' %} + +{% block content %} + {{ page.content|raw }} +{% endblock %} diff --git a/plugins/devtools/components/theme/pure-blank/templates/error.html.twig b/plugins/devtools/components/theme/pure-blank/templates/error.html.twig new file mode 100644 index 0000000..c945464 --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/templates/error.html.twig @@ -0,0 +1,8 @@ +{% extends 'partials/base.html.twig' %} + +{% block content %} +
+

Error!

+ {{ page.content|raw }} +
+{% endblock %} diff --git a/plugins/devtools/components/theme/pure-blank/templates/partials/base.html.twig b/plugins/devtools/components/theme/pure-blank/templates/partials/base.html.twig new file mode 100644 index 0000000..c4e7e60 --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/templates/partials/base.html.twig @@ -0,0 +1,70 @@ + + + +{% block head %} + + {% if header.title %}{{ header.title|e }} | {% endif %}{{ site.title|e }} + + + + {% include 'partials/metadata.html.twig' %} + + + +{% endblock head %} + +{% block stylesheets %} + {% do assets.addCss('https://unpkg.com/purecss@1.0.0/build/pure-min.css', 100) %} + {% do assets.addCss('https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css', 99) %} + {% do assets.addCss('theme://css/custom.css', 98) %} +{% endblock %} + +{% block javascripts %} + {% do assets.addJs('jquery', 100) %} +{% endblock %} + +{% block assets deferred %} + {{ assets.css()|raw }} + {{ assets.js()|raw }} +{% endblock %} + + + +{% block header %} +
+
+ + {% block header_navigation %} + + {% endblock %} +
+
+{% endblock %} + +{% block body %} +
+
+ {% block content %}{% endblock %} +
+
+{% endblock %} + +{% block footer %} + +{% endblock %} + +{% block bottom %} + {{ assets.js('bottom')|raw }} +{% endblock %} + + + diff --git a/plugins/devtools/components/theme/pure-blank/templates/partials/navigation.html.twig b/plugins/devtools/components/theme/pure-blank/templates/partials/navigation.html.twig new file mode 100644 index 0000000..28df6aa --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/templates/partials/navigation.html.twig @@ -0,0 +1,47 @@ +{% macro loop(page) %} + {% for p in page.children.visible %} + {% set current_page = (p.active or p.activeChild) ? 'selected' : '' %} + {% if p.children.visible.count > 0 %} +
  • + + {% if p.header.icon %}{% endif %} + {{ p.menu|e }} + +
      + {{ _self.loop(p) }} +
    +
  • + {% else %} +
  • + + {% if p.header.icon %}{% endif %} + {{ p.menu|e }} + +
  • + {% endif %} + {% endfor %} +{% endmacro %} + + diff --git a/plugins/devtools/components/theme/pure-blank/theme.php.twig b/plugins/devtools/components/theme/pure-blank/theme.php.twig new file mode 100644 index 0000000..332b164 --- /dev/null +++ b/plugins/devtools/components/theme/pure-blank/theme.php.twig @@ -0,0 +1,9 @@ +1YDr_`md&!GCK1 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 literal 0 HcmV?d00001 diff --git a/plugins/devtools/components/theme/tailwind/CHANGELOG.md.twig b/plugins/devtools/components/theme/tailwind/CHANGELOG.md.twig new file mode 100644 index 0000000..37256e0 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/CHANGELOG.md.twig @@ -0,0 +1,5 @@ +# v0.1.0 +## {{ "now"|date("m/d/Y") }} + +1. [](#new) + * ChangeLog started... diff --git a/plugins/devtools/components/theme/tailwind/LICENSE.twig b/plugins/devtools/components/theme/tailwind/LICENSE.twig new file mode 100644 index 0000000..015a4ae --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/LICENSE.twig @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) {{ "now"|date("Y") }} {{ component.author.name }} + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/devtools/components/theme/tailwind/README.md.twig b/plugins/devtools/components/theme/tailwind/README.md.twig new file mode 100644 index 0000000..c6d05fd --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/README.md.twig @@ -0,0 +1,41 @@ +# {{ component.name|titleize }} Theme + +The **{{ component.name|titleize }}** Theme is for [Grav CMS](http://github.com/getgrav/grav). This README.md file should be modified to describe the features, installation, configuration, and general usage of this theme. + +## Description + +{{ component.description }} + +# Instructions + +Run + +`npm install` to setup tailwind and required plugins + +How to build tailwind: + +Development: + +`npm run build` for single time compiling + +`npm run watch` for constant development + +Production: + +`npm run prod` for production compiling. **Don't forget to turn on production mode in the theme config**# Instructions + +Run + +`npm install` to setup tailwind and required plugins + +How to build tailwind: + +Development: + +`npm run build` for single time compiling + +`npm run watch` for constant development + +Production: + +`npm run prod` for production compiling. **Don't forget to turn on production mode in the theme config** diff --git a/plugins/devtools/components/theme/tailwind/blueprints.yaml.twig b/plugins/devtools/components/theme/tailwind/blueprints.yaml.twig new file mode 100644 index 0000000..a592fb7 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/blueprints.yaml.twig @@ -0,0 +1,43 @@ +{% set githubid = component.author.githubid ?: component.author.name|hyphenize -%} +name: {{ component.name|titleize }} +slug: {{ component.name|hyphenize }} +type: theme +version: 0.1.0 +description: {{ component.description }} +icon: rebel +author: + name: {{ component.author.name }} + email: {{ component.author.email }} +homepage: https://github.com/{{ githubid }}/grav-theme-{{ component.name|hyphenize }} +demo: http://demo.yoursite.com +keywords: grav, theme, etc +bugs: https://github.com/{{ githubid }}/grav-theme-{{ component.name|hyphenize }}/issues +readme: https://github.com/{{ githubid }}/grav-theme-{{ component.name|hyphenize }}/blob/develop/README.md +license: MIT + +dependencies: + - { name: grav, version: '>=1.6.0' } + +form: + validation: loose + fields: + dropdown.enabled: + type: toggle + label: Dropdown in Menu + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool + production: + type: toggle + label: Production Mode + highlight: 1 + default: 1 + options: + 1: PLUGIN_ADMIN.ENABLED + 0: PLUGIN_ADMIN.DISABLED + validate: + type: bool diff --git a/plugins/devtools/components/theme/tailwind/css/site.css b/plugins/devtools/components/theme/tailwind/css/site.css new file mode 100644 index 0000000..f578962 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/css/site.css @@ -0,0 +1,5 @@ +/*@import 'yourcssfile.css';*/ + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/plugins/devtools/components/theme/tailwind/fonts/.gitkeep b/plugins/devtools/components/theme/tailwind/fonts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtools/components/theme/tailwind/images/logo.png b/plugins/devtools/components/theme/tailwind/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..64be1a96336228bbcb5dc3604ce7dbbe1e8d99c6 GIT binary patch literal 8714 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 literal 0 HcmV?d00001 diff --git a/plugins/devtools/components/theme/tailwind/js/.gitkeep b/plugins/devtools/components/theme/tailwind/js/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plugins/devtools/components/theme/tailwind/languages/en.yaml.twig b/plugins/devtools/components/theme/tailwind/languages/en.yaml.twig new file mode 100644 index 0000000..2b48ba2 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/languages/en.yaml.twig @@ -0,0 +1,2 @@ +THEME_{{ component.name|hyphenize|replace({'-': '_'})|upper }}: + ERROR: 'Error!' diff --git a/plugins/devtools/components/theme/tailwind/package.json.twig b/plugins/devtools/components/theme/tailwind/package.json.twig new file mode 100644 index 0000000..902fac2 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/package.json.twig @@ -0,0 +1,30 @@ +{ + "name": "{{ component.name }}", + "repository": "", + "private": true, + "version": "0.1.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "postcss css/site.css -o dist/css/site.css --verbose", + "watch": "postcss css/site.css -o dist/css/site.css --watch --verbose", + "prod" : "postcss css/site.css -o dist/css/site.min.css --env production --verbose" + }, + "dependencies": {}, + "devDependencies": { + "alpinejs": "^2.8.2", + "tailwindcss": "^2.1.2", + "@tailwindcss/forms": "^0.3.2", + "@tailwindcss/typography": "^0.4.0", + "tailwindcss-debug-screens": "^2.0.0", + "autoprefixer": "^10.2.5", + "precss": "^4.0.0", + "cssnano": "^4.1.11", + "postcss": "^8.2.9", + "postcss-cli": "^8.3.1", + "postcss-import": "^14.0.1", + "postcss-nested": "^5.0.5", + "postcss-hexrgba": "^2.0.1", + "postcss-color-function": "^4.1.0" + } +} diff --git a/plugins/devtools/components/theme/tailwind/postcss.config.js b/plugins/devtools/components/theme/tailwind/postcss.config.js new file mode 100644 index 0000000..655e577 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/postcss.config.js @@ -0,0 +1,11 @@ +module.exports = { + plugins: { + 'postcss-import': {}, + 'precss': {}, + 'tailwindcss': {}, + 'postcss-nested': {}, + 'autoprefixer': {}, + ...process.env.NODE_ENV === 'production' + ? {'cssnano': {}} : {} + }, +} diff --git a/plugins/devtools/components/theme/tailwind/screenshot.jpg b/plugins/devtools/components/theme/tailwind/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5205ca51a97ac3299d523099ef55e29a5228f670 GIT binary patch literal 15428 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 literal 0 HcmV?d00001 diff --git a/plugins/devtools/components/theme/tailwind/tailwind.config.js.twig b/plugins/devtools/components/theme/tailwind/tailwind.config.js.twig new file mode 100644 index 0000000..27a4484 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/tailwind.config.js.twig @@ -0,0 +1,70 @@ +const { colors } = require('tailwindcss/defaultTheme'); + +module.exports = { + purge: [ + '../../config/**/*.yaml', + '../../pages/**/*.md', + './blueprints/**/*.yaml', + './js/**/*.js', + './templates/**/*.twig', + './{{ component.name|hyphenize }}.yaml', + './{{ component.name|hyphenize }}.php' + ], + darkMode: 'class', //false or 'media' or 'class' + theme: { + extend: { + screens: { + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1536px' + } + }, + colors: { + 'primary': { + 'lighter': colors.yellow['300'], + DEFAULT: colors.yellow['400'], + 'darker' : colors.yellow['500'], + }, + black: colors.black, + white: colors.white, + red: colors.red, + green: colors.green, + blue: colors.blue, + orange: colors.orange, + indigo: colors.indigo, + transparent: 'transparent', + 'inherit': 'inherit', + }, + typography: (theme) => ({ + DEFAULT: { + css: { + color: 'inherit', + lineHeight: 'inherit', + maxWidth: 'inherit', + a: { + transition: 'all 500ms', + color: theme('colors.primary.DEFAULT'), + '&:hover': { + color: theme('colors.primary.darker') + }, + textDecoration: 'none' + }, + strong: { + color: 'inherit' + }, + } + } + }), + }, + variants: { + extend: {}, + }, + plugins: [ + require('@tailwindcss/typography'), + require('@tailwindcss/forms'), + require('tailwindcss-debug-screens'), + ], + important: false, +} diff --git a/plugins/devtools/components/theme/tailwind/templates/default.html.twig b/plugins/devtools/components/theme/tailwind/templates/default.html.twig new file mode 100644 index 0000000..1e97738 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/templates/default.html.twig @@ -0,0 +1,5 @@ +{% extends 'partials/base.html.twig' %} + +{% block content %} + {{ page.content|raw }} +{% endblock %} diff --git a/plugins/devtools/components/theme/tailwind/templates/error.html.twig b/plugins/devtools/components/theme/tailwind/templates/error.html.twig new file mode 100644 index 0000000..c25efaa --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/templates/error.html.twig @@ -0,0 +1,8 @@ +{% extends 'partials/base.html.twig' %} + +{% block content %} +
    +

    {{ 'THEME_TAILWIND.ERROR'|t }}

    + {{ page.content|raw }} +
    +{% endblock %} diff --git a/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig b/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig new file mode 100644 index 0000000..04509fd --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/templates/partials/base.html.twig @@ -0,0 +1,67 @@ +{% set extension = config.theme.production ? '.min' : '' %} + + + + {% block head %} + + {% if header.title %}{{ header.title|e }} | {% endif %}{{ site.title|e }} + + + + {% include 'partials/metadata.html.twig' %} + + + + {% endblock head %} + + {% block stylesheets %} + {% do assets.addCss('theme://dist/css/app' ~ extension ~ '.css', 98) %} + {% endblock %} + + {% block javascripts %} + {% endblock %} + + {% block assets deferred %} + {{ assets.css()|raw }} + {{ assets.js()|raw }} + {% endblock %} + + + +{% block header %} +
    +
    + + {% block header_navigation %} + + {% endblock %} +
    +
    +{% endblock %} + +{% block body %} +
    +
    + {% block content %}{% endblock %} +
    +
    +{% endblock %} + +{% block footer %} + +{% endblock %} + +{% block bottom %} + {{ assets.js('bottom')|raw }} +{% endblock %} + + + diff --git a/plugins/devtools/components/theme/tailwind/templates/partials/navigation.html.twig b/plugins/devtools/components/theme/tailwind/templates/partials/navigation.html.twig new file mode 100644 index 0000000..28df6aa --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/templates/partials/navigation.html.twig @@ -0,0 +1,47 @@ +{% macro loop(page) %} + {% for p in page.children.visible %} + {% set current_page = (p.active or p.activeChild) ? 'selected' : '' %} + {% if p.children.visible.count > 0 %} +
  • + + {% if p.header.icon %}{% endif %} + {{ p.menu|e }} + +
      + {{ _self.loop(p) }} +
    +
  • + {% else %} +
  • + + {% if p.header.icon %}{% endif %} + {{ p.menu|e }} + +
  • + {% endif %} + {% endfor %} +{% endmacro %} + + diff --git a/plugins/devtools/components/theme/tailwind/theme.php.twig b/plugins/devtools/components/theme/tailwind/theme.php.twig new file mode 100644 index 0000000..332b164 --- /dev/null +++ b/plugins/devtools/components/theme/tailwind/theme.php.twig @@ -0,0 +1,9 @@ +1YDr_`md&!GCK1 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 literal 0 HcmV?d00001 diff --git a/plugins/devtools/devtools.php b/plugins/devtools/devtools.php new file mode 100644 index 0000000..9b67474 --- /dev/null +++ b/plugins/devtools/devtools.php @@ -0,0 +1,13 @@ +