Browse Source

grav fresh install with composer

Bachir Soussi Chiadmi 1 year ago
commit
b893992935
100 changed files with 12631 additions and 0 deletions
  1. 34 0
      .dependencies
  2. 17 0
      .editorconfig
  3. 8 0
      .github/FUNDING.yml
  4. 46 0
      .gitignore
  5. 75 0
      .htaccess
  6. 96 0
      .travis.yml
  7. 2631 0
      CHANGELOG.md
  8. 46 0
      CODE_OF_CONDUCT.md
  9. 138 0
      CONTRIBUTING.md
  10. 21 0
      LICENSE.txt
  11. 134 0
      README.md
  12. 0 0
      assets/.gitkeep
  13. 0 0
      backup/.gitkeep
  14. BIN
      bin/composer.phar
  15. 79 0
      bin/gpm
  16. 74 0
      bin/grav
  17. 152 0
      bin/plugin
  18. 0 0
      cache/.gitkeep
  19. 16 0
      codeception.yml
  20. 112 0
      composer.json
  21. 5688 0
      composer.lock
  22. 0 0
      images/.gitkeep
  23. 61 0
      index.php
  24. 0 0
      logs/.gitkeep
  25. 4 0
      now.json
  26. 13 0
      robots.txt
  27. 70 0
      system/assets/debugger.css
  28. BIN
      system/assets/grav.png
  29. 4 0
      system/assets/jquery/jquery-2.1.4.min.js
  30. 4 0
      system/assets/jquery/jquery-2.x.min.js
  31. 2 0
      system/assets/jquery/jquery-3.x.min.js
  32. BIN
      system/assets/responsive-overlays/1x.png
  33. BIN
      system/assets/responsive-overlays/2x.png
  34. BIN
      system/assets/responsive-overlays/3x.png
  35. BIN
      system/assets/responsive-overlays/4x.png
  36. BIN
      system/assets/responsive-overlays/unknown.png
  37. 19 0
      system/assets/whoops.css
  38. 125 0
      system/blueprints/config/backups.yaml
  39. 5 0
      system/blueprints/config/media.yaml
  40. 76 0
      system/blueprints/config/scheduler.yaml
  41. 107 0
      system/blueprints/config/security.yaml
  42. 124 0
      system/blueprints/config/site.yaml
  43. 8 0
      system/blueprints/config/streams.yaml
  44. 1410 0
      system/blueprints/config/system.yaml
  45. 369 0
      system/blueprints/pages/default.yaml
  46. 52 0
      system/blueprints/pages/external.yaml
  47. 38 0
      system/blueprints/pages/modular.yaml
  48. 127 0
      system/blueprints/user/account.yaml
  49. 18 0
      system/blueprints/user/account_new.yaml
  50. 39 0
      system/blueprints/user/accounts.yaml
  51. 37 0
      system/blueprints/user/group.yaml
  52. 16 0
      system/blueprints/user/group_new.yaml
  53. 15 0
      system/config/backups.yaml
  54. 210 0
      system/config/media.yaml
  55. 38 0
      system/config/security.yaml
  56. 35 0
      system/config/site.yaml
  57. 16 0
      system/config/streams.yaml
  58. 169 0
      system/config/system.yaml
  59. 53 0
      system/defines.php
  60. BIN
      system/images/media/thumb-3dm.png
  61. BIN
      system/images/media/thumb-3ds.png
  62. BIN
      system/images/media/thumb-3g2.png
  63. BIN
      system/images/media/thumb-3gp.png
  64. BIN
      system/images/media/thumb-7z.png
  65. BIN
      system/images/media/thumb-aac.png
  66. BIN
      system/images/media/thumb-ai.png
  67. BIN
      system/images/media/thumb-aif.png
  68. BIN
      system/images/media/thumb-apk.png
  69. BIN
      system/images/media/thumb-app.png
  70. BIN
      system/images/media/thumb-asf.png
  71. BIN
      system/images/media/thumb-asp.png
  72. BIN
      system/images/media/thumb-aspx.png
  73. BIN
      system/images/media/thumb-asx.png
  74. BIN
      system/images/media/thumb-avi.png
  75. BIN
      system/images/media/thumb-bak.png
  76. BIN
      system/images/media/thumb-bat.png
  77. BIN
      system/images/media/thumb-bin.png
  78. BIN
      system/images/media/thumb-bmp.png
  79. BIN
      system/images/media/thumb-cab.png
  80. BIN
      system/images/media/thumb-cad.png
  81. BIN
      system/images/media/thumb-cdr.png
  82. BIN
      system/images/media/thumb-cer.png
  83. BIN
      system/images/media/thumb-cfg.png
  84. BIN
      system/images/media/thumb-cfm.png
  85. BIN
      system/images/media/thumb-cgi.png
  86. BIN
      system/images/media/thumb-com.png
  87. BIN
      system/images/media/thumb-cpl.png
  88. BIN
      system/images/media/thumb-cpp.png
  89. BIN
      system/images/media/thumb-crx.png
  90. BIN
      system/images/media/thumb-csr.png
  91. BIN
      system/images/media/thumb-css.png
  92. BIN
      system/images/media/thumb-csv.png
  93. BIN
      system/images/media/thumb-cue.png
  94. BIN
      system/images/media/thumb-cur.png
  95. BIN
      system/images/media/thumb-dat.png
  96. BIN
      system/images/media/thumb-db.png
  97. BIN
      system/images/media/thumb-dbf.png
  98. BIN
      system/images/media/thumb-dds.png
  99. BIN
      system/images/media/thumb-dem.png
  100. 0 0
      system/images/media/thumb-dll.png

+ 34 - 0
.dependencies

@@ -0,0 +1,34 @@
+git:
+    problems:
+        url: https://github.com/getgrav/grav-plugin-problems
+        path: user/plugins/problems
+        branch: master
+    error:
+        url: https://github.com/getgrav/grav-plugin-error
+        path: user/plugins/error
+        branch: master
+    markdown-notices:
+        url: https://github.com/getgrav/grav-plugin-markdown-notices
+        path: user/plugins/markdown-notices
+        branch: master
+    quark:
+        url: https://github.com/getgrav/grav-theme-quark
+        path: user/themes/quark
+        branch: master
+links:
+    problems:
+        src: grav-plugin-problems
+        path: user/plugins/problems
+        scm: github
+    error:
+        src: grav-plugin-error
+        path: user/plugins/error
+        scm: github
+    markdown-notices:
+        src: grav-plugin-markdown-notices
+        path: user/plugins/markdown-notices
+        scm: github
+    quark:
+        src: grav-theme-quark
+        path: user/themes/quark
+        scm: github

+ 17 - 0
.editorconfig

@@ -0,0 +1,17 @@
+# EditorConfig is awesome: http://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+charset = utf-8
+end_of_line = lf
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = space
+indent_size = 4
+
+# 2 space indentation
+[*.{yaml,yml}]
+indent_size = 2

+ 8 - 0
.github/FUNDING.yml

@@ -0,0 +1,8 @@
+# These are supported funding model platforms
+
+github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: # Replace with a single Patreon username
+open_collective: grav
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+custom: # Replace with a single custom sponsorship URL

+ 46 - 0
.gitignore

@@ -0,0 +1,46 @@
+# Composer
+.composer
+vendor/*
+!*/vendor/*
+
+# Sass
+.sass-cache
+
+# Grav Specific
+backup/*
+!backup/.*
+cache/*
+!cache/.*
+assets/*
+!assets/.*
+logs/*
+!logs/.*
+images/*
+!images/.*
+user/accounts/*
+!user/accounts/.*
+user/data/*
+!user/data/.*
+user/plugins/*
+!user/plugins/.*
+user/themes/*
+!user/themes/.*
+user/localhost/config/security.yaml
+user/config/security.yaml
+
+# OS Generated
+.DS_Store*
+ehthumbs.db
+Icon?
+Thumbs.db
+*.swp
+
+# phpstorm
+.idea/*
+
+# testing stuff
+tests/_output/*
+tests/_support/_generated/*
+tests/cache/*
+tests/error.log
+system/templates/testing/*

+ 75 - 0
.htaccess

@@ -0,0 +1,75 @@
+<IfModule mod_rewrite.c>
+
+RewriteEngine On
+
+## Begin RewriteBase
+# If you are getting 500 or 404 errors on subpages, you may have to uncomment the RewriteBase entry
+# You should change the '/' to your appropriate subfolder. For example if you have
+# your Grav install at the root of your site '/' should work, else it might be something
+# along the lines of: RewriteBase /<your_sub_folder>
+##
+
+# RewriteBase /
+
+## End - RewriteBase
+
+## Begin - X-Forwarded-Proto
+# In some hosted or load balanced environments, SSL negotiation happens upstream.
+# In order for Grav to recognize the connection as secure, you need to uncomment
+# the following lines.
+#
+# RewriteCond %{HTTP:X-Forwarded-Proto} https
+# RewriteRule .* - [E=HTTPS:on]
+#
+## End - X-Forwarded-Proto
+
+## Begin - Exploits
+# If you experience problems on your site block out the operations listed below
+# This attempts to block the most common type of exploit `attempts` to Grav
+#
+# Block out any script trying to base64_encode data within the URL.
+RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
+# Block out any script that includes a <script> tag in URL.
+RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
+# Block out any script trying to set a PHP GLOBALS variable via URL.
+RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
+# Block out any script trying to modify a _REQUEST variable via URL.
+RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
+# Return 403 Forbidden header and show the content of the root homepage
+RewriteRule .* index.php [F]
+#
+## End - Exploits
+
+## Begin - Index
+# If the requested path and file is not /index.php and the request
+# has not already been internally rewritten to the index.php script
+RewriteCond %{REQUEST_URI} !^/index\.php
+# and the requested path and file doesn't directly match a physical file
+RewriteCond %{REQUEST_FILENAME} !-f
+# and the requested path and file doesn't directly match a physical folder
+RewriteCond %{REQUEST_FILENAME} !-d
+# internally rewrite the request to the index.php script
+RewriteRule .* index.php [L]
+## End - Index
+
+## Begin - Security
+# Block all direct access for these folders
+RewriteRule ^(\.git|cache|bin|logs|backup|webserver-configs|tests)/(.*) error [F]
+# Block access to specific file types for these system folders
+RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
+# Block access to specific file types for these user folders
+RewriteRule ^(user)/(.*)\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
+# Block all direct access to .md files:
+RewriteRule \.md$ error [F]
+# Block all direct access to files and folders beginning with a dot
+RewriteRule (^|/)\.(?!well-known) - [F]
+# Block access to specific files in the root folder
+RewriteRule ^(LICENSE\.txt|composer\.lock|composer\.json|\.htaccess)$ error [F]
+## End - Security
+
+</IfModule>
+
+# Begin - Prevent Browsing and Set Default Resources
+Options -Indexes
+DirectoryIndex index.php index.html index.htm
+# End - Prevent Browsing and Set Default Resources

+ 96 - 0
.travis.yml

@@ -0,0 +1,96 @@
+language: php
+php:
+  - '7.1'
+  - '7.2'
+  - '7.3'
+branches:
+  only:
+    - develop
+    - master
+    - build_test
+notifications:
+  email:
+    on_success: never
+    on_failure: always
+  slack:
+    secure: dowksPsxxCxGKT6nis5hUgkp6+ZDAhoqzQHF9rJnx4hx0iEygPhVBs7pKl9yL2jubYJoLs+EXwE7z1dYgDAEJh4BnfrCokCMLpFGcxVxQC/HeAUdSQ2/RtdBYR5PRT75ScaFpqM/SfXXZVtnwVXAw9Z+JC6BjQ9vmn23m51Jw4k=
+env:
+  global:
+    # Colors!
+    - TEXTRESET=$(tput sgr0) # reset the foreground colour
+    - RED=$(tput setaf 1)
+    - GREEN=$(tput setaf 2)
+    - YELLOW=$(tput setaf 3)
+    - BLUE=$(tput setaf 4)
+    - BOLD=$(tput bold)
+    # User
+    - GH_USER="getgrav"
+    # Paths
+    - RT_DEVTOOLS=$HOME/devtools
+    - GOPATH="$HOME/go"
+    - PATH="$GOPATH/bin:$PATH"
+    # GH_TOKEN [API Key]
+    - secure: "NR9pV7YteY9OoPmjDTQG0fDfocVu+tCeiDH1F2GFhXCu71UOIvqWXpOxp0RHkG5GIXdCFHx59yu+ZO275lbaHkbF8+4lVSVrV4RcGn+pIncvxr6iZCVW05dbAxV3H8alK+xYJRGmbyfQl5wIM49WvmuGHZjcmIloS4t/omQ3N+I="
+    # BB_TOKEN value => "user:pass@"
+    - secure: "einUtSEkUWy2IrqLXyVjwUU+mwaaoiOXRRVdLBpA3Zye6bZx8cm5h/5AplkPWhM/NmCJoW/MwNZHHkFhlr3mDRov5iOxVmTTYfnXB+I5lxYTSgduOLLErS7mU8hfADpVDU8bHNU44fNGD3UEiG1PD4qQBX4DMlqIFmR20mjs81k="
+    # GH_API_USER [for curl]
+    - secure: "AQGcX1B2NrI8ajflY4AimZDNcK2kBA3F6mbtEFQ78NkDoWhMipsQHayWXiSTzRc0YJKvQl2Y16MTwQF4VHzjTAiiZFATgA8J88vQUjIPabi/kKjqSmcLFoaAOAxStQbW6e0z2GiQ6KBMcNF1y5iUuI63xVrBvtKrYX/w5y+ako8="
+
+before_install:
+  - export TZ=Pacific/Honolulu
+  - echo $TRAVIS_PHP_VERSION
+  - echo $TRAVIS_BRANCH
+  - echo $TRAVIS_PULL_REQUEST
+  - composer self-update
+  - if [ $TRAVIS_BRANCH == 'develop' ] || [ $TRAVIS_PULL_REQUEST != 'false' ]; then
+        composer install --dev --prefer-dist;
+    fi
+  - if [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "7.1" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
+        export TRAVIS_TAG=$(curl --fail --user "${GH_API_USER}" -s https://api.github.com/repos/getgrav/grav/releases/latest | grep tag_name | head -n 1 | cut -d '"' -f 4);
+        eval "$(curl -sL https://raw.githubusercontent.com/travis-ci/gimme/master/gimme | GIMME_GO_VERSION=1.8 bash)";
+        go get github.com/aktau/github-release;
+        git clone --quiet --depth=50 --branch=master https://${BB_TOKEN}bitbucket.org/rockettheme/grav-devtools.git $RT_DEVTOOLS  &>/dev/null;
+        if [ ! -z "$TRAVIS_TAG" ]; then
+            cd ${RT_DEVTOOLS};
+            ./build-grav.sh skeletons.txt;
+        fi;
+    fi
+before_script:
+    - if [ $TRAVIS_PHP_VERSION != 'hhvm' ]; then phpenv config-rm xdebug.ini; fi
+script:
+  - if [ $TRAVIS_BRANCH == 'develop' ] || [ $TRAVIS_PULL_REQUEST != 'false' ]; then
+        vendor/bin/codecept run;
+    fi
+  - echo "Latest Release Tag - ${TRAVIS_TAG}"
+  - if [ ! -z "$TRAVIS_TAG" ] && [ $TRAVIS_BRANCH != 'develop' ] && [ $TRAVIS_PHP_VERSION == "7.1" ] && [ $TRAVIS_PULL_REQUEST == "false" ]; then
+      FILES="$RT_DEVTOOLS/grav-dist/*.zip";
+      for file in ${FILES[@]}; do
+        NAME=${file##*/};
+        if [[ "$NAME" == *"-rc"* ]]; then
+            REPO="$(echo ${NAME} | rev | cut -f 3- -d "-" | rev)";
+        else
+            REPO="$(echo ${NAME} | rev | cut -f 2- -d "-" | rev)";
+        fi;
+        if [[ $REPO == 'grav' || $REPO == 'grav-admin' || $REPO == 'grav-update' ]]; then
+          REPO="grav";
+        fi;
+        API="$(curl --fail --user "${GH_API_USER}" -s https://api.github.com/repos/${GH_USER}/${REPO}/releases/latest)";
+        ASSETS="$(echo "${API}" | node gh-assets.js)";
+        TAG="$(echo "${API}" | grep tag_name | head -n 1 | cut -d '"' -f 4)";
+        if [ $REPO == "grav" ]; then
+          TAG="$TRAVIS_TAG";
+        fi;
+        if [ ! -z "$ASSETS" ]; then
+          for asset in ${ASSETS[@]}; do
+            asset_id=$(echo ${asset} | cut -d ':' -f 1);
+            asset_name=$(echo ${asset} | cut -d ':' -f 2);
+            if [ "${NAME}" == "${asset_name}" ]; then
+              echo -e "\nAsset ${BOLD}${BLUE}${NAME}${TEXTRESET} already exists in ${YELLOW}${REPO}${TEXTRESET}@${BOLD}${YELLOW}${TAG}${TEXTRESET}... deleting id ${BOLD}${RED}${asset_id}${TEXTRESET}...";
+              curl -X DELETE --fail --user "${GH_API_USER}" "https://api.github.com/repos/${GH_USER}/${REPO}/releases/assets/${asset_id}";
+            fi;
+          done;
+        fi;
+        echo "Uploading package ${BOLD}${BLUE}${NAME}${TEXTRESET} to ${YELLOW}${REPO}${TEXTRESET}@${YELLOW}${TAG}${TEXTRESET}";
+        github-release upload --security-token $GH_TOKEN --user ${GH_USER} --repo $REPO --tag "$TAG" --name "$NAME" --file "$file";
+      done;
+    fi

File diff suppressed because it is too large
+ 2631 - 0
CHANGELOG.md


+ 46 - 0
CODE_OF_CONDUCT.md

@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@getgrav.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/

+ 138 - 0
CONTRIBUTING.md

@@ -0,0 +1,138 @@
+# Contributing to Grav
+
+:+1::tada: First, thanks for getting involved with Grav! :tada::+1:
+
+Please take a moment to review this document in order to make the contribution
+process easy and effective for everyone involved.
+
+Following these guidelines helps to communicate that you respect the time of
+the developers managing and developing this open source project. In return,
+they should reciprocate that respect in addressing your issue or assessing
+patches and features.
+
+## Grav, Plugins, Themes and Skeletons
+
+Grav is a large open source project — it's made up of over 100 repositories. When you initially consider contributing to Grav, you might be unsure about which of those 200 repositories implements the functionality you want to change or report a bug for.
+
+[https://github.com/getgrav/grav](https://github.com/getgrav/grav) is the main Grav repository. The core of Grav is provided by this repo.
+
+[https://github.com/getgrav/grav-plugin-admin](https://github.com/getgrav/grav-plugin-admin) is the Admin Plugin repository.
+
+Every Plugin and Theme has its own repository. If you have a problem you think is specific to a Theme or Plugin, please report it in its corresponding repository. Please read the Plugin or Theme documentation to ensure the problem is not addressed there already.
+
+Every Skeleton also has its own repository, so if an issue is not specific to a theme or plugin but rather to its usage in the skeleton, report it in the skeleton repository.
+
+## Using the issue tracker
+
+The issue tracker is the preferred channel for [bug reports](#bugs),
+[features requests](#features) and [submitting pull
+requests](#pull-requests), but please respect the following restrictions:
+
+* Please **do not** use the issue tracker for support requests. Use
+  [the Forum](http://getgrav.org/forum) or [the Chat](https://chat.getgrav.org/).
+
+
+<a name="bugs"></a>
+## Bug reports
+
+A bug is a _demonstrable problem_ that is caused by the code in the repository.
+Good bug reports are extremely helpful - thank you!
+
+Guidelines for bug reports:
+
+1. **Check you satisfy the Grav requirements** &mdash; [http://learn.getgrav.org/basics/requirements](http://learn.getgrav.org/basics/requirements)
+
+2. **Check this happens on a clean Grav install** &mdash; check if the issue happens on any Grav site, or just with a specific configuration of plugins / theme
+
+3. **Use the GitHub issue search** &mdash; check if the issue has already been
+   reported.
+
+4. **Check if the issue is already being solved in a PR** &mdash; check the open Pull Requests to see if one already solves the problem you're having
+
+5. **Check if the issue has been fixed** &mdash; try to reproduce it using the
+   latest `develop` branch in the repository.
+
+6. **Isolate the problem** &mdash; create a [reduced test
+   case](http://css-tricks.com/reduced-test-cases/) and provide a step-by-step instruction set on how to recreate the problem. Include code samples, page snippets or yaml configurations if needed.
+
+7. **Check the problem on Grav 1.1** &mdash; if you're using Grav 1.0, latest stable release, please also check if you can replicate the issue on Grav 1.1 RC as many bugs are already solved in the next Grav release.
+
+A good bug report shouldn't leave others needing to chase you up for more
+information. Please try to be as detailed as possible in your report.
+
+- What is your environment? Is it localhost, OSX, Linux, on a remote server? Same happening locally and or the server, or just locally or just on Linux?
+
+- What steps will reproduce the issue? What browser(s) and OS experience the problem?
+
+- What would you expect to be the outcome?
+
+- Did the problem start happening recently (e.g. after updating to a new version of Grav) or was this always a problem?
+
+- If the problem started happening recently, can you reproduce the problem in an older version of Grav? What's the most recent version in which the problem doesn't happen? You can download older versions of Grav from the releases page on Github.
+
+- Can you reliably reproduce the issue? If not, provide details about how often the problem happens and under which conditions it normally happens.
+
+
+All these details will help contributors to fix any potential bugs.
+
+Important: [include Code Samples in triple backticks](https://help.github.com/articles/github-flavored-markdown/#fenced-code-blocks) so that Github will provide a proper indentation. [Add the language name after the backticks](https://help.github.com/articles/github-flavored-markdown/#syntax-highlighting) to add syntax highlighting to the code snippets.
+
+Example:
+
+> Short and descriptive example bug report title
+>
+> A summary of the issue and the browser/OS environment in which it occurs. If
+> suitable, include the steps required to reproduce the bug.
+>
+> 1. This is the first step
+> 2. This is the second step
+> 3. Further steps, etc.
+>>
+> Any other information you want to share that is relevant to the issue being
+> reported. This might include the lines of code that you have identified as
+> causing the bug, and potential solutions (and your opinions on their
+> merits).
+
+
+<a name="features"></a>
+## Feature requests
+
+Feature requests are welcome. But take a moment to find out whether your idea
+fits with the scope and aims of the project. It's up to *you* to make a strong
+case to convince the project's developers of the merits of this feature. Please
+provide as much detail and context as possible.
+
+
+<a name="pull-requests"></a>
+## Pull requests
+
+Good pull requests - patches, improvements, new features - are a fantastic
+help. They should remain focused in scope and avoid containing unrelated
+commits.
+
+**Please ask first** in [the Forum](http://getgrav.org/forum) or [the Chat](https://chat.getgrav.org/) 
+before embarking on any significant pull request (e.g.
+implementing features, refactoring code..),
+otherwise you risk spending a lot of time working on something that the
+project's developers might not want to merge into the project.
+
+Please adhere to the coding conventions used throughout the project (indentation,
+accurate comments, etc.) and any other requirements.
+
+See [Using Pull Request](https://help.github.com/articles/using-pull-requests/) and [Fork a Repo](https://help.github.com/articles/fork-a-repo/) if you're not familiar with Pull Requests.
+
+Any pull request should be based on the `develop` branch. We will not consider pull requests made to master.
+
+**IMPORTANT**: By submitting a patch, you agree to allow the project owner to
+license your work under the same license as that used by the project.
+
+<a name="translations"></a>
+### Translations
+Translations for Grav core and the Admin plugin are managed through Crowdin:
+
+- Admin: https://crowdin.com/project/grav-admin
+- Core: https://crowdin.com/project/grav-core
+
+Please do not post translations PRs for core or admin translations on GitHub, with the exception of fixes for the english language.
+
+All other plugins and themes translations are handled directly in their GitHub repository, and the string are usually found in the `languages.yaml` file at the root of each project.

+ 21 - 0
LICENSE.txt

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 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.

+ 134 - 0
README.md

@@ -0,0 +1,134 @@
+# ![](https://avatars1.githubusercontent.com/u/8237355?v=2&s=50) Grav
+
+[![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)
+ [![Build Status](https://travis-ci.org/getgrav/grav.svg?branch=develop)](https://travis-ci.org/getgrav/grav) [![OpenCollective](https://opencollective.com/grav/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/grav/sponsors/badge.svg)](#sponsors)
+
+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.1.3 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
+
+# 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
+```
+
+### 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
+   ```
+
+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
+   ```
+
+Check out the [install procedures](https://learn.getgrav.org/basics/installation) for more information.
+
+# 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 index
+```
+
+This will display all the available plugins and then you can install one or more with:
+
+```
+$ bin/gpm install <plugin/theme>
+```
+
+# Updating
+
+To update Grav you should use the [Grav Package Manager](https://learn.getgrav.org/advanced/grav-gpm) or `GPM`:
+
+```
+$ bin/gpm selfupgrade
+```
+
+To update plugins and themes:
+
+```
+$ bin/gpm update
+```
+
+
+# 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)]
+
+<img src="https://opencollective.com/grav/tiers/backers.svg?avatarHeight=36&width=600" />
+
+# 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)]
+
+<img src="https://opencollective.com/grav/tiers/sponsors.svg?avatarHeight=36&width=600" />
+
+# 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 update` 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`

+ 0 - 0
assets/.gitkeep


+ 0 - 0
backup/.gitkeep


BIN
bin/composer.phar


+ 79 - 0
bin/gpm

@@ -0,0 +1,79 @@
+#!/usr/bin/env php
+<?php
+
+use Grav\Common\Composer;
+use Symfony\Component\Console\Application;
+use Grav\Common\Grav;
+
+\define('GRAV_CLI', true);
+\define('GRAV_REQUEST_TIME', microtime(true));
+
+if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
+    // Before we can even start, we need to run composer first
+    require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
+
+    $composer = Composer::getComposerExecutor();
+    echo "Preparing to install vendor dependencies...\n\n";
+    echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
+    echo "\n\n";
+}
+
+$autoload = require __DIR__ . '/../vendor/autoload.php';
+
+if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
+    exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
+}
+
+if (!ini_get('date.timezone')) {
+    date_default_timezone_set('UTC');
+}
+
+// Set internal encoding.
+if (!\extension_loaded('mbstring')) {
+    die("'mbstring' extension is not loaded.  This is required for Grav to run correctly");
+}
+@ini_set('default_charset', 'UTF-8');
+mb_internal_encoding('UTF-8');
+
+if (!file_exists(GRAV_ROOT . '/index.php')) {
+    exit('FATAL: Must be run from ROOT directory of Grav!');
+}
+
+if (!function_exists('curl_version')) {
+    exit('FATAL: GPM requires PHP Curl module to be installed');
+}
+
+$climate = new League\CLImate\CLImate;
+$climate->arguments->add([
+    'environment' => [
+        'prefix'        => 'e',
+        'longPrefix'    => 'env',
+        'description'   => 'Configuration Environment',
+        'defaultValue'  => 'localhost'
+    ]
+]);
+$climate->arguments->parse();
+
+// Set up environment based on params.
+$environment = $climate->arguments->get('environment');
+
+$grav = Grav::instance(array('loader' => $autoload));
+$grav->setup($environment);
+
+$grav['config']->init();
+$grav['uri']->init();
+$grav['accounts'];
+
+$app = new Application('Grav Package Manager', GRAV_VERSION);
+$app->addCommands(array(
+    new \Grav\Console\Gpm\IndexCommand(),
+    new \Grav\Console\Gpm\VersionCommand(),
+    new \Grav\Console\Gpm\InfoCommand(),
+    new \Grav\Console\Gpm\InstallCommand(),
+    new \Grav\Console\Gpm\UninstallCommand(),
+    new \Grav\Console\Gpm\UpdateCommand(),
+    new \Grav\Console\Gpm\SelfupgradeCommand(),
+    new \Grav\Console\Gpm\DirectInstallCommand(),
+));
+
+$app->run();

+ 74 - 0
bin/grav

@@ -0,0 +1,74 @@
+#!/usr/bin/env php
+<?php
+
+use Grav\Common\Composer;
+use Grav\Common\Grav;
+use League\CLImate\CLImate;
+use Symfony\Component\Console\Application;
+
+\define('GRAV_CLI', true);
+\define('GRAV_REQUEST_TIME', microtime(true));
+
+if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
+    // Before we can even start, we need to run composer first
+    require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
+
+    $composer = Composer::getComposerExecutor();
+    echo "Preparing to install vendor dependencies...\n\n";
+    echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
+    echo "\n\n";
+}
+
+$autoload = require __DIR__ . '/../vendor/autoload.php';
+
+if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
+    exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
+}
+
+if (!ini_get('date.timezone')) {
+    date_default_timezone_set('UTC');
+}
+
+// Set internal encoding.
+if (!\extension_loaded('mbstring')) {
+    die("'mbstring' extension is not loaded.  This is required for Grav to run correctly");
+}
+@ini_set('default_charset', 'UTF-8');
+mb_internal_encoding('UTF-8');
+
+$climate = new League\CLImate\CLImate;
+$climate->arguments->add([
+    'environment' => [
+        'prefix'        => 'e',
+        'longPrefix'    => 'env',
+        'description'   => 'Configuration Environment',
+        'defaultValue'  => 'localhost'
+    ]
+]);
+$climate->arguments->parse();
+
+// Set up environment based on params.
+$environment = $climate->arguments->get('environment');
+
+$grav = Grav::instance(array('loader' => $autoload));
+$grav->setup($environment);
+
+if (!file_exists(GRAV_ROOT . '/index.php')) {
+    exit('FATAL: Must be run from ROOT directory of Grav!');
+}
+
+$app = new Application('Grav CLI Application', GRAV_VERSION);
+$app->addCommands(array(
+    new \Grav\Console\Cli\InstallCommand(),
+    new \Grav\Console\Cli\ComposerCommand(),
+    new \Grav\Console\Cli\SandboxCommand(),
+    new \Grav\Console\Cli\CleanCommand(),
+    new \Grav\Console\Cli\ClearCacheCommand(),
+    new \Grav\Console\Cli\BackupCommand(),
+    new \Grav\Console\Cli\NewProjectCommand(),
+    new \Grav\Console\Cli\SchedulerCommand(),
+    new \Grav\Console\Cli\SecurityCommand(),
+    new \Grav\Console\Cli\LogViewerCommand(),
+    new \Grav\Console\Cli\YamlLinterCommand(),
+));
+$app->run();

+ 152 - 0
bin/plugin

@@ -0,0 +1,152 @@
+#!/usr/bin/env php
+<?php
+
+use Grav\Common\Composer;
+use Symfony\Component\Console\Application;
+use Symfony\Component\Console\Input\ArgvInput;
+use Symfony\Component\Console\Output\ConsoleOutput;
+use Symfony\Component\Console\Formatter\OutputFormatterStyle;
+use Grav\Common\Grav;
+use Grav\Common\Filesystem\Folder;
+
+\define('GRAV_CLI', true);
+\define('GRAV_REQUEST_TIME', microtime(true));
+
+if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
+    // Before we can even start, we need to run composer first
+    require_once __DIR__ . '/../system/src/Grav/Common/Composer.php';
+
+    $composer = Composer::getComposerExecutor();
+    echo "Preparing to install vendor dependencies...\n\n";
+    echo system($composer.' --working-dir="'.__DIR__.'/../" --no-interaction --no-dev --prefer-dist -o install');
+    echo "\n\n";
+}
+
+$autoload = require __DIR__ . '/../vendor/autoload.php';
+
+if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
+    exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
+}
+
+if (!ini_get('date.timezone')) {
+    date_default_timezone_set('UTC');
+}
+
+// Set internal encoding.
+if (!\extension_loaded('mbstring')) {
+    die("'mbstring' extension is not loaded.  This is required for Grav to run correctly");
+}
+@ini_set('default_charset', 'UTF-8');
+mb_internal_encoding('UTF-8');
+
+if (!file_exists(GRAV_ROOT . '/index.php')) {
+    exit('FATAL: Must be run from ROOT directory of Grav!');
+}
+
+$climate = new League\CLImate\CLImate;
+$climate->arguments->add([
+    'environment' => [
+        'prefix'        => 'e',
+        'longPrefix'    => 'env',
+        'description'   => 'Configuration Environment',
+        'defaultValue'  => 'localhost'
+    ]
+]);
+$climate->arguments->parse();
+
+$environment = $climate->arguments->get('environment');
+
+$grav = Grav::instance(array('loader' => $autoload));
+$grav->setup($environment);
+$grav->initializeCli();
+
+$app     = new Application('Grav Plugins Commands', GRAV_VERSION);
+$pattern = '([A-Z]\w+Command\.php)';
+
+// get arguments and  strip the application name
+if (null === $argv) {
+    $argv = $_SERVER['argv'];
+}
+
+$bin  = array_shift($argv);
+$name = array_shift($argv);
+$argv = array_merge([$bin], $argv);
+
+$input = new ArgvInput($argv);
+
+/** @var \Grav\Common\Data\Data $plugin */
+$plugin = $grav['plugins']->get($name);
+
+$output = new ConsoleOutput();
+$output->getFormatter()->setStyle('red', new OutputFormatterStyle('red', null, array('bold')));
+$output->getFormatter()->setStyle('white', new OutputFormatterStyle('white', null, array('bold')));
+
+if (!$name) {
+    $output->writeln('');
+    $output->writeln('<red>Usage:</red>');
+    $output->writeln("  {$bin} [slug] [command] [arguments]");
+    $output->writeln('');
+    $output->writeln('<red>Example:</red>');
+    $output->writeln("  {$bin} error log -l 1 --trace");
+    $list = Folder::all('plugins://', ['compare' => 'Pathname', 'pattern' => '/\/cli\/' . $pattern . '$/usm', 'levels' => 2]);
+
+    $total = 0;
+    if (count($list)) {
+        $available = [];
+        $output->writeln('');
+        $output->writeln('<red>Plugins with CLI available:</red>');
+        foreach ($list as $index => $entry) {
+            $split = explode('/', $entry);
+            $entry = array_shift($split);
+            $index = str_pad($index++ + 1, 2, '0', STR_PAD_LEFT);
+            $total = str_pad($total++ + 1, 2, '0', STR_PAD_LEFT);
+            if (\in_array($entry, $available, true)) {
+                $total--;
+                continue;
+            }
+
+            $available[] = $entry;
+            $commands_count = $index - $total + 1;
+            $output->writeln('  ' . $total . '. <red>' . str_pad($entry, 15) . "</red> <white>{$bin} {$entry} list</white>");
+        }
+    }
+
+    exit;
+} else {
+    if (is_null($plugin)) {
+        $output->writeln('');
+        $output->writeln("<red>$name plugin not found</red>");
+        die;
+    }
+
+    if (!$plugin->enabled) {
+        $output->writeln('');
+        $output->writeln("<red>$name not enabled</red>");
+        die;
+    }
+}
+
+if ($plugin === null) {
+    $output->writeln("<red>Grav Plugin <white>'{$name}'</white> is not installed</red>");
+    exit;
+}
+
+$path = 'plugins://' . $name . '/cli';
+
+try {
+    $commands = Folder::all($path, ['compare' => 'Filename', 'pattern' => '/' . $pattern . '$/usm', 'levels' => 1]);
+} catch (\RuntimeException $e) {
+    $output->writeln("<red>No Console Commands for <white>'{$name}'</white> where found in <white>'{$path}'</white></red>");
+    exit;
+}
+
+foreach ($commands as $command_path) {
+    $full_path = $grav['locator']->findResource("plugins://{$name}/cli/{$command_path}");
+    require_once $full_path;
+
+    $command_class = 'Grav\Plugin\Console\\' . preg_replace('/.php$/', '', $command_path);
+    $command = new $command_class();
+    $app->add($command);
+}
+
+$app->run($input);

+ 0 - 0
cache/.gitkeep


+ 16 - 0
codeception.yml

@@ -0,0 +1,16 @@
+actor: Tester
+paths:
+    tests: tests
+    log: tests/_output
+    data: tests/_data
+    support: tests/_support
+    envs: tests/_envs
+settings:
+    bootstrap: _bootstrap.php
+    colors: true
+    memory_limit: 1024M
+extensions:
+    enabled:
+        - Codeception\Extension\RunFailed
+modules:
+    config:

+ 112 - 0
composer.json

@@ -0,0 +1,112 @@
+{
+    "name": "getgrav/grav",
+    "type": "project",
+    "description": "Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS",
+    "keywords": [
+        "cms",
+        "flat-file cms",
+        "flat cms",
+        "flatfile cms",
+        "php"
+    ],
+    "homepage": "https://getgrav.org",
+    "license": "MIT",
+    "require": {
+        "php": ">=7.1.3",
+        "ext-json": "*",
+        "ext-mbstring": "*",
+        "ext-openssl": "*",
+        "ext-curl": "*",
+        "ext-zip": "*",
+        "ext-dom": "*",
+        "symfony/polyfill-iconv": "^1.9",
+        "symfony/polyfill-php72": "^1.9",
+        "symfony/polyfill-php73": "^1.9",
+        "psr/simple-cache": "^1.0",
+        "psr/http-message": "^1.0",
+        "psr/http-server-middleware": "^1.0",
+        "kodus/psr7-server": "*",
+        "nyholm/psr7": "^1.0",
+        "twig/twig": "~1.40",
+        "erusev/parsedown": "1.6.4",
+        "erusev/parsedown-extra": "~0.7",
+        "symfony/yaml": "~4.2.0",
+        "symfony/console": "~4.2.0",
+        "symfony/event-dispatcher": "~4.2.0",
+        "symfony/var-dumper": "~4.2.0",
+        "symfony/process": "~4.2.0",
+        "doctrine/cache": "^1.8",
+        "doctrine/collections": "^1.5",
+        "guzzlehttp/psr7": "^1.4",
+        "filp/whoops": "~2.2",
+        "matthiasmullie/minify": "^1.3",
+        "monolog/monolog": "~1.0",
+        "gregwar/image": "2.*",
+        "donatj/phpuseragentparser": "~0.10",
+        "pimple/pimple": "~3.2",
+        "rockettheme/toolbox": "~1.4.0",
+        "maximebf/debugbar": "~1.15",
+        "league/climate": "^3.4",
+        "antoligy/dom-string-iterators": "^1.0",
+        "miljar/php-exif": "^0.6.4",
+        "composer/ca-bundle": "^1.0",
+        "dragonmantank/cron-expression": "^1.2",
+        "phive/twig-extensions-deferred": "^1.0",
+        "willdurand/negotiation": "^2.3"
+    },
+    "require-dev": {
+        "codeception/codeception": "^2.4",
+        "phpstan/phpstan": "^0.11",
+        "phpstan/phpstan-deprecation-rules": "^0.11.0",
+        "phpunit/php-code-coverage": "~6.0",
+        "fzaninotto/faker": "^1.8",
+        "victorjonsson/markdowndocs": "dev-master"
+    },
+    "suggest": {
+        "ext-zend-opcache": "Recommended for better performance",
+        "ext-intl": "Recommended for multi-language sites",
+        "ext-memcache": "Needed to support Memcache servers",
+        "ext-memcached": "Needed to support Memcached servers",
+        "ext-redis": "Needed to support Redis servers"
+    },
+    "config": {
+        "apcu-autoloader": true,
+        "platform": {
+            "php": "7.1.3"
+        }
+    },
+    "repositories": [
+        {
+            "type": "vcs",
+            "url": "https://github.com/trilbymedia/PHP-Markdown-Documentation-Generator"
+        }
+    ],
+    "autoload": {
+        "psr-4": {
+            "Grav\\": "system/src/Grav"
+        },
+        "files": [
+            "system/defines.php"
+        ]
+    },
+    "archive": {
+        "exclude": [
+            "VERSION"
+        ]
+    },
+    "scripts": {
+        "api-16": "vendor/bin/phpdoc-md generate system/src > user/pages/14.api/default.16.md",
+        "api-15": "vendor/bin/phpdoc-md generate system/src > user/pages/14.api/default.md",
+        "post-create-project-cmd": "bin/grav install",
+        "phpstan": "vendor/bin/phpstan analyse -l 2 -c ./tests/phpstan/phpstan.neon system/src --memory-limit=256M",
+        "phpstan-framework": "vendor/bin/phpstan analyse -l 5 -c ./tests/phpstan/phpstan.neon system/src/Grav/Framework --memory-limit=256M",
+        "phpstan-plugins": "vendor/bin/phpstan analyse -l 0 -c ./tests/phpstan/plugins.neon user/plugins --memory-limit=256M",
+        "test": "vendor/bin/codecept run unit",
+        "test-windows": "vendor\\bin\\codecept run unit"
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-develop": "1.x-dev"
+        }
+    }
+}

File diff suppressed because it is too large
+ 5688 - 0
composer.lock


+ 0 - 0
images/.gitkeep


+ 61 - 0
index.php

@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @package    Grav.Core
+ *
+ * @copyright  Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
+ * @license    MIT License; see LICENSE file for details.
+ */
+
+namespace Grav;
+
+\define('GRAV_REQUEST_TIME', microtime(true));
+\define('GRAV_PHP_MIN', '7.1.3');
+
+if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
+    die(sprintf('You are running PHP %s, but Grav needs at least <strong>PHP %s</strong> to run.', $ver, $req));
+}
+
+if (PHP_SAPI === 'cli-server' && !isset($_SERVER['PHP_CLI_ROUTER'])) {
+    die("PHP webserver requires a router to run Grav, please use: <pre>php -S {$_SERVER['SERVER_NAME']}:{$_SERVER['SERVER_PORT']} system/router.php</pre>");
+}
+
+// Set timezone to default, falls back to system if php.ini not set
+date_default_timezone_set(@date_default_timezone_get());
+
+// Set internal encoding.
+if (!\extension_loaded('mbstring')) {
+    die("'mbstring' extension is not loaded.  This is required for Grav to run correctly");
+}
+@ini_set('default_charset', 'UTF-8');
+mb_internal_encoding('UTF-8');
+
+// Ensure vendor libraries exist
+$autoload = __DIR__ . '/vendor/autoload.php';
+if (!is_file($autoload)) {
+    die('Please run: <i>bin/grav install</i>');
+}
+
+// Register the auto-loader.
+$loader = require $autoload;
+
+use Grav\Common\Grav;
+use RocketTheme\Toolbox\Event\Event;
+
+// Get the Grav instance
+$grav = Grav::instance(
+    array(
+        'loader' => $loader
+    )
+);
+
+// Process the page
+try {
+    $grav->process();
+} catch (\Error $e) {
+    $grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
+    throw $e;
+} catch (\Exception $e) {
+    $grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
+    throw $e;
+}

+ 0 - 0
logs/.gitkeep


+ 4 - 0
now.json

@@ -0,0 +1,4 @@
+    {
+  "version": 2,
+  "builds": [{ "src": "*.php", "use": "@now/php" }]
+}

+ 13 - 0
robots.txt

@@ -0,0 +1,13 @@
+User-agent: *
+Disallow: /backup/
+Disallow: /bin/
+Disallow: /cache/
+Disallow: /grav/
+Disallow: /logs/
+Disallow: /system/
+Disallow: /vendor/
+Disallow: /user/
+Allow: /user/pages/
+Allow: /user/themes/
+Allow: /user/images/
+Allow: /

+ 70 - 0
system/assets/debugger.css

@@ -0,0 +1,70 @@
+div.phpdebugbar {
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+.phpdebugbar pre {
+    padding: 1rem;
+}
+
+.phpdebugbar div.phpdebugbar-header > div > * {
+    padding: 5px 15px;
+}
+
+.phpdebugbar div.phpdebugbar-header > div.phpdebugbar-header-right > * {
+    padding: 5px 8px;
+}
+
+.phpdebugbar div.phpdebugbar-header, .phpdebugbar a.phpdebugbar-restore-btn {
+    background-image: url(grav.png);
+}
+
+.phpdebugbar a.phpdebugbar-restore-btn {
+    width: 13px;
+}
+
+.phpdebugbar a.phpdebugbar-tab.phpdebugbar-active {
+    background: #3DB9EC;
+    color: #fff;
+    margin-top: -1px;
+    padding-top: 6px;
+}
+
+.phpdebugbar .phpdebugbar-widgets-toolbar {
+    border-top: 1px solid #ddd;
+    padding-left: 5px;
+    padding-right: 2px;
+    padding-top: 2px;
+    background-color: #fafafa !important;
+    width: auto !important;
+    left: 0;
+    right: 0;
+}
+
+.phpdebugbar .phpdebugbar-widgets-toolbar input {
+    background: transparent !important;
+}
+
+.phpdebugbar .phpdebugbar-widgets-toolbar .phpdebugbar-widgets-filter {
+
+}
+
+
+.phpdebugbar input[type=text] {
+    padding: 0;
+    display: inline;
+}
+
+.phpdebugbar dl.phpdebugbar-widgets-varlist, ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-label {
+    font-family: "DejaVu Sans Mono", Menlo, Monaco, Consolas, Courier, monospace;
+    font-size: 12px;
+}
+
+ul.phpdebugbar-widgets-timeline li span.phpdebugbar-widgets-label {
+    text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff;
+    top: 0;
+}
+
+.phpdebugbar pre, .phpdebugbar code {
+    margin: 0;
+    font-size: 14px;
+}

BIN
system/assets/grav.png


File diff suppressed because it is too large
+ 4 - 0
system/assets/jquery/jquery-2.1.4.min.js


File diff suppressed because it is too large
+ 4 - 0
system/assets/jquery/jquery-2.x.min.js


File diff suppressed because it is too large
+ 2 - 0
system/assets/jquery/jquery-3.x.min.js


BIN
system/assets/responsive-overlays/1x.png


BIN
system/assets/responsive-overlays/2x.png


BIN
system/assets/responsive-overlays/3x.png


BIN
system/assets/responsive-overlays/4x.png


BIN
system/assets/responsive-overlays/unknown.png


+ 19 - 0
system/assets/whoops.css

@@ -0,0 +1,19 @@
+body header {
+    background: #3085EE;
+}
+
+body .left-panel {
+    background: inherit;
+}
+
+body .exc-title-primary {
+    color: #fff;
+}
+
+body .exc-title {
+    color: #ddd;
+}
+
+body .frame:not(.active):hover {
+    background: #e6e6e6;
+}

+ 125 - 0
system/blueprints/config/backups.yaml

@@ -0,0 +1,125 @@
+title: PLUGIN_ADMIN.BACKUPS
+
+form:
+    validation: loose
+
+    fields:
+        history_title:
+            type: section
+            title: PLUGIN_ADMIN.BACKUPS_HISTORY
+            underline: true
+
+        history:
+            type: backupshistory
+
+        config_title:
+            type: section
+            title: PLUGIN_ADMIN.BACKUPS_PURGE_CONFIG
+            underline: true
+
+        purge.trigger:
+            type: select
+            label: PLUGIN_ADMIN.BACKUPS_STORAGE_PURGE_TRIGGER
+            size: medium
+            default: space
+            options:
+                space: Maximum Backup Space
+                number: Maximum Number of Backups
+                time: maximum Retention Time
+            validate:
+                required: true
+
+        purge.max_backups_count:
+            type: number
+            label: PLUGIN_ADMIN.BACKUPS_MAX_COUNT
+            default: 25
+            size: x-small
+            help: PLUGIN_ADMIN.BACKUPS_MAX_COUNT
+            validate:
+                min: 0
+                type: number
+                required: true
+                message: Must be a number 0 or greater
+
+        purge.max_backups_space:
+            type: number
+            label: PLUGIN_ADMIN.BACKUPS_MAX_SPACE
+            append: in GB
+            size: x-small
+            default: 5
+            validate:
+                min: 1
+                type: number
+                required: true
+                message: Space must be 1GB or greater
+
+        purge.max_backups_time:
+            type: number
+            label: PLUGIN_ADMIN.BACKUPS_MAX_RETENTION_TIME
+            append: PLUGIN_ADMIN.BACKUPS_MAX_RETENTION_TIME_APPEND
+            size: x-small
+            default: 365
+            validate:
+                min: 7
+                type: number
+                required: true
+                message: Rentenion days must be 7 or greater
+
+        profiles_title:
+          type: section
+          title: PLUGIN_ADMIN.BACKUPS_PROFILES
+          underline: true
+
+        profiles:
+          type: list
+          style: vertical
+          label:
+          classes: backups-list compact
+          sort: false
+
+          fields:
+            .name:
+              type: text
+              label: PLUGIN_ADMIN.NAME
+              placeholder: PLUGIN_ADMIN.BACKUPS_PROFILE_NAME
+              validate:
+                  max: 20
+                  message: 'Name must be less than 20 characters'
+                  required: true
+            .root:
+              type: text
+              label: PLUGIN_ADMIN.BACKUPS_PROFILE_ROOT_FOLDER
+              help: PLUGIN_ADMIN.BACKUPS_PROFILE_ROOT_FOLDER_HELP
+              placeholder: '/'
+              default: '/'
+              validate:
+                  required: true
+            .exclude_paths:
+              type: textarea
+              label: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_PATHS
+              rows: 5
+              placeholder: "/backup\r/cache\r/images\r/logs\r/tmp"
+              help: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_PATHS_HELP
+            .exclude_files:
+                type: textarea
+                label: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_FILES
+                rows: 5
+                placeholder: ".DS_Store\r.git\r.svn\r.hg\r.idea\r.vscode\rnode_modules"
+                help: PLUGIN_ADMIN.BACKUPS_PROFILE_EXCLUDE_FILES_HELP
+            .schedule:
+                type: toggle
+                label: PLUGIN_ADMIN.BACKUPS_PROFILE_SCHEDULE
+                highlight: 1
+                default: 1
+                options:
+                    1: PLUGIN_ADMIN.YES
+                    0: PLUGIN_ADMIN.NO
+                validate:
+                    type: bool
+            .schedule_at:
+                type: cron
+                label: PLUGIN_ADMIN.BACKUPS_PROFILE_SCHEDULE_AT
+                default: '* 3 * * *'
+                validate:
+                    required: true
+

+ 5 - 0
system/blueprints/config/media.yaml

@@ -0,0 +1,5 @@
+title: PLUGIN_ADMIN.MEDIA
+
+form:
+  validation: loose
+  fields:

+ 76 - 0
system/blueprints/config/scheduler.yaml

@@ -0,0 +1,76 @@
+title: PLUGIN_ADMIN.SCHEDULER
+
+form:
+    validation: loose
+
+    fields:
+
+        status_title:
+            type: section
+            title: PLUGIN_ADMIN.SCHEDULER_STATUS
+            underline: true
+
+        status:
+            type: cronstatus
+            validate:
+                type: commalist
+
+        jobs_title:
+            type: section
+            title: PLUGIN_ADMIN.SCHEDULER_JOBS
+            underline: true
+
+        custom_jobs:
+          type: list
+          style: vertical
+          label:
+          classes: cron-job-list compact
+          key: id
+          fields:
+            .id:
+              type: key
+              label: ID
+              placeholder: 'process-name'
+              validate:
+                  required: true
+                  pattern: '[a-zа-я0-9_\-]+'
+                  max: 20
+                  message: 'ID must be lowercase with dashes/underscores only and less than 20 characters'
+            .command:
+              type: text
+              label: PLUGIN_ADMIN.COMMAND
+              placeholder: 'cd ~;ls -lah;'
+              validate:
+                  required: true
+            .args:
+              type: text
+              label: PLUGIN_ADMIN.EXTRA_ARGUMENTS
+            .at:
+              type: cron
+              label: PLUGIN_ADMIN.SCHEDULER_RUNAT
+              help: PLUGIN_ADMIN.SCHEDULER_RUNAT_HELP
+              placeholder: '* * * * *'
+              validate:
+                  required: true
+            .output:
+              type: text
+              label: PLUGIN_ADMIN.SCHEDULER_OUTPUT
+              help: PLUGIN_ADMIN.SCHEDULER_OUTPUT_HELP
+              placeholder: 'logs/ls-cron.out'
+            .output_mode:
+              type: select
+              label: PLUGIN_ADMIN.SCHEDULER_OUTPUT_TYPE
+              help: PLUGIN_ADMIN.SCHEDULER_OUTPUT_TYPE_HELP
+              default: append
+              options:
+                  append: Append
+                  overwrite: Overwrite
+            .email:
+                type: text
+                label: PLUGIN_ADMIN.SCHEDULER_EMAIL
+                help: PLUGIN_ADMIN.SCHEDULER_EMAIL_HELP
+                placeholder: 'notifications@yoursite.com'
+
+
+
+

+ 107 - 0
system/blueprints/config/security.yaml

@@ -0,0 +1,107 @@
+title: PLUGIN_ADMIN.SECURITY
+
+form:
+    validation: loose
+    fields:
+
+        xss_section:
+            type: section
+            title: PLUGIN_ADMIN.XSS_SECURITY
+            underline: true
+
+        xss_whitelist:
+            type: selectize
+            size: large
+            label: PLUGIN_ADMIN.XSS_WHITELIST_PERMISSIONS
+            help: PLUGIN_ADMIN.XSS_WHITELIST_PERMISSIONS_HELP
+            placeholder: 'admin.super'
+            classes: fancy
+            validate:
+                type: commalist
+
+        xss_enabled.on_events:
+            type: toggle
+            label: PLUGIN_ADMIN.XSS_ON_EVENTS
+            highlight: 1
+            options:
+                1: PLUGIN_ADMIN.YES
+                0: PLUGIN_ADMIN.NO
+            default: true
+            validate:
+                type: bool
+
+        xss_enabled.invalid_protocols:
+            type: toggle
+            label: PLUGIN_ADMIN.XSS_INVALID_PROTOCOLS
+            highlight: 1
+            options:
+                1: PLUGIN_ADMIN.YES
+                0: PLUGIN_ADMIN.NO
+            default: true
+            validate:
+                type: bool
+
+        xss_invalid_protocols:
+            type: selectize
+            size: large
+            label: PLUGIN_ADMIN.XSS_INVALID_PROTOCOLS_LIST
+            classes: fancy
+            validate:
+                type: commalist
+
+        xss_enabled.moz_binding:
+            type: toggle
+            label: PLUGIN_ADMIN.XSS_MOZ_BINDINGS
+            highlight: 1
+            options:
+                1: PLUGIN_ADMIN.YES
+                0: PLUGIN_ADMIN.NO
+            default: true
+            validate:
+                type: bool
+
+        xss_enabled.html_inline_styles:
+            type: toggle
+            label: PLUGIN_ADMIN.XSS_HTML_INLINE_STYLES
+            highlight: 1
+            options:
+                1: PLUGIN_ADMIN.YES
+                0: PLUGIN_ADMIN.NO
+            default: true
+            validate:
+                type: bool
+
+        xss_enabled.dangerous_tags:
+            type: toggle
+            label: PLUGIN_ADMIN.XSS_DANGEROUS_TAGS
+            highlight: 1
+            options:
+                1: PLUGIN_ADMIN.YES
+                0: PLUGIN_ADMIN.NO
+            default: true
+            validate:
+                type: bool
+
+        xss_dangerous_tags:
+            type: selectize
+            size: large
+            label: PLUGIN_ADMIN.XSS_DANGEROUS_TAGS_LIST
+            classes: fancy
+            validate:
+                type: commalist
+
+        uploads_section:
+            type: section
+            title: PLUGIN_ADMIN.UPLOADS_SECURITY
+            underline: true
+
+
+        uploads_dangerous_extensions:
+            type: selectize
+            size: large
+            label: PLUGIN_ADMIN.UPLOADS_DANGEROUS_EXTENSIONS
+            help: PLUGIN_ADMIN.UPLOADS_DANGEROUS_EXTENSIONS_HELP
+            classes: fancy
+            validate:
+                type: commalist
+

+ 124 - 0
system/blueprints/config/site.yaml

@@ -0,0 +1,124 @@
+title: PLUGIN_ADMIN.SITE
+form:
+    validation: loose
+    fields:
+
+        content:
+            type: section
+            title: PLUGIN_ADMIN.DEFAULTS
+            underline: true
+
+            fields:
+                title:
+                    type: text
+                    label: PLUGIN_ADMIN.SITE_TITLE
+                    size: large
+                    placeholder: PLUGIN_ADMIN.SITE_TITLE_PLACEHOLDER
+                    help: PLUGIN_ADMIN.SITE_TITLE_HELP
+
+                default_lang:
+                    type: text
+                    label: PLUGIN_ADMIN.SITE_DEFAULT_LANG
+                    size: x-small
+                    placeholder: PLUGIN_ADMIN.SITE_DEFAULT_LANG_PLACEHOLDER
+                    help: PLUGIN_ADMIN.SITE_DEFAULT_LANG_HELP
+
+                author.name:
+                    type: text
+                    size: large
+                    label: PLUGIN_ADMIN.DEFAULT_AUTHOR
+                    help: PLUGIN_ADMIN.DEFAULT_AUTHOR_HELP
+
+                author.email:
+                    type: text
+                    size: large
+                    label: PLUGIN_ADMIN.DEFAULT_EMAIL
+                    help: PLUGIN_ADMIN.DEFAULT_EMAIL_HELP
+                    validate:
+                        type: email
+
+                taxonomies:
+                    type: selectize
+                    size: large
+                    label: PLUGIN_ADMIN.TAXONOMY_TYPES
+                    classes: fancy
+                    help: PLUGIN_ADMIN.TAXONOMY_TYPES_HELP
+                    validate:
+                        type: commalist
+
+        summary:
+            type: section
+            title: PLUGIN_ADMIN.PAGE_SUMMARY
+            underline: true
+
+            fields:
+                summary.enabled:
+                    type: toggle
+                    label: PLUGIN_ADMIN.ENABLED
+                    highlight: 1
+                    help: PLUGIN_ADMIN.ENABLED_HELP
+                    options:
+                        1: PLUGIN_ADMIN.YES
+                        0: PLUGIN_ADMIN.NO
+                    validate:
+                        type: bool
+
+                summary.size:
+                    type: text
+                    size: small
+                    append: PLUGIN_ADMIN.CHARACTERS
+                    label: PLUGIN_ADMIN.SUMMARY_SIZE
+                    help: PLUGIN_ADMIN.SUMMARY_SIZE_HELP
+                    validate:
+                        type: int
+                        min: 0
+                        max: 65536
+
+                summary.format:
+                    type: toggle
+                    label: PLUGIN_ADMIN.FORMAT
+                    classes: fancy
+                    help: PLUGIN_ADMIN.FORMAT_HELP
+                    highlight: short
+                    options:
+                        'short': PLUGIN_ADMIN.SHORT
+                        'long': PLUGIN_ADMIN.LONG
+
+                summary.delimiter:
+                    type: text
+                    size: x-small
+                    label: PLUGIN_ADMIN.DELIMITER
+                    help: PLUGIN_ADMIN.DELIMITER_HELP
+
+        metadata:
+            type: section
+            title: PLUGIN_ADMIN.METADATA
+            underline: true
+
+            fields:
+                metadata:
+                   type: array
+                   label: PLUGIN_ADMIN.METADATA
+                   help: PLUGIN_ADMIN.METADATA_HELP
+                   placeholder_key: PLUGIN_ADMIN.METADATA_KEY
+                   placeholder_value: PLUGIN_ADMIN.METADATA_VALUE
+
+        routes:
+            type: section
+            title: PLUGIN_ADMIN.REDIRECTS_AND_ROUTES
+            underline: true
+
+            fields:
+                redirects:
+                    type: array
+                    label: PLUGIN_ADMIN.CUSTOM_REDIRECTS
+                    help: PLUGIN_ADMIN.CUSTOM_REDIRECTS_HELP
+                    placeholder_key: PLUGIN_ADMIN.CUSTOM_REDIRECTS_PLACEHOLDER_KEY
+                    placeholder_value: PLUGIN_ADMIN.CUSTOM_REDIRECTS_PLACEHOLDER_VALUE
+
+                routes:
+                    type: array
+                    label: PLUGIN_ADMIN.CUSTOM_ROUTES
+                    help: PLUGIN_ADMIN.CUSTOM_ROUTES_HELP
+                    placeholder_key: PLUGIN_ADMIN.CUSTOM_ROUTES_PLACEHOLDER_KEY
+                    placeholder_value: PLUGIN_ADMIN.CUSTOM_ROUTES_PLACEHOLDER_VALUE

+ 8 - 0
system/blueprints/config/streams.yaml

@@ -0,0 +1,8 @@
+title: PLUGIN_ADMIN.FILE_STREAMS
+
+form:
+  validation: loose
+  hidden: true
+  fields:
+    schemes.xxx:
+      type: array

File diff suppressed because it is too large
+ 1410 - 0
system/blueprints/config/system.yaml


+ 369 - 0
system/blueprints/pages/default.yaml

@@ -0,0 +1,369 @@
+title: PLUGIN_ADMIN.DEFAULT
+
+rules:
+  slug:
+    pattern: '[a-zA-Zа-яA-Я0-9_\-]+'
+    min: 1
+    max: 200
+
+form:
+  validation: loose
+
+  fields:
+
+    tabs:
+      type: tabs
+      active: 1
+
+      fields:
+        content:
+          type: tab
+          title: PLUGIN_ADMIN.CONTENT
+
+          fields:
+            xss_check:
+              type: xss
+
+            header.title:
+              type: text
+              autofocus: true
+              style: vertical
+              label: PLUGIN_ADMIN.TITLE
+
+            content:
+                type: markdown
+                validate:
+                  type: textarea
+
+            header.media_order:
+              type: pagemedia
+              label: PLUGIN_ADMIN.PAGE_MEDIA
+
+        options:
+          type: tab
+          title: PLUGIN_ADMIN.OPTIONS
+
+          fields:
+
+            publishing:
+              type: section
+              title: PLUGIN_ADMIN.PUBLISHING
+              underline: true
+
+              fields:
+                header.published:
+                  type: toggle
+                  toggleable: true
+                  label: PLUGIN_ADMIN.PUBLISHED
+                  help: PLUGIN_ADMIN.PUBLISHED_HELP
+                  highlight: 1
+                  size: medium
+                  options:
+                    1: PLUGIN_ADMIN.YES
+                    0: PLUGIN_ADMIN.NO
+                  validate:
+                    type: bool
+
+                header.date:
+                  type: datetime
+                  label: PLUGIN_ADMIN.DATE
+                  toggleable: true
+                  help: PLUGIN_ADMIN.DATE_HELP
+
+                header.publish_date:
+                  type: datetime
+                  label: PLUGIN_ADMIN.PUBLISHED_DATE
+                  toggleable: true
+                  help: PLUGIN_ADMIN.PUBLISHED_DATE_HELP
+
+                header.unpublish_date:
+                  type: datetime
+                  label: PLUGIN_ADMIN.UNPUBLISHED_DATE
+                  toggleable: true
+                  help: PLUGIN_ADMIN.UNPUBLISHED_DATE_HELP
+
+                header.metadata:
+                  toggleable: true
+                  type: array
+                  label: PLUGIN_ADMIN.METADATA
+                  help: PLUGIN_ADMIN.METADATA_HELP
+                  placeholder_key: PLUGIN_ADMIN.METADATA_KEY
+                  placeholder_value: PLUGIN_ADMIN.METADATA_VALUE
+
+            taxonomies:
+              type: section
+              title: PLUGIN_ADMIN.TAXONOMIES
+              underline: true
+
+              fields:
+                header.taxonomy:
+                  type: taxonomy
+                  label: PLUGIN_ADMIN.TAXONOMY
+                  multiple: true
+                  validate:
+                    type: array
+
+        advanced:
+          type: tab
+          title: PLUGIN_ADMIN.ADVANCED
+
+          fields:
+            columns:
+              type: columns
+              fields:
+                column1:
+                  type: column
+                  fields:
+
+                    settings:
+                      type: section
+                      title: PLUGIN_ADMIN.SETTINGS
+                      underline: true
+
+                    folder:
+                      type: text
+                      label: PLUGIN_ADMIN.FOLDER_NAME
+                      validate:
+                        rule: slug
+
+                    route:
+                      type: parents
+                      label: PLUGIN_ADMIN.PARENT
+                      classes: fancy
+
+                    name:
+                      type: select
+                      classes: fancy
+                      label: PLUGIN_ADMIN.PAGE_FILE
+                      help: PLUGIN_ADMIN.PAGE_FILE_HELP
+                      default: default
+                      data-options@: '\Grav\Common\Page\Pages::pageTypes'
+
+                    header.body_classes:
+                      type: text
+                      label: PLUGIN_ADMIN.BODY_CLASSES
+
+
+                column2:
+                  type: column
+
+                  fields:
+                    order_title:
+                      type: section
+                      title: PLUGIN_ADMIN.ORDERING
+                      underline: true
+
+                    ordering:
+                      type: toggle
+                      label: PLUGIN_ADMIN.FOLDER_NUMERIC_PREFIX
+                      help: PLUGIN_ADMIN.FOLDER_NUMERIC_PREFIX_HELP
+                      highlight: 1
+                      options:
+                        1: PLUGIN_ADMIN.ENABLED
+                        0: PLUGIN_ADMIN.DISABLED
+                      validate:
+                        type: bool
+
+                    order:
+                      type: order
+                      label: PLUGIN_ADMIN.SORTABLE_PAGES
+                      sitemap:
+
+            overrides:
+              type: section
+              title: PLUGIN_ADMIN.OVERRIDES
+              underline: true
+
+              fields:
+
+                header.dateformat:
+                  toggleable: true
+                  type: select
+                  size: medium
+                  selectize:
+                    create: true
+                  label: PLUGIN_ADMIN.DEFAULT_DATE_FORMAT
+                  help: PLUGIN_ADMIN.DEFAULT_DATE_FORMAT_HELP
+                  placeholder: PLUGIN_ADMIN.DEFAULT_DATE_FORMAT_PLACEHOLDER
+                  data-options@: '\Grav\Common\Utils::dateFormats'
+                  validate:
+                    type: string
+
+                header.menu:
+                  type: text
+                  label: PLUGIN_ADMIN.MENU
+                  toggleable: true
+                  help: PLUGIN_ADMIN.MENU_HELP
+
+                header.slug:
+                  type: text
+                  label: PLUGIN_ADMIN.SLUG
+                  toggleable: true
+                  help: PLUGIN_ADMIN.SLUG_HELP
+                  validate:
+                    message: PLUGIN_ADMIN.SLUG_VALIDATE_MESSAGE
+                    rule: slug
+
+                header.redirect:
+                  type: text
+                  label: PLUGIN_ADMIN.REDIRECT
+                  toggleable: true
+                  help: PLUGIN_ADMIN.REDIRECT_HELP
+
+                header.process:
+                  type: checkboxes
+                  label: PLUGIN_ADMIN.PROCESS
+                  toggleable: true
+                  config-default@: system.pages.process
+                  default:
+                    markdown: true
+                    twig: false
+                  options:
+                    markdown: Markdown
+                    twig: Twig
+                  use: keys
+
+                header.twig_first:
+                  type: toggle
+                  toggleable: true
+                  label: PLUGIN_ADMIN.TWIG_FIRST
+                  help: PLUGIN_ADMIN.TWIG_FIRST_HELP
+                  highlight: 0
+                  options:
+                    1: PLUGIN_ADMIN.YES
+                    0: PLUGIN_ADMIN.NO
+                  validate:
+                    type: bool
+
+                header.never_cache_twig:
+                  type: toggle
+                  toggleable: true
+                  label: PLUGIN_ADMIN.NEVER_CACHE_TWIG
+                  help: PLUGIN_ADMIN.NEVER_CACHE_TWIG_HELP
+                  highlight: 0
+                  options:
+                    1: PLUGIN_ADMIN.YES
+                    0: PLUGIN_ADMIN.NO
+                  validate:
+                    type: bool
+
+                header.child_type:
+                  type: select
+                  toggleable: true
+                  label: PLUGIN_ADMIN.DEFAULT_CHILD_TYPE
+                  default: default
+                  placeholder: PLUGIN_ADMIN.USE_GLOBAL
+                  data-options@: '\Grav\Common\Page\Pages::types'
+
+                header.routable:
+                  type: toggle
+                  toggleable: true
+                  label: PLUGIN_ADMIN.ROUTABLE
+                  help: PLUGIN_ADMIN.ROUTABLE_HELP
+                  highlight: 1
+                  options:
+                    1: PLUGIN_ADMIN.ENABLED
+                    0: PLUGIN_ADMIN.DISABLED
+                  validate:
+                    type: bool
+
+                header.cache_enable:
+                  type: toggle
+                  toggleable: true
+                  label: PLUGIN_ADMIN.CACHING
+                  highlight: 1
+                  options:
+                    1: PLUGIN_ADMIN.ENABLED
+                    0: PLUGIN_ADMIN.DISABLED
+                  validate:
+                    type: bool
+
+                header.visible:
+                  type: toggle
+                  toggleable: true
+                  label: PLUGIN_ADMIN.VISIBLE
+                  help: PLUGIN_ADMIN.VISIBLE_HELP
+                  highlight: 1
+                  options:
+                    1: PLUGIN_ADMIN.ENABLED
+                    0: PLUGIN_ADMIN.DISABLED
+                  validate:
+                    type: bool
+
+                header.debugger:
+                  type: toggle
+                  toggleable: true
+                  label: PLUGIN_ADMIN.DEBUGGER
+                  help: PLUGIN_ADMIN.DEBUGGER_HELP
+                  highlight: 1
+                  options:
+                    1: PLUGIN_ADMIN.ENABLED
+                    0: PLUGIN_ADMIN.DISABLED
+                  validate:
+                    type: bool
+
+                header.template:
+                  type: text
+                  toggleable: true
+                  label: PLUGIN_ADMIN.DISPLAY_TEMPLATE
+
+                header.append_url_extension:
+                  type: text
+                  label: PLUGIN_ADMIN.APPEND_URL_EXT
+                  toggleable: true
+                  help: PLUGIN_ADMIN.APPEND_URL_EXT_HELP
+
+            routes_only:
+              type: section
+              title: PLUGIN_ADMIN.ROUTE_OVERRIDES
+              underline: true
+
+              fields:
+
+                header.routes.default:
+                  type: text
+                  toggleable: true
+                  label: PLUGIN_ADMIN.ROUTE_DEFAULT
+
+                header.routes.canonical:
+                  type: text
+                  toggleable: true
+                  label: PLUGIN_ADMIN.ROUTE_CANONICAL
+
+                header.routes.aliases:
+                  type: array
+                  toggleable: true
+                  value_only: true
+                  size: large
+                  label: PLUGIN_ADMIN.ROUTE_ALIASES
+
+
+            admin_only:
+              type: section
+              title: PLUGIN_ADMIN.ADMIN_SPECIFIC_OVERRIDES
+              underline: true
+
+              fields:
+
+                header.admin.children_display_order:
+                  type: select
+                  label: PLUGIN_ADMIN.ADMIN_CHILDREN_DISPLAY_ORDER
+                  help: PLUGIN_ADMIN.ADMIN_CHILDREN_DISPLAY_ORDER_HELP
+                  toggleable: true
+                  classes: fancy
+                  default: 'collection'
+                  options:
+                    'default': 'Ordered by Folder name (default)'
+                    'collection': 'Ordered by Collection definition'
+
+
+                header.order_by:
+                  type: hidden
+
+                header.order_manual:
+                  type: hidden
+                  validate:
+                    type: commalist
+
+                blueprint:
+                  type: blueprint

+ 52 - 0
system/blueprints/pages/external.yaml

@@ -0,0 +1,52 @@
+title: PLUGIN_ADMIN:EXTERNAL
+extends@:
+    type: default
+    context: blueprints://pages
+
+form:
+  validation: loose
+  fields:
+
+    tabs:
+      type: tabs
+      active: 1
+
+      fields:
+
+        content:
+          fields:
+
+            header.title:
+              type: text
+              autofocus: true
+              style: horizontal
+              label: PLUGIN_ADMIN.TITLE
+
+            content:
+              unset@: true
+
+            header.media_order:
+              unset@: true
+
+            header.external_url:
+                type: text
+                label: PLUGIN_ADMIN.EXTERNAL_URL
+                placeholder: https://getgrav.org
+                validate:
+                    required: true
+        options:
+          fields:
+
+            publishing:
+
+              fields:
+
+                header.date:
+                  unset@: true
+
+                header.metadata:
+                  unset@: true
+
+            taxonomies:
+              unset@: true
+

+ 38 - 0
system/blueprints/pages/modular.yaml

@@ -0,0 +1,38 @@
+title: PLUGIN_ADMIN.MODULAR
+extends@: default
+
+form:
+  fields:
+    tabs:
+      type: tabs
+      active: 1
+
+      fields:
+        content:
+          fields:
+
+            modular_title:
+              type: spacer
+              title: PLUGIN_ADMIN.MODULAR_SETUP
+
+            header.content.items:
+              type: text
+              label: PLUGIN_ADMIN.ITEMS
+              default: '@self.modular'
+              size: medium
+
+            header.content.order.by:
+              type: text
+              label: PLUGIN_ADMIN.ORDER_BY
+              placeholder: date
+              help:
+              size: small
+
+            header.content.order.dir:
+              type: text
+              label: PLUGIN_ADMIN.ORDER
+              help: '"desc" or "asc" are valid values'
+              placeholder: desc
+              size: small
+
+

+ 127 - 0
system/blueprints/user/account.yaml

@@ -0,0 +1,127 @@
+title: Account
+form:
+    validation: loose
+
+    fields:
+
+        info:
+            type: userinfo
+            size: large
+
+        avatar:
+            type: file
+            size: large
+            destination: 'user://accounts/avatars'
+            multiple: false
+            random_name: true
+
+        content:
+            type: section
+            title: PLUGIN_ADMIN.ACCOUNT
+            underline: true
+
+        username:
+            type: text
+            size: large
+            label: PLUGIN_ADMIN.USERNAME
+            disabled: true
+            readonly: true
+
+        email:
+            type: email
+            size: large
+            label: PLUGIN_ADMIN.EMAIL
+            validate:
+              type: email
+              message: PLUGIN_ADMIN.EMAIL_VALIDATION_MESSAGE
+              required: true
+
+        password:
+            type: password
+            size: large
+            label: PLUGIN_ADMIN.PASSWORD
+            autocomplete: new-password
+            validate:
+              required: false
+              message: PLUGIN_ADMIN.PASSWORD_VALIDATION_MESSAGE
+              config-pattern@: system.pwd_regex
+
+        fullname:
+            type: text
+            size: large
+            label: PLUGIN_ADMIN.FULL_NAME
+            validate:
+              required: true
+
+        title:
+            type: text
+            size: large
+            label: PLUGIN_ADMIN.TITLE
+
+        language:
+            type: select
+            label: PLUGIN_ADMIN.LANGUAGE
+            size: medium
+            classes: fancy
+            data-options@: '\Grav\Plugin\Admin\Admin::adminLanguages'
+            default: 'en'
+            help: PLUGIN_ADMIN.LANGUAGE_HELP
+
+        twofa_check:
+            type: conditional
+            condition: config.plugins.admin.twofa_enabled
+
+            fields:
+
+                twofa:
+                    title: PLUGIN_ADMIN.2FA_TITLE
+                    type: section
+                    underline: true
+
+                twofa_enabled:
+                    type: toggle
+                    label: PLUGIN_ADMIN.2FA_ENABLED
+                    classes: twofa-toggle
+                    highlight: 1
+                    default: 0
+                    options:
+                      1: PLUGIN_ADMIN.YES
+                      0: PLUGIN_ADMIN.NO
+                    validate:
+                      type: bool
+
+
+                twofa_secret:
+                    type: 2fa_secret
+                    outerclasses: 'twofa-secret'
+                    markdown: true
+                    label: PLUGIN_ADMIN.2FA_SECRET
+                    sublabel: PLUGIN_ADMIN.2FA_SECRET_HELP
+
+
+        security:
+            security@: admin.super
+            title: PLUGIN_ADMIN.ACCESS_LEVELS
+            type: section
+            underline: true
+
+            fields:
+                groups:
+                    security@: admin.super
+                    type: select
+                    multiple: true
+                    size: large
+                    label: PLUGIN_ADMIN.GROUPS
+                    data-options@: '\Grav\Common\User\Group::groupNames'
+                    classes: fancy
+                    help: PLUGIN_ADMIN.GROUPS_HELP
+                    validate:
+                        type: commalist
+
+                access:
+                    security@: admin.super
+                    type: permissions
+                    label: PLUGIN_ADMIN.PERMISSIONS
+                    ignore_empty: true
+                    validate:
+                        type: array

+ 18 - 0
system/blueprints/user/account_new.yaml

@@ -0,0 +1,18 @@
+title: PLUGIN_ADMIN.ADD_ACCOUNT
+
+form:
+  validation: loose
+  fields:
+
+    content:
+      type: section
+      title: PLUGIN_ADMIN.ADD_ACCOUNT
+
+    username:
+      type: text
+      label: PLUGIN_ADMIN.USERNAME
+      help: PLUGIN_ADMIN.USERNAME_HELP
+      unset-disabled@: true
+      unset-readonly@: true
+      validate:
+        required: true

+ 39 - 0
system/blueprints/user/accounts.yaml

@@ -0,0 +1,39 @@
+title: User Accounts
+description: User Accounts
+type: flex-objects
+
+extends@: 'user/account'
+
+config:
+  admin:
+    list:
+      fields:
+        username:
+          link: edit
+          search: true
+        email:
+          search: true
+        fullname:
+          search: true
+      options:
+        per_page: 20
+        order:
+          by: username
+          dir: asc
+
+    menu:
+      list:
+        route: '/accounts'
+        title: Accounts
+        icon: fa-users
+        authorize: ['admin.users', 'admin.accounts', 'admin.super']
+
+form:
+  fields:
+    username:
+      flex-disabled@: exists
+      disabled: false
+      flex-readonly@: exists
+      readonly: false
+      validate:
+        required: true

+ 37 - 0
system/blueprints/user/group.yaml

@@ -0,0 +1,37 @@
+title: Group
+form:
+    validation: loose
+
+    fields:
+        spacer:
+            type: spacer
+            text: '<br>'
+
+        groupname:
+            type: text
+            size: large
+            label: PLUGIN_ADMIN.NAME
+            disabled: true
+            readonly: true
+
+        readableName:
+            type: text
+            size: large
+            label: PLUGIN_ADMIN_PRO.READABLE_NAME
+
+        description:
+            type: text
+            size: large
+            label: PLUGIN_ADMIN.DESCRIPTION
+
+        icon:
+            type: text
+            size: small
+            label: PLUGIN_ADMIN_PRO.ICON
+
+        access:
+            type: permissions
+            label: PLUGIN_ADMIN.PERMISSIONS
+            ignore_empty: true
+            validate:
+                type: array

+ 16 - 0
system/blueprints/user/group_new.yaml

@@ -0,0 +1,16 @@
+title: PLUGIN_ADMIN_PRO.ADD_GROUP
+
+form:
+  validation: loose
+  fields:
+
+    content:
+      type: section
+      title: PLUGIN_ADMIN_PRO.ADD_GROUP
+
+    groupname:
+      type: text
+      label: PLUGIN_ADMIN_PRO.GROUP_NAME
+      help: PLUGIN_ADMIN_PRO.GROUP_NAME_HELP
+      validate:
+        required: true

+ 15 - 0
system/config/backups.yaml

@@ -0,0 +1,15 @@
+purge:
+    trigger: space
+    max_backups_count: 25
+    max_backups_space: 5
+    max_backups_time: 365
+
+profiles:
+  -
+    name: 'Default Site Backup'
+    root: '/'
+    schedule: false
+    schedule_at: '0 3 * * *'
+    exclude_paths: "/backup\r\n/cache\r\n/images\r\n/logs\r\n/tmp"
+    exclude_files: ".DS_Store\r\n.git\r\n.svn\r\n.hg\r\n.idea\r\n.vscode\r\nnode_modules"
+

+ 210 - 0
system/config/media.yaml

@@ -0,0 +1,210 @@
+types:
+  defaults:
+    type: file
+    thumb: media/thumb.png
+    mime: application/octet-stream
+    image:
+      filters:
+        default:
+          - enableProgressive
+
+  jpg:
+    type: image
+    thumb: media/thumb-jpg.png
+    mime: image/jpeg
+  jpe:
+    type: image
+    thumb: media/thumb-jpg.png
+    mime: image/jpeg
+  jpeg:
+    type: image
+    thumb: media/thumb-jpg.png
+    mime: image/jpeg
+  png:
+    type: image
+    thumb: media/thumb-png.png
+    mime: image/png
+  gif:
+    type: animated
+    thumb: media/thumb-gif.png
+    mime: image/gif
+  svg:
+    type: vector
+    thumb: media/thumb-svg.png
+    mime: image/svg+xml
+  mp4:
+    type: video
+    thumb: media/thumb-mp4.png
+    mime: video/mp4
+  mov:
+    type: video
+    thumb: media/thumb-mov.png
+    mime: video/quicktime
+  m4v:
+    type: video
+    thumb: media/thumb-m4v.png
+    mime: video/x-m4v
+  swf:
+    type: video
+    thumb: media/thumb-swf.png
+    mime: video/x-flv
+  flv:
+    type: video
+    thumb: media/thumb-flv.png
+    mime: video/x-flv
+  webm:
+    type: video
+    thumb: media/thumb-webm.png
+    mime: video/webm
+  ogv:
+    type: video
+    thumb: media/thumb-ogg.png
+    mime: video/ogg
+  mp3:
+    type: audio
+    thumb: media/thumb-mp3.png
+    mime: audio/mp3
+  ogg:
+    type: audio
+    thumb: media/thumb-ogg.png
+    mime: audio/ogg
+  wma:
+    type: audio
+    thumb: media/thumb-wma.png
+    mime: audio/wma
+  m4a:
+    type: audio
+    thumb: media/thumb-m4a.png
+    mime: audio/m4a
+  wav:
+    type: audio
+    thumb: media/thumb-wav.png
+    mime: audio/wav
+  aiff:
+    type: audio
+    thumb: media/thumb-aif.png
+    mime: audio/aiff
+  aif:
+    type: audio
+    thumb: media/thumb-aif.png
+    mime: audio/aif
+  txt:
+    type: file
+    thumb: media/thumb-txt.png
+    mime: text/plain
+  xml:
+    type: file
+    thumb: media/thumb-xml.png
+    mime: application/xml
+  doc:
+    type: file
+    thumb: media/thumb-doc.png
+    mime: application/msword
+  docx:
+    type: file
+    thumb: media/thumb-docx.png
+    mime: application/msword
+  xls:
+    type: file
+    thumb: media/thumb-xls.png
+    mime: application/vnd.ms-excel
+  xlsx:
+    type: file
+    thumb: media/thumb-xlsx.png
+    mime: application/vnd.ms-excel
+  ppt:
+    type: file
+    thumb: media/thumb-ppt.png
+    mime: application/vnd.ms-powerpoint
+  pptx:
+    type: file
+    thumb: media/thumb-pptx.png
+    mime: application/vnd.ms-powerpoint
+  pps:
+    type: file
+    thumb: media/thumb-pps.png
+    mime: application/vnd.ms-powerpoint
+  rtf:
+    type: file
+    thumb: media/thumb-rtf.png
+    mime: application/rtf
+  bmp:
+    type: file
+    thumb: media/thumb-bmp.png
+    mime: image/bmp
+  tiff:
+    type: file
+    thumb: media/thumb-tiff.png
+    mime: image/tiff
+  mpeg:
+    type: file
+    thumb: media/thumb-mpg.png
+    mime: video/mpeg
+  mpg:
+    type: file
+    thumb: media/thumb-mpg.png
+    mime: video/mpeg
+  mpe:
+    type: file
+    thumb: media/thumb-mpe.png
+    mime: video/mpeg
+  avi:
+    type: file
+    thumb: media/thumb-avi.png
+    mime: video/msvideo
+  wmv:
+    type: file
+    thumb: media/thumb-wmv.png
+    mime: video/x-ms-wmv
+  html:
+    type: file
+    thumb: media/thumb-html.png
+    mime: text/html
+  htm:
+    type: file
+    thumb: media/thumb-html.png
+    mime: text/html
+  ics:
+    type: iCal
+    thumb: media/thumb-ics.png
+    mime: text/calendar
+  pdf:
+    type: file
+    thumb: media/thumb-pdf.png
+    mime: application/pdf
+  ai:
+    type: file
+    thumb: media/thumb-ai.png
+    mime: image/ai
+  psd:
+    type: file
+    thumb: media/thumb-psd.png
+    mime: image/psd
+  zip:
+    type: file
+    thumb: media/thumb-zip.png
+    mime: application/zip
+  7z:
+    type: file
+    thumb: media/thumb-7z.png
+    mime: application/x-7z-compressed
+  gz:
+    type: file
+    thumb: media/thumb-gz.png
+    mime: application/gzip
+  tar:
+    type: file
+    thumb: media/thumb-tar.png
+    mime: application/x-tar
+  css:
+    type: file
+    thumb: media/thumb-css.png
+    mime: text/css
+  js:
+    type: file
+    thumb: media/thumb-js.png
+    mime: application/javascript
+  json:
+    type: file
+    thumb: media/thumb-json.png
+    mime: application/json

+ 38 - 0
system/config/security.yaml

@@ -0,0 +1,38 @@
+xss_whitelist: [admin.super] # Whitelist of user access that should 'skip' XSS checking
+xss_enabled:
+    on_events: true
+    invalid_protocols: true
+    moz_binding: true
+    html_inline_styles: true
+    dangerous_tags: true
+xss_invalid_protocols:
+    - javascript
+    - livescript
+    - vbscript
+    - mocha
+    - feed
+    - data
+xss_dangerous_tags:
+    - applet
+    - meta
+    - xml
+    - blink
+    - link
+    - style
+    - script
+    - embed
+    - object
+    - iframe
+    - frame
+    - frameset
+    - ilayer
+    - layer
+    - bgsound
+    - title
+    - base
+uploads_dangerous_extensions:
+    - php
+    - html
+    - htm
+    - js
+    - exe

+ 35 - 0
system/config/site.yaml

@@ -0,0 +1,35 @@
+title: Grav                                 # Name of the site
+default_lang: en                            # Default language for site (potentially used by theme)
+
+author:
+  name: John Appleseed                      # Default author name
+  email: 'john@example.com'                 # Default author email
+
+taxonomies: [category,tag]                  # Arbitrary list of taxonomy types
+
+metadata:
+  description: 'My Grav Site'               # Site description
+
+summary:
+  enabled: true                             # enable or disable summary of page
+  format: short                             # long = summary delimiter will be ignored; short = use the first occurrence of delimiter or size
+  size: 300                                 # Maximum length of summary (characters)
+  delimiter: ===                            # The summary delimiter
+
+redirects:
+#  '/redirect-test': '/'                    # Redirect test goes to home page
+#  '/old/(.*)': '/new/$1'                   # Would redirect /old/my-page to /new/my-page
+
+routes:
+#  '/something/else': '/blog/sample-3'      # Alias for /blog/sample-3
+#  '/new/(.*)': '/blog/$1'                  # Regex any /new/my-page URL to /blog/my-page Route
+
+blog:
+  route: '/blog'                            # Custom value added (accessible via system.blog.route)
+
+#menu:                                      # Menu Example
+#    - text: Source
+#      icon: github
+#      url: https://github.com/getgrav/grav
+#    - icon: twitter
+#      url: http://twitter.com/getgrav

+ 16 - 0
system/config/streams.yaml

@@ -0,0 +1,16 @@
+schemes:
+  image:
+    type: Stream
+    paths:
+      - user://images
+      - system://images
+
+  page:
+    type: ReadOnlyStream
+    paths:
+      - user://pages
+
+  account:
+    type: ReadOnlyStream
+    paths:
+      - user://accounts

+ 169 - 0
system/config/system.yaml

@@ -0,0 +1,169 @@
+absolute_urls: false                             # Absolute or relative URLs for `base_url`
+timezone: ''                                     # Valid values: http://php.net/manual/en/timezones.php
+default_locale:                                  # Default locale (defaults to system)
+param_sep: ':'                                   # Parameter separator, use ';' for Apache on windows
+wrapped_site: false                              # For themes/plugins to know if Grav is wrapped by another platform
+reverse_proxy_setup: false                       # Running in a reverse proxy scenario with different webserver ports than proxy
+force_ssl: false                                 # If enabled, Grav forces to be accessed via HTTPS (NOTE: Not an ideal solution)
+force_lowercase_urls: true                       # If you want to support mixed cased URLs set this to false
+custom_base_url: ''                              # Set the base_url manually, e.g. http://yoursite.com/yourpath
+username_regex: '^[a-z0-9_-]{3,16}$'             # Only lowercase chars, digits, dashes, underscores. 3 - 16 chars
+pwd_regex: '(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}' # At least one number, one uppercase and lowercase letter, and be at least 8+ chars
+intl_enabled: true                               # Special logic for PHP International Extension (mod_intl)
+
+languages:
+  supported: []                                  # List of languages supported. eg: [en, fr, de]
+  default_lang:                                  # Default is the first supported language. Must be one of the supported languages
+  include_default_lang: true                     # Include the default lang prefix in all URLs
+  pages_fallback_only: false                     # Only fallback to find page content through supported languages
+  translations: true                             # Enable translations by default
+  translations_fallback: true                    # Fallback through supported translations if active lang doesn't exist
+  session_store_active: false                    # Store active language in session
+  http_accept_language: false                    # Attempt to set the language based on http_accept_language header in the browser
+  override_locale: false                         # Override the default or system locale with language specific one
+
+home:
+  alias: '/home'                                 # Default path for home, ie /
+  hide_in_urls: false                            # Hide the home route in URLs
+
+pages:
+  theme: quark                                   # Default theme (defaults to "quark" theme)
+  order:
+    by: default                                  # Order pages by "default", "alpha" or "date"
+    dir: asc                                     # Default ordering direction, "asc" or "desc"
+  list:
+    count: 20                                    # Default item count per page
+  dateformat: