├── .babelrc ├── .browserslistrc ├── .editorconfig ├── .env.example ├── .eslintrc.yaml ├── .gitignore ├── 404.php ├── CHANGELOG.md ├── LICENSE ├── README.md ├── app ├── bootstrap.php ├── config │ ├── autoload.php │ ├── timber.php │ ├── woocommerce.php │ └── wp │ │ ├── admin-page.php │ │ ├── image-sizes.php │ │ ├── login-page.php │ │ ├── maintenance.php │ │ ├── menus.php │ │ ├── scripts-and-styles.php │ │ ├── security.php │ │ ├── sidebars.php │ │ └── theme-supports.php ├── helpers.php ├── models │ ├── Blueprints │ │ ├── PostType.php │ │ └── Taxonomy.php │ ├── Category.php │ ├── Page.php │ ├── Post.php │ └── Tag.php ├── timber-extends │ └── BaseCampSite.php └── utils │ └── Session.php ├── archive.php ├── author.php ├── build ├── config.js └── webpack.config.js ├── composer.json ├── composer.lock ├── functions.php ├── index.php ├── luna ├── package-lock.json ├── package.json ├── page.php ├── postcss.config.js ├── resources ├── assets │ ├── images │ │ ├── base-camp-logo.png │ │ ├── base-camp-logo_alt.png │ │ └── favicon.png │ ├── js │ │ ├── components │ │ │ └── Example.vue │ │ └── main.js │ └── sass │ │ ├── _common.sass │ │ ├── _footer.sass │ │ ├── _helpers.sass │ │ ├── _pageloader.sass │ │ ├── _single.sass │ │ ├── _variables.sass │ │ ├── admin.sass │ │ ├── components │ │ ├── _article.sass │ │ ├── _comment.sass │ │ ├── _navbar.sass │ │ ├── _social-media.sass │ │ └── index.sass │ │ ├── login.sass │ │ ├── main.sass │ │ ├── shared-with-vue.sass │ │ └── woocommerce │ │ ├── _archive.sass │ │ ├── _common.sass │ │ ├── _single-product.sass │ │ ├── _tease-product.sass │ │ └── index.sass ├── languages │ ├── base-camp.pot │ └── messages.php └── views │ ├── 404.twig │ ├── archive.twig │ ├── author.twig │ ├── base.twig │ ├── comment-form.twig │ ├── comment.twig │ ├── components │ ├── article.twig │ ├── navbar │ │ ├── _navbar-brand.twig │ │ ├── _navbar-end.twig │ │ ├── _navbar-menu.twig │ │ ├── _navbar-start.twig │ │ └── index.twig │ ├── pagination.twig │ └── social-media.twig │ ├── footer │ └── index.twig │ ├── header │ ├── _head.twig │ └── index.twig │ ├── index.twig │ ├── maintenance.twig │ ├── page.twig │ ├── search.twig │ ├── searchform.twig │ ├── single-password.twig │ ├── single.twig │ └── woocommerce │ ├── archive.twig │ ├── single-product.twig │ └── tease-product.twig ├── screenshot.png ├── search.php ├── searchform.php ├── single.php ├── style.css ├── woocommerce.php └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "useBuiltIns": "usage" 7 | } 8 | ] 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | 13 | [*.php] 14 | indent_size = 4 15 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # Supported values: false, "enable", "full" 2 | MAINTENANCE="false" 3 | 4 | # Supported values: "development", "production" 5 | MODE="development" 6 | -------------------------------------------------------------------------------- /.eslintrc.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | extends: [ 3 | "airbnb-base", 4 | "plugin:vue/recommended" 5 | ] 6 | env: 7 | browser: true 8 | es6: true 9 | plugins: [ 10 | "vue" 11 | ] 12 | rules: 13 | import/extensions: 0 14 | import/no-unresolved: 0 15 | no-new: 0 16 | max-len: [2, 80, 2, { "ignoreUrls": true }] 17 | quotes: [2, "single"] 18 | parserOptions: 19 | parser: "babel-eslint" 20 | ecmaVersion: 6 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | vendor 2 | node_modules 3 | static 4 | .idea 5 | .vscode 6 | .env 7 | -------------------------------------------------------------------------------- /404.php: -------------------------------------------------------------------------------- 1 | 0.7.2 21 | 22 | ## **v1.8.2 (2018-08-09)** 23 | 24 | ### Changed 25 | * Timber will be added via composer instead of wordpress plugin 26 | 27 | ## **v1.8.0 (2018-07-27)** 28 | 29 | ### Added 30 | * Models (Wrapper classes for Wordpress Post Types and Taxonomies.) 31 | * Updated Luna (A new command `make:custom-taxonomy`) 32 | * `make:custom-post-type` and `make:custom-taxonomy` command creates model which helps interact with a new post types or taxonomy. 33 | * namespace `Basecamp\Models\` for `app/models/` directory 34 | 35 | ## **v1.7.0 (2018-07-01)** 36 | 37 | ### Added 38 | * Variables in `_variables.sass` can be used in `*.vue` files 39 | * Webpack removes unused css from `app.[hash].css` file 40 | * A new command `make:menu-page` 41 | * screenshot for theme 42 | 43 | ### Changed 44 | * Migrated from webpack 3 to webpack 4 45 | * Moved Luna CLIs [docs](https://github.com/suomato/luna) to `suomato/luna` repository 46 | * Updated composer packages (Now PHP version must be at least v7.0!) 47 | * Updated Timber to v1.7.1 48 | 49 | ### Removed 50 | * `dd()` from `/app/helpers.php`. This function comes now with the `symfony/var-dumper` 51 | 52 | ## **v1.6.0 (2018-03-30)** 53 | 54 | ### Added 55 | * Woocommerce support 56 | * Basic boilerplate for woocommerce (`.twig` and `.sass.` files) 57 | 58 | ### Changed 59 | * Updated javascrit packages 60 | 61 | ### Fixed 62 | * Images and fonts `publicPath` in `webpack.config.js` 63 | * Fixed localize path in `bootstrap.php` 64 | 65 | ## **v1.5.0 (2017-11-19)** 66 | 67 | ### Added 68 | * `build/` for webpack config and custom config 69 | * new webpack alias `~images` for relative image paths 70 | 71 | ### Changed 72 | * moved `bootstrap.php` to `app/bootstrap.php` 73 | * refactored webpack config 74 | 75 | ## **v1.4.2 (2017-11-16)** 76 | 77 | ### Added 78 | * Theme init config from `functions.php` to `bootstrap.php` 79 | * Extensions to webpack config. Now Vue file can be imported without using .vue extension 80 | 81 | ### Changed 82 | * Refactored assets 83 | 84 | ### Fixed 85 | * Vue production bundle (Fixed Webpack config) 86 | 87 | ## **v1.4.0 (2017-11-11)** 88 | 89 | ### Added 90 | * Maintenance mode 91 | * Maintenance config to `app/config/wp/maintenance.php` 92 | * Maintenance page tempalte `resources/views/maintenance.twig` 93 | * PHP dotenv (Environment variables) 94 | 95 | ### Fixed 96 | * Bug in webpack config 97 | 98 | ## **v1.3.0 (2017-11-05)** 99 | 100 | ### Added 101 | * Custom image size config to `app/config/wp/image-sizes.php` 102 | * Some security config to `app/config/wp/security.php` 103 | 104 | ### Changed 105 | * Luna 1.0.0 -> 1.1.0 (A new command make:shortcode) 106 | * updated packages 107 | 108 | ## **v1.2.0 (2017-10-22)** 109 | 110 | ### Added 111 | * Third menu level (Wordpress Main menu supports third menu level) 112 | * Favicon to admin page and login page 113 | 114 | ### Changed 115 | * Refactored Navbar component 116 | * Refactored `_variables.sass` file 117 | 118 | ### Fixed 119 | * Pagination border-color 120 | 121 | --- 122 | 123 | ## **v1.1.0 (2017-10-01)** 124 | 125 | ### Added 126 | * Login page config to `app/config/wp/login-page.php` 127 | * Favicon to `resources/assets/images/favicon.png` 128 | * Login page styles to `resources/assets/sass/login.sass` 129 | * Images path helper `images_path()` to `app/helpers.php` 130 | * `File-loader` and `image-webpack-loader` to webpack 131 | 132 | ### Changed 133 | * Sass variables to own file `resources/assets/sass/_variables.sass` 134 | 135 | 136 | ### Fixed 137 | * CleanWebpackPlugin better config. Watch mode clear static folder after every build 138 | 139 | ### Removed 140 | * `purifycss` and `purifycss-webpack` packages 141 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2017 Toni Suomalainen 2 | 3 | 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: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | 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. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | Dependency Status Dependency Status License 5 |

6 | 7 | ## About Base Camp 8 | 9 | > Awesome WordPress starter theme with own CLI for developers based on modern web technologies. 10 | 11 | ## Features 12 | * [Bulma](http://bulma.io/) (Responsive CSS framework based on Flexbox) 13 | * [Timber](https://www.upstatement.com/timber/) 14 | * Twig Template Engine 15 | * Cleaner and better code 16 | * Separates the logic from presentation 17 | * [Webpack](https://webpack.github.io/) 18 | * Sass / Scss for stylesheets (Minimize in production) 19 | * ES6 for Javascript (Minimize in production) 20 | * Automatic Cache Busting 21 | * Split javascript code to two chunks, app.js and vendor.js 22 | * [Vuejs](https://vuejs.org/) for boosting frontend development 23 | * [BrowserSync](https://www.browsersync.io/) for synchronised browser testing 24 | * [Luna](https://github.com/suomato/luna) (Command-line interface included with Base Camp) 25 | * [WooCommerce](https://woocommerce.com/) support with basic boilerplate. 26 | 27 | ## Requirements 28 | * [Wordpress](https://wordpress.org/) >= v4.9.6 29 | * [Composer](https://getcomposer.org/download/) >= v1.6.5 30 | * [PHP](http://php.net/manual/en/install.php) >= v7.0 31 | * [Yarn](https://yarnpkg.com/en/) >= v1.7.0 **or** [npm](https://www.npmjs.com/) >= v6.1.0 32 | * [Nodejs](https://nodejs.org/en/) >= v8.11.1 33 | 34 | ## Installation 35 | * Go your themes folder and run`composer create-project suomato/base-camp` 36 | * `cd base-camp` 37 | * `yarn` **or** `npm install` 38 | * define your custom webpack config to `build/config.js` file 39 | * `yarn watch` **or** `npm run watch` 40 | * Happy developing :) 41 | 42 | ## Structure 43 | ``` 44 | base-camp/ # Theme root 45 | ├── app/ # Theme logic 46 | │ ├── config/ # Theme config 47 | │ │ ├── wp/ # WordPress specific config 48 | │ │ │ ├── admin-page.php # Register here WordPress Admin Page config 49 | │ │ │ ├── image-sizes.php # Register here WordPress Custom image sizes 50 | │ │ │ ├── login-page.php # Register here WordPress Login Page config 51 | │ │ │ ├── maintenance.php # Maintenance mode config 52 | │ │ │ ├── menus.php # Register here WordPress navigation menus 53 | │ │ │ ├── scripts-and-styles.php # Register here WordPress scripts and styles 54 | │ │ │ ├── security.php # Things that increase the site security 55 | │ │ │ ├── sidebars.php # Register here WordPress sidebars 56 | │ │ │ └── theme-supports.php # Register here WordPress theme features 57 | │ │ ├── autoload.php # Includes all config files (DON'T REMOVE THIS) 58 | │ │ ├── timber.php # Timber specific config 59 | │ │ └── woocommerce.php # Init woocommerce support 60 | │ ├── models/ # Wrappers for Timber Classes 61 | │ ├── timber-extends/ # Extended Timber Classes 62 | │ │ └── BaseCampSite.php # Extended TimberSite Class 63 | │ ├── bootstrap.php # Bootstrap theme 64 | │ ├── helpers.php # Common helper functions 65 | ├── build/ # Theme assets and views 66 | │ ├── config.js # Custom webpack config 67 | │ ├── webpack.config.js # Webpack config 68 | ├── resources/ # Theme assets and views 69 | │ ├── assets/ # Front-end assets 70 | │ │ ├── js/ # Javascripts 71 | │ │ │ └── components/ # Vue Components 72 | │ │ ├── sass/ # Styles 73 | │ │ │ └── components/ # Partials 74 | │ ├── languages/ # Language features 75 | │ │ ├── base-camp.pot # Template for translation 76 | │ │ └── messages.php # Language strings 77 | │ ├── views/ # Theme Twig files 78 | │ │ ├── components/ # Partials 79 | │ │ ├── footer/ # Theme footer templates 80 | │ │ └── header/ # Theme header templates 81 | ``` 82 | 83 | ## Models 84 | > Models are wrapper classes for Wordpress Post Types and Taxonomies. They provide very simple interface to interact with the database. 85 | 86 | ### How to use 87 | ``` 88 | // index.php 89 | 90 | get(); 102 | 103 | // skips first two posts; 104 | Post::skip(2)->get(); 105 | 106 | // returns published posts; 107 | // Supported values: https://codex.wordpress.org/Post_Status#Default_Statuses 108 | Post::status('publish')->get(); 109 | 110 | // returns all posts except post with ID 1; 111 | Post::exclude([1])->get(); 112 | 113 | // returns only posts with ID 1; 114 | Post::include([1])->get(); 115 | 116 | // returns an array of posts descending order by author; 117 | // Supported Values: https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters 118 | Post::orderby('author', 'desc')->get(); 119 | 120 | // returns an array of posts authored by admin; 121 | Post::author('admin')->get(); 122 | 123 | // returns an array of posts which are in category 'cars' or 'vehicles'; 124 | Post::inCategory(['cars', 'vehicles'])->get(); 125 | ``` 126 | 127 | > All queries are chainable. For example you can get three first incomplete posts authored by admin: 128 | ``` 129 | Post::status('draft')->author('admin')->take(3)->get(); 130 | ``` 131 | 132 | All models are able to use almost every methods. However there are some exceptions: 133 | 134 | * Only `Post` model has `inCategory()` method 135 | * Taxonomies (Category, Tag) have `hideEmpty()` method 136 | 137 | 138 | ## Luna (Command-line interface) 139 | > [Docs](https://github.com/suomato/luna) 140 | 141 | -------------------------------------------------------------------------------- /app/bootstrap.php: -------------------------------------------------------------------------------- 1 | load(); 14 | 15 | // Load WordPress config files 16 | require_once __DIR__ . '/../app/config/autoload.php'; 17 | 18 | // Init Sessions 19 | Session::init(); 20 | 21 | /** 22 | * Loads the theme's translated strings. 23 | */ 24 | function localize() 25 | { 26 | load_theme_textdomain('base-camp', get_template_directory() . '/resources/languages'); 27 | } 28 | 29 | add_action('after_setup_theme', 'localize'); 30 | -------------------------------------------------------------------------------- /app/config/autoload.php: -------------------------------------------------------------------------------- 1 | files() 12 | ->in(__DIR__) 13 | ->name('*.php') 14 | ->notName(basename(__FILE__)); 15 | 16 | foreach ($finder as $file) { 17 | require_once $file->getRealPath(); 18 | } 19 | -------------------------------------------------------------------------------- /app/config/timber.php: -------------------------------------------------------------------------------- 1 | 1 ... 5 [6] 7 ... 11 13 | | $pagination_mid_size = 2 => 1 ... 4 5 [6] 7 8 ... 11 14 | | $pagination_mid_size = 3 => 1 ... 3 4 5 [6] 7 8 9 ... 11 15 | | $pagination_mid_size = 3 => 1 2 3 4 [5] 6 7 8 ... 11 16 | | 17 | | Supported Mid size value: 1 - n 18 | | 19 | */ 20 | 21 | $pagination_mid_size = 2; 22 | 23 | $pagination_mid_size += 2; // DON'T TOUCH 24 | 25 | /* 26 | |-------------------------------------------------------------------------- 27 | | Template paths 28 | |-------------------------------------------------------------------------- 29 | | 30 | | Here you may specify an array of paths where to load templates. 31 | | 32 | | Default path: 'resources/views' 33 | | 34 | */ 35 | 36 | Timber::$dirname = ['resources/views']; 37 | 38 | /** 39 | * Adds data to Timber context. 40 | * 41 | * @param $data 42 | * 43 | * @return mixed 44 | */ 45 | function add_to_context($data) 46 | { 47 | // Add Main Menu to Timber context object 48 | $data['menu'] = new TimberMenu(); 49 | 50 | // Add main-sidebar to Timber context object 51 | $data['main_sidebar'] = Timber::get_widgets('main-sidebar'); 52 | 53 | // Add Locale strings to Timber context object 54 | $data['messages'] = get_template_messages(); 55 | 56 | // Logo 57 | $data['logo'] = images_path('base-camp-logo.png'); 58 | 59 | // Favicon 60 | $data['favicon'] = images_path('favicon.png'); 61 | 62 | // Current Template File Name 63 | $data['current_template_file'] = basename($GLOBALS['template']); 64 | 65 | // Extend TimberSite object 66 | $data['site'] = new BaseCampSite(); 67 | 68 | $data['in_production'] = bc_env('MODE', 'production') === 'production'; 69 | 70 | return $data; 71 | } 72 | 73 | add_filter('timber_context', 'add_to_context'); 74 | -------------------------------------------------------------------------------- /app/config/woocommerce.php: -------------------------------------------------------------------------------- 1 | ID); 13 | } 14 | } 15 | 16 | add_action('after_setup_theme', 'woocommerce_support'); 17 | function woocommerce_support() 18 | { 19 | add_theme_support('woocommerce'); 20 | } 21 | 22 | add_theme_support('wc-product-gallery-zoom'); 23 | add_theme_support('wc-product-gallery-lightbox'); 24 | add_theme_support('wc-product-gallery-slider'); 25 | -------------------------------------------------------------------------------- /app/config/wp/admin-page.php: -------------------------------------------------------------------------------- 1 | '; 8 | }); 9 | -------------------------------------------------------------------------------- /app/config/wp/image-sizes.php: -------------------------------------------------------------------------------- 1 | __('Square', 'base-camp'), 17 | ]); 18 | } 19 | 20 | add_filter('image_size_names_choose', 'base_camp_custom_image_sizes'); 21 | -------------------------------------------------------------------------------- /app/config/wp/login-page.php: -------------------------------------------------------------------------------- 1 | '; 32 | }); 33 | -------------------------------------------------------------------------------- /app/config/wp/maintenance.php: -------------------------------------------------------------------------------- 1 | __('Main Sidebar', 'base-camp'), 7 | 'id' => 'main-sidebar', 8 | 'description' => __('Widgets in this area will be shown on all posts and pages.', 'base-camp'), 9 | 'before_widget' => '
', 10 | 'after_widget' => '
', 11 | 'before_title' => '

', 12 | 'after_title' => '

', 13 | ]); 14 | } 15 | 16 | add_action('widgets_init', 'base_camp_register_sidebars'); 17 | -------------------------------------------------------------------------------- /app/config/wp/theme-supports.php: -------------------------------------------------------------------------------- 1 | 32 | add_theme_support('automatic-feed-links'); 33 | 34 | // Allows the use of HTML5 markup for the listen options 35 | add_theme_support('html5', [ 36 | 'caption', 37 | 'comment-form', 38 | 'comment-list', 39 | 'gallery', 40 | 'search-form', 41 | ]); 42 | 43 | // Enables Custom_Backgrounds support for a theme 44 | //add_theme_support('custom-background', [ 45 | // 'default-image' => '', 46 | // 'default-preset' => 'default', 47 | // 'default-position-x' => 'left', 48 | // 'default-position-y' => 'top', 49 | // 'default-size' => 'auto', 50 | // 'default-repeat' => 'repeat', 51 | // 'default-attachment' => 'scroll', 52 | // 'default-color' => '', 53 | // 'wp-head-callback' => '_custom_background_cb', 54 | // 'admin-head-callback' => '', 55 | // 'admin-preview-callback' => '', 56 | //]); 57 | 58 | // Enables Custom_Headers support for a theme 59 | //add_theme_support('custom-header', [ 60 | // 'default-image' => '', 61 | // 'random-default' => false, 62 | // 'width' => 0, 63 | // 'height' => 0, 64 | // 'flex-height' => false, 65 | // 'flex-width' => false, 66 | // 'default-text-color' => '', 67 | // 'header-text' => true, 68 | // 'uploads' => true, 69 | // 'wp-head-callback' => '', 70 | // 'admin-head-callback' => '', 71 | // 'admin-preview-callback' => '', 72 | // 'video' => false, 73 | // 'video-active-callback' => 'is_front_page', 74 | //]); 75 | 76 | // Enables Theme_Logo support for a theme 77 | //add_theme_support('custom-logo', [ 78 | // 'height' => 100, 79 | // 'width' => 400, 80 | // 'flex-height' => true, 81 | // 'flex-width' => true, 82 | // 'header-text' => ['site-title', 'site-description'], 83 | //]); 84 | -------------------------------------------------------------------------------- /app/helpers.php: -------------------------------------------------------------------------------- 1 | getShortName()); 13 | } 14 | 15 | public static function all() 16 | { 17 | return \Timber::get_posts(['post_type' => self::post_type()]); 18 | } 19 | 20 | public static function find($id) 21 | { 22 | $post = new \TimberPost($id); 23 | if ($post->post_type !== self::post_type()) { 24 | return null; 25 | } 26 | 27 | return $post; 28 | } 29 | 30 | public static function take($take) 31 | { 32 | static::$args['posts_per_page'] = $take; 33 | return new static; 34 | } 35 | 36 | public static function skip($skip) 37 | { 38 | static::$args['offset'] = $skip; 39 | return new static; 40 | } 41 | 42 | public static function status($status) 43 | { 44 | static::$args['post_status'] = $status; 45 | return new static; 46 | } 47 | 48 | public static function include($include) 49 | { 50 | static::$args['post__in'] = $include; 51 | return new static; 52 | } 53 | 54 | public static function exclude($exclude) 55 | { 56 | static::$args['post__not_in'] = $exclude; 57 | return new static; 58 | } 59 | 60 | public static function orderby($orderby, $order = 'asc') 61 | { 62 | static::$args['orderby'] = $orderby; 63 | static::$args['order'] = $order; 64 | return new static; 65 | } 66 | 67 | public static function author($author) 68 | { 69 | if (is_int($author)) { 70 | static::$args['author'] = $author; 71 | } else { 72 | static::$args['author_name'] = $author; 73 | } 74 | return new static; 75 | } 76 | 77 | public static function inCategory($categories) 78 | { 79 | if (self::post_type() === 'post') { 80 | if (is_int($categories) || array_filter($categories, 'is_int')) { 81 | static::$args['category'] = $categories; 82 | } else { 83 | static::$args['category_name'] = $categories; 84 | } 85 | return new static; 86 | } 87 | die('Not supported'); 88 | } 89 | 90 | public static function get() 91 | { 92 | $result = \Timber::get_posts(array_merge(['post_type' => self::post_type()], static::$args)); 93 | static::$args = []; 94 | 95 | return $result; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /app/models/Blueprints/Taxonomy.php: -------------------------------------------------------------------------------- 1 | getShortName()); 13 | } 14 | 15 | public static function all() 16 | { 17 | return \Timber::get_terms(['taxonomy' => self::taxonomy_type()]); 18 | } 19 | 20 | public static function find($id) 21 | { 22 | $term = new \TimberTerm($id); 23 | if ($term->taxonomy !== self::taxonomy_type()) { 24 | return null; 25 | } 26 | 27 | return $term; 28 | } 29 | 30 | public static function orderby($orderby, $order = 'asc') 31 | { 32 | static::$args['orderby'] = $orderby; 33 | static::$args['order'] = $order; 34 | return new static; 35 | } 36 | 37 | public static function take($take) 38 | { 39 | static::$args['number'] = $take; 40 | return new static; 41 | } 42 | 43 | public static function skip($skip) 44 | { 45 | static::$args['offset'] = $skip; 46 | return new static; 47 | } 48 | 49 | public static function hideEmpty() 50 | { 51 | static::$args['hide_empty'] = true; 52 | return new static; 53 | } 54 | 55 | public static function include($include) 56 | { 57 | static::$args['include'] = $include; 58 | return new static; 59 | } 60 | 61 | public static function exclude($exclude) 62 | { 63 | static::$args['exclude'] = $exclude; 64 | return new static; 65 | } 66 | 67 | public static function get() 68 | { 69 | return \Timber::get_terms(array_merge(['taxonomy' => self::taxonomy_type()], static::$args)); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/models/Category.php: -------------------------------------------------------------------------------- 1 | wp_link = site_url(); 14 | $this->link = home_url(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/utils/Session.php: -------------------------------------------------------------------------------- 1 | query_vars['author'])) { 11 | $author = new TimberUser($wp_query->query_vars['author']); 12 | $context['author'] = $author; 13 | $context['title'] = 'Author Archives: ' . $author->name(); 14 | } 15 | Timber::render($templates, $context); 16 | -------------------------------------------------------------------------------- /build/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | /** 3 | * Define your assets path here. Assets path are your theme 4 | * path without host. 5 | * E.g. your theme path is http://test.dev/wp-content/themes/base-camp/ 6 | * then your assets path is /wp-content/themes/base-camp/ 7 | * 8 | * This is for Webpack that it can handle assets relative path right. 9 | */ 10 | assetsPath: '/wp-content/themes/base-camp/', 11 | 12 | /** 13 | * Define here your dev server url here. 14 | * 15 | * This is for Browsersync. 16 | */ 17 | devUrl: 'http://localhost:8080', 18 | 19 | /** 20 | * You can whitelist selectors to stop purgecss from removing them from your CSS 21 | * 22 | * whitelist: ['random', 'yep', 'button'] 23 | * In the example, the selectors .random, #yep, button will be left in the final CSS 24 | */ 25 | whitelist: [], 26 | }; 27 | -------------------------------------------------------------------------------- /build/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const path = require('path'); 3 | const glob = require('glob'); 4 | const VueLoaderPlugin = require('vue-loader/lib/plugin'); 5 | const CleanWebpackPlugin = require('clean-webpack-plugin'); 6 | const MiniCssExtractPlugin = require('mini-css-extract-plugin'); 7 | const PurgecssPlugin = require('purgecss-webpack-plugin'); 8 | const ManifestPlugin = require('webpack-manifest-plugin'); 9 | const BrowserSyncPlugin = require('browser-sync-webpack-plugin'); 10 | const FixStyleOnlyEntriesPlugin = require('webpack-fix-style-only-entries'); 11 | const config = require('./config'); 12 | 13 | const inProduction = process.env.NODE_ENV === 'production'; 14 | const styleHash = inProduction ? '.[contenthash]' : ''; 15 | const scriptHash = inProduction ? '.[chunkhash]' : ''; 16 | 17 | // LOADER HELPERS 18 | const extractCss = { 19 | loader: MiniCssExtractPlugin.loader, 20 | options: { 21 | publicPath: `${config.assetsPath}static/css/`, 22 | }, 23 | }; 24 | 25 | const cssLoader = { 26 | loader: 'css-loader', 27 | options: { 28 | importLoaders: 1, 29 | sourceMap: true, 30 | }, 31 | }; 32 | 33 | const images = [ 34 | { 35 | loader: 'file-loader', 36 | options: { 37 | name: '[name].[ext]', 38 | outputPath: 'images/', 39 | publicPath: `${config.assetsPath}static/images/`, 40 | }, 41 | }, 42 | ]; 43 | 44 | if (inProduction) { 45 | images.push('image-webpack-loader'); 46 | } 47 | 48 | module.exports = { 49 | entry: { 50 | scripts: './resources/assets/js/main.js', 51 | styles: './resources/assets/sass/main.sass', 52 | login: './resources/assets/sass/login.sass', 53 | admin: './resources/assets/sass/admin.sass', 54 | vendor: ['jquery', 'vue'], 55 | }, 56 | output: { 57 | path: path.resolve(__dirname, '../static/'), 58 | filename: `js/[name]${scriptHash}.js`, 59 | }, 60 | 61 | watchOptions: { 62 | ignored: /node_modules/, 63 | }, 64 | 65 | devtool: false, 66 | 67 | module: { 68 | rules: [ 69 | { 70 | test: /\.vue$/, 71 | loader: 'vue-loader', 72 | }, 73 | { 74 | test: /\.js$/, 75 | exclude: /node_modules/, 76 | loader: 'babel-loader', 77 | }, 78 | { 79 | test: /\.css$/, 80 | use: ['vue-style-loader', extractCss, cssLoader, 'postcss-loader'], 81 | }, 82 | { 83 | test: /\.scss$/, 84 | exclude: /node_modules/, 85 | use: [ 86 | 'vue-style-loader', 87 | extractCss, 88 | cssLoader, 89 | { 90 | loader: 'postcss-loader', 91 | options: { 92 | sourceMap: true, 93 | }, 94 | }, 95 | { 96 | loader: 'sass-loader', 97 | options: { 98 | includePaths: [ 99 | path.resolve(__dirname, '../resources/assets/sass'), 100 | ], 101 | data: '@import "shared-with-vue";', 102 | sourceMap: true, 103 | }, 104 | }, 105 | ], 106 | }, 107 | { 108 | test: /\.sass$/, 109 | exclude: /node_modules/, 110 | use: [ 111 | 'vue-style-loader', 112 | extractCss, 113 | cssLoader, 114 | { 115 | loader: 'postcss-loader', 116 | options: { 117 | sourceMap: true, 118 | }, 119 | }, 120 | { 121 | loader: 'sass-loader', 122 | options: { 123 | indentedSyntax: true, 124 | includePaths: [ 125 | path.resolve(__dirname, '../resources/assets/sass'), 126 | ], 127 | data: '@import "shared-with-vue";', 128 | sourceMap: true, 129 | }, 130 | }, 131 | ], 132 | }, 133 | { 134 | test: /\.(png|jpe?g|gif|svg)$/, 135 | use: images, 136 | }, 137 | { 138 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 139 | loader: 'url-loader', 140 | options: { 141 | limit: 10000, 142 | name: '[name].[hash:7].[ext]', 143 | outputPath: 'fonts/', 144 | publicPath: `${config.assetsPath}static/fonts/`, 145 | }, 146 | }, 147 | ], 148 | }, 149 | 150 | optimization: { 151 | splitChunks: { 152 | cacheGroups: { 153 | vendor: { 154 | chunks: 'all', 155 | name: 'vendor', 156 | test: 'vendor', 157 | enforce: true, 158 | }, 159 | }, 160 | }, 161 | }, 162 | 163 | resolve: { 164 | alias: { 165 | vue$: 'vue/dist/vue.esm.js', 166 | images: path.join(__dirname, '../resources/assets/images'), 167 | }, 168 | extensions: ['*', '.js', '.vue', '.json'], 169 | }, 170 | 171 | plugins: [ 172 | new VueLoaderPlugin(), 173 | 174 | new CleanWebpackPlugin(['static'], { 175 | root: path.join(__dirname, '../'), 176 | watch: false, 177 | }), 178 | 179 | new FixStyleOnlyEntriesPlugin({ extensions: ['less', 'scss', 'css', 'sass'] }), 180 | 181 | new MiniCssExtractPlugin({ 182 | filename: `css/[name]${styleHash}.css`, 183 | }), 184 | 185 | new ManifestPlugin(), 186 | 187 | 188 | new BrowserSyncPlugin({ 189 | host: 'localhost', 190 | port: 3000, 191 | proxy: config.devUrl, // YOUR DEV-SERVER URL 192 | files: ['./*.php', './resources/views/**/*.twig', './static/css/*.*', './static/js/*.*'], 193 | }, 194 | { 195 | reload: false, 196 | injectCss: true, 197 | }), 198 | ], 199 | }; 200 | 201 | if (!inProduction) { 202 | module.exports.plugins.push( 203 | new webpack.SourceMapDevToolPlugin({}), 204 | ); 205 | } 206 | 207 | if (inProduction) { 208 | module.exports.plugins.push( 209 | new PurgecssPlugin({ 210 | paths: () => glob.sync(path.join(__dirname, '../resources/**/*'), { nodir: true }), 211 | only: ['styles', 'scripts'], 212 | whitelist: config.whitelist, 213 | }), 214 | ); 215 | } 216 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "suomato/base-camp", 3 | "description": "Awesome WordPress starter theme with own CLI for developers based on modern web technologies.", 4 | "license": "MIT", 5 | "keywords": [ 6 | "bulma", 7 | "webpack", 8 | "timber", 9 | "starter-theme", 10 | "wordpress", 11 | "composer" 12 | ], 13 | "type": "wordpress-theme", 14 | "minimum-stability": "stable", 15 | "authors": [ 16 | { 17 | "name": "Toni Suomalainen", 18 | "email": "toni.suomalainen@gmail.com" 19 | } 20 | ], 21 | "repositories": [ 22 | { 23 | "type": "composer", 24 | "url": "https://wpackagist.org" 25 | } 26 | ], 27 | "extra": { 28 | "installer-paths": { 29 | "../../plugins/{$name}/": [ 30 | "wpackagist-plugin/*", 31 | "type:wordpress-plugin" 32 | ] 33 | } 34 | }, 35 | "require": { 36 | "php": "^7.0", 37 | "symfony/var-dumper": "^4.1", 38 | "symfony/console": "^4.1", 39 | "league/flysystem": "^1.0", 40 | "symfony/finder": "^4.1", 41 | "vlucas/phpdotenv": "^2.4", 42 | "suomato/luna": "^1.3", 43 | "timber/timber": "^1.7" 44 | }, 45 | "autoload": { 46 | "files": [ 47 | "app/helpers.php", 48 | "resources/languages/messages.php" 49 | ], 50 | "classmap": [ 51 | "app/timber-extends" 52 | ], 53 | "psr-4": { 54 | "Basecamp\\Models\\": "app/models/", 55 | "Basecamp\\Utils\\": "app/utils/" 56 | } 57 | }, 58 | "scripts": { 59 | "post-create-project-cmd": [ 60 | "php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 61 | ] 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "0969fe17a1399d04d121a8515528d9e9", 8 | "packages": [ 9 | { 10 | "name": "altorouter/altorouter", 11 | "version": "v1.1.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/dannyvankooten/AltoRouter.git", 15 | "reference": "09d9d946c546bae6d22a7654cdb3b825ffda54b4" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/dannyvankooten/AltoRouter/zipball/09d9d946c546bae6d22a7654cdb3b825ffda54b4", 20 | "reference": "09d9d946c546bae6d22a7654cdb3b825ffda54b4", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.3.0" 25 | }, 26 | "type": "library", 27 | "autoload": { 28 | "classmap": [ 29 | "AltoRouter.php" 30 | ] 31 | }, 32 | "notification-url": "https://packagist.org/downloads/", 33 | "license": [ 34 | "MIT" 35 | ], 36 | "authors": [ 37 | { 38 | "name": "Danny van Kooten", 39 | "email": "dannyvankooten@gmail.com", 40 | "homepage": "http://dannyvankooten.com/" 41 | }, 42 | { 43 | "name": "Koen Punt", 44 | "homepage": "https://github.com/koenpunt" 45 | }, 46 | { 47 | "name": "niahoo", 48 | "homepage": "https://github.com/niahoo" 49 | } 50 | ], 51 | "description": "A lightning fast router for PHP", 52 | "homepage": "https://github.com/dannyvankooten/AltoRouter", 53 | "keywords": [ 54 | "lightweight", 55 | "router", 56 | "routing" 57 | ], 58 | "time": "2014-04-16T09:44:40+00:00" 59 | }, 60 | { 61 | "name": "asm89/twig-cache-extension", 62 | "version": "1.3.2", 63 | "source": { 64 | "type": "git", 65 | "url": "https://github.com/asm89/twig-cache-extension.git", 66 | "reference": "630ea7abdc3fc62ba6786c02590a1560e449cf55" 67 | }, 68 | "dist": { 69 | "type": "zip", 70 | "url": "https://api.github.com/repos/asm89/twig-cache-extension/zipball/630ea7abdc3fc62ba6786c02590a1560e449cf55", 71 | "reference": "630ea7abdc3fc62ba6786c02590a1560e449cf55", 72 | "shasum": "" 73 | }, 74 | "require": { 75 | "php": ">=5.3.2", 76 | "twig/twig": "^1.0|^2.0" 77 | }, 78 | "require-dev": { 79 | "doctrine/cache": "~1.0" 80 | }, 81 | "suggest": { 82 | "psr/cache-implementation": "To make use of PSR-6 cache implementation via PsrCacheAdapter." 83 | }, 84 | "type": "library", 85 | "extra": { 86 | "branch-alias": { 87 | "dev-master": "1.3-dev" 88 | } 89 | }, 90 | "autoload": { 91 | "psr-4": { 92 | "": "lib/" 93 | } 94 | }, 95 | "notification-url": "https://packagist.org/downloads/", 96 | "license": [ 97 | "MIT" 98 | ], 99 | "authors": [ 100 | { 101 | "name": "Alexander", 102 | "email": "iam.asm89@gmail.com" 103 | } 104 | ], 105 | "description": "Cache fragments of templates directly within Twig.", 106 | "homepage": "https://github.com/asm89/twig-cache-extension", 107 | "keywords": [ 108 | "cache", 109 | "extension", 110 | "twig" 111 | ], 112 | "time": "2017-01-10T22:04:15+00:00" 113 | }, 114 | { 115 | "name": "composer/installers", 116 | "version": "v1.6.0", 117 | "source": { 118 | "type": "git", 119 | "url": "https://github.com/composer/installers.git", 120 | "reference": "cfcca6b1b60bc4974324efb5783c13dca6932b5b" 121 | }, 122 | "dist": { 123 | "type": "zip", 124 | "url": "https://api.github.com/repos/composer/installers/zipball/cfcca6b1b60bc4974324efb5783c13dca6932b5b", 125 | "reference": "cfcca6b1b60bc4974324efb5783c13dca6932b5b", 126 | "shasum": "" 127 | }, 128 | "require": { 129 | "composer-plugin-api": "^1.0" 130 | }, 131 | "replace": { 132 | "roundcube/plugin-installer": "*", 133 | "shama/baton": "*" 134 | }, 135 | "require-dev": { 136 | "composer/composer": "1.0.*@dev", 137 | "phpunit/phpunit": "^4.8.36" 138 | }, 139 | "type": "composer-plugin", 140 | "extra": { 141 | "class": "Composer\\Installers\\Plugin", 142 | "branch-alias": { 143 | "dev-master": "1.0-dev" 144 | } 145 | }, 146 | "autoload": { 147 | "psr-4": { 148 | "Composer\\Installers\\": "src/Composer/Installers" 149 | } 150 | }, 151 | "notification-url": "https://packagist.org/downloads/", 152 | "license": [ 153 | "MIT" 154 | ], 155 | "authors": [ 156 | { 157 | "name": "Kyle Robinson Young", 158 | "email": "kyle@dontkry.com", 159 | "homepage": "https://github.com/shama" 160 | } 161 | ], 162 | "description": "A multi-framework Composer library installer", 163 | "homepage": "https://composer.github.io/installers/", 164 | "keywords": [ 165 | "Craft", 166 | "Dolibarr", 167 | "Eliasis", 168 | "Hurad", 169 | "ImageCMS", 170 | "Kanboard", 171 | "Lan Management System", 172 | "MODX Evo", 173 | "Mautic", 174 | "Maya", 175 | "OXID", 176 | "Plentymarkets", 177 | "Porto", 178 | "RadPHP", 179 | "SMF", 180 | "Thelia", 181 | "WolfCMS", 182 | "agl", 183 | "aimeos", 184 | "annotatecms", 185 | "attogram", 186 | "bitrix", 187 | "cakephp", 188 | "chef", 189 | "cockpit", 190 | "codeigniter", 191 | "concrete5", 192 | "croogo", 193 | "dokuwiki", 194 | "drupal", 195 | "eZ Platform", 196 | "elgg", 197 | "expressionengine", 198 | "fuelphp", 199 | "grav", 200 | "installer", 201 | "itop", 202 | "joomla", 203 | "kohana", 204 | "laravel", 205 | "lavalite", 206 | "lithium", 207 | "magento", 208 | "majima", 209 | "mako", 210 | "mediawiki", 211 | "modulework", 212 | "modx", 213 | "moodle", 214 | "osclass", 215 | "phpbb", 216 | "piwik", 217 | "ppi", 218 | "puppet", 219 | "pxcms", 220 | "reindex", 221 | "roundcube", 222 | "shopware", 223 | "silverstripe", 224 | "sydes", 225 | "symfony", 226 | "typo3", 227 | "wordpress", 228 | "yawik", 229 | "zend", 230 | "zikula" 231 | ], 232 | "time": "2018-08-27T06:10:37+00:00" 233 | }, 234 | { 235 | "name": "league/flysystem", 236 | "version": "1.0.48", 237 | "source": { 238 | "type": "git", 239 | "url": "https://github.com/thephpleague/flysystem.git", 240 | "reference": "a6ded5b2f6055e2db97b4b859fdfca2b952b78aa" 241 | }, 242 | "dist": { 243 | "type": "zip", 244 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a6ded5b2f6055e2db97b4b859fdfca2b952b78aa", 245 | "reference": "a6ded5b2f6055e2db97b4b859fdfca2b952b78aa", 246 | "shasum": "" 247 | }, 248 | "require": { 249 | "ext-fileinfo": "*", 250 | "php": ">=5.5.9" 251 | }, 252 | "conflict": { 253 | "league/flysystem-sftp": "<1.0.6" 254 | }, 255 | "require-dev": { 256 | "phpspec/phpspec": "^3.4", 257 | "phpunit/phpunit": "^5.7.10" 258 | }, 259 | "suggest": { 260 | "ext-fileinfo": "Required for MimeType", 261 | "ext-ftp": "Allows you to use FTP server storage", 262 | "ext-openssl": "Allows you to use FTPS server storage", 263 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 264 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 265 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 266 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 267 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 268 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 269 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 270 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 271 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", 272 | "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", 273 | "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" 274 | }, 275 | "type": "library", 276 | "extra": { 277 | "branch-alias": { 278 | "dev-master": "1.1-dev" 279 | } 280 | }, 281 | "autoload": { 282 | "psr-4": { 283 | "League\\Flysystem\\": "src/" 284 | } 285 | }, 286 | "notification-url": "https://packagist.org/downloads/", 287 | "license": [ 288 | "MIT" 289 | ], 290 | "authors": [ 291 | { 292 | "name": "Frank de Jonge", 293 | "email": "info@frenky.net" 294 | } 295 | ], 296 | "description": "Filesystem abstraction: Many filesystems, one API.", 297 | "keywords": [ 298 | "Cloud Files", 299 | "WebDAV", 300 | "abstraction", 301 | "aws", 302 | "cloud", 303 | "copy.com", 304 | "dropbox", 305 | "file systems", 306 | "files", 307 | "filesystem", 308 | "filesystems", 309 | "ftp", 310 | "rackspace", 311 | "remote", 312 | "s3", 313 | "sftp", 314 | "storage" 315 | ], 316 | "time": "2018-10-15T13:53:10+00:00" 317 | }, 318 | { 319 | "name": "suomato/luna", 320 | "version": "v1.3.0", 321 | "source": { 322 | "type": "git", 323 | "url": "https://github.com/suomato/luna.git", 324 | "reference": "fbf0d1307a9fef383c00e9113d534f3b7f9bac4a" 325 | }, 326 | "dist": { 327 | "type": "zip", 328 | "url": "https://api.github.com/repos/suomato/luna/zipball/fbf0d1307a9fef383c00e9113d534f3b7f9bac4a", 329 | "reference": "fbf0d1307a9fef383c00e9113d534f3b7f9bac4a", 330 | "shasum": "" 331 | }, 332 | "require": { 333 | "league/flysystem": "^1.0", 334 | "php": "^7.0", 335 | "symfony/console": "^4.1" 336 | }, 337 | "type": "library", 338 | "autoload": { 339 | "files": [ 340 | "src/helpers.php" 341 | ], 342 | "psr-4": { 343 | "Suomato\\": "src/" 344 | } 345 | }, 346 | "notification-url": "https://packagist.org/downloads/", 347 | "license": [ 348 | "MIT" 349 | ], 350 | "authors": [ 351 | { 352 | "name": "Toni Suomalainen", 353 | "email": "toni.suomalainen@gmail.com" 354 | } 355 | ], 356 | "description": "Command-line interface for Base Camp theme", 357 | "time": "2018-07-27T11:09:37+00:00" 358 | }, 359 | { 360 | "name": "symfony/console", 361 | "version": "v4.1.7", 362 | "source": { 363 | "type": "git", 364 | "url": "https://github.com/symfony/console.git", 365 | "reference": "432122af37d8cd52fba1b294b11976e0d20df595" 366 | }, 367 | "dist": { 368 | "type": "zip", 369 | "url": "https://api.github.com/repos/symfony/console/zipball/432122af37d8cd52fba1b294b11976e0d20df595", 370 | "reference": "432122af37d8cd52fba1b294b11976e0d20df595", 371 | "shasum": "" 372 | }, 373 | "require": { 374 | "php": "^7.1.3", 375 | "symfony/polyfill-mbstring": "~1.0" 376 | }, 377 | "conflict": { 378 | "symfony/dependency-injection": "<3.4", 379 | "symfony/process": "<3.3" 380 | }, 381 | "require-dev": { 382 | "psr/log": "~1.0", 383 | "symfony/config": "~3.4|~4.0", 384 | "symfony/dependency-injection": "~3.4|~4.0", 385 | "symfony/event-dispatcher": "~3.4|~4.0", 386 | "symfony/lock": "~3.4|~4.0", 387 | "symfony/process": "~3.4|~4.0" 388 | }, 389 | "suggest": { 390 | "psr/log-implementation": "For using the console logger", 391 | "symfony/event-dispatcher": "", 392 | "symfony/lock": "", 393 | "symfony/process": "" 394 | }, 395 | "type": "library", 396 | "extra": { 397 | "branch-alias": { 398 | "dev-master": "4.1-dev" 399 | } 400 | }, 401 | "autoload": { 402 | "psr-4": { 403 | "Symfony\\Component\\Console\\": "" 404 | }, 405 | "exclude-from-classmap": [ 406 | "/Tests/" 407 | ] 408 | }, 409 | "notification-url": "https://packagist.org/downloads/", 410 | "license": [ 411 | "MIT" 412 | ], 413 | "authors": [ 414 | { 415 | "name": "Fabien Potencier", 416 | "email": "fabien@symfony.com" 417 | }, 418 | { 419 | "name": "Symfony Community", 420 | "homepage": "https://symfony.com/contributors" 421 | } 422 | ], 423 | "description": "Symfony Console Component", 424 | "homepage": "https://symfony.com", 425 | "time": "2018-10-31T09:30:44+00:00" 426 | }, 427 | { 428 | "name": "symfony/finder", 429 | "version": "v4.1.7", 430 | "source": { 431 | "type": "git", 432 | "url": "https://github.com/symfony/finder.git", 433 | "reference": "1f17195b44543017a9c9b2d437c670627e96ad06" 434 | }, 435 | "dist": { 436 | "type": "zip", 437 | "url": "https://api.github.com/repos/symfony/finder/zipball/1f17195b44543017a9c9b2d437c670627e96ad06", 438 | "reference": "1f17195b44543017a9c9b2d437c670627e96ad06", 439 | "shasum": "" 440 | }, 441 | "require": { 442 | "php": "^7.1.3" 443 | }, 444 | "type": "library", 445 | "extra": { 446 | "branch-alias": { 447 | "dev-master": "4.1-dev" 448 | } 449 | }, 450 | "autoload": { 451 | "psr-4": { 452 | "Symfony\\Component\\Finder\\": "" 453 | }, 454 | "exclude-from-classmap": [ 455 | "/Tests/" 456 | ] 457 | }, 458 | "notification-url": "https://packagist.org/downloads/", 459 | "license": [ 460 | "MIT" 461 | ], 462 | "authors": [ 463 | { 464 | "name": "Fabien Potencier", 465 | "email": "fabien@symfony.com" 466 | }, 467 | { 468 | "name": "Symfony Community", 469 | "homepage": "https://symfony.com/contributors" 470 | } 471 | ], 472 | "description": "Symfony Finder Component", 473 | "homepage": "https://symfony.com", 474 | "time": "2018-10-03T08:47:56+00:00" 475 | }, 476 | { 477 | "name": "symfony/polyfill-ctype", 478 | "version": "v1.10.0", 479 | "source": { 480 | "type": "git", 481 | "url": "https://github.com/symfony/polyfill-ctype.git", 482 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" 483 | }, 484 | "dist": { 485 | "type": "zip", 486 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", 487 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", 488 | "shasum": "" 489 | }, 490 | "require": { 491 | "php": ">=5.3.3" 492 | }, 493 | "suggest": { 494 | "ext-ctype": "For best performance" 495 | }, 496 | "type": "library", 497 | "extra": { 498 | "branch-alias": { 499 | "dev-master": "1.9-dev" 500 | } 501 | }, 502 | "autoload": { 503 | "psr-4": { 504 | "Symfony\\Polyfill\\Ctype\\": "" 505 | }, 506 | "files": [ 507 | "bootstrap.php" 508 | ] 509 | }, 510 | "notification-url": "https://packagist.org/downloads/", 511 | "license": [ 512 | "MIT" 513 | ], 514 | "authors": [ 515 | { 516 | "name": "Symfony Community", 517 | "homepage": "https://symfony.com/contributors" 518 | }, 519 | { 520 | "name": "Gert de Pagter", 521 | "email": "BackEndTea@gmail.com" 522 | } 523 | ], 524 | "description": "Symfony polyfill for ctype functions", 525 | "homepage": "https://symfony.com", 526 | "keywords": [ 527 | "compatibility", 528 | "ctype", 529 | "polyfill", 530 | "portable" 531 | ], 532 | "time": "2018-08-06T14:22:27+00:00" 533 | }, 534 | { 535 | "name": "symfony/polyfill-mbstring", 536 | "version": "v1.10.0", 537 | "source": { 538 | "type": "git", 539 | "url": "https://github.com/symfony/polyfill-mbstring.git", 540 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" 541 | }, 542 | "dist": { 543 | "type": "zip", 544 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", 545 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", 546 | "shasum": "" 547 | }, 548 | "require": { 549 | "php": ">=5.3.3" 550 | }, 551 | "suggest": { 552 | "ext-mbstring": "For best performance" 553 | }, 554 | "type": "library", 555 | "extra": { 556 | "branch-alias": { 557 | "dev-master": "1.9-dev" 558 | } 559 | }, 560 | "autoload": { 561 | "psr-4": { 562 | "Symfony\\Polyfill\\Mbstring\\": "" 563 | }, 564 | "files": [ 565 | "bootstrap.php" 566 | ] 567 | }, 568 | "notification-url": "https://packagist.org/downloads/", 569 | "license": [ 570 | "MIT" 571 | ], 572 | "authors": [ 573 | { 574 | "name": "Nicolas Grekas", 575 | "email": "p@tchwork.com" 576 | }, 577 | { 578 | "name": "Symfony Community", 579 | "homepage": "https://symfony.com/contributors" 580 | } 581 | ], 582 | "description": "Symfony polyfill for the Mbstring extension", 583 | "homepage": "https://symfony.com", 584 | "keywords": [ 585 | "compatibility", 586 | "mbstring", 587 | "polyfill", 588 | "portable", 589 | "shim" 590 | ], 591 | "time": "2018-09-21T13:07:52+00:00" 592 | }, 593 | { 594 | "name": "symfony/polyfill-php72", 595 | "version": "v1.10.0", 596 | "source": { 597 | "type": "git", 598 | "url": "https://github.com/symfony/polyfill-php72.git", 599 | "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631" 600 | }, 601 | "dist": { 602 | "type": "zip", 603 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", 604 | "reference": "9050816e2ca34a8e916c3a0ae8b9c2fccf68b631", 605 | "shasum": "" 606 | }, 607 | "require": { 608 | "php": ">=5.3.3" 609 | }, 610 | "type": "library", 611 | "extra": { 612 | "branch-alias": { 613 | "dev-master": "1.9-dev" 614 | } 615 | }, 616 | "autoload": { 617 | "psr-4": { 618 | "Symfony\\Polyfill\\Php72\\": "" 619 | }, 620 | "files": [ 621 | "bootstrap.php" 622 | ] 623 | }, 624 | "notification-url": "https://packagist.org/downloads/", 625 | "license": [ 626 | "MIT" 627 | ], 628 | "authors": [ 629 | { 630 | "name": "Nicolas Grekas", 631 | "email": "p@tchwork.com" 632 | }, 633 | { 634 | "name": "Symfony Community", 635 | "homepage": "https://symfony.com/contributors" 636 | } 637 | ], 638 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 639 | "homepage": "https://symfony.com", 640 | "keywords": [ 641 | "compatibility", 642 | "polyfill", 643 | "portable", 644 | "shim" 645 | ], 646 | "time": "2018-09-21T13:07:52+00:00" 647 | }, 648 | { 649 | "name": "symfony/var-dumper", 650 | "version": "v4.1.7", 651 | "source": { 652 | "type": "git", 653 | "url": "https://github.com/symfony/var-dumper.git", 654 | "reference": "60319b45653580b0cdacca499344577d87732f16" 655 | }, 656 | "dist": { 657 | "type": "zip", 658 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/60319b45653580b0cdacca499344577d87732f16", 659 | "reference": "60319b45653580b0cdacca499344577d87732f16", 660 | "shasum": "" 661 | }, 662 | "require": { 663 | "php": "^7.1.3", 664 | "symfony/polyfill-mbstring": "~1.0", 665 | "symfony/polyfill-php72": "~1.5" 666 | }, 667 | "conflict": { 668 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 669 | "symfony/console": "<3.4" 670 | }, 671 | "require-dev": { 672 | "ext-iconv": "*", 673 | "symfony/process": "~3.4|~4.0", 674 | "twig/twig": "~1.34|~2.4" 675 | }, 676 | "suggest": { 677 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", 678 | "ext-intl": "To show region name in time zone dump", 679 | "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" 680 | }, 681 | "bin": [ 682 | "Resources/bin/var-dump-server" 683 | ], 684 | "type": "library", 685 | "extra": { 686 | "branch-alias": { 687 | "dev-master": "4.1-dev" 688 | } 689 | }, 690 | "autoload": { 691 | "files": [ 692 | "Resources/functions/dump.php" 693 | ], 694 | "psr-4": { 695 | "Symfony\\Component\\VarDumper\\": "" 696 | }, 697 | "exclude-from-classmap": [ 698 | "/Tests/" 699 | ] 700 | }, 701 | "notification-url": "https://packagist.org/downloads/", 702 | "license": [ 703 | "MIT" 704 | ], 705 | "authors": [ 706 | { 707 | "name": "Nicolas Grekas", 708 | "email": "p@tchwork.com" 709 | }, 710 | { 711 | "name": "Symfony Community", 712 | "homepage": "https://symfony.com/contributors" 713 | } 714 | ], 715 | "description": "Symfony mechanism for exploring and dumping PHP variables", 716 | "homepage": "https://symfony.com", 717 | "keywords": [ 718 | "debug", 719 | "dump" 720 | ], 721 | "time": "2018-10-02T16:36:10+00:00" 722 | }, 723 | { 724 | "name": "timber/timber", 725 | "version": "1.8.1", 726 | "source": { 727 | "type": "git", 728 | "url": "https://github.com/timber/timber.git", 729 | "reference": "51314124b9608de85dc0400c9a2c71caf336eb6c" 730 | }, 731 | "dist": { 732 | "type": "zip", 733 | "url": "https://api.github.com/repos/timber/timber/zipball/51314124b9608de85dc0400c9a2c71caf336eb6c", 734 | "reference": "51314124b9608de85dc0400c9a2c71caf336eb6c", 735 | "shasum": "" 736 | }, 737 | "require": { 738 | "asm89/twig-cache-extension": "~1.0", 739 | "composer/installers": "~1.0", 740 | "php": ">=5.3.0|7.*", 741 | "twig/twig": "1.34.*|2.*", 742 | "upstatement/routes": "0.4" 743 | }, 744 | "require-dev": { 745 | "johnpbloch/wordpress": "4.*", 746 | "phpunit/phpunit": "5.7.16|6.*", 747 | "wpackagist-plugin/advanced-custom-fields": "5.*", 748 | "wpackagist-plugin/co-authors-plus": "3.2.*" 749 | }, 750 | "suggest": { 751 | "satooshi/php-coveralls": "1.0.* for code coverage" 752 | }, 753 | "type": "library", 754 | "autoload": { 755 | "psr-4": { 756 | "Timber\\": "lib/" 757 | } 758 | }, 759 | "notification-url": "https://packagist.org/downloads/", 760 | "license": [ 761 | "MIT" 762 | ], 763 | "authors": [ 764 | { 765 | "name": "Jared Novack", 766 | "email": "jared@upstatement.com", 767 | "homepage": "http://upstatement.com" 768 | }, 769 | { 770 | "name": "Connor J. Burton", 771 | "email": "connorjburton@gmail.com", 772 | "homepage": "http://connorburton.com" 773 | } 774 | ], 775 | "description": "Plugin to write WordPress themes w Object-Oriented Code and the Twig Template Engine", 776 | "homepage": "http://timber.upstatement.com", 777 | "keywords": [ 778 | "templating", 779 | "themes", 780 | "timber", 781 | "twig" 782 | ], 783 | "time": "2018-09-30T14:50:29+00:00" 784 | }, 785 | { 786 | "name": "twig/twig", 787 | "version": "v2.5.0", 788 | "source": { 789 | "type": "git", 790 | "url": "https://github.com/twigphp/Twig.git", 791 | "reference": "6a5f676b77a90823c2d4eaf76137b771adf31323" 792 | }, 793 | "dist": { 794 | "type": "zip", 795 | "url": "https://api.github.com/repos/twigphp/Twig/zipball/6a5f676b77a90823c2d4eaf76137b771adf31323", 796 | "reference": "6a5f676b77a90823c2d4eaf76137b771adf31323", 797 | "shasum": "" 798 | }, 799 | "require": { 800 | "php": "^7.0", 801 | "symfony/polyfill-ctype": "^1.8", 802 | "symfony/polyfill-mbstring": "~1.0" 803 | }, 804 | "require-dev": { 805 | "psr/container": "^1.0", 806 | "symfony/debug": "^2.7", 807 | "symfony/phpunit-bridge": "^3.3" 808 | }, 809 | "type": "library", 810 | "extra": { 811 | "branch-alias": { 812 | "dev-master": "2.5-dev" 813 | } 814 | }, 815 | "autoload": { 816 | "psr-0": { 817 | "Twig_": "lib/" 818 | }, 819 | "psr-4": { 820 | "Twig\\": "src/" 821 | } 822 | }, 823 | "notification-url": "https://packagist.org/downloads/", 824 | "license": [ 825 | "BSD-3-Clause" 826 | ], 827 | "authors": [ 828 | { 829 | "name": "Fabien Potencier", 830 | "email": "fabien@symfony.com", 831 | "homepage": "http://fabien.potencier.org", 832 | "role": "Lead Developer" 833 | }, 834 | { 835 | "name": "Armin Ronacher", 836 | "email": "armin.ronacher@active-4.com", 837 | "role": "Project Founder" 838 | }, 839 | { 840 | "name": "Twig Team", 841 | "homepage": "https://twig.symfony.com/contributors", 842 | "role": "Contributors" 843 | } 844 | ], 845 | "description": "Twig, the flexible, fast, and secure template language for PHP", 846 | "homepage": "https://twig.symfony.com", 847 | "keywords": [ 848 | "templating" 849 | ], 850 | "time": "2018-07-13T07:18:09+00:00" 851 | }, 852 | { 853 | "name": "upstatement/routes", 854 | "version": "0.4", 855 | "source": { 856 | "type": "git", 857 | "url": "https://github.com/Upstatement/routes.git", 858 | "reference": "fae7d46f56e8b5775f072774941a5f0a25cb86f3" 859 | }, 860 | "dist": { 861 | "type": "zip", 862 | "url": "https://api.github.com/repos/Upstatement/routes/zipball/fae7d46f56e8b5775f072774941a5f0a25cb86f3", 863 | "reference": "fae7d46f56e8b5775f072774941a5f0a25cb86f3", 864 | "shasum": "" 865 | }, 866 | "require": { 867 | "altorouter/altorouter": "1.1.0", 868 | "composer/installers": "~1.0", 869 | "php": ">=5.3.0" 870 | }, 871 | "require-dev": { 872 | "phpunit/phpunit": "3.7.*", 873 | "satooshi/php-coveralls": "dev-master", 874 | "wp-cli/wp-cli": "*" 875 | }, 876 | "type": "library", 877 | "autoload": { 878 | "psr-0": { 879 | "Routes": "" 880 | } 881 | }, 882 | "notification-url": "https://packagist.org/downloads/", 883 | "license": [ 884 | "MIT" 885 | ], 886 | "authors": [ 887 | { 888 | "name": "Jared Novack", 889 | "email": "jared@upstatement.com", 890 | "homepage": "http://upstatement.com" 891 | } 892 | ], 893 | "description": "Manage rewrites and routes in WordPress with this dead-simple plugin", 894 | "homepage": "http://routes.upstatement.com", 895 | "keywords": [ 896 | "redirects", 897 | "rewrite", 898 | "routes", 899 | "routing" 900 | ], 901 | "time": "2016-07-06T12:53:24+00:00" 902 | }, 903 | { 904 | "name": "vlucas/phpdotenv", 905 | "version": "v2.5.1", 906 | "source": { 907 | "type": "git", 908 | "url": "https://github.com/vlucas/phpdotenv.git", 909 | "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e" 910 | }, 911 | "dist": { 912 | "type": "zip", 913 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", 914 | "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", 915 | "shasum": "" 916 | }, 917 | "require": { 918 | "php": ">=5.3.9" 919 | }, 920 | "require-dev": { 921 | "phpunit/phpunit": "^4.8.35 || ^5.0" 922 | }, 923 | "type": "library", 924 | "extra": { 925 | "branch-alias": { 926 | "dev-master": "2.5-dev" 927 | } 928 | }, 929 | "autoload": { 930 | "psr-4": { 931 | "Dotenv\\": "src/" 932 | } 933 | }, 934 | "notification-url": "https://packagist.org/downloads/", 935 | "license": [ 936 | "BSD-3-Clause" 937 | ], 938 | "authors": [ 939 | { 940 | "name": "Vance Lucas", 941 | "email": "vance@vancelucas.com", 942 | "homepage": "http://www.vancelucas.com" 943 | } 944 | ], 945 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 946 | "keywords": [ 947 | "dotenv", 948 | "env", 949 | "environment" 950 | ], 951 | "time": "2018-07-29T20:33:41+00:00" 952 | } 953 | ], 954 | "packages-dev": [], 955 | "aliases": [], 956 | "minimum-stability": "stable", 957 | "stability-flags": [], 958 | "prefer-stable": false, 959 | "prefer-lowest": false, 960 | "platform": { 961 | "php": "^7.0" 962 | }, 963 | "platform-dev": [] 964 | } 965 | -------------------------------------------------------------------------------- /functions.php: -------------------------------------------------------------------------------- 1 | addCommands(Luna::commands()); 12 | 13 | $app->run(); 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "base-camp", 3 | "version": "1.9.0", 4 | "description": "Awesome WordPress starter theme with own CLI for developers based on modern web technologies.", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "cross-env webpack --config build/webpack.config.js --progress --hide-modules --mode development", 8 | "watch": "npm run dev -- --watch", 9 | "prod": "cross-env NODE_ENV=production webpack --config build/webpack.config.js --progress --hide-modules --mode production" 10 | }, 11 | "keywords": [], 12 | "author": "Toni Suomalainen", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@babel/core": "^7.1.6", 16 | "@babel/polyfill": "^7.0.0", 17 | "@babel/preset-env": "^7.1.6", 18 | "autoprefixer": "^9.3.1", 19 | "babel-eslint": "^10.0.1", 20 | "babel-loader": "^8.0.4", 21 | "browser-sync": "^2.24.5", 22 | "browser-sync-webpack-plugin": "^2.2.2", 23 | "clean-webpack-plugin": "^1.0.0", 24 | "cross-env": "^5.2.0", 25 | "css-loader": "^1.0.1", 26 | "cssnano": "^4.1.7", 27 | "eslint": "^5.0.1", 28 | "eslint-config-airbnb-base": "^13.1.0", 29 | "eslint-plugin-import": "^2.13.0", 30 | "eslint-plugin-jsx-a11y": "^6.0.3", 31 | "eslint-plugin-vue": "^4.5.0", 32 | "file-loader": "^2.0.0", 33 | "font-awesome": "^4.7.0", 34 | "hard-source-webpack-plugin": "^0.12.0", 35 | "image-webpack-loader": "^4.3.1", 36 | "mini-css-extract-plugin": "^0.4.5", 37 | "node-sass": "^4.10.0", 38 | "postcss-loader": "^3.0.0", 39 | "prettier-eslint": "^8.2.2", 40 | "purgecss-webpack-plugin": "^1.2.0", 41 | "sass-loader": "^7.0.3", 42 | "style-loader": "^0.23.1", 43 | "url-loader": "^1.0.1", 44 | "vue-loader": "^15.2.4", 45 | "vue-template-compiler": "^2.5.16", 46 | "webpack": "^4.14.0", 47 | "webpack-cli": "^3.0.8", 48 | "webpack-fix-style-only-entries": "^0.0.5", 49 | "webpack-manifest-plugin": "^2.0.3" 50 | }, 51 | "dependencies": { 52 | "bulma": "0.7.2", 53 | "jquery": "^3.3.1", 54 | "vue": "^2.5.16" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /page.php: -------------------------------------------------------------------------------- 1 | post_name . '.twig', 'page.twig'], $context); 8 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = ({ env }) => ({ 2 | plugins: { 3 | autoprefixer: {}, 4 | cssnano: env === 'production' ? {} : false, 5 | }, 6 | }); 7 | -------------------------------------------------------------------------------- /resources/assets/images/base-camp-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suomato/base-camp/f9ecc2c03dc906dbf796f2d935e649fc7485052d/resources/assets/images/base-camp-logo.png -------------------------------------------------------------------------------- /resources/assets/images/base-camp-logo_alt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suomato/base-camp/f9ecc2c03dc906dbf796f2d935e649fc7485052d/resources/assets/images/base-camp-logo_alt.png -------------------------------------------------------------------------------- /resources/assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suomato/base-camp/f9ecc2c03dc906dbf796f2d935e649fc7485052d/resources/assets/images/favicon.png -------------------------------------------------------------------------------- /resources/assets/js/components/Example.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | 36 | -------------------------------------------------------------------------------- /resources/assets/js/main.js: -------------------------------------------------------------------------------- 1 | import $ from 'jquery'; 2 | import Vue from 'vue'; 3 | // import Example from './components/Example'; 4 | 5 | new Vue({ 6 | el: '#app', 7 | components: { 8 | // Example, 9 | }, 10 | }); 11 | 12 | // Hide Page Loader when DOM and images are ready 13 | $(window).on('load', () => $('.pageloader').removeClass('is-active')); 14 | 15 | // Toggle mobile menu 16 | $('.navbar-burger').on('click', () => $('.navbar-burger, .navbar-menu').toggleClass('is-active')); 17 | -------------------------------------------------------------------------------- /resources/assets/sass/_common.sass: -------------------------------------------------------------------------------- 1 | .logo 2 | width: 120px 3 | height: auto 4 | max-height: none !important 5 | 6 | .current-template-file-name 7 | position: fixed 8 | bottom: 0 9 | right: 0 10 | background-color: #1C1E26 11 | color: #e3b28e 12 | padding: 0.2rem 2rem 13 | z-index: 10000 14 | border-radius: 0.5rem 0 0 0 15 | -------------------------------------------------------------------------------- /resources/assets/sass/_footer.sass: -------------------------------------------------------------------------------- 1 | footer.footer 2 | a 3 | color: $dark-primary 4 | &:hover 5 | color: $dark 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /resources/assets/sass/_helpers.sass: -------------------------------------------------------------------------------- 1 | .required 2 | color: $red 3 | 4 | .timestamp 5 | color: #7a7a7a 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /resources/assets/sass/_pageloader.sass: -------------------------------------------------------------------------------- 1 | .pageloader 2 | position: fixed 3 | top: 0 4 | right: 0 5 | bottom: 0 6 | left: 0 7 | background-color: $primary 8 | z-index: 999998 9 | transition: -webkit-transform .70s ease-out 10 | transition: transform .70s ease-out 11 | transition: transform .70s ease-out,-webkit-transform .70s ease-out 12 | -webkit-transform: translateY(-200%) 13 | transform: translateY(-200%) 14 | will-change: transform 15 | &.is-active 16 | -webkit-transform: translateY(0) 17 | transform: translateY(0) 18 | &::after, &::before 19 | position: absolute 20 | top: 50% 21 | left: 50% 22 | display: block 23 | border-radius: 100% 24 | content: '' 25 | z-index: 999999 26 | &::after 27 | margin-top: -100px 28 | margin-left: -100px 29 | width: 200px 30 | height: 200px 31 | background-color: rgba(255, 255, 255, 0.5) 32 | border: 3px solid rgba(255, 255, 255, 0.75) 33 | -webkit-animation: page-loader-inner 1.5s infinite ease-out 34 | animation: page-loader-inner 1.5s infinite ease-out 35 | &::before 36 | margin-top: -30px 37 | margin-left: -30px 38 | width: 60px 39 | height: 60px 40 | background-color: #fff 41 | -webkit-animation: page-loader-outer 1.5s infinite ease-in 42 | animation: page-loader-outer 1.5s infinite ease-in 43 | 44 | @-webkit-keyframes page-loader-inner 45 | 0%,40% 46 | -webkit-transform: scale(0) 47 | transform: scale(0) 48 | 49 | 100% 50 | -webkit-transform: scale(1) 51 | transform: scale(1) 52 | opacity: 0 53 | 54 | 55 | @keyframes page-loader-inner 56 | 0%,40% 57 | -webkit-transform: scale(0) 58 | transform: scale(0) 59 | 60 | 100% 61 | -webkit-transform: scale(1) 62 | transform: scale(1) 63 | opacity: 0 64 | 65 | 66 | @-webkit-keyframes page-loader-outer 67 | 0% 68 | -webkit-transform: scale(1) 69 | transform: scale(1) 70 | 71 | 100%,40% 72 | -webkit-transform: scale(0) 73 | transform: scale(0) 74 | opacity: 0 75 | 76 | 77 | @keyframes page-loader-outer 78 | 0% 79 | -webkit-transform: scale(1) 80 | transform: scale(1) 81 | 82 | 100%,40% 83 | -webkit-transform: scale(0) 84 | transform: scale(0) 85 | opacity: 0 86 | -------------------------------------------------------------------------------- /resources/assets/sass/_single.sass: -------------------------------------------------------------------------------- 1 | .single 2 | .main-article 3 | position: relative 4 | 5 | .edit-post-link 6 | margin-top: -1rem 7 | margin-bottom: 1.5rem 8 | i 9 | vertical-align: middle 10 | font-size: 1rem 11 | a 12 | color: $dark-primary 13 | -------------------------------------------------------------------------------- /resources/assets/sass/_variables.sass: -------------------------------------------------------------------------------- 1 | // COLORS 2 | $bc-primary: #26a69a 3 | $bc-dark-primary: #00695C 4 | $bc-secondary: #EF5350 5 | 6 | // BULMA OVERDRIVE 7 | $primary: $bc-primary 8 | $dark-primary: $bc-dark-primary 9 | $link: $bc-secondary 10 | $link-focus-border: $bc-secondary 11 | $red: $bc-secondary 12 | 13 | // SOCIAL MEDIA COLORS 14 | $tumblr: #2C394C 15 | $facebook: #3B5999 16 | $linkedin: #0077B5 17 | $twitter: #1DA1F3 18 | $pinterest: #CB2026 19 | $google-plus: #DD4C3B 20 | $reddit: #FF4501 21 | 22 | // HELPER URL 23 | $images: '../images' 24 | 25 | // FONT-AWESOME FONT PATH 26 | $fa-font-path: "../../../node_modules/font-awesome/fonts" 27 | -------------------------------------------------------------------------------- /resources/assets/sass/admin.sass: -------------------------------------------------------------------------------- 1 | @import 'variables' 2 | 3 | // ****************************************************** 4 | // Here you can define your own admin page style sheet. 5 | // ****************************************************** 6 | 7 | body.wp-admin 8 | 9 | -------------------------------------------------------------------------------- /resources/assets/sass/components/_article.sass: -------------------------------------------------------------------------------- 1 | .base-camp-article 2 | margin-bottom: 2.5rem 3 | .article-meta 4 | margin-bottom: -0.2rem 5 | margin-top: -0.8rem 6 | i, 7 | a 8 | font-size: 1rem 9 | color: $dark-primary 10 | * 11 | display: inline-block 12 | vertical-align: middle 13 | > * 14 | margin-right: 0.5rem 15 | time 16 | span 17 | color: #7a7a7a 18 | 19 | ul.article-tags 20 | margin-bottom: 1rem 21 | margin-top: 1rem 22 | li 23 | display: inline-block 24 | margin-right: 0.4rem 25 | 26 | -------------------------------------------------------------------------------- /resources/assets/sass/components/_comment.sass: -------------------------------------------------------------------------------- 1 | .blog-comment 2 | .comments 3 | padding-left: 2rem 4 | 5 | #respond 6 | margin-bottom: 1.5em 7 | 8 | .comment-reply-link 9 | color: $black 10 | > * 11 | font-size: 0.95rem 12 | vertical-align: middle 13 | 14 | #cancel-comment-reply-link 15 | @extend .button, .is-danger 16 | -------------------------------------------------------------------------------- /resources/assets/sass/components/_navbar.sass: -------------------------------------------------------------------------------- 1 | nav.navbar 2 | .navbar-brand 3 | align-items: center 4 | 5 | +desktop 6 | .second-level 7 | li 8 | position: relative 9 | 10 | a.has-children::after 11 | +arrow($link) 12 | margin-top: -0.375em 13 | right: 1.125em 14 | top: 50% 15 | transform: rotate(-135deg) 16 | font-size: 85% 17 | &:hover 18 | .third-level 19 | display: block!important 20 | 21 | .third-level 22 | left: 100% 23 | top: -6px 24 | display: none!important 25 | border-top-right-radius: 5px 26 | 27 | +touch 28 | ul.navbar-item 29 | padding-bottom: 1rem 30 | 31 | .navbar-dropdown 32 | padding: 0 33 | 34 | .second-level 35 | a 36 | padding-left: 2rem 37 | padding-right: 2rem 38 | 39 | .third-level 40 | padding: 0 41 | a 42 | padding-left: 3rem 43 | font-size: 95% 44 | 45 | -------------------------------------------------------------------------------- /resources/assets/sass/components/_social-media.sass: -------------------------------------------------------------------------------- 1 | .social-media-share-icons 2 | margin-top: 1rem 3 | a 4 | font-size: 2rem 5 | .fa 6 | transition: 0.2s 7 | .fa:hover 8 | transform: scale(1.2) 9 | 10 | .tumblr 11 | color: $tumblr 12 | .facebook 13 | color: $facebook 14 | .linkedin 15 | color: $linkedin 16 | .twitter 17 | color: $twitter 18 | .pinterest 19 | color: $pinterest 20 | .google-plus 21 | color: $google-plus 22 | .reddit 23 | color: $reddit 24 | 25 | -------------------------------------------------------------------------------- /resources/assets/sass/components/index.sass: -------------------------------------------------------------------------------- 1 | @import "article" 2 | @import "comment" 3 | @import "navbar" 4 | @import "social-media" 5 | -------------------------------------------------------------------------------- /resources/assets/sass/login.sass: -------------------------------------------------------------------------------- 1 | @import 'variables' 2 | 3 | // ****************************************************** 4 | // Here you can define your own custom login style sheet. 5 | // ****************************************************** 6 | 7 | body.login 8 | div#login 9 | h1 10 | a 11 | // Login Page logo 12 | background: url('#{$images}/base-camp-logo.png') no-repeat center bottom 13 | -webkit-background-size: 84px 14 | background-size: 100% 15 | color: #444 16 | height: 120px 17 | font-size: 20px 18 | font-weight: 400 19 | line-height: 1.3em 20 | margin: 0 auto 25px 21 | padding: 0 22 | text-decoration: none 23 | width: 60% 24 | text-indent: -9999px 25 | outline: none 26 | overflow: hidden 27 | display: block 28 | 29 | form#loginform 30 | p 31 | &.submit 32 | input#wp-submit 33 | // Submit button 34 | background: $primary 35 | border-color: darken($primary, 5%) darken($primary, 10%) darken($primary, 10%) 36 | -webkit-box-shadow: 0 1px 0 darken($primary, 10%) 37 | box-shadow: 0 1px 0 darken($primary, 10%) 38 | color: #fff 39 | text-decoration: none 40 | text-shadow: 0 -1px 1px darken($primary, 10%), 1px 0 1px darken($primary, 10%), 0 1px 1px darken($primary, 10%), -1px 0 1px darken($primary, 10%) 41 | 42 | 43 | // Form input and checkbox 44 | input[type="checkbox"], 45 | input[type="text"], 46 | input[type="password"] 47 | &:focus 48 | border-color: $primary 49 | -webkit-box-shadow: 0 0 2px darken($primary, 10%) 50 | box-shadow: 0 0 2px darken($primary, 10%) 51 | &:checked:before 52 | color: $primary 53 | -------------------------------------------------------------------------------- /resources/assets/sass/main.sass: -------------------------------------------------------------------------------- 1 | @import node_modules/bulma/bulma 2 | @import node_modules/font-awesome/scss/font-awesome 3 | @import pageloader 4 | @import components/index 5 | @import footer 6 | @import helpers 7 | @import single 8 | @import common 9 | @import woocommerce/index 10 | -------------------------------------------------------------------------------- /resources/assets/sass/shared-with-vue.sass: -------------------------------------------------------------------------------- 1 | @import variables 2 | @import node_modules/bulma/sass/utilities/mixins 3 | -------------------------------------------------------------------------------- /resources/assets/sass/woocommerce/_archive.sass: -------------------------------------------------------------------------------- 1 | .products 2 | clear: both 3 | -------------------------------------------------------------------------------- /resources/assets/sass/woocommerce/_common.sass: -------------------------------------------------------------------------------- 1 | input:not([type='checkbox']) 2 | @extend .input 3 | 4 | textarea 5 | @extend .textarea 6 | 7 | label 8 | @extend .label 9 | 10 | button.button 11 | @extend .button 12 | 13 | #respond input#submit 14 | @extend .button 15 | 16 | @extend .is-primary 17 | 18 | button.button.alt, 19 | a.button.alt, 20 | input.button.alt 21 | @extend .is-primary 22 | 23 | display: flex 24 | justify-content: center 25 | 26 | .star-rating > span, 27 | .stars a 28 | color: $dark-primary 29 | 30 | .entry-images 31 | position: relative 32 | 33 | span.onsale 34 | @extend .tag 35 | 36 | @extend .is-small 37 | 38 | @extend .is-danger 39 | 40 | font-size: 0.65rem !important 41 | 42 | .woocommerce-product-details__short-description 43 | margin-bottom: 0.5em 44 | -------------------------------------------------------------------------------- /resources/assets/sass/woocommerce/_single-product.sass: -------------------------------------------------------------------------------- 1 | div.product 2 | position: relative 3 | 4 | .woocommerce-product-gallery.woocommerce-product-gallery--with-images 5 | width: 100% 6 | 7 | .product_title.entry-title 8 | font-weight: 700 9 | 10 | p.price, 11 | span.price 12 | color: $dark-primary 13 | margin-bottom: 0.5em 14 | 15 | .woocommerce-tabs 16 | margin-top: 2em 17 | 18 | ul.tabs 19 | display: flex 20 | justify-content: flex-start 21 | border-bottom-color: #dbdbdb 22 | border-bottom-style: solid 23 | border-bottom-width: 1px 24 | overflow: visible 25 | padding: 0 26 | 27 | &:before, 28 | &:after 29 | content: none 30 | 31 | li 32 | background-color: transparent 33 | border: 0 34 | margin: 0 35 | padding: 0 36 | 37 | &:before, 38 | &:after 39 | content: none 40 | 41 | a 42 | color: #4a4a4a 43 | border-bottom-color: #dbdbdb 44 | border-bottom-style: solid 45 | border-bottom-width: 1px 46 | padding: 0.5em 1em 47 | 48 | li.active 49 | a 50 | border-bottom-color: $bc-primary 51 | color: $bc-primary 52 | -------------------------------------------------------------------------------- /resources/assets/sass/woocommerce/_tease-product.sass: -------------------------------------------------------------------------------- 1 | .tease-product 2 | position: relative 3 | 4 | span.price 5 | display: block 6 | -------------------------------------------------------------------------------- /resources/assets/sass/woocommerce/index.sass: -------------------------------------------------------------------------------- 1 | .woocommerce 2 | @import archive 3 | @import common 4 | @import single-product 5 | @import tease-product 6 | 7 | -------------------------------------------------------------------------------- /resources/languages/base-camp.pot: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2018 Toni Suomalainen 2 | # This file is distributed under the MIT. 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: Base camp 1.9.0\n" 6 | "Report-Msgid-Bugs-To: https://wordpress.org/support/theme/base-camp\n" 7 | "POT-Creation-Date: 2018-11-21 20:10:46+00:00\n" 8 | "MIME-Version: 1.0\n" 9 | "Content-Type: text/plain; charset=UTF-8\n" 10 | "Content-Transfer-Encoding: 8bit\n" 11 | "PO-Revision-Date: 2018-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | 15 | #: app/config/wp/image-sizes.php:16 16 | msgid "Square" 17 | msgstr "" 18 | 19 | #: app/config/wp/menus.php:8 20 | msgid "Main menu" 21 | msgstr "" 22 | 23 | #: app/config/wp/security.php:56 24 | msgid "Oops! Incorrect input" 25 | msgstr "" 26 | 27 | #: app/config/wp/sidebars.php:6 28 | msgid "Main Sidebar" 29 | msgstr "" 30 | 31 | #: app/config/wp/sidebars.php:8 32 | msgid "Widgets in this area will be shown on all posts and pages." 33 | msgstr "" 34 | 35 | #: resources/languages/messages.php:8 36 | msgid "404 - Page not found." 37 | msgstr "" 38 | 39 | #: resources/languages/messages.php:9 40 | msgid "The page you have looked for does not exist." 41 | msgstr "" 42 | 43 | #: resources/languages/messages.php:10 44 | msgid "Back to home page" 45 | msgstr "" 46 | 47 | #: resources/languages/messages.php:15 resources/languages/messages.php:57 48 | msgid "Edit" 49 | msgstr "" 50 | 51 | #: resources/languages/messages.php:20 52 | msgid "Sorry, no content" 53 | msgstr "" 54 | 55 | #: resources/languages/messages.php:25 56 | msgid "Name" 57 | msgstr "" 58 | 59 | #: resources/languages/messages.php:26 60 | msgid "Email" 61 | msgstr "" 62 | 63 | #: resources/languages/messages.php:27 64 | msgid "Website" 65 | msgstr "" 66 | 67 | #: resources/languages/messages.php:28 68 | msgid "Comment" 69 | msgstr "" 70 | 71 | #: resources/languages/messages.php:29 72 | msgid "Enter your comment here..." 73 | msgstr "" 74 | 75 | #: resources/languages/messages.php:30 76 | msgid "Post Comment" 77 | msgstr "" 78 | 79 | #: resources/languages/messages.php:31 80 | msgid "Reset" 81 | msgstr "" 82 | 83 | #: resources/languages/messages.php:36 84 | msgid "Reply" 85 | msgstr "" 86 | 87 | #: resources/languages/messages.php:41 88 | msgid "Sorry, No Results. Try your search again." 89 | msgstr "" 90 | 91 | #: resources/languages/messages.php:46 92 | msgid "Search" 93 | msgstr "" 94 | 95 | #: resources/languages/messages.php:51 96 | msgid "Password" 97 | msgstr "" 98 | 99 | #: resources/languages/messages.php:52 100 | msgid "Submit" 101 | msgstr "" 102 | 103 | #: resources/languages/messages.php:58 104 | msgid "Comments" 105 | msgstr "" 106 | 107 | #: single.php:6 108 | msgid "Cancel reply" 109 | msgstr "" 110 | 111 | #: vendor/suomato/luna/src/templates/custom-post-type.php:7 112 | msgctxt "Post Type General Name" 113 | msgid "Movies" 114 | msgstr "" 115 | 116 | #: vendor/suomato/luna/src/templates/custom-post-type.php:8 117 | msgctxt "Post Type Singular Name" 118 | msgid "Movie" 119 | msgstr "" 120 | 121 | #: vendor/suomato/luna/src/templates/custom-post-type.php:9 122 | msgid "Movies" 123 | msgstr "" 124 | 125 | #: vendor/suomato/luna/src/templates/custom-post-type.php:10 126 | msgid "Parent Movie" 127 | msgstr "" 128 | 129 | #: vendor/suomato/luna/src/templates/custom-post-type.php:11 130 | msgid "All Movies" 131 | msgstr "" 132 | 133 | #: vendor/suomato/luna/src/templates/custom-post-type.php:12 134 | msgid "View Movie" 135 | msgstr "" 136 | 137 | #: vendor/suomato/luna/src/templates/custom-post-type.php:13 138 | msgid "Add New Movie" 139 | msgstr "" 140 | 141 | #: vendor/suomato/luna/src/templates/custom-post-type.php:14 142 | msgid "Add New" 143 | msgstr "" 144 | 145 | #: vendor/suomato/luna/src/templates/custom-post-type.php:15 146 | msgid "Edit Movie" 147 | msgstr "" 148 | 149 | #: vendor/suomato/luna/src/templates/custom-post-type.php:16 150 | msgid "Update Movie" 151 | msgstr "" 152 | 153 | #: vendor/suomato/luna/src/templates/custom-post-type.php:17 154 | msgid "Search Movie" 155 | msgstr "" 156 | 157 | #: vendor/suomato/luna/src/templates/custom-post-type.php:18 158 | msgid "Not Found" 159 | msgstr "" 160 | 161 | #: vendor/suomato/luna/src/templates/custom-post-type.php:19 162 | msgid "Not found in Trash" 163 | msgstr "" 164 | 165 | #: vendor/suomato/luna/src/templates/custom-post-type.php:24 166 | msgid "movies" 167 | msgstr "" 168 | 169 | #: vendor/suomato/luna/src/templates/custom-post-type.php:25 170 | msgid "Movie" 171 | msgstr "" 172 | 173 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:7 174 | msgctxt "Taxonomy general name" 175 | msgid "Genres" 176 | msgstr "" 177 | 178 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:8 179 | msgctxt "Taxonomy singular name" 180 | msgid "Genre" 181 | msgstr "" 182 | 183 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:9 184 | msgid "Search Genres" 185 | msgstr "" 186 | 187 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:10 188 | msgid "All Genres" 189 | msgstr "" 190 | 191 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:11 192 | msgid "Parent Genre" 193 | msgstr "" 194 | 195 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:12 196 | msgid "Parent Genre:" 197 | msgstr "" 198 | 199 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:13 200 | msgid "Edit Genre" 201 | msgstr "" 202 | 203 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:14 204 | msgid "Update Genre" 205 | msgstr "" 206 | 207 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:15 208 | msgid "Add New Genre" 209 | msgstr "" 210 | 211 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:16 212 | msgid "New Genre Name" 213 | msgstr "" 214 | 215 | #: vendor/suomato/luna/src/templates/custom-taxonomy.php:17 216 | msgid "Genre" 217 | msgstr "" 218 | 219 | #: vendor/timber/timber/lib/Archives.php:160 220 | msgid "%1$s %2$d" 221 | msgstr "" 222 | 223 | #: vendor/timber/timber/lib/Archives.php:162 224 | msgid "%1$s" 225 | msgstr "" 226 | 227 | #: vendor/timber/timber/lib/Pagination.php:115 228 | msgid "« Previous" 229 | msgstr "" 230 | 231 | #: vendor/timber/timber/lib/Pagination.php:116 232 | msgid "Next »" 233 | msgstr "" 234 | 235 | #: vendor/timber/timber/lib/Pagination.php:179 236 | #: vendor/timber/timber/lib/TextHelper.php:26 237 | #: vendor/timber/timber/lib/TextHelper.php:44 238 | msgid "…" 239 | msgstr "" 240 | 241 | #. translators: If your word count is based on single characters (East Asian 242 | #. characters), enter 'characters'. Otherwise, enter 'words'. Do not translate 243 | #. into your own language. 244 | #: vendor/timber/timber/lib/TextHelper.php:53 245 | msgctxt "word count: words or characters?" 246 | msgid "words" 247 | msgstr "" 248 | 249 | #: vendor/timber/timber/tests/test-timber-gettext.php:8 250 | #: vendor/timber/timber/tests/test-timber-gettext.php:21 251 | msgid "my_boo" 252 | msgstr "" 253 | 254 | #: vendor/timber/timber/tests/test-timber-gettext.php:29 255 | #: vendor/timber/timber/tests/test-timber-gettext.php:31 256 | msgid "foo" 257 | msgid_plural "foos" 258 | msgstr[0] "" 259 | msgstr[1] "" 260 | 261 | #: vendor/timber/timber/tests/test-timber-gettext.php:37 262 | #: vendor/timber/timber/tests/test-timber-gettext.php:44 263 | #: vendor/timber/timber/tests/test-timber-gettext.php:52 264 | #: vendor/timber/timber/tests/test-timber-gettext.php:54 265 | msgctxt "my" 266 | msgid "boo" 267 | msgstr "" 268 | 269 | #: vendor/timber/timber/tests/test-timber-menu.php:512 270 | #: vendor/timber/timber/tests/test-timber-menu.php:513 271 | msgid "Gallery" 272 | msgstr "" 273 | 274 | #. translators: 1: audio track title, 2: album title, 3: artist name 275 | #: vendor/timber/timber/tests/wp-overrides.php:40 276 | msgid "\"%1$s\" from %2$s by %3$s." 277 | msgstr "" 278 | 279 | #. translators: 1: audio track title, 2: album title 280 | #: vendor/timber/timber/tests/wp-overrides.php:43 281 | msgid "\"%1$s\" from %2$s." 282 | msgstr "" 283 | 284 | #. translators: 1: audio track title, 2: artist name 285 | #: vendor/timber/timber/tests/wp-overrides.php:46 286 | msgid "\"%1$s\" by %2$s." 287 | msgstr "" 288 | 289 | #: vendor/timber/timber/tests/wp-overrides.php:48 290 | msgid "\"%s\"." 291 | msgstr "" 292 | 293 | #. translators: 1: audio album title, 2: artist name 294 | #: vendor/timber/timber/tests/wp-overrides.php:55 295 | msgid "%1$s by %2$s." 296 | msgstr "" 297 | 298 | #: vendor/timber/timber/tests/wp-overrides.php:67 299 | msgid "Released: %d." 300 | msgstr "" 301 | 302 | #: vendor/timber/timber/tests/wp-overrides.php:72 303 | msgid "Track %1$s of %2$s." 304 | msgstr "" 305 | 306 | #: vendor/timber/timber/tests/wp-overrides.php:74 307 | msgid "Track %1$s." 308 | msgstr "" 309 | 310 | #: vendor/timber/timber/tests/wp-overrides.php:78 311 | msgid "Genre: %s." 312 | msgstr "" 313 | 314 | #: vendor/timber/timber/tests/wp-overrides.php:143 315 | msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini." 316 | msgstr "" 317 | 318 | #: vendor/timber/timber/tests/wp-overrides.php:144 319 | msgid "" 320 | "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " 321 | "the HTML form." 322 | msgstr "" 323 | 324 | #: vendor/timber/timber/tests/wp-overrides.php:145 325 | msgid "The uploaded file was only partially uploaded." 326 | msgstr "" 327 | 328 | #: vendor/timber/timber/tests/wp-overrides.php:146 329 | msgid "No file was uploaded." 330 | msgstr "" 331 | 332 | #: vendor/timber/timber/tests/wp-overrides.php:148 333 | msgid "Missing a temporary folder." 334 | msgstr "" 335 | 336 | #: vendor/timber/timber/tests/wp-overrides.php:149 337 | msgid "Failed to write file to disk." 338 | msgstr "" 339 | 340 | #: vendor/timber/timber/tests/wp-overrides.php:150 341 | msgid "File upload stopped by extension." 342 | msgstr "" 343 | 344 | #: vendor/timber/timber/tests/wp-overrides.php:167 345 | msgid "Invalid form submission." 346 | msgstr "" 347 | 348 | #: vendor/timber/timber/tests/wp-overrides.php:177 349 | msgid "File is empty. Please upload something more substantial." 350 | msgstr "" 351 | 352 | #: vendor/timber/timber/tests/wp-overrides.php:179 353 | msgid "" 354 | "File is empty. Please upload something more substantial. This error could " 355 | "also be caused by uploads being disabled in your php.ini or by post_max_size " 356 | "being defined as smaller than upload_max_filesize in php.ini." 357 | msgstr "" 358 | 359 | #: vendor/timber/timber/tests/wp-overrides.php:185 360 | msgid "Specified file failed upload test." 361 | msgstr "" 362 | 363 | #: vendor/timber/timber/tests/wp-overrides.php:198 364 | msgid "Sorry, this file type is not permitted for security reasons." 365 | msgstr "" 366 | 367 | #: vendor/timber/timber/tests/wp-overrides.php:223 368 | msgid "The uploaded file could not be moved to %s." 369 | msgstr "" 370 | 371 | #. Theme Name of the plugin/theme 372 | msgid "Base camp" 373 | msgstr "" 374 | 375 | #. Theme URI of the plugin/theme 376 | msgid "https://github.com/suomato/base-camp" 377 | msgstr "" 378 | 379 | #. Description of the plugin/theme 380 | msgid "" 381 | "Awesome WordPress starter theme with own CLI for developers based on modern " 382 | "web technologies." 383 | msgstr "" 384 | 385 | #. Author of the plugin/theme 386 | msgid "Toni Suomalainen" 387 | msgstr "" 388 | 389 | #. Author URI of the plugin/theme 390 | msgid "https://github.com/suomato" 391 | msgstr "" 392 | -------------------------------------------------------------------------------- /resources/languages/messages.php: -------------------------------------------------------------------------------- 1 | [ 8 | 'title' => __('404 - Page not found.', 'base-camp'), 9 | 'body' => __('The page you have looked for does not exist.', 'base-camp'), 10 | 'link_text' => __('Back to home page', 'base-camp'), 11 | ], 12 | 13 | // Article Component 14 | 'article' => [ 15 | 'edit' => __('Edit', 'base-camp'), 16 | ], 17 | 18 | // Base Page 19 | 'base' => [ 20 | 'no_content' => __('Sorry, no content', 'base-camp'), 21 | ], 22 | 23 | // Comment Form Page 24 | 'comment_form' => [ 25 | 'name' => __('Name', 'base-camp'), 26 | 'email' => __('Email', 'base-camp'), 27 | 'website' => __('Website', 'base-camp'), 28 | 'comment' => __('Comment', 'base-camp'), 29 | 'comment_placeholder' => __('Enter your comment here...', 'base-camp'), 30 | 'post_comment' => __('Post Comment', 'base-camp'), 31 | 'reset' => __('Reset', 'base-camp'), 32 | ], 33 | 34 | // Comment Page 35 | 'comment' => [ 36 | 'reply' => __('Reply', 'base-camp'), 37 | ], 38 | 39 | // Search Page 40 | 'search' => [ 41 | 'no_results' => __('Sorry, No Results. Try your search again.', 'base-camp'), 42 | ], 43 | 44 | // Search Form Page 45 | 'search_form' => [ 46 | 'search' => __('Search', 'base-camp'), 47 | ], 48 | 49 | // Single Password Page 50 | 'single_password' => [ 51 | 'password' => __('Password', 'base-camp'), 52 | 'submit' => __('Submit', 'base-camp'), 53 | ], 54 | 55 | // Single Page 56 | 'single' => [ 57 | 'edit' => __('Edit', 'base-camp'), 58 | 'comments' => __('Comments', 'base-camp'), 59 | ], 60 | ]; 61 | } 62 | -------------------------------------------------------------------------------- /resources/views/404.twig: -------------------------------------------------------------------------------- 1 | {% extends "base.twig" %} 2 | 3 | {% block content %} 4 |

5 | {{ messages.404.title }} 6 |

7 |

{{ messages.404.body }} {{ messages.404.link_text }}.

8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /resources/views/archive.twig: -------------------------------------------------------------------------------- 1 | {% extends "base.twig" %} 2 | 3 | {% block content %} 4 |

{{ title }}

5 | {% for post in posts %} 6 | {% include 'components/article.twig' %} 7 |
8 | {% endfor %} 9 | 10 | {% if posts.pagination.pages %} 11 | {% include 'components/pagination.twig' %} 12 | {% endif %} 13 | 14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /resources/views/author.twig: -------------------------------------------------------------------------------- 1 | {% extends "base.twig" %} 2 | 3 | {% block content %} 4 |

{{ author }}

5 | {% for post in posts %} 6 | {% include 'components/article.twig' %} 7 |
8 | {% endfor %} 9 | 10 | {% if posts.pagination.pages %} 11 | {% include 'components/pagination.twig' %} 12 | {% endif %} 13 | 14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /resources/views/base.twig: -------------------------------------------------------------------------------- 1 | {% include 'header/index.twig' %} 2 | 3 |
4 |
5 |
6 | 7 |
8 | {% block content %} 9 | {{ messages.base.no_content }} 10 | {% endblock %} 11 |
12 | 13 | 16 | 17 |
18 |
19 |
20 | 21 | {% include 'footer/index.twig' %} 22 | 23 | 24 | -------------------------------------------------------------------------------- /resources/views/comment-form.twig: -------------------------------------------------------------------------------- 1 |
2 |
3 | {% if user %} 4 | 5 | 6 | 7 | {% else %} 8 | 9 | {# Name input field #} 10 |
11 | 12 |
13 | 14 | 15 | 16 | 17 |
18 |
19 | 20 | {# Email input field #} 21 |
22 | 23 |
24 | 25 | 26 | 27 | 28 |
29 |
30 | 31 | {# Website input field #} 32 |
33 | 34 |
35 | 36 | 37 | 38 | 39 |
40 |
41 | {% endif %} 42 | 43 | {# Comment input field #} 44 |
45 | 46 |
47 | 52 |
53 |
54 | 55 | 56 | 57 | 58 | {# Form Buttons #} 59 |
60 |

61 | 62 |

63 |

64 | 65 |

66 |

67 | {{ cancel_link }} 68 |

69 |
70 |
71 |
72 | -------------------------------------------------------------------------------- /resources/views/comment.twig: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | {# Message body #} 6 |
7 |
8 |
9 | 10 |
11 |
12 |
{{ comment.author.name }}
13 | 16 |

17 |
{{ comment.comment_content|wpautop }}
18 | 19 |
20 |
21 | 22 | {# Message Footer #} 23 |
24 | {{ comment.reply_link(' ' ~ messages.comment.reply ~ '') }} 25 |
26 |
27 |
28 |
29 | 30 | {% if post.comments %} 31 |
32 | {% for cmt in comment.children %} 33 | {% include "comment.twig" with {comment:cmt} %} 34 | {% endfor %} 35 |
36 | {% endif %} 37 | 38 |
39 |
40 | -------------------------------------------------------------------------------- /resources/views/components/article.twig: -------------------------------------------------------------------------------- 1 | 30 | -------------------------------------------------------------------------------- /resources/views/components/navbar/_navbar-brand.twig: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /resources/views/components/navbar/_navbar-end.twig: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/views/components/navbar/_navbar-menu.twig: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /resources/views/components/navbar/_navbar-start.twig: -------------------------------------------------------------------------------- 1 | 41 | -------------------------------------------------------------------------------- /resources/views/components/navbar/index.twig: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /resources/views/components/pagination.twig: -------------------------------------------------------------------------------- 1 | 37 | -------------------------------------------------------------------------------- /resources/views/components/social-media.twig: -------------------------------------------------------------------------------- 1 | 39 | 40 |
41 | -------------------------------------------------------------------------------- /resources/views/footer/index.twig: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

5 | Base Camp by Toni Suomalainen. 6 | The source code is licensed MIT. 7 |

8 |
9 |
10 |
11 | 12 | {# end
#} 13 | 14 | {{ function('wp_footer') }} 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /resources/views/header/_head.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {# force Internet Explorer to use the latest rendering engine available #} 5 | 6 | 7 | 8 | {% if wp_title %} 9 | {{ wp_title }} - {{ site.name }} 10 | {% else %} 11 | {{ site.name }} 12 | {% endif %} 13 | 14 | 15 | {# ldFriendly" content="True"> #} 16 | 17 | 18 | 19 | 20 | 21 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | {{ function('wp_head') }} 31 | 32 | -------------------------------------------------------------------------------- /resources/views/header/index.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | {# #} 11 | {% include 'header/_head.twig' %} 12 | {# #} 13 | 14 | 15 |
16 | 17 | {% if not in_production %} 18 |
19 | {{ current_template_file }} 20 |
21 | {% endif %} 22 | 23 |
24 | 25 |
26 |
27 | {% include "components/navbar/index.twig" %} 28 |
29 |
30 |
31 |
32 |

33 | {{ site.title }} 34 |

35 |

36 | {{ site.description }} 37 |

38 |
39 |
40 |
41 | 42 |
43 | -------------------------------------------------------------------------------- /resources/views/index.twig: -------------------------------------------------------------------------------- 1 | {% extends "base.twig" %} 2 | 3 | {% block content %} 4 | {% for post in posts %} 5 | {% include 'components/article.twig' %} 6 |
7 | {% endfor %} 8 | 9 | 10 | {% if posts.pagination.pages %} 11 | {% include 'components/pagination.twig' %} 12 | {% endif %} 13 | 14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /resources/views/maintenance.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | {{ site.name }} 13 | 14 | 32 | 33 | 34 | 35 |
36 | 37 |

38 | 39 |  Under maintenance  40 | 41 |

42 |
43 | 44 | 45 | -------------------------------------------------------------------------------- /resources/views/page.twig: -------------------------------------------------------------------------------- 1 | {% extends "base.twig" %} 2 | 3 | {% block content %} 4 |
5 |

{{ post.title }}

6 |

7 | {{ post.content }} 8 |

9 |
10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /resources/views/search.twig: -------------------------------------------------------------------------------- 1 | {% extends "base.twig" %} 2 | 3 | {% block content %} 4 | {% if posts is not empty %} 5 |

{{ title }}

6 | {% for post in posts %} 7 | {% include 'components/article.twig' %} 8 |
9 | {% endfor %} 10 | 11 | {% if posts.pagination.pages %} 12 | {% include 'components/pagination.twig' %} 13 | {% endif %} 14 | 15 | {% else %} 16 |

{{ messages.search.no_results }}

17 | {% include 'searchform.twig' %} 18 | {% endif %} 19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /resources/views/searchform.twig: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /resources/views/single-password.twig: -------------------------------------------------------------------------------- 1 | {% extends "base.twig" %} 2 | 3 | {% block content %} 4 |
5 | 6 |
7 | 8 |

9 | 10 | 11 | 12 | 13 |

14 |
15 | 16 |
17 |

18 | 19 |

20 |
21 | 22 |
23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /resources/views/single.twig: -------------------------------------------------------------------------------- 1 | {% extends "base.twig" %} 2 | 3 | {% block content %} 4 |
5 |

{{ post.title }}

6 |
7 | 10 |
11 | {% if post.can_edit %} 12 |
13 | {{ messages.single.edit }} 14 |
15 | {% endif %} 16 |

17 | {{ post.content }} 18 |

19 | 20 |
21 | 22 | {# Social media share buttons #} 23 | {% include 'components/social-media.twig' %} 24 | 25 |
26 |
27 | {% if post.comments is not empty %} 28 |

{{ messages.single.comments }}

29 | {% for comment in post.comments %} 30 | {% include "comment.twig" %} 31 | {% endfor %} 32 | {% endif %} 33 |
34 | 35 | {% if post.comment_status == "open" %} 36 | {% include "comment-form.twig" %} 37 | {% endif %} 38 |
39 | {% endblock %} 40 | -------------------------------------------------------------------------------- /resources/views/woocommerce/archive.twig: -------------------------------------------------------------------------------- 1 | {% extends 'base.twig' %} 2 | 3 | {% block content %} 4 | 5 | {% do action('woocommerce_before_main_content') %} 6 | 7 |
8 | {% do action('woocommerce_before_shop_loop') %} 9 |
10 | 11 |
12 | {% for post in products %} 13 | {% include ["woocommerce/tease-product.twig"] %} 14 | {% endfor %} 15 |
16 | 17 | {% do action('woocommerce_after_shop_loop') %} 18 | {% do action('woocommerce_after_main_content') %} 19 | 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /resources/views/woocommerce/single-product.twig: -------------------------------------------------------------------------------- 1 | {% extends "base.twig" %} 2 | 3 | {% block content %} 4 | 5 | {% do action('woocommerce_before_single_product') %} 6 | 7 |
8 |

{{ post.title }}

9 |
10 | 13 |
14 | 15 | {% if post.can_edit %} 16 |
17 | {{ messages.single.edit }} 18 |
19 | {% endif %} 20 | 21 |
22 |
23 | {% do action('woocommerce_before_single_product_summary') %} 24 |
25 | 26 |
27 | {% do action('woocommerce_single_product_summary') %} 28 |
29 |
30 | 31 | {% do action('woocommerce_after_single_product_summary') %} 32 | 33 |
34 | 35 | {% do action('woocommerce_after_single_product') %} 36 | 37 | {% endblock %} 38 | -------------------------------------------------------------------------------- /resources/views/woocommerce/tease-product.twig: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ fn('timber_set_product', post) }} 4 | 5 |
6 | 7 | {% if showthumb %} 8 | 17 | {% endif %} 18 | 19 |
20 | 21 | {% do action('woocommerce_before_shop_loop_item_title') %} 22 | 23 | {% if post.title %} 24 |

{{ post.title }}

25 | {% else %} 26 |

{{ fn('the_title') }}

27 | {% endif %} 28 | 29 | {% do action( 'woocommerce_after_shop_loop_item_title' ) %} 30 | {% do action( 'woocommerce_after_shop_loop_item' ) %} 31 | 32 |
33 | 34 |
35 | 36 |
37 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suomato/base-camp/f9ecc2c03dc906dbf796f2d935e649fc7485052d/screenshot.png -------------------------------------------------------------------------------- /search.php: -------------------------------------------------------------------------------- 1 | ID)) { 9 | Timber::render('single-password.twig', $context); 10 | } else { 11 | $post_type = $post->post_type === 'revision' ? get_post_type($post->post_parent) : $post->post_type; 12 | Timber::render(['single-' . $post->ID . '.twig', 'single-' . $post_type . '.twig', 'single.twig'], $context); 13 | } 14 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | /* 2 | Theme Name: Base camp 3 | Theme URI: https://github.com/suomato/base-camp 4 | Author: Toni Suomalainen 5 | Author URI: https://github.com/suomato 6 | Description: Awesome WordPress starter theme with own CLI for developers based on modern web technologies. 7 | Version: 1.9.0 8 | License: MIT 9 | License URI: https://opensource.org/licenses/mit-license.php 10 | */ 11 | -------------------------------------------------------------------------------- /woocommerce.php: -------------------------------------------------------------------------------- 1 | ID); 8 | $context['product'] = $product; 9 | 10 | Timber::render('woocommerce/single-product.twig', $context); 11 | } else { 12 | $posts = Timber::get_posts(); 13 | $context['products'] = $posts; 14 | 15 | if (is_product_category()) { 16 | $queried_object = get_queried_object(); 17 | $term_id = $queried_object->term_id; 18 | $context['category'] = get_term($term_id, 'product_cat'); 19 | $context['title'] = single_term_title('', false); 20 | } 21 | 22 | Timber::render('woocommerce/archive.twig', $context); 23 | } 24 | --------------------------------------------------------------------------------