diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..7c65670a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+wp-content/
+database-backups/
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..7366a221
--- /dev/null
+++ b/README.md
@@ -0,0 +1,14 @@
+# soundlab-wordpress
+The Sound Lab is a studio for students to experiment with sound production equipment and techniques.
+
+This repo contains the WP site code as of 9 March 2021. The original repo is at https://github.com/artshumrc/soundlab-wordpress-archimedes, but the deployed prod was disconnected from version control.
+
+## TODO
+- [x] Get client to run with hot reload for local dev
+- [ ] Move everything into one repo - ~~maybe using git submodules?~~ submodules are not a great option as I'd need many deploy keys
+- [ ] Consolidate docker-compose
+- [ ] Include a MySQL database setup in docker compose and scrubbed DB dump so all you need to do is `composer install` and `docker compose up`
+- [ ] Also take care of the Mixtape Maker app
+- [ ] Upgrade Node as far as possible for both client and API
+- [ ] Figure out deploy
+- [ ] Use Cloudfront for frontend and Mixtape Maker? Maybe a future enhancement
diff --git a/bedrock/.env.example b/bedrock/.env.example
new file mode 100644
index 00000000..7de18aa1
--- /dev/null
+++ b/bedrock/.env.example
@@ -0,0 +1,28 @@
+DB_NAME='database_name'
+DB_USER='database_user'
+DB_PASSWORD='database_password'
+
+# Optionally, you can use a data source name (DSN)
+# When using a DSN, you can remove the DB_NAME, DB_USER, DB_PASSWORD, and DB_HOST variables
+# DATABASE_URL='mysql://database_user:database_password@database_host:database_port/database_name'
+
+# Optional database variables
+# DB_HOST='localhost'
+# DB_PREFIX='wp_'
+
+WP_ENV='development'
+WP_HOME='http://example.com'
+WP_SITEURL="${WP_HOME}/wp"
+
+# Specify optional debug.log path
+# WP_DEBUG_LOG='/path/to/debug.log'
+
+# Generate your keys here: https://roots.io/salts.html
+AUTH_KEY='generateme'
+SECURE_AUTH_KEY='generateme'
+LOGGED_IN_KEY='generateme'
+NONCE_KEY='generateme'
+AUTH_SALT='generateme'
+SECURE_AUTH_SALT='generateme'
+LOGGED_IN_SALT='generateme'
+NONCE_SALT='generateme'
diff --git a/bedrock/.gitignore b/bedrock/.gitignore
new file mode 100644
index 00000000..2dffa3c4
--- /dev/null
+++ b/bedrock/.gitignore
@@ -0,0 +1,29 @@
+# Application
+web/app/plugins/*
+!web/app/plugins/soundlab
+!web/app/plugins/acf-repeater
+!web/app/plugins/.gitkeep
+web/app/mu-plugins/*/
+web/app/themes/twentytwentytwo/
+web/app/upgrade
+web/app/uploads/*
+!web/app/uploads/.gitkeep
+web/app/cache/*
+
+# WordPress
+web/wp
+web/.htaccess
+
+# Logs
+*.log
+
+# Dotenv
+.env
+.env.*
+!.env.example
+
+# Composer
+/vendor
+
+# WP-CLI
+wp-cli.local.yml
diff --git a/bedrock/CHANGELOG.md b/bedrock/CHANGELOG.md
new file mode 100644
index 00000000..0d1a9bdb
--- /dev/null
+++ b/bedrock/CHANGELOG.md
@@ -0,0 +1,494 @@
+### 1.20.2: 2022-08-31
+* Bump roots/wordpress from 6.0.1 to 6.0.2 ([#648](https://github.com/roots/bedrock/pull/648))
+* Bump composer/installers from 2.1.1 to 2.2.0 ([#646](https://github.com/roots/bedrock/pull/646))
+
+### 1.20.1: 2022-07-19
+* Bump roots/wordpress from 6.0.0 to 6.0.1 ([#644](https://github.com/roots/bedrock/pull/644))
+* doc: instructions for installing "source" packages ([#641](https://github.com/roots/bedrock/pull/641))
+* Bump squizlabs/php_codesniffer from 3.6.2 to 3.7.1 ([#643](https://github.com/roots/bedrock/pull/643))
+* Bump composer/installers from 2.1.0 to 2.1.1 ([#635](https://github.com/roots/bedrock/pull/635))
+
+### 1.20.0: 2022-05-24
+* Update to WordPress 6.0, add Twenty Twenty-Two theme as dependency ([#639](https://github.com/roots/bedrock/pull/639))
+
+### 1.19.3: 2022-04-06
+* Bump roots/wordpress to 5.9.3 ([#633](https://github.com/roots/bedrock/pull/633))
+* Bump composer/installers from 2.0.1 to 2.1.0 ([#632](https://github.com/roots/bedrock/pull/632))
+
+### 1.19.2: 2022-03-11
+* Bump roots/wordpress to 5.9.2 ([#631](https://github.com/roots/bedrock/pull/631))
+
+### 1.19.1: 2022-02-23
+* Bump roots/wordpress to 5.9.1 ([#626](https://github.com/roots/bedrock/pull/630))
+
+### 1.19.0: 2022-01-25
+* Bump roots/wordpress to 5.9 ([#626](https://github.com/roots/bedrock/pull/626))
+* Bump squizlabs/php_codesniffer from 3.6.1 to 3.6.2 ([#623](https://github.com/roots/bedrock/pull/623))
+* Bump vlucas/phpdotenv from 5.3.1 to 5.4.1 ([#622](https://github.com/roots/bedrock/pull/622))
+* Bump composer/installers from 1.12.0 to 2.0.1 ([#621](https://github.com/roots/bedrock/pull/621))
+
+### 1.18.1: 2022-01-07
+* Bump roots/wordpress from 5.8.2 to 5.8.3 ([#625](https://github.com/roots/bedrock/pull/625))
+* chore(deps): allow required composer plugins ([#624](https://github.com/roots/bedrock/pull/624))
+
+### 1.18.0: 2021-12-06
+* Bump requirements to PHP 7.4 ([#619](https://github.com/roots/bedrock/pull/619))
+
+### 1.17.1: 2021-11-16
+* Bump roots/wordpress from 5.8.1 to 5.8.2 ([#615](https://github.com/roots/bedrock/pull/615))
+
+### 1.17.0: 2021-11-03
+* Bump roots/wp-password-bcrypt from 1.0.0 to 1.1.0 ([#613](https://github.com/roots/bedrock/pull/613))
+* CI: Check Composer lock file is up to date ([#612](https://github.com/roots/bedrock/pull/612))
+* Update composer.lock file ([#611](https://github.com/roots/bedrock/pull/611))
+
+### 1.16.2: 2021-10-21
+* Update `roave/security-advisories` default branch ([#609](https://github.com/roots/bedrock/pull/609))
+* Bump composer/installers from 1.11.0 to 1.12.0 ([#606](https://github.com/roots/bedrock/pull/606))
+* Bump roots/wordpress from 5.8 to 5.8.1 ([#605](https://github.com/roots/bedrock/pull/605))
+
+### 1.16.1: 2021-07-30
+* Check if `.env.local` exists before loading it ([#603](https://github.com/roots/bedrock/pull/603))
+
+### 1.16.0: 2021-07-22
+* Bump roots/wordpress from 5.7.2 to 5.8 ([#600](https://github.com/roots/bedrock/pull/600))
+* Default to `WP_DEBUG_LOG=true` in development ([#505](https://github.com/roots/bedrock/pull/505))
+* Support `.env.local` config override ([#594](https://github.com/roots/bedrock/pull/594))
+* Use Bedrock disallow indexing package ([#521](https://github.com/roots/bedrock/pull/521))
+
+### 1.15.4: 2021-05-19
+* Bump roots/wordpress from 5.7 to 5.7.2 ([#593](https://github.com/roots/bedrock/pull/593))
+* Bump composer/installers from 1.10.0 to 1.11.0 ([#592](https://github.com/roots/bedrock/pull/592))
+* chore(deps-dev): Bump squizlabs/php_codesniffer from 3.5.8 to 3.6.0 ([#588](https://github.com/roots/bedrock/pull/588))
+
+### 1.15.3: 2021-03-12
+* chore(deps): Bump roots/wordpress from 5.6.2 to 5.7 ([#578](https://github.com/roots/bedrock/pull/578))
+
+### 1.15.2: 2021-02-11
+
+* chore(deps): Bump roots/wordpress from 5.5.3 to 5.6.1 ([#573](https://github.com/roots/bedrock/pull/573))
+* chore(deps): Bump composer/installers from 1.9.0 to 1.10.0 ([#569](https://github.com/roots/bedrock/pull/569))
+* chore(deps): Bump vlucas/phpdotenv from 5.2.0 to 5.3.0 ([#570 ](https://github.com/roots/bedrock/pull/570))
+* Add WP_POST_REVISIONS as an option ([#572](https://github.com/roots/bedrock/pull/572))
+
+### 1.15.1: 2020-12-08
+
+* chore(deps): Bump roots/wordpress from 5.5.3 to 5.6 ([#567](https://github.com/roots/bedrock/pull/567))
+
+### 1.15.0: 2020-12-04
+
+* chore(deps): Bump roots/bedrock-autoloader from 1.0.3 to 1.0.4 ([#564](https://github.com/roots/bedrock/pull/564))
+* Upgrade to vlucas/phpdotenv:5.2 ([#563](https://github.com/roots/bedrock/pull/563))
+* chore(deps-dev): Bump squizlabs/php_codesniffer from 3.5.6 to 3.5.8 ([#550](https://github.com/roots/bedrock/pull/550))
+
+### 1.14.4: 2020-11-13
+
+* chore(deps): Bump roots/wordpress from 5.5.1 to 5.5.3 ([#556](https://github.com/roots/bedrock/pull/556))
+
+### 1.14.3: 2020-10-28
+
+* Bump `roots/wordpress-core-installer` for Composer 2 compatibility([#552](https://github.com/roots/bedrock/pull/552))
+
+### 1.14.2: 2020-09-04
+
+* chore(deps): Bump roots/wordpress from 5.5 to 5.5.1 ([#545](https://github.com/roots/bedrock/pull/545))
+
+### 1.14.1: 2020-08-11
+
+* chore(deps): Bump roots/wordpress from 5.4.1 to 5.5 ([#542](https://github.com/roots/bedrock/pull/542))
+* chore(deps-dev): Bump squizlabs/php_codesniffer from 3.5.5 to 3.5.6 ([#541](https://github.com/roots/bedrock/pull/541))
+* chore(deps): Bump vlucas/phpdotenv from 4.1.5 to 4.1.8 ([#536](https://github.com/roots/bedrock/pull/536))
+* chore(deps): Bump oscarotero/env from 2.0.0 to 2.1.0 ([#531](https://github.com/roots/bedrock/pull/531))
+* CircleCI: Use offical CircleCI PHP orb and next-gen docker images ([#520](https://github.com/roots/bedrock/pull/520))
+
+### 1.14.0: 2020-08-11
+
+* Upgrade `oscarotero/env` to `^2.0` ([#530](https://github.com/roots/bedrock/pull/530))
+* chore(deps): Bump vlucas/phpdotenv from 4.1.4 to 4.1.5 ([#518](https://github.com/roots/bedrock/pull/518))
+* Use Bedrock Autoloader package ([#519](https://github.com/roots/bedrock/pull/519))
+
+### 1.13.5: 2020-05-11
+
+* chore(deps): Bump roots/wordpress from 5.4 to 5.4.1 ([#517](https://github.com/roots/bedrock/pull/517))
+
+### 1.13.4: 2020-04-24
+
+* fix(mu-plugins): Bump bedrock-autoloader version ([#512](https://github.com/roots/bedrock/pull/512))
+* fix(mu-plugins): A more sane fix for #510 ([#512](https://github.com/roots/bedrock/pull/512))
+
+### 1.13.3: 2020-04-24
+
+* enhance(ci): Add CircleCI workflow for PHP 7.4 ([#510](https://github.com/roots/bedrock/pull/511))
+* fix(mu-plugins): Fix invalid array access notice on 7.4 ([#510](https://github.com/roots/bedrock/pull/510))
+* enhance(composer): Add `only` option to wpackagist.org repository ([#508](https://github.com/roots/bedrock/pull/508))
+
+### 1.13.2: 2020-04-01
+
+* chore(deps): Bump WordPress to 5.4 ([#502](https://github.com/roots/bedrock/pull/502))
+* chore(deps): Bump vlucas/phpdotenv ([#501](https://github.com/roots/bedrock/pull/502))
+* enhance(config): Add `WP_DEBUG_LOG` ([#499](https://github.com/roots/bedrock/pull/499))
+
+### 1.13.1: 2020-02-19
+
+* fix(env): Makes .env.example compatible with breaking changes from vlucas/phpdotenv 4.x ([#493](https://github.com/roots/bedrock/pull/493))
+
+### 1.13.0: 2020-02-17
+
+* Update to WordPress 5.3.2 ([#489](https://github.com/roots/bedrock/pull/489))
+* chore(deps): Bump vlucas/phpdotenv from 4.0.1 to 4.1.0 ([#487](https://github.com/roots/bedrock/pull/487))
+* chore(deps): Bump vlucas/phpdotenv from 3.6.0 to 4.0.1 ([#485](https://github.com/roots/bedrock/pull/485))
+* chore(deps): Bump composer/installers from 1.7.0 to 1.8.0 ([#492](https://github.com/roots/bedrock/pull/492))
+* chore(deps-dev): Bump squizlabs/php_codesniffer from 3.4.2 to 3.5.4 ([#490](https://github.com/roots/bedrock/pull/490))
+* Clean up docblocks & commenting ([#459](https://github.com/roots/bedrock/pull/459))
+
+### 1.12.8: 2019-09-05
+
+* Update to WordPress 5.2.3 ([#466](https://github.com/roots/bedrock/pull/466))
+* Remove `phpcs.xml` from `.gitattributes` ([#464](https://github.com/roots/bedrock/pull/464))
+* `ini_set()` fixes ([#463](https://github.com/roots/bedrock/pull/463))
+* Editorconfig updates ([#457](https://github.com/roots/bedrock/pull/457))
+* Bump `composer/installers` ([#462](https://github.com/roots/bedrock/pull/462))
+* Better default composer options ([#456](https://github.com/roots/bedrock/pull/456))
+* Ignore `.log` files ([#440](https://github.com/roots/bedrock/pull/440))
+* Change to CircleCI ([82945d8](https://github.com/roots/bedrock/commit/82945d803d10cb072b7e786e0a81094ccb2d067b), [#460](https://github.com/roots/bedrock/pull/460))
+
+### 1.12.7: 2019-06-19
+
+* Update to WordPress 5.2.2 ([#444](https://github.com/roots/bedrock/pull/444))
+* Bump `oscarotero/env` ([#443](https://github.com/roots/bedrock/pull/443))
+* Bump `vlucas/phpdotenv` ([#442](https://github.com/roots/bedrock/pull/442))
+* Bump `squizlabs/php_codesniffer` ([#441](https://github.com/roots/bedrock/pull/441))
+* Remove unnecessary static variables ([#437](https://github.com/roots/bedrock/pull/437))
+
+### 1.12.6: 2019-05-21
+
+* Update to WordPress 5.2.1 ([#436](https://github.com/roots/bedrock/pull/436))
+
+### 1.12.5: 2019-05-14
+
+* Disable WordPress' built-in fatal error handler on development ([#432](https://github.com/roots/bedrock/pull/434))
+
+### 1.12.4: 2019-05-07
+
+* Update to WordPress 5.2 ([#432](https://github.com/roots/bedrock/pull/432))
+* Configure WP-CLI `wp server` webroot ([#427](https://github.com/roots/bedrock/pull/427))
+* Fix issue with `bedrock_autoloader` option ([#386](https://github.com/roots/bedrock/pull/386))
+
+### 1.12.3: 2019-03-13
+
+* Update to WordPress 5.1.1 ([#426](https://github.com/roots/bedrock/pull/426))
+
+### 1.12.2: 2019-02-21
+
+* Update to WordPress 5.1 ([#420](https://github.com/roots/bedrock/pull/420))
+
+### 1.12.1: 2019-02-14
+
+* Update `vlucas/phpdotenv` ([#417](https://github.com/roots/bedrock/pull/417))
+* Make DSN implementation more uniform ([#415](https://github.com/roots/bedrock/pull/415))
+
+### 1.12.0: 2019-02-07
+
+* Support database DSN ([#414](https://github.com/roots/bedrock/pull/414))
+* Detect HTTPS if WordPress is behind a reverse proxy ([#413](https://github.com/roots/bedrock/pull/413))
+* Update `vlucas/phpdotenv` to `^3` ([#412](https://github.com/roots/bedrock/pull/412))
+
+### 1.11.1: 2019-01-09
+
+* Update to WordPress 5.0.3 ([#408](https://github.com/roots/bedrock/pull/408))
+
+### 1.11.0: 2018-12-19
+
+* Bump PHP requirement to >= 7.1 ([#405](https://github.com/roots/bedrock/pull/405))
+
+### 1.10.2: 2018-12-19
+
+* Update to WordPress 5.0.2 ([#406](https://github.com/roots/bedrock/pull/406))
+
+### 1.10.1: 2018-12-12
+
+* Update to WordPress 5.0.1 ([#403](https://github.com/roots/bedrock/pull/403))
+
+### 1.10.0: 2018-12-09
+
+* Update to WordPress 5.0, switch from `johnpbloch/wordpress` to `roots/wordpress` package ([#395](https://github.com/roots/bedrock/pull/395))
+
+### 1.9.0: 2018-09-17
+
+* Fix error display in development environments ([c457082](https://github.com/roots/bedrock/commit/c457082cf4b153400d3e34f4f68a30eea4cc7c38))
+* --prefer-dist on roave/security-advisories ([#381](https://github.com/roots/bedrock/pull/381))
+* New Bedrock Configuration Model ([#380](https://github.com/roots/bedrock/pull/380))
+* Remove vendor/.gitkeep ([#379](https://github.com/roots/bedrock/pull/379))
+* Composer 1.7.0 lockfile ([#378](https://github.com/roots/bedrock/pull/378))
+* Adds roave/security-advisories to composer dev deps ([#376](https://github.com/roots/bedrock/pull/376))
+
+### 1.8.12: 2018-08-03
+
+* Update to WordPress 4.9.8
+
+### 1.8.11: 2018-07-09
+
+* Update to WordPress 4.9.7
+
+### 1.8.10: 2018-05-18
+
+* Update to WordPress 4.9.6
+
+### 1.8.9: 2018-04-04
+
+* Update to WordPress 4.9.5
+
+### 1.8.8: 2018-02-06
+
+* Update to WordPress 4.9.4
+
+### 1.8.7: 2018-02-05
+
+* Update to WordPress 4.9.3
+
+### 1.8.6: 2018-01-16
+
+* Update to WordPress 4.9.2
+
+### 1.8.5: 2017-11-29
+
+* Update to WordPress 4.9.1
+
+### 1.8.4: 2017-11-16
+
+* Update to WordPress 4.9.0
+
+### 1.8.3: 2017-10-31
+
+* Update to WordPress 4.8.3
+
+### 1.8.2: 2017-09-19
+
+* Update to WordPress 4.8.2
+
+### 1.8.1: 2017-08-02
+
+* Update to WordPress 4.8.1
+
+### 1.8.0: 2017-06-08
+
+* Update to WordPress 4.8.0
+
+### 1.7.9: 2017-05-16
+
+* Update to WordPress 4.7.5
+
+### 1.7.8: 2017-05-03
+
+* Update `johnpbloch/wordpress` to 4.7.4.1 (see https://github.com/johnpbloch/wordpress/issues/32)
+
+### 1.7.7: 2017-04-20
+
+* Update to WordPress 4.7.4
+
+### 1.7.6: 2017-03-06
+
+* Update to WordPress 4.7.3
+
+### 1.7.5: 2017-01-26
+
+* Update to WordPress 4.7.2
+
+### 1.7.4: 2017-01-11
+
+* Update to WordPress 4.7.1
+* Add Optional variables to `.env.example`
+* Remove unnecessary gitignore rules ([#286](https://github.com/roots/bedrock/pull/286))
+
+### 1.7.3: 2016-12-06
+
+* Update to WordPress 4.7
+* Default `WP_ENV` to `production` instead of `development` ([#277](https://github.com/roots/bedrock/pull/277))
+
+### 1.7.2: 2016-09-07
+
+* Update to WordPress 4.6.1
+
+### 1.7.1: 2016-08-16
+
+* Update to WordPress 4.6
+
+### 1.7.0: 2016-07-10
+
+* Bump PHP requirement to >= 5.6 (5.5 is no longer supported)
+
+### 1.6.4: 2016-06-21
+
+* Update to WordPress 4.5.3
+
+### 1.6.3: 2016-05-06
+
+* Update to WordPress 4.5.2
+
+### 1.6.2: 2016-04-26
+
+* Update to WordPress 4.5.1
+
+### 1.6.1: 2016-04-12
+
+* Update to WordPress 4.5
+* Update coding standards (PSR-2) ([#244](https://github.com/roots/bedrock/pull/244))
+
+### 1.6.0: 2016-03-03
+
+* Add wp-password-bcrypt for more secure passwords ([#243](https://github.com/roots/bedrock/pull/243))
+
+### 1.5.4: 2016-02-29
+
+* Use HTTPS for wpackagist.org
+
+### 1.5.3: 2016-02-03
+
+* Update to WordPress 4.4.2
+
+### 1.5.2: 2016-02-01
+
+* Bump `composer/installers` dependency to 1.0.23 to fix deprecation notice
+
+### 1.5.1: 2016-01-27
+
+* Use [oscarotero/env](https://github.com/oscarotero/env) instead of `getenv` ([#229](https://github.com/roots/bedrock/pull/233))
+
+### 1.5.0: 2016-01-17
+
+* Fix `DISABLE_WP_CRON` setting via ENV variable ([#229](https://github.com/roots/bedrock/pull/229))
+* Set default `DB_CHARSET` to `utf8mb4`
+
+### 1.4.7: 2016-01-07
+
+* Update to WordPress 4.4.1
+
+### 1.4.6: 2015-12-09
+
+* Update to WordPress 4.4
+
+### 1.4.5: 2015-09-16
+
+* Update to WordPress 4.3.1
+* Bump minimum required PHP version to 5.5 ([#201](https://github.com/roots/bedrock/pull/201))
+
+### 1.4.4: 2015-08-18
+
+* Update to WordPress 4.3
+
+### 1.4.3: 2015-08-04
+
+* Update to WordPress 4.2.4
+
+### 1.4.2: 2015-07-24
+
+* Update to WordPress 4.2.3
+
+### 1.4.1: 2015-06-30
+
+* Dotenv 2.0.1 update
+
+### 1.4.0: 2015-06-07
+
+* Removed .env generation script
+
+### 1.3.7: 2015-05-07
+
+* Update to WordPress 4.2.2
+
+### 1.3.6: 2015-04-27
+
+* Update to WordPress 4.2.1
+
+### 1.3.5: 2015-04-23
+
+* Update to WordPress 4.2
+* Update to WordPress 4.1.2
+* Don't register theme directory if `WP_DEFAULT_THEME` is defined
+* Move Capistrano configs to https://github.com/roots/bedrock-capistrano
+
+### 1.3.4: 2015-02-18
+
+* WordPress 4.1.1 fix
+
+### 1.3.3: 2015-02-18
+
+* Update to WordPress 4.1.1
+* mu-plugins autoloader Multisite fix
+* Coding standards update + TravisCI integration
+
+### 1.3.2: 2014-12-18
+
+* Update to WordPress 4.1
+* Remove WPLANG constant
+
+### 1.3.1: 2014-11-28
+
+* Add Capistrano task to fix/update WP theme paths after deploys
+
+### 1.3.0: 2014-11-20
+
+* Update to WordPress 4.0.1
+* Use johnpbloch/wordpress package instead of custom repository
+* Update default deploy.rb
+* Require PHP >= 5.4 in composer.json
+* Better PSR-1 adherence
+* Update phpdotenv dependency to 1.0.9
+* Fix Composer installer path plugin order
+* Add bedrock-autoloader mu-plugin
+
+### 1.2.7: 2014-09-04
+
+* Update to WordPress 4.0
+
+### 1.2.6: 2014-08-06
+
+* Update to WordPress 3.9.2
+* Minor deploy fix
+* Doc updates
+
+### 1.2.5: 2014-07-16
+
+* Update to WordPress 3.9.1
+* Doc updates
+* Add `DB_PREFIX` constant
+* Update Gem versions
+* Disallow indexing in non-production environments
+
+### 1.2.4: 2014-04-17
+
+* Fixes issue with 3.9 update (`composer.lock` wasn't updated)
+
+### 1.2.3: 2014-04-16
+
+* Update to WordPress 3.9
+
+### 1.2.2: 2014-04-14
+
+* Update to WordPress 3.8.3
+* Only run `Dotenv::load` if `.env` file exists
+
+### 1.2.1: 2014-04-08
+
+* Update to WordPress 3.8.2
+
+### 1.2.0: 2014-04-07
+
+* WP package now has `wordpress` vendor name: `wordpress/wordpress`
+* Remove wp-cli and add `wp-cli.yml` config
+
+### 1.1.1: 2014-03-11
+
+* Update phpdotenv to 1.0.6
+* Update wp-cli to v0.14.1
+* Update README to refence new WordPress Packagist namespaces
+* Fix uploads path in `linked_dirs` for Capistrano deploys
+
+### 1.1.0: 2014-03-01
+
+* Update to Capistrano 3.1.0: `deploy:restart` is no longer run by default
+* Better webroot structure: introduces the `/web` directory as the document/web root for web server vhosts
+
+### 1.0.0: 2013-12-18
+
+* Initial release
diff --git a/bedrock/LICENSE.md b/bedrock/LICENSE.md
new file mode 100644
index 00000000..1b5cd27d
--- /dev/null
+++ b/bedrock/LICENSE.md
@@ -0,0 +1,19 @@
+Copyright (c) Roots Software Foundation LLC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/bedrock/README.md b/bedrock/README.md
new file mode 100644
index 00000000..ccbae162
--- /dev/null
+++ b/bedrock/README.md
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A modern WordPress stack
+
+
+
+ Website
Documentation
Releases
Support
+
+
+## Sponsors
+
+**Bedrock** is an open source project and completely free to use.
+
+However, the amount of effort needed to maintain and develop new features and products within the Roots ecosystem is not sustainable without proper financial backing. If you have the capability, please consider [sponsoring Roots](https://github.com/sponsors/roots).
+
+
+
+
+
+## Overview
+
+Bedrock is a modern WordPress stack that helps you get started with the best development tools and project structure.
+
+Much of the philosophy behind Bedrock is inspired by the [Twelve-Factor App](http://12factor.net/) methodology including the [WordPress specific version](https://roots.io/twelve-factor-wordpress/).
+
+## Features
+
+- Better folder structure
+- Dependency management with [Composer](https://getcomposer.org)
+- Easy WordPress configuration with environment specific files
+- Environment variables with [Dotenv](https://github.com/vlucas/phpdotenv)
+- Autoloader for mu-plugins (use regular plugins as mu-plugins)
+- Enhanced security (separated web root and secure passwords with [wp-password-bcrypt](https://github.com/roots/wp-password-bcrypt))
+
+## Requirements
+
+- PHP >= 7.4
+- Composer - [Install](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx)
+
+## Installation
+
+1. Create a new project:
+ ```sh
+ $ composer create-project roots/bedrock
+ ```
+ By default, this installs the `dist` version of all dependent packages. To install the `source` versions instead, update `composer.json` as follows:
+ ```json
+ "preferred-install": {
+ "roots/wordpress-no-content": "dist",
+ "*": "source"
+ },
+ ```
+2. Update environment variables in the `.env` file. Wrap values that may contain non-alphanumeric characters with quotes, or they may be incorrectly parsed.
+
+- Database variables
+ - `DB_NAME` - Database name
+ - `DB_USER` - Database user
+ - `DB_PASSWORD` - Database password
+ - `DB_HOST` - Database host
+ - Optionally, you can define `DATABASE_URL` for using a DSN instead of using the variables above (e.g. `mysql://user:password@127.0.0.1:3306/db_name`)
+- `WP_ENV` - Set to environment (`development`, `staging`, `production`)
+- `WP_HOME` - Full URL to WordPress home (https://example.com)
+- `WP_SITEURL` - Full URL to WordPress including subdirectory (https://example.com/wp)
+- `AUTH_KEY`, `SECURE_AUTH_KEY`, `LOGGED_IN_KEY`, `NONCE_KEY`, `AUTH_SALT`, `SECURE_AUTH_SALT`, `LOGGED_IN_SALT`, `NONCE_SALT`
+ - Generate with [wp-cli-dotenv-command](https://github.com/aaemnnosttv/wp-cli-dotenv-command)
+ - Generate with [our WordPress salts generator](https://roots.io/salts.html)
+
+3. Add theme(s) in `web/app/themes/` as you would for a normal WordPress site
+4. Set the document root on your webserver to Bedrock's `web` folder: `/path/to/site/web/`
+5. Access WordPress admin at `https://example.com/wp/wp-admin/`
+
+## Community
+
+Keep track of development and community news.
+
+- Join us on Discord by [sponsoring us on GitHub](https://github.com/sponsors/roots)
+- Participate on the [Roots Discourse](https://discourse.roots.io/)
+- Follow [@rootswp on Twitter](https://twitter.com/rootswp)
+- Read and subscribe to the [Roots Blog](https://roots.io/blog/)
+- Subscribe to the [Roots Newsletter](https://roots.io/subscribe/)
diff --git a/bedrock/composer.json b/bedrock/composer.json
new file mode 100644
index 00000000..c838cc72
--- /dev/null
+++ b/bedrock/composer.json
@@ -0,0 +1,80 @@
+{
+ "name": "roots/bedrock",
+ "type": "project",
+ "license": "MIT",
+ "description": "WordPress boilerplate with Composer, easier configuration, and an improved folder structure",
+ "homepage": "https://roots.io/bedrock/",
+ "authors": [
+ {
+ "name": "Scott Walkinshaw",
+ "email": "scott.walkinshaw@gmail.com",
+ "homepage": "https://github.com/swalkinshaw"
+ },
+ {
+ "name": "Ben Word",
+ "email": "ben@benword.com",
+ "homepage": "https://github.com/retlehs"
+ }
+ ],
+ "keywords": [
+ "bedrock", "composer", "roots", "wordpress", "wp", "wp-config"
+ ],
+ "support": {
+ "issues": "https://github.com/roots/bedrock/issues",
+ "forum": "https://discourse.roots.io/category/bedrock"
+ },
+ "repositories": [
+ {
+ "type": "composer",
+ "url": "https://wpackagist.org",
+ "only": ["wpackagist-plugin/*", "wpackagist-theme/*"]
+ }
+ ],
+ "require": {
+ "php": ">=7.4",
+ "composer/installers": "^2.2",
+ "vlucas/phpdotenv": "^5.4",
+ "oscarotero/env": "^2.1",
+ "roots/bedrock-autoloader": "^1.0",
+ "roots/bedrock-disallow-indexing": "^2.0",
+ "roots/wordpress": "6.0.2",
+ "roots/wp-config": "1.0.0",
+ "roots/wp-password-bcrypt": "1.1.0",
+ "wpackagist-theme/twentytwentytwo": "^1.2",
+ "wpackagist-plugin/advanced-custom-fields": "4.4.12",
+ "wpackagist-plugin/acf-field-date-time-picker": "2.1.5",
+ "wpackagist-plugin/jwt-authentication-for-wp-rest-api": "1.2.5",
+ "wpackagist-plugin/user-role-editor": "4.36.1",
+ "wpackagist-plugin/wordpress-importer": "0.6.3"
+ },
+ "require-dev": {
+ "squizlabs/php_codesniffer": "^3.7.1",
+ "roave/security-advisories": "dev-latest"
+ },
+ "config": {
+ "optimize-autoloader": true,
+ "preferred-install": "dist",
+ "allow-plugins": {
+ "composer/installers": true,
+ "roots/wordpress-core-installer": true
+ }
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "extra": {
+ "installer-paths": {
+ "web/app/mu-plugins/{$name}/": ["type:wordpress-muplugin"],
+ "web/app/plugins/{$name}/": ["type:wordpress-plugin"],
+ "web/app/themes/{$name}/": ["type:wordpress-theme"]
+ },
+ "wordpress-install-dir": "web/wp"
+ },
+ "scripts": {
+ "post-root-package-install": [
+ "php -r \"copy('.env.example', '.env');\""
+ ],
+ "test": [
+ "phpcs"
+ ]
+ }
+}
diff --git a/bedrock/composer.lock b/bedrock/composer.lock
new file mode 100644
index 00000000..b2cc5a56
--- /dev/null
+++ b/bedrock/composer.lock
@@ -0,0 +1,1687 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "aa091a3cb1c4896bd10905800977931e",
+ "packages": [
+ {
+ "name": "composer/installers",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/installers.git",
+ "reference": "c29dc4b93137acb82734f672c37e029dfbd95b35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/installers/zipball/c29dc4b93137acb82734f672c37e029dfbd95b35",
+ "reference": "c29dc4b93137acb82734f672c37e029dfbd95b35",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "composer/composer": "1.6.* || ^2.0",
+ "composer/semver": "^1 || ^3",
+ "phpstan/phpstan": "^0.12.55",
+ "phpstan/phpstan-phpunit": "^0.12.16",
+ "symfony/phpunit-bridge": "^5.3",
+ "symfony/process": "^5"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Composer\\Installers\\Plugin",
+ "branch-alias": {
+ "dev-main": "2.x-dev"
+ },
+ "plugin-modifies-install-path": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Installers\\": "src/Composer/Installers"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kyle Robinson Young",
+ "email": "kyle@dontkry.com",
+ "homepage": "https://github.com/shama"
+ }
+ ],
+ "description": "A multi-framework Composer library installer",
+ "homepage": "https://composer.github.io/installers/",
+ "keywords": [
+ "Dolibarr",
+ "Eliasis",
+ "Hurad",
+ "ImageCMS",
+ "Kanboard",
+ "Lan Management System",
+ "MODX Evo",
+ "MantisBT",
+ "Mautic",
+ "Maya",
+ "OXID",
+ "Plentymarkets",
+ "Porto",
+ "RadPHP",
+ "SMF",
+ "Starbug",
+ "Thelia",
+ "Whmcs",
+ "WolfCMS",
+ "agl",
+ "annotatecms",
+ "attogram",
+ "bitrix",
+ "cakephp",
+ "chef",
+ "cockpit",
+ "codeigniter",
+ "concrete5",
+ "croogo",
+ "dokuwiki",
+ "drupal",
+ "eZ Platform",
+ "elgg",
+ "expressionengine",
+ "fuelphp",
+ "grav",
+ "installer",
+ "itop",
+ "known",
+ "kohana",
+ "laravel",
+ "lavalite",
+ "lithium",
+ "magento",
+ "majima",
+ "mako",
+ "matomo",
+ "mediawiki",
+ "miaoxing",
+ "modulework",
+ "modx",
+ "moodle",
+ "osclass",
+ "pantheon",
+ "phpbb",
+ "piwik",
+ "ppi",
+ "processwire",
+ "puppet",
+ "pxcms",
+ "reindex",
+ "roundcube",
+ "shopware",
+ "silverstripe",
+ "sydes",
+ "sylius",
+ "tastyigniter",
+ "wordpress",
+ "yawik",
+ "zend",
+ "zikula"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/installers/issues",
+ "source": "https://github.com/composer/installers/tree/v2.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-08-20T06:45:11+00:00"
+ },
+ {
+ "name": "graham-campbell/result-type",
+ "version": "v1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/GrahamCampbell/Result-Type.git",
+ "reference": "0690bde05318336c7221785f2a932467f98b64ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca",
+ "reference": "0690bde05318336c7221785f2a932467f98b64ca",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "phpoption/phpoption": "^1.8"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "GrahamCampbell\\ResultType\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ }
+ ],
+ "description": "An Implementation Of The Result Type",
+ "keywords": [
+ "Graham Campbell",
+ "GrahamCampbell",
+ "Result Type",
+ "Result-Type",
+ "result"
+ ],
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
+ "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-11-21T21:41:47+00:00"
+ },
+ {
+ "name": "oscarotero/env",
+ "version": "v2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/oscarotero/env.git",
+ "reference": "0da22cadc6924155fa9bbea2cdda2e84ab7cbdd3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/oscarotero/env/zipball/0da22cadc6924155fa9bbea2cdda2e84ab7cbdd3",
+ "reference": "0da22cadc6924155fa9bbea2cdda2e84ab7cbdd3",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.16",
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Env\\": "src/"
+ },
+ "files": [
+ "src/env_function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oscar Otero",
+ "email": "oom@oscarotero.com",
+ "homepage": "http://oscarotero.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Simple library to consume environment variables",
+ "homepage": "https://github.com/oscarotero/env",
+ "keywords": [
+ "env"
+ ],
+ "time": "2020-06-11T10:59:27+00:00"
+ },
+ {
+ "name": "phpoption/phpoption",
+ "version": "1.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-option.git",
+ "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15",
+ "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpOption\\": "src/PhpOption/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Johannes M. Schmitt",
+ "email": "schmittjoh@gmail.com",
+ "homepage": "https://github.com/schmittjoh"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ }
+ ],
+ "description": "Option Type for PHP",
+ "keywords": [
+ "language",
+ "option",
+ "php",
+ "type"
+ ],
+ "support": {
+ "issues": "https://github.com/schmittjoh/php-option/issues",
+ "source": "https://github.com/schmittjoh/php-option/tree/1.8.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-12-04T23:24:31+00:00"
+ },
+ {
+ "name": "roots/bedrock-autoloader",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/roots/bedrock-autoloader.git",
+ "reference": "f508348a3365ab5ce7e045f5fd4ee9f0a30dd70f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/roots/bedrock-autoloader/zipball/f508348a3365ab5ce7e045f5fd4ee9f0a30dd70f",
+ "reference": "f508348a3365ab5ce7e045f5fd4ee9f0a30dd70f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "10up/wp_mock": "^0.4.2",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Roots\\Bedrock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nick Fox",
+ "email": "nick@foxaii.com",
+ "homepage": "https://github.com/foxaii"
+ },
+ {
+ "name": "Scott Walkinshaw",
+ "email": "scott.walkinshaw@gmail.com",
+ "homepage": "https://github.com/swalkinshaw"
+ },
+ {
+ "name": "Austin Pray",
+ "email": "austin@austinpray.com",
+ "homepage": "https://github.com/austinpray"
+ }
+ ],
+ "description": "An autoloader that enables standard plugins to be required just like must-use plugins",
+ "keywords": [
+ "autoloader",
+ "bedrock",
+ "mu-plugin",
+ "must-use",
+ "plugin",
+ "wordpress"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/roots",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/rootsdev",
+ "type": "patreon"
+ }
+ ],
+ "time": "2020-12-04T15:59:12+00:00"
+ },
+ {
+ "name": "roots/bedrock-disallow-indexing",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/roots/bedrock-disallow-indexing.git",
+ "reference": "6c28192e17cb9e02a5c0c99691a18552b85e1615"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/roots/bedrock-disallow-indexing/zipball/6c28192e17cb9e02a5c0c99691a18552b85e1615",
+ "reference": "6c28192e17cb9e02a5c0c99691a18552b85e1615",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "wordpress-muplugin",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Word",
+ "email": "ben@benword.com",
+ "homepage": "https://github.com/retlehs"
+ },
+ {
+ "name": "Scott Walkinshaw",
+ "email": "scott.walkinshaw@gmail.com",
+ "homepage": "https://github.com/swalkinshaw"
+ },
+ {
+ "name": "QWp6t",
+ "email": "hi@qwp6t.me",
+ "homepage": "https://github.com/qwp6t"
+ }
+ ],
+ "description": "Disallow indexing of your site on non-production environments",
+ "keywords": [
+ "wordpress"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/roots",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/rootsdev",
+ "type": "patreon"
+ }
+ ],
+ "time": "2020-05-20T01:25:07+00:00"
+ },
+ {
+ "name": "roots/wordpress",
+ "version": "6.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/roots/wordpress.git",
+ "reference": "41ff6e23ccbc3a1691406d69fe8c211a225514e2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/roots/wordpress/zipball/41ff6e23ccbc3a1691406d69fe8c211a225514e2",
+ "reference": "41ff6e23ccbc3a1691406d69fe8c211a225514e2",
+ "shasum": ""
+ },
+ "require": {
+ "roots/wordpress-core-installer": "^1.0.0",
+ "roots/wordpress-no-content": "self.version"
+ },
+ "type": "metapackage",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT",
+ "GPL-2.0-or-later"
+ ],
+ "description": "WordPress is open source software you can use to create a beautiful website, blog, or app.",
+ "homepage": "https://wordpress.org/",
+ "keywords": [
+ "blog",
+ "cms",
+ "wordpress"
+ ],
+ "support": {
+ "issues": "https://github.com/roots/wordpress/issues",
+ "source": "https://github.com/roots/wordpress/tree/6.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/roots",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/rootsdev",
+ "type": "patreon"
+ }
+ ],
+ "time": "2022-06-01T16:54:37+00:00"
+ },
+ {
+ "name": "roots/wordpress-core-installer",
+ "version": "1.100.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/roots/wordpress-core-installer.git",
+ "reference": "73f8488e5178c5d54234b919f823a9095e2b1847"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/roots/wordpress-core-installer/zipball/73f8488e5178c5d54234b919f823a9095e2b1847",
+ "reference": "73f8488e5178c5d54234b919f823a9095e2b1847",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": ">=5.6.0"
+ },
+ "conflict": {
+ "composer/installers": "<1.0.6"
+ },
+ "replace": {
+ "johnpbloch/wordpress-core-installer": "*"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0 || ^2.0",
+ "phpunit/phpunit": ">=5.7.27"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Roots\\Composer\\WordPressCorePlugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "Roots\\Composer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "GPL-2.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "John P. Bloch",
+ "email": "me@johnpbloch.com"
+ },
+ {
+ "name": "Roots",
+ "email": "team@roots.io"
+ }
+ ],
+ "description": "A custom installer to handle deploying WordPress with composer",
+ "keywords": [
+ "wordpress"
+ ],
+ "support": {
+ "issues": "https://github.com/roots/wordpress-core-installer/issues",
+ "source": "https://github.com/roots/wordpress-core-installer/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/roots",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/rootsdev",
+ "type": "patreon"
+ }
+ ],
+ "time": "2020-08-20T00:27:30+00:00"
+ },
+ {
+ "name": "roots/wordpress-no-content",
+ "version": "6.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/WordPress/WordPress.git",
+ "reference": "6.0.2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://downloads.wordpress.org/release/wordpress-6.0.2-no-content.zip",
+ "shasum": "9e78ef932a99d62e6a0b045ff846fe5b2bf35e29"
+ },
+ "require": {
+ "php": ">= 5.6.20"
+ },
+ "provide": {
+ "wordpress/core-implementation": "6.0.2"
+ },
+ "suggest": {
+ "ext-curl": "Performs remote request operations.",
+ "ext-dom": "Used to validate Text Widget content and to automatically configuring IIS7+.",
+ "ext-exif": "Works with metadata stored in images.",
+ "ext-fileinfo": "Used to detect mimetype of file uploads.",
+ "ext-hash": "Used for hashing, including passwords and update packages.",
+ "ext-imagick": "Provides better image quality for media uploads.",
+ "ext-json": "Used for communications with other servers.",
+ "ext-libsodium": "Validates Signatures and provides securely random bytes.",
+ "ext-mbstring": "Used to properly handle UTF8 text.",
+ "ext-mysqli": "Connects to MySQL for database interactions.",
+ "ext-openssl": "Permits SSL-based connections to other hosts.",
+ "ext-pcre": "Increases performance of pattern matching in code searches.",
+ "ext-xml": "Used for XML parsing, such as from a third-party site.",
+ "ext-zip": "Used for decompressing Plugins, Themes, and WordPress update packages."
+ },
+ "type": "wordpress-core",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "GPL-2.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "WordPress Community",
+ "homepage": "https://wordpress.org/about/"
+ }
+ ],
+ "description": "WordPress is open source software you can use to create a beautiful website, blog, or app.",
+ "homepage": "https://wordpress.org/",
+ "keywords": [
+ "blog",
+ "cms",
+ "wordpress"
+ ],
+ "support": {
+ "docs": "https://developer.wordpress.org/",
+ "forum": "https://wordpress.org/support/",
+ "irc": "irc://irc.freenode.net/wordpress",
+ "issues": "https://core.trac.wordpress.org/",
+ "rss": "https://wordpress.org/news/feed/",
+ "source": "https://core.trac.wordpress.org/browser",
+ "wiki": "https://codex.wordpress.org/"
+ },
+ "funding": [
+ {
+ "url": "https://wordpressfoundation.org/donate/",
+ "type": "other"
+ }
+ ],
+ "time": "2022-08-30T17:52:03+00:00"
+ },
+ {
+ "name": "roots/wp-config",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/roots/wp-config.git",
+ "reference": "37c38230796119fb487fa03346ab0706ce6d4962"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/roots/wp-config/zipball/37c38230796119fb487fa03346ab0706ce6d4962",
+ "reference": "37c38230796119fb487fa03346ab0706ce6d4962",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5.7",
+ "roave/security-advisories": "dev-master",
+ "squizlabs/php_codesniffer": "^3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Roots\\WPConfig\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Austin Pray",
+ "email": "austin@austinpray.com"
+ }
+ ],
+ "description": "Collect configuration values and safely define() them",
+ "time": "2018-08-10T14:18:38+00:00"
+ },
+ {
+ "name": "roots/wp-password-bcrypt",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/roots/wp-password-bcrypt.git",
+ "reference": "15f0d8919fb3731f79a0cf2fb47e1baecb86cb26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/roots/wp-password-bcrypt/zipball/15f0d8919fb3731f79a0cf2fb47e1baecb86cb26",
+ "reference": "15f0d8919fb3731f79a0cf2fb47e1baecb86cb26",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "brain/monkey": "^2.6",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "mockery/mockery": "^1.4",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpunit/phpunit": "<= 9.3",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "wp-password-bcrypt.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Scott Walkinshaw",
+ "email": "scott.walkinshaw@gmail.com",
+ "homepage": "https://github.com/swalkinshaw"
+ },
+ {
+ "name": "QWp6t",
+ "homepage": "https://github.com/qwp6t"
+ },
+ {
+ "name": "Brandon Nifong",
+ "homepage": "https://github.com/log1x"
+ },
+ {
+ "name": "Jan Pingel",
+ "email": "jpingel@bitpiston.com",
+ "homepage": "http://janpingel.com"
+ }
+ ],
+ "description": "WordPress plugin which replaces wp_hash_password and wp_check_password's phpass hasher with PHP 5.5's password_hash and password_verify using bcrypt.",
+ "homepage": "https://roots.io/plugins/wp-password-bcrypt",
+ "keywords": [
+ "bcrypt",
+ "passwords",
+ "wordpress"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/roots",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/rootsdev",
+ "type": "patreon"
+ }
+ ],
+ "time": "2021-10-31T01:18:58+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.24.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "30885182c981ab175d4d034db0f6f469898070ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
+ "reference": "30885182c981ab175d4d034db0f6f469898070ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.24.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-10-20T20:35:02+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.24.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825",
+ "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-11-30T18:21:41+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.24.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9",
+ "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.23-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-09-13T13:58:33+00:00"
+ },
+ {
+ "name": "vlucas/phpdotenv",
+ "version": "v5.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vlucas/phpdotenv.git",
+ "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f",
+ "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-pcre": "*",
+ "graham-campbell/result-type": "^1.0.2",
+ "php": "^7.1.3 || ^8.0",
+ "phpoption/phpoption": "^1.8",
+ "symfony/polyfill-ctype": "^1.23",
+ "symfony/polyfill-mbstring": "^1.23.1",
+ "symfony/polyfill-php80": "^1.23.1"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "ext-filter": "*",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10"
+ },
+ "suggest": {
+ "ext-filter": "Required to use the boolean validator."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dotenv\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Vance Lucas",
+ "email": "vance@vancelucas.com",
+ "homepage": "https://github.com/vlucas"
+ }
+ ],
+ "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "support": {
+ "issues": "https://github.com/vlucas/phpdotenv/issues",
+ "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-12-12T23:22:04+00:00"
+ },
+ {
+ "name": "wpackagist-plugin/acf-field-date-time-picker",
+ "version": "2.1.5",
+ "source": {
+ "type": "svn",
+ "url": "https://plugins.svn.wordpress.org/acf-field-date-time-picker/",
+ "reference": "tags/2.1.5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://downloads.wordpress.org/plugin/acf-field-date-time-picker.2.1.5.zip"
+ },
+ "require": {
+ "composer/installers": "^1.0 || ^2.0"
+ },
+ "type": "wordpress-plugin",
+ "homepage": "https://wordpress.org/plugins/acf-field-date-time-picker/"
+ },
+ {
+ "name": "wpackagist-plugin/advanced-custom-fields",
+ "version": "4.4.12",
+ "source": {
+ "type": "svn",
+ "url": "https://plugins.svn.wordpress.org/advanced-custom-fields/",
+ "reference": "tags/4.4.12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://downloads.wordpress.org/plugin/advanced-custom-fields.4.4.12.zip"
+ },
+ "require": {
+ "composer/installers": "^1.0 || ^2.0"
+ },
+ "type": "wordpress-plugin",
+ "homepage": "https://wordpress.org/plugins/advanced-custom-fields/"
+ },
+ {
+ "name": "wpackagist-plugin/jwt-authentication-for-wp-rest-api",
+ "version": "1.2.5",
+ "source": {
+ "type": "svn",
+ "url": "https://plugins.svn.wordpress.org/jwt-authentication-for-wp-rest-api/",
+ "reference": "tags/1.2.5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://downloads.wordpress.org/plugin/jwt-authentication-for-wp-rest-api.1.2.5.zip"
+ },
+ "require": {
+ "composer/installers": "^1.0 || ^2.0"
+ },
+ "type": "wordpress-plugin",
+ "homepage": "https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/"
+ },
+ {
+ "name": "wpackagist-plugin/user-role-editor",
+ "version": "4.36.1",
+ "source": {
+ "type": "svn",
+ "url": "https://plugins.svn.wordpress.org/user-role-editor/",
+ "reference": "tags/4.36.1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://downloads.wordpress.org/plugin/user-role-editor.4.36.1.zip"
+ },
+ "require": {
+ "composer/installers": "^1.0 || ^2.0"
+ },
+ "type": "wordpress-plugin",
+ "homepage": "https://wordpress.org/plugins/user-role-editor/"
+ },
+ {
+ "name": "wpackagist-plugin/wordpress-importer",
+ "version": "0.6.3",
+ "source": {
+ "type": "svn",
+ "url": "https://plugins.svn.wordpress.org/wordpress-importer/",
+ "reference": "tags/0.6.3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://downloads.wordpress.org/plugin/wordpress-importer.0.6.3.zip"
+ },
+ "require": {
+ "composer/installers": "^1.0 || ^2.0"
+ },
+ "type": "wordpress-plugin",
+ "homepage": "https://wordpress.org/plugins/wordpress-importer/"
+ },
+ {
+ "name": "wpackagist-theme/twentytwentytwo",
+ "version": "1.2",
+ "source": {
+ "type": "svn",
+ "url": "https://themes.svn.wordpress.org/twentytwentytwo/",
+ "reference": "1.2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://downloads.wordpress.org/theme/twentytwentytwo.1.2.zip"
+ },
+ "require": {
+ "composer/installers": "^1.0 || ^2.0"
+ },
+ "type": "wordpress-theme",
+ "homepage": "https://wordpress.org/themes/twentytwentytwo/"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "roave/security-advisories",
+ "version": "dev-latest",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Roave/SecurityAdvisories.git",
+ "reference": "bac54e18ee767f065d88b81c8517fb21cd6414ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/bac54e18ee767f065d88b81c8517fb21cd6414ab",
+ "reference": "bac54e18ee767f065d88b81c8517fb21cd6414ab",
+ "shasum": ""
+ },
+ "conflict": {
+ "3f/pygmentize": "<1.2",
+ "adodb/adodb-php": "<5.20.12",
+ "akaunting/akaunting": "<2.1.13",
+ "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1",
+ "amazing/media2click": ">=1,<1.3.3",
+ "amphp/artax": "<1.0.6|>=2,<2.0.6",
+ "amphp/http": "<1.0.1",
+ "amphp/http-client": ">=4,<4.4",
+ "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6",
+ "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99",
+ "aws/aws-sdk-php": ">=3,<3.2.1",
+ "bagisto/bagisto": "<0.1.5",
+ "barrelstrength/sprout-base-email": "<1.2.7",
+ "barrelstrength/sprout-forms": "<3.9",
+ "baserproject/basercms": "<=4.5",
+ "billz/raspap-webgui": "<=2.6.6",
+ "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3",
+ "bolt/bolt": "<3.7.2",
+ "bolt/core": "<4.1.13",
+ "brightlocal/phpwhois": "<=4.2.5",
+ "buddypress/buddypress": "<7.2.1",
+ "bugsnag/bugsnag-laravel": ">=2,<2.0.2",
+ "cachethq/cachet": "<2.5.1",
+ "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7",
+ "cardgate/magento2": "<2.0.33",
+ "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4",
+ "cartalyst/sentry": "<=2.1.6",
+ "catfan/medoo": "<1.7.5",
+ "centreon/centreon": "<20.10.7",
+ "cesnet/simplesamlphp-module-proxystatistics": "<3.1",
+ "codeception/codeception": "<3.1.3|>=4,<4.1.22",
+ "codeigniter/framework": "<=3.0.6",
+ "codiad/codiad": "<=2.8.4",
+ "composer/composer": "<1.10.23|>=2-alpha.1,<2.1.9",
+ "concrete5/concrete5": "<8.5.5",
+ "contao-components/mediaelement": ">=2.14.2,<2.21.1",
+ "contao/core": ">=2,<3.5.39",
+ "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0",
+ "contao/listing-bundle": ">=4,<4.4.8",
+ "craftcms/cms": "<3.7.14",
+ "croogo/croogo": "<3.0.7",
+ "datadog/dd-trace": ">=0.30,<0.30.2",
+ "david-garcia/phpwhois": "<=4.3.1",
+ "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1",
+ "directmailteam/direct-mail": "<5.2.4",
+ "doctrine/annotations": ">=1,<1.2.7",
+ "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2",
+ "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1",
+ "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2",
+ "doctrine/doctrine-bundle": "<1.5.2",
+ "doctrine/doctrine-module": "<=0.7.1",
+ "doctrine/mongodb-odm": ">=1,<1.0.2",
+ "doctrine/mongodb-odm-bundle": ">=2,<3.0.1",
+ "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4",
+ "dolibarr/dolibarr": "<14|>= 3.3.beta1, < 13.0.2",
+ "dompdf/dompdf": ">=0.6,<0.6.2",
+ "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4",
+ "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4",
+ "dweeves/magmi": "<=0.7.24",
+ "ecodev/newsletter": "<=4",
+ "endroid/qr-code-bundle": "<3.4.2",
+ "enshrined/svg-sanitize": "<0.13.1",
+ "erusev/parsedown": "<1.7.2",
+ "ether/logs": "<3.0.4",
+ "ezsystems/demobundle": ">=5.4,<5.4.6.1",
+ "ezsystems/ez-support-tools": ">=2.2,<2.2.3",
+ "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1",
+ "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1",
+ "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24",
+ "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6",
+ "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1",
+ "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1",
+ "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8",
+ "ezsystems/ezplatform-user": ">=1,<1.0.1",
+ "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1",
+ "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1",
+ "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3",
+ "ezsystems/repository-forms": ">=2.3,<2.3.2.1",
+ "ezyang/htmlpurifier": "<4.1.1",
+ "facade/ignition": "<2.4.2|>=2.5,<2.5.2",
+ "feehi/cms": "<=2.1.1",
+ "feehi/feehicms": "<=0.1.3",
+ "firebase/php-jwt": "<2",
+ "flarum/core": ">=1,<=1.0.1",
+ "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15",
+ "flarum/tags": "<=0.1-beta.13",
+ "fluidtypo3/vhs": "<5.1.1",
+ "fooman/tcpdf": "<6.2.22",
+ "forkcms/forkcms": "<=5.9.2",
+ "fossar/tcpdf-parser": "<6.2.22",
+ "francoisjacquet/rosariosis": "<6.5.1",
+ "friendsofsymfony/oauth2-php": "<1.3",
+ "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2",
+ "friendsofsymfony/user-bundle": ">=1.2,<1.3.5",
+ "friendsoftypo3/mediace": ">=7.6.2,<7.6.5",
+ "froala/wysiwyg-editor": "<3.2.7",
+ "fuel/core": "<1.8.1",
+ "getgrav/grav": "<=1.7.24",
+ "getkirby/cms": "<=3.5.6",
+ "getkirby/panel": "<2.5.14",
+ "gilacms/gila": "<=1.11.4",
+ "globalpayments/php-sdk": "<2",
+ "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3",
+ "gree/jose": "<=2.2",
+ "gregwar/rst": "<1.0.3",
+ "grumpydictator/firefly-iii": "<=5.6.2",
+ "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1",
+ "helloxz/imgurl": "<=2.31",
+ "hjue/justwriting": "<=1",
+ "ibexa/post-install": "<=1.0.4",
+ "icecoder/icecoder": "<=8",
+ "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10",
+ "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4",
+ "illuminate/database": "<6.20.26|>=7,<8.40",
+ "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15",
+ "illuminate/view": ">=7,<7.1.2",
+ "impresscms/impresscms": "<=1.4.2",
+ "in2code/femanager": "<5.5.1|>=6,<6.3.1",
+ "intelliants/subrion": "<=4.2.1",
+ "ivankristianto/phpwhois": "<=4.3",
+ "james-heinrich/getid3": "<1.9.21",
+ "joomla/archive": "<1.1.10",
+ "joomla/session": "<1.3.1",
+ "jsmitty12/phpwhois": "<5.1",
+ "kazist/phpwhois": "<=4.2.6",
+ "kitodo/presentation": "<3.1.2",
+ "klaviyo/magento2-extension": ">=1,<3",
+ "kreait/firebase-php": ">=3.2,<3.8.1",
+ "la-haute-societe/tcpdf": "<6.2.22",
+ "laminas/laminas-http": "<2.14.2",
+ "laravel/framework": "<6.20.26|>=7,<8.40",
+ "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10",
+ "lavalite/cms": "<=5.8",
+ "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5",
+ "league/commonmark": "<0.18.3",
+ "league/flysystem": "<1.1.4|>=2,<2.1.1",
+ "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3",
+ "librenms/librenms": "<=21.10.2",
+ "limesurvey/limesurvey": "<3.27.19",
+ "livewire/livewire": ">2.2.4,<2.2.6",
+ "lms/routes": "<2.1.1",
+ "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2",
+ "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3",
+ "magento/magento1ce": "<1.9.4.3",
+ "magento/magento1ee": ">=1,<1.14.4.3",
+ "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2",
+ "marcwillmann/turn": "<0.3.3",
+ "mautic/core": "<4|= 2.13.1",
+ "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35",
+ "microweber/microweber": "<1.2.8",
+ "miniorange/miniorange-saml": "<1.4.3",
+ "mittwald/typo3_forum": "<1.2.1",
+ "modx/revolution": "<2.8",
+ "monolog/monolog": ">=1.8,<1.12",
+ "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10-beta,<3.10.2",
+ "namshi/jose": "<2.2",
+ "neoan3-apps/template": "<1.1.1",
+ "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6",
+ "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3",
+ "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3",
+ "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5",
+ "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6",
+ "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13",
+ "nilsteampassnet/teampass": "<=2.1.27.36",
+ "nukeviet/nukeviet": "<4.3.4",
+ "nystudio107/craft-seomatic": "<3.3",
+ "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1",
+ "october/backend": "<1.1.2",
+ "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469",
+ "october/october": ">=1.0.319,<1.0.466|>=2.1,<2.1.12",
+ "october/rain": "<1.0.472|>=1.1,<1.1.2",
+ "october/system": "<1.0.472|>=1.1.1,<1.1.5|>=2.1,<2.1.12",
+ "onelogin/php-saml": "<2.10.4",
+ "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5",
+ "opencart/opencart": "<=3.0.3.2",
+ "openid/php-openid": "<2.3",
+ "openmage/magento-lts": "<19.4.15|>=20,<20.0.13",
+ "orchid/platform": ">=9,<9.4.4",
+ "oro/crm": ">=1.7,<1.7.4",
+ "oro/platform": ">=1.7,<1.7.4",
+ "padraic/humbug_get_contents": "<1.1.2",
+ "pagarme/pagarme-php": ">=0,<3",
+ "pagekit/pagekit": "<=1.0.18",
+ "paragonie/random_compat": "<2",
+ "passbolt/passbolt_api": "<2.11",
+ "paypal/merchant-sdk-php": "<3.12",
+ "pear/archive_tar": "<1.4.14",
+ "personnummer/personnummer": "<3.0.2",
+ "phanan/koel": "<5.1.4",
+ "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7",
+ "phpmailer/phpmailer": "<6.5",
+ "phpmussel/phpmussel": ">=1,<1.6",
+ "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3",
+ "phpoffice/phpexcel": "<1.8.2",
+ "phpoffice/phpspreadsheet": "<1.16",
+ "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7",
+ "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3",
+ "phpwhois/phpwhois": "<=4.2.5",
+ "phpxmlrpc/extras": "<0.6.1",
+ "pimcore/pimcore": "<10.1.3",
+ "pocketmine/pocketmine-mp": "<3.15.4",
+ "pressbooks/pressbooks": "<5.18",
+ "prestashop/autoupgrade": ">=4,<4.10.1",
+ "prestashop/contactform": ">1.0.1,<4.3",
+ "prestashop/gamification": "<2.3.2",
+ "prestashop/productcomments": ">=4,<4.2.1",
+ "prestashop/ps_emailsubscription": "<2.6.1",
+ "prestashop/ps_facetedsearch": "<3.4.1",
+ "prestashop/ps_linklist": "<3.1",
+ "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2",
+ "propel/propel": ">=2-alpha.1,<=2-alpha.7",
+ "propel/propel1": ">=1,<=1.7.1",
+ "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6|>=1,<1.6.3",
+ "pusher/pusher-php-server": "<2.2.1",
+ "pwweb/laravel-core": "<=0.3.6-beta",
+ "rainlab/debugbar-plugin": "<3.1",
+ "rmccue/requests": ">=1.6,<1.8",
+ "robrichards/xmlseclibs": "<3.0.4",
+ "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1",
+ "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9",
+ "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11",
+ "sensiolabs/connect": "<4.2.3",
+ "serluck/phpwhois": "<=4.2.6",
+ "shopware/core": "<=6.4.3",
+ "shopware/platform": "<=6.4.3",
+ "shopware/production": "<=6.3.5.2",
+ "shopware/shopware": "<5.7.6",
+ "showdoc/showdoc": "<=2.9.8",
+ "silverstripe/admin": "<4.8.1",
+ "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2",
+ "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4",
+ "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1",
+ "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3",
+ "silverstripe/framework": "<4.7.4",
+ "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2",
+ "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1",
+ "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4",
+ "silverstripe/subsites": ">=2,<2.1.1",
+ "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1",
+ "silverstripe/userforms": "<3",
+ "simple-updates/phpwhois": "<=1",
+ "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4",
+ "simplesamlphp/simplesamlphp": "<1.18.6",
+ "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1",
+ "simplito/elliptic-php": "<1.0.6",
+ "slim/slim": "<2.6",
+ "smarty/smarty": "<3.1.39",
+ "snipe/snipe-it": "<5.3",
+ "socalnick/scn-social-auth": "<1.15.2",
+ "socialiteproviders/steam": "<1.1",
+ "spoonity/tcpdf": "<6.2.22",
+ "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1",
+ "ssddanbrown/bookstack": "<0.29.2",
+ "stormpath/sdk": ">=0,<9.9.99",
+ "studio-42/elfinder": "<2.1.59",
+ "subrion/cms": "<=4.2.1",
+ "sulu/sulu": "<1.6.43|>=2,<2.0.10|>=2.1,<2.1.1",
+ "swiftmailer/swiftmailer": ">=4,<5.4.5",
+ "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2",
+ "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1",
+ "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1",
+ "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1",
+ "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4",
+ "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3|>=1.9,<1.9.5",
+ "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99",
+ "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4",
+ "symbiote/silverstripe-versionedfiles": "<=2.0.3",
+ "symfont/process": ">=0,<4",
+ "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8",
+ "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+ "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4",
+ "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1",
+ "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+ "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7",
+ "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5",
+ "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13",
+ "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1",
+ "symfony/mime": ">=4.3,<4.3.8",
+ "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+ "symfony/polyfill": ">=1,<1.10",
+ "symfony/polyfill-php55": ">=1,<1.10",
+ "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+ "symfony/routing": ">=2,<2.0.19",
+ "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8",
+ "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11",
+ "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9",
+ "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11",
+ "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8",
+ "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2",
+ "symfony/serializer": ">=2,<2.0.11",
+ "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2",
+ "symfony/translation": ">=2,<2.0.17",
+ "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3",
+ "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8",
+ "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4",
+ "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7",
+ "t3/dce": ">=2.2,<2.6.2",
+ "t3g/svg-sanitizer": "<1.0.3",
+ "tecnickcom/tcpdf": "<6.2.22",
+ "thelia/backoffice-default-template": ">=2.1,<2.1.2",
+ "thelia/thelia": ">=2.1-beta.1,<2.1.3",
+ "theonedemon/phpwhois": "<=4.2.5",
+ "tinymce/tinymce": "<5.10",
+ "titon/framework": ">=0,<9.9.99",
+ "topthink/think": "<=6.0.9",
+ "topthink/thinkphp": "<=3.2.3",
+ "tribalsystems/zenario": "<8.8.53370",
+ "truckersmp/phpwhois": "<=4.3.1",
+ "twig/twig": "<1.38|>=2,<2.7",
+ "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.5",
+ "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1",
+ "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.5",
+ "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1",
+ "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6",
+ "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3",
+ "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1",
+ "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5",
+ "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10",
+ "ua-parser/uap-php": "<3.8",
+ "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2",
+ "vanilla/safecurl": "<0.9.2",
+ "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4",
+ "vrana/adminer": "<4.7.9",
+ "wallabag/tcpdf": "<6.2.22",
+ "wanglelecc/laracms": "<=1.0.3",
+ "web-auth/webauthn-framework": ">=3.3,<3.3.4",
+ "webcoast/deferred-image-processing": "<1.0.2",
+ "wikimedia/parsoid": "<0.12.2",
+ "willdurand/js-translation-bundle": "<2.1.1",
+ "wp-cli/wp-cli": "<2.5",
+ "yidashi/yii2cmf": "<=2",
+ "yii2mod/yii2-cms": "<1.9.2",
+ "yiisoft/yii": ">=1.1.14,<1.1.15",
+ "yiisoft/yii2": "<2.0.38",
+ "yiisoft/yii2-bootstrap": "<2.0.4",
+ "yiisoft/yii2-dev": "<2.0.43",
+ "yiisoft/yii2-elasticsearch": "<2.0.5",
+ "yiisoft/yii2-gii": "<2.0.4",
+ "yiisoft/yii2-jui": "<2.0.4",
+ "yiisoft/yii2-redis": "<2.0.8",
+ "yoast-seo-for-typo3/yoast_seo": "<7.2.3",
+ "yourls/yourls": "<=1.8.2",
+ "zendesk/zendesk_api_client_php": "<2.2.11",
+ "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3",
+ "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2",
+ "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2",
+ "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5",
+ "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3",
+ "zendframework/zend-diactoros": ">=1,<1.8.4",
+ "zendframework/zend-feed": ">=1,<2.10.3",
+ "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1",
+ "zendframework/zend-http": ">=1,<2.8.1",
+ "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6",
+ "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3",
+ "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2",
+ "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1",
+ "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4",
+ "zendframework/zend-validator": ">=2.3,<2.3.6",
+ "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1",
+ "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6",
+ "zendframework/zendframework": "<=3",
+ "zendframework/zendframework1": "<1.12.20",
+ "zendframework/zendopenid": ">=2,<2.0.2",
+ "zendframework/zendxml": ">=1,<1.0.1",
+ "zetacomponents/mail": "<1.8.2",
+ "zf-commons/zfc-user": "<1.2.2",
+ "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3",
+ "zfr/zfr-oauth2-server-module": "<0.1.2",
+ "zoujingli/thinkadmin": "<6.0.22"
+ },
+ "type": "metapackage",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "role": "maintainer"
+ },
+ {
+ "name": "Ilya Tribusean",
+ "email": "slash3b@gmail.com",
+ "role": "maintainer"
+ }
+ ],
+ "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it",
+ "funding": [
+ {
+ "url": "https://github.com/Ocramius",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-11-10T17:18:39+00:00"
+ },
+ {
+ "name": "squizlabs/php_codesniffer",
+ "version": "3.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+ "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619",
+ "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619",
+ "shasum": ""
+ },
+ "require": {
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "bin": [
+ "bin/phpcs",
+ "bin/phpcbf"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Greg Sherwood",
+ "role": "lead"
+ }
+ ],
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
+ "keywords": [
+ "phpcs",
+ "standards"
+ ],
+ "support": {
+ "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
+ "source": "https://github.com/squizlabs/PHP_CodeSniffer",
+ "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+ },
+ "time": "2022-06-18T07:21:10+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "dev",
+ "stability-flags": {
+ "roave/security-advisories": 20
+ },
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=7.4"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.3.0"
+}
diff --git a/bedrock/config/application.php b/bedrock/config/application.php
new file mode 100644
index 00000000..6cf68424
--- /dev/null
+++ b/bedrock/config/application.php
@@ -0,0 +1,142 @@
+load();
+ $dotenv->required(['WP_HOME', 'WP_SITEURL']);
+ if (!env('DATABASE_URL')) {
+ $dotenv->required(['DB_NAME', 'DB_USER', 'DB_PASSWORD']);
+ }
+}
+
+/**
+ * Set up our global environment constant and load its config first
+ * Default: production
+ */
+define('WP_ENV', env('WP_ENV') ?: 'production');
+
+/**
+ * URLs
+ */
+Config::define('WP_HOME', env('WP_HOME'));
+Config::define('WP_SITEURL', env('WP_SITEURL'));
+
+/**
+ * Custom Content Directory
+ */
+Config::define('CONTENT_DIR', '/app');
+Config::define('WP_CONTENT_DIR', $webroot_dir . Config::get('CONTENT_DIR'));
+Config::define('WP_CONTENT_URL', Config::get('WP_HOME') . Config::get('CONTENT_DIR'));
+
+/**
+ * DB settings
+ */
+Config::define('DB_NAME', env('DB_NAME'));
+Config::define('DB_USER', env('DB_USER'));
+Config::define('DB_PASSWORD', env('DB_PASSWORD'));
+Config::define('DB_HOST', env('DB_HOST') ?: 'localhost');
+Config::define('DB_CHARSET', 'utf8mb4');
+Config::define('DB_COLLATE', '');
+$table_prefix = env('DB_PREFIX') ?: 'wp_';
+
+if (env('DATABASE_URL')) {
+ $dsn = (object) parse_url(env('DATABASE_URL'));
+
+ Config::define('DB_NAME', substr($dsn->path, 1));
+ Config::define('DB_USER', $dsn->user);
+ Config::define('DB_PASSWORD', isset($dsn->pass) ? $dsn->pass : null);
+ Config::define('DB_HOST', isset($dsn->port) ? "{$dsn->host}:{$dsn->port}" : $dsn->host);
+}
+
+/**
+ * Authentication Unique Keys and Salts
+ */
+Config::define('AUTH_KEY', env('AUTH_KEY'));
+Config::define('SECURE_AUTH_KEY', env('SECURE_AUTH_KEY'));
+Config::define('LOGGED_IN_KEY', env('LOGGED_IN_KEY'));
+Config::define('NONCE_KEY', env('NONCE_KEY'));
+Config::define('AUTH_SALT', env('AUTH_SALT'));
+Config::define('SECURE_AUTH_SALT', env('SECURE_AUTH_SALT'));
+Config::define('LOGGED_IN_SALT', env('LOGGED_IN_SALT'));
+Config::define('NONCE_SALT', env('NONCE_SALT'));
+
+/**
+ * Custom Settings
+ */
+Config::define('AUTOMATIC_UPDATER_DISABLED', true);
+Config::define('DISABLE_WP_CRON', env('DISABLE_WP_CRON') ?: false);
+// Disable the plugin and theme file editor in the admin
+Config::define('DISALLOW_FILE_EDIT', true);
+// Disable plugin and theme updates and installation from the admin
+Config::define('DISALLOW_FILE_MODS', true);
+// Limit the number of post revisions that Wordpress stores (true (default WP): store every revision)
+Config::define('WP_POST_REVISIONS', env('WP_POST_REVISIONS') ?: true);
+
+/**
+ * Debugging Settings
+ */
+Config::define('WP_DEBUG_DISPLAY', false);
+Config::define('WP_DEBUG_LOG', false);
+Config::define('SCRIPT_DEBUG', false);
+ini_set('display_errors', '0');
+
+/**
+ * JWT Authentication
+ */
+Config::define('JWT_AUTH_SECRET_KEY', env('JWT_AUTH_SECRET_KEY'));
+
+/**
+ * Allow WordPress to detect HTTPS when used behind a reverse proxy or a load balancer
+ * See https://codex.wordpress.org/Function_Reference/is_ssl#Notes
+ */
+if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
+ $_SERVER['HTTPS'] = 'on';
+}
+
+$env_config = __DIR__ . '/environments/' . WP_ENV . '.php';
+
+if (file_exists($env_config)) {
+ require_once $env_config;
+}
+
+Config::apply();
+
+/**
+ * Bootstrap WordPress
+ */
+if (!defined('ABSPATH')) {
+ define('ABSPATH', $webroot_dir . '/wp/');
+}
diff --git a/bedrock/config/environments/development.php b/bedrock/config/environments/development.php
new file mode 100644
index 00000000..87063987
--- /dev/null
+++ b/bedrock/config/environments/development.php
@@ -0,0 +1,20 @@
+
+
+ Roots Coding Standards
+
+
+ .
+
+
+
+
+
+ web/wp
+ web/app/themes/twentytwentytwo/
+ vendor/
+
+
+
+
+
+
+
+
+
+
diff --git a/bedrock/web/app/mu-plugins/bedrock-autoloader.php b/bedrock/web/app/mu-plugins/bedrock-autoloader.php
new file mode 100644
index 00000000..646f4a8e
--- /dev/null
+++ b/bedrock/web/app/mu-plugins/bedrock-autoloader.php
@@ -0,0 +1,16 @@
+ table {
+ margin: 0 0 8px;
+}
+
+.repeater > table.acf-input-table > tbody > tr > td.field {
+ padding: 8px;
+}
+
+.repeater > table > thead > tr > th:last-child {
+ border-right: 0 none;
+}
+
+.repeater > table > tbody > tr > td.remove > a.acf-button-add,
+.repeater > table > tbody > tr > td.remove > a.acf-button-remove {
+ position: absolute;
+
+ -webkit-transition: opacity 0.25s 0s ease-in-out, visibility 0s linear 0.25s;
+ -moz-transition: opacity 0.25s 0s ease-in-out, visibility 0s linear 0.25s;
+ -o-transition: opacity 0.25s 0s ease-in-out, visibility 0s linear 0.25s;
+ transition: opacity 0.25s 0s ease-in-out, visibility 0s linear 0.25s;
+
+ visibility: hidden;
+ opacity: 0;
+}
+
+.repeater > table > tbody > tr > td.remove > a.acf-button-remove {
+ position: relative;
+}
+
+.repeater > table > tbody > tr:hover > td.remove > a.acf-button-add,
+.repeater > table > tbody > tr:hover > td.remove > a.acf-button-remove {
+
+ -webkit-transition-delay:0s;
+ -moz-transition-delay:0s;
+ -o-transition-delay:0s;
+ transition-delay:0s;
+
+ visibility: visible;
+ opacity: 1;
+}
+
+.repeater.disabled > table > tbody > tr:hover > td.remove > a.acf-button-add {
+ visibility: hidden !important;
+}
+
+.repeater > table > thead > tr > th.order,
+.repeater > table > tbody > tr > td.order{
+ width: 16px !important;
+ text-align: center !important;
+ vertical-align: middle;
+ color: #aaa;
+ text-shadow: #fff 0 1px 0;
+
+ cursor: move;
+}
+
+.repeater > table > tbody > tr > td.order {
+ border-right-color: #E1E1E1;
+ background: #f4f4f4;
+}
+
+.repeater > table > tbody > tr > td.remove {
+ background: #F9F9F9;
+}
+
+
+.repeater > table > thead > tr > th.order:hover,
+.repeater > table > tbody > tr > td.order:hover {
+ color: #666;
+}
+
+.repeater > table > thead > tr > th.remove,
+.repeater > table > tbody > tr > td.remove{
+ width: 16px !important;
+ vertical-align: middle;
+}
+
+.repeater tr.row-clone {
+ display: none !important;
+}
+
+.repeater > table > tbody > tr.ui-sortable-helper {
+ box-shadow: 0 1px 5px rgba(0,0,0,0.2);
+}
+
+.repeater > table > tbody > tr.ui-sortable-placeholder {
+ visibility: visible !important;
+}
+
+.repeater > table > tbody > tr.ui-sortable-placeholder td {
+ border: 0 none !important;
+ box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
+ background: rgba(0,0,0,0.075);
+}
+
+
+/*
+* Empty
+*/
+
+.repeater.empty table thead th {
+ border-bottom: 0 none;
+}
+
+.repeater.empty table.row_layout {
+ box-shadow: none;
+ border: 0 none;
+ margin: 0;
+}
+
+
+/*
+* Conditiona Logic
+*/
+
+
+
+
+/*---------------------------------------------------------------------------------------------
+*
+* Everythign Field fixes
+*
+*---------------------------------------------------------------------------------------------*/
+
+.media-item .describe .repeater > table > thead > tr > th {
+ width: auto;
+}
diff --git a/bedrock/web/app/plugins/acf-repeater/4/js/field-group.js b/bedrock/web/app/plugins/acf-repeater/4/js/field-group.js
new file mode 100644
index 00000000..e7ed468c
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/4/js/field-group.js
@@ -0,0 +1,102 @@
+(function($){
+
+ var repeater = {
+
+ $el : null,
+
+ set : function( o ){
+
+ // merge in new option
+ $.extend( this, o );
+
+
+ // return this for chaining
+ return this;
+
+ },
+
+ init : function(){
+
+ this.render();
+
+ },
+
+ render : function(){
+
+ // vars
+ var id = this.$el.attr('data-id'),
+ layout = 'table';
+
+
+ // find layout value
+ if( this.$el.find('input[name="fields[' + id + '][layout]"]:checked').length > 0 )
+ {
+ layout = this.$el.find('input[name="fields[' + id + '][layout]"]:checked').val();
+ }
+
+
+ // add class
+ this.$el.find('.repeater:first').removeClass('layout-row layout-table').addClass( 'layout-' + layout );
+
+ }
+
+ };
+
+
+ /*
+ * Document Ready
+ *
+ * description
+ *
+ * @type function
+ * @date 18/08/13
+ *
+ * @param $post_id (int)
+ * @return $post_id (int)
+ */
+
+ $(document).ready(function(){
+
+ $('.field_type-repeater').each(function(){
+
+ repeater.set({ $el : $(this) }).init();
+
+ });
+
+ });
+
+
+ /*
+ * Events
+ *
+ * jQuery events for this field
+ *
+ * @type function
+ * @date 1/03/2011
+ *
+ * @param N/A
+ * @return N/A
+ */
+
+ $(document).on('click', '.field_option_repeater_layout input[type="radio"]', function( e ){
+
+ repeater.set({ $el : $(this).closest('.field_type-repeater') }).render();
+
+ });
+
+
+ $(document).on('acf/field_form-open', function(e, field){
+
+ // vars
+ $el = $(field);
+
+
+ if( $el.hasClass('field_type-repeater') )
+ {
+ repeater.set({ $el : $el }).render();
+ }
+
+ });
+
+
+})(jQuery);
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/4/js/input.js b/bedrock/web/app/plugins/acf-repeater/4/js/input.js
new file mode 100644
index 00000000..811ee2f5
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/4/js/input.js
@@ -0,0 +1,290 @@
+(function($){
+
+ /*
+ * Repeater
+ *
+ * static model for this field
+ *
+ * @type event
+ * @date 18/08/13
+ *
+ */
+
+ acf.fields.repeater = {
+
+ $el : null,
+
+ o : {},
+
+ set : function( o ){
+
+ // merge in new option
+ $.extend( this, o );
+
+
+ // find elements
+ //this.$input = this.$el.children('input[type="hidden"]');
+
+
+ // get options
+ this.o = acf.helpers.get_atts( this.$el );
+
+
+ // add row_count
+ this.o.row_count = this.$el.find('> table > tbody > tr.row').length;
+
+
+ // return this for chaining
+ return this;
+
+ },
+ init : function(){
+
+ // reference
+ var _this = this,
+ $el = this.$el;
+
+
+ // sortable
+ if( this.o.max_rows != 1 )
+ {
+ this.$el.find('> table > tbody').unbind('sortable').sortable({
+
+ items : '> tr.row',
+ handle : '> td.order',
+ helper : acf.helpers.sortable,
+ forceHelperSize : true,
+ forcePlaceholderSize : true,
+ scroll : true,
+
+ start : function (event, ui) {
+
+ $(document).trigger('acf/sortable_start', ui.item);
+ $(document).trigger('acf/sortable_start_repeater', ui.item);
+
+ // add markup to the placeholder
+ var td_count = ui.item.children('td').length;
+ ui.placeholder.html(' ');
+
+ },
+
+ stop : function (event, ui) {
+
+ $(document).trigger('acf/sortable_stop', ui.item);
+ $(document).trigger('acf/sortable_stop_repeater', ui.item);
+
+
+ // render
+ _this.set({ $el : $el }).render();
+
+ }
+ });
+ }
+
+
+ // render
+ this.render();
+
+ },
+ render : function(){
+
+ // update row_count
+ this.o.row_count = this.$el.find('> table > tbody > tr.row').length;
+
+
+ // update order numbers
+ this.$el.find('> table > tbody > tr.row').each(function(i){
+
+ $(this).children('td.order').html( i+1 );
+
+ });
+
+
+ // empty?
+ if( this.o.row_count == 0 )
+ {
+ this.$el.addClass('empty');
+ }
+ else
+ {
+ this.$el.removeClass('empty');
+ }
+
+
+ // row limit reached
+ if( this.o.row_count >= this.o.max_rows )
+ {
+ this.$el.addClass('disabled');
+ this.$el.find('> .repeater-footer .acf-button').addClass('disabled');
+ }
+ else
+ {
+ this.$el.removeClass('disabled');
+ this.$el.find('> .repeater-footer .acf-button').removeClass('disabled');
+ }
+
+ },
+ add : function( $before ){
+
+
+ // validate
+ if( this.o.row_count >= this.o.max_rows )
+ {
+ alert( acf.l10n.repeater.max.replace('{max}', this.o.max_rows) );
+ return false;
+ }
+
+
+ // create and add the new field
+ var new_id = acf.helpers.uniqid(),
+ new_field_html = this.$el.find('> table > tbody > tr.row-clone').html().replace(/(=["]*[\w-\[\]]*?)(acfcloneindex)/g, '$1' + new_id),
+ new_field = $(' ').append( new_field_html );
+
+
+ // add row
+ if( ! $before )
+ {
+ $before = this.$el.find('> table > tbody > .row-clone');
+ }
+
+ $before.before( new_field );
+
+
+ // trigger mouseenter on parent repeater to work out css margin on add-row button
+ this.$el.closest('tr').trigger('mouseenter');
+
+
+ // update order
+ this.render();
+
+
+ // setup fields
+ $(document).trigger('acf/setup_fields', new_field);
+
+
+ // validation
+ this.$el.closest('.field').removeClass('error');
+
+ },
+ remove : function( $tr ){
+
+ // refernce
+ var _this = this;
+
+
+ // validate
+ if( this.o.row_count <= this.o.min_rows )
+ {
+ alert( acf.l10n.repeater.min.replace('{min}', this.o.min_rows) );
+ return false;
+ }
+
+
+ // animate out tr
+ $tr.addClass('acf-remove-item');
+ setTimeout(function(){
+
+ $tr.remove();
+
+
+ // trigger mouseenter on parent repeater to work out css margin on add-row button
+ _this.$el.closest('tr').trigger('mouseenter');
+
+
+ // render
+ _this.render();
+
+ }, 400);
+
+ }
+
+
+ };
+
+
+ /*
+ * acf/setup_fields
+ *
+ * run init function on all elements for this field
+ *
+ * @type event
+ * @date 20/07/13
+ *
+ * @param {object} e event object
+ * @param {object} el DOM object which may contain new ACF elements
+ * @return N/A
+ */
+
+ $(document).on('acf/setup_fields', function(e, el){
+
+ $(el).find('.repeater').each(function(){
+
+ acf.fields.repeater.set({ $el : $(this) }).init();
+
+ });
+
+ });
+
+
+ /*
+ * Events
+ *
+ * jQuery events for this field
+ *
+ * @type function
+ * @date 1/03/2011
+ *
+ * @param N/A
+ * @return N/A
+ */
+
+ $(document).on('click', '.repeater .repeater-footer .add-row-end', function( e ){
+
+ e.preventDefault();
+
+ acf.fields.repeater.set({ $el : $(this).closest('.repeater') }).add( false );
+
+ $(this).blur();
+
+ });
+
+ $(document).on('click', '.repeater td.remove .add-row-before', function( e ){
+
+ e.preventDefault();
+
+ acf.fields.repeater.set({ $el : $(this).closest('.repeater') }).add( $(this).closest('tr') );
+
+ $(this).blur();
+
+ });
+
+ $(document).on('click', '.repeater td.remove .acf-button-remove', function( e ){
+
+ e.preventDefault();
+
+ acf.fields.repeater.set({ $el : $(this).closest('.repeater') }).remove( $(this).closest('tr') );
+
+ $(this).blur();
+
+ });
+
+ $(document).on('mouseenter', '.repeater tr.row', function( e ){
+
+ // vars
+ var $el = $(this).find('> td.remove > a.acf-button-add'),
+ margin = ( $el.parent().height() / 2 ) + 9; // 9 = padding + border
+
+
+ // css
+ $el.css('margin-top', '-' + margin + 'px' );
+
+ });
+
+ $(document).on('acf/conditional_logic/show acf/conditional_logic/hide', function( e, $target, item ){
+
+ $target.closest('tr.row').trigger('mouseenter');
+
+ });
+
+
+})(jQuery);
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/4/repeater.php b/bedrock/web/app/plugins/acf-repeater/4/repeater.php
new file mode 100644
index 00000000..b79559d6
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/4/repeater.php
@@ -0,0 +1,431 @@
+name = 'repeater';
+ $this->label = __("Repeater",'acf');
+ $this->category = __("Layout",'acf');
+ $this->defaults = array(
+ 'sub_fields' => array(),
+ 'row_min' => 0,
+ 'row_limit' => 0,
+ 'layout' => 'table',
+ 'button_label' => __("Add Row",'acf'),
+ );
+ $this->l10n = array(
+ 'min' => __("Minimum rows reached ( {min} rows )",'acf'),
+ 'max' => __("Maximum rows reached ( {max} rows )",'acf'),
+ );
+
+
+ // do not delete!
+ parent::__construct();
+
+
+ // settings
+ $this->settings = array(
+ 'path' => apply_filters('acf/helpers/get_path', __FILE__),
+ 'dir' => apply_filters('acf/helpers/get_dir', __FILE__),
+ 'version' => '1.1.1'
+ );
+
+
+ }
+
+
+ /*
+ * input_admin_enqueue_scripts()
+ *
+ * This action is called in the admin_enqueue_scripts action on the edit screen where your field is created.
+ * Use this action to add css + javascript to assist your create_field() action.
+ *
+ * $info http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts
+ * @type action
+ * @since 3.6
+ * @date 23/01/13
+ */
+
+ function input_admin_enqueue_scripts()
+ {
+ // register acf scripts
+ wp_register_script( 'acf-input-repeater', $this->settings['dir'] . 'js/input.js', array('acf-input'), $this->settings['version'] );
+ wp_register_style( 'acf-input-repeater', $this->settings['dir'] . 'css/input.css', array('acf-input'), $this->settings['version'] );
+
+
+ // scripts
+ wp_enqueue_script(array(
+ 'acf-input-repeater',
+ ));
+
+ // styles
+ wp_enqueue_style(array(
+ 'acf-input-repeater',
+ ));
+
+ }
+
+
+ /*
+ * field_group_admin_enqueue_scripts()
+ *
+ * This action is called in the admin_enqueue_scripts action on the edit screen where your field is edited.
+ * Use this action to add css + javascript to assist your create_field_options() action.
+ *
+ * $info http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts
+ * @type action
+ * @since 3.6
+ * @date 23/01/13
+ */
+
+ function field_group_admin_enqueue_scripts()
+ {
+ wp_register_script( 'acf-field-group-repeater', $this->settings['dir'] . 'js/field-group.js', array('acf-field-group'), $this->settings['version']);
+
+ // scripts
+ wp_enqueue_script(array(
+ 'acf-field-group-repeater',
+ ));
+ }
+
+
+ /*
+ * load_field()
+ *
+ * This filter is appied to the $field after it is loaded from the database
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $field - the field array holding all the field options
+ *
+ * @return $field - the field array holding all the field options
+ */
+
+ function load_field( $field )
+ {
+ // apply_load field to all sub fields
+ if( isset($field['sub_fields']) && is_array($field['sub_fields']) )
+ {
+ foreach( $field['sub_fields'] as $k => $sub_field )
+ {
+ // apply filters
+ $sub_field = apply_filters('acf/load_field_defaults', $sub_field);
+
+
+ // apply filters
+ foreach( array('type', 'name', 'key') as $key )
+ {
+ // run filters
+ $sub_field = apply_filters('acf/load_field/' . $key . '=' . $sub_field[ $key ], $sub_field); // new filter
+ }
+
+
+ // update sub field
+ $field['sub_fields'][ $k ] = $sub_field;
+ }
+ }
+
+
+ // return
+ return $field;
+ }
+
+
+ /*
+ * create_field()
+ *
+ * Create the HTML interface for your field
+ *
+ * @param $field - an array holding all the field's data
+ *
+ * @type action
+ * @since 3.6
+ * @date 23/01/13
+ */
+
+ function create_field( $field )
+ {
+ include( $this->settings['path'] . 'views/field.php' );
+ }
+
+
+ /*
+ * create_options()
+ *
+ * Create extra options for your field. This is rendered when editing a field.
+ * The value of $field['name'] can be used (like bellow) to save extra data to the $field
+ *
+ * @type action
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $field - an array holding all the field's data
+ */
+
+ function create_options( $field )
+ {
+ include( $this->settings['path'] . 'views/options.php' );
+ }
+
+
+ /*
+ * update_value()
+ *
+ * This filter is appied to the $value before it is updated in the db
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $value - the value which will be saved in the database
+ * @param $field - the field array holding all the field options
+ * @param $post_id - the $post_id of which the value will be saved
+ *
+ * @return $value - the modified value
+ */
+
+ function update_value( $value, $post_id, $field )
+ {
+ $total = 0;
+
+ if( $value )
+ {
+ // remove dummy field
+ unset( $value['acfcloneindex'] );
+
+ $i = -1;
+
+ // loop through rows
+ foreach( $value as $row )
+ {
+ $i++;
+
+ // increase total
+ $total++;
+
+ // loop through sub fields
+ foreach( $field['sub_fields'] as $sub_field )
+ {
+ // get sub field data
+ $v = isset( $row[$sub_field['key']] ) ? $row[$sub_field['key']] : false;
+
+ // update full name
+ $sub_field['name'] = $field['name'] . '_' . $i . '_' . $sub_field['name'];
+
+ // save sub field value
+ do_action('acf/update_value', $v, $post_id, $sub_field );
+
+ }
+ }
+ }
+
+
+ /*
+ * Remove Old Data
+ *
+ * @credit: http://support.advancedcustomfields.com/discussion/1994/deleting-single-repeater-fields-does-not-remove-entry-from-database
+ */
+
+
+ $old_total = (int) apply_filters('acf/load_value', 0, $post_id, $field);
+
+ if( $old_total > $total )
+ {
+ for ( $j = $total; $j < $old_total; $j++ )
+ {
+ foreach( $field['sub_fields'] as $sub_field )
+ {
+ do_action('acf/delete_value', $post_id, $field['name'] . '_' . $j . '_' . $sub_field['name'] );
+ }
+ }
+ }
+
+
+
+
+ // update $value and return to allow for the normal save function to run
+ $value = $total;
+
+
+ return $value;
+ }
+
+
+ /*
+ * update_field()
+ *
+ * This filter is appied to the $field before it is saved to the database
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $field - the field array holding all the field options
+ * @param $post_id - the field group ID (post_type = acf)
+ *
+ * @return $field - the modified field
+ */
+
+ function update_field( $field, $post_id )
+ {
+ // format sub_fields
+ if( $field['sub_fields'] )
+ {
+ // remove dummy field
+ unset( $field['sub_fields']['field_clone'] );
+
+
+ // loop through and save fields
+ $i = -1;
+ $sub_fields = array();
+
+
+ foreach( $field['sub_fields'] as $key => $f )
+ {
+ $i++;
+
+
+ // order
+ $f['order_no'] = $i;
+ $f['key'] = $key;
+
+
+ // save
+ $f = apply_filters('acf/update_field/type=' . $f['type'], $f, $post_id ); // new filter
+
+
+ // add
+ $sub_fields[] = $f;
+ }
+
+
+ // update sub fields
+ $field['sub_fields'] = $sub_fields;
+
+ }
+
+
+ // return updated repeater field
+ return $field;
+ }
+
+
+ /*
+ * format_value()
+ *
+ * This filter is appied to the $value after it is loaded from the db and before it is passed to the create_field action
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $value - the value which was loaded from the database
+ * @param $post_id - the $post_id from which the value was loaded
+ * @param $field - the field array holding all the field options
+ *
+ * @return $value - the modified value
+ */
+
+ function format_value( $value, $post_id, $field )
+ {
+ // vars
+ $values = array();
+
+
+ if( $value > 0 )
+ {
+ // loop through rows
+ for($i = 0; $i < $value; $i++)
+ {
+ // loop through sub fields
+ foreach( $field['sub_fields'] as $sub_field )
+ {
+ // update full name
+ $key = $sub_field['key'];
+ $sub_field['name'] = $field['name'] . '_' . $i . '_' . $sub_field['name'];
+
+ $v = apply_filters('acf/load_value', false, $post_id, $sub_field);
+ $v = apply_filters('acf/format_value', $v, $post_id, $sub_field);
+
+ $values[ $i ][ $key ] = $v;
+
+ }
+ }
+ }
+
+
+ // return
+ return $values;
+ }
+
+
+ /*
+ * format_value_for_api()
+ *
+ * This filter is appied to the $value after it is loaded from the db and before it is passed back to the api functions such as the_field
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $value - the value which was loaded from the database
+ * @param $post_id - the $post_id from which the value was loaded
+ * @param $field - the field array holding all the field options
+ *
+ * @return $value - the modified value
+ */
+
+ function format_value_for_api( $value, $post_id, $field )
+ {
+ // vars
+ $values = array();
+
+
+ if( $value > 0 )
+ {
+ // loop through rows
+ for($i = 0; $i < $value; $i++)
+ {
+ // loop through sub fields
+ foreach( $field['sub_fields'] as $sub_field )
+ {
+ // update full name
+ $key = $sub_field['name'];
+ $sub_field['name'] = $field['name'] . '_' . $i . '_' . $sub_field['name'];
+
+ $v = apply_filters('acf/load_value', false, $post_id, $sub_field);
+ $v = apply_filters('acf/format_value_for_api', $v, $post_id, $sub_field);
+
+ $values[ $i ][ $key ] = $v;
+
+ }
+ }
+ }
+
+
+ // return
+ return $values;
+ }
+
+}
+
+new acf_field_repeater();
+
+?>
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/4/views/field.php b/bedrock/web/app/plugins/acf-repeater/4/views/field.php
new file mode 100644
index 00000000..890f7f0b
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/4/views/field.php
@@ -0,0 +1,306 @@
+ count($field['value']) )
+{
+ for( $i = 0; $i < $field['row_min']; $i++ )
+ {
+ // already have a value? continue...
+ if( isset($field['value'][$i]) )
+ {
+ continue;
+ }
+
+
+ // populate values
+ $field['value'][ $i ] = array();
+
+
+ foreach( $field['sub_fields'] as $sub_field)
+ {
+ $sub_value = false;
+
+ if( !empty($sub_field['default_value']) )
+ {
+ $sub_value = $sub_field['default_value'];
+ }
+
+ $field['value'][ $i ][ $sub_field['key'] ] = $sub_value;
+ }
+
+ }
+}
+
+
+// max rows
+$row_count = count($field['value']);
+if( $row_count > $field['row_limit'] )
+{
+ for( $i = 0; $i < $row_count; $i++ )
+ {
+ if( $i >= $field['row_limit'] )
+ {
+ unset( $field['value'][ $i ] );
+ }
+ }
+}
+
+
+// setup values for row clone
+$field['value']['acfcloneindex'] = array();
+foreach( $field['sub_fields'] as $sub_field )
+{
+ $sub_value = false;
+
+ if( isset($sub_field['default_value']) )
+ {
+ $sub_value = $sub_field['default_value'];
+ }
+
+
+ $field['value']['acfcloneindex'][ $sub_field['key'] ] = $sub_value;
+}
+
+
+// helper function which does not exist yet in acf
+if( !function_exists('acf_get_join_attr') ):
+
+function acf_get_join_attr( $attributes = false )
+{
+ // validate
+ if( empty($attributes) )
+ {
+ return '';
+ }
+
+
+ // vars
+ $e = array();
+
+
+ // loop through and render
+ foreach( $attributes as $k => $v )
+ {
+ $e[] = $k . '="' . esc_attr( $v ) . '"';
+ }
+
+
+ // echo
+ return implode(' ', $e);
+}
+
+endif;
+
+if( !function_exists('acf_join_attr') ):
+
+function acf_join_attr( $attributes = false )
+{
+ echo acf_get_join_attr( $attributes );
+}
+
+endif;
+
+?>
+
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/4/views/options.php b/bedrock/web/app/plugins/acf-repeater/4/views/options.php
new file mode 100644
index 00000000..ac62e93f
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/4/views/options.php
@@ -0,0 +1,386 @@
+ 'field_clone',
+ 'label' => __("New Field",'acf'),
+ 'name' => __("new_field",'acf'),
+ 'type' => 'text',
+));
+
+
+// get name of all fields for use in field type drop down
+$fields_names = apply_filters('acf/registered_fields', array());
+unset( $fields_names[ __("Layout",'acf') ]['tab'] );
+
+
+// conditional logic dummy data
+$conditional_logic_rule = array(
+ 'field' => '',
+ 'operator' => '==',
+ 'value' => ''
+);
+
+
+?>
+
+
+
+
+
+
+
+
+
+
1){ echo 'style="display:none;"'; } ?>>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'text',
+ 'name' => 'fields['.$key.'][row_min]',
+ 'value' => $field['row_min'],
+ ));
+ ?>
+
+
+
+
+
+
+
+ 'text',
+ 'name' => 'fields['.$key.'][row_limit]',
+ 'value' => $field['row_limit'],
+ ));
+ ?>
+
+
+
+
+
+
+
+ 'radio',
+ 'name' => 'fields['.$key.'][layout]',
+ 'value' => $field['layout'],
+ 'layout' => 'horizontal',
+ 'choices' => array(
+ 'table' => __("Table",'acf'),
+ 'row' => __("Row",'acf')
+ )
+ ));
+ ?>
+
+
+
+
+
+
+
+ 'text',
+ 'name' => 'fields['.$key.'][button_label]',
+ 'value' => $field['button_label'],
+ ));
+ ?>
+
+
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/5/css/input.css b/bedrock/web/app/plugins/acf-repeater/5/css/input.css
new file mode 100644
index 00000000..5a656b84
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/5/css/input.css
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------------------------
+*
+* Repeater
+*
+*---------------------------------------------------------------------------------------------*/
+.acf-repeater {
+ /* table */
+ /* row handle (add/remove) */
+ /* add in spacer to th (force correct width) */
+ /* row */
+ /* sortable */
+ /* layouts */
+ /*
+ &.-row > table > tbody > tr:before,
+ &.-block > table > tbody > tr:before {
+ content: "";
+ display: table-row;
+ height: 2px;
+ background: #f00;
+ }
+*/
+ /* empty */
+ /* collapsed */
+ /* collapsed (block layout) */
+ /* collapsed (table layout) */
+}
+.acf-repeater > table {
+ margin: 0 0 8px;
+ background: #F9F9F9;
+}
+.acf-repeater .acf-row-handle {
+ width: 16px;
+ text-align: center !important;
+ vertical-align: middle !important;
+ position: relative;
+ /* icons */
+ /* .order */
+ /* remove */
+}
+.acf-repeater .acf-row-handle .acf-icon {
+ display: none;
+ position: absolute;
+ top: 0;
+ margin: -8px 0 0 -2px;
+ /* minus icon */
+}
+.acf-repeater .acf-row-handle .acf-icon.-minus {
+ top: 50%;
+ /* ie fix */
+}
+body.browser-msie .acf-repeater .acf-row-handle .acf-icon.-minus {
+ top: 25px;
+}
+.acf-repeater .acf-row-handle.order {
+ background: #f4f4f4;
+ cursor: move;
+ color: #aaa;
+ text-shadow: #fff 0 1px 0;
+}
+.acf-repeater .acf-row-handle.order:hover {
+ color: #666;
+}
+.acf-repeater .acf-row-handle.order + td {
+ border-left-color: #DFDFDF;
+}
+.acf-repeater .acf-row-handle.remove {
+ background: #F9F9F9;
+ border-left-color: #DFDFDF;
+}
+.acf-repeater th.acf-row-handle:before {
+ content: "";
+ width: 16px;
+ display: block;
+ height: 1px;
+}
+.acf-repeater .acf-row {
+ /* hide clone */
+ /* hover */
+}
+.acf-repeater .acf-row.acf-clone {
+ display: none !important;
+}
+.acf-repeater .acf-row:hover,
+.acf-repeater .acf-row.-hover {
+ /* icons */
+}
+.acf-repeater .acf-row:hover > .acf-row-handle .acf-icon,
+.acf-repeater .acf-row.-hover > .acf-row-handle .acf-icon {
+ display: block;
+}
+.acf-repeater > table > tbody > tr.ui-sortable-helper {
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);
+}
+.acf-repeater > table > tbody > tr.ui-sortable-placeholder {
+ visibility: visible !important;
+}
+.acf-repeater > table > tbody > tr.ui-sortable-placeholder td {
+ background: #F9F9F9;
+}
+.acf-repeater.-row > table > tbody > tr > td,
+.acf-repeater.-block > table > tbody > tr > td {
+ border-top-color: #E1E1E1;
+}
+.acf-repeater.-empty > table {
+ border-bottom: 0 none;
+}
+.acf-repeater.-empty.-row > table,
+.acf-repeater.-empty.-block > table {
+ display: none;
+}
+.acf-repeater .acf-row.-collapsed > .acf-field {
+ display: none !important;
+}
+.acf-repeater .acf-row.-collapsed > td.acf-field.-collapsed-target {
+ display: table-cell !important;
+}
+.acf-repeater .acf-row.-collapsed > .acf-fields > * {
+ display: none !important;
+}
+.acf-repeater .acf-row.-collapsed > .acf-fields > .acf-field.-collapsed-target {
+ display: block !important;
+}
+.acf-repeater.-table .acf-row.-collapsed .acf-field.-collapsed-target {
+ border-left-color: #dfdfdf;
+}
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/5/js/field-group.js b/bedrock/web/app/plugins/acf-repeater/5/js/field-group.js
new file mode 100644
index 00000000..2c026339
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/5/js/field-group.js
@@ -0,0 +1,105 @@
+(function($){
+
+ /*
+ * Repeater
+ *
+ * This field type requires some extra logic for its settings
+ *
+ * @type function
+ * @date 24/10/13
+ * @since 5.0.0
+ *
+ * @param n/a
+ * @return n/a
+ */
+
+ var acf_settings_repeater = acf.field_group.field_object.extend({
+
+ type: 'repeater',
+
+ actions: {
+ 'render_settings': 'render'
+ },
+
+ events: {
+ 'change .acf-field-setting-layout input': '_change_layout',
+ 'focus .acf-field-setting-collapsed select': '_focus_collapsed'
+ },
+
+ focus: function(){
+
+ this.$fields = this.$field.find('.acf-field-list:first');
+
+ },
+
+ render: function(){
+
+ this.render_layout();
+ this.render_collapsed();
+
+ },
+
+ render_layout: function(){
+
+ // vars
+ var layout = this.setting('layout input:checked').val();
+
+
+ // update data
+ this.$fields.attr('data-layout', layout);
+
+ },
+
+ render_collapsed: function(){
+
+ // vars
+ var $select = this.setting('collapsed select');
+
+
+ // collapsed
+ var choices = [];
+
+
+ // keep 'null' choice
+ choices.push({
+ 'label': $select.find('option[value=""]').text(),
+ 'value': ''
+ });
+
+
+ // loop
+ this.$fields.children('.acf-field-object').each(function(){
+
+ // vars
+ var $field = $(this);
+
+
+ // append
+ choices.push({
+ 'label': $field.find('.field-label:first').val(),
+ 'value': $field.attr('data-key')
+ });
+
+ });
+
+
+ // render
+ acf.render_select( $select, choices );
+
+ },
+
+ _change_layout: function( e ){
+
+ this.render_layout();
+
+ },
+
+ _focus_collapsed: function( e ){
+
+ this.render_collapsed();
+
+ }
+
+ });
+
+})(jQuery);
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/5/js/input.js b/bedrock/web/app/plugins/acf-repeater/5/js/input.js
new file mode 100644
index 00000000..140dfa30
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/5/js/input.js
@@ -0,0 +1,374 @@
+(function($){
+
+ acf.fields.repeater = acf.field.extend({
+
+ type: 'repeater',
+ $el: null,
+ $input: null,
+ $table: null,
+ $tbody: null,
+ $clone: null,
+
+ actions: {
+ 'ready': 'initialize',
+ 'append': 'initialize',
+ 'show': 'show'
+ },
+
+ events: {
+ 'click a[data-event="add-row"]': '_add',
+ 'click a[data-event="remove-row"]': '_remove',
+ 'click a[data-event="collapse-row"]': '_collapse',
+ 'mouseenter td.order': '_mouseenter'
+ },
+
+ focus: function(){
+
+ // vars
+ this.$el = this.$field.find('.acf-repeater:first');
+ this.$input = this.$field.find('input:first');
+ this.$table = this.$field.find('table:first');
+ this.$tbody = this.$table.children('tbody');
+ this.$clone = this.$tbody.children('tr.acf-clone');
+
+
+ // get options
+ this.o = acf.get_data(this.$el, {
+ 'min': 0,
+ 'max': 0
+ });
+
+
+ // min / max
+ this.o.min = parseInt(this.o.min);
+ this.o.max = parseInt(this.o.max);
+
+ },
+
+ initialize: function(){
+
+ // disable clone
+ acf.disable_form( this.$clone, 'repeater' );
+
+
+ // render
+ this.render();
+
+ },
+
+ show: function(){
+
+ this.$tbody.find('.acf-field:visible').each(function(){
+
+ acf.do_action('show_field', $(this));
+
+ });
+
+ },
+
+ count: function(){
+
+ return this.$tbody.children().length - 1;
+
+ },
+
+ render: function(){
+
+ // update order numbers
+ this.$tbody.children().each(function(i){
+
+ $(this).find('> td.order > span').html( i+1 );
+
+ });
+
+
+ // empty?
+ if( this.count() == 0 ) {
+
+ this.$el.addClass('-empty');
+
+ } else {
+
+ this.$el.removeClass('-empty');
+
+ }
+
+
+ // row limit reached
+ if( this.o.max > 0 && this.count() >= this.o.max ) {
+
+ this.$el.find('> .acf-actions .button').addClass('disabled');
+
+ } else {
+
+ this.$el.find('> .acf-actions .button').removeClass('disabled');
+
+ }
+
+ },
+
+ add: function( $tr ){
+
+ // defaults
+ $tr = $tr || this.$clone;
+
+
+ // validate
+ if( this.o.max > 0 && this.count() >= this.o.max ) {
+
+ alert( acf._e('repeater','max').replace('{max}', this.o.max) );
+ return false;
+
+ }
+
+
+ // reference
+ var $field = this.$field;
+
+
+ // duplicate
+ $el = acf.duplicate( this.$clone );
+
+
+ // remove clone class
+ $el.removeClass('acf-clone');
+
+
+ // enable
+ acf.enable_form( $el, 'repeater' );
+
+
+ // move row
+ $tr.before( $el );
+
+
+ // focus (may have added sub repeater)
+ this.doFocus($field);
+
+
+ // update order
+ this.render();
+
+
+ // validation
+ acf.validation.remove_error( this.$field );
+
+
+ // sync collapsed order
+ this.sync();
+
+
+ // return
+ return $el;
+
+ },
+
+ remove: function( $tr ){
+
+ // reference
+ var self = this;
+
+
+ // validate
+ if( this.count() <= this.o.min ) {
+
+ alert( acf._e('repeater','min').replace('{min}', this.o.min) );
+ return false;
+ }
+
+
+ // action for 3rd party customization
+ acf.do_action('remove', $tr);
+
+
+ // animate out tr
+ acf.remove_tr( $tr, function(){
+
+ // trigger change to allow attachment save
+ self.$input.trigger('change');
+
+
+ // render
+ self.render();
+
+
+ // sync collapsed order
+ self.sync();
+
+
+ // refersh field (hide/show columns)
+ acf.do_action('refresh', self.$field);
+
+ });
+
+ },
+
+ sync: function(){
+
+ // vars
+ var name = 'collapsed_' + this.$field.data('key'),
+ collapsed = [];
+
+
+ // populate collapsed value
+ this.$tbody.children().each(function( i ){
+
+ if( $(this).hasClass('-collapsed') ) {
+
+ collapsed.push( i );
+
+ }
+
+ });
+
+
+ // update
+ acf.update_user_setting( name, collapsed.join(',') );
+
+ },
+
+
+ /*
+ * events
+ *
+ * these functions are fired for this fields events
+ *
+ * @type function
+ * @date 17/09/2015
+ * @since 5.2.3
+ *
+ * @param e
+ * @return n/a
+ */
+
+ _mouseenter: function( e ){ //console.log('_mouseenter');
+
+ // bail early if already sortable
+ if( this.$tbody.hasClass('ui-sortable') ) return;
+
+
+ // bail early if max 1 row
+ if( this.o.max == 1 ) return;
+
+
+ // reference
+ var self = this;
+
+
+ // add sortable
+ this.$tbody.sortable({
+ items: '> tr',
+ handle: '> td.order',
+ forceHelperSize: true,
+ forcePlaceholderSize: true,
+ scroll: true,
+ start: function(event, ui) {
+
+ acf.do_action('sortstart', ui.item, ui.placeholder);
+
+ },
+ stop: function(event, ui) {
+
+ // render
+ self.render();
+
+ acf.do_action('sortstop', ui.item, ui.placeholder);
+
+ },
+ update: function(event, ui) {
+
+ // trigger change
+ self.$input.trigger('change');
+
+ }
+
+ });
+
+ },
+
+ _add: function( e ){ //console.log('_add');
+
+ // vars
+ $row = false;
+
+
+ // row add
+ if( e.$el.hasClass('acf-icon') ) {
+
+ $row = e.$el.closest('.acf-row');
+
+ }
+
+
+ // add
+ this.add( $row );
+
+ },
+
+ _remove: function( e ){ //console.log('_remove');
+
+ // reference
+ var self = this;
+
+
+ // vars
+ var $row = e.$el.closest('.acf-row');
+
+
+ // add -open class to show controlls
+ $row.addClass('-hover');
+
+
+ // confirm
+ acf.tooltip.confirm_remove( e.$el, function( result ){
+
+ $row.removeClass('-hover');
+
+ if( result ) {
+
+ self.remove( $row );
+
+ }
+
+ });
+
+ },
+
+ _collapse: function( e ){ //console.log('_collapse');
+
+ // vars
+ var $tr = e.$el.closest('.acf-row');
+
+
+ // reference
+ var $field = this.$field;
+
+
+ // open row
+ if( $tr.hasClass('-collapsed') ) {
+
+ $tr.removeClass('-collapsed');
+
+ acf.do_action('show', $tr, 'collapse');
+
+ } else {
+
+ $tr.addClass('-collapsed');
+
+ acf.do_action('hide', $tr, 'collapse');
+
+ }
+
+
+ // sync
+ this.set('$field', $field).sync();
+
+
+ // refersh field (hide/show columns)
+ acf.do_action('refresh', this.$field);
+
+ }
+
+ });
+
+})(jQuery);
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/5/repeater.php b/bedrock/web/app/plugins/acf-repeater/5/repeater.php
new file mode 100644
index 00000000..619ec823
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/5/repeater.php
@@ -0,0 +1,1174 @@
+name = 'repeater';
+ $this->label = __("Repeater",'acf');
+ $this->category = 'layout';
+ $this->defaults = array(
+ 'sub_fields' => array(),
+ 'min' => 0,
+ 'max' => 0,
+ 'layout' => 'table',
+ 'button_label' => '',
+ 'collapsed' => ''
+ );
+ $this->l10n = array(
+ 'min' => __("Minimum rows reached ({min} rows)",'acf'),
+ 'max' => __("Maximum rows reached ({max} rows)",'acf'),
+ );
+
+
+ // field filters
+ $this->add_field_filter('acf/prepare_field_for_export', array($this, 'prepare_field_for_export'));
+ $this->add_field_filter('acf/prepare_field_for_import', array($this, 'prepare_field_for_import'));
+
+
+ // filters
+ $this->add_filter('acf/validate_field', array($this, 'validate_any_field'));
+
+ }
+
+
+ /*
+ * input_admin_enqueue_scripts
+ *
+ * description
+ *
+ * @type function
+ * @date 16/12/2015
+ * @since 5.3.2
+ *
+ * @param $post_id (int)
+ * @return $post_id (int)
+ */
+
+ function input_admin_enqueue_scripts() {
+
+ wp_enqueue_script( 'acf-input-repeater', acf_get_external_dir(__FILE__, 'js/input.js'), array('acf-input'), '2.0.0' );
+ wp_enqueue_style( 'acf-input-repeater', acf_get_external_dir(__FILE__, 'css/input.css'), array('acf-input'), '2.0.0' );
+
+ }
+
+
+ /*
+ * field_group_admin_enqueue_scripts
+ *
+ * description
+ *
+ * @type function
+ * @date 16/12/2015
+ * @since 5.3.2
+ *
+ * @param $post_id (int)
+ * @return $post_id (int)
+ */
+
+ function field_group_admin_enqueue_scripts() {
+
+ wp_enqueue_script( 'acf-field-group-repeater', acf_get_external_dir(__FILE__, 'js/field-group.js'), array('acf-field-group'), '2.0.0' );
+
+ }
+
+
+ /*
+ * load_field()
+ *
+ * This filter is appied to the $field after it is loaded from the database
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $field - the field array holding all the field options
+ *
+ * @return $field - the field array holding all the field options
+ */
+
+ function load_field( $field ) {
+
+ // min/max
+ $field['min'] = (int) $field['min'];
+ $field['max'] = (int) $field['max'];
+
+
+ // vars
+ $sub_fields = acf_get_fields( $field );
+
+
+ // append
+ if( $sub_fields ) {
+
+ $field['sub_fields'] = $sub_fields;
+
+ }
+
+
+ // return
+ return $field;
+
+ }
+
+
+ /*
+ * render_field()
+ *
+ * Create the HTML interface for your field
+ *
+ * @param $field - an array holding all the field's data
+ *
+ * @type action
+ * @since 3.6
+ * @date 23/01/13
+ */
+
+ function render_field( $field ) {
+
+ // vars
+ $sub_fields = $field['sub_fields'];
+ $show_order = true;
+ $show_add = true;
+ $show_remove = true;
+
+
+ // bail early if no sub fields
+ if( empty($sub_fields) ) return;
+
+
+ // value
+ $value = is_array($field['value']) ? $field['value'] : array();
+
+
+ // div
+ $div = array(
+ 'class' => 'acf-repeater',
+ 'data-min' => $field['min'],
+ 'data-max' => $field['max']
+ );
+
+
+ // empty
+ if( empty($value) ) {
+
+ $div['class'] .= ' -empty';
+
+ }
+
+
+ // If there are less values than min, populate the extra values
+ if( $field['min'] ) {
+
+ $value = array_pad($value, $field['min'], array());
+
+ }
+
+
+ // If there are more values than man, remove some values
+ if( $field['max'] ) {
+
+ $value = array_slice($value, 0, $field['max']);
+
+
+ // if max 1 row, don't show order
+ if( $field['max'] == 1 ) {
+
+ $show_order = false;
+
+ }
+
+
+ // if max == min, don't show add or remove buttons
+ if( $field['max'] <= $field['min'] ) {
+
+ $show_remove = false;
+ $show_add = false;
+
+ }
+
+ }
+
+
+ // setup values for row clone
+ $value['acfcloneindex'] = array();
+
+
+ // button label
+ if( $field['button_label'] === '' ) $field['button_label'] = __('Add Row', 'acf');
+
+
+ // field wrap
+ $el = 'td';
+ $before_fields = '';
+ $after_fields = '';
+
+ if( $field['layout'] == 'row' ) {
+
+ $el = 'div';
+ $before_fields = '';
+ $after_fields = ' ';
+
+ } elseif( $field['layout'] == 'block' ) {
+
+ $el = 'div';
+
+ $before_fields = '';
+ $after_fields = ' ';
+
+ }
+
+
+ // layout
+ $div['class'] .= ' -' . $field['layout'];
+
+
+ // hidden input
+ acf_hidden_input(array(
+ 'type' => 'hidden',
+ 'name' => $field['name'],
+ ));
+
+
+ // collapsed
+ if( $field['collapsed'] ) {
+
+ // add target class
+ foreach( $sub_fields as $i => $sub_field ) {
+
+ // bail early if no match
+ if( $sub_field['key'] !== $field['collapsed'] ) continue;
+
+
+ // class
+ $sub_field['wrapper']['class'] .= ' -collapsed-target';
+
+
+ // update
+ $sub_fields[ $i ] = $sub_field;
+
+ }
+
+ }
+
+?>
+>
+
+
+
+
+
+
+
+
+
+
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $row ):
+
+ $row_class = 'acf-row';
+
+ if( $i === 'acfcloneindex' ) {
+
+ $row_class .= ' acf-clone';
+
+ } elseif( $field['collapsed'] && acf_is_row_collapsed($field['key'], $i) ) {
+
+ $row_class .= ' -collapsed';
+
+ }
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $field['sub_fields'],
+ 'parent' => $field['ID']
+ );
+
+
+ ?>
+
+
+
+
+
+
+
+
+ __('Collapsed','acf'),
+ 'instructions' => __('Select a sub field to show when row is collapsed','acf'),
+ 'type' => 'select',
+ 'name' => 'collapsed',
+ 'allow_null' => 1,
+ 'choices' => $choices
+ ));
+
+
+ // min
+ acf_render_field_setting( $field, array(
+ 'label' => __('Minimum Rows','acf'),
+ 'instructions' => '',
+ 'type' => 'number',
+ 'name' => 'min',
+ 'placeholder' => '0',
+ ));
+
+
+ // max
+ acf_render_field_setting( $field, array(
+ 'label' => __('Maximum Rows','acf'),
+ 'instructions' => '',
+ 'type' => 'number',
+ 'name' => 'max',
+ 'placeholder' => '0',
+ ));
+
+
+ // layout
+ acf_render_field_setting( $field, array(
+ 'label' => __('Layout','acf'),
+ 'instructions' => '',
+ 'class' => 'acf-repeater-layout',
+ 'type' => 'radio',
+ 'name' => 'layout',
+ 'layout' => 'horizontal',
+ 'choices' => array(
+ 'table' => __('Table','acf'),
+ 'block' => __('Block','acf'),
+ 'row' => __('Row','acf')
+ )
+ ));
+
+
+ // button_label
+ acf_render_field_setting( $field, array(
+ 'label' => __('Button Label','acf'),
+ 'instructions' => '',
+ 'type' => 'text',
+ 'name' => 'button_label',
+ 'placeholder' => __('Add Row','acf')
+ ));
+
+ }
+
+
+ /*
+ * load_value()
+ *
+ * This filter is applied to the $value after it is loaded from the db
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $value (mixed) the value found in the database
+ * @param $post_id (mixed) the $post_id from which the value was loaded
+ * @param $field (array) the field array holding all the field options
+ * @return $value
+ */
+
+ function load_value( $value, $post_id, $field ) {
+
+ // bail early if no value
+ if( empty($value) ) return false;
+
+
+ // bail ealry if not numeric
+ if( !is_numeric($value) ) return false;
+
+
+ // bail early if no sub fields
+ if( empty($field['sub_fields']) ) return false;
+
+
+ // vars
+ $value = intval($value);
+ $rows = array();
+
+
+ // loop
+ for( $i = 0; $i < $value; $i++ ) {
+
+ // create empty array
+ $rows[ $i ] = array();
+
+
+ // loop through sub fields
+ foreach( array_keys($field['sub_fields']) as $j ) {
+
+ // get sub field
+ $sub_field = $field['sub_fields'][ $j ];
+
+
+ // bail ealry if no name (tab)
+ if( acf_is_empty($sub_field['name']) ) continue;
+
+
+ // update $sub_field name
+ $sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
+
+
+ // get value
+ $sub_value = acf_get_value( $post_id, $sub_field );
+
+
+ // add value
+ $rows[ $i ][ $sub_field['key'] ] = $sub_value;
+
+ }
+
+ }
+
+
+ // return
+ return $rows;
+
+ }
+
+
+ /*
+ * format_value()
+ *
+ * This filter is appied to the $value after it is loaded from the db and before it is returned to the template
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $value (mixed) the value which was loaded from the database
+ * @param $post_id (mixed) the $post_id from which the value was loaded
+ * @param $field (array) the field array holding all the field options
+ *
+ * @return $value (mixed) the modified value
+ */
+
+ function format_value( $value, $post_id, $field ) {
+
+ // bail early if no value
+ if( empty($value) ) return false;
+
+
+ // bail ealry if not array
+ if( !is_array($value) ) return false;
+
+
+ // bail early if no sub fields
+ if( empty($field['sub_fields']) ) return false;
+
+
+ // loop over rows
+ foreach( array_keys($value) as $i ) {
+
+ // loop through sub fields
+ foreach( array_keys($field['sub_fields']) as $j ) {
+
+ // get sub field
+ $sub_field = $field['sub_fields'][ $j ];
+
+
+ // bail ealry if no name (tab)
+ if( acf_is_empty($sub_field['name']) ) continue;
+
+
+ // extract value
+ $sub_value = acf_extract_var( $value[ $i ], $sub_field['key'] );
+
+
+ // update $sub_field name
+ $sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
+
+
+ // format value
+ $sub_value = acf_format_value( $sub_value, $post_id, $sub_field );
+
+
+ // append to $row
+ $value[ $i ][ $sub_field['_name'] ] = $sub_value;
+
+ }
+
+ }
+
+
+ // return
+ return $value;
+
+ }
+
+
+ /*
+ * validate_value
+ *
+ * description
+ *
+ * @type function
+ * @date 11/02/2014
+ * @since 5.0.0
+ *
+ * @param $post_id (int)
+ * @return $post_id (int)
+ */
+
+ function validate_value( $valid, $value, $field, $input ){
+
+ // remove acfcloneindex
+ if( isset($value['acfcloneindex']) ) {
+
+ unset($value['acfcloneindex']);
+
+ }
+
+
+ // valid
+ if( $field['required'] && empty($value) ) {
+
+ $valid = false;
+
+ }
+
+
+ // check sub fields
+ if( !empty($field['sub_fields']) && !empty($value) ) {
+
+ $keys = array_keys($value);
+
+ foreach( $keys as $i ) {
+
+ foreach( $field['sub_fields'] as $sub_field ) {
+
+ // vars
+ $k = $sub_field['key'];
+
+
+ // test sub field exists
+ if( !isset($value[ $i ][ $k ]) ) {
+
+ continue;
+
+ }
+
+
+ // validate
+ acf_validate_value( $value[ $i ][ $k ], $sub_field, "{$input}[{$i}][{$k}]" );
+ }
+
+ }
+
+ }
+
+ return $valid;
+
+ }
+
+
+ /*
+ * update_row
+ *
+ * This function will update a value row
+ *
+ * @type function
+ * @date 15/2/17
+ * @since 5.5.8
+ *
+ * @param $i (int)
+ * @param $field (array)
+ * @param $post_id (mixed)
+ * @return (boolean)
+ */
+
+ function update_row( $row, $i = 0, $field, $post_id ) {
+
+ // bail early if no layout reference
+ if( !is_array($row) ) return false;
+
+
+ // bail early if no layout
+ if( empty($field['sub_fields']) ) return false;
+
+
+ // loop
+ foreach( $field['sub_fields'] as $sub_field ) {
+
+ // value
+ $value = null;
+
+
+ // find value (key)
+ if( isset($row[ $sub_field['key'] ]) ) {
+
+ $value = $row[ $sub_field['key'] ];
+
+ // find value (name)
+ } elseif( isset($row[ $sub_field['name'] ]) ) {
+
+ $value = $row[ $sub_field['name'] ];
+
+ // value does not exist
+ } else {
+
+ continue;
+
+ }
+
+
+ // modify name for save
+ $sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
+
+
+ // update field
+ acf_update_value( $value, $post_id, $sub_field );
+
+ }
+
+
+ // return
+ return true;
+
+ }
+
+
+ /*
+ * delete_row
+ *
+ * This function will delete a value row
+ *
+ * @type function
+ * @date 15/2/17
+ * @since 5.5.8
+ *
+ * @param $i (int)
+ * @param $field (array)
+ * @param $post_id (mixed)
+ * @return (boolean)
+ */
+
+ function delete_row( $i = 0, $field, $post_id ) {
+
+ // bail early if no sub fields
+ if( empty($field['sub_fields']) ) return false;
+
+
+ // loop
+ foreach( $field['sub_fields'] as $sub_field ) {
+
+ // modify name for delete
+ $sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
+
+
+ // delete value
+ acf_delete_value( $post_id, $sub_field );
+
+ }
+
+
+ // return
+ return true;
+
+ }
+
+
+ /*
+ * update_value()
+ *
+ * This filter is appied to the $value before it is updated in the db
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $value - the value which will be saved in the database
+ * @param $field - the field array holding all the field options
+ * @param $post_id - the $post_id of which the value will be saved
+ *
+ * @return $value - the modified value
+ */
+
+ function update_value( $value, $post_id, $field ) {
+
+ // bail early if no sub fields
+ if( empty($field['sub_fields']) ) return $value;
+
+
+ // vars
+ $new_value = 0;
+ $old_value = (int) acf_get_metadata( $post_id, $field['name'] );
+
+
+ // update sub fields
+ if( !empty($value) ) { $i = -1;
+
+ // remove acfcloneindex
+ if( isset($value['acfcloneindex']) ) {
+
+ unset($value['acfcloneindex']);
+
+ }
+
+ // loop through rows
+ foreach( $value as $row ) { $i++;
+
+ // bail early if no row
+ if( !is_array($row) ) continue;
+
+
+ // update row
+ $this->update_row( $row, $i, $field, $post_id );
+
+
+ // append
+ $new_value++;
+
+ }
+
+ }
+
+
+ // remove old rows
+ if( $old_value > $new_value ) {
+
+ // loop
+ for( $i = $new_value; $i < $old_value; $i++ ) {
+
+ $this->delete_row( $i, $field, $post_id );
+
+ }
+
+ }
+
+
+ // save false for empty value
+ if( empty($new_value) ) $new_value = '';
+
+
+ // return
+ return $new_value;
+ }
+
+
+ /*
+ * delete_value
+ *
+ * description
+ *
+ * @type function
+ * @date 1/07/2015
+ * @since 5.2.3
+ *
+ * @param $post_id (int)
+ * @return $post_id (int)
+ */
+
+ function delete_value( $post_id, $key, $field ) {
+
+ // get old value (db only)
+ $old_value = (int) acf_get_metadata( $post_id, $field['name'] );
+
+
+ // bail early if no rows or no sub fields
+ if( !$old_value || empty($field['sub_fields']) ) return;
+
+
+ // loop
+ for( $i = 0; $i < $old_value; $i++ ) {
+
+ $this->delete_row( $i, $field, $post_id );
+
+ }
+
+ }
+
+
+ /*
+ * delete_field
+ *
+ * description
+ *
+ * @type function
+ * @date 4/04/2014
+ * @since 5.0.0
+ *
+ * @param $post_id (int)
+ * @return $post_id (int)
+ */
+
+ function delete_field( $field ) {
+
+ // bail early if no sub fields
+ if( empty($field['sub_fields']) ) return;
+
+
+ // loop through sub fields
+ foreach( $field['sub_fields'] as $sub_field ) {
+
+ acf_delete_field( $sub_field['ID'] );
+
+ }
+
+ }
+
+
+ /*
+ * update_field()
+ *
+ * This filter is appied to the $field before it is saved to the database
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $field - the field array holding all the field options
+ * @param $post_id - the field group ID (post_type = acf)
+ *
+ * @return $field - the modified field
+ */
+
+ function update_field( $field ) {
+
+ // remove sub fields
+ unset($field['sub_fields']);
+
+
+ // return
+ return $field;
+ }
+
+
+ /*
+ * duplicate_field()
+ *
+ * This filter is appied to the $field before it is duplicated and saved to the database
+ *
+ * @type filter
+ * @since 3.6
+ * @date 23/01/13
+ *
+ * @param $field - the field array holding all the field options
+ *
+ * @return $field - the modified field
+ */
+
+ function duplicate_field( $field ) {
+
+ // get sub fields
+ $sub_fields = acf_extract_var( $field, 'sub_fields' );
+
+
+ // save field to get ID
+ $field = acf_update_field( $field );
+
+
+ // duplicate sub fields
+ acf_duplicate_fields( $sub_fields, $field['ID'] );
+
+
+ // return
+ return $field;
+ }
+
+
+ /*
+ * translate_field
+ *
+ * This function will translate field settings
+ *
+ * @type function
+ * @date 8/03/2016
+ * @since 5.3.2
+ *
+ * @param $field (array)
+ * @return $field
+ */
+
+ function translate_field( $field ) {
+
+ // translate
+ $field['button_label'] = acf_translate( $field['button_label'] );
+
+
+ // return
+ return $field;
+
+ }
+
+
+ /*
+ * validate_any_field
+ *
+ * This function will add compatibility for the 'column_width' setting
+ *
+ * @type function
+ * @date 30/1/17
+ * @since 5.5.6
+ *
+ * @param $field (array)
+ * @return $field
+ */
+
+ function validate_any_field( $field ) {
+
+ // width has changed
+ if( isset($field['column_width']) ) {
+
+ $field['wrapper']['width'] = acf_extract_var($field, 'column_width');
+
+ }
+
+
+ // return
+ return $field;
+
+ }
+
+
+ /*
+ * prepare_field_for_export
+ *
+ * description
+ *
+ * @type function
+ * @date 11/03/2014
+ * @since 5.0.0
+ *
+ * @param $post_id (int)
+ * @return $post_id (int)
+ */
+
+ function prepare_field_for_export( $field ) {
+
+ // bail early if no sub fields
+ if( empty($field['sub_fields']) ) return $field;
+
+
+ // prepare
+ $field['sub_fields'] = acf_prepare_fields_for_export( $field['sub_fields'] );
+
+
+ // return
+ return $field;
+
+ }
+
+
+ /*
+ * prepare_field_for_import
+ *
+ * description
+ *
+ * @type function
+ * @date 11/03/2014
+ * @since 5.0.0
+ *
+ * @param $post_id (int)
+ * @return $post_id (int)
+ */
+
+ function prepare_field_for_import( $field ) {
+
+ // bail early if no sub fields
+ if( empty($field['sub_fields']) ) return $field;
+
+
+ // vars
+ $sub_fields = $field['sub_fields'];
+
+
+ // reset field setting
+ $field['sub_fields'] = array();
+
+
+ // loop
+ foreach( $sub_fields as &$sub_field ) {
+
+ $sub_field['parent'] = $field['key'];
+
+ }
+
+
+ // merge
+ array_unshift($sub_fields, $field);
+
+
+ // return
+ return $sub_fields;
+
+ }
+
+}
+
+
+// initialize
+acf_register_field_type( 'acf_field_repeater' );
+
+endif; // class_exists check
+
+?>
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/acf-repeater-update.php b/bedrock/web/app/plugins/acf-repeater/acf-repeater-update.php
new file mode 100644
index 00000000..c32fd3dc
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/acf-repeater-update.php
@@ -0,0 +1,474 @@
+ '',
+ 'key' => '',
+ 'slug' => '',
+ 'basename' => '',
+ 'version' => '',
+ ));
+
+
+ // Check if is_plugin_active() function exists. This is required on the front end of the
+ // site, since it is in a file that is normally only loaded in the admin.
+ if( !function_exists( 'is_plugin_active' ) ) {
+
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
+
+ }
+
+
+ // bail early if not active plugin (included in theme)
+ if( !is_plugin_active($plugin['basename']) ) return;
+
+
+ // add custom message in plugin update row
+ // removed: decided this message will have a negative impact on user
+ // if( is_admin() ) {
+ //
+ // add_action('in_plugin_update_message-' . $plugin['basename'], array($this, 'modify_plugin_update_message'), 10, 2 );
+ //
+ // }
+
+
+ // append
+ $this->plugins[ $plugin['basename'] ] = $plugin;
+
+ }
+
+
+ /*
+ * request
+ *
+ * This function will make a request to the ACF update server
+ *
+ * @type function
+ * @date 8/4/17
+ * @since 5.5.10
+ *
+ * @param $query (string)
+ * @param $body (array)
+ * @return (mixed)
+ */
+
+ function request( $query = 'index.php', $body = null ) {
+
+ // vars
+ $url = 'https://connect.advancedcustomfields.com/' . $query;
+
+
+ // test
+ if( $this->dev ) $url = 'http://connect/' . $query;
+
+
+ // log
+ //acf_log('acf connect: '. $url, $body);
+
+
+ // post
+ $raw_response = wp_remote_post( $url, array(
+ 'timeout' => 10,
+ 'body' => $body
+ ));
+
+
+ // wp error
+ if( is_wp_error($raw_response) ) {
+
+ return $raw_response;
+
+ // http error
+ } elseif( wp_remote_retrieve_response_code($raw_response) != 200 ) {
+
+ return new WP_Error( 'server_error', wp_remote_retrieve_response_message($raw_response) );
+
+ }
+
+
+ // decode response
+ $json = json_decode( wp_remote_retrieve_body($raw_response), true );
+
+
+ // allow non json value
+ if( $json === null ) {
+
+ return wp_remote_retrieve_body($raw_response);
+
+ }
+
+
+ // return
+ return $json;
+
+ }
+
+
+ /*
+ * get_plugin_info
+ *
+ * This function will get plugin info and save as transient
+ *
+ * @type function
+ * @date 9/4/17
+ * @since 5.5.10
+ *
+ * @param $id (string)
+ * @return (mixed)
+ */
+
+ function get_plugin_info( $id = '' ) {
+
+ // var
+ $transient_name = 'acf_plugin_info_'.$id;
+
+
+ // delete transient (force-check is used to refresh)
+ if( !empty($_GET['force-check']) ) {
+
+ delete_transient($transient_name);
+
+ }
+
+
+ // try transient
+ $transient = get_transient($transient_name);
+ if( $transient !== false ) return $transient;
+
+
+ // connect
+ $response = $this->request('v2/plugins/get-info?p='.$id);
+
+
+ // ensure response is expected JSON array (not string)
+ if( is_string($response) ) {
+ $response = new WP_Error( 'server_error', esc_html($response) );
+ }
+
+
+ // update transient
+ set_transient($transient_name, $response, HOUR_IN_SECONDS );
+
+
+ // return
+ return $response;
+
+ }
+
+
+ /*
+ * refresh_plugins_transient
+ *
+ * This function will refresh plugin update info to the transient
+ *
+ * @type function
+ * @date 11/4/17
+ * @since 5.5.10
+ *
+ * @param n/a
+ * @return n/a
+ */
+
+ function refresh_plugins_transient() {
+
+ // vars
+ $transient = get_site_transient('update_plugins');
+
+
+ // bail early if no transient
+ if( empty($transient) ) return;
+
+
+ // update (will trigger modify function)
+ set_site_transient( 'update_plugins', $transient );
+
+ }
+
+
+ /*
+ * modify_plugins_transient
+ *
+ * This function will connect to the ACF website and find update information
+ *
+ * @type function
+ * @date 16/01/2014
+ * @since 5.0.0
+ *
+ * @param $transient (object)
+ * @return $transient
+ */
+
+ function modify_plugins_transient( $transient ) {
+
+ // bail early if no response (error)
+ if( !isset($transient->response) ) return $transient;
+
+
+ // fetch updates once (this filter is called multiple times during a single page load)
+ if( !$this->updates ) {
+
+ // vars
+ $post = array(
+ 'plugins' => wp_json_encode($this->plugins),
+ 'wp' => wp_json_encode(array(
+ 'wp_name' => get_bloginfo('name'),
+ 'wp_url' => home_url(),
+ 'wp_version' => get_bloginfo('version'),
+ 'wp_language' => get_bloginfo('language'),
+ 'wp_timezone' => get_option('timezone_string'),
+ )),
+ 'acf' => wp_json_encode(array(
+ 'acf_version' => get_option('acf_version'),
+ 'acf_pro' => (defined('ACF_PRO') && ACF_PRO),
+ )),
+ );
+
+
+ // connect
+ $this->updates = $this->request('v2/plugins/update-check', $post);
+
+ }
+
+
+ // append
+ if( is_array($this->updates) ) {
+
+ foreach( $this->updates['plugins'] as $basename => $update ) {
+
+ $transient->response[ $basename ] = (object) $update;
+
+ }
+
+ }
+
+
+ // return
+ return $transient;
+
+ }
+
+
+ /*
+ * modify_plugin_details
+ *
+ * This function will populate the plugin data visible in the 'View details' popup
+ *
+ * @type function
+ * @date 17/01/2014
+ * @since 5.0.0
+ *
+ * @param $result (bool|object)
+ * @param $action (string)
+ * @param $args (object)
+ * @return $result
+ */
+
+ function modify_plugin_details( $result, $action = null, $args = null ) {
+
+ // vars
+ $plugin = false;
+
+
+ // only for 'plugin_information' action
+ if( $action !== 'plugin_information' ) return $result;
+
+
+ // find plugin via slug
+ foreach( $this->plugins as $p ) {
+
+ if( $args->slug == $p['slug'] ) $plugin = $p;
+
+ }
+
+
+ // bail early if plugin not found
+ if( !$plugin ) return $result;
+
+
+ // connect
+ $response = $this->get_plugin_info($plugin['id']);
+
+
+ // bail early if no response
+ if( !is_array($response) ) return $result;
+
+
+ // remove tags (different context)
+ unset($response['tags']);
+
+
+ // convert to object
+ $response = (object) $response;
+
+
+ // sections
+ $sections = array(
+ 'description' => '',
+ 'installation' => '',
+ 'changelog' => '',
+ 'upgrade_notice' => ''
+ );
+
+ foreach( $sections as $k => $v ) {
+
+ $sections[ $k ] = $response->$k;
+
+ }
+
+ $response->sections = $sections;
+
+
+ // return
+ return $response;
+
+ }
+
+
+ /*
+ * modify_plugin_update_message
+ *
+ * Displays an update message for plugin list screens.
+ * Shows only the version updates from the current until the newest version
+ *
+ * @type function
+ * @date 14/06/2016
+ * @since 5.3.8
+ *
+ * @param $plugin_data (array)
+ * @param $r (object)
+ * @return n/a
+ */
+
+/*
+ function modify_plugin_update_message( $plugin_data, $response ) {
+
+ // show notice if exists in transient data
+ if( isset($response->notice) ) {
+
+ echo '' . $response->notice . '
';
+
+ }
+
+ }
+*/
+
+}
+
+
+/*
+* acf_updates
+*
+* The main function responsible for returning the one true acf_updates instance to functions everywhere.
+* Use this function like you would a global variable, except without needing to declare the global.
+*
+* Example:
+*
+* @type function
+* @date 9/4/17
+* @since 5.5.12
+*
+* @param n/a
+* @return (object)
+*/
+
+function acf_updates() {
+
+ global $acf_updates;
+
+ if( !isset($acf_updates) ) {
+
+ $acf_updates = new acf_updates();
+
+ }
+
+ return $acf_updates;
+
+}
+
+
+/*
+* acf_register_plugin_update
+*
+* alias of acf_updates()->add_plugin()
+*
+* @type function
+* @date 12/4/17
+* @since 5.5.10
+*
+* @param $post_id (int)
+* @return $post_id (int)
+*/
+
+function acf_register_plugin_update( $plugin ) {
+
+ acf_updates()->add_plugin( $plugin );
+
+}
+
+
+endif; // class_exists check
+
+
+// register update
+acf_register_plugin_update(array(
+ 'id' => 'repeater',
+ 'key' => 'QJF7-L4IX-UCNP-RF2W',
+ 'slug' => $this->settings['slug'],
+ 'basename' => $this->settings['basename'],
+ 'version' => $this->settings['version'],
+));
+
+?>
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/acf-repeater.php b/bedrock/web/app/plugins/acf-repeater/acf-repeater.php
new file mode 100644
index 00000000..04f19860
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/acf-repeater.php
@@ -0,0 +1,148 @@
+settings = array(
+
+ // basic
+ 'name' => __('Advanced Custom Fields: Repeater Field', 'acf'),
+ 'version' => '2.0.1',
+
+ // urls
+ 'slug' => dirname(plugin_basename( __FILE__ )),
+ 'basename' => plugin_basename( __FILE__ ),
+ 'path' => plugin_dir_path( __FILE__ ),
+ 'dir' => plugin_dir_url( __FILE__ ),
+
+ );
+
+
+ // include v5 field
+ add_action('acf/include_field_types', array($this, 'include_field_types'));
+
+
+ // include v4 field
+ add_action('acf/register_fields', array($this, 'register_fields'));
+
+
+ // include updates
+ if( is_admin() ) {
+
+ $this->include_file('acf-repeater-update.php');
+
+ }
+
+ }
+
+
+ /*
+ * include_file
+ *
+ * This function will check if a file exists before including it
+ *
+ * @type function
+ * @date 22/2/17
+ * @since 5.5.8
+ *
+ * @param $file (string)
+ * @return n/a
+ */
+
+ function include_file( $file = '' ) {
+
+ $file = dirname(__FILE__) . '/'. $file;
+
+ if( file_exists($file) ) include_once( $file );
+
+ }
+
+
+ /*
+ * include_field_types
+ *
+ * This function will include the v5 field type
+ *
+ * @type function
+ * @date 12/06/2015
+ * @since 5.2.3
+ *
+ * @param n/a
+ * @return n/a
+ */
+
+ function include_field_types() {
+
+ $this->include_file('5/repeater.php');
+
+ }
+
+
+ /*
+ * register_fields
+ *
+ * This function will include the v4 field type
+ *
+ * @type function
+ * @date 12/06/2015
+ * @since 5.2.3
+ *
+ * @param n/a
+ * @return n/a
+ */
+
+ function register_fields() {
+
+ $this->include_file('4/repeater.php');
+
+ }
+
+}
+
+
+// globals
+global $acf_plugin_repeater;
+
+
+// instantiate
+$acf_plugin_repeater = new acf_plugin_repeater();
+
+
+// end class
+endif;
+
+?>
\ No newline at end of file
diff --git a/bedrock/web/app/plugins/acf-repeater/readme.txt b/bedrock/web/app/plugins/acf-repeater/readme.txt
new file mode 100644
index 00000000..44b2c16c
--- /dev/null
+++ b/bedrock/web/app/plugins/acf-repeater/readme.txt
@@ -0,0 +1,104 @@
+=== Advanced Custom Fields: Repeater Field ===
+Contributors: elliotcondon
+Requires at least: 3.6.0
+Tested up to: 4.9.0
+License: GPLv2 or later
+License URI: http://www.gnu.org/licenses/gpl-2.0.html
+
+Break free from static inputs and create multiple rows of loop-able data
+
+== Description ==
+
+The Repeater field acts as a table of data where you can define the columns (sub fields) and add infinite rows.
+Any type of field can be added as a sub field which gives you the potential to create very flexible templates.
+
+http://www.advancedcustomfields.com/add-ons/repeater-field/
+
+
+== Installation ==
+
+This software can be treated as both a WP plugin and a theme include.
+However, only when activated as a plugin will updates be available/
+
+= Plugin =
+1. Copy the 'acf-repeater' folder into your plugins folder
+2. Activate the plugin via the Plugins admin page
+
+= Include =
+1. Copy the 'acf-repeater' folder into your theme folder (can use sub folders)
+ * You can place the folder anywhere inside the 'wp-content' directory
+2. Edit your functions.php file and add the following code to include the field:
+
+`
+include_once('acf-repeater/acf-repeater.php');
+`
+3. Make sure the path is correct to include the acf-repeater.php file
+4. Remove the acf-repeater-update.php file from the folder.
+
+
+== Changelog ==
+
+= 2.0.1 =
+* Minor fixes and improvements
+
+= 2.0.0 =
+* Added support for ACF version 5
+
+= 1.1.1 =
+* Fixed CSS bug causing any nested flexible content fields to not display add/remove buttons for each layout
+* Fixes CSS bug causing cropped tables on small screen sizes
+
+= 1.1.0 =
+* Added Support for sub field conditional logic
+* Added Support for sub field required validation
+* Updated UI for 'column width' option (prepend %)
+* Updated UI for 'Maximum Rows' option (can be left blank)
+* Updated JS to use .on function instead of .live
+* Added new update script allowing distribution in premium plugins / themes
+
+= 1.0.1 =
+* [Updated] Updated sub field type list to remove 'Tab' as this does not work as a sub field
+
+= 1.0.0 =
+* [Updated] Updated update_field parameters
+* Official Release
+
+= 0.1.2 =
+* [IMPORTANT] This update requires the latest ACF v4 files available on GIT - https://github.com/elliotcondon/acf4
+* [Added] Added category to field to appear in the 'Layout' optgroup
+* [Updated] Updated dir / path code to use acf filter
+
+= 0.1.1 =
+* [IMPORTANT] This update requires the latest ACF v4 files available on GIT - https://github.com/elliotcondon/acf4
+* [Updated] Updated naming conventions in field group page
+
+= 0.1.0 =
+* [Fixed] Fix wrong str_replace in $dir
+
+= 0.0.9 =
+* [Updated] Drop support of old filters / actions
+
+= 0.0.8 =
+* [Fixed] Fix bug causing sub fields to not display choices correctly
+
+= 0.0.7 =
+* [IMPORTANT] This update requires the latest ACF v4 files available on GIT - https://github.com/elliotcondon/acf4
+* [Fixed] Fixed bug where field would appear empty after saving the page. This was caused by a cache conflict which has now been avoided by using the format_value filter to load sub field values instead of load_value
+
+= 0.0.6 =
+* [Updated] Update save method to use uniqid for field keys, not pretty field keys
+
+= 0.0.5 =
+* [Fixed] Fix wrong css / js urls on WINDOWS server.
+
+= 0.0.4 =
+* [Fixed] Fix bug preventing WYSIWYG sub fields to load.
+
+= 0.0.3 =
+* [Fixed] Fix load_field hook issues with nested fields.
+
+= 0.0.2 =
+* [Fixed] acf_load_field-${parent_hook}-${child_hook} now works!
+
+= 0.0.1 =
+* Initial Release.
diff --git a/bedrock/web/app/plugins/soundlab/config/post_types.php.inc b/bedrock/web/app/plugins/soundlab/config/post_types.php.inc
new file mode 100644
index 00000000..abad8f46
--- /dev/null
+++ b/bedrock/web/app/plugins/soundlab/config/post_types.php.inc
@@ -0,0 +1,97 @@
+ array(
+ 'name' => __( 'Sounds' ),
+ ),
+ 'supports' => array( 'title', 'editor', 'thumbnail' ),
+ 'public' => true,
+ 'has_archive' => true,
+ 'description' => 'Sound',
+ 'map_meta_cap' => true,
+ 'taxonomies' => array( 'category', ),
+ 'capability_type' => "sound"
+ )
+ );
+ register_post_type( 'resource',
+ array(
+ 'labels' => array(
+ 'name' => __( 'Resources' ),
+ ),
+ 'supports' => array( 'title', 'editor', 'thumbnail' ),
+ 'public' => true,
+ 'has_archive' => true,
+ 'description' => 'Resources',
+ 'map_meta_cap' => true,
+ 'taxonomies' => array( 'category', ),
+ 'capability_type' => "resource"
+ )
+ );
+ register_post_type( 'user_submission',
+ array(
+ 'labels' => array(
+ 'name' => __( 'User Submission' ),
+ ),
+ 'supports' => array( 'title', 'editor', 'thumbnail' ),
+ 'public' => true,
+ 'has_archive' => true,
+ 'description' => 'User Submissions',
+ 'map_meta_cap' => true,
+ 'taxonomies' => array( 'category', ),
+ 'capability_type' => "user_submission"
+ )
+ );
+ register_post_type( 'playlist',
+ array(
+ 'labels' => array(
+ 'name' => __( 'Playlist' ),
+ ),
+ 'supports' => array( 'title', 'thumbnail' ),
+ 'public' => true,
+ 'has_archive' => true,
+ 'description' => 'Playlist',
+ 'map_meta_cap' => true,
+ 'taxonomies' => array( 'category', ),
+ 'capability_type' => "playlist"
+ )
+ );
+ register_post_type( 'event',
+ array(
+ 'labels' => array(
+ 'name' => __( 'Event' ),
+ ),
+ 'supports' => array( 'title', 'editor', 'thumbnail' ),
+ 'public' => true,
+ 'has_archive' => true,
+ 'description' => 'Event',
+ 'map_meta_cap' => true,
+ 'taxonomies' => array( 'category', ),
+ 'capability_type' => "event"
+ )
+ );
+ register_post_type( 'person',
+ array(
+ 'labels' => array(
+ 'name' => __( 'People' ),
+ ),
+ 'taxonomies' => array( 'category', ),
+ 'public' => true,
+ 'has_archive' => true,
+ 'description' => 'People',
+ 'map_meta_cap' => true,
+ 'taxonomies' => array(),
+ 'capability_type' => "person"
+ )
+ );
+}
+add_theme_support( 'post-thumbnails', array( 'audio_upload', 'user_submission' ) );
diff --git a/bedrock/web/app/plugins/soundlab/config/settings.php.inc b/bedrock/web/app/plugins/soundlab/config/settings.php.inc
new file mode 100644
index 00000000..a1e27049
--- /dev/null
+++ b/bedrock/web/app/plugins/soundlab/config/settings.php.inc
@@ -0,0 +1,35 @@
+remove_menu('wp-logo'); // Remove the WordPress logo
+ $wp_admin_bar->remove_menu('about'); // Remove the about WordPress link
+ $wp_admin_bar->remove_menu('wporg'); // Remove the WordPress.org link
+ $wp_admin_bar->remove_menu('documentation'); // Remove the WordPress documentation link
+ $wp_admin_bar->remove_menu('support-forums'); // Remove the support forums link
+ $wp_admin_bar->remove_menu('feedback'); // Remove the feedback link
+ //$wp_admin_bar->remove_menu('site-name'); // Remove the site name menu
+ //$wp_admin_bar->remove_menu('view-site'); // Remove the view site link
+ //$wp_admin_bar->remove_menu('updates'); // Remove the updates link
+ //$wp_admin_bar->remove_menu('comments'); // Remove the comments link
+ //$wp_admin_bar->remove_menu('edit'); // Remove the comments link
+ //$wp_admin_bar->remove_menu('new-content'); // Remove the content link
+ //$wp_admin_bar->remove_menu('w3tc'); // If you use w3 total cache remove the performance link
+ //$wp_admin_bar->remove_menu('my-account'); // Remove the user details tab
+}
+add_action( 'wp_before_admin_bar_render', 'protest_remove_admin_bar_links' );
+
+function protest_menu_page_removing() {
+ remove_menu_page( 'edit.php' );
+ remove_menu_page( 'edit-comments.php' );
+}
+add_action( 'admin_menu', 'protest_menu_page_removing' );
diff --git a/bedrock/web/app/plugins/soundlab/config/taxonomies.php.inc b/bedrock/web/app/plugins/soundlab/config/taxonomies.php.inc
new file mode 100644
index 00000000..9fc0992b
--- /dev/null
+++ b/bedrock/web/app/plugins/soundlab/config/taxonomies.php.inc
@@ -0,0 +1,40 @@
+ true,
+
+ // This array of options controls the labels displayed in the WordPress Admin UI
+ 'labels' => array(
+ 'name' => _x( 'Genres', 'taxonomy general name' ),
+ 'singular_name' => _x( 'Genre', 'taxonomy singular name' ),
+ 'search_items' => __( 'Search Genres' ),
+ 'all_items' => __( 'All Genres' ),
+ 'parent_item' => __( 'Parent Genre' ),
+ 'parent_item_colon' => __( 'Parent Genre:' ),
+ 'edit_item' => __( 'Edit Genre' ),
+ 'update_item' => __( 'Update Genre' ),
+ 'add_new_item' => __( 'Add New Genre' ),
+ 'new_item_name' => __( 'New Genre Name' ),
+ 'menu_name' => __( 'Genres' ),
+ ),
+
+ // Control the slugs used for this taxonomy
+ 'rewrite' => array(
+ 'slug' => 'locations', // This controls the base slug that will display before each term
+ 'with_front' => false, // Don't display the category base before "/locations/"
+ 'hierarchical' => true // This will allow URL's like "/locations/boston/cambridge/"
+ ),
+ ));
+
+}
+
+add_action( 'init', 'soundlab_add_custom_taxonomies', 0 );
diff --git a/bedrock/web/app/plugins/soundlab/inc/ajax.php.inc b/bedrock/web/app/plugins/soundlab/inc/ajax.php.inc
new file mode 100644
index 00000000..a33c3301
--- /dev/null
+++ b/bedrock/web/app/plugins/soundlab/inc/ajax.php.inc
@@ -0,0 +1,38 @@
+ $user_id,
+ "display_name" => $name,
+ ));
+ add_post_meta($user_id, "field", $field);
+ $response = $user_id;
+ } else {
+ // TODO: do better error handling with response type in graphql
+ $response = 0;
+ }
+
+ // json encode the post_data array and die
+ echo json_encode( array( "id" => $response ) );
+ die();
+}
diff --git a/bedrock/web/app/plugins/soundlab/inc/options-page.php.inc b/bedrock/web/app/plugins/soundlab/inc/options-page.php.inc
new file mode 100644
index 00000000..27d9d651
--- /dev/null
+++ b/bedrock/web/app/plugins/soundlab/inc/options-page.php.inc
@@ -0,0 +1,87 @@
+
+
+
= esc_html(get_admin_page_title()); ?>
+
+
+ ", $content);
+}
+
+add_shortcode('add_break', 'add_break');
diff --git a/bedrock/web/app/plugins/soundlab/soundlab.php b/bedrock/web/app/plugins/soundlab/soundlab.php
new file mode 100644
index 00000000..c6b6f4f2
--- /dev/null
+++ b/bedrock/web/app/plugins/soundlab/soundlab.php
@@ -0,0 +1,24 @@
+
diff --git a/bedrock/web/app/themes/orpheus/README.txt b/bedrock/web/app/themes/orpheus/README.txt
new file mode 100644
index 00000000..97828387
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/README.txt
@@ -0,0 +1,81 @@
+=== Twenty Seventeen ===
+Contributors: the WordPress team
+Requires at least: WordPress 4.7
+Tested up to: WordPress 4.9-trunk
+Version: 1.3
+License: GPLv2 or later
+License URI: http://www.gnu.org/licenses/gpl-2.0.html
+Tags: one-column, two-columns, right-sidebar, flexible-header, accessibility-ready, custom-colors, custom-header, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, post-formats, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready
+
+== Description ==
+
+Twenty Seventeen brings your site to life with header video and immersive featured images. With a focus on business sites, it features multiple sections on the front page as well as widgets, navigation and social menus, a logo, and more. Personalize its asymmetrical grid with a custom color scheme and showcase your multimedia content with post formats. Our default theme for 2017 works great in many languages, for any abilities, and on any device.
+
+For more information about Twenty Seventeen please go to https://codex.wordpress.org/Twenty_Seventeen.
+
+== Installation ==
+
+1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button.
+2. Type in Twenty Seventeen in the search form and press the 'Enter' key on your keyboard.
+3. Click on the 'Activate' button to use your new theme right away.
+4. Go to https://codex.wordpress.org/Twenty_Seventeen for a guide on how to customize this theme.
+5. Navigate to Appearance > Customize in your admin panel and customize to taste.
+
+== Copyright ==
+
+Twenty Seventeen WordPress Theme, Copyright 2016 WordPress.org
+Twenty Seventeen is distributed under the terms of the GNU GPL
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+Twenty Seventeen bundles the following third-party resources:
+
+HTML5 Shiv, Copyright 2014 Alexander Farkas
+Licenses: MIT/GPL2
+Source: https://github.com/aFarkas/html5shiv
+
+jQuery scrollTo, Copyright 2007-2015 Ariel Flesler
+License: MIT
+Source: https://github.com/flesler/jquery.scrollTo
+
+normalize.css, Copyright 2012-2016 Nicolas Gallagher and Jonathan Neal
+License: MIT
+Source: https://necolas.github.io/normalize.css/
+
+Font Awesome icons, Copyright Dave Gandy
+License: SIL Open Font License, version 1.1.
+Source: http://fontawesome.io/
+
+Bundled header image, Copyright Alvin Engler
+License: CC0 1.0 Universal (CC0 1.0)
+Source: https://unsplash.com/@englr?photo=bIhpiQA009k
+
+== Changelog ==
+
+= 1.3 =
+* Released: June 8, 2017
+
+https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.3
+
+= 1.2 =
+* Released: April 18, 2017
+
+https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.2
+
+= 1.1 =
+* Released: January 6, 2017
+
+https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.1
+
+= 1.0 =
+* Released: December 6, 2016
+
+Initial release
diff --git a/bedrock/web/app/themes/orpheus/archive.php b/bedrock/web/app/themes/orpheus/archive.php
new file mode 100644
index 00000000..bda23436
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/archive.php
@@ -0,0 +1,16 @@
+
diff --git a/bedrock/web/app/themes/orpheus/assets/css/colors-dark.css b/bedrock/web/app/themes/orpheus/assets/css/colors-dark.css
new file mode 100644
index 00000000..d6fda60c
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/css/colors-dark.css
@@ -0,0 +1,560 @@
+/**
+ * Twenty Seventeen: Dark Color Scheme
+ *
+ * See inc/color-patterns.php for dynamic color overrides for the theme.
+ *
+ * Colors are ordered from light to dark.
+ */
+
+.colors-dark button,
+.colors-dark input[type="button"],
+.colors-dark input[type="submit"],
+.colors-dark .entry-footer .edit-link a.post-edit-link {
+ background-color: #fff;
+}
+
+.colors-dark a:hover,
+.colors-dark a:active,
+.colors-dark .entry-content a:focus,
+.colors-dark .entry-content a:hover,
+.colors-dark .entry-summary a:focus,
+.colors-dark .entry-summary a:hover,
+.colors-dark .widget a:focus,
+.colors-dark .widget a:hover,
+.colors-dark .site-footer .widget-area a:focus,
+.colors-dark .site-footer .widget-area a:hover,
+.colors-dark .posts-navigation a:focus,
+.colors-dark .posts-navigation a:hover,
+.colors-dark .comment-metadata a:focus,
+.colors-dark .comment-metadata a:hover,
+.colors-dark .comment-metadata a.comment-edit-link:focus,
+.colors-dark .comment-metadata a.comment-edit-link:hover,
+.colors-dark .comment-reply-link:focus,
+.colors-dark .comment-reply-link:hover,
+.colors-dark .widget_authors a:focus strong,
+.colors-dark .widget_authors a:hover strong,
+.colors-dark .entry-title a:focus,
+.colors-dark .entry-title a:hover,
+.colors-dark .entry-meta a:focus,
+.colors-dark .entry-meta a:hover,
+.colors-dark.blog .entry-meta a.post-edit-link:focus,
+.colors-dark.blog .entry-meta a.post-edit-link:hover,
+.colors-dark.archive .entry-meta a.post-edit-link:focus,
+.colors-dark.archive .entry-meta a.post-edit-link:hover,
+.colors-dark.search .entry-meta a.post-edit-link:focus,
+.colors-dark.search .entry-meta a.post-edit-link:hover,
+.colors-dark .page-links a:focus .page-number,
+.colors-dark .page-links a:hover .page-number,
+.colors-dark .entry-footer .cat-links a:focus,
+.colors-dark .entry-footer .cat-links a:hover,
+.colors-dark .entry-footer .tags-links a:focus,
+.colors-dark .entry-footer .tags-links a:hover,
+.colors-dark .post-navigation a:focus,
+.colors-dark .post-navigation a:hover,
+.colors-dark .pagination a:not(.prev):not(.next):focus,
+.colors-dark .pagination a:not(.prev):not(.next):hover,
+.colors-dark .comments-pagination a:not(.prev):not(.next):focus,
+.colors-dark .comments-pagination a:not(.prev):not(.next):hover,
+.colors-dark .logged-in-as a:focus,
+.colors-dark .logged-in-as a:hover,
+.colors-dark a:focus .nav-title,
+.colors-dark a:hover .nav-title,
+.colors-dark .edit-link a:focus,
+.colors-dark .edit-link a:hover,
+.colors-dark .site-info a:focus,
+.colors-dark .site-info a:hover,
+.colors-dark .widget .widget-title a:focus,
+.colors-dark .widget .widget-title a:hover,
+.colors-dark .widget ul li a:focus,
+.colors-dark .widget ul li a:hover {
+ color: #fff;
+}
+
+.colors-dark .entry-content a:focus,
+.colors-dark .entry-content a:hover,
+.colors-dark .entry-summary a:focus,
+.colors-dark .entry-summary a:hover,
+.colors-dark .widget a:focus,
+.colors-dark .widget a:hover,
+.colors-dark .site-footer .widget-area a:focus,
+.colors-dark .site-footer .widget-area a:hover,
+.colors-dark .posts-navigation a:focus,
+.colors-dark .posts-navigation a:hover,
+.colors-dark .comment-metadata a:focus,
+.colors-dark .comment-metadata a:hover,
+.colors-dark .comment-metadata a.comment-edit-link:focus,
+.colors-dark .comment-metadata a.comment-edit-link:hover,
+.colors-dark .comment-reply-link:focus,
+.colors-dark .comment-reply-link:hover,
+.colors-dark .widget_authors a:focus strong,
+.colors-dark .widget_authors a:hover strong,
+.colors-dark .entry-title a:focus,
+.colors-dark .entry-title a:hover,
+.colors-dark .entry-meta a:focus,
+.colors-dark .entry-meta a:hover,
+.colors-dark.blog .entry-meta a.post-edit-link:focus,
+.colors-dark.blog .entry-meta a.post-edit-link:hover,
+.colors-dark.archive .entry-meta a.post-edit-link:focus,
+.colors-dark.archive .entry-meta a.post-edit-link:hover,
+.colors-dark.search .entry-meta a.post-edit-link:focus,
+.colors-dark.search .entry-meta a.post-edit-link:hover,
+.colors-dark .page-links a:focus .page-number,
+.colors-dark .page-links a:hover .page-number,
+.colors-dark .entry-footer .cat-links a:focus,
+.colors-dark .entry-footer .cat-links a:hover,
+.colors-dark .entry-footer .tags-links a:focus,
+.colors-dark .entry-footer .tags-links a:hover,
+.colors-dark .post-navigation a:focus,
+.colors-dark .post-navigation a:hover,
+.colors-dark .pagination a:not(.prev):not(.next):focus,
+.colors-dark .pagination a:not(.prev):not(.next):hover,
+.colors-dark .comments-pagination a:not(.prev):not(.next):focus,
+.colors-dark .comments-pagination a:not(.prev):not(.next):hover,
+.colors-dark .logged-in-as a:focus,
+.colors-dark .logged-in-as a:hover,
+.colors-dark a:focus .nav-title,
+.colors-dark a:hover .nav-title,
+.colors-dark .edit-link a:focus,
+.colors-dark .edit-link a:hover,
+.colors-dark .site-info a:focus,
+.colors-dark .site-info a:hover,
+.colors-dark .widget .widget-title a:focus,
+.colors-dark .widget .widget-title a:hover,
+.colors-dark .widget ul li a:focus,
+.colors-dark .widget ul li a:hover {
+ -webkit-box-shadow: inset 0 0 0 rgba(255, 255, 255, 0), 0 3px 0 rgba(255, 255, 255, 1); /* Equivalant to #fff */
+ box-shadow: inset 0 0 0 rgba(255, 255, 255, 0), 0 3px 0 rgba(255, 255, 255, 1); /* Equivalant to #fff */
+}
+
+.colors-dark .entry-content a,
+.colors-dark .entry-summary a,
+.colors-dark .widget a,
+.colors-dark .site-footer .widget-area a,
+.colors-dark .posts-navigation a,
+.colors-dark .widget_authors a strong {
+ -webkit-box-shadow: inset 0 -1px 0 rgba(240, 240, 240, 1); /* Equivalant to #f0f0f0 */
+ box-shadow: inset 0 -1px 0 rgba(240, 240, 240, 1); /* Equivalant to #f0f0f0 */
+}
+
+body.colors-dark,
+.colors-dark button,
+.colors-dark input,
+.colors-dark select,
+.colors-dark textarea,
+.colors-dark h3,
+.colors-dark h4,
+.colors-dark h6,
+.colors-dark label,
+.colors-dark .entry-title a,
+.colors-dark.twentyseventeen-front-page .panel-content .recent-posts article,
+.colors-dark .entry-footer .cat-links a,
+.colors-dark .entry-footer .tags-links a,
+.colors-dark .format-quote blockquote,
+.colors-dark .nav-title,
+.colors-dark .comment-body {
+ color: #eee;
+}
+
+/* Placeholder text color -- selectors need to be separate to work. */
+.colors-dark ::-webkit-input-placeholder {
+ color: #ddd;
+}
+
+.colors-dark :-moz-placeholder {
+ color: #ddd;
+}
+
+.colors-dark ::-moz-placeholder {
+ color: #ddd;
+}
+
+.colors-dark :-ms-input-placeholder {
+ color: #ddd;
+}
+
+.colors-dark input[type="text"]:focus,
+.colors-dark input[type="email"]:focus,
+.colors-dark input[type="url"]:focus,
+.colors-dark input[type="password"]:focus,
+.colors-dark input[type="search"]:focus,
+.colors-dark input[type="number"]:focus,
+.colors-dark input[type="tel"]:focus,
+.colors-dark input[type="range"]:focus,
+.colors-dark input[type="date"]:focus,
+.colors-dark input[type="month"]:focus,
+.colors-dark input[type="week"]:focus,
+.colors-dark input[type="time"]:focus,
+.colors-dark input[type="datetime"]:focus,
+.colors-dark input[type="datetime-local"]:focus,
+.colors-dark input[type="color"]:focus,
+.colors-dark textarea:focus,
+.bypostauthor > .comment-body > .comment-meta > .comment-author .avatar {
+ border-color: #eee;
+}
+
+.colors-dark input[type="text"]:focus,
+.colors-dark input[type="email"]:focus,
+.colors-dark input[type="url"]:focus,
+.colors-dark input[type="password"]:focus,
+.colors-dark input[type="search"]:focus,
+.colors-dark input[type="number"]:focus,
+.colors-dark input[type="tel"]:focus,
+.colors-dark input[type="range"]:focus,
+.colors-dark input[type="date"]:focus,
+.colors-dark input[type="month"]:focus,
+.colors-dark input[type="week"]:focus,
+.colors-dark input[type="time"]:focus,
+.colors-dark input[type="datetime"]:focus,
+.colors-dark input[type="datetime-local"]:focus,
+.colors-dark input[type="color"]:focus,
+.colors-dark textarea:focus,
+.colors-dark button.secondary,
+.colors-dark input[type="reset"],
+.colors-dark input[type="button"].secondary,
+.colors-dark input[type="reset"].secondary,
+.colors-dark input[type="submit"].secondary,
+.colors-dark a,
+.colors-dark .site-title,
+.colors-dark .site-title a,
+.colors-dark .navigation-top a,
+.colors-dark .dropdown-toggle,
+.colors-dark .menu-toggle,
+.colors-dark .page .panel-content .entry-title,
+.colors-dark .page-title,
+.colors-dark.page:not(.twentyseventeen-front-page) .entry-title,
+.colors-dark .page-links a .page-number,
+.colors-dark .comment-metadata a.comment-edit-link,
+.colors-dark .comment-reply-link .icon,
+.colors-dark h2.widget-title,
+.colors-dark mark,
+.colors-dark .post-navigation a:focus .icon,
+.colors-dark .post-navigation a:hover .icon,
+.colors-dark.blog .entry-meta a.post-edit-link,
+.colors-dark.archive .entry-meta a.post-edit-link,
+.colors-dark.search .entry-meta a.post-edit-link,
+.colors-custom .twentyseventeen-panel .recent-posts .entry-header .edit-link {
+ color: #ddd;
+}
+
+.colors-dark h2,
+.colors-dark blockquote,
+.colors-dark input[type="text"],
+.colors-dark input[type="email"],
+.colors-dark input[type="url"],
+.colors-dark input[type="password"],
+.colors-dark input[type="search"],
+.colors-dark input[type="number"],
+.colors-dark input[type="tel"],
+.colors-dark input[type="range"],
+.colors-dark input[type="date"],
+.colors-dark input[type="month"],
+.colors-dark input[type="week"],
+.colors-dark input[type="time"],
+.colors-dark input[type="datetime"],
+.colors-dark input[type="datetime-local"],
+.colors-dark input[type="color"],
+.colors-dark textarea,
+.colors-dark .navigation-top .current-menu-item > a,
+.colors-dark .navigation-top .current_page_item > a,
+.colors-dark .entry-content blockquote.alignleft,
+.colors-dark .entry-content blockquote.alignright,
+.colors-dark .taxonomy-description,
+.colors-dark .site-info a,
+.colors-dark .wp-caption {
+ color: #ccc;
+}
+
+.colors-dark abbr,
+.colors-dark acronym {
+ border-bottom-color: #ccc;
+}
+
+.colors-dark h5,
+.main-navigation a:hover,
+.colors-dark .entry-meta,
+.colors-dark .entry-meta a,
+.colors-dark .nav-subtitle,
+.colors-dark .comment-metadata,
+.colors-dark .comment-metadata a,
+.colors-dark .no-comments,
+.colors-dark .comment-awaiting-moderation,
+.colors-dark .page-numbers.current,
+.colors-dark .page-links .page-number,
+.colors-dark .site-description {
+ color: #bbb;
+}
+
+.colors-dark button:hover,
+.colors-dark button:focus,
+.colors-dark input[type="button"]:hover,
+.colors-dark input[type="button"]:focus,
+.colors-dark input[type="submit"]:hover,
+.colors-dark input[type="submit"]:focus,
+.colors-dark .prev.page-numbers:focus,
+.colors-dark .prev.page-numbers:hover,
+.colors-dark .next.page-numbers:focus,
+.colors-dark .next.page-numbers:hover,
+.colors-dark .entry-footer .edit-link a.post-edit-link:focus,
+.colors-dark .entry-footer .edit-link a.post-edit-link:hover {
+ background: #bbb;
+}
+
+.colors-dark .social-navigation a:hover,
+.colors-dark .social-navigation a:focus {
+ background: #999;
+ color: #222;
+}
+
+.colors-dark .entry-footer .cat-links .icon,
+.colors-dark .entry-footer .tags-links .icon {
+ color: #666;
+}
+
+.colors-dark button.secondary:hover,
+.colors-dark button.secondary:focus,
+.colors-dark input[type="reset"]:hover,
+.colors-dark input[type="reset"]:focus,
+.colors-dark input[type="button"].secondary:hover,
+.colors-dark input[type="button"].secondary:focus,
+.colors-dark input[type="reset"].secondary:hover,
+.colors-dark input[type="reset"].secondary:focus,
+.colors-dark input[type="submit"].secondary:hover,
+.colors-dark input[type="submit"].secondary:focus,
+.colors-dark .social-navigation a,
+.colors-dark hr {
+ background: #555;
+}
+
+.colors-dark input[type="text"],
+.colors-dark input[type="email"],
+.colors-dark input[type="url"],
+.colors-dark input[type="password"],
+.colors-dark input[type="search"],
+.colors-dark input[type="number"],
+.colors-dark input[type="tel"],
+.colors-dark input[type="range"],
+.colors-dark input[type="date"],
+.colors-dark input[type="month"],
+.colors-dark input[type="week"],
+.colors-dark input[type="time"],
+.colors-dark input[type="datetime"],
+.colors-dark input[type="datetime-local"],
+.colors-dark input[type="color"],
+.colors-dark textarea,
+.colors-dark select,
+.colors-dark fieldset,
+.colors-dark .widget .tagcloud a:hover,
+.colors-dark .widget .tagcloud a:focus,
+.colors-dark .widget.widget_tag_cloud a:hover,
+.colors-dark .widget.widget_tag_cloud a:focus,
+.colors-dark .wp_widget_tag_cloud a:hover,
+.colors-dark .wp_widget_tag_cloud a:focus {
+ border-color: #555;
+}
+
+.colors-dark button.secondary,
+.colors-dark input[type="reset"],
+.colors-dark input[type="button"].secondary,
+.colors-dark input[type="reset"].secondary,
+.colors-dark input[type="submit"].secondary,
+.colors-dark .prev.page-numbers,
+.colors-dark .next.page-numbers {
+ background-color: #444;
+}
+
+.colors-dark .widget .tagcloud a,
+.colors-dark .widget.widget_tag_cloud a,
+.colors-dark .wp_widget_tag_cloud a {
+ border-color: #444;
+}
+
+.colors-dark.twentyseventeen-front-page article:not(.has-post-thumbnail):not(:first-child),
+.colors-dark .widget ul li {
+ border-top-color: #444;
+}
+
+.colors-dark .widget ul li {
+ border-bottom-color: #444;
+}
+
+.colors-dark pre,
+.colors-dark mark,
+.colors-dark ins,
+.colors-dark input[type="text"],
+.colors-dark input[type="email"],
+.colors-dark input[type="url"],
+.colors-dark input[type="password"],
+.colors-dark input[type="search"],
+.colors-dark input[type="number"],
+.colors-dark input[type="tel"],
+.colors-dark input[type="range"],
+.colors-dark input[type="date"],
+.colors-dark input[type="month"],
+.colors-dark input[type="week"],
+.colors-dark input[type="time"],
+.colors-dark input[type="datetime"],
+.colors-dark input[type="datetime-local"],
+.colors-dark input[type="color"],
+.colors-dark textarea,
+.colors-dark select,
+.colors-dark fieldset {
+ background: #333;
+}
+
+.colors-dark tr,
+.colors-dark thead th {
+ border-color: #333;
+}
+
+.colors-dark .navigation-top,
+.colors-dark .main-navigation > div > ul,
+.colors-dark .pagination,
+.colors-dark .comment-navigation,
+.colors-dark .entry-footer,
+.colors-dark .site-footer {
+ border-top-color: #333;
+}
+
+.colors-dark .single-featured-image-header,
+.colors-dark .navigation-top,
+.colors-dark .main-navigation li,
+.colors-dark .entry-footer,
+.colors-dark #comments {
+ border-bottom-color: #333;
+}
+
+.colors-dark .site-header,
+.colors-dark .single-featured-image-header {
+ background-color: #262626;
+}
+
+.colors-dark button,
+.colors-dark input[type="button"],
+.colors-dark input[type="submit"],
+.colors-dark .prev.page-numbers:focus,
+.colors-dark .prev.page-numbers:hover,
+.colors-dark .next.page-numbers:focus,
+.colors-dark .next.page-numbers:hover {
+ color: #222;
+}
+
+body.colors-dark,
+.colors-dark .site-content-contain,
+.colors-dark .navigation-top,
+.colors-dark .main-navigation ul {
+ background: #222;
+}
+
+.colors-dark .entry-title a,
+.colors-dark .entry-meta a,
+.colors-dark.blog .entry-meta a.post-edit-link,
+.colors-dark.archive .entry-meta a.post-edit-link,
+.colors-dark.search .entry-meta a.post-edit-link,
+.colors-dark .page-links a,
+.colors-dark .page-links a .page-number,
+.colors-dark .entry-footer a,
+.colors-dark .entry-footer .cat-links a,
+.colors-dark .entry-footer .tags-links a,
+.colors-dark .edit-link a,
+.colors-dark .post-navigation a,
+.colors-dark .logged-in-as a,
+.colors-dark .comment-navigation a,
+.colors-dark .comment-metadata a,
+.colors-dark .comment-metadata a.comment-edit-link,
+.colors-dark .comment-reply-link,
+.colors-dark a .nav-title,
+.colors-dark .pagination a,
+.colors-dark .comments-pagination a,
+.colors-dark .widget .widget-title a,
+.colors-dark .widget ul li a,
+.colors-dark .site-footer .widget-area ul li a,
+.colors-dark .site-info a {
+ -webkit-box-shadow: inset 0 -1px 0 rgba(34, 34, 34, 1); /* Equivalant to #222 */
+ box-shadow: inset 0 -1px 0 rgba(34, 34, 34, 1); /* Equivalant to #222 */
+}
+
+/* Fixes linked images */
+.colors-dark .entry-content a img,
+.colors-dark .widget a img {
+ -webkit-box-shadow: 0 0 0 8px #222;
+ box-shadow: 0 0 0 8px #222;
+}
+
+.colors-dark .entry-footer .edit-link a.post-edit-link {
+ color: #000;
+}
+
+.colors-dark .menu-toggle,
+.colors-dark .menu-toggle:hover,
+.colors-dark .menu-toggle:focus,
+.colors-dark .dropdown-toggle,
+.colors-dark .dropdown-toggle:hover,
+.colors-dark .dropdown-toggle:focus,
+.colors-dark .menu-scroll-down,
+.colors-dark .menu-scroll-down:hover,
+.colors-dark .menu-scroll-down:focus {
+ background-color: transparent;
+}
+
+.colors-dark .gallery-item a,
+.colors-dark .gallery-item a:hover,
+.colors-dark .gallery-item a:focus,
+.colors-dark .widget .tagcloud a,
+.colors-dark .widget .tagcloud a:focus,
+.colors-dark .widget .tagcloud a:hover,
+.colors-dark .widget.widget_tag_cloud a,
+.colors-dark .widget.widget_tag_cloud a:focus,
+.colors-dark .widget.widget_tag_cloud a:hover,
+.colors-dark .wp_widget_tag_cloud a,
+.colors-dark .wp_widget_tag_cloud a:focus,
+.colors-dark .wp_widget_tag_cloud a:hover,
+.colors-dark .entry-footer .edit-link a.post-edit-link:focus,
+.colors-dark .entry-footer .edit-link a.post-edit-link:hover {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+
+@media screen and (min-width: 48em) {
+
+ .colors-dark .nav-links .nav-previous .nav-title .icon,
+ .colors-dark .nav-links .nav-next .nav-title .icon {
+ color: #eee;
+ }
+
+ .colors-dark .main-navigation li li:hover,
+ .colors-dark .main-navigation li li.focus {
+ background: #999;
+ }
+
+ .colors-dark .menu-scroll-down {
+ color: #999;
+ }
+
+ .colors-dark .main-navigation ul ul {
+ border-color: #333;
+ background: #222;
+ }
+
+ .colors-dark .main-navigation ul li.menu-item-has-children:before,
+ .colors-dark .main-navigation ul li.page_item_has_children:before {
+ border-bottom-color: #333;
+ }
+
+ .main-navigation ul li.menu-item-has-children:after,
+ .main-navigation ul li.page_item_has_children:after {
+ border-bottom-color: #222;
+ }
+
+ .colors-dark .main-navigation li li.focus > a,
+ .colors-dark .main-navigation li li:focus > a,
+ .colors-dark .main-navigation li li:hover > a,
+ .colors-dark .main-navigation li li a:hover,
+ .colors-dark .main-navigation li li a:focus,
+ .colors-dark .main-navigation li li.current_page_item a:hover,
+ .colors-dark .main-navigation li li.current-menu-item a:hover,
+ .colors-dark .main-navigation li li.current_page_item a:focus,
+ .colors-dark .main-navigation li li.current-menu-item a:focus {
+ color: #222;
+ }
+
+}
diff --git a/bedrock/web/app/themes/orpheus/assets/css/editor-style.css b/bedrock/web/app/themes/orpheus/assets/css/editor-style.css
new file mode 100644
index 00000000..5c113734
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/css/editor-style.css
@@ -0,0 +1,600 @@
+/*
+Theme Name: Twenty Seventeen
+Description: Used to style the TinyMCE editor.
+*/
+
+
+/**
+ * Table of Contents:
+ *
+ * 1.0 - Body
+ * 2.0 - Typography
+ * 3.0 - Elements
+ * 4.0 - Alignment
+ * 5.0 - Caption
+ * 6.0 - Galleries
+ * 7.0 - Media Elements
+ * 8.0 - RTL
+ */
+
+/**
+ * 1.0 - Body
+ */
+
+body {
+ background-color: #fff;
+ color: #333;
+ margin: 20px 40px;
+ max-width: 580px;
+}
+
+/**
+ * 2.0 - Typography
+ */
+
+body,
+button,
+input,
+select,
+textarea {
+ font-family: "Libre Franklin", "Helvetica Neue", helvetica, arial, sans-serif;
+ font-size: 16px;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.66;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ clear: both;
+ line-height: 1.4;
+ margin: 0 0 0.75em;
+ padding: 1.5em 0 0;
+}
+
+h1:first-child,
+h2:first-child,
+h3:first-child,
+h4:first-child,
+h5:first-child,
+h6:first-child {
+ padding-top: 0;
+}
+
+h1 {
+ font-size: 24px;
+ font-size: 1.5rem;
+ font-weight: 300;
+}
+
+h2 {
+ color: #666;
+ font-size: 20px;
+ font-size: 1.25rem;
+ font-weight: 300;
+}
+
+h3 {
+ color: #333;
+ font-size: 18px;
+ font-size: 1.125rem;
+ font-weight: 300;
+}
+
+h4 {
+ color: #333;
+ font-size: 16px;
+ font-size: 1rem;
+ font-weight: 800;
+}
+
+h5 {
+ color: #767676;
+ font-size: 13px;
+ font-size: 0.8125rem;
+ font-weight: 800;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+}
+
+h6 {
+ color: #333;
+ font-size: 15px;
+ font-size: 0.9375rem;
+ font-weight: 800;
+}
+
+p {
+ margin: 0 0 1.5em;
+ padding: 0;
+}
+
+dfn,
+cite,
+em,
+i {
+ font-style: italic;
+}
+
+blockquote {
+ color: #666;
+ font-size: 18px;
+ font-size: 1.125rem;
+ font-style: italic;
+ line-height: 1.7;
+ margin: 0;
+ overflow: hidden;
+ padding: 0;
+}
+
+blockquote.alignleft,
+blockquote.alignright {
+ font-size: 14px;
+ font-size: 0.875rem;
+ width: 34%;
+}
+
+address {
+ margin: 0 0 1.5em;
+}
+
+pre {
+ background: #eee;
+ font-family: "Courier 10 Pitch", Courier, monospace;
+ font-size: 15px;
+ font-size: 0.9375rem;
+ line-height: 1.6;
+ margin-bottom: 1.6em;
+ max-width: 100%;
+ overflow: auto;
+ padding: 1.6em;
+}
+
+code,
+kbd,
+tt,
+var {
+ font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace;
+ font-size: 15px;
+ font-size: 0.9375rem;
+}
+
+abbr,
+acronym {
+ border-bottom: 1px dotted #666;
+ cursor: help;
+}
+
+mark,
+ins {
+ background: #eee;
+ text-decoration: none;
+}
+
+big {
+ font-size: 125%;
+}
+
+blockquote,
+q {
+ quotes: "" "";
+}
+
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+ content: "";
+}
+
+/* Typography for Thai Font */
+
+html[lang="th"] h1,
+html[lang="th"] h2,
+html[lang="th"] h3,
+html[lang="th"] h4,
+html[lang="th"] h5,
+html[lang="th"] h6 {
+ letter-spacing: 0;
+ line-height: 1.65;
+}
+
+html[lang="th"] body,
+html[lang="th"] button,
+html[lang="th"] input,
+html[lang="th"] select,
+html[lang="th"] textarea {
+ line-height: 1.8;
+}
+
+/**
+ * 3.0 - Elements
+ */
+
+hr {
+ background-color: #bbb;
+ border: 0;
+ height: 1px;
+ margin-bottom: 1.5em;
+}
+
+ul,
+ol {
+ margin: 0 0 1.5em;
+ padding: 0;
+}
+
+ul {
+ list-style: disc;
+}
+
+ol {
+ counter-reset: item;
+}
+
+ol li {
+ display: block;
+ position: relative;
+}
+
+ol li:before {
+ content: counter(item);
+ counter-increment: item;
+ font-weight: 800;
+ left: -1.5em;
+ position: absolute;
+}
+
+li > ul,
+li > ol {
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+dt {
+ font-weight: 700;
+}
+
+dd {
+ margin: 0 1.5em 1.5em;
+}
+
+table {
+ border-collapse: collapse;
+ margin: 0 0 1.5em;
+ width: 100%;
+}
+
+thead th {
+ border-bottom: 2px solid #bbb;
+ padding-bottom: 0.5em;
+}
+
+th {
+ padding: 0.4em;
+ text-align: left;
+}
+
+tr {
+ border-bottom: 1px solid #eee;
+}
+
+td {
+ padding: 0.4em;
+}
+
+th:first-child,
+td:first-child {
+ padding-left: 0;
+}
+
+th:last-child,
+td:last-child {
+ padding-right: 0;
+}
+
+a {
+ -webkit-box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1);
+ box-shadow: inset 0 -1px 0 rgba(15, 15, 15, 1);
+ color: #222;
+ text-decoration: none;
+ -webkit-transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out;
+ transition: color 80ms ease-in, -webkit-box-shadow 130ms ease-in-out;
+ transition: color 80ms ease-in, box-shadow 130ms ease-in-out;
+ transition: color 80ms ease-in, box-shadow 130ms ease-in-out, -webkit-box-shadow 130ms ease-in-out;
+}
+
+a:focus {
+ outline: thin dotted;
+}
+
+a:hover,
+a:focus {
+ color: #000;
+ -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1);
+ box-shadow: inset 0 0 0 rgba(0, 0, 0, 0), 0 3px 0 rgba(0, 0, 0, 1);
+}
+
+/* Fixes linked images */
+
+a img {
+ background: #fff;
+ -webkit-box-shadow: 0 0 0 6px #fff;
+ box-shadow: 0 0 0 6px #fff;
+}
+
+/**
+ * 4.0 - Alignment
+ */
+
+img {
+ height: auto; /* Make sure images are scaled correctly. */
+ width: inherit; /* Make images fill their parent's space. Solves IE8. */
+ max-width: 100%; /* Adhere to container width. */
+}
+
+embed,
+iframe,
+object {
+ margin-bottom: 1.5em;
+ max-width: 100%;
+}
+
+/**
+ * 5.0 - Caption
+ */
+
+.wp-caption {
+ color: #666;
+ font-size: 13px;
+ font-size: 0.8125rem;
+ font-style: italic;
+ margin-bottom: 1.5em;
+ max-width: 100%;
+}
+
+.wp-caption img[class*="wp-image-"] {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.wp-caption .wp-caption-text {
+ margin: 0.8075em 0;
+}
+
+/**
+ * 6.0 - Galleries
+ */
+
+.gallery {
+ margin-bottom: 1.5em;
+}
+
+.gallery-item {
+ display: inline-block;
+ text-align: center;
+ vertical-align: top;
+ width: 100%;
+}
+
+.gallery-item a,
+.gallery-item a:hover,
+.gallery-item a:focus {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ background: none;
+ display: inline-block;
+}
+
+.gallery-columns-2 .gallery-item {
+ max-width: 50%;
+}
+
+.gallery-columns-3 .gallery-item {
+ max-width: 33.33%;
+}
+
+.gallery-columns-4 .gallery-item {
+ max-width: 25%;
+}
+
+.gallery-columns-5 .gallery-item {
+ max-width: 20%;
+}
+
+.gallery-columns-6 .gallery-item {
+ max-width: 16.66%;
+}
+
+.gallery-columns-7 .gallery-item {
+ max-width: 14.28%;
+}
+
+.gallery-columns-8 .gallery-item {
+ max-width: 12.5%;
+}
+
+.gallery-columns-9 .gallery-item {
+ max-width: 11.11%;
+}
+
+.gallery-caption {
+ display: block;
+}
+
+/**
+ * 7.0 - Media Elements
+ */
+
+.mejs-container {
+ margin-bottom: 1.5em;
+}
+
+/* Audio Player */
+
+.mejs-controls a.mejs-horizontal-volume-slider,
+.mejs-controls a.mejs-horizontal-volume-slider:focus,
+.mejs-controls a.mejs-horizontal-volume-slider:hover {
+ background: transparent;
+ border: 0;
+}
+
+/* Playlist Color Overrides: Light */
+
+.wp-playlist-light {
+ border-color: #eee;
+ color: #222;
+}
+
+.wp-playlist-light .wp-playlist-current-item .wp-playlist-item-album {
+ color: #333;
+}
+
+.wp-playlist-light .wp-playlist-current-item .wp-playlist-item-artist {
+ color: #767676;
+}
+
+.wp-playlist-light .wp-playlist-item {
+ border-bottom: 1px dotted #eee;
+ -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out;
+ transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out;
+}
+
+.wp-playlist-light .wp-playlist-item:hover,
+.wp-playlist-light .wp-playlist-item:focus {
+ border-bottom-color: rgba(0, 0, 0, 0);
+ background-color: #767676;
+ color: #fff;
+}
+
+.wp-playlist-light a.wp-playlist-caption:hover,
+.wp-playlist-light .wp-playlist-item:hover a,
+.wp-playlist-light .wp-playlist-item:focus a {
+ color: #fff;
+}
+
+/* Playlist Color Overrides: Dark */
+
+.wp-playlist-dark {
+ background: #222;
+ border-color: #333;
+}
+
+.wp-playlist-dark .mejs-container .mejs-controls {
+ background-color: #333;
+}
+
+.wp-playlist-dark .wp-playlist-caption {
+ color: #fff;
+}
+
+.wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-album {
+ color: #eee;
+}
+
+.wp-playlist-dark .wp-playlist-current-item .wp-playlist-item-artist {
+ color: #aaa;
+}
+
+.wp-playlist-dark .wp-playlist-playing {
+ background-color: #333;
+}
+
+.wp-playlist-dark .wp-playlist-item {
+ border-bottom: 1px dotted #555;
+ -webkit-transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out;
+ transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.3s ease-in-out;
+}
+
+.wp-playlist-dark .wp-playlist-item:hover,
+.wp-playlist-dark .wp-playlist-item:focus {
+ border-bottom-color: rgba(0, 0, 0, 0);
+ background-color: #aaa;
+ color: #222;
+}
+
+.wp-playlist-dark a.wp-playlist-caption:hover,
+.wp-playlist-dark .wp-playlist-item:hover a,
+.wp-playlist-dark .wp-playlist-item:focus a {
+ color: #222;
+}
+
+/* Playlist Style Overrides */
+
+.wp-playlist {
+ padding: 0.625em 0.625em 0.3125em;
+}
+
+.wp-playlist-current-item .wp-playlist-item-title {
+ font-weight: 700;
+}
+
+.wp-playlist-current-item .wp-playlist-item-album {
+ font-style: normal;
+}
+
+.wp-playlist-current-item .wp-playlist-item-artist {
+ font-size: 10px;
+ font-size: 0.625rem;
+ font-weight: 800;
+ letter-spacing: 0.1818em;
+ text-transform: uppercase;
+}
+
+.wp-playlist-item {
+ padding: 0 0.3125em;
+ cursor: pointer;
+}
+
+.wp-playlist-item:last-of-type {
+ border-bottom: none;
+}
+
+.wp-playlist-item a {
+ padding: 0.3125em 0;
+ border-bottom: none;
+}
+
+.wp-playlist-item a,
+.wp-playlist-item a:focus,
+.wp-playlist-item a:hover {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ background: transparent;
+}
+
+.wp-playlist-item-length {
+ top: 5px;
+}
+
+/**
+ * 8.0 - RTL
+ */
+
+.rtl th {
+ text-align: right;
+}
+
+.rtl ol {
+ counter-reset: item;
+}
+
+.rtl ol li:before {
+ left: auto;
+ right: -1.5em;
+}
+
+.rtl li > ul,
+.rtl li > ol {
+ margin-left: 0;
+ margin-right: 1.5em;
+}
+
+.rtl .mejs-offscreen {
+ right: -10000px;
+}
diff --git a/bedrock/web/app/themes/orpheus/assets/css/ie8.css b/bedrock/web/app/themes/orpheus/assets/css/ie8.css
new file mode 100644
index 00000000..bf45c26c
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/css/ie8.css
@@ -0,0 +1,225 @@
+/*
+Theme Name: Twenty Seventeen
+Description: IE8 specific style.
+*/
+
+body {
+ font-size: 16px;
+}
+
+h1 {
+ font-size: 30px;
+ font-size: 1.875rem;
+}
+
+h2,
+.page .panel-content .recent-posts .entry-title {
+ font-size: 26px;
+ font-size: 1.625rem;
+}
+
+h3 {
+ font-size: 22px;
+ font-size: 1.375rem;
+}
+
+h4 {
+ font-size: 18px;
+ font-size: 1.125rem;
+}
+
+h5 {
+ font-size: 13px;
+ font-size: 0.8125rem;
+}
+
+h6 {
+ font-size: 16px;
+ font-size: 1rem;
+}
+
+img {
+ width: inherit; /* Make images fill their parent's space. */
+}
+
+/* Fixes linked images */
+.entry-content a img,
+.widget a img {
+ filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=5, Color=#ffffff);
+}
+
+/* Layout */
+
+.site-content {
+ padding: 6.5em 0 0;
+}
+
+/* Site Branding */
+
+.custom-header {
+ overflow: hidden;
+}
+
+.has-header-image.twentyseventeen-front-page .custom-header,
+.has-header-image.home.blog .custom-header {
+ display: block;
+}
+
+.custom-header-media {
+ background-position: bottom center;
+}
+
+.site-branding {
+ padding: 45px 0;
+}
+
+.has-header-image.twentyseventeen-front-page .site-branding,
+.has-header-image.home.blog .site-branding {
+ bottom: 0;
+ display: block;
+ left: 0;
+ height: auto;
+ padding-top: 0;
+ position: absolute;
+ width: 100%;
+}
+
+.has-header-image .custom-header-media img {
+ left: 0;
+ top: 0;
+}
+
+.site-title {
+ font-size: 36px;
+ font-weight: 700;
+}
+
+.site-description {
+ font-size: 16px;
+}
+
+/* Main Navigation */
+
+.navigation-top {
+ background: #fff;
+ position: relative;
+ z-index: 10;
+}
+
+.menu-toggle {
+ width: 150px;
+}
+
+.main-navigation ul#top-menu {
+ margin-bottom: -1px;
+ padding: 0;
+}
+
+.no-svg .dropdown-toggle {
+ padding: 0.25em 0 0;
+}
+
+.no-svg .dropdown-toggle.toggled-on {
+ padding: 0.75em 0 0;
+}
+
+.dropdown-toggle .svg-fallback.icon-angle-down {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=-1, M12=1.2246467991473532e-16, M21=-1.2246467991473532e-16, M22=-1, SizingMethod='auto expand')";
+}
+
+.dropdown-toggle.toggled-on .svg-fallback.icon-angle-down {
+ -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=1, M12=0, M21=0, M22=1, SizingMethod='auto expand')";
+}
+
+/* Front Page */
+
+.twentyseventeen-front-page.has-header-image .custom-header,
+.blog.home.has-header-image .custom-header,
+.panel-image {
+ height: 800px;
+ max-height: 800px;
+ padding-top: 0;
+}
+
+.twentyseventeen-front-page .custom-header-media,
+.blog.home .custom-header-media {
+ background-position: center center;
+}
+
+.twentyseventeen-front-page.has-header-image .site-branding,
+.home.blog.has-header-image .site-branding {
+ bottom: 20px;
+ position: absolute;
+ width: 100%;
+}
+
+.page .panel-content .entry-title,
+.page-title,
+.page .entry-title {
+ font-size: 14px;
+ font-size: 0.875rem;
+ font-weight: 700;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+}
+
+/* Posts */
+
+.blog .site-main > article,
+.archive .site-main > article,
+.search .site-main > article {
+ padding-bottom: 4em;
+}
+
+time.updated {
+ display: none;
+}
+
+time.published {
+ display: inline-block;
+}
+
+.blog .entry-title {
+ padding-top: 0;
+}
+
+.single-post .entry-title,
+.page .entry-title,
+.entry-meta + .entry-title {
+ font-size: 26px;
+ font-weight: 400;
+ letter-spacing: normal;
+ padding-top: 0;
+ text-transform: none;
+}
+
+.entry-footer .cat-links,
+.entry-footer .tags-links {
+ padding-left: 0;
+}
+
+.comment-author .avatar {
+ z-index: -1;
+}
+
+ol.children .children {
+ padding-left: 2em;
+}
+
+/* RTL Styles */
+
+.rtl .has-header-image.twentyseventeen-front-page .site-branding,
+.rtl .has-header-image.home.blog .site-branding {
+ left: auto;
+ right: 0;
+}
+
+.rtl .entry-footer .cat-links,
+.rtl .entry-footer .tags-links {
+ padding-right: 0;
+}
+
+.rtl ol.children .children {
+ padding-left: 0;
+ padding-right: 2em;
+}
diff --git a/bedrock/web/app/themes/orpheus/assets/css/ie9.css b/bedrock/web/app/themes/orpheus/assets/css/ie9.css
new file mode 100644
index 00000000..9f8f7664
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/css/ie9.css
@@ -0,0 +1,43 @@
+/*
+Theme Name: Twenty Seventeen
+Description: IE9 specific styles.
+*/
+
+.has-header-image.twentyseventeen-front-page .custom-header,
+.has-header-video.twentyseventeen-front-page .custom-header,
+.has-header-image.home.blog .custom-header,
+.has-header-video.home.blog .custom-header {
+ height: 300px;
+}
+
+.has-header-image .custom-header-media img,
+.has-header-video .custom-header-media video,
+.has-header-video .custom-header-media iframe {
+ min-width: 100%;
+}
+
+@media screen and (min-width: 30em) {
+
+ .has-header-image.twentyseventeen-front-page .custom-header,
+ .has-header-video.twentyseventeen-front-page .custom-header,
+ .has-header-image.home.blog .custom-header,
+ .has-header-video.home.blog .custom-header,
+ .twentyseventeen-front-page.has-header-image .custom-header-media,
+ .home.blog.has-header-image .custom-header-media,
+ .panel-image {
+ height: 700px;
+ }
+}
+
+@media screen and (min-width: 48em) {
+
+ .has-header-image.twentyseventeen-front-page .custom-header,
+ .has-header-video.twentyseventeen-front-page .custom-header,
+ .has-header-image.home.blog .custom-header,
+ .has-header-video.home.blog .custom-header,
+ .twentyseventeen-front-page.has-header-image .custom-header-media,
+ .home.blog.has-header-image .custom-header-media,
+ .panel-image {
+ height: 1000px;
+ }
+}
diff --git a/bedrock/web/app/themes/orpheus/assets/images/coffee.jpg b/bedrock/web/app/themes/orpheus/assets/images/coffee.jpg
new file mode 100644
index 00000000..13847cde
Binary files /dev/null and b/bedrock/web/app/themes/orpheus/assets/images/coffee.jpg differ
diff --git a/bedrock/web/app/themes/orpheus/assets/images/espresso.jpg b/bedrock/web/app/themes/orpheus/assets/images/espresso.jpg
new file mode 100644
index 00000000..7514c96b
Binary files /dev/null and b/bedrock/web/app/themes/orpheus/assets/images/espresso.jpg differ
diff --git a/bedrock/web/app/themes/orpheus/assets/images/header.jpg b/bedrock/web/app/themes/orpheus/assets/images/header.jpg
new file mode 100644
index 00000000..a3fd3e71
Binary files /dev/null and b/bedrock/web/app/themes/orpheus/assets/images/header.jpg differ
diff --git a/bedrock/web/app/themes/orpheus/assets/images/sandwich.jpg b/bedrock/web/app/themes/orpheus/assets/images/sandwich.jpg
new file mode 100644
index 00000000..6baddbf0
Binary files /dev/null and b/bedrock/web/app/themes/orpheus/assets/images/sandwich.jpg differ
diff --git a/bedrock/web/app/themes/orpheus/assets/images/svg-icons.svg b/bedrock/web/app/themes/orpheus/assets/images/svg-icons.svg
new file mode 100644
index 00000000..eb579db1
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/images/svg-icons.svg
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bedrock/web/app/themes/orpheus/assets/js/customize-controls.js b/bedrock/web/app/themes/orpheus/assets/js/customize-controls.js
new file mode 100644
index 00000000..e6f6037a
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/js/customize-controls.js
@@ -0,0 +1,36 @@
+/**
+ * Scripts within the customizer controls window.
+ *
+ * Contextually shows the color hue control and informs the preview
+ * when users open or close the front page sections section.
+ */
+
+(function() {
+ wp.customize.bind( 'ready', function() {
+
+ // Only show the color hue control when there's a custom color scheme.
+ wp.customize( 'colorscheme', function( setting ) {
+ wp.customize.control( 'colorscheme_hue', function( control ) {
+ var visibility = function() {
+ if ( 'custom' === setting.get() ) {
+ control.container.slideDown( 180 );
+ } else {
+ control.container.slideUp( 180 );
+ }
+ };
+
+ visibility();
+ setting.bind( visibility );
+ });
+ });
+
+ // Detect when the front page sections section is expanded (or closed) so we can adjust the preview accordingly.
+ wp.customize.section( 'theme_options', function( section ) {
+ section.expanded.bind( function( isExpanding ) {
+
+ // Value of isExpanding will = true if you're entering the section, false if you're leaving it.
+ wp.customize.previewer.send( 'section-highlight', { expanded: isExpanding });
+ } );
+ } );
+ });
+})( jQuery );
diff --git a/bedrock/web/app/themes/orpheus/assets/js/customize-preview.js b/bedrock/web/app/themes/orpheus/assets/js/customize-preview.js
new file mode 100644
index 00000000..dba7b79b
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/js/customize-preview.js
@@ -0,0 +1,150 @@
+/**
+ * File customize-preview.js.
+ *
+ * Instantly live-update customizer settings in the preview for improved user experience.
+ */
+
+(function( $ ) {
+
+ // Collect information from customize-controls.js about which panels are opening.
+ wp.customize.bind( 'preview-ready', function() {
+
+ // Initially hide the theme option placeholders on load
+ $( '.panel-placeholder' ).hide();
+
+ wp.customize.preview.bind( 'section-highlight', function( data ) {
+
+ // Only on the front page.
+ if ( ! $( 'body' ).hasClass( 'twentyseventeen-front-page' ) ) {
+ return;
+ }
+
+ // When the section is expanded, show and scroll to the content placeholders, exposing the edit links.
+ if ( true === data.expanded ) {
+ $( 'body' ).addClass( 'highlight-front-sections' );
+ $( '.panel-placeholder' ).slideDown( 200, function() {
+ $.scrollTo( $( '#panel1' ), {
+ duration: 600,
+ offset: { 'top': -70 } // Account for sticky menu.
+ });
+ });
+
+ // If we've left the panel, hide the placeholders and scroll back to the top.
+ } else {
+ $( 'body' ).removeClass( 'highlight-front-sections' );
+ // Don't change scroll when leaving - it's likely to have unintended consequences.
+ $( '.panel-placeholder' ).slideUp( 200 );
+ }
+ });
+ });
+
+ // Site title and description.
+ wp.customize( 'blogname', function( value ) {
+ value.bind( function( to ) {
+ $( '.site-title a' ).text( to );
+ });
+ });
+ wp.customize( 'blogdescription', function( value ) {
+ value.bind( function( to ) {
+ $( '.site-description' ).text( to );
+ });
+ });
+
+ // Header text color.
+ wp.customize( 'header_textcolor', function( value ) {
+ value.bind( function( to ) {
+ if ( 'blank' === to ) {
+ $( '.site-title, .site-description' ).css({
+ clip: 'rect(1px, 1px, 1px, 1px)',
+ position: 'absolute'
+ });
+ // Add class for different logo styles if title and description are hidden.
+ $( 'body' ).addClass( 'title-tagline-hidden' );
+ } else {
+
+ // Check if the text color has been removed and use default colors in theme stylesheet.
+ if ( ! to.length ) {
+ $( '#twentyseventeen-custom-header-styles' ).remove();
+ }
+ $( '.site-title, .site-description' ).css({
+ clip: 'auto',
+ position: 'relative'
+ });
+ $( '.site-branding, .site-branding a, .site-description, .site-description a' ).css({
+ color: to
+ });
+ // Add class for different logo styles if title and description are visible.
+ $( 'body' ).removeClass( 'title-tagline-hidden' );
+ }
+ });
+ });
+
+ // Color scheme.
+ wp.customize( 'colorscheme', function( value ) {
+ value.bind( function( to ) {
+
+ // Update color body class.
+ $( 'body' )
+ .removeClass( 'colors-light colors-dark colors-custom' )
+ .addClass( 'colors-' + to );
+ });
+ });
+
+ // Custom color hue.
+ wp.customize( 'colorscheme_hue', function( value ) {
+ value.bind( function( to ) {
+
+ // Update custom color CSS.
+ var style = $( '#custom-theme-colors' ),
+ hue = style.data( 'hue' ),
+ css = style.html();
+
+ // Equivalent to css.replaceAll, with hue followed by comma to prevent values with units from being changed.
+ css = css.split( hue + ',' ).join( to + ',' );
+ style.html( css ).data( 'hue', to );
+ });
+ });
+
+ // Page layouts.
+ wp.customize( 'page_layout', function( value ) {
+ value.bind( function( to ) {
+ if ( 'one-column' === to ) {
+ $( 'body' ).addClass( 'page-one-column' ).removeClass( 'page-two-column' );
+ } else {
+ $( 'body' ).removeClass( 'page-one-column' ).addClass( 'page-two-column' );
+ }
+ } );
+ } );
+
+ // Whether a header image is available.
+ function hasHeaderImage() {
+ var image = wp.customize( 'header_image' )();
+ return '' !== image && 'remove-header' !== image;
+ }
+
+ // Whether a header video is available.
+ function hasHeaderVideo() {
+ var externalVideo = wp.customize( 'external_header_video' )(),
+ video = wp.customize( 'header_video' )();
+
+ return '' !== externalVideo || ( 0 !== video && '' !== video );
+ }
+
+ // Toggle a body class if a custom header exists.
+ $.each( [ 'external_header_video', 'header_image', 'header_video' ], function( index, settingId ) {
+ wp.customize( settingId, function( setting ) {
+ setting.bind(function() {
+ if ( hasHeaderImage() ) {
+ $( document.body ).addClass( 'has-header-image' );
+ } else {
+ $( document.body ).removeClass( 'has-header-image' );
+ }
+
+ if ( ! hasHeaderVideo() ) {
+ $( document.body ).removeClass( 'has-header-video' );
+ }
+ } );
+ } );
+ } );
+
+} )( jQuery );
diff --git a/bedrock/web/app/themes/orpheus/assets/js/global.js b/bedrock/web/app/themes/orpheus/assets/js/global.js
new file mode 100644
index 00000000..6e2f4290
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/js/global.js
@@ -0,0 +1,249 @@
+/* global twentyseventeenScreenReaderText */
+(function( $ ) {
+
+ // Variables and DOM Caching.
+ var $body = $( 'body' ),
+ $customHeader = $body.find( '.custom-header' ),
+ $branding = $customHeader.find( '.site-branding' ),
+ $navigation = $body.find( '.navigation-top' ),
+ $navWrap = $navigation.find( '.wrap' ),
+ $navMenuItem = $navigation.find( '.menu-item' ),
+ $menuToggle = $navigation.find( '.menu-toggle' ),
+ $menuScrollDown = $body.find( '.menu-scroll-down' ),
+ $sidebar = $body.find( '#secondary' ),
+ $entryContent = $body.find( '.entry-content' ),
+ $formatQuote = $body.find( '.format-quote blockquote' ),
+ isFrontPage = $body.hasClass( 'twentyseventeen-front-page' ) || $body.hasClass( 'home blog' ),
+ navigationFixedClass = 'site-navigation-fixed',
+ navigationHeight,
+ navigationOuterHeight,
+ navPadding,
+ navMenuItemHeight,
+ idealNavHeight,
+ navIsNotTooTall,
+ headerOffset,
+ menuTop = 0,
+ resizeTimer;
+
+ // Ensure the sticky navigation doesn't cover current focused links.
+ $( 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], [contenteditable]', '.site-content-contain' ).filter( ':visible' ).focus( function() {
+ if ( $navigation.hasClass( 'site-navigation-fixed' ) ) {
+ var windowScrollTop = $( window ).scrollTop(),
+ fixedNavHeight = $navigation.height(),
+ itemScrollTop = $( this ).offset().top,
+ offsetDiff = itemScrollTop - windowScrollTop;
+
+ // Account for Admin bar.
+ if ( $( '#wpadminbar' ).length ) {
+ offsetDiff -= $( '#wpadminbar' ).height();
+ }
+
+ if ( offsetDiff < fixedNavHeight ) {
+ $( window ).scrollTo( itemScrollTop - ( fixedNavHeight + 50 ), 0 );
+ }
+ }
+ });
+
+ // Set properties of navigation.
+ function setNavProps() {
+ navigationHeight = $navigation.height();
+ navigationOuterHeight = $navigation.outerHeight();
+ navPadding = parseFloat( $navWrap.css( 'padding-top' ) ) * 2;
+ navMenuItemHeight = $navMenuItem.outerHeight() * 2;
+ idealNavHeight = navPadding + navMenuItemHeight;
+ navIsNotTooTall = navigationHeight <= idealNavHeight;
+ }
+
+ // Make navigation 'stick'.
+ function adjustScrollClass() {
+
+ // Make sure we're not on a mobile screen.
+ if ( 'none' === $menuToggle.css( 'display' ) ) {
+
+ // Make sure the nav isn't taller than two rows.
+ if ( navIsNotTooTall ) {
+
+ // When there's a custom header image or video, the header offset includes the height of the navigation.
+ if ( isFrontPage && ( $body.hasClass( 'has-header-image' ) || $body.hasClass( 'has-header-video' ) ) ) {
+ headerOffset = $customHeader.innerHeight() - navigationOuterHeight;
+ } else {
+ headerOffset = $customHeader.innerHeight();
+ }
+
+ // If the scroll is more than the custom header, set the fixed class.
+ if ( $( window ).scrollTop() >= headerOffset ) {
+ $navigation.addClass( navigationFixedClass );
+ } else {
+ $navigation.removeClass( navigationFixedClass );
+ }
+
+ } else {
+
+ // Remove 'fixed' class if nav is taller than two rows.
+ $navigation.removeClass( navigationFixedClass );
+ }
+ }
+ }
+
+ // Set margins of branding in header.
+ function adjustHeaderHeight() {
+ if ( 'none' === $menuToggle.css( 'display' ) ) {
+
+ // The margin should be applied to different elements on front-page or home vs interior pages.
+ if ( isFrontPage ) {
+ $branding.css( 'margin-bottom', navigationOuterHeight );
+ } else {
+ $customHeader.css( 'margin-bottom', navigationOuterHeight );
+ }
+
+ } else {
+ $customHeader.css( 'margin-bottom', '0' );
+ $branding.css( 'margin-bottom', '0' );
+ }
+ }
+
+ // Set icon for quotes.
+ function setQuotesIcon() {
+ $( twentyseventeenScreenReaderText.quote ).prependTo( $formatQuote );
+ }
+
+ // Add 'below-entry-meta' class to elements.
+ function belowEntryMetaClass( param ) {
+ var sidebarPos, sidebarPosBottom;
+
+ if ( ! $body.hasClass( 'has-sidebar' ) || (
+ $body.hasClass( 'search' ) ||
+ $body.hasClass( 'single-attachment' ) ||
+ $body.hasClass( 'error404' ) ||
+ $body.hasClass( 'twentyseventeen-front-page' )
+ ) ) {
+ return;
+ }
+
+ sidebarPos = $sidebar.offset();
+ sidebarPosBottom = sidebarPos.top + ( $sidebar.height() + 28 );
+
+ $entryContent.find( param ).each( function() {
+ var $element = $( this ),
+ elementPos = $element.offset(),
+ elementPosTop = elementPos.top;
+
+ // Add 'below-entry-meta' to elements below the entry meta.
+ if ( elementPosTop > sidebarPosBottom ) {
+ $element.addClass( 'below-entry-meta' );
+ } else {
+ $element.removeClass( 'below-entry-meta' );
+ }
+ });
+ }
+
+ /*
+ * Test if inline SVGs are supported.
+ * @link https://github.com/Modernizr/Modernizr/
+ */
+ function supportsInlineSVG() {
+ var div = document.createElement( 'div' );
+ div.innerHTML = ' ';
+ return 'http://www.w3.org/2000/svg' === ( 'undefined' !== typeof SVGRect && div.firstChild && div.firstChild.namespaceURI );
+ }
+
+ /**
+ * Test if an iOS device.
+ */
+ function checkiOS() {
+ return /iPad|iPhone|iPod/.test(navigator.userAgent) && ! window.MSStream;
+ }
+
+ /*
+ * Test if background-attachment: fixed is supported.
+ * @link http://stackoverflow.com/questions/14115080/detect-support-for-background-attachment-fixed
+ */
+ function supportsFixedBackground() {
+ var el = document.createElement('div'),
+ isSupported;
+
+ try {
+ if ( ! ( 'backgroundAttachment' in el.style ) || checkiOS() ) {
+ return false;
+ }
+ el.style.backgroundAttachment = 'fixed';
+ isSupported = ( 'fixed' === el.style.backgroundAttachment );
+ return isSupported;
+ }
+ catch (e) {
+ return false;
+ }
+ }
+
+ // Fire on document ready.
+ $( document ).ready( function() {
+
+ // If navigation menu is present on page, setNavProps and adjustScrollClass.
+ if ( $navigation.length ) {
+ setNavProps();
+ adjustScrollClass();
+ }
+
+ // If 'Scroll Down' arrow in present on page, calculate scroll offset and bind an event handler to the click event.
+ if ( $menuScrollDown.length ) {
+
+ if ( $( 'body' ).hasClass( 'admin-bar' ) ) {
+ menuTop -= 32;
+ }
+ if ( $( 'body' ).hasClass( 'blog' ) ) {
+ menuTop -= 30; // The div for latest posts has no space above content, add some to account for this.
+ }
+ if ( ! $navigation.length ) {
+ navigationOuterHeight = 0;
+ }
+
+ $menuScrollDown.click( function( e ) {
+ e.preventDefault();
+ $( window ).scrollTo( '#primary', {
+ duration: 600,
+ offset: { top: menuTop - navigationOuterHeight }
+ });
+ });
+ }
+
+ adjustHeaderHeight();
+ setQuotesIcon();
+ if ( true === supportsInlineSVG() ) {
+ document.documentElement.className = document.documentElement.className.replace( /(\s*)no-svg(\s*)/, '$1svg$2' );
+ }
+
+ if ( true === supportsFixedBackground() ) {
+ document.documentElement.className += ' background-fixed';
+ }
+ });
+
+ // If navigation menu is present on page, adjust it on scroll and screen resize.
+ if ( $navigation.length ) {
+
+ // On scroll, we want to stick/unstick the navigation.
+ $( window ).on( 'scroll', function() {
+ adjustScrollClass();
+ adjustHeaderHeight();
+ });
+
+ // Also want to make sure the navigation is where it should be on resize.
+ $( window ).resize( function() {
+ setNavProps();
+ setTimeout( adjustScrollClass, 500 );
+ });
+ }
+
+ $( window ).resize( function() {
+ clearTimeout( resizeTimer );
+ resizeTimer = setTimeout( function() {
+ belowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' );
+ }, 300 );
+ setTimeout( adjustHeaderHeight, 1000 );
+ });
+
+ // Add header video class after the video is loaded.
+ $( document ).on( 'wp-custom-header-video-loaded', function() {
+ $body.addClass( 'has-header-video' );
+ });
+
+})( jQuery );
diff --git a/bedrock/web/app/themes/orpheus/assets/js/html5.js b/bedrock/web/app/themes/orpheus/assets/js/html5.js
new file mode 100644
index 00000000..9c1f0495
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/js/html5.js
@@ -0,0 +1,326 @@
+/**
+* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
+*/
+;(function(window, document) {
+/*jshint evil:true */
+ /** version */
+ var version = '3.7.3';
+
+ /** Preset options */
+ var options = window.html5 || {};
+
+ /** Used to skip problem elements */
+ var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
+
+ /** Not all elements can be cloned in IE **/
+ var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
+
+ /** Detect whether the browser supports default html5 styles */
+ var supportsHtml5Styles;
+
+ /** Name of the expando, to work with multiple documents or to re-shiv one document */
+ var expando = '_html5shiv';
+
+ /** The id for the the documents expando */
+ var expanID = 0;
+
+ /** Cached data for each document */
+ var expandoData = {};
+
+ /** Detect whether the browser supports unknown elements */
+ var supportsUnknownElements;
+
+ (function() {
+ try {
+ var a = document.createElement('a');
+ a.innerHTML = ' ';
+ //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
+ supportsHtml5Styles = ('hidden' in a);
+
+ supportsUnknownElements = a.childNodes.length == 1 || (function() {
+ // assign a false positive if unable to shiv
+ (document.createElement)('a');
+ var frag = document.createDocumentFragment();
+ return (
+ typeof frag.cloneNode == 'undefined' ||
+ typeof frag.createDocumentFragment == 'undefined' ||
+ typeof frag.createElement == 'undefined'
+ );
+ }());
+ } catch(e) {
+ // assign a false positive if detection fails => unable to shiv
+ supportsHtml5Styles = true;
+ supportsUnknownElements = true;
+ }
+
+ }());
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Creates a style sheet with the given CSS text and adds it to the document.
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @param {String} cssText The CSS text.
+ * @returns {StyleSheet} The style element.
+ */
+ function addStyleSheet(ownerDocument, cssText) {
+ var p = ownerDocument.createElement('p'),
+ parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
+
+ p.innerHTML = 'x';
+ return parent.insertBefore(p.lastChild, parent.firstChild);
+ }
+
+ /**
+ * Returns the value of `html5.elements` as an array.
+ * @private
+ * @returns {Array} An array of shived element node names.
+ */
+ function getElements() {
+ var elements = html5.elements;
+ return typeof elements == 'string' ? elements.split(' ') : elements;
+ }
+
+ /**
+ * Extends the built-in list of html5 elements
+ * @memberOf html5
+ * @param {String|Array} newElements whitespace separated list or array of new element names to shiv
+ * @param {Document} ownerDocument The context document.
+ */
+ function addElements(newElements, ownerDocument) {
+ var elements = html5.elements;
+ if(typeof elements != 'string'){
+ elements = elements.join(' ');
+ }
+ if(typeof newElements != 'string'){
+ newElements = newElements.join(' ');
+ }
+ html5.elements = elements +' '+ newElements;
+ shivDocument(ownerDocument);
+ }
+
+ /**
+ * Returns the data associated to the given document
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @returns {Object} An object of data.
+ */
+ function getExpandoData(ownerDocument) {
+ var data = expandoData[ownerDocument[expando]];
+ if (!data) {
+ data = {};
+ expanID++;
+ ownerDocument[expando] = expanID;
+ expandoData[expanID] = data;
+ }
+ return data;
+ }
+
+ /**
+ * returns a shived element for the given nodeName and document
+ * @memberOf html5
+ * @param {String} nodeName name of the element
+ * @param {Document|DocumentFragment} ownerDocument The context document.
+ * @returns {Object} The shived element.
+ */
+ function createElement(nodeName, ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createElement(nodeName);
+ }
+ if (!data) {
+ data = getExpandoData(ownerDocument);
+ }
+ var node;
+
+ if (data.cache[nodeName]) {
+ node = data.cache[nodeName].cloneNode();
+ } else if (saveClones.test(nodeName)) {
+ node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
+ } else {
+ node = data.createElem(nodeName);
+ }
+
+ // Avoid adding some elements to fragments in IE < 9 because
+ // * Attributes like `name` or `type` cannot be set/changed once an element
+ // is inserted into a document/fragment
+ // * Link elements with `src` attributes that are inaccessible, as with
+ // a 403 response, will cause the tab/window to crash
+ // * Script elements appended to fragments will execute when their `src`
+ // or `text` property is set
+ return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
+ }
+
+ /**
+ * returns a shived DocumentFragment for the given document
+ * @memberOf html5
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived DocumentFragment.
+ */
+ function createDocumentFragment(ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createDocumentFragment();
+ }
+ data = data || getExpandoData(ownerDocument);
+ var clone = data.frag.cloneNode(),
+ i = 0,
+ elems = getElements(),
+ l = elems.length;
+ for(;igmailcom | http://flesler.blogspot.com
+ * Licensed under MIT
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
+ * @projectDescription Lightweight, cross-browser and highly customizable animated scrolling with jQuery
+ * @author Ariel Flesler
+ * @version 2.1.2
+ */
+;(function(factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // AMD
+ define( ['jquery'], factory );
+ } else if (typeof module !== 'undefined' && module.exports) {
+ // CommonJS
+ module.exports = factory( require( 'jquery' ) );
+ } else {
+ // Global
+ factory( jQuery );
+ }
+})(function($) {
+ 'use strict';
+
+ var $scrollTo = $.scrollTo = function(target, duration, settings) {
+ return $( window ).scrollTo( target, duration, settings );
+ };
+
+ $scrollTo.defaults = {
+ axis:'xy',
+ duration: 0,
+ limit:true
+ };
+
+ function isWin(elem) {
+ return ! elem.nodeName ||
+ $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) !== -1;
+ }
+
+ $.fn.scrollTo = function(target, duration, settings) {
+ if (typeof duration === 'object') {
+ settings = duration;
+ duration = 0;
+ }
+ if (typeof settings === 'function') {
+ settings = { onAfter:settings };
+ }
+ if (target === 'max') {
+ target = 9e9;
+ }
+
+ settings = $.extend( {}, $scrollTo.defaults, settings );
+ // Speed is still recognized for backwards compatibility
+ duration = duration || settings.duration;
+ // Make sure the settings are given right
+ var queue = settings.queue && settings.axis.length > 1;
+ if (queue) {
+ // Let's keep the overall duration
+ duration /= 2;
+ }
+ settings.offset = both( settings.offset );
+ settings.over = both( settings.over );
+
+ return this.each(function() {
+ // Null target yields nothing, just like jQuery does
+ if (target === null) { return; }
+
+ var win = isWin( this ),
+ elem = win ? this.contentWindow || window : this,
+ $elem = $( elem ),
+ targ = target,
+ attr = {},
+ toff;
+
+ switch (typeof targ) {
+ // A number will pass the regex
+ case 'number':
+ case 'string':
+ if (/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test( targ )) {
+ targ = both( targ );
+ // We are done
+ break;
+ }
+ // Relative/Absolute selector
+ targ = win ? $( targ ) : $( targ, elem );
+ /* falls through */
+ case 'object':
+ if (targ.length === 0) { return; }
+ // DOMElement / jQuery
+ if (targ.is || targ.style) {
+ // Get the real position of the target
+ toff = (targ = $( targ )).offset();
+ }
+ }
+
+ var offset = $.isFunction( settings.offset ) && settings.offset( elem, targ ) || settings.offset;
+
+ $.each(settings.axis.split( '' ), function(i, axis) {
+ var Pos = axis === 'x' ? 'Left' : 'Top',
+ pos = Pos.toLowerCase(),
+ key = 'scroll' + Pos,
+ prev = $elem[key](),
+ max = $scrollTo.max( elem, axis );
+
+ if (toff) {// jQuery / DOMElement
+ attr[key] = toff[pos] + (win ? 0 : prev - $elem.offset()[pos]);
+
+ // If it's a dom element, reduce the margin
+ if (settings.margin) {
+ attr[key] -= parseInt( targ.css( 'margin' + Pos ), 10 ) || 0;
+ attr[key] -= parseInt( targ.css( 'border' + Pos + 'Width' ), 10 ) || 0;
+ }
+
+ attr[key] += offset[pos] || 0;
+
+ if (settings.over[pos]) {
+ // Scroll to a fraction of its width/height
+ attr[key] += targ[axis === 'x'?'width':'height']() * settings.over[pos];
+ }
+ } else {
+ var val = targ[pos];
+ // Handle percentage values
+ attr[key] = val.slice && val.slice( -1 ) === '%' ?
+ parseFloat( val ) / 100 * max
+ : val;
+ }
+
+ // Number or 'number'
+ if (settings.limit && /^\d+$/.test( attr[key] )) {
+ // Check the limits
+ attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max );
+ }
+
+ // Don't waste time animating, if there's no need.
+ if ( ! i && settings.axis.length > 1) {
+ if (prev === attr[key]) {
+ // No animation needed
+ attr = {};
+ } else if (queue) {
+ // Intermediate animation
+ animate( settings.onAfterFirst );
+ // Don't animate this axis again in the next iteration.
+ attr = {};
+ }
+ }
+ });
+
+ animate( settings.onAfter );
+
+ function animate(callback) {
+ var opts = $.extend({}, settings, {
+ // The queue setting conflicts with animate()
+ // Force it to always be true
+ queue: true,
+ duration: duration,
+ complete: callback && function() {
+ callback.call( elem, targ, settings );
+ }
+ });
+ $elem.animate( attr, opts );
+ }
+ });
+ };
+
+ // Max scrolling position, works on quirks mode
+ // It only fails (not too badly) on IE, quirks mode.
+ $scrollTo.max = function(elem, axis) {
+ var Dim = axis === 'x' ? 'Width' : 'Height',
+ scroll = 'scroll' + Dim;
+
+ if ( ! isWin( elem )) {
+ return elem[scroll] - $( elem )[Dim.toLowerCase()](); }
+
+ var size = 'client' + Dim,
+ doc = elem.ownerDocument || elem.document,
+ html = doc.documentElement,
+ body = doc.body;
+
+ return Math.max( html[scroll], body[scroll] ) - Math.min( html[size], body[size] );
+ };
+
+ function both(val) {
+ return $.isFunction( val ) || $.isPlainObject( val ) ? val : { top:val, left:val };
+ }
+
+ // Add special hooks so that window scroll properties can be animated
+ $.Tween.propHooks.scrollLeft = $.Tween.propHooks.scrollTop = {
+ get: function(t) {
+ return $( t.elem )[t.prop]();
+ },
+ set: function(t) {
+ var curr = this.get( t );
+ // If interrupt is true and user scrolled, stop animating
+ if (t.options.interrupt && t._last && t._last !== curr) {
+ return $( t.elem ).stop();
+ }
+ var next = Math.round( t.now );
+ // Don't waste CPU
+ // Browsers don't render floating point scroll
+ if (curr !== next) {
+ $( t.elem )[t.prop](next);
+ t._last = this.get( t );
+ }
+ }
+ };
+
+ // AMD requirement
+ return $scrollTo;
+});
diff --git a/bedrock/web/app/themes/orpheus/assets/js/navigation.js b/bedrock/web/app/themes/orpheus/assets/js/navigation.js
new file mode 100644
index 00000000..f0fd6524
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/js/navigation.js
@@ -0,0 +1,109 @@
+/* global twentyseventeenScreenReaderText */
+/**
+ * Theme functions file.
+ *
+ * Contains handlers for navigation and widget area.
+ */
+
+(function( $ ) {
+ var masthead, menuToggle, siteNavContain, siteNavigation;
+
+ function initMainNavigation( container ) {
+
+ // Add dropdown toggle that displays child menu items.
+ var dropdownToggle = $( ' ', { 'class': 'dropdown-toggle', 'aria-expanded': false })
+ .append( twentyseventeenScreenReaderText.icon )
+ .append( $( ' ', { 'class': 'screen-reader-text', text: twentyseventeenScreenReaderText.expand }) );
+
+ container.find( '.menu-item-has-children > a, .page_item_has_children > a' ).after( dropdownToggle );
+
+ // Set the active submenu dropdown toggle button initial state.
+ container.find( '.current-menu-ancestor > button' )
+ .addClass( 'toggled-on' )
+ .attr( 'aria-expanded', 'true' )
+ .find( '.screen-reader-text' )
+ .text( twentyseventeenScreenReaderText.collapse );
+ // Set the active submenu initial state.
+ container.find( '.current-menu-ancestor > .sub-menu' ).addClass( 'toggled-on' );
+
+ container.find( '.dropdown-toggle' ).click( function( e ) {
+ var _this = $( this ),
+ screenReaderSpan = _this.find( '.screen-reader-text' );
+
+ e.preventDefault();
+ _this.toggleClass( 'toggled-on' );
+ _this.next( '.children, .sub-menu' ).toggleClass( 'toggled-on' );
+
+ _this.attr( 'aria-expanded', _this.attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' );
+
+ screenReaderSpan.text( screenReaderSpan.text() === twentyseventeenScreenReaderText.expand ? twentyseventeenScreenReaderText.collapse : twentyseventeenScreenReaderText.expand );
+ });
+ }
+
+ initMainNavigation( $( '.main-navigation' ) );
+
+ masthead = $( '#masthead' );
+ menuToggle = masthead.find( '.menu-toggle' );
+ siteNavContain = masthead.find( '.main-navigation' );
+ siteNavigation = masthead.find( '.main-navigation > div > ul' );
+
+ // Enable menuToggle.
+ (function() {
+
+ // Return early if menuToggle is missing.
+ if ( ! menuToggle.length ) {
+ return;
+ }
+
+ // Add an initial value for the attribute.
+ menuToggle.attr( 'aria-expanded', 'false' );
+
+ menuToggle.on( 'click.twentyseventeen', function() {
+ siteNavContain.toggleClass( 'toggled-on' );
+
+ $( this ).attr( 'aria-expanded', siteNavContain.hasClass( 'toggled-on' ) );
+ });
+ })();
+
+ // Fix sub-menus for touch devices and better focus for hidden submenu items for accessibility.
+ (function() {
+ if ( ! siteNavigation.length || ! siteNavigation.children().length ) {
+ return;
+ }
+
+ // Toggle `focus` class to allow submenu access on tablets.
+ function toggleFocusClassTouchScreen() {
+ if ( 'none' === $( '.menu-toggle' ).css( 'display' ) ) {
+
+ $( document.body ).on( 'touchstart.twentyseventeen', function( e ) {
+ if ( ! $( e.target ).closest( '.main-navigation li' ).length ) {
+ $( '.main-navigation li' ).removeClass( 'focus' );
+ }
+ });
+
+ siteNavigation.find( '.menu-item-has-children > a, .page_item_has_children > a' )
+ .on( 'touchstart.twentyseventeen', function( e ) {
+ var el = $( this ).parent( 'li' );
+
+ if ( ! el.hasClass( 'focus' ) ) {
+ e.preventDefault();
+ el.toggleClass( 'focus' );
+ el.siblings( '.focus' ).removeClass( 'focus' );
+ }
+ });
+
+ } else {
+ siteNavigation.find( '.menu-item-has-children > a, .page_item_has_children > a' ).unbind( 'touchstart.twentyseventeen' );
+ }
+ }
+
+ if ( 'ontouchstart' in window ) {
+ $( window ).on( 'resize.twentyseventeen', toggleFocusClassTouchScreen );
+ toggleFocusClassTouchScreen();
+ }
+
+ siteNavigation.find( 'a' ).on( 'focus.twentyseventeen blur.twentyseventeen', function() {
+ $( this ).parents( '.menu-item, .page_item' ).toggleClass( 'focus' );
+ });
+ })();
+})( jQuery );
diff --git a/bedrock/web/app/themes/orpheus/assets/js/skip-link-focus-fix.js b/bedrock/web/app/themes/orpheus/assets/js/skip-link-focus-fix.js
new file mode 100644
index 00000000..a40ebacf
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/assets/js/skip-link-focus-fix.js
@@ -0,0 +1,31 @@
+/**
+ * File skip-link-focus-fix.js.
+ *
+ * Helps with accessibility for keyboard only users.
+ *
+ * Learn more: https://git.io/vWdr2
+ */
+(function() {
+ var isIe = /(trident|msie)/i.test( navigator.userAgent );
+
+ if ( isIe && document.getElementById && window.addEventListener ) {
+ window.addEventListener( 'hashchange', function() {
+ var id = location.hash.substring( 1 ),
+ element;
+
+ if ( ! ( /^[A-z0-9_-]+$/.test( id ) ) ) {
+ return;
+ }
+
+ element = document.getElementById( id );
+
+ if ( element ) {
+ if ( ! ( /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) ) {
+ element.tabIndex = -1;
+ }
+
+ element.focus();
+ }
+ }, false );
+ }
+})();
diff --git a/bedrock/web/app/themes/orpheus/comments.php b/bedrock/web/app/themes/orpheus/comments.php
new file mode 100644
index 00000000..f93c09ea
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/comments.php
@@ -0,0 +1,82 @@
+
+
+
diff --git a/bedrock/web/app/themes/orpheus/footer.php b/bedrock/web/app/themes/orpheus/footer.php
new file mode 100644
index 00000000..504f573f
--- /dev/null
+++ b/bedrock/web/app/themes/orpheus/footer.php
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+ +
+ ++ 100, + 'style' => 'ol', + 'short_ping' => true, + 'reply_text' => twentyseventeen_get_svg( array( 'icon' => 'mail-reply' ) ) . __( 'Reply', 'twentyseventeen' ), + ) ); + ?> +
+ + twentyseventeen_get_svg( array( 'icon' => 'arrow-left' ) ) . '' . __( 'Previous', 'twentyseventeen' ) . '', + 'next_text' => '' . __( 'Next', 'twentyseventeen' ) . '' . twentyseventeen_get_svg( array( 'icon' => 'arrow-right' ) ), + ) ); + + endif; // Check for have_comments(). + + // If comments are closed and there are comments, let's leave a little note, shall we? + if ( ! comments_open() && get_comments_number() && post_type_supports( get_post_type(), 'comments' ) ) : ?> + + + + +