Ned Zimmerman
7 years ago
commit
b842642289
80 changed files with 10849 additions and 0 deletions
@ -0,0 +1,17 @@
|
||||
# editorconfig.org |
||||
|
||||
root = true |
||||
|
||||
[*] |
||||
indent_style = space |
||||
indent_size = 2 |
||||
end_of_line = lf |
||||
charset = utf-8 |
||||
trim_trailing_whitespace = true |
||||
insert_final_newline = true |
||||
|
||||
[*.php] |
||||
indent_size = 4 |
||||
|
||||
[resources/views/**.php] |
||||
indent_size = 2 |
@ -0,0 +1,3 @@
|
||||
/.github export-ignore |
||||
/.gitattributes export-ignore |
||||
/.travis.yml export-ignore |
@ -0,0 +1 @@
|
||||
Please read [Contributing to Roots Projects](https://github.com/roots/guidelines/blob/master/CONTRIBUTING.md) |
@ -0,0 +1,62 @@
|
||||
## Submit a feature request or bug report |
||||
|
||||
- [ ] I've read the [guidelines for Contributing to Roots Projects](https://github.com/roots/guidelines/blob/master/CONTRIBUTING.md) |
||||
- [ ] This is a feature request |
||||
- [ ] This is a bug report |
||||
- [ ] This request isn't a duplicate of an [existing issue](https://github.com/roots/sage/issues) |
||||
- [ ] I've read the [docs](https://roots.io/sage/docs) and [NPM Debugging Guidelines post](https://discourse.roots.io/t/npm-debugging-guidelines-failed-npm-install-bower-install-or-gulp-build-read-this/3060) and followed them (if applicable) |
||||
- [ ] This is not a personal support request that should be posted on the [Roots Discourse](https://discourse.roots.io/c/sage) forums |
||||
|
||||
<!-- Replace any `X` with your information. --> |
||||
|
||||
--- |
||||
|
||||
**What is the current behavior?** |
||||
|
||||
X |
||||
|
||||
|
||||
**What is the expected or desired behavior?** |
||||
|
||||
X |
||||
|
||||
--- |
||||
|
||||
## Bug report |
||||
|
||||
<!-- (delete this section if not applicable) --> |
||||
|
||||
**Please provide steps to reproduce, including full log output:** |
||||
|
||||
X |
||||
|
||||
**Please describe your local environment:** |
||||
|
||||
WordPress version: X |
||||
|
||||
OS: X |
||||
|
||||
NPM/Node version: X |
||||
|
||||
**Where did the bug happen? Development or remote servers?** |
||||
|
||||
X |
||||
|
||||
|
||||
**Is there a related [Discourse](https://discourse.roots.io/) thread or were any utilized (please link them)?** |
||||
|
||||
X |
||||
|
||||
--- |
||||
|
||||
## Feature Request |
||||
|
||||
<!-- (delete this section if not applicable) --> |
||||
|
||||
**Please provide use cases for changing the current behavior:** |
||||
|
||||
X |
||||
|
||||
**Other relevant information:** |
||||
|
||||
X |
@ -0,0 +1,10 @@
|
||||
# Include your project-specific ignores in this file |
||||
# Read about how to use .gitignore: https://help.github.com/articles/ignoring-files |
||||
.cache-loader |
||||
dist |
||||
bower_components |
||||
node_modules |
||||
npm-debug.log |
||||
yarn-error.log |
||||
vendor |
||||
resources/assets/config-local.json |
@ -0,0 +1,41 @@
|
||||
language: php |
||||
sudo: false |
||||
dist: trusty |
||||
php: |
||||
- 7.1 |
||||
- 7.0 |
||||
- 5.6 |
||||
- nightly |
||||
|
||||
env: |
||||
- TRAVIS_NODE_VERSION="6" |
||||
- TRAVIS_NODE_VERSION="7" |
||||
|
||||
matrix: |
||||
fast_finish: true |
||||
allow_failures: |
||||
- php: nightly |
||||
|
||||
cache: |
||||
apt: true |
||||
directories: |
||||
- $HOME/.composer/cache |
||||
- $HOME/.yarn-cache |
||||
- vendor |
||||
|
||||
before_install: |
||||
- composer self-update |
||||
- source ~/.nvm/nvm.sh && nvm install $TRAVIS_NODE_VERSION && nvm use $TRAVIS_NODE_VERSION |
||||
- export PATH=$HOME/.yarn/bin:$PATH && travis_retry curl -o- -L https://yarnpkg.com/install.sh | bash |
||||
|
||||
install: |
||||
- node -v && yarn -V |
||||
- travis_retry yarn |
||||
- composer install -o --prefer-dist --no-interaction |
||||
|
||||
script: |
||||
- yarn run test |
||||
- yarn run build |
||||
- yarn run rmdist |
||||
- yarn run "build:production" |
||||
- composer test |
@ -0,0 +1,556 @@
|
||||
### 9.0.0-beta.3: April 21st, 2017 |
||||
* Move required theme files to `sage/resources` ([#1877](https://github.com/roots/sage/pull/1877)) |
||||
* Move `src/` to `app/` ([#1868](https://github.com/roots/sage/pull/1868)) |
||||
* Move `templates/` to `resources/views/`, move `assets/` to `resources/assets/`, rename `base.blade.php` to `app.blade.php` ([#1864](https://github.com/roots/sage/pull/1864)) |
||||
* Add option to configure build settings ([#1822](https://github.com/roots/sage/pull/1822)) |
||||
* Add support for HTML injection ([#1817](https://github.com/roots/sage/pull/1817)) |
||||
* Add Tachyons as a CSS framework option ([#1867](https://github.com/roots/sage/pull/1867)) |
||||
|
||||
### 9.0.0-beta.2: January 19th, 2017 |
||||
* Fix Browersync ([#1815](https://github.com/roots/sage/pull/1815)) |
||||
* Add option to select CSS framework, add Foundation as an option ([#1813](https://github.com/roots/sage/pull/1813)) |
||||
* Add option to add Font Awesome ([#1812](https://github.com/roots/sage/pull/1812)) |
||||
* Add option to change theme file headers ([#1811](https://github.com/roots/sage/pull/1811)) |
||||
* Add option to remove Bootstrap ([#1810](https://github.com/roots/sage/pull/1810)) |
||||
* Remove Font Awesome ([#1809](https://github.com/roots/sage/pull/1809)) |
||||
* Remove grid defaults ([#1808](https://github.com/roots/sage/pull/1808)) |
||||
* Fix for `publicPath` ([#1806](https://github.com/roots/sage/pull/1806)) |
||||
* Update clean task name ([#1800](https://github.com/roots/sage/pull/1800)) |
||||
* Allow browser versions to be configured in `config.json` ([#1798](https://github.com/roots/sage/pull/1798)) |
||||
* Use stock ESLint ([#1796](https://github.com/roots/sage/pull/1796)) |
||||
|
||||
### 9.0.0-beta.1: January 10th, 2017 |
||||
* Update to Bootstrap 4 Alpha 6 ([#1792](https://github.com/roots/sage/pull/1792)) |
||||
* Add Blade ([#1765](https://github.com/roots/sage/pull/1765) and [#1777](https://github.com/roots/sage/pull/1777)) |
||||
* Remove sidebar defaults ([#1760](https://github.com/roots/sage/pull/1760)) |
||||
* Remove post formats ([#1759](https://github.com/roots/sage/pull/1759)) |
||||
|
||||
### 9.0.0-alpha.4: November 16th, 2016 |
||||
* Use new webpack api schema ([8ac5f15](https://github.com/roots/sage/commit/e6e60aa)) |
||||
* Update dependencies ([70ebba7](https://github.com/roots/sage/commit/70ebba7)) |
||||
* Variables organization ([8ac5f15](https://github.com/roots/sage/commit/8ac5f15)) |
||||
* Use `$.fn.ready()` (reverts [724d550](https://github.com/roots/sage/commit/724d550)) ([e7fccbe](https://github.com/roots/sage/commit/e7fccbe)) |
||||
* Theme activation updates 'stylesheet' option instead of 'template' ([fb19145](https://github.com/roots/sage/commit/fb19145)) |
||||
* Reorganize and refactor build routine ([8c9ba05](https://github.com/roots/sage/commit/8c9ba05)) |
||||
* Switch assets manifest plugin ([c1bb2b3](https://github.com/roots/sage/commit/c1bb2b3)) |
||||
* Add images to assets manifest ([c49793c](https://github.com/roots/sage/commit/c49793c)) |
||||
* Switch from babel to buble ([0d38ab8](https://github.com/roots/sage/commit/0d38ab8)) |
||||
* Update dependencies & webpack compatibility ([eae52fd](https://github.com/roots/sage/commit/eae52fd)) |
||||
* Use http by default (not https) to be consistent with Trellis ([e6f2f49](https://github.com/roots/sage/commit/e6f2f49)) |
||||
|
||||
### 9.0.0-alpha.3: September 11th, 2016 |
||||
* Fix webpack HMR ([#1713](https://github.com/roots/sage/issues/1713)) |
||||
* Remove minor edits from CHANGELOG.md ([3516629](https://github.com/roots/sage/commit/3516629)) |
||||
|
||||
### 9.0.0-alpha.2: September 4th, 2016 |
||||
* Refactor build routine ([#1703](https://github.com/roots/sage/pull/1703)) |
||||
* Update `_grid.scss` to use `@include make-col-ready()` mixin ([#1706](https://github.com/roots/sage/pull/1706)) |
||||
|
||||
### 9.0.0-alpha.1: August 30th, 2016 |
||||
* Move assets found in `node_modules/` to `dist/vendor`, simpler `assets/config.json` ([#1697](https://github.com/roots/sage/pull/1697)) |
||||
* Set dynamically absolute public path ([#1696](https://github.com/roots/sage/pull/1696)) |
||||
* Load Tether ([#1686](https://github.com/roots/sage/pull/1686)) |
||||
* Squash asset pipeline bugs ([4d58f88](https://github.com/roots/sage/commit/4d58f88)) |
||||
* Update dependencies, incl Bootstrap 4 alpha 3 ([447c24d](https://github.com/roots/sage/commit/447c24d)) |
||||
* Fix path to stylesheet in `add_editor_style` ([#1684](https://github.com/roots/sage/pull/1684)) |
||||
* Update required Node.js version ([72b2d89](https://github.com/roots/sage/commit/72b2d89)) |
||||
* Router doesn't require jQuery, use default params ([339cc8e](https://github.com/roots/sage/commit/339cc8e)) |
||||
* Fix display of theme name in Customizer ([3425386](https://github.com/roots/sage/commit/3425386)) |
||||
* Convert scripts to ES6 ([f34af48](https://github.com/roots/sage/commit/f34af48)) |
||||
* Refactor functions.php ([eae36be](https://github.com/roots/sage/commit/eae36be)) |
||||
* Rework template wrapper, bring back template_part() ([#1678](https://github.com/roots/sage/pull/1678)) |
||||
* Remove unused static variable in Wrapper ([9bfdd5a](https://github.com/roots/sage/commit/9bfdd5a)) |
||||
* Remove `path.extname()` check ([#1673](https://github.com/roots/sage/pull/1673)) |
||||
* Updated to align with the Bootstrap 4 docs ([#1667](https://github.com/roots/sage/pull/1667)) |
||||
* Add `npm prune` to Travis CI ([#1663](https://github.com/roots/sage/pull/1663)) |
||||
* Bootstrap NPM ^4.0.0-alpha.2 ([#1650](https://github.com/roots/sage/pull/1650)) |
||||
* Fix Bootstrap 4 styles ([#1642](https://github.com/roots/sage/pull/1642)) |
||||
* Fix autoloader load order issue when including Sage 9 via composer.json in Bedrock ([#1628](https://github.com/roots/sage/pull/1628)) |
||||
* `is_page_template()` requires the name of the subfolder ([#1626](https://github.com/roots/sage/pull/1626)) |
||||
* Webpack config improvements ([#1629](https://github.com/roots/sage/pull/1629)) |
||||
* Webpack implementation improvements ([#1627](https://github.com/roots/sage/pull/1627)) |
||||
* Webpack implementation ([#1625](https://github.com/roots/sage/pull/1625)) |
||||
* Fix BS4 grid after their grid updates ([5551dde](https://github.com/roots/sage/commit/5551dde)) |
||||
* Pass the correct template ([856a482](https://github.com/roots/sage/commit/856a482)) |
||||
* Optimize travis a bit ([b42c425](https://github.com/roots/sage/commit/b42c425)) |
||||
* Move single-post loop to single.php, closes #1582 ([6efa099](https://github.com/roots/sage/commit/6efa099)) |
||||
* All function braces need to be on new line ([b491f76](https://github.com/roots/sage/commit/b491f76)) |
||||
* Fix issue with WP loading wrong index.php ([9e2917e](https://github.com/roots/sage/commit/9e2917e)) |
||||
* Use 4 spaces for `src/*.php` ([fe659f4](https://github.com/roots/sage/commit/fe659f4)) |
||||
* Use phpcs.xml for all rules ([246955c](https://github.com/roots/sage/commit/246955c)) |
||||
* Conform to new rules ([6a4d3bd](https://github.com/roots/sage/commit/6a4d3bd)) |
||||
* Create new phpcs rules ([2d02544](https://github.com/roots/sage/commit/2d02544)) |
||||
* Remove Template class ([1df3fee](https://github.com/roots/sage/commit/1df3fee)) |
||||
* Remove closure from sidebar registration ([12d6ac3](https://github.com/roots/sage/commit/12d6ac3)) |
||||
* Remove sage.pot ([d4461fa](https://github.com/roots/sage/commit/d4461fa)) |
||||
* Remove template_part, template_sidebar, temp sidebar fix ([abeea0f](https://github.com/roots/sage/commit/abeea0f)) |
||||
* Update asset handles ([fa0e51f](https://github.com/roots/sage/commit/fa0e51f)) |
||||
* Remove comment-reply JS ([d217ba6](https://github.com/roots/sage/commit/d217ba6)) |
||||
* Update node in travis, remove unsupported php ([8712dc8](https://github.com/roots/sage/commit/8712dc8)) |
||||
* Update dependencies, switch to eslint ([e51e41e](https://github.com/roots/sage/commit/e51e41e)) |
||||
* Bootstrap 4 ([c9ef232](https://github.com/roots/sage/commit/c9ef232)) |
||||
* Fix: page title not displaying ([9283bbb](https://github.com/roots/sage/commit/9283bbb)) |
||||
* Rename interfaces, unset after unwrapping ([97906e9](https://github.com/roots/sage/commit/97906e9)) |
||||
* Restructure theme, use autoloader ([9eaffa3](https://github.com/roots/sage/commit/9eaffa3a2d4df462dd8020a10551334208bd32a3)) |
||||
|
||||
### 8.5.0: September 20th, 2016 |
||||
* Update installation instructions |
||||
* Update dependencies |
||||
* Update to Bootstrap 4.0.0-alpha.4 ([5eb01fd](https://github.com/roots/sage/commit/5eb01fd0319a7b6576e31579dc50e16b023abb74)) |
||||
|
||||
### 8.4.2: February 19th, 2016 |
||||
* Add Composer vendor directory to gitignore ([#1618](https://github.com/roots/sage/issues/1618)) |
||||
* Fix build test by removing trailing space ([#1617](https://github.com/roots/sage/issues/1617)) |
||||
* Replace deprecated gulp-minify-css with gulp-cssnano ([#1610](https://github.com/roots/sage/issues/1610)) |
||||
|
||||
### 8.4.1: January 27th, 2016 |
||||
* Add `composer.json` and update installation instructions ([#1583](https://github.com/roots/sage/issues/1583)) |
||||
|
||||
### 8.4.0: December 1st, 2015 |
||||
* Update to Bootstrap 3.3.6 ([#1578](https://github.com/roots/sage/pull/1578)) |
||||
* Remove unnecessary underscore ([#1577](https://github.com/roots/sage/pull/1577)) |
||||
* Drop support for older browsers ([#1571](https://github.com/roots/sage/pull/1571)) |
||||
* Add support for theme customizer ([#1573](https://github.com/roots/sage/pull/1573)) |
||||
* Remove extraneous no-js ([#1562](https://github.com/roots/sage/pull/1562)) |
||||
* Simplify/speed up editor style process ([#1560](https://github.com/roots/sage/pull/1560)) |
||||
|
||||
### 8.3.0: October 13th, 2015 |
||||
* Setup organization ([#1558](https://github.com/roots/sage/pull/1558)) |
||||
* Remove redundancy with WAI-ARIA in HTML ([#1557](https://github.com/roots/sage/pull/1557)) |
||||
* Rename config.php to setup.php ([#1556](https://github.com/roots/sage/pull/1556)) |
||||
* Move init.php to config.php ([#1555](https://github.com/roots/sage/pull/1555)) |
||||
* Use Sass to style search form, remove search template ([#1545](https://github.com/roots/sage/pull/1545)) |
||||
* Remove Modernizr ([#1541](https://github.com/roots/sage/pull/1541)) |
||||
* Remove references to WP_ENV ([#1554](https://github.com/roots/sage/pull/1554)) |
||||
* Use WP core's HTML5 gallery markup ([#1546](https://github.com/roots/sage/pull/1546)) |
||||
* Use slash in handle names for theme CSS and JS ([#1537](https://github.com/roots/sage/pull/1537)) |
||||
* Add compatibility with WooCommerce Multilingual plugin ([#1530](https://github.com/roots/sage/pull/1530)) |
||||
* Remove ConditionalTagCheck class ([#1494](https://github.com/roots/sage/pull/1494)) |
||||
* Add search templates ([#1459](https://github.com/roots/sage/issues/1459)) |
||||
* Allow `debugger` statements in development JavaScript ([#1487](https://github.com/roots/sage/issues/1487)) |
||||
|
||||
### 8.2.1: May 7th, 2015 |
||||
* Update BrowserSync ([#1457](https://github.com/roots/sage/issues/1457)) |
||||
* Bump dependencies ([#1448](https://github.com/roots/sage/issues/1448)) |
||||
* Allow revved files to resolve in development if they exist ([#1456](https://github.com/roots/sage/issues/1456)) |
||||
* Disable advanced minification features to fix incorrect file path in compiled CSS ([#1452](https://github.com/roots/sage/issues/1452)) |
||||
* Fix Glyphicon font path ([#1455](https://github.com/roots/sage/issues/1455)) |
||||
|
||||
### 8.2.0: April 29th, 2015 |
||||
* Use Sass Bootstrap by default ([#1437](https://github.com/roots/sage/issues/1437)) |
||||
* Remove nav walker and Bootstrap navbar ([#1427](https://github.com/roots/sage/issues/1427)) |
||||
* Remove Bootstrap gallery ([#1421](https://github.com/roots/sage/issues/1421)) |
||||
* Remove hardcoded feed link ([#1426](https://github.com/roots/sage/issues/1426)) |
||||
* Move jQuery CDN feature to Soil ([#1422](https://github.com/roots/sage/issues/1422)) |
||||
* Bump `gulp-load-plugins` to 0.10.0 ([#1419](https://github.com/roots/sage/issues/1419)) |
||||
* Switch from [yargs](https://github.com/bcoe/yargs) to [minimist](https://github.com/substack/minimist) ([#1418](https://github.com/roots/sage/issues/1418)) |
||||
* Remove `$content_width` ([#1417](https://github.com/roots/sage/issues/1417)) |
||||
* Lowercase `X-UA-Compatible` ([#1409](https://github.com/roots/sage/issues/1409)) |
||||
* Remove mention of Google Analytics from the config ([#1384](https://github.com/roots/sage/issues/1384)) |
||||
|
||||
### 8.1.1: March 31st, 2015 |
||||
* Remove pleeease dependency in favor of vanilla gulp-autoprefixer and gulp-minify-css ([#1402](https://github.com/roots/sage/issues/1402)) |
||||
* Fix `gulp --production` race condition ([#1398](https://github.com/roots/sage/issues/1398)) |
||||
* Update to Bootstrap 3.3.4 ([#1387](https://github.com/roots/sage/issues/1387)) |
||||
|
||||
### 8.1.0: March 13th, 2015 |
||||
* Move HTML5 Boilerplate's Google Analytics snippet to Soil ([#1382](https://github.com/roots/sage/issues/1382)) |
||||
* Run `gulp build` if `bower.json` is changed ([#1378](https://github.com/roots/sage/issues/1378)) |
||||
* Remove namespace from base.php ([#1372](https://github.com/roots/sage/issues/1372)) |
||||
* Allow build directory to be customized ([#1352](https://github.com/roots/sage/issues/1352), [#1366](https://github.com/roots/sage/issues/1366)) |
||||
* Update ConditionalTagCheck and usage docs ([#1365](https://github.com/roots/sage/issues/1365)) |
||||
* Change default gallery columns to 3 ([#1364](https://github.com/roots/sage/issues/1364)) |
||||
* Apply `script_loader_src` filter to jQuery fallback ([#1363](https://github.com/roots/sage/issues/1363)) |
||||
|
||||
### 8.0.1: February 26th, 2015 |
||||
* Update asset-builder version to fix Windows compatibility ([#1351](https://github.com/roots/sage/issues/1351)) |
||||
* Fix broken wiredep imports with main.scss.example ([Discussion](https://discourse.roots.io/t/issue-with-sage-sass-version/2962)) |
||||
|
||||
### 8.0.0: February 25th, 2015 |
||||
* Change theme name from Roots to Sage |
||||
* Bump required PHP version to >=5.4 |
||||
* Add coding standards based on PSR-2 |
||||
* Add Travis CI |
||||
* Add namespace |
||||
* Use short array syntax |
||||
* Use short echo syntax |
||||
* Switch from Grunt to gulp, new front-end development workflow |
||||
* Switch from Livereload to [BrowserSync](http://www.browsersync.io/) |
||||
* Use wiredep for Sass and Less injection |
||||
* Implement JSON file based asset pipeline with [asset-builder](https://github.com/austinpray/asset-builder) |
||||
* Re-organize asset file structure |
||||
* Re-organize stylesheet file structure |
||||
* Add main.scss.example and instructions for using Sass |
||||
* Use the primary theme stylesheet for the editor stylesheet |
||||
* Remove theme activation, move to [wp-cli-theme-activation](https://github.com/roots/wp-cli-theme-activation) |
||||
* Simplify 404 page |
||||
* Convert Sidebar to ConditionalTagCheck |
||||
* Update to jQuery 1.11.2 |
||||
* Use new core navigation template tag |
||||
* Update sidebar to fix default template check |
||||
* Update nav walker to correctly assign `active` classes for custom post types |
||||
* Better support for CPT templates |
||||
|
||||
### 7.0.3: December 18th, 2014 |
||||
* Use `get_the_archive_title` |
||||
* Remove `wp_title`, add title-tag theme support |
||||
* Remove `Roots_Nav_Walker` as default for all menus |
||||
* Update to Bootstrap 3.3.1 |
||||
* Add some base comment styling |
||||
* Make search term `required` in search form |
||||
|
||||
### 7.0.2: October 24th, 2014 |
||||
* Simplify comments, use core comment form and list |
||||
* Remove HTML5 shiv from Modernizr build |
||||
* Move JavaScript to footer |
||||
* Update hEntry schema to use `updated` instead of `published` |
||||
* Move variables into `main.less` |
||||
* Add `roots_body_class` function that checks for page slug in `body_class` |
||||
* Move `wp_footer` from footer template into `base.php` |
||||
|
||||
### 7.0.1: August 15th, 2014 |
||||
* Move `<main>` and `.sidebar` markup out of PHP and into LESS |
||||
* Define `WP_ENV` if it is not already defined |
||||
* Only load Google Analytics in production environment |
||||
|
||||
### 7.0.0: July 3rd, 2014 |
||||
* Updated Grunt workflow |
||||
* Use grunt-modernizr to make a lean Modernizr build |
||||
* Use Bower for front-end package management |
||||
* Update to Bootstrap 3.2.0 |
||||
* Update to Modernizr 2.8.2 |
||||
* Update to jQuery 1.11.1 |
||||
* Move clean up, relative URLs, and nice search to [Soil](https://github.com/roots/soil) |
||||
* Update LESS organization |
||||
* Move [community translations](https://github.com/roots/roots-translations) to separate repository |
||||
|
||||
### 6.5.2: February 4th, 2014 |
||||
* Update to Bootstrap 3.1.0 |
||||
* Move DOM routing into an anonymous function to support jQuery noConflict |
||||
* Update to jQuery 1.11.0 |
||||
* Add notice to theme activation, tidy activation table markup |
||||
* Remove changing media folder from theme activation (use [Bedrock](https://github.com/roots/bedrock) for clean URLs out of the box) |
||||
* Switch `div.main` to `main` element now that Modernizr uses the latest HTML5 Shiv |
||||
* Update to Modernizr 2.7.0 |
||||
* Don't run JSHint on plugins (`assets/js/plugins/`) |
||||
* Disable warnings about undefined variables (JSHint) |
||||
* Merge in updates from HTML5 Boilerplate |
||||
* Add JS source map (disabled by default) |
||||
* Replace `grunt-recess` with `grunt-contrib-less`, add LESS source map support |
||||
|
||||
### 6.5.1: November 5th, 2013 |
||||
* Move clean URLs to a [plugin](https://github.com/roots/roots-rewrites) |
||||
* Update to Bootstrap 3.0.1 |
||||
|
||||
### 6.5.0: August 23rd, 2013 |
||||
* Reference new site, [http://roots.io/](http://roots.io/) |
||||
* Remove bundled docs, reference [http://roots.io/docs/](http://roots.io/docs/) |
||||
* Use Bootstrap variables for media queries |
||||
* Update to Bootstrap 3.0.0 |
||||
* Update to jQuery 1.10.2 |
||||
* Change media directory from `/assets/` to `/media/` |
||||
* Update to Google Universal Analytics |
||||
* Show author display name for author archives |
||||
* Add Serbian translation |
||||
* Remove post tags from templates |
||||
* Remove TinyMCE valid elements tweaks (no longer necessary) |
||||
* Remove additional widget classes |
||||
* Move `/assets/css/less/` to `/assets/less/` |
||||
* Add wrapper templates filter |
||||
* Fix relative external URLs issue |
||||
|
||||
### 6.4.0: May 1st, 2013 |
||||
* Fix Theme Activation page issues |
||||
* Fix issues with root relative URLs and rewrites on non-standard setups |
||||
* Make sure rewrites are added to `.htaccess` immediately after activation |
||||
* Move HTML5 Boilerplate's `.htaccess` to a [plugin](https://github.com/roots/wp-h5bp-htaccess) |
||||
* Rename `page-custom.php` to `template-custom.php` |
||||
* Don't warn about unwritable htaccess if that option is disabled |
||||
* Add missing collapse class for top navbar |
||||
* Add comment template |
||||
* Update is_dropdown evaluation in nav walker |
||||
* Re-organize archives template |
||||
* Add missing comment ID |
||||
* hNews consistency with entry-title class |
||||
* Add `wp_title()` filter |
||||
* Fix missing closing div in comments |
||||
* Fix for navbar dropdowns |
||||
* Add option for using jQuery on Google CDN |
||||
* Correct logic in `roots_enable_root_relative_urls` |
||||
* Add Greek translation, update Brazilian Portuguese translation |
||||
* Update to Bootstrap 2.3.1 |
||||
* Simplify alerts |
||||
* Remove disabled post nav links |
||||
* Use Bootstrap media object for listing comments |
||||
* Move Google Analytics to `lib/scripts.php` |
||||
* Static top navbar instead of fixed |
||||
|
||||
### 6.3.0: February 8th, 2013 |
||||
* Update to Bootstrap 2.3.0 |
||||
* Update to jQuery 1.9.1 |
||||
* Output author title with `get_the_author()` |
||||
* Add EditorConfig |
||||
* Update 404 template based on H5BP |
||||
* Update H5BP's included .htaccess |
||||
* Don't show comments on passworded posts |
||||
* Add `do_action('get_header')` for WooSidebars compatibility |
||||
* Simplify entry meta |
||||
* Allow `get_search_form()` to be called more than once per request |
||||
* Move plugins.js and main.js to footer |
||||
* JavaScript clean up (everything is now enqueued) |
||||
* Remove conditional feed |
||||
* Introduce `add_theme_support('bootstrap-gallery')` |
||||
* Rewrites organization (introduce `lib/rewrites.php`) |
||||
* Fix `add_editor_style` path |
||||
* Updated translations: French, Bulgarian, Turkish, Korean |
||||
* Enable `add_theme_support` for Nice Search |
||||
* Replace ID's with classes |
||||
* Add support for dynamic sidebar templates |
||||
* Fix PHP notice on search with no results |
||||
* Update to jQuery 1.9.0 |
||||
|
||||
### 6.2.0: January 13th, 2013 |
||||
* Implement latest Nice Search |
||||
* Update [gallery] shortcode |
||||
* Add Simplified Chinese, Indonesian, Korean translations |
||||
* Move template title to `lib/utils.php` |
||||
* Update to Bootstrap 2.2.2 |
||||
* Update to jQuery 1.8.3 |
||||
* Use `entry-summary` class for excerpts per Readability's Article Publishing Guidelines |
||||
* Cleanup/refactor `lib/activation.php` |
||||
* Remove `lib/post-types.php` and `lib/metaboxes.php` |
||||
* Make sure Primary Navigation menu always gets created and has the location set upon activation, update activation permalink method |
||||
* Update to Bootstrap 2.2.1 |
||||
* Update conditional feed method |
||||
* Update to Bootstrap 2.2.0 |
||||
* Return instead of echo class names in `roots_main_class` and `roots_sidebar_class` |
||||
* Move nav customizations into `lib/nav.php` |
||||
|
||||
### 6.1.0: October 2nd, 2012 |
||||
* Change roots_sidebar into a more explicit configuration array |
||||
* Re-organize configuration/setup files |
||||
* Update to jQuery 1.8.2 |
||||
* Refactor/simplify Roots vCard Widget |
||||
* Move custom entry_meta code into template |
||||
* Move Google Analytics code into footer template |
||||
* Add CONTRIBUTING.md to assist with the new GitHub UI |
||||
* Add nav walker support for CSS dividers and nav-header |
||||
|
||||
### 6.0.0: September 16th, 2012 |
||||
* Simplify nav walker and support 3rd level dropdowns |
||||
* Update to Bootstrap 2.1.1, jQuery 1.8.1, Modernizr 2.6.2 |
||||
* Add bundled docs |
||||
* Update all templates to use [PHP Alternative Syntax](http://php.net/manual/en/control-structures.alternative-syntax.php) |
||||
* Add MIT License |
||||
* Implement scribu's [Theme Wrapper](http://scribu.net/wordpress/theme-wrappers.html) (see `base.php`) |
||||
* Move `css/`, `img/`, and `js/` folders within a new `assets/` folder |
||||
* Move templates, `comments.php`, and `searchform.php` to `templates/` folder |
||||
* Rename `inc/` to `lib/` |
||||
* Add placeholder `lib/post-types.php` and `lib/metaboxes.php` files |
||||
* Rename `loop-` files to `content-` |
||||
* Remove all hooks |
||||
* Use `templates/page-header.php` for page titles |
||||
* Use `head.php` for everything in `<head>` |
||||
|
||||
### 5.2.0: August 18th, 2012 |
||||
* Update to jQuery 1.8.0 and Modernizr 2.6.1 |
||||
* Fix duplicate active class in `wp_nav_menu` items |
||||
* Merge `Roots_Navbar_Nav_Walker` into `Roots_Nav_Walker` |
||||
* Add and update code documentation |
||||
* Use `wp_get_theme()` to get the theme name on activation |
||||
* Use `<figure>` & `<figcaption>` for captions |
||||
* Wrap embedded media as suggested by Readability |
||||
* Remove unnecessary `remove_action`'s on `wp_head` as of WordPress 3.2.1 |
||||
* Add updates from HTML5 Boilerplate |
||||
* Remove well class from sidebar |
||||
* Flush permalinks on activation to avoid 404s with clean URLs |
||||
* Show proper classes on additional `wp_nav_menu()`'s |
||||
* Clean up `inc/cleanup.php` |
||||
* Remove old admin notice for tagline |
||||
* Remove default tagline admin notice, hide from feed |
||||
* Fix for duplicated classes in widget markup |
||||
* Show title on custom post type archive template |
||||
* Fix for theme preview in WordPress 3.3.2 |
||||
* Introduce `inc/config.php` with options for clean URLs, H5BP's `.htaccess`, root relative URLs, and Bootstrap features |
||||
* Allow custom CSS classes in menus, walker cleanup |
||||
* Remove WordPress version numbers from stylesheets |
||||
* Don't include HTML5 Boilerplate's `style.css` by default |
||||
* Allow `inc/htaccess.php` to work with Litespeed |
||||
* Update to Bootstrap 2.0.4 |
||||
* Update Bulgarian translation |
||||
* Don't use clean URLs with default permalink structure |
||||
* Add translations for Catalan, Polish, Hungarian, Norwegian, Russian |
||||
|
||||
### 5.1.0: April 14th, 2012 |
||||
* Various bugfixes for scripts, stylesheets, root relative URLs, clean URLs, and htaccess issues |
||||
* Add a conditional feed link |
||||
* Temporarily remove Gravity Forms customizations |
||||
* Update to Bootstrap 2.0.2 |
||||
* Update `roots.pot` for translations |
||||
* Add/update languages: Vietnamese, Swedish, Bulgarian, Turkish, Norwegian, Brazilian Portugese |
||||
* Change widgets to use `<section>` instead of `<article>` |
||||
* Add comment-reply.js |
||||
* Remove optimized robots.txt |
||||
* HTML5 Boilerplate, Modernizr, and jQuery updates |
||||
|
||||
### 5.0.0: February 5th, 2012 |
||||
* Remove all frameworks except Bootstrap |
||||
* Update to Bootstrap 2.0 |
||||
* Remove `roots-options.php` and replaced with a more simple `roots-config.php` |
||||
* Now using Bootstrap markup on forms, page titles, image galleries, alerts and errors, post and comment navigation |
||||
* Remove Roots styles from `style.css` and introduced `app.css` for site-specific CSS |
||||
* Remove almost all previous default Roots styling |
||||
* Latest updates from HTML5 Boilerplate |
||||
|
||||
### 4.1.0: February 1st, 2012 |
||||
* Update translations |
||||
* HTML5 Boilerplate updates |
||||
* Fix for Server 500 errors |
||||
* Add `roots-scripts.php`, now using `wp_enqueue_script` |
||||
* Re-organize `roots-actions.php` |
||||
* Allow `<script>` tags in TinyMCE |
||||
* Add full width class and search form to 404 template |
||||
* Remove Blueprint CSS specific markup |
||||
* Use Roots Nav Walker as default |
||||
* Add author name and taxonomy name to archive template title |
||||
* Add Full Width CSS class options |
||||
|
||||
### 4.0.0: January 4th, 2012 |
||||
* Add theme activation options |
||||
* HTML5 Boilerplate updates |
||||
* Add CSS frameworks: Bootstrap, Foundation |
||||
* Add translations: Dutch, Italian, Macedonian, German, Finnish, Danish, Spanish, and Turkish |
||||
* Update jQuery |
||||
* Remove included jQuery plugins |
||||
* Clean up whitespace, switched to two spaces for tabs |
||||
* Clean up `body_class()` some more with `roots_body_class()` |
||||
* Post meta information is now displayed using a function (similar to Twenty Eleven) |
||||
* Bugfixes for 1140 options |
||||
* Add first and last classes to widgets |
||||
* Fix bug with initial options save |
||||
* Remove sitemap and listing subpages templates |
||||
* Child themes can now unregister sidebars |
||||
* Add fix for empty search query |
||||
* Update README |
||||
* Blocking access to readme.html and license.txt to hide WordPress version information |
||||
|
||||
### 3.6.0: August 12th, 2011 |
||||
* HTML5 Boilerplate 2.0 updates |
||||
* Cleaner output of enqueued styles and scripts |
||||
* Adde option for root relative URLs |
||||
* Small fixes to root relative URLs and clean assets |
||||
* Update included jQuery plugins |
||||
* Add French translation (thanks @johnraz) |
||||
* Add Brazilian Portuguese translation (thanks @weslly) |
||||
* Switch the logo to use `add_custom_image_header` |
||||
* Add a function that strips unnecessary self-closing tags |
||||
* Code cleanup and re-organization |
||||
|
||||
### 3.5.0: July 30th, 2011 |
||||
* Complete rewrite of theme options based on Twenty Eleven |
||||
* CSS frameworks: refactor code and add default classes for each framework |
||||
* CSS frameworks: add support for Adapt.js and LESS |
||||
* CSS frameworks: add option for None |
||||
* Add support for WPML and theme translation |
||||
* Add option for cleaner nav menu output |
||||
* Add option for FOUT-B-Gone |
||||
* Add authorship rel attribute to post author link |
||||
* Activation bugfix for pages being added multiple times |
||||
* Bugfixes to the root relative URL function |
||||
* Child themes will now load their CSS automatically and properly |
||||
* HTML5 Boilerplate updates (including Normalize.css, Modernizr 2.0, and Respond.js) |
||||
* Introduce cleaner way of including HTML5 Boilerplate's `.htaccess` |
||||
* Add hooks & actions |
||||
* Rename `includes/` directory to `inc/` |
||||
* Add a blank `inc/roots-custom.php` file |
||||
|
||||
### 3.2.4: May 19th, 2011 |
||||
* Bugfixes |
||||
* Match latest changes to HTML5 Boilerplate and Blueprint CSS |
||||
* Update jQuery to 1.6.1 |
||||
|
||||
### 3.2.3: May 10th, 2011 |
||||
* Bugfixes |
||||
* Add `language_attributes()` to `<html>` |
||||
* Match latest changes to HTML5 Boilerplate and Blueprint CSS |
||||
* Update jQuery to 1.6 |
||||
|
||||
### 3.2.2: April 24th, 2011 |
||||
* Bugfixes |
||||
|
||||
### 3.2.1: April 20th, 2011 |
||||
* Add support for child themes |
||||
|
||||
### 3.2.0: April 15th, 2011 |
||||
* Add support for the 1140px Grid |
||||
* Update the conditional comment code to match latest changes to HTML5 Boilerplate |
||||
|
||||
### 3.1.1: April 7th, 2011 |
||||
* Fix relative path function to work correctly when WordPress is installed in a subdirectory |
||||
* Update jQuery to 1.5.2 |
||||
* Fix comments to show avatars correctly |
||||
|
||||
### 3.1.0: April 1st, 2011 |
||||
* Add support for 960.gs thanks to John Liuti |
||||
* Add more onto the `.htaccess` from HTML5 Boilerplate |
||||
* Allow the theme directory and name to be renamable |
||||
|
||||
### 3.0.0: March 28th, 2011 |
||||
* Change name from BB to Roots and release to the public |
||||
* Update various areas to match the latest changes to HTML5 Boilerplate |
||||
* Change the theme markup based on hCard/Readability Guidelines and work by Jonathan Neal |
||||
* Create the navigation menus and automatically set their locations during theme activation |
||||
* Set permalink structure to `/%year%/%postname%/` |
||||
* Set uploads folder to `/assets/` |
||||
* Rewrite static folders in `/wp-content/themes/roots/` (`css/`, `js/`, `img/`) to the root (`/css/`, `/js/`, `/img/`) |
||||
* Rewrite `/wp-content/plugins/` to `/plugins/` |
||||
* Add more root relative URLs on WordPress functions |
||||
* Search results (`/?s=query`) rewrite to `/search/query/` |
||||
* `l10n.js` is deregistered |
||||
* Change [gallery] to output `<figure>` and `<figcaption>` and link to file by default |
||||
* Add more `loop.php` templates |
||||
* Made the HTML editor have a monospaced font |
||||
* Add `front-page.php` |
||||
* Update CSS for Gravity Forms 1.5 |
||||
* Add `searchform.php template` |
||||
|
||||
### 2.4.0: January 25th, 2011 |
||||
* Add a notification when saving the theme settings |
||||
* Add support for navigation menus |
||||
* Create function that makes sure there is a Home page on theme activation |
||||
* Update various areas to match the latest changes to HTML5 Boilerplate |
||||
|
||||
### 2.3.0: December 8th, 2010 |
||||
* Logo is no longer an `<h1>` |
||||
* Add ARIA roles again |
||||
* Change `ul#nav` to `nav#nav-main` |
||||
* Add vCard to footer |
||||
* Made all URL's root relative |
||||
* Add Twitter and Facebook widgets to footer |
||||
* Add SEO optimized `robots.txt` from WordPress codex |
||||
|
||||
### 2.2.0: September 20th, 2010 |
||||
* Add asynchronous Google Analytics |
||||
* Update `.htaccess` with latest changes from HTML5 Boilerplate |
||||
|
||||
### 2.1.0: August 19th, 2010 |
||||
* Remove optimizeLegibility from headings |
||||
* Update jQuery to latest version |
||||
* Implement HTML5 Boilerplate `.htaccess` |
||||
|
||||
### 2.0.1: August 2nd, 2010 |
||||
* Add some presentational CSS classes |
||||
* Add footer widget |
||||
* Add more Gravity Forms default styling |
||||
|
||||
### 2.0.0: July 19th, 2010 |
||||
* Add HTML5 Boilerplate changes |
||||
* Implement `loop.php` |
||||
* wp_head cleanup |
||||
* Add `page-subpages.php` template |
||||
|
||||
### 1.5.0: April 15th, 2010 |
||||
* Integrate Paul Irish's frontend-pro-template (the original HTML5 Boilerplate) |
||||
|
||||
### 1.0.0: December 18th, 2009 |
||||
* Add Blueprint CSS to Starkers |
@ -0,0 +1,19 @@
|
||||
Copyright (c) Ben Word and Scott Walkinshaw |
||||
|
||||
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. |
@ -0,0 +1,124 @@
|
||||
# [Sage](https://roots.io/sage/) |
||||
[![Packagist](https://img.shields.io/packagist/vpre/roots/sage.svg?style=flat-square)](https://packagist.org/packages/roots/sage) |
||||
[![devDependency Status](https://img.shields.io/david/dev/roots/sage.svg?style=flat-square)](https://david-dm.org/roots/sage#info=devDependencies) |
||||
[![Build Status](https://img.shields.io/travis/roots/sage.svg?style=flat-square)](https://travis-ci.org/roots/sage) |
||||
|
||||
Sage is a WordPress starter theme with a modern development workflow. |
||||
|
||||
**Sage 9 is in active development and is currently in beta. The `master` branch tracks Sage 9 development. If you want a stable version, use the [latest Sage 8 release](https://github.com/roots/sage/releases/latest).** |
||||
|
||||
## Features |
||||
|
||||
* Sass for stylesheets |
||||
* ES6 for JavaScript |
||||
* [Webpack](https://webpack.github.io/) for compiling assets, optimizing images, and concatenating and minifying files |
||||
* [Browsersync](http://www.browsersync.io/) for synchronized browser testing |
||||
* [Laravel Blade](https://laravel.com/docs/5.3/blade) as a templating engine |
||||
* [Controller](https://github.com/soberwp/controller) for passing data to Blade templates |
||||
* CSS framework options: |
||||
* [Bootstrap 4](http://getbootstrap.com/) |
||||
* [Foundation](http://foundation.zurb.com/) |
||||
* [Tachyons](http://tachyons.io/) |
||||
* None (blank slate) |
||||
* Font Awesome (optional) |
||||
|
||||
See a working example at [roots-example-project.com](https://roots-example-project.com/). |
||||
|
||||
## Requirements |
||||
|
||||
Make sure all dependencies have been installed before moving on: |
||||
|
||||
* [WordPress](https://wordpress.org/) >= 4.7 |
||||
* [PHP](http://php.net/manual/en/install.php) >= 5.6.4 |
||||
* [Composer](https://getcomposer.org/download/) |
||||
* [Node.js](http://nodejs.org/) >= 6.9.x |
||||
* [Yarn](https://yarnpkg.com/en/docs/install) |
||||
|
||||
## Theme installation |
||||
|
||||
Install Sage using Composer from your WordPress themes directory (replace `your-theme-name` below with the name of your theme): |
||||
|
||||
```shell |
||||
# @ app/themes/ or wp-content/themes/ |
||||
$ composer create-project roots/sage your-theme-name dev-master |
||||
``` |
||||
|
||||
During theme installation you will have the options to: |
||||
|
||||
* Update theme headers (theme name, description, author, etc.) |
||||
* Select a CSS framework (Bootstrap, Foundation, Tachyons, none) |
||||
* Add Font Awesome |
||||
* Configure Browsersync (path to theme, local development URL) |
||||
|
||||
## Theme structure |
||||
|
||||
```shell |
||||
themes/your-theme-name/ # → Root of your Sage based theme |
||||
├── app/ # → Theme PHP |
||||
│ ├── lib/Sage/ # → Blade implementation, asset manifest |
||||
│ ├── admin.php # → Theme customizer setup |
||||
│ ├── filters.php # → Theme filters |
||||
│ ├── helpers.php # → Helper functions |
||||
│ └── setup.php # → Theme setup |
||||
├── composer.json # → Autoloading for `app/` files |
||||
├── composer.lock # → Composer lock file (never edit) |
||||
├── dist/ # → Built theme assets (never edit) |
||||
├── node_modules/ # → Node.js packages (never edit) |
||||
├── package.json # → Node.js dependencies and scripts |
||||
├── resources/ # → Theme assets and templates |
||||
│ ├── assets/ # → Front-end assets |
||||
│ │ ├── config.json # → Settings for compiled assets |
||||
│ │ ├── build/ # → Webpack and ESLint config |
||||
│ │ ├── fonts/ # → Theme fonts |
||||
│ │ ├── images/ # → Theme images |
||||
│ │ ├── scripts/ # → Theme JS |
||||
│ │ └── styles/ # → Theme stylesheets |
||||
│ ├── controllers/ # → Controller files |
||||
│ ├── functions.php # → Composer autoloader, theme includes |
||||
│ ├── index.php # → Never manually edit |
||||
│ ├── screenshot.png # → Theme screenshot for WP admin |
||||
│ ├── style.css # → Theme meta information |
||||
│ └── views/ # → Theme templates |
||||
│ ├── layouts/ # → Base templates |
||||
│ └── partials/ # → Partial templates |
||||
└── vendor/ # → Composer packages (never edit) |
||||
``` |
||||
|
||||
## Theme setup |
||||
|
||||
Edit `app/setup.php` to enable or disable theme features, setup navigation menus, post thumbnail sizes, and sidebars. |
||||
|
||||
## Theme development |
||||
|
||||
* Run `yarn` from the theme directory to install dependencies |
||||
* Update `resources/assets/config.json` settings: |
||||
* `devUrl` should reflect your local development hostname |
||||
* `publicPath` should reflect your WordPress folder structure (`/wp-content/themes/sage` for non-[Bedrock](https://roots.io/bedrock/) installs) |
||||
|
||||
### Build commands |
||||
|
||||
* `yarn run start` — Compile assets when file changes are made, start Browsersync session |
||||
* `yarn run build` — Compile and optimize the files in your assets directory |
||||
* `yarn run build:production` — Compile assets for production |
||||
|
||||
## Documentation |
||||
|
||||
Sage 8 documentation is available at [https://roots.io/sage/docs/](https://roots.io/sage/docs/). |
||||
|
||||
Sage 9 documentation is currently in progress and can be viewed at [https://github.com/roots/docs/tree/sage-9/sage](https://github.com/roots/docs/tree/sage-9/sage). |
||||
|
||||
Controller documentation is available at [https://github.com/soberwp/controller#usage](https://github.com/soberwp/controller#usage). |
||||
|
||||
## Contributing |
||||
|
||||
Contributions are welcome from everyone. We have [contributing guidelines](https://github.com/roots/guidelines/blob/master/CONTRIBUTING.md) to help you get started. |
||||
|
||||
## Community |
||||
|
||||
Keep track of development and community news. |
||||
|
||||
* 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/) |
||||
* Listen to the [Roots Radio podcast](https://roots.io/podcast/) |
@ -0,0 +1,24 @@
|
||||
<?php |
||||
|
||||
namespace App; |
||||
|
||||
/** |
||||
* Theme customizer |
||||
*/ |
||||
add_action('customize_register', function (\WP_Customize_Manager $wp_customize) { |
||||
// Add postMessage support |
||||
$wp_customize->get_setting('blogname')->transport = 'postMessage'; |
||||
$wp_customize->selective_refresh->add_partial('blogname', [ |
||||
'selector' => '.brand', |
||||
'render_callback' => function () { |
||||
bloginfo('name'); |
||||
} |
||||
]); |
||||
}); |
||||
|
||||
/** |
||||
* Customizer JS |
||||
*/ |
||||
add_action('customize_preview_init', function () { |
||||
wp_enqueue_script('sage/customizer.js', asset_path('scripts/customizer.js'), ['customize-preview'], null, true); |
||||
}); |
@ -0,0 +1,70 @@
|
||||
<?php |
||||
|
||||
namespace App; |
||||
|
||||
/** |
||||
* Add <body> classes |
||||
*/ |
||||
add_filter('body_class', function (array $classes) { |
||||
/** Add page slug if it doesn't exist */ |
||||
if (is_single() || is_page() && !is_front_page()) { |
||||
if (!in_array(basename(get_permalink()), $classes)) { |
||||
$classes[] = basename(get_permalink()); |
||||
} |
||||
} |
||||
|
||||
/** Add class if sidebar is active */ |
||||
if (display_sidebar()) { |
||||
$classes[] = 'sidebar-primary'; |
||||
} |
||||
|
||||
/** Clean up class names for custom templates */ |
||||
$classes = array_map(function ($class) { |
||||
return preg_replace(['/-blade(-php)?$/', '/^page-template-views/'], '', $class); |
||||
}, $classes); |
||||
|
||||
return array_filter($classes); |
||||
}); |
||||
|
||||
/** |
||||
* Add "… Continued" to the excerpt |
||||
*/ |
||||
add_filter('excerpt_more', function () { |
||||
return ' … <a href="' . get_permalink() . '">' . __('Continued', 'sage') . '</a>'; |
||||
}); |
||||
|
||||
/** |
||||
* Template Hierarchy should search for .blade.php files |
||||
*/ |
||||
collect([ |
||||
'index', '404', 'archive', 'author', 'category', 'tag', 'taxonomy', 'date', 'home', |
||||
'frontpage', 'page', 'paged', 'search', 'single', 'singular', 'attachment' |
||||
])->map(function ($type) { |
||||
add_filter("{$type}_template_hierarchy", __NAMESPACE__.'\\filter_templates'); |
||||
}); |
||||
|
||||
/** |
||||
* Render page using Blade |
||||
*/ |
||||
add_filter('template_include', function ($template) { |
||||
$data = collect(get_body_class())->reduce(function ($data, $class) use ($template) { |
||||
return apply_filters("sage/template/{$class}/data", $data, $template); |
||||
}, []); |
||||
if ($template) { |
||||
echo template($template, $data); |
||||
return get_stylesheet_directory().'/index.php'; |
||||
} |
||||
return $template; |
||||
}, PHP_INT_MAX); |
||||
|
||||
/** |
||||
* Tell WordPress how to find the compiled path of comments.blade.php |
||||
*/ |
||||
add_filter('comments_template', function ($comments_template) { |
||||
$comments_template = str_replace( |
||||
[get_stylesheet_directory(), get_template_directory()], |
||||
'', |
||||
$comments_template |
||||
); |
||||
return template_path(locate_template(["views/{$comments_template}", $comments_template]) ?: $comments_template); |
||||
}); |
@ -0,0 +1,147 @@
|
||||
<?php |
||||
|
||||
namespace App; |
||||
|
||||
use Roots\Sage\Container; |
||||
|
||||
/** |
||||
* Get the sage container. |
||||
* |
||||
* @param string $abstract |
||||
* @param array $parameters |
||||
* @param Container $container |
||||
* @return Container|mixed |
||||
*/ |
||||
function sage($abstract = null, $parameters = [], Container $container = null) |
||||
{ |
||||
$container = $container ?: Container::getInstance(); |
||||
if (!$abstract) { |
||||
return $container; |
||||
} |
||||
return $container->bound($abstract) |
||||
? $container->makeWith($abstract, $parameters) |
||||
: $container->makeWith("sage.{$abstract}", $parameters); |
||||
} |
||||
|
||||
/** |
||||
* Get / set the specified configuration value. |
||||
* |
||||
* If an array is passed as the key, we will assume you want to set an array of values. |
||||
* |
||||
* @param array|string $key |
||||
* @param mixed $default |
||||
* @return mixed|\Roots\Sage\Config |
||||
* @copyright Taylor Otwell |
||||
* @link https://github.com/laravel/framework/blob/c0970285/src/Illuminate/Foundation/helpers.php#L254-L265 |
||||
*/ |
||||
function config($key = null, $default = null) |
||||
{ |
||||
if (is_null($key)) { |
||||
return sage('config'); |
||||
} |
||||
if (is_array($key)) { |
||||
return sage('config')->set($key); |
||||
} |
||||
return sage('config')->get($key, $default); |
||||
} |
||||
|
||||
/** |
||||
* @param string $file |
||||
* @param array $data |
||||
* @return string |
||||
*/ |
||||
function template($file, $data = []) |
||||
{ |
||||
return sage('blade')->render($file, $data); |
||||
} |
||||
|
||||
/** |
||||
* Retrieve path to a compiled blade view |
||||
* @param $file |
||||
* @param array $data |
||||
* @return string |
||||
*/ |
||||
function template_path($file, $data = []) |
||||
{ |
||||
return sage('blade')->compiledPath($file, $data); |
||||
} |
||||
|
||||
/** |
||||
* @param $asset |
||||
* @return string |
||||
*/ |
||||
function asset_path($asset) |
||||
{ |
||||
return sage('assets')->getUri($asset); |
||||
} |
||||
|
||||
/** |
||||
* @param string|string[] $templates Possible template files |
||||
* @return array |
||||
*/ |
||||
function filter_templates($templates) |
||||
{ |
||||
return collect($templates) |
||||
->map(function ($template) { |
||||
return preg_replace('#\.(blade\.)?php$#', '', ltrim($template)); |
||||
}) |
||||
->flatMap(function ($template) { |
||||
$paths = apply_filters('sage/filter_templates/paths', ['views', 'resources/views']); |
||||
return collect($paths) |
||||
->flatMap(function ($path) use ($template) { |
||||
return [ |
||||
"{$path}/{$template}.blade.php", |
||||
"{$path}/{$template}.php", |
||||
"{$template}.blade.php", |
||||
"{$template}.php", |
||||
]; |
||||
}); |
||||
}) |
||||
->filter() |
||||
->unique() |
||||
->all(); |
||||
} |
||||
|
||||
/** |
||||
* @param string|string[] $templates Relative path to possible template files |
||||
* @return string Location of the template |
||||
*/ |
||||
function locate_template($templates) |
||||
{ |
||||
return \locate_template(filter_templates($templates)); |
||||
} |
||||
|
||||
/** |
||||
* Determine whether to show the sidebar |
||||
* @return bool |
||||
*/ |
||||
function display_sidebar() |
||||
{ |
||||
static $display; |
||||
isset($display) || $display = apply_filters('sage/display_sidebar', false); |
||||
return $display; |
||||
} |
||||
|
||||
/** |
||||
* Page titles |
||||
* @return string |
||||
*/ |
||||
function title() |
||||
{ |
||||
if (is_home()) { |
||||
if ($home = get_option('page_for_posts', true)) { |
||||
return get_the_title($home); |
||||
} |
||||
return __('Latest Posts', 'sage'); |
||||
} |
||||
if (is_archive()) { |
||||
return get_the_archive_title(); |
||||
} |
||||
if (is_search()) { |
||||
return sprintf(__('Search Results for %s', 'sage'), get_search_query()); |
||||
} |
||||
if (is_404()) { |
||||
return __('Not Found', 'sage'); |
||||
} |
||||
return get_the_title(); |
||||
} |
@ -0,0 +1,128 @@
|
||||
<?php |
||||
|
||||
namespace App; |
||||
|
||||
use Roots\Sage\Container; |
||||
use Roots\Sage\Assets\JsonManifest; |
||||
use Roots\Sage\Template\Blade; |
||||
use Roots\Sage\Template\BladeProvider; |
||||
|
||||
/** |
||||
* Theme assets |
||||
*/ |
||||
add_action('wp_enqueue_scripts', function () { |
||||
wp_enqueue_style('sage/main.css', asset_path('styles/main.css'), false, null); |
||||
wp_enqueue_script('sage/main.js', asset_path('scripts/main.js'), ['jquery'], null, true); |
||||
}, 100); |
||||
|
||||
/** |
||||
* Theme setup |
||||
*/ |
||||
add_action('after_setup_theme', function () { |
||||
/** |
||||
* Enable features from Soil when plugin is activated |
||||
* @link https://roots.io/plugins/soil/ |
||||
*/ |
||||
add_theme_support('soil-clean-up'); |
||||
add_theme_support('soil-jquery-cdn'); |
||||
add_theme_support('soil-nav-walker'); |
||||
add_theme_support('soil-nice-search'); |
||||
add_theme_support('soil-relative-urls'); |
||||
|
||||
/** |
||||
* Enable plugins to manage the document title |
||||
* @link https://developer.wordpress.org/reference/functions/add_theme_support/#title-tag |
||||
*/ |
||||
add_theme_support('title-tag'); |
||||
|
||||
/** |
||||
* Register navigation menus |
||||
* @link https://developer.wordpress.org/reference/functions/register_nav_menus/ |
||||
*/ |
||||
register_nav_menus([ |
||||
'primary_navigation' => __('Primary Navigation', 'sage') |
||||
]); |
||||
|
||||
/** |
||||
* Enable post thumbnails |
||||
* @link https://developer.wordpress.org/themes/functionality/featured-images-post-thumbnails/ |
||||
*/ |
||||
add_theme_support('post-thumbnails'); |
||||
|
||||
/** |
||||
* Enable HTML5 markup support |
||||
* @link https://developer.wordpress.org/reference/functions/add_theme_support/#html5 |
||||
*/ |
||||
add_theme_support('html5', ['caption', 'comment-form', 'comment-list', 'gallery', 'search-form']); |
||||
|
||||
/** |
||||
* Enable selective refresh for widgets in customizer |
||||
* @link https://developer.wordpress.org/themes/advanced-topics/customizer-api/#theme-support-in-sidebars |
||||
*/ |
||||
add_theme_support('customize-selective-refresh-widgets'); |
||||
|
||||
/** |
||||
* Use main stylesheet for visual editor |
||||
* @see resources/assets/styles/layouts/_tinymce.scss |
||||
*/ |
||||
add_editor_style(asset_path('styles/main.css')); |
||||
}, 20); |
||||
|
||||
/** |
||||
* Register sidebars |
||||
*/ |
||||
add_action('widgets_init', function () { |
||||
$config = [ |
||||
'before_widget' => '<section class="widget %1$s %2$s">', |
||||
'after_widget' => '</section>', |
||||
'before_title' => '<h3>', |
||||
'after_title' => '</h3>' |
||||
]; |
||||
register_sidebar([ |
||||
'name' => __('Primary', 'sage'), |
||||
'id' => 'sidebar-primary' |
||||
] + $config); |
||||
register_sidebar([ |
||||
'name' => __('Footer', 'sage'), |
||||
'id' => 'sidebar-footer' |
||||
] + $config); |
||||
}); |
||||
|
||||
/** |
||||
* Updates the `$post` variable on each iteration of the loop. |
||||
* Note: updated value is only available for subsequently loaded views, such as partials |
||||
*/ |
||||
add_action('the_post', function ($post) { |
||||
sage('blade')->share('post', $post); |
||||
}); |
||||
|
||||
/** |
||||
* Setup Sage options |
||||
*/ |
||||
add_action('after_setup_theme', function () { |
||||
/** |
||||
* Add JsonManifest to Sage container |
||||
*/ |
||||
sage()->singleton('sage.assets', function () { |
||||
return new JsonManifest(config('assets.manifest'), config('assets.uri')); |
||||
}); |
||||
|
||||
/** |
||||
* Add Blade to Sage container |
||||
*/ |
||||
sage()->singleton('sage.blade', function (Container $app) { |
||||
$cachePath = config('view.compiled'); |
||||
if (!file_exists($cachePath)) { |
||||
wp_mkdir_p($cachePath); |
||||
} |
||||
(new BladeProvider($app))->register(); |
||||
return new Blade($app['view']); |
||||
}); |
||||
|
||||
/** |
||||
* Create @asset() Blade directive |
||||
*/ |
||||
sage('blade')->compiler()->directive('asset', function ($asset) { |
||||
return "<?= " . __NAMESPACE__ . "\\asset_path({$asset}); ?>";
|
||||
}); |
||||
}); |
@ -0,0 +1,50 @@
|
||||
{ |
||||
"name": "pressbooks/pressbooks-aldine", |
||||
"type": "wordpress-theme", |
||||
"license": "MIT", |
||||
"description": "WordPress starter theme with a modern development workflow", |
||||
"homepage": "https://roots.io/sage/", |
||||
"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" |
||||
} |
||||
], |
||||
"keywords": [ |
||||
"wordpress" |
||||
], |
||||
"support": { |
||||
"issues": "https://github.com/roots/sage/issues", |
||||
"forum": "https://discourse.roots.io/" |
||||
}, |
||||
"autoload": { |
||||
"psr-4": { |
||||
"App\\": "app/" |
||||
} |
||||
}, |
||||
"require": { |
||||
"php": ">=5.6.4", |
||||
"composer/installers": "~1.0", |
||||
"illuminate/support": "~5.4", |
||||
"roots/sage-lib": "~9.0.0-beta.3", |
||||
"soberwp/controller": "dev-master" |
||||
}, |
||||
"require-dev": { |
||||
"squizlabs/php_codesniffer": "^2.8.0", |
||||
"roots/sage-installer": "~1.1" |
||||
}, |
||||
"scripts": { |
||||
"test": [ |
||||
"phpcs" |
||||
], |
||||
"post-create-project-cmd": [ |
||||
"Roots\\Sage\\Installer\\ComposerScript::postCreateProject" |
||||
] |
||||
} |
||||
} |
@ -0,0 +1,31 @@
|
||||
<?php |
||||
|
||||
return [ |
||||
|
||||
/* |
||||
|-------------------------------------------------------------------------- |
||||
| Assets Manifest |
||||
|-------------------------------------------------------------------------- |
||||
| |
||||
| Your asset manifest is used by Sage to assist WordPress and your views |
||||
| with rendering the correct URLs for your assets. This is especially |
||||
| useful for statically referencing assets with dynamically changing names |
||||
| as in the case of cache-busting. |
||||
| |
||||
*/ |
||||
|
||||
'manifest' => get_theme_file_path().'/dist/assets.json', |
||||
|
||||
/* |
||||
|-------------------------------------------------------------------------- |
||||
| Assets Path URI |
||||
|-------------------------------------------------------------------------- |
||||
| |
||||
| The asset manifest contains relative paths to your assets. This URI will |
||||
| be prepended when using Sage's asset management system. Change this if |
||||
| you are using a CDN. |
||||
| |
||||
*/ |
||||
|
||||
'uri' => get_theme_file_uri().'/dist', |
||||
]; |
@ -0,0 +1,32 @@
|
||||
<?php |
||||
|
||||
return [ |
||||
|
||||
/* |
||||
|-------------------------------------------------------------------------- |
||||
| Theme Directory |
||||
|-------------------------------------------------------------------------- |
||||
| |
||||
| This is the absolute path to your theme directory. |
||||
| |
||||
| Example: |
||||
| /srv/www/example.com/current/web/app/themes/sage |
||||
| |
||||
*/ |
||||
|
||||
'dir' => get_theme_file_path(), |
||||
|
||||
/* |
||||
|-------------------------------------------------------------------------- |
||||
| Theme Directory URI |
||||
|-------------------------------------------------------------------------- |
||||
| |
||||
| This is the web server URI to your theme directory. |
||||
| |
||||
| Example: |
||||
| https://example.com/app/themes/sage |
||||
| |
||||
*/ |
||||
|
||||
'uri' => get_theme_file_uri(), |
||||
]; |
@ -0,0 +1,51 @@
|
||||
<?php |
||||
|
||||
return [ |
||||
|
||||
/* |
||||
|-------------------------------------------------------------------------- |
||||
| View Storage Paths |
||||
|-------------------------------------------------------------------------- |
||||
| |
||||
| Most template systems load templates from disk. Here you may specify |
||||
| an array of paths that should be checked for your views. |
||||
| |
||||
*/ |
||||
|
||||
'paths' => [ |
||||
get_theme_file_path().'/resources/views', |
||||
get_parent_theme_file_path().'/resources/views', |
||||
], |
||||
|
||||
|
||||
/* |
||||
|-------------------------------------------------------------------------- |
||||
| Compiled View Path |
||||
|-------------------------------------------------------------------------- |
||||
| |
||||
| This option determines where all the compiled Blade templates will be |
||||
| stored for your application. Typically, this is within the uploads |
||||
| directory. However, as usual, you are free to change this value. |
||||
| |
||||
*/ |
||||
|
||||
'compiled' => wp_upload_dir()['basedir'].'/cache', |
||||
|
||||
|
||||
/* |
||||
|-------------------------------------------------------------------------- |
||||
| View Namespaces |
||||
|-------------------------------------------------------------------------- |
||||
| |
||||
| Blade has an underutilized feature that allows developers to add |
||||
| supplemental view paths that may contain conflictingly named views. |
||||
| These paths are prefixed with a namespace to get around the conflicts. |
||||
| A use case might be including views from within a plugin folder. |
||||
| |
||||
*/ |
||||
|
||||
'namespaces' => [ |
||||
/* Given the below example, in your views use something like: @include('WC::some.view.or.partial.here') */ |
||||
// 'WC' => WP_PLUGIN_DIR.'/woocommerce/templates/', |
||||
], |
||||
]; |
@ -0,0 +1,131 @@
|
||||
{ |
||||
"name": "sage", |
||||
"version": "9.0.0-beta.3", |
||||
"author": "Roots <team@roots.io>", |
||||
"homepage": "https://roots.io/sage/", |
||||
"private": true, |
||||
"repository": { |
||||
"type": "git", |
||||
"url": "git://github.com/roots/sage.git" |
||||
}, |
||||
"bugs": { |
||||
"url": "https://github.com/roots/sage/issues" |
||||
}, |
||||
"licenses": [ |
||||
{ |
||||
"type": "MIT", |
||||
"url": "http://opensource.org/licenses/MIT" |
||||
} |
||||
], |
||||
"browserslist": [ |
||||
"last 2 versions", |
||||
"android 4", |
||||
"opera 12" |
||||
], |
||||
"eslintConfig": { |
||||
"root": true, |
||||
"extends": "eslint:recommended", |
||||
"globals": { |
||||
"wp": true |
||||
}, |
||||
"env": { |
||||
"node": true, |
||||
"es6": true, |
||||
"amd": true, |
||||
"browser": true, |
||||
"jquery": true |
||||
}, |
||||
"parserOptions": { |
||||
"ecmaFeatures": { |
||||
"globalReturn": true, |
||||
"generators": false, |
||||
"objectLiteralDuplicateProperties": false, |
||||
"experimentalObjectRestSpread": true |
||||
}, |
||||
"ecmaVersion": 2017, |
||||
"sourceType": "module" |
||||
}, |
||||
"plugins": [ |
||||
"import" |
||||
], |
||||
"settings": { |
||||
"import/core-modules": [], |
||||
"import/ignore": [ |
||||
"node_modules", |
||||
"\\.(coffee|scss|css|less|hbs|svg|json)$" |
||||
] |
||||
}, |
||||
"rules": { |
||||
"comma-dangle": [ |
||||
"error", |
||||
{ |
||||
"arrays": "always-multiline", |
||||
"objects": "always-multiline", |
||||
"imports": "always-multiline", |
||||
"exports": "always-multiline", |
||||
"functions": "ignore" |
||||
} |
||||
] |
||||
} |
||||
}, |
||||
"stylelint": { |
||||
"extends": "stylelint-config-standard", |
||||
"rules": { |
||||
"no-empty-source": null |
||||
} |
||||
}, |
||||
"scripts": { |
||||
"build": "webpack --progress --config resources/assets/build/webpack.config.js", |
||||
"build:production": "webpack --progress -p --config resources/assets/build/webpack.config.js", |
||||
"build:profile": "webpack --progress --profile --json --config resources/assets/build/webpack.config.js", |
||||
"start": "webpack --hide-modules --watch --config resources/assets/build/webpack.config.js", |
||||
"rmdist": "rimraf dist", |
||||
"lint": "npm run -s lint:scripts && npm run -s lint:styles", |
||||
"lint:scripts": "eslint resources/assets/scripts resources/assets/build", |
||||
"lint:styles": "stylelint resources/assets/styles/**/*.{css,sass,scss,sss,less}", |
||||
"test": "npm run -s lint" |
||||
}, |
||||
"engines": { |
||||
"node": ">= 6.9.4" |
||||
}, |
||||
"devDependencies": { |
||||
"autoprefixer": "~7.1", |
||||
"browser-sync": "~2.18", |
||||
"browsersync-webpack-plugin": "^0.6.0", |
||||
"bs-html-injector": "~3.0", |
||||
"buble-loader": "^0.4.1", |
||||
"cache-loader": "~1.0", |
||||
"clean-webpack-plugin": "^0.1.16", |
||||
"copy-globs-webpack-plugin": "^0.2.0", |
||||
"css-loader": "^0.28.4", |
||||
"cssnano": "~4.0.0-rc.1", |
||||
"eslint": "~4.2", |
||||
"eslint-loader": "~1.9", |
||||
"eslint-plugin-import": "~2.7", |
||||
"extract-text-webpack-plugin": "~3.0", |
||||
"file-loader": "^0.11.2", |
||||
"imagemin-mozjpeg": "~6.0", |
||||
"imagemin-webpack-plugin": "~1.5.0-beta.0", |
||||
"import-glob": "~1.5", |
||||
"node-sass": "~4.5", |
||||
"postcss-loader": "~2.0", |
||||
"postcss-safe-parser": "~3.0", |
||||
"resolve-url-loader": "~2.1", |
||||
"rimraf": "~2.6", |
||||
"sass-loader": "~6.0", |
||||
"style-loader": "^0.18.2", |
||||
"stylelint": "~7.12", |
||||
"stylelint-config-standard": "~16.0", |
||||
"stylelint-webpack-plugin": "^0.8.0", |
||||
"url-loader": "^0.5.9", |
||||
"webpack": "~3.3", |
||||
"webpack-assets-manifest": "^0.7.0", |
||||
"webpack-dev-middleware": "~1.11", |
||||
"webpack-hot-middleware": "~2.18", |
||||
"webpack-merge": "~4.1", |
||||
"yargs": "~8.0" |
||||
}, |
||||
"dependencies": { |
||||
"jquery": "1.12.4 - 3" |
||||
} |
||||
} |
@ -0,0 +1,71 @@
|
||||
<?xml version="1.0"?> |
||||
<ruleset name="Roots"> |
||||
<description>Roots Coding Standards</description> |
||||
|
||||
<!-- Scan these files --> |
||||
<file>resources/functions.php</file> |
||||
<file>resources/index.php</file> |
||||
<file>app</file> |
||||
<file>resources/views</file> |
||||
|
||||
<!-- Show colors in console --> |
||||
<arg value="-colors"/> |
||||
|
||||
<!-- Show sniff codes in all reports --> |
||||
<arg value="s"/> |
||||
|
||||
<!-- Use PSR-2 as a base --> |
||||
<rule ref="PSR2"/> |
||||
|
||||
<!-- Exclusions below are for resources/views/ folder --> |
||||
|
||||
<!-- Allow php files without any PHP in them --> |
||||
<rule ref="Internal.NoCodeFound"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
|
||||
<!-- Allow braces on same line for named functions --> |
||||
<rule ref="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
|
||||
<!-- Allow closing braces to be on the same line --> |
||||
<rule ref="Squiz.WhiteSpace.ScopeClosingBrace"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
|
||||
<!-- Disable newline after opening brace --> |
||||
<rule ref="Squiz.ControlStructures.ControlSignature.NewlineAfterOpenBrace"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
|
||||
<!-- Allow multiple PHP statements in the same line --> |
||||
<rule ref="Generic.Formatting.DisallowMultipleStatements.SameLine"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
|
||||
<!-- Disable PSR-2 indentation rules that are buggy with 2 spaces --> |
||||
<rule ref="PSR2.ControlStructures.SwitchDeclaration.BreakIndent"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
|
||||
<!-- Don't require a blank line after the last `use` --> |
||||
<rule ref="PSR2.Namespaces.UseDeclaration.SpaceAfterLastUse"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
|
||||
<!-- Allow long lines --> |
||||
<rule ref="Generic.Files.LineLength.TooLong"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
|
||||
<!-- Ignore indentation rules --> |
||||
<rule ref="Generic.WhiteSpace.ScopeIndent"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
|
||||
<!-- Allow PHP closing tags --> |
||||
<rule ref="PSR2.Files.ClosingTag.NotAllowed"> |
||||
<exclude-pattern>resources/views</exclude-pattern> |
||||
</rule> |
||||
</ruleset> |
@ -0,0 +1,14 @@
|
||||
{ |
||||
"root": false, |
||||
"rules": { |
||||
"import/no-extraneous-dependencies": 0, |
||||
"prefer-rest-params": 0, |
||||
"comma-dangle": ["error", { |
||||
"arrays": "always-multiline", |
||||
"objects": "always-multiline", |
||||
"imports": "always-multiline", |
||||
"exports": "always-multiline", |
||||
"functions": "ignore" |
||||
}] |
||||
} |
||||
} |
@ -0,0 +1,60 @@
|
||||
const path = require('path'); |
||||
const { argv } = require('yargs'); |
||||
const merge = require('webpack-merge'); |
||||
|
||||
const desire = require('./util/desire'); |
||||
|
||||
const userConfig = merge(desire(`${__dirname}/../config`), desire(`${__dirname}/../config-local`)); |
||||
|
||||
const isProduction = !!((argv.env && argv.env.production) || argv.p); |
||||
const rootPath = (userConfig.paths && userConfig.paths.root) |
||||
? userConfig.paths.root |
||||
: process.cwd(); |
||||
|
||||
const config = merge({ |
||||
open: true, |
||||
copy: 'images/**/*', |
||||
proxyUrl: 'http://localhost:3000', |
||||
cacheBusting: '[name]_[hash]', |
||||
paths: { |
||||
root: rootPath, |
||||
assets: path.join(rootPath, 'resources/assets'), |
||||
dist: path.join(rootPath, 'dist'), |
||||
}, |
||||
enabled: { |
||||
sourceMaps: !isProduction, |
||||
optimize: isProduction, |
||||
cacheBusting: isProduction, |
||||
watcher: !!argv.watch, |
||||
}, |
||||
watch: [], |
||||
}, userConfig); |
||||
|
||||
module.exports = merge(config, { |
||||
env: Object.assign({ production: isProduction, development: !isProduction }, argv.env), |
||||
publicPath: `${config.publicPath}/${path.basename(config.paths.dist)}/`, |
||||
manifest: {}, |
||||
}); |
||||
|
||||
if (process.env.NODE_ENV === undefined) { |
||||
process.env.NODE_ENV = isProduction ? 'production' : 'development'; |
||||
} |
||||
|
||||
/** |
||||
* If your publicPath differs between environments, but you know it at compile time, |
||||
* then set SAGE_DIST_PATH as an environment variable before compiling. |
||||
* Example: |
||||
* SAGE_DIST_PATH=/wp-content/themes/sage/dist yarn build:production |
||||
*/ |
||||
if (process.env.SAGE_DIST_PATH) { |
||||
module.exports.publicPath = process.env.SAGE_DIST_PATH; |
||||
} |
||||
|
||||
/** |
||||
* If you don't know your publicPath at compile time, then uncomment the lines |
||||
* below and use WordPress's wp_localize_script() to set SAGE_DIST_PATH global. |
||||
* Example: |
||||
* wp_localize_script('sage/main.js', 'SAGE_DIST_PATH', get_theme_file_uri('dist/')) |
||||
*/ |
||||
// Object.keys(module.exports.entry).forEach(id =>
|
||||
// module.exports.entry[id].unshift(path.join(__dirname, 'helpers/public-path.js')));
|
@ -0,0 +1,7 @@
|
||||
const hotMiddlewareScript = require('webpack-hot-middleware/client?noInfo=true&timeout=20000&reload=true'); |
||||
|
||||
hotMiddlewareScript.subscribe(event => { |
||||
if (event.action === 'reload') { |
||||
window.location.reload(); |
||||
} |
||||
}); |
@ -0,0 +1,7 @@
|
||||
/* eslint-env browser */ |
||||
/* globals SAGE_DIST_PATH */ |
||||
|
||||
/** Dynamically set absolute public path from current protocol and host */ |
||||
if (SAGE_DIST_PATH) { |
||||
__webpack_public_path__ = SAGE_DIST_PATH; // eslint-disable-line no-undef, camelcase
|
||||
} |
@ -0,0 +1,15 @@
|
||||
/* eslint-disable */ |
||||
|
||||
const cssnanoConfig = { |
||||
preset: ['default', { discardComments: { removeAll: true } }] |
||||
}; |
||||
|
||||
module.exports = ({ file, options }) => { |
||||
return { |
||||
parser: options.enabled.optimize ? 'postcss-safe-parser' : undefined, |
||||
plugins: { |
||||
cssnano: options.enabled.optimize ? cssnanoConfig : false, |
||||
autoprefixer: true, |
||||
}, |
||||
}; |
||||
}; |
@ -0,0 +1,15 @@
|
||||
/** |
||||
* Loop through webpack entry |
||||
* and add the hot middleware |
||||
* @param {Object} entry webpack entry |
||||
* @return {Object} entry with hot middleware |
||||
*/ |
||||
module.exports = (entry) => { |
||||
const results = {}; |
||||
|
||||
Object.keys(entry).forEach((name) => { |
||||
results[name] = Array.isArray(entry[name]) ? entry[name].slice(0) : [entry[name]]; |
||||
results[name].unshift(`${__dirname}/../helpers/hmr-client.js`); |
||||
}); |
||||
return results; |
||||
}; |
@ -0,0 +1,34 @@
|
||||
const path = require('path'); |
||||
|
||||
module.exports = (key, value) => { |
||||
if (typeof value === 'string') { |
||||
return value; |
||||
} |
||||
const manifest = value; |
||||
/** |
||||
* Hack to prepend scripts/ or styles/ to manifest keys |
||||
* |
||||
* This might need to be reworked at some point. |
||||
* |
||||
* Before: |
||||
* { |
||||
* "main.js": "scripts/main_abcdef.js" |
||||
* "main.css": "styles/main_abcdef.css" |
||||
* } |
||||
* After: |
||||
* { |
||||
* "scripts/main.js": "scripts/main_abcdef.js" |
||||
* "styles/main.css": "styles/main_abcdef.css" |
||||
* } |
||||
*/ |
||||
Object.keys(manifest).forEach((src) => { |
||||
const sourcePath = path.basename(path.dirname(src)); |
||||
const targetPath = path.basename(path.dirname(manifest[src])); |
||||
if (sourcePath === targetPath) { |
||||
return; |
||||
} |
||||
manifest[`${targetPath}/${src}`] = manifest[src]; |
||||
delete manifest[src]; |
||||
}); |
||||
return manifest; |
||||
}; |
@ -0,0 +1,14 @@
|
||||
/** |
||||
* @export |
||||
* @param {string} dependency |
||||
* @param {any} [fallback] |
||||
* @return {any} |
||||
*/ |
||||
module.exports = (dependency, fallback) => { |
||||
try { |
||||
require.resolve(dependency); |
||||
} catch (err) { |
||||
return fallback; |
||||
} |
||||
return require(dependency); // eslint-disable-line import/no-dynamic-require
|
||||
}; |
@ -0,0 +1,211 @@
|
||||
'use strict'; // eslint-disable-line
|
||||
|
||||
const webpack = require('webpack'); |
||||
const merge = require('webpack-merge'); |
||||
const CleanPlugin = require('clean-webpack-plugin'); |
||||
const ExtractTextPlugin = require('extract-text-webpack-plugin'); |
||||
const StyleLintPlugin = require('stylelint-webpack-plugin'); |
||||
const CopyGlobsPlugin = require('copy-globs-webpack-plugin'); |
||||
|
||||
const config = require('./config'); |
||||
|
||||
const assetsFilenames = (config.enabled.cacheBusting) ? config.cacheBusting : '[name]'; |
||||
|
||||
let webpackConfig = { |
||||
context: config.paths.assets, |
||||
entry: config.entry, |
||||
devtool: (config.enabled.sourceMaps ? '#source-map' : undefined), |
||||
output: { |
||||
path: config.paths.dist, |
||||
publicPath: config.publicPath, |
||||
filename: `scripts/${assetsFilenames}.js`, |
||||
}, |
||||
stats: { |
||||
hash: false, |
||||
version: false, |
||||
timings: false, |
||||
children: false, |
||||
errors: false, |
||||
errorDetails: false, |
||||
warnings: false, |
||||
chunks: false, |
||||
modules: false, |
||||
reasons: false, |
||||
source: false, |
||||
publicPath: false, |
||||
}, |
||||
module: { |
||||
rules: [ |
||||
{ |
||||
enforce: 'pre', |
||||
test: /\.js$/, |
||||
include: config.paths.assets, |
||||
use: 'eslint', |
||||
}, |
||||
{ |
||||
enforce: 'pre', |
||||
test: /\.(js|s?[ca]ss)$/, |
||||
include: config.paths.assets, |
||||
loader: 'import-glob', |
||||
}, |
||||
{ |
||||
test: /\.js$/, |
||||
exclude: [/(node_modules|bower_components)(?![/|\\](bootstrap|foundation-sites))/], |
||||
use: [ |
||||
{ loader: 'cache' }, |
||||
{ loader: 'buble', options: { objectAssign: 'Object.assign' } }, |
||||
], |
||||
}, |
||||
{ |
||||
test: /\.css$/, |
||||
include: config.paths.assets, |
||||
use: ExtractTextPlugin.extract({ |
||||
fallback: 'style', |
||||
use: [ |
||||
{ loader: 'cache' }, |
||||
{ loader: 'css', options: { sourceMap: config.enabled.sourceMaps } }, |
||||
{ |
||||
loader: 'postcss', options: { |
||||
config: { path: __dirname, ctx: config }, |
||||
sourceMap: config.enabled.sourceMaps, |
||||
}, |
||||
}, |
||||
], |
||||
}), |
||||
}, |
||||
{ |
||||
test: /\.scss$/, |
||||
include: config.paths.assets, |
||||
use: ExtractTextPlugin.extract({ |
||||
fallback: 'style', |
||||
use: [ |
||||
{ loader: 'cache' }, |
||||
{ loader: 'css', options: { sourceMap: config.enabled.sourceMaps } }, |
||||
{ |
||||
loader: 'postcss', options: { |
||||
config: { path: __dirname, ctx: config }, |
||||
sourceMap: config.enabled.sourceMaps, |
||||
}, |
||||
}, |
||||
{ loader: 'resolve-url', options: { sourceMap: config.enabled.sourceMaps } }, |
||||
{ loader: 'sass', options: { sourceMap: config.enabled.sourceMaps } }, |
||||
], |
||||
}), |
||||
}, |
||||
{ |
||||
test: /\.(ttf|eot|woff2?|png|jpe?g|gif|svg|ico)$/, |
||||
include: config.paths.assets, |
||||
loader: 'url', |
||||
options: { |
||||
limit: 4096, |
||||
name: `[path]${assetsFilenames}.[ext]`, |
||||
}, |
||||
}, |
||||
{ |
||||
test: /\.(ttf|eot|woff2?|png|jpe?g|gif|svg|ico)$/, |
||||
include: /node_modules|bower_components/, |
||||
loader: 'url', |
||||
options: { |
||||
limit: 4096, |
||||
outputPath: 'vendor/', |
||||
name: `${config.cacheBusting}.[ext]`, |
||||
}, |
||||
}, |
||||
], |
||||
}, |
||||
resolve: { |
||||
modules: [ |
||||
config.paths.assets, |
||||
'node_modules', |
||||
'bower_components', |
||||
], |
||||
enforceExtension: false, |
||||
}, |
||||
resolveLoader: { |
||||
moduleExtensions: ['-loader'], |
||||
}, |
||||
externals: { |
||||
jquery: 'jQuery', |
||||
}, |
||||
plugins: [ |
||||
new CleanPlugin([config.paths.dist], { |
||||
root: config.paths.root, |
||||
verbose: false, |
||||
}), |
||||
/** |
||||
* It would be nice to switch to copy-webpack-plugin, but |
||||
* unfortunately it doesn't provide a reliable way of |
||||
* tracking the before/after file names |
||||
*/ |
||||
new CopyGlobsPlugin({ |
||||
pattern: config.copy, |
||||
output: `[path]${assetsFilenames}.[ext]`, |
||||
manifest: config.manifest, |
||||
}), |
||||
new ExtractTextPlugin({ |
||||
filename: `styles/${assetsFilenames}.css`, |
||||
allChunks: true, |
||||
disable: (config.enabled.watcher), |
||||
}), |
||||
new webpack.ProvidePlugin({ |
||||
$: 'jquery', |
||||
jQuery: 'jquery', |
||||
'window.jQuery': 'jquery', |
||||
Tether: 'tether', |
||||
'window.Tether': 'tether', |
||||
}), |
||||
new webpack.LoaderOptionsPlugin({ |
||||
minimize: config.enabled.optimize, |
||||
debug: config.enabled.watcher, |
||||
stats: { colors: true }, |
||||
}), |
||||
new webpack.LoaderOptionsPlugin({ |
||||
test: /\.s?css$/, |
||||
options: { |
||||
output: { path: config.paths.dist }, |
||||
context: config.paths.assets, |
||||
}, |
||||
}), |
||||
new webpack.LoaderOptionsPlugin({ |
||||
test: /\.js$/, |
||||
options: { |
||||
eslint: { failOnWarning: false, failOnError: true }, |
||||
}, |
||||
}), |
||||
new StyleLintPlugin({ |
||||
failOnError: !config.enabled.watcher, |
||||
syntax: 'scss', |
||||
}), |
||||
], |
||||
}; |
||||
|
||||
/* eslint-disable global-require */ /** Let's only load dependencies as needed */ |
||||
|
||||
if (config.enabled.optimize) { |
||||
webpackConfig = merge(webpackConfig, require('./webpack.config.optimize')); |
||||
} |
||||
|
||||
if (config.env.production) { |
||||
webpackConfig.plugins.push(new webpack.NoEmitOnErrorsPlugin()); |
||||
} |
||||
|
||||
if (config.enabled.cacheBusting) { |
||||
const WebpackAssetsManifest = require('webpack-assets-manifest'); |
||||
|
||||
webpackConfig.plugins.push( |
||||
new WebpackAssetsManifest({ |
||||
output: 'assets.json', |
||||
space: 2, |
||||
writeToDisk: false, |
||||
assets: config.manifest, |
||||
replacer: require('./util/assetManifestsFormatter'), |
||||
}) |
||||
); |
||||
} |
||||
|
||||
if (config.enabled.watcher) { |
||||
webpackConfig.entry = require('./util/addHotMiddleware')(webpackConfig.entry); |
||||
webpackConfig = merge(webpackConfig, require('./webpack.config.watch')); |
||||
} |
||||
|
||||
module.exports = webpackConfig; |
@ -0,0 +1,19 @@
|
||||
'use strict'; // eslint-disable-line
|
||||
|
||||
const { default: ImageminPlugin } = require('imagemin-webpack-plugin'); |
||||
const imageminMozjpeg = require('imagemin-mozjpeg'); |
||||
|
||||
const config = require('./config'); |
||||
|
||||
module.exports = { |
||||
plugins: [ |
||||
new ImageminPlugin({ |
||||
optipng: { optimizationLevel: 7 }, |
||||
gifsicle: { optimizationLevel: 3 }, |
||||
pngquant: { quality: '65-90', speed: 4 }, |
||||
svgo: { removeUnknownsAndDefaults: false, cleanupIDs: false }, |
||||
plugins: [imageminMozjpeg({ quality: 75 })], |
||||
disable: (config.enabled.watcher), |
||||
}), |
||||
], |
||||
}; |
@ -0,0 +1,35 @@
|
||||
const url = require('url'); |
||||
const webpack = require('webpack'); |
||||
const BrowserSyncPlugin = require('browsersync-webpack-plugin'); |
||||
|
||||
const config = require('./config'); |
||||
|
||||
const target = process.env.DEVURL || config.devUrl; |
||||
|
||||
/** |
||||
* We do this to enable injection over SSL. |
||||
*/ |
||||
if (url.parse(target).protocol === 'https:') { |
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0; |
||||
} |
||||
|
||||
module.exports = { |
||||
output: { |
||||
pathinfo: true, |
||||
publicPath: config.proxyUrl + config.publicPath, |
||||
}, |
||||
devtool: '#cheap-module-source-map', |
||||
stats: false, |
||||
plugins: [ |
||||
new webpack.optimize.OccurrenceOrderPlugin(), |
||||
new webpack.HotModuleReplacementPlugin(), |
||||
new webpack.NoEmitOnErrorsPlugin(), |
||||
new BrowserSyncPlugin({ |
||||
target, |
||||
open: config.open, |
||||
proxyUrl: config.proxyUrl, |
||||
watch: config.watch, |
||||
delay: 500, |
||||
}), |
||||
], |
||||
}; |
@ -0,0 +1,21 @@
|
||||
{ |
||||
"entry": { |
||||
"main": [ |
||||
"./scripts/main.js", |
||||
"./styles/main.scss" |
||||
], |
||||
"customizer": [ |
||||
"./scripts/customizer.js" |
||||
] |
||||
}, |
||||
"publicPath": "app/themes/pressbooks-aldine", |
||||
"devUrl": "https://pressbooks.dev", |
||||
"proxyUrl": "http://localhost:3000", |
||||
"cacheBusting": "[name]_[hash:8]", |
||||
"watch": [ |
||||
"app/**/*.php", |
||||
"config/**/*.php", |
||||
"resources/controllers/**/*.php", |
||||
"resources/views/**/*.php" |
||||
] |
||||
} |
@ -0,0 +1,5 @@
|
||||
import $ from 'jquery'; |
||||
|
||||
wp.customize('blogname', (value) => { |
||||
value.bind(to => $('.brand').text(to)); |
||||
}); |
@ -0,0 +1,24 @@
|
||||
// import external dependencies
|
||||
import 'jquery'; |
||||
|
||||
// Import everything from autoload
|
||||
import "./autoload/**/*" |
||||
|
||||
// import local dependencies
|
||||
import Router from './util/Router'; |
||||
import common from './routes/common'; |
||||
import home from './routes/home'; |
||||
import aboutUs from './routes/about'; |
||||
|
||||
/** Populate Router instance with DOM routes */ |
||||
const routes = new Router({ |
||||
// All pages
|
||||
common, |
||||
// Home page
|
||||
home, |
||||
// About Us page, note the change from about-us to aboutUs.
|
||||
aboutUs, |
||||
}); |
||||
|
||||
// Load Events
|
||||
jQuery(document).ready(() => routes.loadEvents()); |
@ -0,0 +1,5 @@
|
||||
export default { |
||||
init() { |
||||
// JavaScript to be fired on the about us page
|
||||
}, |
||||
}; |
@ -0,0 +1,8 @@
|
||||
export default { |
||||
init() { |
||||
// JavaScript to be fired on all pages
|
||||
}, |
||||
finalize() { |
||||
// JavaScript to be fired on all pages, after page specific JS is fired
|
||||
}, |
||||
}; |
@ -0,0 +1,8 @@
|
||||
export default { |
||||
init() { |
||||
// JavaScript to be fired on the home page
|
||||
}, |
||||
finalize() { |
||||
// JavaScript to be fired on the home page, after the init JS
|
||||
}, |
||||
}; |
@ -0,0 +1,63 @@
|
||||
import camelCase from './camelCase'; |
||||
|
||||
/** |
||||
* DOM-based Routing |
||||
* |
||||
* Based on {@link http://goo.gl/EUTi53|Markup-based Unobtrusive Comprehensive DOM-ready Execution} by Paul Irish
|
||||
* |
||||
* The routing fires all common scripts, followed by the page specific scripts. |
||||
* Add additional events for more control over timing e.g. a finalize event |
||||
*/ |
||||
class Router { |
||||
|
||||
/** |
||||
* Create a new Router |
||||
* @param {Object} routes |
||||
*/ |
||||
constructor(routes) { |
||||
this.routes = routes; |
||||
} |
||||
|
||||
/** |
||||
* Fire Router events |
||||
* @param {string} route DOM-based route derived from body classes (`<body class="...">`) |
||||
* @param {string} [event] Events on the route. By default, `init` and `finalize` events are called. |
||||
* @param {string} [arg] Any custom argument to be passed to the event. |
||||
*/ |
||||
fire(route, event = 'init', arg) { |
||||
const fire = route !== '' && this.routes[route] && typeof this.routes[route][event] === 'function'; |
||||
if (fire) { |
||||
this.routes[route][event](arg); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Automatically load and fire Router events |
||||
* |
||||
* Events are fired in the following order: |
||||
* * common init |
||||
* * page-specific init |
||||
* * page-specific finalize |
||||
* * common finalize |
||||
*/ |
||||
loadEvents() { |
||||
// Fire common init JS
|
||||
this.fire('common'); |
||||
|
||||
// Fire page-specific init JS, and then finalize JS
|
||||
document.body.className |
||||
.toLowerCase() |
||||
.replace(/-/g, '_') |
||||
.split(/\s+/) |
||||
.map(camelCase) |
||||
.forEach((className) => { |
||||
this.fire(className); |
||||
this.fire(className, 'finalize'); |
||||
}); |
||||
|
||||
// Fire common finalize JS
|
||||
this.fire('common', 'finalize'); |
||||
} |
||||
} |
||||
|
||||
export default Router |
@ -0,0 +1,9 @@
|
||||
/** |
||||
* the most terrible camelizer on the internet, guaranteed! |
||||
* @param {string} str String that isn't camel-case, e.g., CAMeL_CaSEiS-harD |
||||
* @return {string} String converted to camel-case, e.g., camelCaseIsHard |
||||
*/ |
||||
export default str => `${str.charAt(0).toLowerCase()}${str.replace(/[\W_]/g, '|').split('|') |
||||
.map(part => `${part.charAt(0).toUpperCase()}${part.slice(1)}`) |
||||
.join('') |
||||
.slice(1)}`;
|
@ -0,0 +1,5 @@
|
||||
/** Colors */ |
||||
$brand-primary: #27ae60; |
||||
|
||||
/** Box Model */ |
||||
$spacer: 2rem; |
@ -0,0 +1,5 @@
|
||||
// TODO: .comment-list {} |
||||
// TODO: .comment-list ol {} |
||||
// TODO: .comment-form p {} |
||||
// TODO: .comment-form input {} |
||||
// TODO: .comment-form textarea {} |
@ -0,0 +1,5 @@
|
||||
/** Search form */ |
||||
// TODO: .search-form {} |
||||
// TODO: .search-form label {} |
||||
// TODO: .search-form .search-field {} |
||||
// TODO: .search-form .search-submit {} |
@ -0,0 +1,56 @@
|
||||
/** |
||||
* WordPress Generated Classes |
||||
* @see http://codex.wordpress.org/CSS#WordPress_Generated_Classes |
||||
*/ |
||||
|
||||
/** Media alignment */ |
||||
.alignnone { |
||||
margin-left: 0; |
||||
margin-right: 0; |
||||
max-width: 100%; |
||||
height: auto; |
||||
} |
||||
|
||||
.aligncenter { |
||||
display: block; |
||||
margin: ($spacer / 2) auto; |
||||
height: auto; |
||||
} |
||||
|
||||
.alignleft, |
||||
.alignright { |
||||
margin-bottom: ($spacer / 2); |
||||
height: auto; |
||||
} |
||||
|
||||
@media (min-width: 30rem) { |
||||
.alignleft { |
||||
float: left; |
||||
margin-right: ($spacer / 2); |
||||
} |
||||
|
||||
.alignright { |
||||
float: right; |
||||
margin-left: ($spacer / 2); |
||||
} |
||||
} |
||||
|
||||
/** Captions */ |
||||
|
||||
// TODO: .wp-caption {} |
||||
// TODO: .wp-caption img {} |
||||
// TODO: .wp-caption-text {} |
||||
|
||||
/** Text meant only for screen readers */ |
||||
.screen-reader-text { |
||||
position: absolute; |
||||
width: 1px; |
||||
height: 1px; |
||||
padding: 0; |
||||
margin: -1px; |
||||
overflow: hidden; |
||||
clip: rect(0, 0, 0, 0); |
||||
border: 0; |
||||
color: #000; |
||||
background: #fff; |
||||
} |
@ -0,0 +1,2 @@
|
||||
// TODO: .banner .nav li {} |
||||
// TODO: .banner .nav a {} |
@ -0,0 +1,3 @@
|
||||
body#tinymce { |
||||
margin: 12px !important; |
||||
} |
@ -0,0 +1,25 @@
|
||||
@import "common/variables"; |
||||
|
||||
/** Import everything from autoload */ |
||||
@import "./autoload/**/*"; |
||||
|
||||
/** |
||||
* Import npm dependencies |
||||
* |
||||
* Prefix your imports with `~` to grab from node_modules/ |
||||
* @see https://github.com/webpack-contrib/sass-loader#imports |
||||
*/ |
||||
// @import "~some-node-module"; |
||||
|
||||
/** Import theme styles */ |
||||
@import "common/global"; |
||||
@import "components/buttons"; |
||||
@import "components/comments"; |
||||
@import "components/forms"; |
||||
@import "components/wp-classes"; |
||||
@import "layouts/header"; |
||||
@import "layouts/sidebar"; |
||||
@import "layouts/footer"; |
||||
@import "layouts/pages"; |
||||
@import "layouts/posts"; |
||||
@import "layouts/tinymce"; |
@ -0,0 +1,10 @@
|
||||
<?php |
||||
|
||||
namespace App; |
||||
|
||||
use Sober\Controller\Controller; |
||||
|
||||
class About extends Controller |
||||
{ |
||||
|
||||
} |
@ -0,0 +1,13 @@
|
||||
<?php |
||||
|
||||
namespace App; |
||||
|
||||
use Sober\Controller\Controller; |
||||
|
||||
class App extends Controller |
||||
{ |
||||
public function siteName() |
||||
{ |
||||
return get_bloginfo('name'); |
||||
} |
||||
} |
@ -0,0 +1,10 @@
|
||||
<?php |
||||
|
||||
namespace App; |
||||
|
||||
use Sober\Controller\Controller; |
||||
|
||||
class Home extends Controller |
||||
{ |
||||
|
||||
} |
@ -0,0 +1,92 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Do not edit anything in this file unless you know what you're doing |
||||
*/ |
||||
|
||||
use Roots\Sage\Config; |
||||
use Roots\Sage\Container; |
||||
|
||||
/** |
||||
* Helper function for prettying up errors |
||||
* @param string $message |
||||
* @param string $subtitle |
||||
* @param string $title |
||||
*/ |
||||
$sage_error = function ($message, $subtitle = '', $title = '') { |
||||
$title = $title ?: __('Sage › Error', 'sage'); |
||||
$footer = '<a href="https://roots.io/sage/docs/">roots.io/sage/docs/</a>'; |
||||
$message = "<h1>{$title}<br><small>{$subtitle}</small></h1><p>{$message}</p><p>{$footer}</p>"; |
||||
wp_die($message, $title); |
||||
}; |
||||
|
||||
/** |
||||
* Ensure compatible version of PHP is used |
||||
*/ |
||||
if (version_compare('5.6.4', phpversion(), '>=')) { |
||||
$sage_error(__('You must be using PHP 5.6.4 or greater.', 'sage'), __('Invalid PHP version', 'sage')); |
||||
} |
||||
|
||||
/** |
||||
* Ensure compatible version of WordPress is used |
||||
*/ |
||||
if (version_compare('4.7.0', get_bloginfo('version'), '>=')) { |
||||
$sage_error(__('You must be using WordPress 4.7.0 or greater.', 'sage'), __('Invalid WordPress version', 'sage')); |
||||
} |
||||
|
||||
/** |
||||
* Ensure dependencies are loaded |
||||
*/ |
||||
if (!class_exists('Roots\\Sage\\Container')) { |
||||
if (!file_exists($composer = __DIR__.'/../vendor/autoload.php')) { |
||||
$sage_error( |
||||
__('You must run <code>composer install</code> from the Sage directory.', 'sage'), |
||||
__('Autoloader not found.', 'sage') |
||||
); |
||||
} |
||||
require_once $composer; |
||||
} |
||||
|
||||
/** |
||||
* Sage required files |
||||
* |
||||
* The mapped array determines the code library included in your theme. |
||||
* Add or remove files to the array as needed. Supports child theme overrides. |
||||
*/ |
||||
array_map(function ($file) use ($sage_error) { |
||||
$file = "../app/{$file}.php"; |
||||
if (!locate_template($file, true, true)) { |
||||
$sage_error(sprintf(__('Error locating <code>%s</code> for inclusion.', 'sage'), $file), 'File not found'); |
||||
} |
||||
}, ['helpers', 'setup', 'filters', 'admin']); |
||||
|
||||
/** |
||||
* Here's what's happening with these hooks: |
||||
* 1. WordPress initially detects theme in themes/sage/resources |
||||
* 2. Upon activation, we tell WordPress that the theme is actually in themes/sage/resources/views |
||||
* 3. When we call get_template_directory() or get_template_directory_uri(), we point it back to themes/sage/resources |
||||
* |
||||
* We do this so that the Template Hierarchy will look in themes/sage/resources/views for core WordPress themes |
||||
* But functions.php, style.css, and index.php are all still located in themes/sage/resources |
||||
* |
||||
* This is not compatible with the WordPress Customizer theme preview prior to theme activation |
||||
* |
||||
* get_template_directory() -> /srv/www/example.com/current/web/app/themes/sage/resources |
||||
* get_stylesheet_directory() -> /srv/www/example.com/current/web/app/themes/sage/resources |
||||
* locate_template() |
||||
* ├── STYLESHEETPATH -> /srv/www/example.com/current/web/app/themes/sage/resources/views |
||||
* └── TEMPLATEPATH -> /srv/www/example.com/current/web/app/themes/sage/resources |
||||
*/ |
||||
array_map( |
||||
'add_filter', |
||||
['theme_file_path', 'theme_file_uri', 'parent_theme_file_path', 'parent_theme_file_uri'], |
||||
array_fill(0, 4, 'dirname') |
||||
); |
||||
Container::getInstance() |
||||
->bindIf('config', function () { |
||||
return new Config([ |
||||
'assets' => require dirname(__DIR__).'/config/assets.php', |
||||
'theme' => require dirname(__DIR__).'/config/theme.php', |
||||
'view' => require dirname(__DIR__).'/config/view.php', |
||||
]); |
||||
}, true); |
After Width: | Height: | Size: 225 B |
@ -0,0 +1,12 @@
|
||||
/* |
||||
Theme Name: Aldine |
||||
Theme URI: https://pressbooks.org/themes/aldine |
||||
Description: Aldine is the root theme for Pressbooks networks. |
||||
Version: 1.0.0-dev |
||||
Author: Pressbooks (Book Oven Inc.) |
||||
Author URI: https://pressbooks.org |
||||
Text Domain: sage |
||||
|
||||
License: MIT License |
||||
License URI: http://opensource.org/licenses/MIT |
||||
*/ |
@ -0,0 +1,14 @@
|
||||
@extends('layouts.app') |
||||
|
||||
@section('content') |
||||
@include('partials.page-header') |
||||
|
||||
@if (!have_posts()) |
||||
<div class="alert alert-warning"> |
||||
{{ __('Sorry, but the page you were trying to view does not exist.', 'sage') }} |
||||
</div> |
||||
{!! get_search_form(false) !!} |
||||
@endif |
||||
|
||||
{!! get_the_posts_navigation() !!} |
||||
@endsection |
@ -0,0 +1,18 @@
|
||||
@extends('layouts.app') |
||||
|
||||
@section('content') |
||||
@include('partials.page-header') |
||||
|
||||
@if (!have_posts()) |
||||
<div class="alert alert-warning"> |
||||
{{ __('Sorry, no results were found.', 'sage') }} |
||||
</div> |
||||
{!! get_search_form(false) !!} |
||||
@endif |
||||
|
||||
@while (have_posts()) @php(the_post()) |
||||
@include('partials.content-'.get_post_type()) |
||||
@endwhile |
||||
|
||||
{!! get_the_posts_navigation() !!} |
||||
@endsection |
@ -0,0 +1,23 @@
|
||||
<!doctype html> |
||||
<html @php(language_attributes())> |
||||
@include('partials.head') |
||||
<body @php(body_class())> |
||||
@php(do_action('get_header')) |
||||
@include('partials.header') |
||||
<div class="wrap container" role="document"> |
||||
<div class="content"> |
||||
<main class="main"> |
||||
@yield('content') |
||||
</main> |
||||
@if (App\display_sidebar()) |
||||
<aside class="sidebar"> |
||||
@include('partials.sidebar') |
||||
</aside> |
||||
@endif |
||||
</div> |
||||
</div> |
||||
@php(do_action('get_footer')) |
||||
@include('partials.footer') |
||||
@php(wp_footer()) |
||||
</body> |
||||
</html> |
@ -0,0 +1,8 @@
|
||||
@extends('layouts.app') |
||||
|
||||
@section('content') |
||||
@while(have_posts()) @php(the_post()) |
||||
@include('partials.page-header') |
||||
@include('partials.content-page') |
||||
@endwhile |
||||
@endsection |
@ -0,0 +1,38 @@
|
||||
@php |
||||
if (post_password_required()) { |
||||
return; |
||||
} |
||||
@endphp |
||||
|
||||
<section id="comments" class="comments"> |
||||
@if (have_comments()) |
||||
<h2> |
||||
{!! sprintf(_nx('One response to “%2$s”', '%1$s responses to “%2$s”', get_comments_number(), 'comments title', 'sage'), number_format_i18n(get_comments_number()), '<span>' . get_the_title() . '</span>') !!} |
||||
</h2> |
||||
|
||||
<ol class="comment-list"> |
||||
{!! wp_list_comments(['style' => 'ol', 'short_ping' => true]) !!} |
||||
</ol> |
||||
|
||||
@if (get_comment_pages_count() > 1 && get_option('page_comments')) |
||||
<nav> |
||||
<ul class="pager"> |
||||
@if (get_previous_comments_link()) |
||||
<li class="previous">@php(previous_comments_link(__('← Older comments', 'sage')))</li> |
||||
@endif |
||||
@if (get_next_comments_link()) |
||||
<li class="next">@php(next_comments_link(__('Newer comments →', 'sage')))</li> |
||||
@endif |
||||
</ul> |
||||
</nav> |
||||
@endif |
||||
@endif |
||||
|
||||
@if (!comments_open() && get_comments_number() != '0' && post_type_supports(get_post_type(), 'comments')) |
||||
<div class="alert alert-warning"> |
||||
{{ __('Comments are closed.', 'sage') }} |
||||
</div> |
||||
@endif |
||||
|
||||
@php(comment_form()) |
||||
</section> |
@ -0,0 +1,2 @@
|
||||
@php(the_content()) |
||||
{!! wp_link_pages(['echo' => 0, 'before' => '<nav class="page-nav"><p>' . __('Pages:', 'sage'), 'after' => '</p></nav>']) !!} |
@ -0,0 +1,11 @@
|
||||
<article @php(post_class())> |
||||
<header> |
||||
<h2 class="entry-title"><a href="{{ get_permalink() }}">{{ get_the_title() }}</a></h2> |
||||
@if (get_post_type() === 'post') |
||||
@include('partials/entry-meta') |
||||
@endif |
||||
</header> |
||||
<div class="entry-summary"> |
||||
@php(the_excerpt()) |
||||
</div> |
||||
</article> |
@ -0,0 +1,13 @@
|
||||
<article @php(post_class())> |
||||
<header> |
||||
<h1 class="entry-title">{{ get_the_title() }}</h1> |
||||
@include('partials/entry-meta') |
||||
</header> |
||||
<div class="entry-content"> |
||||
@php(the_content()) |
||||
</div> |
||||
<footer> |
||||
{!! wp_link_pages(['echo' => 0, 'before' => '<nav class="page-nav"><p>' . __('Pages:', 'sage'), 'after' => '</p></nav>']) !!} |
||||
</footer> |
||||
@php(comments_template('/partials/comments.blade.php')) |
||||
</article> |
@ -0,0 +1,9 @@
|
||||
<article @php(post_class())> |
||||
<header> |
||||
<h2 class="entry-title"><a href="{{ get_permalink() }}">{{ get_the_title() }}</a></h2> |
||||
@include('partials/entry-meta') |
||||
</header> |
||||
<div class="entry-summary"> |
||||
@php(the_excerpt()) |
||||
</div> |
||||
</article> |
@ -0,0 +1,6 @@
|
||||
<time class="updated" datetime="{{ get_post_time('c', true) }}">{{ get_the_date() }}</time> |
||||
<p class="byline author vcard"> |
||||
{{ __('By', 'sage') }} <a href="{{ get_author_posts_url(get_the_author_meta('ID')) }}" rel="author" class="fn"> |
||||
{{ get_the_author() }} |
||||
</a> |
||||
</p> |
@ -0,0 +1,5 @@
|
||||
<footer class="content-info"> |
||||
<div class="container"> |
||||
@php(dynamic_sidebar('sidebar-footer')) |
||||
</div> |
||||
</footer> |
@ -0,0 +1,6 @@
|
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="x-ua-compatible" content="ie=edge"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
||||
@php(wp_head()) |
||||
</head> |
@ -0,0 +1,10 @@
|
||||
<header class="banner"> |
||||
<div class="container"> |
||||
<a class="brand" href="{{ home_url('/') }}">{{ get_bloginfo('name', 'display') }}</a> |
||||
<nav class="nav-primary"> |
||||
@if (has_nav_menu('primary_navigation')) |
||||
{!! wp_nav_menu(['theme_location' => 'primary_navigation', 'menu_class' => 'nav']) !!} |
||||
@endif |
||||
</nav> |
||||
</div> |
||||
</header> |
@ -0,0 +1,3 @@
|
||||
<div class="page-header"> |
||||
<h1>{!! App\title() !!}</h1> |
||||
</div> |
@ -0,0 +1 @@
|
||||
@php(dynamic_sidebar('sidebar-primary')) |
@ -0,0 +1,18 @@
|
||||
@extends('layouts.app') |
||||
|
||||
@section('content') |
||||
@include('partials.page-header') |
||||
|
||||
@if (!have_posts()) |
||||
<div class="alert alert-warning"> |
||||
{{ __('Sorry, no results were found.', 'sage') }} |
||||
</div> |
||||
{!! get_search_form(false) !!} |
||||
@endif |
||||
|
||||
@while(have_posts()) @php(the_post()) |
||||
@include('partials.content-search') |
||||
@endwhile |
||||
|
||||
{!! get_the_posts_navigation() !!} |
||||
@endsection |
@ -0,0 +1,7 @@
|
||||
@extends('layouts.app') |
||||
|
||||
@section('content') |
||||
@while(have_posts()) @php(the_post()) |
||||
@include('partials.content-single-'.get_post_type()) |
||||
@endwhile |
||||
@endsection |
@ -0,0 +1,12 @@
|
||||
{{-- |
||||
Template Name: Custom Template |
||||
--}} |
||||
|
||||
@extends('layouts.app') |
||||
|
||||
@section('content') |
||||
@while(have_posts()) @php(the_post()) |
||||
@include('partials.page-header') |
||||
@include('partials.content-page') |
||||
@endwhile |
||||
@endsection |
Loading…
Reference in new issue