├── src ├── js │ └── .gitkeep ├── app.scss ├── css │ ├── index.scss │ └── craft-index.scss └── app.js ├── templates ├── .gitkeep └── index.twig ├── web ├── cpresources │ └── .gitignore ├── .htaccess ├── dist │ ├── manifest.json │ ├── manifest-legacy.json │ ├── js │ │ ├── app.5ffc61c009eba461cdce.js │ │ ├── app.5ffc61c009eba461cdce.es5.js │ │ ├── app.5ffc61c009eba461cdce.js.map │ │ └── app.5ffc61c009eba461cdce.es5.js.map │ └── css │ │ ├── app.5ffc61c009eba461cdce.css │ │ └── app.5ffc61c009eba461cdce.css.map ├── index.php └── web.config ├── storage ├── config-deltas │ └── .gitignore └── .gitignore ├── .gitignore ├── config ├── project │ ├── fieldGroups │ │ └── 5c94fcc8-5c73-41e4-b333-ff73d8c0c418.yaml │ ├── siteGroups │ │ └── 70c4632f-a33d-4760-8dcc-522db883edc3.yaml │ ├── sites │ │ └── default--dc2a2269-f434-4973-af9f-1342311544c2.yaml │ └── project.yaml ├── redactor │ ├── Simple.json │ └── Default.json ├── license.key ├── htmlpurifier │ └── Default.json ├── db.php ├── routes.php ├── app.php ├── twigpack.php └── general.php ├── .babelrc ├── postcss.config.js ├── wpconfig ├── paths.js ├── webpack.common.js ├── webpack.dev.js └── webpack.prod.js ├── composer.json ├── tailwind.config.js ├── .env.example ├── craft ├── LICENSE ├── modules └── Module.php ├── package.json └── README.md /src/js/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/cpresources/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/config-deltas/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.env 2 | /.idea 3 | /vendor 4 | /node_modules 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /config/project/fieldGroups/5c94fcc8-5c73-41e4-b333-ff73d8c0c418.yaml: -------------------------------------------------------------------------------- 1 | name: Common 2 | -------------------------------------------------------------------------------- /config/project/siteGroups/70c4632f-a33d-4760-8dcc-522db883edc3.yaml: -------------------------------------------------------------------------------- 1 | name: 'Craft 3' 2 | -------------------------------------------------------------------------------- /storage/.gitignore: -------------------------------------------------------------------------------- 1 | backups 2 | composer-backups 3 | config-backups 4 | logs 5 | runtime 6 | -------------------------------------------------------------------------------- /config/redactor/Simple.json: -------------------------------------------------------------------------------- 1 | { 2 | "buttons": ["bold", "italic"], 3 | "toolbarFixed": true 4 | } 5 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env"], 3 | "plugins": ["@babel/plugin-proposal-class-properties"] 4 | } 5 | -------------------------------------------------------------------------------- /src/app.scss: -------------------------------------------------------------------------------- 1 | 2 | @import "tailwindcss/base"; 3 | 4 | @import "css/index.scss"; 5 | 6 | @import "tailwindcss/components"; 7 | @import "tailwindcss/utilities"; 8 | -------------------------------------------------------------------------------- /src/css/index.scss: -------------------------------------------------------------------------------- 1 | // Import your CSS/SCSS files here: 2 | @import "craft-index.scss"; 3 | 4 | body { 5 | // You should see this border on the page! 6 | border: 10px solid theme('colors.green.500'); 7 | } -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | 'postcss-import': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | 'postcss-preset-env': { 7 | browsers: 'last 2 versions', 8 | }, 9 | }, 10 | } 11 | -------------------------------------------------------------------------------- /config/license.key: -------------------------------------------------------------------------------- 1 | 2O4N5O1#GR#VW3MG3%8*#FIZ5K&ZA/WWB4S=2VJ0O=*T1M5GO9 2 | %UD2QJA*EDG1!BR%NIVHRBDKBQ#DD=8G/RF1EB^H=QIYKGVGUA 3 | ZGW^2^7$W*I5MU%5UY1%1PGZ2^9MFP9XHU8WD839$0=YR8$I2Y 4 | %^/CQM38G4TJUECGPP7FY+1%%5XVFJZLM5PPFXL^D=1*J/J$&O 5 | AA%92+8U+*6Z!UJ0480^KDOANXG8N37CK=5MLCGA1S0WD5&54M 6 | -------------------------------------------------------------------------------- /config/project/sites/default--dc2a2269-f434-4973-af9f-1342311544c2.yaml: -------------------------------------------------------------------------------- 1 | baseUrl: '@web' 2 | enabled: true 3 | handle: default 4 | hasUrls: true 5 | language: en-US 6 | name: 'Craft 3' 7 | primary: true 8 | siteGroup: 70c4632f-a33d-4760-8dcc-522db883edc3 # Craft 3 9 | sortOrder: 1 10 | -------------------------------------------------------------------------------- /config/htmlpurifier/Default.json: -------------------------------------------------------------------------------- 1 | { 2 | "Attr.AllowedFrameTargets": [ 3 | "_blank" 4 | ], 5 | "Attr.EnableID": true, 6 | "HTML.AllowedComments": [ 7 | "pagebreak" 8 | ], 9 | "HTML.SafeIframe": true, 10 | "URI.SafeIframeRegexp": "%^(https?:)?//(www.youtube.com/embed/|player.vimeo.com/video/)%" 11 | } 12 | -------------------------------------------------------------------------------- /web/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | RewriteEngine On 3 | 4 | # Send would-be 404 requests to Craft 5 | RewriteCond %{REQUEST_FILENAME} !-f 6 | RewriteCond %{REQUEST_FILENAME} !-d 7 | RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC] 8 | RewriteRule (.+) index.php?p=$1 [QSA,L] 9 | 10 | -------------------------------------------------------------------------------- /config/redactor/Default.json: -------------------------------------------------------------------------------- 1 | { 2 | "buttons": [ 3 | "html", 4 | "formatting", 5 | "bold", 6 | "italic", 7 | "unorderedlist", 8 | "orderedlist", 9 | "link", 10 | "image", 11 | "video" 12 | ], 13 | "plugins": [ 14 | "fullscreen", 15 | "video" 16 | ], 17 | "linkNewTab": true, 18 | "toolbarFixed": true 19 | } 20 | -------------------------------------------------------------------------------- /web/dist/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "app.css": "/css/app.5ffc61c009eba461cdce.css", 3 | "app.js": "/js/app.5ffc61c009eba461cdce.es5.js", 4 | "chunk-vendors.js": "/js/chunk-vendors.3e6e05424ae0a23c784b.es5.js", 5 | "app.css.map": "/css/app.5ffc61c009eba461cdce.css.map", 6 | "app.es5.js.map": "/js/app.5ffc61c009eba461cdce.es5.js.map", 7 | "chunk-vendors.es5.js.map": "/js/chunk-vendors.3e6e05424ae0a23c784b.es5.js.map" 8 | } -------------------------------------------------------------------------------- /web/dist/manifest-legacy.json: -------------------------------------------------------------------------------- 1 | { 2 | "app.css": "/css/app.5ffc61c009eba461cdce.css", 3 | "app.js": "/js/app.5ffc61c009eba461cdce.es5.js", 4 | "chunk-vendors.js": "/js/chunk-vendors.3e6e05424ae0a23c784b.es5.js", 5 | "app.css.map": "/css/app.5ffc61c009eba461cdce.css.map", 6 | "app.es5.js.map": "/js/app.5ffc61c009eba461cdce.es5.js.map", 7 | "chunk-vendors.es5.js.map": "/js/chunk-vendors.3e6e05424ae0a23c784b.es5.js.map" 8 | } -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | import "core-js/stable" 2 | import "regenerator-runtime/runtime" 3 | 4 | import "./app.scss" 5 | 6 | /* 7 | To include modules, import and include them anywhere in your JS. For example, 8 | uncommenting the following two lines will force the jquery chunk to be 9 | generated. Normally, only code that is actually used will be output as modules. 10 | */ 11 | // import $ from "jquery" 12 | // console.log( $ ); 13 | 14 | // Only used in dev 15 | if (module.hot) { 16 | module.hot.accept(); 17 | } 18 | -------------------------------------------------------------------------------- /wpconfig/paths.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | module.exports = { 4 | // Source files 5 | src: path.resolve(__dirname, '../src'), 6 | 7 | // Production build files 8 | build: path.resolve(__dirname, '../web/dist'), 9 | 10 | // Static files that get copied to build folder 11 | public: path.resolve(__dirname, '../web'), 12 | 13 | templates: path.resolve(__dirname, '../templates'), 14 | 15 | storage: path.resolve(__dirname, '../storage/webpack'), 16 | 17 | webpack: path.resolve(__dirname) 18 | } 19 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "chasegiunta/scss": "^1.0", 4 | "craftcms/cms": "3.7.19", 5 | "nystudio107/craft-twigpack": "1.2.15", 6 | "vlucas/phpdotenv": "^3.4.0" 7 | }, 8 | "require-dev": { 9 | "yiisoft/yii2-shell": "^2.0.3" 10 | }, 11 | "autoload": { 12 | "psr-4": { 13 | "modules\\": "modules/" 14 | } 15 | }, 16 | "config": { 17 | "sort-packages": true, 18 | "optimize-autoloader": true, 19 | "platform": { 20 | "php": "7.2.5" 21 | } 22 | }, 23 | "scripts": { 24 | "post-root-package-install": [ 25 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 26 | ] 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | // tailwind.config.js 2 | // See more information about this file at https://tailwindcss.com/docs/installation#create-your-configuration-file 3 | 4 | module.exports = { 5 | prefix: 'tw-', 6 | important: true, 7 | mode: 'jit', 8 | purge: { 9 | mode: 'all', 10 | enabled: true, 11 | content: [ 12 | './src/**/*.js', 13 | './templates/**/*.twig', 14 | './templates/**/*.html' 15 | ], 16 | options: { 17 | keyframes: true, 18 | fontFace: true, 19 | } 20 | }, 21 | darkMode: 'media', // See https://tailwindcss.com/docs/dark-mode 22 | theme: { 23 | extend: {}, 24 | }, 25 | variants: {}, 26 | plugins: [], 27 | }; 28 | -------------------------------------------------------------------------------- /web/index.php: -------------------------------------------------------------------------------- 1 | load(); 16 | } 17 | 18 | // Load and run Craft 19 | define('CRAFT_ENVIRONMENT', getenv('ENVIRONMENT') ?: 'production'); 20 | /** @var craft\web\Application $app */ 21 | $app = require CRAFT_VENDOR_PATH.'/craftcms/cms/bootstrap/web.php'; 22 | $app->run(); 23 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # The environment Craft is currently running in (dev, staging, production, etc.) 2 | ENVIRONMENT=dev 3 | 4 | # The application ID used to to uniquely store session and cache data, mutex locks, and more 5 | APP_ID= 6 | 7 | # The secure key Craft will use for hashing and encrypting data 8 | SECURITY_KEY= 9 | 10 | LOCALHOST_DOMAIN=craft.local 11 | CRAFTENV_BASE_PATH=/web 12 | 13 | DEFAULT_SITE_URL=https://craft.local 14 | PRIMARY_SITE_URL=https://craft.local 15 | 16 | # DB_DSN=mysql:host=127.0.0.1;port=3306;dbname=craft_dev; 17 | 18 | DB_DRIVER=mysql 19 | DB_SERVER=127.0.0.1 20 | DB_PORT=3306 21 | DB_SCHEMA= 22 | DB_TABLE_PREFIX= 23 | 24 | # DB_DATABASE= 25 | # DB_USER= 26 | # DB_PASSWORD= 27 | -------------------------------------------------------------------------------- /config/db.php: -------------------------------------------------------------------------------- 1 | App::env('DB_DSN') ?: null, 15 | 'driver' => App::env('DB_DRIVER'), 16 | 'server' => App::env('DB_SERVER'), 17 | 'port' => App::env('DB_PORT'), 18 | 'database' => App::env('DB_DATABASE'), 19 | 'user' => App::env('DB_USER'), 20 | 'password' => App::env('DB_PASSWORD'), 21 | 'schema' => App::env('DB_SCHEMA'), 22 | 'tablePrefix' => App::env('DB_TABLE_PREFIX'), 23 | ]; 24 | -------------------------------------------------------------------------------- /craft: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | load(); 17 | } 18 | 19 | // Load and run Craft 20 | define('CRAFT_ENVIRONMENT', getenv('ENVIRONMENT') ?: 'production'); 21 | /** @var craft\console\Application $app */ 22 | $app = require CRAFT_VENDOR_PATH.'/craftcms/cms/bootstrap/console.php'; 23 | $exitCode = $app->run(); 24 | exit($exitCode); 25 | -------------------------------------------------------------------------------- /config/routes.php: -------------------------------------------------------------------------------- 1 | ' => ['template' => 'blog/_archive'], 15 | * 16 | * That example would match URIs such as `/blog/archive/2012`, and pass the 17 | * request along to the `blog/_archive` template, providing it a `year` variable 18 | * set to the value `2012`. 19 | */ 20 | 21 | return [ 22 | 23 | ]; 24 | -------------------------------------------------------------------------------- /config/project/project.yaml: -------------------------------------------------------------------------------- 1 | dateModified: 1635940390 2 | email: 3 | fromEmail: admin@admin.com 4 | fromName: 'Craft 3' 5 | transportType: craft\mail\transportadapters\Sendmail 6 | meta: 7 | __names__: 8 | 5c94fcc8-5c73-41e4-b333-ff73d8c0c418: Common # Common 9 | 70c4632f-a33d-4760-8dcc-522db883edc3: 'Craft 3' # Craft 3 10 | dc2a2269-f434-4973-af9f-1342311544c2: 'Craft 3' # Craft 3 11 | plugins: 12 | scss: 13 | edition: standard 14 | enabled: true 15 | schemaVersion: 1.0.0 16 | twigpack: 17 | edition: standard 18 | enabled: true 19 | schemaVersion: 1.0.0 20 | system: 21 | edition: solo 22 | live: true 23 | name: 'Craft 3' 24 | schemaVersion: 3.7.8 25 | timeZone: America/Los_Angeles 26 | users: 27 | allowPublicRegistration: false 28 | defaultGroup: null 29 | photoSubpath: null 30 | photoVolumeUid: null 31 | requireEmailVerification: true 32 | -------------------------------------------------------------------------------- /config/app.php: -------------------------------------------------------------------------------- 1 | App::env('APP_ID') ?: 'CraftCMS', 24 | 'modules' => [ 25 | 'my-module' => \modules\Module::class, 26 | ], 27 | //'bootstrap' => ['my-module'], 28 | ]; 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Tammy Shipps 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /web/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /modules/Module.php: -------------------------------------------------------------------------------- 1 | getModule('my-module')`. 11 | * 12 | * You can change its module ID ("my-module") to something else from 13 | * config/app.php. 14 | * 15 | * If you want the module to get loaded on every request, uncomment this line 16 | * in config/app.php: 17 | * 18 | * 'bootstrap' => ['my-module'] 19 | * 20 | * Learn more about Yii module development in Yii's documentation: 21 | * http://www.yiiframework.com/doc-2.0/guide-structure-modules.html 22 | */ 23 | class Module extends \yii\base\Module 24 | { 25 | /** 26 | * Initializes the module. 27 | */ 28 | public function init() 29 | { 30 | // Set a @modules alias pointed to the modules/ directory 31 | Craft::setAlias('@modules', __DIR__); 32 | 33 | // Set the controllerNamespace based on whether this is a console or web request 34 | if (Craft::$app->getRequest()->getIsConsoleRequest()) { 35 | $this->controllerNamespace = 'modules\\console\\controllers'; 36 | } else { 37 | $this->controllerNamespace = 'modules\\controllers'; 38 | } 39 | 40 | parent::init(); 41 | 42 | // Custom initialization code goes here... 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /web/dist/js/app.5ffc61c009eba461cdce.js: -------------------------------------------------------------------------------- 1 | var craft3;(()=>{"use strict";var e,r={1793:(e,r,t)=>{t.r(r);t(8594),t(5666);var n=t(3379),o=t.n(n),a=t(7795),i=t.n(a),l=t(569),s=t.n(l),u=t(3565),f=t.n(u),c=t(9216),d=t.n(c),v=t(4589),p=t.n(v),b=t(8590),h={};h.styleTagTransform=p(),h.setAttributes=f(),h.insert=s().bind(null,"head"),h.domAPI=i(),h.insertStyleElement=d();o()(b.Z,h);b.Z&&b.Z.locals&&b.Z.locals},8590:(e,r,t)=>{t.d(r,{Z:()=>l});var n=t(7537),o=t.n(n),a=t(3645),i=t.n(a)()(o());i.push([e.id,"","",{version:3,sources:[],names:[],mappings:"",sourceRoot:""}]);const l=i}},t={};function n(e){var o=t[e];if(void 0!==o)return o.exports;var a=t[e]={id:e,exports:{}};return r[e](a,a.exports,n),a.exports}n.m=r,e=[],n.O=(r,t,o,a)=>{if(!t){var i=1/0;for(f=0;f=a)&&Object.keys(n.O).every((e=>n.O[e](t[s])))?t.splice(s--,1):(l=!1,a0&&e[f-1][2]>a;f--)e[f]=e[f-1];e[f]=[t,o,a]},n.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return n.d(r,{a:r}),r},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={143:0};n.O.j=r=>0===e[r];var r=(r,t)=>{var o,a,[i,l,s]=t,u=0;if(i.some((r=>0!==e[r]))){for(o in l)n.o(l,o)&&(n.m[o]=l[o]);if(s)var f=s(n)}for(r&&r(t);un(1793)));o=n.O(o),craft3=o})(); 2 | //# sourceMappingURL=app.5ffc61c009eba461cdce.js.map -------------------------------------------------------------------------------- /web/dist/js/app.5ffc61c009eba461cdce.es5.js: -------------------------------------------------------------------------------- 1 | var craft3;(()=>{"use strict";var e,r={1793:(e,r,t)=>{t.r(r);t(8594),t(5666);var n=t(3379),o=t.n(n),a=t(7795),i=t.n(a),l=t(569),s=t.n(l),u=t(3565),f=t.n(u),c=t(9216),d=t.n(c),v=t(4589),p=t.n(v),b=t(8590),h={};h.styleTagTransform=p(),h.setAttributes=f(),h.insert=s().bind(null,"head"),h.domAPI=i(),h.insertStyleElement=d();o()(b.Z,h);b.Z&&b.Z.locals&&b.Z.locals},8590:(e,r,t)=>{t.d(r,{Z:()=>l});var n=t(7537),o=t.n(n),a=t(3645),i=t.n(a)()(o());i.push([e.id,"","",{version:3,sources:[],names:[],mappings:"",sourceRoot:""}]);const l=i}},t={};function n(e){var o=t[e];if(void 0!==o)return o.exports;var a=t[e]={id:e,exports:{}};return r[e](a,a.exports,n),a.exports}n.m=r,e=[],n.O=(r,t,o,a)=>{if(!t){var i=1/0;for(f=0;f=a)&&Object.keys(n.O).every((e=>n.O[e](t[s])))?t.splice(s--,1):(l=!1,a0&&e[f-1][2]>a;f--)e[f]=e[f-1];e[f]=[t,o,a]},n.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return n.d(r,{a:r}),r},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={143:0};n.O.j=r=>0===e[r];var r=(r,t)=>{var o,a,[i,l,s]=t,u=0;if(i.some((r=>0!==e[r]))){for(o in l)n.o(l,o)&&(n.m[o]=l[o]);if(s)var f=s(n)}for(r&&r(t);un(1793)));o=n.O(o),craft3=o})(); 2 | //# sourceMappingURL=app.5ffc61c009eba461cdce.es5.js.map -------------------------------------------------------------------------------- /config/twigpack.php: -------------------------------------------------------------------------------- 1 | [ 6 | // If `devMode` is on, use webpack-dev-server to all for HMR (hot module reloading) 7 | 'useDevServer' => false, 8 | // Enforce Absolute URLs on includes 9 | 'useAbsoluteUrl' => true, 10 | // The JavaScript entry from the manifest.json to inject on Twig error pages 11 | // This can be a string or an array of strings 12 | 'errorEntry' => 'app.js', 13 | // String to be appended to the cache key 14 | 'cacheKeySuffix' => '', 15 | // Manifest file names 16 | 'manifest' => [ 17 | 'legacy' => 'manifest-legacy.json', 18 | 'modern' => 'manifest.json', 19 | ], 20 | // Public server config 21 | 'server' => [ 22 | 'manifestPath' => '@webroot/dist/', 23 | 'publicPath' => '@web/dist/', 24 | ], 25 | // webpack-dev-server config 26 | 'devServer' => [ 27 | 'manifestPath' => 'https://localhost:8080/', 28 | 'publicPath' => 'https://localhost:8080/', 29 | ], 30 | // Bundle to use with the webpack-dev-server 31 | 'devServerBuildType' => 'modern', 32 | // Whether to include a Content Security Policy "nonce" for inline 33 | // CSS or JavaScript. Valid values are 'header' or 'tag' for how the CSP 34 | // should be included. c.f.: 35 | // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#Unsafe_inline_script 36 | 'cspNonce' => '', 37 | // Local files config 38 | 'localFiles' => [ 39 | 'basePath' => '@webroot/dist/', 40 | ], 41 | ], 42 | // Live (production) environment 43 | 'live' => [ 44 | ], 45 | // Staging (pre-production) environment 46 | 'staging' => [ 47 | ], 48 | // Development environment 49 | 'dev' => [ 50 | // If `devMode` is on, use webpack-dev-server to all for HMR (hot module reloading) 51 | 'useDevServer' => true, 52 | 'useAbsoluteUrl' => true, 53 | ], 54 | ]; 55 | -------------------------------------------------------------------------------- /config/general.php: -------------------------------------------------------------------------------- 1 | [ 16 | '@basePath' => getenv('CRAFTENV_BASE_PATH'), 17 | '@baseUrl' => getenv('CRAFTENV_BASE_URL'), 18 | '@defaultSiteUrl' => getenv('DEFAULT_SITE_URL'), 19 | '@baseUploadsUrl' => getenv('BASE_UPLOADS_URL'), 20 | ], 21 | '*' => [ 22 | // Default Week Start Day (0 = Sunday, 1 = Monday...) 23 | 'defaultWeekStartDay' => 0, 24 | 25 | // Whether generated URLs should omit "index.php" 26 | 'omitScriptNameInUrls' => true, 27 | 28 | // Control panel trigger word 29 | 'cpTrigger' => 'admin', 30 | 31 | // The secure key Craft will use for hashing and encrypting data 32 | 'securityKey' => App::env('SECURITY_KEY'), 33 | 34 | // Personal Preferences 35 | 'useProjectConfigFile' => true, 36 | 'sendPoweredByHeader' => false, 37 | 'enableCsrfProtection' => true, 38 | ], 39 | 40 | // Dev environment settings 41 | 'dev' => [ 42 | // Dev Mode (see https://craftcms.com/guides/what-dev-mode-does) 43 | 'devMode' => true, 44 | 45 | // Prevent crawlers from indexing pages and following links 46 | 'disallowRobots' => true, 47 | 48 | // Disable {% cache %} tags 49 | 'enableTemplateCaching' => false, 50 | ], 51 | 52 | // Staging environment settings 53 | 'staging' => [ 54 | // Set this to `false` to prevent administrative changes from being made on Staging 55 | 'allowAdminChanges' => true, 56 | 57 | // Don’t allow updates on Staging 58 | 'allowUpdates' => false, 59 | 60 | // Prevent crawlers from indexing pages and following links 61 | 'disallowRobots' => true, 62 | ], 63 | 64 | // Production environment settings 65 | 'production' => [ 66 | // Set this to `false` to prevent administrative changes from being made on Production 67 | 'allowAdminChanges' => true, 68 | 69 | // Don’t allow updates on Production 70 | 'allowUpdates' => false, 71 | ], 72 | ]; 73 | -------------------------------------------------------------------------------- /src/css/craft-index.scss: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | font-size: 16px; 4 | -webkit-text-size-adjust: 100%; 5 | height: 100%; 6 | font-family: system-ui, BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", 7 | "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; 8 | } 9 | 10 | body { 11 | margin: 0; 12 | padding: 0; 13 | background-color: hsl(212, 60%, 97%); 14 | color: hsl(209, 18%, 30%); 15 | display: flex; 16 | } 17 | 18 | h1 { 19 | margin-top: 0; 20 | } 21 | 22 | h2 { 23 | margin-top: 24px; 24 | font-size: 1em; 25 | } 26 | 27 | h2:first-child { 28 | margin-top: 0; 29 | } 30 | 31 | p { 32 | line-height: 1.4em; 33 | margin-bottom: 1.4em; 34 | } 35 | 36 | ul { 37 | line-height: 1.3em; 38 | padding-left: 20px; 39 | margin-bottom: 0; 40 | } 41 | 42 | ul li { 43 | margin-bottom: 0.35em; 44 | } 45 | 46 | a { 47 | color: #0b69a3; 48 | text-decoration: none; 49 | } 50 | 51 | a:hover { 52 | text-decoration: underline; 53 | } 54 | 55 | .go { 56 | color: #0b69a3; 57 | } 58 | 59 | .go:after { 60 | padding-left: 4px; 61 | content: "→"; 62 | text-decoration: none !important; 63 | } 64 | 65 | small { 66 | color: hsl(211, 11%, 59%); 67 | } 68 | 69 | code { 70 | display: inline-block; 71 | color: #ef4e4e; 72 | padding: 0 2px; 73 | background: hsl(212, 60%, 97%); 74 | border-radius: 3px; 75 | line-height: 1.3; 76 | font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; 77 | font-size: 0.9em; 78 | } 79 | 80 | #container { 81 | flex-grow: 1; 82 | } 83 | 84 | #modal { 85 | background: #fff; 86 | } 87 | 88 | #aside { 89 | background: hsl(212, 60%, 97%); 90 | } 91 | 92 | .content { 93 | padding: 35px; 94 | padding-left: calc(35px + env(safe-area-inset-left)); 95 | padding-right: calc(35px + env(safe-area-inset-right)); 96 | } 97 | 98 | @media (min-width: 768px) { 99 | #modal { 100 | display: flex; 101 | } 102 | 103 | #main { 104 | width: 50%; 105 | overflow: auto; 106 | } 107 | 108 | #aside { 109 | width: 50%; 110 | overflow: auto; 111 | } 112 | } 113 | 114 | @media (min-width: 768px) and (min-height: 376px) { 115 | body { 116 | background-color: hsl(212, 50%, 93%); 117 | // background-image: url("{{ view.getAssetManager().getPublishedUrl('@app/web/assets/installer/dist', true, 'images/installer-bg.png') }}"); 118 | background-repeat: no-repeat; 119 | background-size: cover; 120 | background-position: center center; 121 | } 122 | 123 | #container { 124 | display: flex; 125 | padding: 24px; 126 | align-items: center; 127 | justify-content: center; 128 | } 129 | 130 | #modal { 131 | height: 100%; 132 | max-width: 800px; 133 | max-height: 525px; 134 | border-radius: 4px; 135 | overflow: auto; 136 | box-shadow: 0 25px 100px rgba(0, 0, 0, 0.5); 137 | } 138 | 139 | #aside { 140 | overflow: auto; 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /wpconfig/webpack.common.js: -------------------------------------------------------------------------------- 1 | const paths = require("./paths") 2 | const webpack = require("webpack") 3 | const { WebpackManifestPlugin } = require("webpack-manifest-plugin") 4 | const WebpackBar = require("webpackbar") 5 | 6 | module.exports = { 7 | // Entry points for your application will create bundles named the same way 8 | entry: { 9 | app: [paths.src + "/app.js"], 10 | }, 11 | 12 | output: { 13 | path: paths.build, 14 | publicPath: "/", 15 | filename: 'js/[name].bundle.js', 16 | chunkFilename: 'js/[name].bundle.js', 17 | library: "craft3", 18 | clean: true, 19 | }, 20 | 21 | resolve: { 22 | fallback: { "fs": false }, 23 | modules: [ "node_modules" ] 24 | }, 25 | 26 | plugins: [ 27 | new WebpackBar({ fancy: true, profile: true }), 28 | 29 | // Provide jQuery in a custom plugin 30 | new webpack.ProvidePlugin({ 31 | $: "jquery", 32 | jQuery: "jquery", 33 | }), 34 | 35 | // Generates a manifest.json file for use in Craft CMS with Twigpack 36 | new WebpackManifestPlugin(), 37 | ], 38 | 39 | // Determine how modules within the project are treated 40 | module: { 41 | rules: [ 42 | // Create a separate jQuery chunk 43 | { 44 | test: require.resolve("jquery"), 45 | loader: "expose-loader", 46 | options: { 47 | exposes: [ 48 | { 49 | globalName: "$", 50 | moduleLocalName: "jquery", 51 | override: true, 52 | }, 53 | { 54 | globalName: "jQuery", 55 | moduleLocalName: "jquery", 56 | override: true, 57 | }, 58 | ] 59 | }, 60 | }, 61 | { 62 | test: /\.js$/, 63 | exclude: /node_modules/, 64 | use: ["babel-loader"] 65 | }, 66 | { 67 | test: /\.svg(\?.*)?$/, 68 | use: [ 69 | "svg-url-loader", 70 | "svg-transform-loader" 71 | ] 72 | }, 73 | { 74 | test: /\.(scss|css)$/, 75 | use: [ 76 | "style-loader", 77 | { 78 | loader: "css-loader", 79 | options: { 80 | importLoaders: 2, 81 | } 82 | }, 83 | { loader: "postcss-loader" }, 84 | { loader: "svg-transform-loader/encode-query" }, 85 | { 86 | loader: "sass-loader", 87 | options: { 88 | sourceMap: true, 89 | implementation: require("sass"), 90 | } 91 | }, 92 | ], 93 | }, 94 | { 95 | test: /\.(?:ico|gif|png|jpg|jpeg)$/i, 96 | type: "asset/inline", 97 | loader: "file-loader", 98 | options: { 99 | outputPath: "images", 100 | }, 101 | }, 102 | { 103 | test: /\.(woff(2)?|eot|ttf|otf)$/, 104 | type: "asset/inline" 105 | }, 106 | ], 107 | }, 108 | } 109 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "craft3-webpack5-tailwind2-boilerplate", 3 | "description": "A real-world boilerplate for Craft CMS 3 projects that leverages Wepback 5, Tailwind 2, PostCSS 8, and has a hot-reload dev environment.", 4 | "version": "1.0.3", 5 | "main": "app.js", 6 | "license": "MIT", 7 | "keywords": [ 8 | "craft cms", 9 | "craft cms 3", 10 | "webpack", 11 | "webpack 5", 12 | "tailwind", 13 | "tailwind 2", 14 | "postcss 8", 15 | "babel", 16 | "hmr" 17 | ], 18 | "maintainers": [ 19 | { 20 | "name": "Tammy Shipps", 21 | "email": "mizziness@gmail.com", 22 | "web": "https://www.atomicpink.com" 23 | } 24 | ], 25 | "scripts": { 26 | "clean": "./craft clear-caches/all && ./craft cache/flush-all", 27 | "clean:dist": "rm -rf ./web/dist/*", 28 | "clean:all": "yarn run clean:dist && yarn run clean", 29 | "dev": "yarn run clean:dist && cross-env NODE_ENV=development --max_old_space_size=8096 webpack serve --mode development --config ./wpconfig/webpack.dev.js", 30 | "build": "yarn run clean:dist && cross-env NODE_ENV=production webpack --mode production --config ./wpconfig/webpack.prod.js", 31 | "stats": "yarn run clean:dist && cross-env NODE_ENV=production webpack --mode production --config ./wpconfig/webpack.prod.js --profile --json stats.json" 32 | }, 33 | "devDependencies": { 34 | "@babel/core": "^7.14.0", 35 | "@babel/plugin-proposal-class-properties": "^7.14.5", 36 | "@babel/plugin-syntax-dynamic-import": "^7.8.3", 37 | "@babel/plugin-transform-runtime": "^7.13.15", 38 | "@babel/preset-env": "^7.12.1", 39 | "@babel/runtime-corejs3": "^7.14.0", 40 | "autoprefixer": "^10.2.5", 41 | "babel-loader": "^8.2.2", 42 | "core-js": "^3.11.2", 43 | "cross-env": "^7.0.2", 44 | "css-loader": "^6.4.0", 45 | "css-minimizer-webpack-plugin": "^3.0.2", 46 | "dotenv": "^10.0.0", 47 | "expose-loader": "^3.1.0", 48 | "fibers": "^5.0.0", 49 | "file-loader": "^6.2.0", 50 | "html-webpack-plugin": "^5.0.0-alpha.7", 51 | "mini-css-extract-plugin": "^2.4.3", 52 | "postcss": "^8.1.14", 53 | "postcss-import": "^14.0.1", 54 | "postcss-loader": "^6.2.0", 55 | "postcss-preset-env": "^6.7.0", 56 | "sass": "^1.32.11", 57 | "sass-loader": "^12.2.0", 58 | "style-loader": "^3.3.1", 59 | "svg-transform-loader": "^2.0.13", 60 | "svg-url-loader": "^7.1.1", 61 | "terser-webpack-plugin": "^5.1.1", 62 | "webpack": "^5.51.1", 63 | "webpack-bundle-analyzer": "^4.4.1", 64 | "webpack-cli": "^4.8.0", 65 | "webpack-dev-middleware": "^5.0.0", 66 | "webpack-dev-server": "^4.0.0", 67 | "webpack-manifest-plugin": "^4.0.2", 68 | "webpack-merge": "^5.2.0", 69 | "webpackbar": "^5.0.0-3" 70 | }, 71 | "dependencies": { 72 | "jquery": "3.6.0", 73 | "regenerator-runtime": "^0.13.7", 74 | "tailwindcss": "^2.2.16" 75 | }, 76 | "resolutions": { 77 | "chokidar": "^3.4.0", 78 | "css-what": "^5.0.1", 79 | "urijs": "^1.19.7", 80 | "set-value": "^4.0.1" 81 | }, 82 | "browserslist": [ 83 | "> 1%", 84 | "last 2 versions", 85 | "not ie <= 8" 86 | ] 87 | } 88 | -------------------------------------------------------------------------------- /wpconfig/webpack.dev.js: -------------------------------------------------------------------------------- 1 | const paths = require("./paths") 2 | const webpack = require("webpack") 3 | const common = require("./webpack.common.js") 4 | const { merge } = require("webpack-merge") 5 | const { WebpackManifestPlugin } = require("webpack-manifest-plugin") 6 | const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin 7 | 8 | module.exports = merge(common, { 9 | mode: "development", 10 | target: "web", 11 | devtool: "source-map", 12 | stats: "normal", 13 | cache: false, 14 | infrastructureLogging: { 15 | colors: true, 16 | level: "verbose", 17 | }, 18 | output: { 19 | publicPath: "https://localhost:8080/", 20 | }, 21 | 22 | // Spin up a server for quick development 23 | devServer: { 24 | https: true, 25 | historyApiFallback: false, 26 | watchFiles: [paths.src, paths.build, paths.templates], 27 | hot: 'only', 28 | port: 8080, 29 | host: "localhost", 30 | headers: { 31 | "Access-Control-Allow-Origin": "*", 32 | "Access-Control-Allow-Headers": "*", 33 | "Access-Control-Allow-Methods": "*", 34 | }, 35 | // Add your local domains to allow access 36 | allowedHosts: [ 37 | "localhost", 38 | ".local", 39 | "craft.local" 40 | ], 41 | // Denote the templates and src folders as static content to watch 42 | static: [ 43 | { 44 | directory: paths.templates, 45 | serveIndex: false, 46 | watch: true, 47 | }, 48 | { 49 | directory: paths.src, 50 | serveIndex: false, 51 | watch: true, 52 | }, 53 | { 54 | directory: paths.webpack, 55 | serveIndex: false, 56 | watch: true, 57 | } 58 | ], 59 | }, 60 | 61 | module: { 62 | rules: [ 63 | { 64 | test: /\.js$/, 65 | exclude: /node_modules/, 66 | use: [ 67 | {loader: "babel-loader"} 68 | ], 69 | } 70 | ] 71 | }, 72 | 73 | plugins: [ 74 | // Yummy Hot Reloading in development only 75 | new webpack.HotModuleReplacementPlugin(), 76 | 77 | // Generates an HTML file from a template 78 | // Generates deprecation warning: https://github.com/jantimon/html-webpack-plugin/issues/1501 79 | // Uncomment this if you want to generate an html template file 80 | // Use this if you really want http://localhost:8080/ to serve *something*, and 81 | // uncomment the template line to include your own template that index.html uses 82 | // new HtmlWebpackPlugin({ 83 | // title: "Webpack 5 Boilerplate", 84 | // template: paths.src + "/template.html", // your template file 85 | // filename: "index.html", // output file 86 | // }), 87 | 88 | // Spits out the manifest json file so that Twigpack can get to it 89 | new WebpackManifestPlugin({ 90 | writeToFileEmit: true 91 | }), 92 | 93 | // Bundle Analyzer will spit out a stats.json file but not run in analyzer mode 94 | new BundleAnalyzerPlugin({ 95 | analyzerMode: "disabled", 96 | generateStatsFile: true 97 | }), 98 | ], 99 | 100 | // Creates our chunk-vendors file 101 | optimization: { 102 | splitChunks: { 103 | cacheGroups: { 104 | vendors: { 105 | name: "chunk-vendors", 106 | test: /[\\/]node_modules[\\/]/, 107 | priority: -10, 108 | chunks: "initial" 109 | }, 110 | common: { 111 | name: "chunk-common", 112 | minChunks: 2, 113 | priority: -20, 114 | chunks: "initial", 115 | reuseExistingChunk: true 116 | } 117 | } 118 | }, 119 | } 120 | }) 121 | -------------------------------------------------------------------------------- /templates/index.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Welcome to Craft CMS 7 | 8 | 9 | 10 | {{ craft.twigpack.includeCssModule("app.css") }} 11 | {% scss %} 12 | @media (min-width:768px) and (min-height: 376px) { 13 | body { 14 | background-image: url("{{ view.getAssetManager().getPublishedUrl('@app/web/assets/installer/dist', true, 'images/installer-bg.png') }}"); 15 | } 16 | } 17 | {% endscss %} 18 | 19 | 20 | 21 |
22 | 55 |
56 | 57 | {{ craft.twigpack.includeSafariNomoduleFix() }} 58 | {{ craft.twigpack.includeJsModule("chunk-vendors.js", true, { async: true, defer: true }) }} 59 | {# {{ craft.twigpack.includeJsModule("chunk-jquery.js", true, { async: true, defer: true }) }} #} 60 | {{ craft.twigpack.includeJsModule("app.js", true) }} 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /web/dist/css/app.5ffc61c009eba461cdce.css: -------------------------------------------------------------------------------- 1 | html{-webkit-text-size-adjust:100%;line-height:1.15;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,Helvetica,Arial,Apple Color Emoji,Segoe UI Emoji}hr{color:inherit;height:0}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{border:0 solid;-webkit-box-sizing:border-box;box-sizing:border-box}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#9ca3af;opacity:1}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9ca3af;opacity:1}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:-moz-focusring{outline:auto}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{color:inherit;line-height:inherit;padding:0}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}body,html{-webkit-text-size-adjust:100%;font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Oxygen,Fira Sans,Droid Sans,Helvetica Neue;font-size:16px;height:100%}body{background-color:#f3f7fc;color:#3f4d5a;display:-webkit-box;display:-ms-flexbox;display:flex;margin:0;padding:0}h1{margin-top:0}h2{font-size:1em;margin-top:24px}h2:first-child{margin-top:0}p{line-height:1.4em;margin-bottom:1.4em}ul{line-height:1.3em;margin-bottom:0;padding-left:20px}ul li{margin-bottom:.35em}a{color:#0b69a3;text-decoration:none}a:hover{text-decoration:underline}.go{color:#0b69a3}.go:after{content:"→";padding-left:4px;text-decoration:none!important}small{color:#8b96a2}code{background:#f3f7fc;border-radius:3px;color:#ef4e4e;display:inline-block;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:.9em;line-height:1.3;padding:0 2px}#container{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}#modal{background:#fff}#aside{background:#f3f7fc}.content{padding:35px calc(35px + env(safe-area-inset-right)) 35px calc(35px + env(safe-area-inset-left))}@media(min-width:768px){#modal{display:-webkit-box;display:-ms-flexbox;display:flex}#aside,#main{overflow:auto;width:50%}}@media(min-width:768px)and (min-height:376px){body{background-color:#e4edf6;background-position:50%;background-repeat:no-repeat;background-size:cover}#container{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;padding:24px}#modal{border-radius:4px;-webkit-box-shadow:0 25px 100px rgba(0,0,0,.5);box-shadow:0 25px 100px rgba(0,0,0,.5);height:100%;max-height:525px;max-width:800px}#aside,#modal{overflow:auto}}body{border:10px solid #10b981}.tw-mb-1{margin-bottom:.25rem!important}.tw-list-disc{list-style-type:disc!important}.tw-text-2xl{font-size:1.5rem!important;line-height:2rem!important}.tw-text-xl{font-size:1.25rem!important;line-height:1.75rem!important}.tw-font-bold{font-weight:700!important}.tw-font-semibold{font-weight:600!important} 2 | /*# sourceMappingURL=app.5ffc61c009eba461cdce.css.map*/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Craft CMS 3 Boilerplate 2 | **(with Webpack 5, Tailwind 2, PostCSS 8, and HMR, and other goodies)** 3 | 4 | A real-world boilerplate for Craft CMS 3 projects that leverages Wepback 5, Tailwind 2, PostCSS 8, and Twigpack. Also included is a hot-reload dev environment. I created this as a starting point for Craft CMS 3 / Webpack 5 projects. 5 | 6 | ### What's New 7 | 8 | This version of the project has a few significant changes, including updates to the framework and dependencies, better bundle performance in production, better asset chunking and support, and a starting point for your template structure. 9 | 10 | ### What's Included 11 | 12 | * [Craft CMS 3](https://github.com/craftcms/cms) - My CMS of choice, and the app which will consume assets from Webpack. 13 | * [Webpack 5](https://webpack.js.org/blog/2020-10-10-webpack-5-release/) - Bundling, optimizing, and serving your assets 14 | * [Twigpack](https://github.com/nystudio107/craft-twigpack) - The bridge between Craft CMS and Webpack 15 | * [TailwindCSS 2](https://tailwindcss.com) - Awesome CSS framework that makes dev speedy 16 | * [SASS](https://sass-lang.com/) - SASS/SCSS Support 17 | * [PostCSS](https://postcss.org/) - Post-processing CSS Files 18 | 19 | ### Other included tools/plugins 20 | #### Webpack 21 | * [`webpack`](https://github.com/webpack/webpack) - Module and asset bundler. 22 | * [`webpack-cli`](https://github.com/webpack/webpack-cli) - Command line interface for webpack 23 | * [`webpack-dev-server`](https://github.com/webpack/webpack-dev-server) - Development server for webpack 24 | * [`webpack-merge`](https://github.com/survivejs/webpack-merge) - Simplify development/production configuration 25 | * [`cross-env`](https://github.com/kentcdodds/cross-env) - Cross platform configuration 26 | 27 | #### Transpiling 28 | * [`@babel/core`](https://www.npmjs.com/package/@babel/core) - Transpile ES6+ to backwards compatible JavaScript 29 | * [`@babel/plugin-proposal-class-properties`](https://babeljs.io/docs/en/babel-plugin-proposal-class-properties) - Use properties directly on a class (an example Babel config) 30 | * [`@babel/plugin-syntax-dynamic-import`](https://babeljs.io/docs/en/babel-plugin-syntax-dynamic-import) - Dynamic module importing, support for promises 31 | * [`@babel/plugin-transform-runtime`](https://babeljs.io/docs/en/babel-plugin-transform-runtime) - Enables the re-use of Babel's injected helper code to save on codesize 32 | * [`@babel/preset-env`](https://babeljs.io/docs/en/babel-preset-env) - Smart defaults for Babel 33 | * [`babel-loader`](https://webpack.js.org/loaders/babel-loader/) - Transpile files with Babel and webpack 34 | 35 | #### Loaders, Sass, Plugins 36 | * [`sass-loader`](https://webpack.js.org/loaders/sass-loader/) - Load SCSS and compile to CSS 37 | * [`sass`](https://github.com/sass/dart-sass) - Dart Sass 38 | * [`fibers`](https://www.npmjs.com/package/fibers) - Increase Dart Sass performance (see [note here](https://github.com/sass/dart-sass/blob/master/README.md#javascript-api) 39 | * [`postcss-loader`](https://webpack.js.org/loaders/postcss-loader/) - Process CSS with PostCSS 40 | * [`postcss-preset-env`](https://www.npmjs.com/package/postcss-preset-env) - Sensible defaults for PostCSS 41 | * [`css-loader`](https://webpack.js.org/loaders/css-loader/) - Resolve CSS imports 42 | * [`style-loader`](https://webpack.js.org/loaders/style-loader/) - Inject CSS into the DOM 43 | * [`webpack-manifest-plugin`](https://www.npmjs.com/package/webpack-manifest-plugin) - Create Manifest.json file with chunks 44 | * [`html-webpack-plugin`](https://github.com/jantimon/html-webpack-plugin) - Generate HTML files from template 45 | * [`mini-css-extract-plugin`](https://github.com/webpack-contrib/mini-css-extract-plugin) - Extract CSS into separate files 46 | * [`css-minimizer-webpack-plugin`](https://webpack.js.org/plugins/css-minimizer-webpack-plugin/) - Optimize and minimize CSS assets 47 | * [`expose-loader`](https://webpack.js.org/loaders/expose-loader/) - Exposes modules to global scopes 48 | * [`core-js`](https://www.npmjs.com/package/core-js) - Modular JS library with polyfills for ECMAScript up to 2021, with conditional loading for better performance 49 | 50 | ### Get Started 51 | 52 | First, finish up installing Craft CMS locally for your development environment. The setup wizard will take you through providing your database credentials, and will also generate a new security key and App ID. 53 | 54 | ``` 55 | $ composer install 56 | $ ./craft setup/index 57 | ``` 58 | 59 | Then install our other packages and run the HMR development server: 60 | 61 | ``` 62 | $ yarn install 63 | $ yarn dev 64 | ``` 65 | (I use `yarn` for my project, but you don't need to - use the tool of your choice.) 66 | 67 | Webpack assets are set up to serve from `https://localhost:8080` by default. 68 | 69 | *Note:* The URL "https://localhost:8080" won't show anything by default, but if you prefer to have a page load, you can edit `wpconfig/webpack.dev.js` and uncomment the `new HtmlWebpackPlugin` code block. This will generate an `index.html` file along with your assets. 70 | 71 | You can include your chunked/hashed assets in Craft CMS templates by using [Twigpack](https://nystudio107.com/docs/twigpack/)'s features: 72 | 73 | ``` 74 | {{ craft.twigpack.includeCssModule("app.css", true) }} 75 | {{ craft.twigpack.includeJsModule("app.js", true, {"type": "module"}) }} 76 | {{ craft.twigpack.includeJsModule("chunk-vendors.js", true) }} 77 | ``` 78 | 79 | If you open up the included `templates/index.twig` file, you'll see that it has been edited to support Twigpack and our bundles. 80 | 81 | ### Scripts 82 | 83 | As you can see in the `package.json` file, there are 3 included scripts for convenience: 84 | 85 | clean": "./craft clear-caches/all && ./craft cache/flush-all", 86 | "clean:dist": "rm -rf ./web/dist/*", 87 | "clean:all": "yarn run clean:dist && yarn run clean", 88 | "dev": "yarn run clean:dist && cross-env NODE_ENV=development --max_old_space_size=8096 webpack serve --mode development --config ./wpconfig/webpack.dev.js", 89 | "build": "yarn run clean:dist && cross-env NODE_ENV=production webpack --mode production --config ./wpconfig/webpack.prod.js", 90 | "stats": 91 | 92 | * `yarn dev` - Runs the HMR development server 93 | * `yarn build` - Creates a production-ready build for deployment (asset output is in `web/dist`) 94 | * `yarn clean` - A quick way to clear Craft CMS caches while you code 95 | * `yarn clean:dist` - Clean out the the local build cache folder, `web/dist` 96 | * `yarn clean:all` - Clean both the Craft CMS cache and the local build cache folder 97 | 98 | ### Make it Yours 99 | 100 | This project comes pre-configured out of the box to work with Craft CMS templates, but there are plenty of ways you can customize the way this works to suit your own needs. It tries to make few assumptions about your toolkit, other than the minimum required configuration to work with the tools included. 101 | 102 | - Tailwind has been set up with with a default configuration, and I highly suggest modifying it for your project. (You can overwrite it with an existing `tailwind.config.js` file, if you have one, to import all your custom styling quickly.) 103 | - devServer options can be changed and extended as needed - for example, by default auto `open` for the served url is turned off, but if you're using a custom generated template, then you might want it on, instead. 104 | - Go to town! 105 | 106 | ### Prettier Webpack 107 | 108 | If you're like me and you prefer a cleaner webpack report, try this: 109 | 110 | `yarn add webpackbar -D` 111 | 112 | In the `wpconfig` files, you'll see two commented-out lines which you can uncomment to enable a much nicer view of your webpack report with [webpackbar](https://github.com/nuxt-contrib/webpackbar). 113 | 114 | ### Inspired By 115 | 116 | And used as a starting point: https://github.com/taniarascia/webpack-boilerplate 117 | 118 | ### License 119 | 120 | This project is open source and available under the [MIT License](https://github.com/taniarascia/webpack-boilerplate/blob/master/LICENSE). 121 | -------------------------------------------------------------------------------- /web/dist/js/app.5ffc61c009eba461cdce.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"js/app.5ffc61c009eba461cdce.js","mappings":"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","sources":["webpack://craft3/webpack/runtime/chunk loaded","webpack://craft3/./src/app.scss?67d8","webpack://craft3/./src/app.scss","webpack://craft3/webpack/bootstrap","webpack://craft3/webpack/runtime/compat get default export","webpack://craft3/webpack/runtime/define property getters","webpack://craft3/webpack/runtime/global","webpack://craft3/webpack/runtime/hasOwnProperty shorthand","webpack://craft3/webpack/runtime/make namespace object","webpack://craft3/webpack/runtime/jsonp chunk loading","webpack://craft3/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../node_modules/postcss-loader/dist/cjs.js!../node_modules/svg-transform-loader/encode-query.js!../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[9].use[0]!../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[9].use[1]!../node_modules/postcss-loader/dist/cjs.js!../node_modules/svg-transform-loader/encode-query.js!../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[9].use[4]!./app.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../node_modules/postcss-loader/dist/cjs.js!../node_modules/svg-transform-loader/encode-query.js!../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[9].use[0]!../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[9].use[1]!../node_modules/postcss-loader/dist/cjs.js!../node_modules/svg-transform-loader/encode-query.js!../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[9].use[4]!./app.scss\";\n export default content && content.locals ? content.locals : undefined;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkcraft3\"] = self[\"webpackChunkcraft3\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], () => (__webpack_require__(1793)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","self","forEach","bind","__webpack_exports__"],"sourceRoot":""} -------------------------------------------------------------------------------- /web/dist/js/app.5ffc61c009eba461cdce.es5.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"js/app.5ffc61c009eba461cdce.es5.js","mappings":"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","sources":["webpack://craft3/webpack/runtime/chunk loaded","webpack://craft3/./src/app.scss?67d8","webpack://craft3/./src/app.scss","webpack://craft3/webpack/bootstrap","webpack://craft3/webpack/runtime/compat get default export","webpack://craft3/webpack/runtime/define property getters","webpack://craft3/webpack/runtime/global","webpack://craft3/webpack/runtime/hasOwnProperty shorthand","webpack://craft3/webpack/runtime/make namespace object","webpack://craft3/webpack/runtime/jsonp chunk loading","webpack://craft3/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","\n import API from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../node_modules/postcss-loader/dist/cjs.js!../node_modules/svg-transform-loader/encode-query.js!../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[9].use[0]!../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[9].use[1]!../node_modules/postcss-loader/dist/cjs.js!../node_modules/svg-transform-loader/encode-query.js!../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[9].use[4]!./app.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[3].use[1]!../node_modules/postcss-loader/dist/cjs.js!../node_modules/svg-transform-loader/encode-query.js!../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[3].use[4]!../node_modules/mini-css-extract-plugin/dist/loader.js??ruleSet[1].rules[9].use[0]!../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[9].use[1]!../node_modules/postcss-loader/dist/cjs.js!../node_modules/svg-transform-loader/encode-query.js!../node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[9].use[4]!./app.scss\";\n export default content && content.locals ? content.locals : undefined;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkcraft3\"] = self[\"webpackChunkcraft3\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], () => (__webpack_require__(1793)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","self","forEach","bind","__webpack_exports__"],"sourceRoot":""} -------------------------------------------------------------------------------- /wpconfig/webpack.prod.js: -------------------------------------------------------------------------------- 1 | const common = require("./webpack.common.js") 2 | const { merge } = require("webpack-merge") 3 | 4 | const webpack = require("webpack") 5 | const MiniCssExtractPlugin = require("mini-css-extract-plugin") 6 | const CssMinimizerPlugin = require("css-minimizer-webpack-plugin") 7 | const { WebpackManifestPlugin } = require("webpack-manifest-plugin") 8 | const TerserPlugin = require("terser-webpack-plugin") 9 | 10 | var singleBundle = merge(common, { 11 | mode: "production", 12 | devtool: "source-map", // Change to false to disable 13 | name: "bundle", 14 | target: "web", 15 | output: { 16 | filename: "[name].[chunkhash].js", 17 | chunkFilename: "js/[name].[chunkhash].js", 18 | chunkLoading: "jsonp", 19 | environment: { module: false } 20 | }, 21 | resolve: { 22 | modules: [ "node_modules" ] 23 | }, 24 | module: { 25 | rules: [ 26 | { 27 | test: require.resolve("jquery"), 28 | loader: "expose-loader", 29 | options: { 30 | exposes: ["$", "jQuery"] 31 | }, 32 | }, 33 | { 34 | test: /\.js$/, 35 | exclude: /(node_modules)/, 36 | use: { 37 | loader: "babel-loader", 38 | options: { 39 | presets: [ 40 | ["@babel/preset-env", { 41 | targets: { esmodules: true }, //For ES6 supporting browsers 42 | useBuiltIns: false 43 | }], 44 | ], 45 | plugins: [ 46 | ["@babel/plugin-proposal-class-properties"], 47 | ["@babel/plugin-transform-runtime", { "corejs": 3 }], 48 | ["@babel/plugin-syntax-dynamic-import"] 49 | ], 50 | }, 51 | } 52 | }, 53 | { 54 | test: /\.svg(\?.*)?$/, 55 | use: [ 56 | "svg-url-loader", 57 | "svg-transform-loader" 58 | ] 59 | }, 60 | { 61 | test: /\.(scss|css)$/, 62 | use: [ 63 | MiniCssExtractPlugin.loader, 64 | { 65 | loader: "css-loader", 66 | options: { 67 | importLoaders: 2, 68 | } 69 | }, 70 | { loader: "postcss-loader" }, 71 | { loader: "svg-transform-loader/encode-query" }, 72 | { 73 | loader: "sass-loader", 74 | options: { 75 | sourceMap: true, 76 | implementation: require("sass"), 77 | } 78 | }, 79 | ], 80 | }, 81 | { 82 | test: /\.(?:ico|gif|png|jpg|jpeg)$/i, 83 | type: "asset/inline", 84 | loader: "file-loader", 85 | options: { 86 | outputPath: "images", 87 | }, 88 | }, 89 | { 90 | test: /\.(woff(2)?|eot|ttf|otf)$/, 91 | type: "asset/inline" 92 | }, 93 | ] 94 | }, 95 | plugins: [ 96 | new MiniCssExtractPlugin({ 97 | filename: "[name].[chunkhash].css" 98 | }), 99 | new WebpackManifestPlugin({ 100 | fileName: "manifest.json", 101 | }), 102 | ], 103 | optimization: { 104 | splitChunks: { 105 | cacheGroups: { 106 | vendors: { 107 | name: "chunk-vendors", 108 | test: /[\\/]node_modules[\\/]/, 109 | priority: -10, 110 | chunks: "initial" 111 | }, 112 | } 113 | }, 114 | runtimeChunk: { 115 | name: "chunk-vendors", 116 | }, 117 | minimize: true, 118 | minimizer: [ 119 | new CssMinimizerPlugin({ 120 | minimizerOptions: { 121 | preset: [ 122 | "default", 123 | { 124 | discardComments: { removeAll: true }, 125 | }, 126 | ], 127 | }, 128 | }), 129 | new TerserPlugin({ 130 | terserOptions: { 131 | format: { 132 | comments: false, 133 | }, 134 | }, 135 | extractComments: false, 136 | }), 137 | ], 138 | }, 139 | performance: { 140 | hints: false, 141 | } 142 | }); 143 | 144 | // Use a common object between the bundles so we used the same 145 | // generated CSS for both instead of making it twice. 146 | let MANIFEST_SEED = {} 147 | 148 | var legacyBundle = merge(common, { 149 | mode: "production", 150 | devtool: "source-map", // Change to false to disable 151 | name: "legacy-bundle", 152 | target: "web", 153 | output: { 154 | filename: "js/[name].[chunkhash].es5.js", 155 | chunkFilename: "js/[name].[chunkhash].es5.js", 156 | chunkLoading: "jsonp", 157 | clean: false, 158 | environment: { module: false } 159 | }, 160 | module: { 161 | rules: [ 162 | { 163 | test: require.resolve("jquery"), 164 | loader: "expose-loader", 165 | options: { 166 | exposes: ["$", "jQuery"] 167 | }, 168 | }, 169 | { 170 | test: /\.js$/, 171 | exclude: /(node_modules)/, 172 | use: { 173 | loader: 'babel-loader', 174 | options: { 175 | presets: [ 176 | ["@babel/preset-env", { 177 | targets: { browsers: ["safari >= 7"] }, 178 | bugfixes: true, 179 | modules: false, 180 | useBuiltIns: 'usage', 181 | corejs: 3, 182 | }, 183 | ], 184 | ], 185 | plugins: [ 186 | ["@babel/plugin-proposal-class-properties"], 187 | ["@babel/plugin-transform-runtime", { "corejs": 3 }], 188 | ["@babel/plugin-syntax-dynamic-import"] 189 | ], 190 | }, 191 | } 192 | }, 193 | { 194 | test: /\.svg(\?.*)?$/, 195 | use: [ 196 | "svg-url-loader", 197 | "svg-transform-loader" 198 | ] 199 | }, 200 | { 201 | test: /\.(scss|css)$/, 202 | use: [ 203 | { 204 | loader: MiniCssExtractPlugin.loader, 205 | options: { 206 | emit: true 207 | } 208 | }, 209 | { 210 | loader: "css-loader", 211 | options: { 212 | importLoaders: 2, 213 | } 214 | }, 215 | { loader: "postcss-loader" }, 216 | { loader: "svg-transform-loader/encode-query" }, 217 | { 218 | loader: "sass-loader", 219 | options: { 220 | sourceMap: true, 221 | implementation: require("sass"), 222 | } 223 | }, 224 | ], 225 | }, 226 | { 227 | test: /\.(?:ico|gif|png|jpg|jpeg)$/i, 228 | type: "asset/inline", 229 | loader: "file-loader", 230 | options: { 231 | outputPath: "images", 232 | }, 233 | }, 234 | { 235 | test: /\.(woff(2)?|eot|ttf|otf)$/, 236 | type: "asset/inline" 237 | }, 238 | ], 239 | }, 240 | resolve: { 241 | modules: [ "node_modules" ] 242 | }, 243 | plugins: [ 244 | new webpack.ProvidePlugin({ 245 | $: "jquery", 246 | jQuery: "jquery", 247 | }), 248 | new MiniCssExtractPlugin({ 249 | filename: "css/[name].[chunkhash].css", 250 | }), 251 | new WebpackManifestPlugin({ 252 | fileName: "manifest-legacy.json", 253 | seed: MANIFEST_SEED, 254 | }), 255 | ], 256 | optimization: { 257 | removeEmptyChunks: true, 258 | providedExports: true, 259 | splitChunks: { 260 | chunks: "initial", 261 | hidePathInfo: true, 262 | cacheGroups: { 263 | jquery: { 264 | name: "chunk-jquery", 265 | reuseExistingChunk: true, 266 | test: /[\\/]node_modules[\\/]jquery[\\/]/, 267 | priority: 10, 268 | filename: "js/[name].[chunkhash].es5.js" 269 | }, 270 | vendors: { 271 | name: "chunk-vendors", 272 | reuseExistingChunk: true, 273 | test: /[\\/]node_modules[\\/]/, 274 | priority: -10, 275 | filename: "js/[name].[chunkhash].es5.js" 276 | }, 277 | } 278 | }, 279 | usedExports: true, 280 | minimize: true, 281 | minimizer: [ 282 | new CssMinimizerPlugin({ 283 | minimizerOptions: { 284 | preset: [ 285 | "default", 286 | { 287 | discardComments: { removeAll: true }, 288 | }, 289 | ], 290 | }, 291 | }), 292 | new TerserPlugin({ 293 | terserOptions: { 294 | format: { 295 | comments: false, 296 | }, 297 | }, 298 | extractComments: false, 299 | }), 300 | ], 301 | }, 302 | performance: { 303 | hints: "warning", 304 | maxEntrypointSize: 512000, 305 | maxAssetSize: 512000, 306 | }, 307 | }); 308 | 309 | var modernBundle = merge(common, { 310 | mode: "production", 311 | devtool: "source-map", // Change to false to disable 312 | name: "modern-bundle", 313 | target: "web", 314 | output: { 315 | filename: "js/[name].[chunkhash].js", 316 | chunkFilename: "js/[name].[chunkhash].js", 317 | chunkLoading: "jsonp", 318 | clean: false, 319 | environment: { module: false } 320 | }, 321 | module: { 322 | rules: [ 323 | { 324 | test: require.resolve("jquery"), 325 | loader: "expose-loader", 326 | options: { 327 | exposes: ["$", "jQuery"] 328 | }, 329 | }, 330 | { 331 | test: /\.js$/, 332 | exclude: /(node_modules)/, 333 | use: { 334 | loader: "babel-loader", 335 | options: { 336 | presets: [ 337 | ["@babel/preset-env", { 338 | targets: { esmodules: true }, //For ES6 supporting browsers 339 | useBuiltIns: false 340 | }], 341 | ], 342 | plugins: [ 343 | ["@babel/plugin-proposal-class-properties"], 344 | ["@babel/plugin-transform-runtime", { "corejs": 3 }], 345 | ["@babel/plugin-syntax-dynamic-import"] 346 | ], 347 | }, 348 | } 349 | }, 350 | { 351 | test: /\.svg(\?.*)?$/, 352 | use: [ 353 | "svg-url-loader", 354 | "svg-transform-loader" 355 | ] 356 | }, 357 | { 358 | test: /\.(scss|css)$/, 359 | use: [ 360 | { 361 | loader: MiniCssExtractPlugin.loader, 362 | options: { 363 | emit: true 364 | } 365 | }, 366 | { 367 | loader: "css-loader", 368 | options: { 369 | importLoaders: 2, 370 | } 371 | }, 372 | { loader: "postcss-loader" }, 373 | { loader: "svg-transform-loader/encode-query" }, 374 | { 375 | loader: "sass-loader", 376 | options: { 377 | sourceMap: true, 378 | implementation: require("sass"), 379 | } 380 | }, 381 | ], 382 | }, 383 | { 384 | test: /\.(?:ico|gif|png|jpg|jpeg)$/i, 385 | type: "asset/inline", 386 | loader: "file-loader", 387 | options: { 388 | outputPath: "images", 389 | }, 390 | }, 391 | { 392 | test: /\.(woff(2)?|eot|ttf|otf)$/, 393 | type: "asset/inline" 394 | }, 395 | ], 396 | }, 397 | resolve: { 398 | modules: [ "node_modules" ] 399 | }, 400 | plugins: [ 401 | new webpack.ProvidePlugin({ 402 | $: "jquery", 403 | jQuery: "jquery", 404 | }), 405 | new MiniCssExtractPlugin({ 406 | filename: "css/[name].[chunkhash].css" 407 | }), 408 | new WebpackManifestPlugin({ 409 | fileName: "manifest.json", 410 | // seed: MANIFEST_SEED, 411 | filter: ({name, path}) => !name.match(/es5/gi) || !path.match(/es5/gi), 412 | }), 413 | ], 414 | optimization: { 415 | removeEmptyChunks: true, 416 | providedExports: true, 417 | splitChunks: { 418 | chunks: "initial", 419 | hidePathInfo: true, 420 | cacheGroups: { 421 | jquery: { 422 | name: "chunk-jquery", 423 | reuseExistingChunk: true, 424 | test: /[\\/]node_modules[\\/]jquery[\\/]/, 425 | priority: 10, 426 | filename: "js/[name].[chunkhash].js" 427 | }, 428 | vendors: { 429 | name: "chunk-vendors", 430 | reuseExistingChunk: true, 431 | test: /[\\/]node_modules[\\/]/, 432 | priority: -10, 433 | filename: "js/[name].[chunkhash].js" 434 | }, 435 | } 436 | }, 437 | usedExports: true, 438 | minimize: true, 439 | minimizer: [ 440 | new CssMinimizerPlugin({ 441 | minimizerOptions: { 442 | preset: [ 443 | "default", 444 | { 445 | discardComments: { removeAll: true }, 446 | }, 447 | ], 448 | }, 449 | }), 450 | new TerserPlugin({ 451 | terserOptions: { 452 | format: { 453 | comments: false, 454 | }, 455 | }, 456 | extractComments: false, 457 | }), 458 | ], 459 | }, 460 | performance: { 461 | hints: "warning", 462 | maxEntrypointSize: 512000, 463 | maxAssetSize: 512000, 464 | }, 465 | }); 466 | 467 | // module.exports = [ singleBundle ]; 468 | module.exports = [ legacyBundle, modernBundle, ]; 469 | 470 | -------------------------------------------------------------------------------- /web/dist/css/app.5ffc61c009eba461cdce.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"css/app.5ffc61c009eba461cdce.css","mappings":"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","sources":["webpack://craft3/app.5ffc61c009eba461cdce.css"],"sourcesContent":["/*! tailwindcss v2.2.19 | MIT License | https://tailwindcss.com *//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n::before,\n::after {\n\t-webkit-box-sizing: border-box;\n\t box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\nhtml {\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\t tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n\tline-height: 1.15; /* 1 */\n\t-webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n\tmargin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n\tfont-family:\n\t\tsystem-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, \n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n\theight: 0; /* 1 */\n\tcolor: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n\t-webkit-text-decoration: underline dotted;\n\t text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n\tfont-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n\tfont-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n\tfont-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n\tfont-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n\ttext-indent: 0; /* 1 */\n\tborder-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tfont-family: inherit; /* 1 */\n\tfont-size: 100%; /* 1 */\n\tline-height: 1.15; /* 1 */\n\tmargin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n\ttext-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n\t-webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n\tborder-style: none;\n\tpadding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n\toutline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n\tbox-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n\tpadding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n\tvertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n\theight: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n\t-webkit-appearance: textfield; /* 1 */\n\toutline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n\t-webkit-appearance: button; /* 1 */\n\tfont: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n\tdisplay: list-item;\n}/**\n * Manually forked from SUIT CSS Base: https://github.com/suitcss/base\n * A thin layer on top of normalize.css that provides a starting point more\n * suitable for web applications.\n */\n\n/**\n * Removes the default spacing and border for appropriate elements.\n */\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nbutton {\n background-color: transparent;\n background-image: none;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nol,\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/**\n * Tailwind custom reset styles\n */\n\n/**\n * 1. Use the user's configured `sans` font-family (with Tailwind's default\n * sans-serif font stack as a fallback) as a sane default.\n * 2. Use Tailwind's default \"normal\" line-height so the user isn't forced\n * to override it to ensure consistency even when using the default theme.\n */\n\nhtml {\n font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 1 */\n line-height: 1.5; /* 2 */\n}\n\n\n/**\n * Inherit font-family and line-height from `html` so users can set them as\n * a class directly on the `html` element.\n */\n\nbody {\n font-family: inherit;\n line-height: inherit;\n}\n\n/**\n * 1. Prevent padding and border from affecting element width.\n *\n * We used to set this in the html element and inherit from\n * the parent element for everything else. This caused issues\n * in shadow-dom-enhanced elements like
where the content\n * is wrapped by a div with box-sizing set to `content-box`.\n *\n * https://github.com/mozdevs/cssremedy/issues/4\n *\n *\n * 2. Allow adding a border to an element by just adding a border-width.\n *\n * By default, the way the browser specifies that an element should have no\n * border is by setting it's border-style to `none` in the user-agent\n * stylesheet.\n *\n * In order to easily add borders to elements by just setting the `border-width`\n * property, we change the default border-style for all elements to `solid`, and\n * use border-width to hide them instead. This way our `border` utilities only\n * need to set the `border-width` property instead of the entire `border`\n * shorthand, making our border utilities much more straightforward to compose.\n *\n * https://github.com/tailwindcss/tailwindcss/pull/116\n */\n\n*,\n::before,\n::after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: currentColor; /* 2 */\n}\n\n/*\n * Ensure horizontal rules are visible by default\n */\n\nhr {\n border-top-width: 1px;\n}\n\n/**\n * Undo the `border-style: none` reset that Normalize applies to images so that\n * our `border-{width}` utilities have the expected effect.\n *\n * The Normalize reset is unnecessary for us since we default the border-width\n * to 0 on all elements.\n *\n * https://github.com/tailwindcss/tailwindcss/issues/362\n */\n\nimg {\n border-style: solid;\n}\n\ntextarea {\n resize: vertical;\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n opacity: 1;\n color: #9ca3af;\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: #9ca3af;\n}\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/**\n * Override legacy focus reset from Normalize with modern Firefox focus styles.\n *\n * This is actually an improvement over the new defaults in Firefox in our testing,\n * as it triggers the better focus styles even for links, which still use a dotted\n * outline in Firefox by default.\n */\n \n:-moz-focusring {\n\toutline: auto;\n}\n\ntable {\n border-collapse: collapse;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/**\n * Reset links to optimize for opt-in styling instead of\n * opt-out.\n */\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/**\n * Reset form element properties that are easy to forget to\n * style explicitly so you don't inadvertently introduce\n * styles that deviate from your design system. These styles\n * supplement a partial reset that is already applied by\n * normalize.css.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n padding: 0;\n line-height: inherit;\n color: inherit;\n}\n\n/**\n * Use the configured 'mono' font family for elements that\n * are expected to be rendered with a monospace font, falling\n * back to the system monospace stack if there is no configured\n * 'mono' font family.\n */\n\npre,\ncode,\nkbd,\nsamp {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n/**\n * 1. Make replaced elements `display: block` by default as that's\n * the behavior you want almost all of the time. Inspired by\n * CSS Remedy, with `svg` added as well.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n * \n * 2. Add `vertical-align: middle` to align replaced elements more\n * sensibly by default when overriding `display` by adding a\n * utility like `inline`.\n *\n * This can trigger a poorly considered linting error in some\n * tools but is included by design.\n * \n * https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210\n */\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/**\n * Constrain images and videos to the parent width and preserve\n * their intrinsic aspect ratio.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/**\n * Ensure the default browser behavior of the `hidden` attribute.\n */\n\n[hidden] {\n display: none;\n}html,body{font-size:16px;-webkit-text-size-adjust:100%;height:100%;font-family:system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif,BlinkMacSystemFont,-apple-system,\"Segoe UI\",\"Roboto\",\"Oxygen\",\"Ubuntu\",\"Cantarell\",\"Fira Sans\",\"Droid Sans\",\"Helvetica Neue\",sans-serif}body{margin:0;padding:0;background-color:#f3f7fc;color:#3f4d5a;display:-webkit-box;display:-ms-flexbox;display:flex}h1{margin-top:0}h2{margin-top:24px;font-size:1em}h2:first-child{margin-top:0}p{line-height:1.4em;margin-bottom:1.4em}ul{line-height:1.3em;padding-left:20px;margin-bottom:0}ul li{margin-bottom:.35em}a{color:#0b69a3;text-decoration:none}a:hover{text-decoration:underline}.go{color:#0b69a3}.go:after{padding-left:4px;content:\"→\";text-decoration:none !important}small{color:#8b96a2}code{display:inline-block;color:#ef4e4e;padding:0 2px;background:#f3f7fc;border-radius:3px;line-height:1.3;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:.9em}#container{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}#modal{background:#fff}#aside{background:#f3f7fc}.content{padding:35px;padding-left:calc(35px + env(safe-area-inset-left));padding-right:calc(35px + env(safe-area-inset-right))}@media(min-width: 768px){#modal{display:-webkit-box;display:-ms-flexbox;display:flex}#main{width:50%;overflow:auto}#aside{width:50%;overflow:auto}}@media(min-width: 768px)and (min-height: 376px){body{background-color:#e4edf6;background-repeat:no-repeat;background-size:cover;background-position:center center}#container{display:-webkit-box;display:-ms-flexbox;display:flex;padding:24px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}#modal{height:100%;max-width:800px;max-height:525px;border-radius:4px;overflow:auto;-webkit-box-shadow:0 25px 100px rgba(0,0,0,.5);box-shadow:0 25px 100px rgba(0,0,0,.5)}#aside{overflow:auto}}body{border:10px solid #10b981}.tw-mb-1 {\n\tmargin-bottom: 0.25rem !important;\n}.tw-list-disc {\n\tlist-style-type: disc !important;\n}.tw-text-2xl {\n\tfont-size: 1.5rem !important;\n\tline-height: 2rem !important;\n}.tw-text-xl {\n\tfont-size: 1.25rem !important;\n\tline-height: 1.75rem !important;\n}.tw-font-bold {\n\tfont-weight: 700 !important;\n}.tw-font-semibold {\n\tfont-weight: 600 !important;\n}\n"],"names":[],"sourceRoot":""} --------------------------------------------------------------------------------