├── database ├── .gitignore ├── seeds │ └── DatabaseSeeder.php ├── factories │ └── UserFactory.php └── migrations │ ├── 2014_10_12_100000_create_password_resets_table.php │ └── 2014_10_12_000000_create_users_table.php ├── bootstrap ├── cache │ └── .gitignore └── app.php ├── public ├── robots.txt ├── img │ ├── controls.png │ ├── favicon.png │ └── logo-prismic.svg ├── mix-manifest.json ├── .htaccess └── index.php ├── storage ├── app │ ├── public │ │ └── .gitignore │ └── .gitignore └── framework │ ├── cache │ └── .gitignore │ ├── testing │ └── .gitignore │ ├── views │ └── .gitignore │ ├── sessions │ └── .gitignore │ └── .gitignore ├── resources ├── assets │ ├── sass │ │ ├── partials │ │ │ ├── slices │ │ │ │ ├── _image-gallery.scss │ │ │ │ ├── _video.scss │ │ │ │ ├── _gallery.scss │ │ │ │ ├── _banner.scss │ │ │ │ ├── _highlight-section.scss │ │ │ │ ├── _text-section.scss │ │ │ │ └── _quote-banner.scss │ │ │ ├── _module.scss │ │ │ ├── _footer.scss │ │ │ └── _header.scss │ │ ├── layouts │ │ │ ├── _module.scss │ │ │ └── _general.scss │ │ ├── vendor │ │ │ ├── _module.scss │ │ │ └── _lightslider.css │ │ ├── views │ │ │ ├── _module.scss │ │ │ └── _homepage.scss │ │ ├── utils │ │ │ ├── _breakpoints.scss │ │ │ ├── _module.scss │ │ │ └── _mixins.scss │ │ ├── base │ │ │ ├── _module.scss │ │ │ ├── _reset.css │ │ │ └── _base.scss │ │ ├── components │ │ │ ├── _module.scss │ │ │ ├── _language-selector.scss │ │ │ └── _wio-link.scss │ │ └── app.scss │ └── js │ │ ├── components │ │ └── ExampleComponent.vue │ │ ├── app.js │ │ └── bootstrap.js ├── views │ ├── partials │ │ ├── slices │ │ │ ├── video.blade.php │ │ │ ├── image-slider.blade.php │ │ │ ├── text-section.blade.php │ │ │ ├── quote-banner.blade.php │ │ │ ├── gallery.blade.php │ │ │ ├── highlight-section.blade.php │ │ │ └── banner.blade.php │ │ ├── footer.blade.php │ │ └── header.blade.php │ ├── 404.blade.php │ ├── page.blade.php │ ├── layouts │ │ └── app.blade.php │ └── homepage.blade.php └── lang │ └── en │ ├── pagination.php │ ├── auth.php │ ├── passwords.php │ └── validation.php ├── .gitattributes ├── tests ├── TestCase.php ├── Unit │ └── ExampleTest.php ├── Feature │ └── ExampleTest.php └── CreatesApplication.php ├── .editorconfig ├── custom_types ├── index.json ├── menu.json ├── page.json └── homepage.json ├── app ├── Http │ ├── Middleware │ │ ├── EncryptCookies.php │ │ ├── VerifyCsrfToken.php │ │ ├── TrimStrings.php │ │ ├── TrustProxies.php │ │ ├── RedirectIfAuthenticated.php │ │ └── ConnectToPrismic.php │ ├── Controllers │ │ ├── Controller.php │ │ └── Auth │ │ │ ├── ForgotPasswordController.php │ │ │ ├── LoginController.php │ │ │ ├── ResetPasswordController.php │ │ │ └── RegisterController.php │ ├── ViewComposers │ │ └── PrismicComposer.php │ └── Kernel.php ├── Providers │ ├── PrismicServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php ├── User.php ├── Console │ └── Kernel.php ├── LinkResolver.php └── Exceptions │ └── Handler.php ├── routes ├── channels.php ├── api.php ├── console.php └── web.php ├── config ├── hashing.php ├── i18n.php ├── prismic.php ├── view.php ├── services.php ├── broadcasting.php ├── logging.php ├── filesystems.php ├── queue.php ├── cache.php ├── auth.php ├── database.php ├── mail.php ├── session.php └── app.php ├── webpack.mix.js ├── server.php ├── .env.example ├── phpunit.xml ├── package.json ├── README.md ├── composer.json ├── artisan └── .gitignore /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /resources/assets/sass/partials/slices/_image-gallery.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /resources/assets/sass/layouts/_module.scss: -------------------------------------------------------------------------------- 1 | @import "general"; 2 | -------------------------------------------------------------------------------- /resources/assets/sass/vendor/_module.scss: -------------------------------------------------------------------------------- 1 | @import "lightslider"; 2 | -------------------------------------------------------------------------------- /resources/assets/sass/views/_module.scss: -------------------------------------------------------------------------------- 1 | @import "homepage"; 2 | -------------------------------------------------------------------------------- /resources/assets/sass/utils/_breakpoints.scss: -------------------------------------------------------------------------------- 1 | $break-small: 767px; 2 | -------------------------------------------------------------------------------- /resources/assets/sass/base/_module.scss: -------------------------------------------------------------------------------- 1 | @import "reset"; 2 | @import "base"; 3 | -------------------------------------------------------------------------------- /resources/assets/sass/utils/_module.scss: -------------------------------------------------------------------------------- 1 | @import "breakpoints"; 2 | @import "mixins"; 3 | -------------------------------------------------------------------------------- /resources/assets/sass/components/_module.scss: -------------------------------------------------------------------------------- 1 | @import "language-selector"; 2 | @import "wio-link"; 3 | -------------------------------------------------------------------------------- /public/img/controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prismicio/php-laravel-sample/master/public/img/controls.png -------------------------------------------------------------------------------- /public/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prismicio/php-laravel-sample/master/public/img/favicon.png -------------------------------------------------------------------------------- /public/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/js/app.js": "/js/app.js", 3 | "/css/app.css": "/css/app.css" 4 | } 5 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | primary->embed->html)) 2 |
3 | {!! $slice->primary->embed->html !!} 4 |
5 | @endif 6 | -------------------------------------------------------------------------------- /resources/assets/sass/partials/slices/_video.scss: -------------------------------------------------------------------------------- 1 | .video { 2 | position: relative; 3 | height: 500px; 4 | iframe { 5 | position: absolute; 6 | top: 0; 7 | left: 0; 8 | width: 100%; 9 | height: 100%; 10 | } 11 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /resources/assets/sass/layouts/_general.scss: -------------------------------------------------------------------------------- 1 | .l-grid-container { 2 | max-width: 980px; 3 | margin: auto; 4 | } 5 | 6 | .l-content-section { 7 | margin-bottom: 3.75rem; 8 | 9 | @media (max-width: $break-small) { 10 | margin-bottom: 2rem; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /resources/assets/sass/partials/_module.scss: -------------------------------------------------------------------------------- 1 | @import "header"; 2 | @import "footer"; 3 | 4 | @import "slices/banner"; 5 | @import "slices/gallery"; 6 | @import "slices/highlight-section"; 7 | @import "slices/image-gallery"; 8 | @import "slices/quote-banner"; 9 | @import "slices/text-section"; 10 | @import "slices/video"; 11 | -------------------------------------------------------------------------------- /resources/views/404.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 | 5 |
6 |

Page not found

7 |

Sorry we were unable to find the page you are looking for.

8 |

Return to home

9 |
10 | 11 | @stop 12 | -------------------------------------------------------------------------------- /database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call(UsersTableSeeder::class); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /custom_types/index.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "id": "homepage", 3 | "name": "Homepage", 4 | "repeatable": false, 5 | "value": "homepage.json" 6 | }, { 7 | "id": "menu", 8 | "name": "Menu", 9 | "repeatable": false, 10 | "value": "menu.json" 11 | }, { 12 | "id": "page", 13 | "name": "Page", 14 | "repeatable": true, 15 | "value": "page.json" 16 | }] 17 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 2 |

3 | Proudly published with  prismic.io 4 |
5 | 6 | 7 | 8 |

9 | 10 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | 19 | $response->assertStatus(200); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /resources/views/partials/slices/text-section.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Prismic\Dom\RichText; 3 | 4 | $sliceLabel = $slice->slice_label; 5 | if ($sliceLabel) { 6 | $sectionClass = 'text-section-' . $sliceLabel; 7 | } else { 8 | $sectionClass = 'text-section-1col'; 9 | } 10 | @endphp 11 | 12 |
13 | {!! RichText::asHtml($slice->primary->text, $linkResolver) !!} 14 |
15 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 16 | }); 17 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 20 | 21 | Hash::driver('bcrypt')->setRounds(4); 22 | 23 | return $app; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | get('/user', function (Request $request) { 17 | return $request->user(); 18 | }); 19 | -------------------------------------------------------------------------------- /config/hashing.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 19 | 20 | ]; 21 | -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | let mix = require('laravel-mix'); 2 | 3 | /* 4 | |-------------------------------------------------------------------------- 5 | | Mix Asset Management 6 | |-------------------------------------------------------------------------- 7 | | 8 | | Mix provides a clean, fluent API for defining some Webpack build steps 9 | | for your Laravel application. By default, we are compiling the Sass 10 | | file for the application as well as bundling up all the JS files. 11 | | 12 | */ 13 | 14 | mix.js('resources/assets/js/app.js', 'public/js') 15 | .sass('resources/assets/sass/app.scss', 'public/css'); 16 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 18 | })->describe('Display an inspiring quote'); 19 | -------------------------------------------------------------------------------- /app/User.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /app/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | check()) { 21 | return redirect('/home'); 22 | } 23 | 24 | return $next($request); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /resources/assets/sass/views/_homepage.scss: -------------------------------------------------------------------------------- 1 | .homepage-banner { 2 | margin: 0 0 40px; 3 | padding: 10em 0 6em; 4 | background-position: center; 5 | background-size: cover; 6 | 7 | .banner-content { 8 | text-align: center; 9 | max-width: 720px; 10 | .banner-title { 11 | font-size: 70px; 12 | line-height: 70px; 13 | font-weight: 900; 14 | color: white; 15 | } 16 | 17 | p { 18 | font-size: 18px; 19 | color: white; 20 | } 21 | 22 | .banner-button { 23 | @include button($primary: #333, $primaryHover: #333, $secondary : #fff, $border:#fff, $secondaryHover: #eee, $borderHover: #fff); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /resources/assets/js/components/ExampleComponent.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 24 | -------------------------------------------------------------------------------- /resources/assets/sass/components/_wio-link.scss: -------------------------------------------------------------------------------- 1 | .wio-link { 2 | background-color: #363566!important; 3 | color: white; 4 | position: fixed; 5 | z-index: 10000; 6 | padding: 6px 10px; 7 | box-sizing: border-box; 8 | border-radius: 50%; 9 | bottom: 30px; 10 | left: 30px; 11 | height: 50px; 12 | width: 50px!important; 13 | display: flex; 14 | align-items: center; 15 | justify-content: center; 16 | box-shadow: 0 2px 7px 0 rgba(90,90,140,0.40); 17 | } 18 | 19 | .wio-link img { 20 | display: none; 21 | } 22 | 23 | .wio-link:after { 24 | font-family: 'Material Icons'; 25 | content: '\E3C9'; 26 | color: white; 27 | font-size: 24px; 28 | } 29 | -------------------------------------------------------------------------------- /resources/assets/sass/partials/slices/_gallery.scss: -------------------------------------------------------------------------------- 1 | .gallery { 2 | margin-top: 50px; 3 | display: flex; 4 | flex-wrap: wrap; 5 | justify-content: space-between; 6 | .gallery-item { 7 | flex: 0 1 30%; 8 | text-align: center; 9 | @media (max-width: $break-small) { 10 | -webkit-box-flex: 100%; 11 | -moz-box-flex: 100%; 12 | -webkit-flex: 100%; 13 | -ms-flex: 100%; 14 | flex: 100%; 15 | } 16 | img { 17 | width: 150px; 18 | height: 150px; 19 | margin-bottom: 50px; 20 | border-radius: 50%; 21 | object-fit: cover; 22 | } 23 | } 24 | .gallery-link { 25 | margin-top: -20px; 26 | text-transform: uppercase; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /app/Providers/AuthServiceProvider.php: -------------------------------------------------------------------------------- 1 | 'App\Policies\ModelPolicy', 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | * 22 | * @return void 23 | */ 24 | public function boot() 25 | { 26 | $this->registerPolicies(); 27 | 28 | // 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /custom_types/menu.json: -------------------------------------------------------------------------------- 1 | { 2 | "Main" : { 3 | "title" : { 4 | "type" : "StructuredText", 5 | "config" : { 6 | "placeholder" : "Menu title...", 7 | "single" : "heading1" 8 | } 9 | }, 10 | "menu_links" : { 11 | "type" : "Group", 12 | "fieldset" : "Menu Links", 13 | "config" : { 14 | "fields" : { 15 | "label" : { 16 | "type" : "Text", 17 | "config" : { 18 | "placeholder" : "Link label" 19 | } 20 | }, 21 | "link" : { 22 | "type" : "Link", 23 | "config" : { 24 | "placeholder" : "Link" 25 | } 26 | } 27 | } 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Providers/EventServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'App\Listeners\EventListener', 18 | ], 19 | ]; 20 | 21 | /** 22 | * Register any events for your application. 23 | * 24 | * @return void 25 | */ 26 | public function boot() 27 | { 28 | parent::boot(); 29 | 30 | // 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | LOG_CHANNEL=stack 8 | 9 | DB_CONNECTION=mysql 10 | DB_HOST=127.0.0.1 11 | DB_PORT=3306 12 | DB_DATABASE=homestead 13 | DB_USERNAME=homestead 14 | DB_PASSWORD=secret 15 | 16 | BROADCAST_DRIVER=log 17 | CACHE_DRIVER=file 18 | SESSION_DRIVER=file 19 | SESSION_LIFETIME=120 20 | QUEUE_DRIVER=sync 21 | 22 | REDIS_HOST=127.0.0.1 23 | REDIS_PASSWORD=null 24 | REDIS_PORT=6379 25 | 26 | MAIL_DRIVER=smtp 27 | MAIL_HOST=smtp.mailtrap.io 28 | MAIL_PORT=2525 29 | MAIL_USERNAME=null 30 | MAIL_PASSWORD=null 31 | MAIL_ENCRYPTION=null 32 | 33 | PUSHER_APP_ID= 34 | PUSHER_APP_KEY= 35 | PUSHER_APP_SECRET= 36 | PUSHER_APP_CLUSTER=mt1 37 | 38 | MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 39 | MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 40 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | define(App\User::class, function (Faker $faker) { 17 | static $password; 18 | 19 | return [ 20 | 'name' => $faker->name, 21 | 'email' => $faker->unique()->safeEmail, 22 | 'password' => $password ?: $password = bcrypt('secret'), 23 | 'remember_token' => str_random(10), 24 | ]; 25 | }); 26 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 18 | $table->string('token'); 19 | $table->timestamp('created_at')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('password_resets'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /config/i18n.php: -------------------------------------------------------------------------------- 1 | [ 12 | [ 13 | 'key' => 'en-us', 14 | 'label' => 'English', 15 | ], 16 | [ 17 | 'key' => 'fr-fr', 18 | 'label' => 'Français', 19 | ], 20 | [ 21 | 'key' => 'de-de', 22 | 'label' => 'Deutsch', 23 | ], 24 | ], 25 | 26 | /* 27 | |-------------------------------------------------------------------------- 28 | | Default language 29 | |-------------------------------------------------------------------------- 30 | */ 31 | 32 | 'default' => 'en-us', 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Passwords must be at least six characters and match the confirmation.', 17 | 'reset' => 'Your password has been reset!', 18 | 'sent' => 'We have e-mailed your password reset link!', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that e-mail address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/assets/sass/partials/slices/_banner.scss: -------------------------------------------------------------------------------- 1 | .banner { 2 | position: relative; 3 | 4 | img { 5 | width: 100%; 6 | height: 400px; 7 | object-fit: cover; 8 | } 9 | 10 | .cta { 11 | position: absolute; 12 | bottom: 8px; 13 | left: 0; 14 | right: 0; 15 | background: linear-gradient(0deg,rgba(0,0,0,.5) 0,rgba(0,0,0,.30) 40%,transparent); 16 | padding: 30px 20px; 17 | display: flex; 18 | justify-content: center; 19 | align-items: center; 20 | text-align: center; 21 | 22 | .cta-text { 23 | font-size: 16px; 24 | font-weight: 700; 25 | line-height: 20px; 26 | color: white; 27 | padding-top: 15px; 28 | } 29 | 30 | .cta-button { 31 | color: white; 32 | text-decoration: underline; 33 | padding: 5px 0 10px 0; 34 | font-size: 13px; 35 | line-height: 20px; 36 | font-weight: 700; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /resources/views/partials/slices/quote-banner.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Prismic\Dom\RichText; 3 | 4 | $sectionClasses = strtolower(implode(' ', [$slice->primary->quote_position, $slice->primary->quote_style])); 5 | $backgroundImageUrl = isset($slice->primary->background_image->url) ? $slice->primary->background_image->url : ''; 6 | @endphp 7 | 8 |
9 |
10 |
11 |
12 | {!! RichText::asHtml($slice->primary->quote, $linkResolver) !!} 13 |
14 |
15 | {!! RichText::asHtml($slice->primary->quote_author, $linkResolver) !!} 16 |
17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->string('password'); 21 | $table->rememberToken(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('users'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /resources/views/partials/slices/gallery.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Prismic\Dom\RichText; 3 | use Prismic\Dom\Link; 4 | @endphp 5 | 6 | 27 | -------------------------------------------------------------------------------- /config/prismic.php: -------------------------------------------------------------------------------- 1 | 'https://laravel-sample.prismic.io/api/v2', 16 | 17 | /* 18 | |-------------------------------------------------------------------------- 19 | | prismic.io API Access Token 20 | |-------------------------------------------------------------------------- 21 | | 22 | | Here you can specify your API Access Token if you are using a private API. 23 | | If you are not using a private API, then leave this configuration set to 24 | | the default value of null. 25 | | 26 | */ 27 | 28 | 'token' => null, 29 | 30 | ]; 31 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ForgotPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire') 28 | // ->hourly(); 29 | } 30 | 31 | /** 32 | * Register the commands for the application. 33 | * 34 | * @return void 35 | */ 36 | protected function commands() 37 | { 38 | $this->load(__DIR__.'/Commands'); 39 | 40 | require base_path('routes/console.php'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/LoginController.php: -------------------------------------------------------------------------------- 1 | middleware('guest')->except('logout'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => realpath(storage_path('framework/views')), 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | ], 21 | 22 | 'ses' => [ 23 | 'key' => env('SES_KEY'), 24 | 'secret' => env('SES_SECRET'), 25 | 'region' => 'us-east-1', 26 | ], 27 | 28 | 'sparkpost' => [ 29 | 'secret' => env('SPARKPOST_SECRET'), 30 | ], 31 | 32 | 'stripe' => [ 33 | 'model' => App\User::class, 34 | 'key' => env('STRIPE_KEY'), 35 | 'secret' => env('STRIPE_SECRET'), 36 | ], 37 | 38 | ]; 39 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ResetPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Feature 14 | 15 | 16 | 17 | ./tests/Unit 18 | 19 | 20 | 21 | 22 | ./app 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/LinkResolver.php: -------------------------------------------------------------------------------- 1 | isBroken === true) { 26 | return '/404'; 27 | } 28 | if ($link->type === 'homepage') { 29 | return '/' . $link->lang; 30 | } 31 | if ($link->type === 'page') { 32 | return '/' . $link->lang . '/page/' . $link->uid; 33 | } 34 | return '/'; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Http/Middleware/ConnectToPrismic.php: -------------------------------------------------------------------------------- 1 | attributes->set('endpoint', config('prismic.url')); 22 | 23 | // Define the link resolver 24 | $request->attributes->set('linkResolver', new LinkResolver()); 25 | 26 | // Define the current language 27 | $request->attributes->set('currentLang', config('i18n')['default']); 28 | 29 | // Connect to the prismic.io repository 30 | if (config('prismic.url') !== 'https://your-repo-name.prismic.io/api/v2') { 31 | $request->attributes->set('api', Api::get(config('prismic.url'), config('prismic.token'))); 32 | } 33 | 34 | // Return the request 35 | return $next($request); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /resources/views/partials/slices/highlight-section.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Prismic\Dom\RichText; 3 | use Prismic\Dom\Link; 4 | 5 | $buttonLinkUrl = Link::asUrl($slice->primary->button_link, $linkResolver); 6 | $buttonLabel = RichText::asText($slice->primary->button_label); 7 | @endphp 8 | 9 |
10 | @if (isset($slice->primary->image->url)) 11 |
12 | {{ $slice->primary->image->alt }} 13 |
14 | @endif 15 |
16 |
17 | {!! RichText::asHtml($slice->primary->title, $linkResolver) !!} 18 |
19 |
20 | {!! RichText::asHtml($slice->primary->description, $linkResolver) !!} 21 |
22 | @if ($buttonLinkUrl && $buttonLabel) 23 |
24 | 25 | {{ $buttonLabel }} 26 | 27 |
28 | @endif 29 |
30 |
31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 6 | "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 7 | "watch-poll": "npm run watch -- --watch-poll", 8 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 9 | "prod": "npm run production", 10 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.17", 14 | "bootstrap": "^4.0.0", 15 | "popper.js": "^1.12", 16 | "cross-env": "^5.1", 17 | "jquery": "^3.2", 18 | "laravel-mix": "^2.0", 19 | "lodash": "^4.17.4", 20 | "vue": "^2.5.7" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/views/partials/slices/banner.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Prismic\Dom\RichText; 3 | use Prismic\Dom\Link; 4 | 5 | $linkUrl = Link::asUrl($slice->primary->link); 6 | $targetAttr = property_exists($slice->primary->link, 'target') ? 'target="' . $slice->primary->link->target . '" rel="noopener"' : ''; 7 | $linkText = RichText::asText($slice->primary->link_text); 8 | @endphp 9 | 10 | 33 | -------------------------------------------------------------------------------- /resources/assets/sass/partials/slices/_highlight-section.scss: -------------------------------------------------------------------------------- 1 | .highlight-section { 2 | margin-bottom: 80px; 3 | font-size: 0; 4 | 5 | .illustration { 6 | display: inline-block; 7 | width: 50%; 8 | vertical-align: middle; 9 | font-size: 1rem; 10 | } 11 | 12 | .content { 13 | font-size: 13px; 14 | line-height: 1.7; 15 | letter-spacing: 0.6; 16 | width: 50%; 17 | display: inline-block; 18 | vertical-align: middle; 19 | padding: 60px; 20 | box-sizing: border-box; 21 | position: relative; 22 | 23 | .title { 24 | margin-bottom: 30px; 25 | 26 | h2 { 27 | position: relative; 28 | font-size: 40px; 29 | line-height: 50px; 30 | } 31 | } 32 | 33 | .action { 34 | @include button($primary: #333, $primaryHover: white, $border : #333, $secondaryHover: #333, $borderHover: #333); 35 | } 36 | } 37 | } 38 | 39 | @media (max-width: $break-small) { 40 | .highlight-section{ 41 | .content{ 42 | display: block; 43 | width: 100%; 44 | padding: 50px 30px; 45 | } 46 | .illustration{ 47 | display: block; 48 | width: 100%; 49 | } 50 | } 51 | .highlight-left, 52 | .highlight-right { 53 | width: 100%; 54 | float: none; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /resources/assets/sass/partials/_header.scss: -------------------------------------------------------------------------------- 1 | .site-header { 2 | height: 30px; 3 | padding: 20px 0; 4 | 5 | a { 6 | font-weight: 700; 7 | } 8 | 9 | &.dark { 10 | a { 11 | color: #484d52; 12 | 13 | &:hover { 14 | color: #72767B; 15 | } 16 | } 17 | } 18 | 19 | &.light { 20 | a { 21 | color: #ffffff; 22 | 23 | &:hover { 24 | color: #c8c9cb; 25 | } 26 | } 27 | } 28 | 29 | .logo { 30 | display: inline-block; 31 | font-size: 22px; 32 | font-weight: 900; 33 | } 34 | 35 | nav { 36 | float: right; 37 | ul { 38 | margin: 0; 39 | li { 40 | display: inline-block; 41 | margin-left: 40px; 42 | } 43 | } 44 | } 45 | } 46 | 47 | @media (max-width: $break-small) { 48 | .site-header { 49 | height: auto; 50 | padding-left: 20px; 51 | padding-right: 20px; 52 | 53 | .logo { 54 | display: block; 55 | text-align: center; 56 | } 57 | 58 | nav { 59 | margin-top: 30px; 60 | float: none; 61 | text-align: center; 62 | 63 | ul li { 64 | display: inline-block; 65 | margin-left: 10px; 66 | margin-right: 10px; 67 | } 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /resources/assets/sass/base/_reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, menu, nav, section { 29 | display: block; 30 | } 31 | body { 32 | line-height: 1; 33 | } 34 | ol, ul { 35 | list-style: none; 36 | } 37 | blockquote, q { 38 | quotes: none; 39 | } 40 | blockquote:before, blockquote:after, 41 | q:before, q:after { 42 | content: ''; 43 | content: none; 44 | } 45 | table { 46 | border-collapse: collapse; 47 | border-spacing: 0; 48 | } 49 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | endpoint = $request->attributes->get('endpoint'); 20 | 21 | // Define the link resolver 22 | $this->linkResolver = $request->attributes->get('linkResolver'); 23 | 24 | // Define the current language 25 | $this->currentLang = $request->attributes->get('currentLang'); 26 | 27 | // Define the menu content 28 | $this->menu = $request->attributes->get('api')->getSingle('menu', ['lang' => $this->currentLang]); 29 | } 30 | 31 | /** 32 | * Bind the link resolver and the menu content to the view. 33 | * 34 | * @param View $view 35 | * @return void 36 | */ 37 | public function compose(View $view) 38 | { 39 | $view->with('endpoint', $this->endpoint); 40 | $view->with('linkResolver', $this->linkResolver); 41 | $view->with('currentLang', $this->currentLang); 42 | $view->with('menu', $this->menu); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /resources/views/page.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 | 5 |
6 | 7 | @foreach ($document->data->body as $slice) 8 | @switch ($slice->slice_type) 9 | @case ('highlight_section') 10 | @include('partials.slices.highlight-section', ['slice' => $slice]) 11 | @break 12 | @case ('banner') 13 | @include('partials.slices.banner', ['slice' => $slice]) 14 | @break 15 | @case ('quote_banner') 16 | @include('partials.slices.quote-banner', ['slice' => $slice]) 17 | @break 18 | @case ('text_section') 19 | @include('partials.slices.text-section', ['slice' => $slice]) 20 | @break 21 | @case ('image_slider') 22 | @include('partials.slices.image-slider', ['slice' => $slice]) 23 | @break 24 | @case ('gallery') 25 | @include('partials.slices.gallery', ['slice' => $slice]) 26 | @break 27 | @case ('video') 28 | @include('partials.slices.video', ['slice' => $slice]) 29 | @break 30 | @endswitch 31 | @endforeach 32 | 33 |
34 | 35 | @stop 36 | -------------------------------------------------------------------------------- /resources/assets/sass/utils/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin quotes($color) { 2 | display: block; 3 | font-size: 36px; 4 | font-style: italic; 5 | font-weight: normal; 6 | color: $color; 7 | letter-spacing : 1.14; 8 | line-height: 1.5em; 9 | quotes: "\201C""\201D""\2018""\2019"; 10 | text-align: center; 11 | 12 | &:before, &:after { 13 | color: $color; 14 | content: open-quote; 15 | font-size: 2.5em; 16 | font-weight: 900; 17 | line-height: 0.1em; 18 | margin-left: 10px; 19 | margin-right: 10px; 20 | vertical-align: -0.3em; 21 | } 22 | 23 | &:after { 24 | content: close-quote; 25 | position: relative; 26 | top: 0.3em; 27 | } 28 | } 29 | 30 | @mixin button($primary, $secondary: transparent, $border: $primary, $primaryHover: $primary, $secondaryHover: $secondary, $borderHover: $primaryHover) { 31 | border: 2px solid $border; 32 | display: inline-block; 33 | padding: 7px 30px; 34 | font-size: 16px; 35 | font-weight: 700; 36 | text-transform: uppercase; 37 | color: $primary; 38 | background: $secondary; 39 | border-radius: 4px; 40 | 41 | a { 42 | color: $primary; 43 | } 44 | 45 | &:hover { 46 | color: $primaryHover; 47 | background-color: $secondaryHover; 48 | border-color: $borderHover; 49 | 50 | a { 51 | color: $primaryHover; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Laravel Sample 2 | 3 | > Laravel sample website with content retrieving from [prismic.io](https://prismic.io) 4 | 5 | This project runs with Laravel version 5.5. 6 | 7 | ## Getting started 8 | 9 | Assuming you've already installed on your machine: PHP (>= 7.0.0), [Laravel](https://laravel.com), [Composer](https://getcomposer.org) and [Node.js](https://nodejs.org). 10 | 11 | ``` bash 12 | # install dependencies 13 | composer install 14 | npm install 15 | 16 | # create .env file and generate the application key 17 | cp .env.example .env 18 | php artisan key:generate 19 | 20 | # build CSS and JS assets 21 | npm run dev 22 | # or, if you prefer minified files 23 | npm run prod 24 | ``` 25 | 26 | Then launch the server: 27 | 28 | ``` bash 29 | php artisan serve 30 | ``` 31 | 32 | The Laravel sample project is now up and running! Access it at http://localhost:8000. 33 | 34 | ## Licence 35 | 36 | This software is licensed under the Apache 2 license, quoted below. 37 | 38 | Copyright 2018 Prismic.io (https://prismic.io). 39 | 40 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. 41 | 42 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 43 | -------------------------------------------------------------------------------- /resources/assets/js/app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * First we will load all of this project's JavaScript dependencies which 4 | * includes Vue and other libraries. It is a great starting point when 5 | * building robust, powerful web applications using Vue and Laravel. 6 | */ 7 | 8 | // require('./bootstrap'); 9 | 10 | // window.Vue = require('vue'); 11 | 12 | /** 13 | * Next, we will create a fresh Vue application instance and attach it to 14 | * the page. Then, you may begin adding components to this application 15 | * or customize the JavaScript scaffolding to fit your unique needs. 16 | */ 17 | 18 | // Vue.component('example-component', require('./components/ExampleComponent.vue')); 19 | 20 | // const app = new Vue({ 21 | // el: '#app' 22 | // }); 23 | 24 | 25 | 26 | window.$ = window.jQuery = require('jquery'); 27 | require('./vendor/lightslider'); 28 | 29 | $(document).ready(function () { 30 | 31 | /** 32 | * Using lightslider (jQuery plugin) for image-slider slice 33 | */ 34 | 35 | $('.js-image-slider').lightSlider({ 36 | gallery: false, 37 | auto: true, 38 | item: 1, 39 | loop: true, 40 | slideMargin: 0, 41 | controls: false, 42 | enableDrag: false, 43 | currentPagerPosition: 'left', 44 | pauseOnHover: true, 45 | pause: 6000, 46 | }); 47 | 48 | /** 49 | * Handling language change 50 | */ 51 | 52 | let $languageSelect = $('#language-select'); 53 | 54 | $languageSelect.on('change', function () { 55 | window.location.href = $languageSelect.find('option:selected').attr('href'); 56 | }); 57 | 58 | }); 59 | -------------------------------------------------------------------------------- /resources/assets/sass/base/_base.scss: -------------------------------------------------------------------------------- 1 | ::selection { 2 | background: #FFF7C7; /* WebKit/Blink Browsers */ 3 | } 4 | 5 | ::-moz-selection { 6 | background: #FFF7C7; /* Gecko Browsers */ 7 | } 8 | 9 | html { 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | 14 | body { 15 | color: #72767b; 16 | font-family: Lato, sans-serif; 17 | font-size: 16px; 18 | font-weight: 400; 19 | line-height: 28px; 20 | } 21 | 22 | a { 23 | color: #72767B; 24 | font-size: 14px; 25 | font-weight: 400; 26 | line-height: 28px; 27 | text-decoration: none; 28 | } 29 | 30 | p a { 31 | text-decoration: underline; 32 | } 33 | 34 | h1 { 35 | font-size: 46px; 36 | line-height: 50px; 37 | font-weight: normal; 38 | color: #484D52; 39 | margin-bottom: 1rem; 40 | 41 | @media (max-width: $break-small) { 42 | font-size: 32px; 43 | line-height: 40px; 44 | } 45 | } 46 | 47 | h2, h2 a { 48 | margin-bottom: 1rem; 49 | color: #484d52; 50 | font-size: 32px; 51 | font-weight: 700; 52 | line-height: 42px; 53 | 54 | @media (max-width: $break-small) { 55 | font-size: 26px; 56 | } 57 | } 58 | 59 | h3, h3 a { 60 | margin-bottom: 1rem; 61 | color: #484d52; 62 | font-size: 24px; 63 | font-weight: 400; 64 | line-height: 34px; 65 | 66 | @media (max-width: $break-small) { 67 | font-size: 18px; 68 | } 69 | } 70 | 71 | p { 72 | margin-bottom: 2rem; 73 | font-size: 16px; 74 | line-height: 1.5; 75 | } 76 | 77 | pre, ul { 78 | margin-bottom: 20px; 79 | } 80 | 81 | img { 82 | max-width: 100%; 83 | } 84 | 85 | strong { 86 | font-weight: bold; 87 | } 88 | 89 | em { 90 | font-style: italic; 91 | } 92 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | // 40 | ], 41 | ], 42 | 43 | 'redis' => [ 44 | 'driver' => 'redis', 45 | 'connection' => 'default', 46 | ], 47 | 48 | 'log' => [ 49 | 'driver' => 'log', 50 | ], 51 | 52 | 'null' => [ 53 | 'driver' => 'null', 54 | ], 55 | 56 | ], 57 | 58 | ]; 59 | -------------------------------------------------------------------------------- /resources/views/layouts/app.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{-- Meta --}} 5 | 6 | 7 | 8 | 9 | 10 | {{-- Meta Title --}} 11 | @if (isset($meta['title'])) 12 | {{ $meta['title'] }} 13 | @else 14 | Laravel sample 15 | @endif 16 | 17 | {{-- Meta Description --}} 18 | @if (isset($meta['description'])) 19 | 20 | @else 21 | 22 | @endif 23 | 24 | {{-- Favicon --}} 25 | 26 | 27 | {{-- Fonts --}} 28 | 29 | 30 | 31 | 32 | 33 | 34 | {{-- Scripts --}} 35 | 41 | 42 | 43 | 44 | 45 | 46 | @include('partials/header') 47 | 48 |
49 | @yield('content') 50 |
51 | 52 | @include('partials/footer') 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "description": "The Laravel Framework.", 4 | "keywords": ["framework", "laravel"], 5 | "license": "MIT", 6 | "type": "project", 7 | "require": { 8 | "php": ">=7.1.3", 9 | "fideloper/proxy": "~4.0", 10 | "laravel/framework": "5.7.*", 11 | "laravel/tinker": "~1.0", 12 | "prismic/php-sdk": "5.0.1" 13 | }, 14 | "require-dev": { 15 | "filp/whoops": "~2.0", 16 | "fzaninotto/faker": "~1.4", 17 | "mockery/mockery": "~1.0", 18 | "nunomaduro/collision": "~2.0", 19 | "phpunit/phpunit": "~7.0", 20 | "symfony/thanks": "^1.0" 21 | }, 22 | "autoload": { 23 | "classmap": [ 24 | "database/seeds", 25 | "database/factories" 26 | ], 27 | "psr-4": { 28 | "App\\": "app/" 29 | } 30 | }, 31 | "autoload-dev": { 32 | "psr-4": { 33 | "Tests\\": "tests/" 34 | } 35 | }, 36 | "extra": { 37 | "laravel": { 38 | "dont-discover": [ 39 | ] 40 | } 41 | }, 42 | "scripts": { 43 | "post-root-package-install": [ 44 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 45 | ], 46 | "post-create-project-cmd": [ 47 | "@php artisan key:generate" 48 | ], 49 | "post-autoload-dump": [ 50 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 51 | "@php artisan package:discover" 52 | ] 53 | }, 54 | "config": { 55 | "preferred-install": "dist", 56 | "sort-packages": true, 57 | "optimize-autoloader": true 58 | }, 59 | "minimum-stability": "dev", 60 | "prefer-stable": true 61 | } 62 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /resources/assets/sass/partials/slices/_text-section.scss: -------------------------------------------------------------------------------- 1 | .text-section { 2 | margin-bottom: 50px; 3 | h1{ 4 | margin: 100px 0 50px 0; 5 | font-family: 'Lato'; 6 | font-weight: 900; 7 | font-size:60px; 8 | line-height: 60px; 9 | } 10 | h2{ 11 | font-size: 40px; 12 | line-height: 50px; 13 | font-weight: 400; 14 | } 15 | &.text-section-1col-center{ 16 | h1,h2{ 17 | text-align: center; 18 | } 19 | h2{ 20 | font-style: italic; 21 | max-width: 80%; 22 | margin: 0 auto 80px auto; 23 | } 24 | } 25 | &.text-section-2col { 26 | column-count: 2; 27 | column-gap: 40px; 28 | h1,h2{ 29 | text-align: left; 30 | margin: 0 0 20px 0; 31 | font-family: 'Lato'; 32 | font-style: normal; 33 | } 34 | h1{ 35 | font-size: 38px; 36 | line-height: 45px; 37 | font-weight: 400; 38 | } 39 | h2{ 40 | font-size: 26px; 41 | line-height: 50px; 42 | font-weight: 300; 43 | } 44 | } 45 | .text-section-1col img, 46 | .text-section-2col img, 47 | .gallery img { 48 | margin-bottom: 1rem; 49 | } 50 | .text-section-1col p:last-child, 51 | .text-section-2col p:last-child { 52 | margin-bottom: 0; 53 | } 54 | .quote { 55 | @include quotes(#e9e9e9); 56 | } 57 | } 58 | 59 | 60 | 61 | @media (max-width: $break-small) { 62 | .text-section{ 63 | padding: 0 30px; 64 | h1{ 65 | font-size: 40px; 66 | line-height: 50px; 67 | margin: 30px 0 0 0; 68 | } 69 | h2{ 70 | font-size: 32px; 71 | line-height: 40px; 72 | } 73 | &.text-section-2col{ 74 | -webkit-column-count: 1; 75 | -moz-column-count: 1; 76 | column-count: 1; 77 | -webkit-column-gap: 40px; 78 | -moz-column-gap: 40px; 79 | column-gap: 40px; 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | mapApiRoutes(); 39 | 40 | $this->mapWebRoutes(); 41 | 42 | // 43 | } 44 | 45 | /** 46 | * Define the "web" routes for the application. 47 | * 48 | * These routes all receive session state, CSRF protection, etc. 49 | * 50 | * @return void 51 | */ 52 | protected function mapWebRoutes() 53 | { 54 | Route::middleware('web') 55 | ->namespace($this->namespace) 56 | ->group(base_path('routes/web.php')); 57 | } 58 | 59 | /** 60 | * Define the "api" routes for the application. 61 | * 62 | * These routes are typically stateless. 63 | * 64 | * @return void 65 | */ 66 | protected function mapApiRoutes() 67 | { 68 | Route::prefix('api') 69 | ->middleware('api') 70 | ->namespace($this->namespace) 71 | ->group(base_path('routes/api.php')); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /resources/assets/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | 2 | window._ = require('lodash'); 3 | window.Popper = require('popper.js').default; 4 | 5 | /** 6 | * We'll load jQuery and the Bootstrap jQuery plugin which provides support 7 | * for JavaScript based Bootstrap features such as modals and tabs. This 8 | * code may be modified to fit the specific needs of your application. 9 | */ 10 | 11 | try { 12 | window.$ = window.jQuery = require('jquery'); 13 | 14 | require('bootstrap'); 15 | } catch (e) {} 16 | 17 | /** 18 | * We'll load the axios HTTP library which allows us to easily issue requests 19 | * to our Laravel back-end. This library automatically handles sending the 20 | * CSRF token as a header based on the value of the "XSRF" token cookie. 21 | */ 22 | 23 | window.axios = require('axios'); 24 | 25 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 26 | 27 | /** 28 | * Next we will register the CSRF Token as a common header with Axios so that 29 | * all outgoing HTTP requests automatically have it attached. This is just 30 | * a simple convenience so we don't have to attach every token manually. 31 | */ 32 | 33 | let token = document.head.querySelector('meta[name="csrf-token"]'); 34 | 35 | if (token) { 36 | window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content; 37 | } else { 38 | console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); 39 | } 40 | 41 | /** 42 | * Echo exposes an expressive API for subscribing to channels and listening 43 | * for events that are broadcast by Laravel. Echo and event broadcasting 44 | * allows your team to easily build robust real-time web applications. 45 | */ 46 | 47 | // import Echo from 'laravel-echo' 48 | 49 | // window.Pusher = require('pusher-js'); 50 | 51 | // window.Echo = new Echo({ 52 | // broadcaster: 'pusher', 53 | // key: process.env.MIX_PUSHER_APP_KEY, 54 | // cluster: process.env.MIX_PUSHER_APP_CLUSTER, 55 | // encrypted: true 56 | // }); 57 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | define('LARAVEL_START', microtime(true)); 11 | 12 | /* 13 | |-------------------------------------------------------------------------- 14 | | Register The Auto Loader 15 | |-------------------------------------------------------------------------- 16 | | 17 | | Composer provides a convenient, automatically generated class loader for 18 | | our application. We just need to utilize it! We'll simply require it 19 | | into the script here so that we don't have to worry about manual 20 | | loading any of our classes later on. It feels great to relax. 21 | | 22 | */ 23 | 24 | require __DIR__.'/../vendor/autoload.php'; 25 | 26 | /* 27 | |-------------------------------------------------------------------------- 28 | | Turn On The Lights 29 | |-------------------------------------------------------------------------- 30 | | 31 | | We need to illuminate PHP development, so let us turn on the lights. 32 | | This bootstraps the framework and gets it ready for use, then it 33 | | will load up this application so that we can run it and send 34 | | the responses back to the browser and delight our users. 35 | | 36 | */ 37 | 38 | $app = require_once __DIR__.'/../bootstrap/app.php'; 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Run The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once we have the application, we can handle the incoming request 46 | | through the kernel, and send the associated response back to 47 | | the client's browser allowing them to enjoy the creative 48 | | and wonderful application we have prepared for them. 49 | | 50 | */ 51 | 52 | $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 53 | 54 | $response = $kernel->handle( 55 | $request = Illuminate\Http\Request::capture() 56 | ); 57 | 58 | $response->send(); 59 | 60 | $kernel->terminate($request, $response); 61 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/RegisterController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 41 | } 42 | 43 | /** 44 | * Get a validator for an incoming registration request. 45 | * 46 | * @param array $data 47 | * @return \Illuminate\Contracts\Validation\Validator 48 | */ 49 | protected function validator(array $data) 50 | { 51 | return Validator::make($data, [ 52 | 'name' => 'required|string|max:255', 53 | 'email' => 'required|string|email|max:255|unique:users', 54 | 'password' => 'required|string|min:6|confirmed', 55 | ]); 56 | } 57 | 58 | /** 59 | * Create a new user instance after a valid registration. 60 | * 61 | * @param array $data 62 | * @return \App\User 63 | */ 64 | protected function create(array $data) 65 | { 66 | return User::create([ 67 | 'name' => $data['name'], 68 | 'email' => $data['email'], 69 | 'password' => Hash::make($data['password']), 70 | ]); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Log Channels 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the log channels for your application. Out of 24 | | the box, Laravel uses the Monolog PHP logging library. This gives 25 | | you a variety of powerful log handlers / formatters to utilize. 26 | | 27 | | Available Drivers: "single", "daily", "slack", "syslog", 28 | | "errorlog", "custom", "stack" 29 | | 30 | */ 31 | 32 | 'channels' => [ 33 | 'stack' => [ 34 | 'driver' => 'stack', 35 | 'channels' => ['single'], 36 | ], 37 | 38 | 'single' => [ 39 | 'driver' => 'single', 40 | 'path' => storage_path('logs/laravel.log'), 41 | 'level' => 'debug', 42 | ], 43 | 44 | 'daily' => [ 45 | 'driver' => 'daily', 46 | 'path' => storage_path('logs/laravel.log'), 47 | 'level' => 'debug', 48 | 'days' => 7, 49 | ], 50 | 51 | 'slack' => [ 52 | 'driver' => 'slack', 53 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 54 | 'username' => 'Laravel Log', 55 | 'emoji' => ':boom:', 56 | 'level' => 'critical', 57 | ], 58 | 59 | 'syslog' => [ 60 | 'driver' => 'syslog', 61 | 'level' => 'debug', 62 | ], 63 | 64 | 'errorlog' => [ 65 | 'driver' => 'errorlog', 66 | 'level' => 'debug', 67 | ], 68 | ], 69 | 70 | ]; 71 | -------------------------------------------------------------------------------- /resources/views/partials/header.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Prismic\Dom\RichText; 3 | use Prismic\Dom\Link; 4 | use Prismic\Document; 5 | @endphp 6 | 7 | @if (isset($menu)) 8 | 9 | 51 | 52 | @endif 53 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DRIVER', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Cloud Filesystem Disk 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Many applications store files both locally and in the cloud. For this 24 | | reason, you may specify a default "cloud" driver here. This driver 25 | | will be bound as the Cloud disk implementation in the container. 26 | | 27 | */ 28 | 29 | 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Filesystem Disks 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may configure as many filesystem "disks" as you wish, and you 37 | | may even configure multiple disks of the same driver. Defaults have 38 | | been setup for each driver as an example of the required options. 39 | | 40 | | Supported Drivers: "local", "ftp", "s3", "rackspace" 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | ], 57 | 58 | 's3' => [ 59 | 'driver' => 's3', 60 | 'key' => env('AWS_ACCESS_KEY_ID'), 61 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 62 | 'region' => env('AWS_DEFAULT_REGION'), 63 | 'bucket' => env('AWS_BUCKET'), 64 | 'url' => env('AWS_URL'), 65 | ], 66 | 67 | ], 68 | 69 | ]; 70 | -------------------------------------------------------------------------------- /app/Http/Kernel.php: -------------------------------------------------------------------------------- 1 | [ 32 | \App\Http\Middleware\EncryptCookies::class, 33 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 34 | \Illuminate\Session\Middleware\StartSession::class, 35 | // \Illuminate\Session\Middleware\AuthenticateSession::class, 36 | \Illuminate\View\Middleware\ShareErrorsFromSession::class, 37 | \App\Http\Middleware\VerifyCsrfToken::class, 38 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 39 | ], 40 | 41 | 'api' => [ 42 | 'throttle:60,1', 43 | 'bindings', 44 | ], 45 | ]; 46 | 47 | /** 48 | * The application's route middleware. 49 | * 50 | * These middleware may be assigned to groups or used individually. 51 | * 52 | * @var array 53 | */ 54 | protected $routeMiddleware = [ 55 | 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 56 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 57 | 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 58 | 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 59 | 'can' => \Illuminate\Auth\Middleware\Authorize::class, 60 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 61 | 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 62 | ]; 63 | } 64 | -------------------------------------------------------------------------------- /resources/views/homepage.blade.php: -------------------------------------------------------------------------------- 1 | @php 2 | use Prismic\Dom\RichText; 3 | use Prismic\Dom\Link; 4 | 5 | $backgroundImageUrl = isset($document->data->background_image->url) ? $document->data->background_image->url : ''; 6 | $buttonUrl = Link::asUrl($document->data->button_link, $linkResolver); 7 | $buttonText = $document->data->button_text; 8 | @endphp 9 | 10 | @extends('layouts.app') 11 | 12 | @section('content') 13 | 14 |
15 | 16 |
17 | 29 |
30 | 31 | @foreach ($document->data->body as $slice) 32 | @switch ($slice->slice_type) 33 | @case ('highlight_section') 34 | @include('partials.slices.highlight-section', ['slice' => $slice]) 35 | @break 36 | @case ('banner') 37 | @include('partials.slices.banner', ['slice' => $slice]) 38 | @break 39 | @case ('quote_banner') 40 | @include('partials.slices.quote-banner', ['slice' => $slice]) 41 | @break 42 | @case ('text_section') 43 | @include('partials.slices.text-section', ['slice' => $slice]) 44 | @break 45 | @case ('image_slider') 46 | @include('partials.slices.image-slider', ['slice' => $slice]) 47 | @break 48 | @case ('gallery') 49 | @include('partials.slices.gallery', ['slice' => $slice]) 50 | @break 51 | @case ('video') 52 | @include('partials.slices.video', ['slice' => $slice]) 53 | @break 54 | @endswitch 55 | @endforeach 56 | 57 |
58 | 59 | @stop 60 | -------------------------------------------------------------------------------- /resources/assets/sass/partials/slices/_quote-banner.scss: -------------------------------------------------------------------------------- 1 | .quote-banner { 2 | position: relative; 3 | background-size: cover; 4 | background-position: center; 5 | height: 500px; 6 | display: flex; 7 | justify-content: center; 8 | align-items: center; 9 | flex-direction: column; 10 | margin-bottom: 110px; 11 | 12 | .container-text{ 13 | position: absolute; 14 | top: 0; 15 | padding: 110px; 16 | bottom: 0; 17 | width: 60%; 18 | text-transform: uppercase; 19 | right: 0; 20 | 21 | box-sizing: border-box; 22 | vertical-align: middle; 23 | background: rgba(51, 51, 51, 0.95); 24 | 25 | .quote-container{ 26 | position: absolute; 27 | left: 15%; 28 | top: 50%; 29 | transform: translateY(-50%); 30 | right: 15%; 31 | } 32 | } 33 | 34 | &.dark { 35 | .quote { 36 | @include quotes(#484d52); 37 | } 38 | } 39 | 40 | &.light { 41 | .container-text{ 42 | background: rgba(255, 255, 255, 0.95); 43 | } 44 | .author, h3 { 45 | display: inline-block; 46 | font-weight: 900; 47 | font-size: 35px; 48 | line-height: 50px; 49 | font-style: initial; 50 | color: #aaa; 51 | } 52 | .quote { 53 | @include quotes(#eee); 54 | h3{ 55 | color: #333; 56 | } 57 | } 58 | } 59 | 60 | 61 | 62 | .limit-container { 63 | width: 100%; 64 | display: flex; 65 | flex-direction: column; 66 | position: relative; 67 | height: 100%; 68 | justify-content: center; 69 | } 70 | 71 | .author { 72 | font-size: 14px; 73 | font-style: italic; 74 | color: #ccc; 75 | p{ 76 | margin-bottom: 0; 77 | } 78 | } 79 | 80 | .quote { 81 | &:before, &:after { 82 | font-size: 60px; 83 | } 84 | h3 { 85 | display: inline-block; 86 | font-weight: 900; 87 | font-size: 28px; 88 | line-height: 40px; 89 | font-style: initial; 90 | color: #fff; 91 | } 92 | 93 | } 94 | &.left{ 95 | .container-text{ 96 | left: 0; 97 | right: auto; 98 | } 99 | } 100 | } 101 | 102 | @media (max-width: $break-small) { 103 | .quote-banner{ 104 | height: auto; 105 | margin-bottom: 0; 106 | 107 | .container-text{ 108 | width: 100%; 109 | position: static; 110 | .quote-container{ 111 | 112 | position: static; 113 | transform: initial; 114 | } 115 | } 116 | } 117 | .quote{ 118 | font-size: 20px; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_DRIVER', 'sync'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Queue Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may configure the connection information for each server that 26 | | is used by your application. A default configuration has been added 27 | | for each back-end shipped with Laravel. You are free to add more. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'sync' => [ 34 | 'driver' => 'sync', 35 | ], 36 | 37 | 'database' => [ 38 | 'driver' => 'database', 39 | 'table' => 'jobs', 40 | 'queue' => 'default', 41 | 'retry_after' => 90, 42 | ], 43 | 44 | 'beanstalkd' => [ 45 | 'driver' => 'beanstalkd', 46 | 'host' => 'localhost', 47 | 'queue' => 'default', 48 | 'retry_after' => 90, 49 | ], 50 | 51 | 'sqs' => [ 52 | 'driver' => 'sqs', 53 | 'key' => 'your-public-key', 54 | 'secret' => 'your-secret-key', 55 | 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id', 56 | 'queue' => 'your-queue-name', 57 | 'region' => 'us-east-1', 58 | ], 59 | 60 | 'redis' => [ 61 | 'driver' => 'redis', 62 | 'connection' => 'default', 63 | 'queue' => 'default', 64 | 'retry_after' => 90, 65 | 'block_for' => null, 66 | ], 67 | 68 | ], 69 | 70 | /* 71 | |-------------------------------------------------------------------------- 72 | | Failed Queue Jobs 73 | |-------------------------------------------------------------------------- 74 | | 75 | | These options configure the behavior of failed queue job logging so you 76 | | can control which database and table are used to store the jobs that 77 | | have failed. You may change them to any database / table you wish. 78 | | 79 | */ 80 | 81 | 'failed' => [ 82 | 'database' => env('DB_CONNECTION', 'mysql'), 83 | 'table' => 'failed_jobs', 84 | ], 85 | 86 | ]; 87 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_DRIVER', 'file'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Cache Stores 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the cache "stores" for your application as 26 | | well as their drivers. You may even define multiple stores for the 27 | | same cache driver to group types of items stored in your caches. 28 | | 29 | */ 30 | 31 | 'stores' => [ 32 | 33 | 'apc' => [ 34 | 'driver' => 'apc', 35 | ], 36 | 37 | 'array' => [ 38 | 'driver' => 'array', 39 | ], 40 | 41 | 'database' => [ 42 | 'driver' => 'database', 43 | 'table' => 'cache', 44 | 'connection' => null, 45 | ], 46 | 47 | 'file' => [ 48 | 'driver' => 'file', 49 | 'path' => storage_path('framework/cache/data'), 50 | ], 51 | 52 | 'memcached' => [ 53 | 'driver' => 'memcached', 54 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 55 | 'sasl' => [ 56 | env('MEMCACHED_USERNAME'), 57 | env('MEMCACHED_PASSWORD'), 58 | ], 59 | 'options' => [ 60 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 61 | ], 62 | 'servers' => [ 63 | [ 64 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 65 | 'port' => env('MEMCACHED_PORT', 11211), 66 | 'weight' => 100, 67 | ], 68 | ], 69 | ], 70 | 71 | 'redis' => [ 72 | 'driver' => 'redis', 73 | 'connection' => 'default', 74 | ], 75 | 76 | ], 77 | 78 | /* 79 | |-------------------------------------------------------------------------- 80 | | Cache Key Prefix 81 | |-------------------------------------------------------------------------- 82 | | 83 | | When utilizing a RAM based store such as APC or Memcached, there might 84 | | be other applications utilizing the same cache. So, we'll specify a 85 | | value to get prefixed to all our keys so we can avoid collisions. 86 | | 87 | */ 88 | 89 | 'prefix' => env( 90 | 'CACHE_PREFIX', 91 | str_slug(env('APP_NAME', 'laravel'), '_').'_cache' 92 | ), 93 | 94 | ]; 95 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'guard' => 'web', 18 | 'passwords' => 'users', 19 | ], 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Authentication Guards 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Next, you may define every authentication guard for your application. 27 | | Of course, a great default configuration has been defined for you 28 | | here which uses session storage and the Eloquent user provider. 29 | | 30 | | All authentication drivers have a user provider. This defines how the 31 | | users are actually retrieved out of your database or other storage 32 | | mechanisms used by this application to persist your user's data. 33 | | 34 | | Supported: "session", "token" 35 | | 36 | */ 37 | 38 | 'guards' => [ 39 | 'web' => [ 40 | 'driver' => 'session', 41 | 'provider' => 'users', 42 | ], 43 | 44 | 'api' => [ 45 | 'driver' => 'token', 46 | 'provider' => 'users', 47 | ], 48 | ], 49 | 50 | /* 51 | |-------------------------------------------------------------------------- 52 | | User Providers 53 | |-------------------------------------------------------------------------- 54 | | 55 | | All authentication drivers have a user provider. This defines how the 56 | | users are actually retrieved out of your database or other storage 57 | | mechanisms used by this application to persist your user's data. 58 | | 59 | | If you have multiple user tables or models you may configure multiple 60 | | sources which represent each model / table. These sources may then 61 | | be assigned to any extra authentication guards you have defined. 62 | | 63 | | Supported: "database", "eloquent" 64 | | 65 | */ 66 | 67 | 'providers' => [ 68 | 'users' => [ 69 | 'driver' => 'eloquent', 70 | 'model' => App\User::class, 71 | ], 72 | 73 | // 'users' => [ 74 | // 'driver' => 'database', 75 | // 'table' => 'users', 76 | // ], 77 | ], 78 | 79 | /* 80 | |-------------------------------------------------------------------------- 81 | | Resetting Passwords 82 | |-------------------------------------------------------------------------- 83 | | 84 | | You may specify multiple password reset configurations if you have more 85 | | than one user table or model in the application and you want to have 86 | | separate password reset settings based on the specific user types. 87 | | 88 | | The expire time is the number of minutes that the reset token should be 89 | | considered valid. This security feature keeps tokens short-lived so 90 | | they have less time to be guessed. You may change this as needed. 91 | | 92 | */ 93 | 94 | 'passwords' => [ 95 | 'users' => [ 96 | 'provider' => 'users', 97 | 'table' => 'password_resets', 98 | 'expire' => 60, 99 | ], 100 | ], 101 | 102 | ]; 103 | -------------------------------------------------------------------------------- /public/img/logo-prismic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Artboard 2 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | input('token'); 42 | if (!isset($token)) { 43 | return abort(400, 'Bad Request'); 44 | } 45 | $url = $request->attributes->get('api')->previewSession($token, $request->attributes->get('linkResolver'), '/'); 46 | return response(null, 302)->header('Location', $url); 47 | }); 48 | 49 | /* 50 | |-------------------------------------------------------------------------- 51 | | Homepage route 52 | |-------------------------------------------------------------------------- 53 | */ 54 | 55 | Route::get('/', function (Request $request) { 56 | return redirect('/' . $request->attributes->get('currentLang')); 57 | }); 58 | 59 | Route::get('/{lang}', function ($lang, Request $request) { 60 | // Render 404 page if lang doesn't exist 61 | if (langExists($lang) === false) { 62 | return view('404'); 63 | } 64 | 65 | // Set the current lang 66 | $request->merge(['currentLang' => $lang]); 67 | 68 | // Query the homepage document by single type 69 | $document = $request->attributes->get('api')->getSingle('homepage', ['lang' => $lang]); 70 | 71 | // Render 404 page if homepage document doesn't exist 72 | if (isset($document) === false) { 73 | return view('404'); 74 | } 75 | 76 | // Fill meta array 77 | $meta = [ 78 | 'title' => isset($document->data->meta_title) ? $document->data->meta_title : null, 79 | 'description' => isset($document->data->meta_description) ? $document->data->meta_description : null, 80 | ]; 81 | 82 | // Render the page 83 | return view('homepage', ['document' => $document, 'meta' => $meta]); 84 | }); 85 | 86 | /* 87 | |-------------------------------------------------------------------------- 88 | | Page route 89 | |-------------------------------------------------------------------------- 90 | */ 91 | 92 | Route::get('/{lang}/page/{uid}', function ($lang, $uid, Request $request) { 93 | // Render 404 page if lang doesn't exist 94 | if (langExists($lang) === false) { 95 | return view('404'); 96 | } 97 | 98 | // Set the current lang 99 | $request->merge(['currentLang' => $lang]); 100 | 101 | // Query the page document by UID 102 | $document = $request->attributes->get('api')->getByUID('page', $uid, ['lang' => $lang]); 103 | 104 | // Render 404 page if page document doesn't exist 105 | if (isset($document) === false) { 106 | return view('404'); 107 | } 108 | 109 | // Fill meta array 110 | $meta = [ 111 | 'title' => isset($document->data->meta_title) ? $document->data->meta_title : null, 112 | 'description' => isset($document->data->meta_description) ? $document->data->meta_description : null, 113 | ]; 114 | 115 | // Render the page 116 | return view('page', ['document' => $document, 'meta' => $meta]); 117 | }); 118 | 119 | /* 120 | |-------------------------------------------------------------------------- 121 | | 404 Page not found 122 | |-------------------------------------------------------------------------- 123 | */ 124 | 125 | Route::get('/{any}', function ($any) { 126 | return view('404'); 127 | })->where('any', '.*'); 128 | -------------------------------------------------------------------------------- /config/database.php: -------------------------------------------------------------------------------- 1 | env('DB_CONNECTION', 'mysql'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Database Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here are each of the database connections setup for your application. 24 | | Of course, examples of configuring each database platform that is 25 | | supported by Laravel is shown below to make development simple. 26 | | 27 | | 28 | | All database work in Laravel is done through the PHP PDO facilities 29 | | so make sure you have the driver for your particular database of 30 | | choice installed on your machine before you begin development. 31 | | 32 | */ 33 | 34 | 'connections' => [ 35 | 36 | 'sqlite' => [ 37 | 'driver' => 'sqlite', 38 | 'database' => env('DB_DATABASE', database_path('database.sqlite')), 39 | 'prefix' => '', 40 | ], 41 | 42 | 'mysql' => [ 43 | 'driver' => 'mysql', 44 | 'host' => env('DB_HOST', '127.0.0.1'), 45 | 'port' => env('DB_PORT', '3306'), 46 | 'database' => env('DB_DATABASE', 'forge'), 47 | 'username' => env('DB_USERNAME', 'forge'), 48 | 'password' => env('DB_PASSWORD', ''), 49 | 'unix_socket' => env('DB_SOCKET', ''), 50 | 'charset' => 'utf8mb4', 51 | 'collation' => 'utf8mb4_unicode_ci', 52 | 'prefix' => '', 53 | 'strict' => true, 54 | 'engine' => null, 55 | ], 56 | 57 | 'pgsql' => [ 58 | 'driver' => 'pgsql', 59 | 'host' => env('DB_HOST', '127.0.0.1'), 60 | 'port' => env('DB_PORT', '5432'), 61 | 'database' => env('DB_DATABASE', 'forge'), 62 | 'username' => env('DB_USERNAME', 'forge'), 63 | 'password' => env('DB_PASSWORD', ''), 64 | 'charset' => 'utf8', 65 | 'prefix' => '', 66 | 'schema' => 'public', 67 | 'sslmode' => 'prefer', 68 | ], 69 | 70 | 'sqlsrv' => [ 71 | 'driver' => 'sqlsrv', 72 | 'host' => env('DB_HOST', 'localhost'), 73 | 'port' => env('DB_PORT', '1433'), 74 | 'database' => env('DB_DATABASE', 'forge'), 75 | 'username' => env('DB_USERNAME', 'forge'), 76 | 'password' => env('DB_PASSWORD', ''), 77 | 'charset' => 'utf8', 78 | 'prefix' => '', 79 | ], 80 | 81 | ], 82 | 83 | /* 84 | |-------------------------------------------------------------------------- 85 | | Migration Repository Table 86 | |-------------------------------------------------------------------------- 87 | | 88 | | This table keeps track of all the migrations that have already run for 89 | | your application. Using this information, we can determine which of 90 | | the migrations on disk haven't actually been run in the database. 91 | | 92 | */ 93 | 94 | 'migrations' => 'migrations', 95 | 96 | /* 97 | |-------------------------------------------------------------------------- 98 | | Redis Databases 99 | |-------------------------------------------------------------------------- 100 | | 101 | | Redis is an open source, fast, and advanced key-value store that also 102 | | provides a richer set of commands than a typical key-value systems 103 | | such as APC or Memcached. Laravel makes it easy to dig right in. 104 | | 105 | */ 106 | 107 | 'redis' => [ 108 | 109 | 'client' => 'predis', 110 | 111 | 'default' => [ 112 | 'host' => env('REDIS_HOST', '127.0.0.1'), 113 | 'password' => env('REDIS_PASSWORD', null), 114 | 'port' => env('REDIS_PORT', 6379), 115 | 'database' => 0, 116 | ], 117 | 118 | ], 119 | 120 | ]; 121 | -------------------------------------------------------------------------------- /config/mail.php: -------------------------------------------------------------------------------- 1 | env('MAIL_DRIVER', 'smtp'), 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | SMTP Host Address 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Here you may provide the host address of the SMTP server used by your 27 | | applications. A default option is provided that is compatible with 28 | | the Mailgun mail service which will provide reliable deliveries. 29 | | 30 | */ 31 | 32 | 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 33 | 34 | /* 35 | |-------------------------------------------------------------------------- 36 | | SMTP Host Port 37 | |-------------------------------------------------------------------------- 38 | | 39 | | This is the SMTP port used by your application to deliver e-mails to 40 | | users of the application. Like the host we have set this value to 41 | | stay compatible with the Mailgun e-mail application by default. 42 | | 43 | */ 44 | 45 | 'port' => env('MAIL_PORT', 587), 46 | 47 | /* 48 | |-------------------------------------------------------------------------- 49 | | Global "From" Address 50 | |-------------------------------------------------------------------------- 51 | | 52 | | You may wish for all e-mails sent by your application to be sent from 53 | | the same address. Here, you may specify a name and address that is 54 | | used globally for all e-mails that are sent by your application. 55 | | 56 | */ 57 | 58 | 'from' => [ 59 | 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 60 | 'name' => env('MAIL_FROM_NAME', 'Example'), 61 | ], 62 | 63 | /* 64 | |-------------------------------------------------------------------------- 65 | | E-Mail Encryption Protocol 66 | |-------------------------------------------------------------------------- 67 | | 68 | | Here you may specify the encryption protocol that should be used when 69 | | the application send e-mail messages. A sensible default using the 70 | | transport layer security protocol should provide great security. 71 | | 72 | */ 73 | 74 | 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 75 | 76 | /* 77 | |-------------------------------------------------------------------------- 78 | | SMTP Server Username 79 | |-------------------------------------------------------------------------- 80 | | 81 | | If your SMTP server requires a username for authentication, you should 82 | | set it here. This will get used to authenticate with your server on 83 | | connection. You may also set the "password" value below this one. 84 | | 85 | */ 86 | 87 | 'username' => env('MAIL_USERNAME'), 88 | 89 | 'password' => env('MAIL_PASSWORD'), 90 | 91 | /* 92 | |-------------------------------------------------------------------------- 93 | | Sendmail System Path 94 | |-------------------------------------------------------------------------- 95 | | 96 | | When using the "sendmail" driver to send e-mails, we will need to know 97 | | the path to where Sendmail lives on this server. A default path has 98 | | been provided here, which will work well on most of your systems. 99 | | 100 | */ 101 | 102 | 'sendmail' => '/usr/sbin/sendmail -bs', 103 | 104 | /* 105 | |-------------------------------------------------------------------------- 106 | | Markdown Mail Settings 107 | |-------------------------------------------------------------------------- 108 | | 109 | | If you are using Markdown based email rendering, you may configure your 110 | | theme and component paths here, allowing you to customize the design 111 | | of the emails. Or, you may simply stick with the Laravel defaults! 112 | | 113 | */ 114 | 115 | 'markdown' => [ 116 | 'theme' => 'default', 117 | 118 | 'paths' => [ 119 | resource_path('views/vendor/mail'), 120 | ], 121 | ], 122 | 123 | ]; 124 | -------------------------------------------------------------------------------- /resources/lang/en/validation.php: -------------------------------------------------------------------------------- 1 | 'The :attribute must be accepted.', 17 | 'active_url' => 'The :attribute is not a valid URL.', 18 | 'after' => 'The :attribute must be a date after :date.', 19 | 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', 20 | 'alpha' => 'The :attribute may only contain letters.', 21 | 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', 22 | 'alpha_num' => 'The :attribute may only contain letters and numbers.', 23 | 'array' => 'The :attribute must be an array.', 24 | 'before' => 'The :attribute must be a date before :date.', 25 | 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', 26 | 'between' => [ 27 | 'numeric' => 'The :attribute must be between :min and :max.', 28 | 'file' => 'The :attribute must be between :min and :max kilobytes.', 29 | 'string' => 'The :attribute must be between :min and :max characters.', 30 | 'array' => 'The :attribute must have between :min and :max items.', 31 | ], 32 | 'boolean' => 'The :attribute field must be true or false.', 33 | 'confirmed' => 'The :attribute confirmation does not match.', 34 | 'date' => 'The :attribute is not a valid date.', 35 | 'date_format' => 'The :attribute does not match the format :format.', 36 | 'different' => 'The :attribute and :other must be different.', 37 | 'digits' => 'The :attribute must be :digits digits.', 38 | 'digits_between' => 'The :attribute must be between :min and :max digits.', 39 | 'dimensions' => 'The :attribute has invalid image dimensions.', 40 | 'distinct' => 'The :attribute field has a duplicate value.', 41 | 'email' => 'The :attribute must be a valid email address.', 42 | 'exists' => 'The selected :attribute is invalid.', 43 | 'file' => 'The :attribute must be a file.', 44 | 'filled' => 'The :attribute field must have a value.', 45 | 'image' => 'The :attribute must be an image.', 46 | 'in' => 'The selected :attribute is invalid.', 47 | 'in_array' => 'The :attribute field does not exist in :other.', 48 | 'integer' => 'The :attribute must be an integer.', 49 | 'ip' => 'The :attribute must be a valid IP address.', 50 | 'ipv4' => 'The :attribute must be a valid IPv4 address.', 51 | 'ipv6' => 'The :attribute must be a valid IPv6 address.', 52 | 'json' => 'The :attribute must be a valid JSON string.', 53 | 'max' => [ 54 | 'numeric' => 'The :attribute may not be greater than :max.', 55 | 'file' => 'The :attribute may not be greater than :max kilobytes.', 56 | 'string' => 'The :attribute may not be greater than :max characters.', 57 | 'array' => 'The :attribute may not have more than :max items.', 58 | ], 59 | 'mimes' => 'The :attribute must be a file of type: :values.', 60 | 'mimetypes' => 'The :attribute must be a file of type: :values.', 61 | 'min' => [ 62 | 'numeric' => 'The :attribute must be at least :min.', 63 | 'file' => 'The :attribute must be at least :min kilobytes.', 64 | 'string' => 'The :attribute must be at least :min characters.', 65 | 'array' => 'The :attribute must have at least :min items.', 66 | ], 67 | 'not_in' => 'The selected :attribute is invalid.', 68 | 'numeric' => 'The :attribute must be a number.', 69 | 'present' => 'The :attribute field must be present.', 70 | 'regex' => 'The :attribute format is invalid.', 71 | 'required' => 'The :attribute field is required.', 72 | 'required_if' => 'The :attribute field is required when :other is :value.', 73 | 'required_unless' => 'The :attribute field is required unless :other is in :values.', 74 | 'required_with' => 'The :attribute field is required when :values is present.', 75 | 'required_with_all' => 'The :attribute field is required when :values is present.', 76 | 'required_without' => 'The :attribute field is required when :values is not present.', 77 | 'required_without_all' => 'The :attribute field is required when none of :values are present.', 78 | 'same' => 'The :attribute and :other must match.', 79 | 'size' => [ 80 | 'numeric' => 'The :attribute must be :size.', 81 | 'file' => 'The :attribute must be :size kilobytes.', 82 | 'string' => 'The :attribute must be :size characters.', 83 | 'array' => 'The :attribute must contain :size items.', 84 | ], 85 | 'string' => 'The :attribute must be a string.', 86 | 'timezone' => 'The :attribute must be a valid zone.', 87 | 'unique' => 'The :attribute has already been taken.', 88 | 'uploaded' => 'The :attribute failed to upload.', 89 | 'url' => 'The :attribute format is invalid.', 90 | 91 | /* 92 | |-------------------------------------------------------------------------- 93 | | Custom Validation Language Lines 94 | |-------------------------------------------------------------------------- 95 | | 96 | | Here you may specify custom validation messages for attributes using the 97 | | convention "attribute.rule" to name the lines. This makes it quick to 98 | | specify a specific custom language line for a given attribute rule. 99 | | 100 | */ 101 | 102 | 'custom' => [ 103 | 'attribute-name' => [ 104 | 'rule-name' => 'custom-message', 105 | ], 106 | ], 107 | 108 | /* 109 | |-------------------------------------------------------------------------- 110 | | Custom Validation Attributes 111 | |-------------------------------------------------------------------------- 112 | | 113 | | The following language lines are used to swap attribute place-holders 114 | | with something more reader friendly such as E-Mail Address instead 115 | | of "email". This simply helps us make messages a little cleaner. 116 | | 117 | */ 118 | 119 | 'attributes' => [], 120 | 121 | ]; 122 | -------------------------------------------------------------------------------- /config/session.php: -------------------------------------------------------------------------------- 1 | env('SESSION_DRIVER', 'file'), 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Session Lifetime 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Here you may specify the number of minutes that you wish the session 27 | | to be allowed to remain idle before it expires. If you want them 28 | | to immediately expire on the browser closing, set that option. 29 | | 30 | */ 31 | 32 | 'lifetime' => env('SESSION_LIFETIME', 120), 33 | 34 | 'expire_on_close' => false, 35 | 36 | /* 37 | |-------------------------------------------------------------------------- 38 | | Session Encryption 39 | |-------------------------------------------------------------------------- 40 | | 41 | | This option allows you to easily specify that all of your session data 42 | | should be encrypted before it is stored. All encryption will be run 43 | | automatically by Laravel and you can use the Session like normal. 44 | | 45 | */ 46 | 47 | 'encrypt' => false, 48 | 49 | /* 50 | |-------------------------------------------------------------------------- 51 | | Session File Location 52 | |-------------------------------------------------------------------------- 53 | | 54 | | When using the native session driver, we need a location where session 55 | | files may be stored. A default has been set for you but a different 56 | | location may be specified. This is only needed for file sessions. 57 | | 58 | */ 59 | 60 | 'files' => storage_path('framework/sessions'), 61 | 62 | /* 63 | |-------------------------------------------------------------------------- 64 | | Session Database Connection 65 | |-------------------------------------------------------------------------- 66 | | 67 | | When using the "database" or "redis" session drivers, you may specify a 68 | | connection that should be used to manage these sessions. This should 69 | | correspond to a connection in your database configuration options. 70 | | 71 | */ 72 | 73 | 'connection' => null, 74 | 75 | /* 76 | |-------------------------------------------------------------------------- 77 | | Session Database Table 78 | |-------------------------------------------------------------------------- 79 | | 80 | | When using the "database" session driver, you may specify the table we 81 | | should use to manage the sessions. Of course, a sensible default is 82 | | provided for you; however, you are free to change this as needed. 83 | | 84 | */ 85 | 86 | 'table' => 'sessions', 87 | 88 | /* 89 | |-------------------------------------------------------------------------- 90 | | Session Cache Store 91 | |-------------------------------------------------------------------------- 92 | | 93 | | When using the "apc" or "memcached" session drivers, you may specify a 94 | | cache store that should be used for these sessions. This value must 95 | | correspond with one of the application's configured cache stores. 96 | | 97 | */ 98 | 99 | 'store' => null, 100 | 101 | /* 102 | |-------------------------------------------------------------------------- 103 | | Session Sweeping Lottery 104 | |-------------------------------------------------------------------------- 105 | | 106 | | Some session drivers must manually sweep their storage location to get 107 | | rid of old sessions from storage. Here are the chances that it will 108 | | happen on a given request. By default, the odds are 2 out of 100. 109 | | 110 | */ 111 | 112 | 'lottery' => [2, 100], 113 | 114 | /* 115 | |-------------------------------------------------------------------------- 116 | | Session Cookie Name 117 | |-------------------------------------------------------------------------- 118 | | 119 | | Here you may change the name of the cookie used to identify a session 120 | | instance by ID. The name specified here will get used every time a 121 | | new session cookie is created by the framework for every driver. 122 | | 123 | */ 124 | 125 | 'cookie' => env( 126 | 'SESSION_COOKIE', 127 | str_slug(env('APP_NAME', 'laravel'), '_').'_session' 128 | ), 129 | 130 | /* 131 | |-------------------------------------------------------------------------- 132 | | Session Cookie Path 133 | |-------------------------------------------------------------------------- 134 | | 135 | | The session cookie path determines the path for which the cookie will 136 | | be regarded as available. Typically, this will be the root path of 137 | | your application but you are free to change this when necessary. 138 | | 139 | */ 140 | 141 | 'path' => '/', 142 | 143 | /* 144 | |-------------------------------------------------------------------------- 145 | | Session Cookie Domain 146 | |-------------------------------------------------------------------------- 147 | | 148 | | Here you may change the domain of the cookie used to identify a session 149 | | in your application. This will determine which domains the cookie is 150 | | available to in your application. A sensible default has been set. 151 | | 152 | */ 153 | 154 | 'domain' => env('SESSION_DOMAIN', null), 155 | 156 | /* 157 | |-------------------------------------------------------------------------- 158 | | HTTPS Only Cookies 159 | |-------------------------------------------------------------------------- 160 | | 161 | | By setting this option to true, session cookies will only be sent back 162 | | to the server if the browser has a HTTPS connection. This will keep 163 | | the cookie from being sent to you if it can not be done securely. 164 | | 165 | */ 166 | 167 | 'secure' => env('SESSION_SECURE_COOKIE', false), 168 | 169 | /* 170 | |-------------------------------------------------------------------------- 171 | | HTTP Access Only 172 | |-------------------------------------------------------------------------- 173 | | 174 | | Setting this value to true will prevent JavaScript from accessing the 175 | | value of the cookie and the cookie will only be accessible through 176 | | the HTTP protocol. You are free to modify this option if needed. 177 | | 178 | */ 179 | 180 | 'http_only' => true, 181 | 182 | /* 183 | |-------------------------------------------------------------------------- 184 | | Same-Site Cookies 185 | |-------------------------------------------------------------------------- 186 | | 187 | | This option determines how your cookies behave when cross-site requests 188 | | take place, and can be used to mitigate CSRF attacks. By default, we 189 | | do not enable this as other CSRF protection services are in place. 190 | | 191 | | Supported: "lax", "strict" 192 | | 193 | */ 194 | 195 | 'same_site' => null, 196 | 197 | ]; 198 | -------------------------------------------------------------------------------- /config/app.php: -------------------------------------------------------------------------------- 1 | env('APP_NAME', 'Laravel'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Application Environment 21 | |-------------------------------------------------------------------------- 22 | | 23 | | This value determines the "environment" your application is currently 24 | | running in. This may determine how you prefer to configure various 25 | | services your application utilizes. Set this in your ".env" file. 26 | | 27 | */ 28 | 29 | 'env' => env('APP_ENV', 'production'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Application Debug Mode 34 | |-------------------------------------------------------------------------- 35 | | 36 | | When your application is in debug mode, detailed error messages with 37 | | stack traces will be shown on every error that occurs within your 38 | | application. If disabled, a simple generic error page is shown. 39 | | 40 | */ 41 | 42 | 'debug' => env('APP_DEBUG', false), 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Application URL 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This URL is used by the console to properly generate URLs when using 50 | | the Artisan command line tool. You should set this to the root of 51 | | your application so that it is used when running Artisan tasks. 52 | | 53 | */ 54 | 55 | 'url' => env('APP_URL', 'http://localhost'), 56 | 57 | /* 58 | |-------------------------------------------------------------------------- 59 | | Application Timezone 60 | |-------------------------------------------------------------------------- 61 | | 62 | | Here you may specify the default timezone for your application, which 63 | | will be used by the PHP date and date-time functions. We have gone 64 | | ahead and set this to a sensible default for you out of the box. 65 | | 66 | */ 67 | 68 | 'timezone' => 'UTC', 69 | 70 | /* 71 | |-------------------------------------------------------------------------- 72 | | Application Locale Configuration 73 | |-------------------------------------------------------------------------- 74 | | 75 | | The application locale determines the default locale that will be used 76 | | by the translation service provider. You are free to set this value 77 | | to any of the locales which will be supported by the application. 78 | | 79 | */ 80 | 81 | 'locale' => 'en', 82 | 83 | /* 84 | |-------------------------------------------------------------------------- 85 | | Application Fallback Locale 86 | |-------------------------------------------------------------------------- 87 | | 88 | | The fallback locale determines the locale to use when the current one 89 | | is not available. You may change the value to correspond to any of 90 | | the language folders that are provided through your application. 91 | | 92 | */ 93 | 94 | 'fallback_locale' => 'en', 95 | 96 | /* 97 | |-------------------------------------------------------------------------- 98 | | Encryption Key 99 | |-------------------------------------------------------------------------- 100 | | 101 | | This key is used by the Illuminate encrypter service and should be set 102 | | to a random, 32 character string, otherwise these encrypted strings 103 | | will not be safe. Please do this before deploying an application! 104 | | 105 | */ 106 | 107 | 'key' => env('APP_KEY'), 108 | 109 | 'cipher' => 'AES-256-CBC', 110 | 111 | /* 112 | |-------------------------------------------------------------------------- 113 | | Autoloaded Service Providers 114 | |-------------------------------------------------------------------------- 115 | | 116 | | The service providers listed here will be automatically loaded on the 117 | | request to your application. Feel free to add your own services to 118 | | this array to grant expanded functionality to your applications. 119 | | 120 | */ 121 | 122 | 'providers' => [ 123 | 124 | /* 125 | * Laravel Framework Service Providers... 126 | */ 127 | Illuminate\Auth\AuthServiceProvider::class, 128 | Illuminate\Broadcasting\BroadcastServiceProvider::class, 129 | Illuminate\Bus\BusServiceProvider::class, 130 | Illuminate\Cache\CacheServiceProvider::class, 131 | Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, 132 | Illuminate\Cookie\CookieServiceProvider::class, 133 | Illuminate\Database\DatabaseServiceProvider::class, 134 | Illuminate\Encryption\EncryptionServiceProvider::class, 135 | Illuminate\Filesystem\FilesystemServiceProvider::class, 136 | Illuminate\Foundation\Providers\FoundationServiceProvider::class, 137 | Illuminate\Hashing\HashServiceProvider::class, 138 | Illuminate\Mail\MailServiceProvider::class, 139 | Illuminate\Notifications\NotificationServiceProvider::class, 140 | Illuminate\Pagination\PaginationServiceProvider::class, 141 | Illuminate\Pipeline\PipelineServiceProvider::class, 142 | Illuminate\Queue\QueueServiceProvider::class, 143 | Illuminate\Redis\RedisServiceProvider::class, 144 | Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, 145 | Illuminate\Session\SessionServiceProvider::class, 146 | Illuminate\Translation\TranslationServiceProvider::class, 147 | Illuminate\Validation\ValidationServiceProvider::class, 148 | Illuminate\View\ViewServiceProvider::class, 149 | 150 | /* 151 | * Package Service Providers... 152 | */ 153 | 154 | /* 155 | * Application Service Providers... 156 | */ 157 | App\Providers\AppServiceProvider::class, 158 | App\Providers\AuthServiceProvider::class, 159 | // App\Providers\BroadcastServiceProvider::class, 160 | App\Providers\EventServiceProvider::class, 161 | App\Providers\RouteServiceProvider::class, 162 | App\Providers\PrismicServiceProvider::class, 163 | 164 | ], 165 | 166 | /* 167 | |-------------------------------------------------------------------------- 168 | | Class Aliases 169 | |-------------------------------------------------------------------------- 170 | | 171 | | This array of class aliases will be registered when this application 172 | | is started. However, feel free to register as many as you wish as 173 | | the aliases are "lazy" loaded so they don't hinder performance. 174 | | 175 | */ 176 | 177 | 'aliases' => [ 178 | 179 | 'App' => Illuminate\Support\Facades\App::class, 180 | 'Artisan' => Illuminate\Support\Facades\Artisan::class, 181 | 'Auth' => Illuminate\Support\Facades\Auth::class, 182 | 'Blade' => Illuminate\Support\Facades\Blade::class, 183 | 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, 184 | 'Bus' => Illuminate\Support\Facades\Bus::class, 185 | 'Cache' => Illuminate\Support\Facades\Cache::class, 186 | 'Config' => Illuminate\Support\Facades\Config::class, 187 | 'Cookie' => Illuminate\Support\Facades\Cookie::class, 188 | 'Crypt' => Illuminate\Support\Facades\Crypt::class, 189 | 'DB' => Illuminate\Support\Facades\DB::class, 190 | 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 191 | 'Event' => Illuminate\Support\Facades\Event::class, 192 | 'File' => Illuminate\Support\Facades\File::class, 193 | 'Gate' => Illuminate\Support\Facades\Gate::class, 194 | 'Hash' => Illuminate\Support\Facades\Hash::class, 195 | 'Lang' => Illuminate\Support\Facades\Lang::class, 196 | 'Log' => Illuminate\Support\Facades\Log::class, 197 | 'Mail' => Illuminate\Support\Facades\Mail::class, 198 | 'Notification' => Illuminate\Support\Facades\Notification::class, 199 | 'Password' => Illuminate\Support\Facades\Password::class, 200 | 'Queue' => Illuminate\Support\Facades\Queue::class, 201 | 'Redirect' => Illuminate\Support\Facades\Redirect::class, 202 | 'Redis' => Illuminate\Support\Facades\Redis::class, 203 | 'Request' => Illuminate\Support\Facades\Request::class, 204 | 'Response' => Illuminate\Support\Facades\Response::class, 205 | 'Route' => Illuminate\Support\Facades\Route::class, 206 | 'Schema' => Illuminate\Support\Facades\Schema::class, 207 | 'Session' => Illuminate\Support\Facades\Session::class, 208 | 'Storage' => Illuminate\Support\Facades\Storage::class, 209 | 'URL' => Illuminate\Support\Facades\URL::class, 210 | 'Validator' => Illuminate\Support\Facades\Validator::class, 211 | 'View' => Illuminate\Support\Facades\View::class, 212 | 213 | ], 214 | 215 | ]; 216 | -------------------------------------------------------------------------------- /resources/assets/sass/vendor/_lightslider.css: -------------------------------------------------------------------------------- 1 | /*! lightslider - v1.1.3 - 2015-04-14 2 | * https://github.com/sachinchoolur/lightslider 3 | * Copyright (c) 2015 Sachin N; Licensed MIT */ 4 | /** /!!! core css Should not edit !!!/**/ 5 | 6 | .lSSlideOuter { 7 | overflow: hidden; 8 | -webkit-touch-callout: none; 9 | -webkit-user-select: none; 10 | -khtml-user-select: none; 11 | -moz-user-select: none; 12 | -ms-user-select: none; 13 | user-select: none 14 | } 15 | .lightSlider:before, .lightSlider:after { 16 | content: " "; 17 | display: table; 18 | } 19 | .lightSlider { 20 | overflow: hidden; 21 | margin: 0; 22 | } 23 | .lSSlideWrapper { 24 | max-width: 100%; 25 | overflow: hidden; 26 | position: relative; 27 | } 28 | .lSSlideWrapper > .lightSlider:after { 29 | clear: both; 30 | } 31 | .lSSlideWrapper .lSSlide { 32 | -webkit-transform: translate(0px, 0px); 33 | -ms-transform: translate(0px, 0px); 34 | transform: translate(0px, 0px); 35 | -webkit-transition: all 1s; 36 | -webkit-transition-property: -webkit-transform,height; 37 | -moz-transition-property: -moz-transform,height; 38 | transition-property: transform,height; 39 | -webkit-transition-duration: inherit !important; 40 | transition-duration: inherit !important; 41 | -webkit-transition-timing-function: inherit !important; 42 | transition-timing-function: inherit !important; 43 | } 44 | .lSSlideWrapper .lSFade { 45 | position: relative; 46 | } 47 | .lSSlideWrapper .lSFade > * { 48 | position: absolute !important; 49 | top: 0; 50 | left: 0; 51 | z-index: 9; 52 | margin-right: 0; 53 | width: 100%; 54 | } 55 | .lSSlideWrapper.usingCss .lSFade > * { 56 | opacity: 0; 57 | -webkit-transition-delay: 0s; 58 | transition-delay: 0s; 59 | -webkit-transition-duration: inherit !important; 60 | transition-duration: inherit !important; 61 | -webkit-transition-property: opacity; 62 | transition-property: opacity; 63 | -webkit-transition-timing-function: inherit !important; 64 | transition-timing-function: inherit !important; 65 | } 66 | .lSSlideWrapper .lSFade > *.active { 67 | z-index: 10; 68 | } 69 | .lSSlideWrapper.usingCss .lSFade > *.active { 70 | opacity: 1; 71 | } 72 | /** /!!! End of core css Should not edit !!!/**/ 73 | 74 | /* Pager */ 75 | .lSSlideOuter .lSPager.lSpg { 76 | margin: 10px 0 0; 77 | padding: 0; 78 | text-align: center; 79 | } 80 | .lSSlideOuter .lSPager.lSpg > li { 81 | cursor: pointer; 82 | display: inline-block; 83 | padding: 0 5px; 84 | } 85 | .lSSlideOuter .lSPager.lSpg > li a { 86 | background-color: #222222; 87 | border-radius: 30px; 88 | display: inline-block; 89 | height: 8px; 90 | overflow: hidden; 91 | text-indent: -999em; 92 | width: 8px; 93 | position: relative; 94 | z-index: 99; 95 | -webkit-transition: all 0.5s linear 0s; 96 | transition: all 0.5s linear 0s; 97 | } 98 | .lSSlideOuter .lSPager.lSpg > li:hover a, .lSSlideOuter .lSPager.lSpg > li.active a { 99 | background-color: #428bca; 100 | } 101 | .lSSlideOuter .media { 102 | opacity: 0.8; 103 | } 104 | .lSSlideOuter .media.active { 105 | opacity: 1; 106 | } 107 | /* End of pager */ 108 | 109 | /** Gallery */ 110 | .lSSlideOuter .lSPager.lSGallery { 111 | list-style: none outside none; 112 | padding-left: 0; 113 | margin: 0; 114 | overflow: hidden; 115 | transform: translate3d(0px, 0px, 0px); 116 | -moz-transform: translate3d(0px, 0px, 0px); 117 | -ms-transform: translate3d(0px, 0px, 0px); 118 | -webkit-transform: translate3d(0px, 0px, 0px); 119 | -o-transform: translate3d(0px, 0px, 0px); 120 | -webkit-transition-property: -webkit-transform; 121 | -moz-transition-property: -moz-transform; 122 | -webkit-touch-callout: none; 123 | -webkit-user-select: none; 124 | -khtml-user-select: none; 125 | -moz-user-select: none; 126 | -ms-user-select: none; 127 | user-select: none; 128 | } 129 | .lSSlideOuter .lSPager.lSGallery li { 130 | overflow: hidden; 131 | -webkit-transition: border-radius 0.12s linear 0s 0.35s linear 0s; 132 | transition: border-radius 0.12s linear 0s 0.35s linear 0s; 133 | } 134 | .lSSlideOuter .lSPager.lSGallery li.active, .lSSlideOuter .lSPager.lSGallery li:hover { 135 | border-radius: 5px; 136 | } 137 | .lSSlideOuter .lSPager.lSGallery img { 138 | display: block; 139 | height: auto; 140 | max-width: 100%; 141 | } 142 | .lSSlideOuter .lSPager.lSGallery:before, .lSSlideOuter .lSPager.lSGallery:after { 143 | content: " "; 144 | display: table; 145 | } 146 | .lSSlideOuter .lSPager.lSGallery:after { 147 | clear: both; 148 | } 149 | /* End of Gallery*/ 150 | 151 | /* slider actions */ 152 | .lSAction > a { 153 | width: 32px; 154 | display: block; 155 | top: 50%; 156 | height: 32px; 157 | background-image: url("/img/controls.png"); 158 | cursor: pointer; 159 | position: absolute; 160 | z-index: 99; 161 | margin-top: -16px; 162 | opacity: 0.5; 163 | -webkit-transition: opacity 0.35s linear 0s; 164 | transition: opacity 0.35s linear 0s; 165 | } 166 | .lSAction > a:hover { 167 | opacity: 1; 168 | } 169 | .lSAction > .lSPrev { 170 | background-position: 0 0; 171 | left: 10px; 172 | } 173 | .lSAction > .lSNext { 174 | background-position: -32px 0; 175 | right: 10px; 176 | } 177 | .lSAction > a.disabled { 178 | pointer-events: none; 179 | } 180 | .cS-hidden { 181 | height: 1px; 182 | opacity: 0; 183 | filter: alpha(opacity=0); 184 | overflow: hidden; 185 | } 186 | 187 | 188 | /* vertical */ 189 | .lSSlideOuter.vertical { 190 | position: relative; 191 | } 192 | .lSSlideOuter.vertical.noPager { 193 | padding-right: 0px !important; 194 | } 195 | .lSSlideOuter.vertical .lSGallery { 196 | position: absolute !important; 197 | right: 0; 198 | top: 0; 199 | } 200 | .lSSlideOuter.vertical .lightSlider > * { 201 | width: 100% !important; 202 | max-width: none !important; 203 | } 204 | 205 | /* vertical controlls */ 206 | .lSSlideOuter.vertical .lSAction > a { 207 | left: 50%; 208 | margin-left: -14px; 209 | margin-top: 0; 210 | } 211 | .lSSlideOuter.vertical .lSAction > .lSNext { 212 | background-position: 31px -31px; 213 | bottom: 10px; 214 | top: auto; 215 | } 216 | .lSSlideOuter.vertical .lSAction > .lSPrev { 217 | background-position: 0 -31px; 218 | bottom: auto; 219 | top: 10px; 220 | } 221 | /* vertical */ 222 | 223 | 224 | /* Rtl */ 225 | .lSSlideOuter.lSrtl { 226 | direction: rtl; 227 | } 228 | .lSSlideOuter .lightSlider, .lSSlideOuter .lSPager { 229 | padding-left: 0; 230 | list-style: none outside none; 231 | } 232 | .lSSlideOuter.lSrtl .lightSlider, .lSSlideOuter.lSrtl .lSPager { 233 | padding-right: 0; 234 | } 235 | .lSSlideOuter .lightSlider > *, .lSSlideOuter .lSGallery li { 236 | float: left; 237 | } 238 | .lSSlideOuter.lSrtl .lightSlider > *, .lSSlideOuter.lSrtl .lSGallery li { 239 | float: right !important; 240 | } 241 | /* Rtl */ 242 | 243 | @-webkit-keyframes rightEnd { 244 | 0% { 245 | left: 0; 246 | } 247 | 248 | 50% { 249 | left: -15px; 250 | } 251 | 252 | 100% { 253 | left: 0; 254 | } 255 | } 256 | @keyframes rightEnd { 257 | 0% { 258 | left: 0; 259 | } 260 | 261 | 50% { 262 | left: -15px; 263 | } 264 | 265 | 100% { 266 | left: 0; 267 | } 268 | } 269 | @-webkit-keyframes topEnd { 270 | 0% { 271 | top: 0; 272 | } 273 | 274 | 50% { 275 | top: -15px; 276 | } 277 | 278 | 100% { 279 | top: 0; 280 | } 281 | } 282 | @keyframes topEnd { 283 | 0% { 284 | top: 0; 285 | } 286 | 287 | 50% { 288 | top: -15px; 289 | } 290 | 291 | 100% { 292 | top: 0; 293 | } 294 | } 295 | @-webkit-keyframes leftEnd { 296 | 0% { 297 | left: 0; 298 | } 299 | 300 | 50% { 301 | left: 15px; 302 | } 303 | 304 | 100% { 305 | left: 0; 306 | } 307 | } 308 | @keyframes leftEnd { 309 | 0% { 310 | left: 0; 311 | } 312 | 313 | 50% { 314 | left: 15px; 315 | } 316 | 317 | 100% { 318 | left: 0; 319 | } 320 | } 321 | @-webkit-keyframes bottomEnd { 322 | 0% { 323 | bottom: 0; 324 | } 325 | 326 | 50% { 327 | bottom: -15px; 328 | } 329 | 330 | 100% { 331 | bottom: 0; 332 | } 333 | } 334 | @keyframes bottomEnd { 335 | 0% { 336 | bottom: 0; 337 | } 338 | 339 | 50% { 340 | bottom: -15px; 341 | } 342 | 343 | 100% { 344 | bottom: 0; 345 | } 346 | } 347 | .lSSlideOuter .rightEnd { 348 | -webkit-animation: rightEnd 0.3s; 349 | animation: rightEnd 0.3s; 350 | position: relative; 351 | } 352 | .lSSlideOuter .leftEnd { 353 | -webkit-animation: leftEnd 0.3s; 354 | animation: leftEnd 0.3s; 355 | position: relative; 356 | } 357 | .lSSlideOuter.vertical .rightEnd { 358 | -webkit-animation: topEnd 0.3s; 359 | animation: topEnd 0.3s; 360 | position: relative; 361 | } 362 | .lSSlideOuter.vertical .leftEnd { 363 | -webkit-animation: bottomEnd 0.3s; 364 | animation: bottomEnd 0.3s; 365 | position: relative; 366 | } 367 | .lSSlideOuter.lSrtl .rightEnd { 368 | -webkit-animation: leftEnd 0.3s; 369 | animation: leftEnd 0.3s; 370 | position: relative; 371 | } 372 | .lSSlideOuter.lSrtl .leftEnd { 373 | -webkit-animation: rightEnd 0.3s; 374 | animation: rightEnd 0.3s; 375 | position: relative; 376 | } 377 | /*/ GRab cursor */ 378 | .lightSlider.lsGrab > * { 379 | cursor: -webkit-grab; 380 | cursor: -moz-grab; 381 | cursor: -o-grab; 382 | cursor: -ms-grab; 383 | cursor: grab; 384 | } 385 | .lightSlider.lsGrabbing > * { 386 | cursor: move; 387 | cursor: -webkit-grabbing; 388 | cursor: -moz-grabbing; 389 | cursor: -o-grabbing; 390 | cursor: -ms-grabbing; 391 | cursor: grabbing; 392 | } 393 | -------------------------------------------------------------------------------- /custom_types/page.json: -------------------------------------------------------------------------------- 1 | { 2 | "Main": { 3 | "uid": { 4 | "type": "UID", 5 | "config": { 6 | "placeholder": "meaningful-unique-identifier...", 7 | "label": "Unique ID" 8 | } 9 | }, 10 | "body": { 11 | "type": "Slices", 12 | "fieldset": "Page content", 13 | "config": { 14 | "choices": { 15 | "highlight_section": { 16 | "type": "Slice", 17 | "fieldset": "Featured with CTA", 18 | "description": "A featured section with image on one side and text with title and CTA on the other side.", 19 | "icon": "art_track", 20 | "non-repeat": { 21 | "image": { 22 | "type": "Image", 23 | "config": { 24 | "constraint": { 25 | "width": 1080, 26 | "height": 1360 27 | }, 28 | "thumbnails": [ 29 | { 30 | "name": "Mobile", 31 | "width": 290, 32 | "height": 360 33 | } 34 | ], 35 | "label": "Image" 36 | } 37 | }, 38 | "title": { 39 | "type": "StructuredText", 40 | "config": { 41 | "single": "heading2", 42 | "label": "Title", 43 | "placeholder": "Section's title goes here" 44 | } 45 | }, 46 | "description": { 47 | "type": "StructuredText", 48 | "config": { 49 | "multi": "paragraph", 50 | "label": "Description", 51 | "placeholder": "My description" 52 | } 53 | }, 54 | "button_label": { 55 | "type": "StructuredText", 56 | "config": { 57 | "multi": "paragraph, preformatted, heading1, heading2, heading3, heading4, heading5, heading6, strong, em, hyperlink, image, embed, list-item, o-list-item, o-list-item", 58 | "label": "Button label", 59 | "placeholder": "Click Here" 60 | } 61 | }, 62 | "button_link": { 63 | "type": "Link", 64 | "config": { 65 | "label": "Button Link", 66 | "placeholder": "Select the link" 67 | } 68 | } 69 | }, 70 | "repeat": {} 71 | }, 72 | "banner": { 73 | "type": "Slice", 74 | "fieldset": "CTA Banner", 75 | "description": "A call to action banner with background", 76 | "icon": "ondemand_video", 77 | "non-repeat": { 78 | "title": { 79 | "type": "StructuredText", 80 | "config": { 81 | "placeholder": "Banner text...", 82 | "single": "heading2" 83 | } 84 | }, 85 | "link": { 86 | "config": { 87 | "placeholder": "Optional Link", 88 | "allowTargetBlank": true, 89 | "label": "Button Link" 90 | }, 91 | "type": "Link", 92 | "fieldset": "Button Link" 93 | }, 94 | "link_text": { 95 | "type": "StructuredText", 96 | "config": { 97 | "placeholder": "Button Label", 98 | "single": "paragraph" 99 | } 100 | }, 101 | "image": { 102 | "type": "Image", 103 | "config": { 104 | "constraint": { 105 | "width": null, 106 | "height": null 107 | }, 108 | "thumbnails": [], 109 | "label": "Image large" 110 | } 111 | } 112 | } 113 | }, 114 | "quote_banner": { 115 | "type": "Slice", 116 | "fieldset": "Quote Banner", 117 | "description": "A quote banner with a background image ", 118 | "icon": "format_quote", 119 | "non-repeat": { 120 | "background_image": { 121 | "type": "Image", 122 | "config": { 123 | "constraint": { 124 | "width": 2000, 125 | "height": 600 126 | }, 127 | "thumbnails": [ 128 | { 129 | "name": "Mobile", 130 | "width": 370, 131 | "height": 260 132 | } 133 | ], 134 | "label": "Background image" 135 | } 136 | }, 137 | "quote": { 138 | "type": "StructuredText", 139 | "config": { 140 | "single": "heading3", 141 | "label": "Quote", 142 | "placeholder": "Designer's quote" 143 | } 144 | }, 145 | "quote_author": { 146 | "type": "StructuredText", 147 | "config": { 148 | "single": "paragraph", 149 | "label": "Quote author", 150 | "placeholder": "Fashion designer - Jane Doe" 151 | } 152 | }, 153 | "quote_position": { 154 | "type": "Select", 155 | "config": { 156 | "options": [ 157 | "Right", 158 | "Left" 159 | ], 160 | "label": "Quote position", 161 | "placeholder": "Quote position" 162 | } 163 | }, 164 | "quote_style": { 165 | "type": "Select", 166 | "config": { 167 | "options": [ 168 | "dark", 169 | "light" 170 | ], 171 | "label": "quote_style", 172 | "placeholder": "style" 173 | } 174 | } 175 | } 176 | }, 177 | "text_section": { 178 | "type": "Slice", 179 | "fieldset": "Text Section", 180 | "description": "This is a rich text section", 181 | "icon": "text_fields", 182 | "non-repeat": { 183 | "text": { 184 | "type": "StructuredText", 185 | "config": { 186 | "placeholder": "type your text here...", 187 | "labels": { 188 | "": [ 189 | { 190 | "name": "quote" 191 | } 192 | ] 193 | } 194 | } 195 | } 196 | } 197 | }, 198 | "image_slider": { 199 | "type": "Slice", 200 | "fieldset": "Image Slider", 201 | "description": "A slider rotating images", 202 | "icon": "image", 203 | "repeat": { 204 | "image": { 205 | "type": "Image", 206 | "config": { 207 | "constraint": { 208 | "width": 980, 209 | "height": 400 210 | } 211 | } 212 | } 213 | } 214 | }, 215 | "gallery": { 216 | "type": "Slice", 217 | "fieldset": "Image Gallery", 218 | "description": "Standard image gallery to display a bunch of photos in a grid", 219 | "icon": "photo_library", 220 | "repeat": { 221 | "image": { 222 | "type": "Image", 223 | "config": { 224 | "constraint": { 225 | "width": null, 226 | "height": null 227 | }, 228 | "thumbnails": [], 229 | "label": "image" 230 | } 231 | }, 232 | "description": { 233 | "type": "StructuredText", 234 | "config": { 235 | "multi": "paragraph, heading3, strong, em", 236 | "label": "StructuredText", 237 | "placeholder": "Image Description..." 238 | } 239 | }, 240 | "link": { 241 | "type": "Link", 242 | "fieldset": "Optional Link", 243 | "config": { 244 | "placeholder": "Optional Link" 245 | } 246 | }, 247 | "link_text": { 248 | "type": "Text", 249 | "config": { 250 | "placeholder": "Optional Link Text" 251 | } 252 | } 253 | } 254 | }, 255 | "video": { 256 | "type": "Slice", 257 | "fieldset": "Video", 258 | "description": "Embed video from any source like Youtube, Vimeo, Facebook...", 259 | "icon": "ondemand_video", 260 | "non-repeat": { 261 | "embed": { 262 | "type": "Embed", 263 | "fieldset": "Video", 264 | "config": { 265 | "label": "Video", 266 | "placeholder": "Paste the YouTube or Vimeo url here..." 267 | } 268 | } 269 | } 270 | } 271 | } 272 | } 273 | } 274 | }, 275 | "Meta": { 276 | "meta_title": { 277 | "type": "Text", 278 | "config": { 279 | "label": "Title" 280 | } 281 | }, 282 | "meta_description": { 283 | "type": "Text", 284 | "config": { 285 | "label": "Description" 286 | } 287 | } 288 | } 289 | } 290 | -------------------------------------------------------------------------------- /custom_types/homepage.json: -------------------------------------------------------------------------------- 1 | { 2 | "Main": { 3 | "title": { 4 | "type": "StructuredText", 5 | "config": { 6 | "single": "heading1", 7 | "label": "StructuredText", 8 | "placeholder": "Site Title..." 9 | } 10 | }, 11 | "tagline": { 12 | "type": "StructuredText", 13 | "config": { 14 | "single": "paragraph, hyperlink", 15 | "allowTargetBlank": true, 16 | "label": "StructuredText", 17 | "placeholder": "Site Tagline..." 18 | } 19 | }, 20 | "button_link": { 21 | "config": { 22 | "placeholder": "Button Link", 23 | "label": "Button Link" 24 | }, 25 | "type": "Link", 26 | "fieldset": "Button Link" 27 | }, 28 | "button_text": { 29 | "config": { 30 | "placeholder": "Button Text", 31 | "label": "Text" 32 | }, 33 | "type": "Text" 34 | }, 35 | "background_image": { 36 | "type": "Image", 37 | "config": { 38 | "constraint": { 39 | "width": 2000 40 | }, 41 | "thumbnails": [], 42 | "label": "Image" 43 | } 44 | }, 45 | "body": { 46 | "type": "Slices", 47 | "fieldset": "Page content", 48 | "config": { 49 | "choices": { 50 | "highlight_section": { 51 | "type": "Slice", 52 | "fieldset": "Featured with CTA", 53 | "description": "A featured section with image on one side and text with title and CTA on the other side.", 54 | "icon": "art_track", 55 | "non-repeat": { 56 | "image": { 57 | "type": "Image", 58 | "config": { 59 | "constraint": { 60 | "width": 1080, 61 | "height": 1360 62 | }, 63 | "thumbnails": [ 64 | { 65 | "name": "Mobile", 66 | "width": 290, 67 | "height": 360 68 | } 69 | ], 70 | "label": "Image" 71 | } 72 | }, 73 | "title": { 74 | "type": "StructuredText", 75 | "config": { 76 | "single": "heading2", 77 | "label": "Title", 78 | "placeholder": "Section’s title goes here" 79 | } 80 | }, 81 | "description": { 82 | "type": "StructuredText", 83 | "config": { 84 | "multi": "paragraph", 85 | "label": "Description", 86 | "placeholder": "My description" 87 | } 88 | }, 89 | "button_label": { 90 | "type": "StructuredText", 91 | "config": { 92 | "multi": "paragraph, preformatted, heading1, heading2, heading3, heading4, heading5, heading6, strong, em, hyperlink, image, embed, list-item, o-list-item, o-list-item", 93 | "label": "Button label", 94 | "placeholder": "Click Here" 95 | } 96 | }, 97 | "button_link": { 98 | "type": "Link", 99 | "config": { 100 | "label": "Button Link", 101 | "placeholder": "Select the link" 102 | } 103 | } 104 | }, 105 | "repeat": {} 106 | }, 107 | "banner": { 108 | "type": "Slice", 109 | "fieldset": "CTA Banner", 110 | "description": "A call to action banner with background", 111 | "icon": "ondemand_video", 112 | "non-repeat": { 113 | "title": { 114 | "type": "StructuredText", 115 | "config": { 116 | "placeholder": "Banner text...", 117 | "single": "heading2" 118 | } 119 | }, 120 | "link": { 121 | "type": "Link", 122 | "fieldset": "Button Link", 123 | "config": { 124 | "placeholder": "Optional Link" 125 | } 126 | }, 127 | "link_text": { 128 | "type": "StructuredText", 129 | "config": { 130 | "placeholder": "Button Label", 131 | "single": "paragraph" 132 | } 133 | }, 134 | "image": { 135 | "type": "Image", 136 | "fieldset": "Image large", 137 | "config": { 138 | "constraint": { 139 | "width": 980, 140 | "height": 300 141 | } 142 | } 143 | } 144 | } 145 | }, 146 | "quote_banner": { 147 | "type": "Slice", 148 | "fieldset": "Quote Banner", 149 | "description": "A quote banner with a background image ", 150 | "icon": "format_quote", 151 | "non-repeat": { 152 | "background_image": { 153 | "type": "Image", 154 | "config": { 155 | "constraint": { 156 | "width": 2000, 157 | "height": 600 158 | }, 159 | "thumbnails": [ 160 | { 161 | "name": "Mobile", 162 | "width": 370, 163 | "height": 260 164 | } 165 | ], 166 | "label": "Background image" 167 | } 168 | }, 169 | "quote": { 170 | "type": "StructuredText", 171 | "config": { 172 | "single": "heading3", 173 | "label": "Quote", 174 | "placeholder": "Designer’s quote" 175 | } 176 | }, 177 | "quote_author": { 178 | "type": "StructuredText", 179 | "config": { 180 | "single": "paragraph", 181 | "label": "Quote author", 182 | "placeholder": "Fashion designer - Jane Doe" 183 | } 184 | }, 185 | "quote_position": { 186 | "type": "Select", 187 | "config": { 188 | "options": [ 189 | "Right", 190 | "Left" 191 | ], 192 | "label": "Quote position", 193 | "placeholder": "Quote position" 194 | } 195 | }, 196 | "quote_style": { 197 | "type": "Select", 198 | "config": { 199 | "options": [ 200 | "dark", 201 | "light" 202 | ], 203 | "label": "quote_style", 204 | "placeholder": "style" 205 | } 206 | } 207 | } 208 | }, 209 | "text_section": { 210 | "type": "Slice", 211 | "fieldset": "Text Section", 212 | "description": "This is a rich text section", 213 | "icon": "text_fields", 214 | "non-repeat": { 215 | "text": { 216 | "type": "StructuredText", 217 | "config": { 218 | "multi": "paragraph, preformatted, heading1, heading2, heading3, heading4, heading5, heading6, strong, em, hyperlink, image, embed, list-item, o-list-item, o-list-item", 219 | "label": "StructuredText", 220 | "placeholder": "type your text here..." 221 | } 222 | } 223 | } 224 | }, 225 | "image_slider": { 226 | "type": "Slice", 227 | "fieldset": "Image Slider", 228 | "description": "A slider rotating images", 229 | "icon": "image", 230 | "repeat": { 231 | "image": { 232 | "type": "Image", 233 | "config": { 234 | "constraint": { 235 | "width": 980, 236 | "height": 400 237 | } 238 | } 239 | } 240 | } 241 | }, 242 | "gallery": { 243 | "type": "Slice", 244 | "fieldset": "Image Gallery", 245 | "description": "Standard image gallery to display a bunch of photos in a grid", 246 | "icon": "photo_library", 247 | "repeat": { 248 | "image": { 249 | "type": "Image", 250 | "config": { 251 | "placeholder": "Image", 252 | "constraint": { 253 | "width": 727, 254 | "height": 402 255 | } 256 | } 257 | }, 258 | "description": { 259 | "type": "StructuredText", 260 | "config": { 261 | "placeholder": "Image Description...", 262 | "single": "paragraph" 263 | } 264 | }, 265 | "link": { 266 | "type": "Link", 267 | "fieldset": "Optional Link", 268 | "config": { 269 | "placeholder": "Optional Link" 270 | } 271 | }, 272 | "link_text": { 273 | "type": "Text", 274 | "config": { 275 | "placeholder": "Optional Link Text" 276 | } 277 | } 278 | } 279 | }, 280 | "video": { 281 | "type": "Slice", 282 | "fieldset": "Video", 283 | "description": "Embed video from any source like Youtube, Vimeo, Facebook...", 284 | "icon": "ondemand_video", 285 | "non-repeat": { 286 | "embed": { 287 | "type": "Embed", 288 | "fieldset": "Video", 289 | "config": { 290 | "label": "Video", 291 | "placeholder": "Paste the YouTube or Vimeo url here..." 292 | } 293 | } 294 | } 295 | } 296 | } 297 | } 298 | } 299 | }, 300 | "Meta": { 301 | "meta_title": { 302 | "type": "Text", 303 | "config": { 304 | "label": "Title" 305 | } 306 | }, 307 | "meta_description": { 308 | "type": "Text", 309 | "config": { 310 | "label": "Description" 311 | } 312 | } 313 | } 314 | } 315 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /public/css/ 2 | /public/js/ 3 | 4 | 5 | 6 | # Created by https://www.gitignore.io/api/vim,node,linux,macos,windows,laravel,intellij,sublimetext,visualstudio,visualstudiocode,composer 7 | 8 | ### Composer ### 9 | composer.phar 10 | /vendor/ 11 | 12 | # Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file 13 | # You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file 14 | composer.lock 15 | 16 | ### Intellij ### 17 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 18 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 19 | 20 | # User-specific stuff: 21 | .idea/**/workspace.xml 22 | .idea/**/tasks.xml 23 | .idea/dictionaries 24 | 25 | # Sensitive or high-churn files: 26 | .idea/**/dataSources/ 27 | .idea/**/dataSources.ids 28 | .idea/**/dataSources.xml 29 | .idea/**/dataSources.local.xml 30 | .idea/**/sqlDataSources.xml 31 | .idea/**/dynamic.xml 32 | .idea/**/uiDesigner.xml 33 | 34 | # Gradle: 35 | .idea/**/gradle.xml 36 | .idea/**/libraries 37 | 38 | # CMake 39 | cmake-build-debug/ 40 | 41 | # Mongo Explorer plugin: 42 | .idea/**/mongoSettings.xml 43 | 44 | ## File-based project format: 45 | *.iws 46 | 47 | ## Plugin-specific files: 48 | 49 | # IntelliJ 50 | /out/ 51 | 52 | # mpeltonen/sbt-idea plugin 53 | .idea_modules/ 54 | 55 | # JIRA plugin 56 | atlassian-ide-plugin.xml 57 | 58 | # Cursive Clojure plugin 59 | .idea/replstate.xml 60 | 61 | # Ruby plugin and RubyMine 62 | /.rakeTasks 63 | 64 | # Crashlytics plugin (for Android Studio and IntelliJ) 65 | com_crashlytics_export_strings.xml 66 | crashlytics.properties 67 | crashlytics-build.properties 68 | fabric.properties 69 | 70 | ### Intellij Patch ### 71 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 72 | 73 | # *.iml 74 | # modules.xml 75 | # .idea/misc.xml 76 | # *.ipr 77 | 78 | # Sonarlint plugin 79 | .idea/sonarlint 80 | 81 | ### Laravel ### 82 | /vendor 83 | node_modules/ 84 | npm-debug.log 85 | 86 | # Laravel 4 specific 87 | bootstrap/compiled.php 88 | app/storage/ 89 | 90 | # Laravel 5 & Lumen specific 91 | public/storage 92 | public/hot 93 | storage/*.key 94 | .env.*.php 95 | .env.php 96 | .env 97 | Homestead.yaml 98 | Homestead.json 99 | 100 | # Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer 101 | .rocketeer/ 102 | 103 | ### Linux ### 104 | *~ 105 | 106 | # temporary files which can be created if a process still has a handle open of a deleted file 107 | .fuse_hidden* 108 | 109 | # KDE directory preferences 110 | .directory 111 | 112 | # Linux trash folder which might appear on any partition or disk 113 | .Trash-* 114 | 115 | # .nfs files are created when an open file is removed but is still being accessed 116 | .nfs* 117 | 118 | ### macOS ### 119 | *.DS_Store 120 | .AppleDouble 121 | .LSOverride 122 | 123 | # Icon must end with two \r 124 | Icon 125 | 126 | # Thumbnails 127 | ._* 128 | 129 | # Files that might appear in the root of a volume 130 | .DocumentRevisions-V100 131 | .fseventsd 132 | .Spotlight-V100 133 | .TemporaryItems 134 | .Trashes 135 | .VolumeIcon.icns 136 | .com.apple.timemachine.donotpresent 137 | 138 | # Directories potentially created on remote AFP share 139 | .AppleDB 140 | .AppleDesktop 141 | Network Trash Folder 142 | Temporary Items 143 | .apdisk 144 | 145 | ### Node ### 146 | # Logs 147 | logs 148 | *.log 149 | npm-debug.log* 150 | yarn-debug.log* 151 | yarn-error.log* 152 | 153 | # Runtime data 154 | pids 155 | *.pid 156 | *.seed 157 | *.pid.lock 158 | 159 | # Directory for instrumented libs generated by jscoverage/JSCover 160 | lib-cov 161 | 162 | # Coverage directory used by tools like istanbul 163 | coverage 164 | 165 | # nyc test coverage 166 | .nyc_output 167 | 168 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 169 | .grunt 170 | 171 | # Bower dependency directory (https://bower.io/) 172 | bower_components 173 | 174 | # node-waf configuration 175 | .lock-wscript 176 | 177 | # Compiled binary addons (http://nodejs.org/api/addons.html) 178 | build/Release 179 | 180 | # Dependency directories 181 | jspm_packages/ 182 | 183 | # Typescript v1 declaration files 184 | typings/ 185 | 186 | # Optional npm cache directory 187 | .npm 188 | 189 | # Optional eslint cache 190 | .eslintcache 191 | 192 | # Optional REPL history 193 | .node_repl_history 194 | 195 | # Output of 'npm pack' 196 | *.tgz 197 | 198 | # Yarn Integrity file 199 | .yarn-integrity 200 | 201 | # dotenv environment variables file 202 | 203 | 204 | ### SublimeText ### 205 | # cache files for sublime text 206 | *.tmlanguage.cache 207 | *.tmPreferences.cache 208 | *.stTheme.cache 209 | 210 | # workspace files are user-specific 211 | *.sublime-workspace 212 | 213 | # project files should be checked into the repository, unless a significant 214 | # proportion of contributors will probably not be using SublimeText 215 | # *.sublime-project 216 | 217 | # sftp configuration file 218 | sftp-config.json 219 | 220 | # Package control specific files 221 | Package Control.last-run 222 | Package Control.ca-list 223 | Package Control.ca-bundle 224 | Package Control.system-ca-bundle 225 | Package Control.cache/ 226 | Package Control.ca-certs/ 227 | Package Control.merged-ca-bundle 228 | Package Control.user-ca-bundle 229 | oscrypto-ca-bundle.crt 230 | bh_unicode_properties.cache 231 | 232 | # Sublime-github package stores a github token in this file 233 | # https://packagecontrol.io/packages/sublime-github 234 | GitHub.sublime-settings 235 | 236 | ### Vim ### 237 | # swap 238 | .sw[a-p] 239 | .*.sw[a-p] 240 | # session 241 | Session.vim 242 | # temporary 243 | .netrwhist 244 | # auto-generated tag files 245 | tags 246 | 247 | ### VisualStudioCode ### 248 | .vscode/* 249 | !.vscode/settings.json 250 | !.vscode/tasks.json 251 | !.vscode/launch.json 252 | !.vscode/extensions.json 253 | .history 254 | 255 | ### Windows ### 256 | # Windows thumbnail cache files 257 | Thumbs.db 258 | ehthumbs.db 259 | ehthumbs_vista.db 260 | 261 | # Folder config file 262 | Desktop.ini 263 | 264 | # Recycle Bin used on file shares 265 | $RECYCLE.BIN/ 266 | 267 | # Windows Installer files 268 | *.cab 269 | *.msi 270 | *.msm 271 | *.msp 272 | 273 | # Windows shortcuts 274 | *.lnk 275 | 276 | ### VisualStudio ### 277 | ## Ignore Visual Studio temporary files, build results, and 278 | ## files generated by popular Visual Studio add-ons. 279 | ## 280 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 281 | 282 | # User-specific files 283 | *.suo 284 | *.user 285 | *.userosscache 286 | *.sln.docstates 287 | 288 | # User-specific files (MonoDevelop/Xamarin Studio) 289 | *.userprefs 290 | 291 | # Build results 292 | [Dd]ebug/ 293 | [Dd]ebugPublic/ 294 | [Rr]elease/ 295 | [Rr]eleases/ 296 | x64/ 297 | x86/ 298 | bld/ 299 | [Bb]in/ 300 | [Oo]bj/ 301 | [Ll]og/ 302 | 303 | # Visual Studio 2015 cache/options directory 304 | .vs/ 305 | # Uncomment if you have tasks that create the project's static files in wwwroot 306 | #wwwroot/ 307 | 308 | # MSTest test Results 309 | [Tt]est[Rr]esult*/ 310 | [Bb]uild[Ll]og.* 311 | 312 | # NUNIT 313 | *.VisualState.xml 314 | TestResult.xml 315 | 316 | # Build Results of an ATL Project 317 | [Dd]ebugPS/ 318 | [Rr]eleasePS/ 319 | dlldata.c 320 | 321 | # .NET Core 322 | project.lock.json 323 | project.fragment.lock.json 324 | artifacts/ 325 | **/Properties/launchSettings.json 326 | 327 | *_i.c 328 | *_p.c 329 | *_i.h 330 | *.ilk 331 | *.meta 332 | *.obj 333 | *.pch 334 | *.pdb 335 | *.pgc 336 | *.pgd 337 | *.rsp 338 | *.sbr 339 | *.tlb 340 | *.tli 341 | *.tlh 342 | *.tmp 343 | *.tmp_proj 344 | *.vspscc 345 | *.vssscc 346 | .builds 347 | *.pidb 348 | *.svclog 349 | *.scc 350 | 351 | # Chutzpah Test files 352 | _Chutzpah* 353 | 354 | # Visual C++ cache files 355 | ipch/ 356 | *.aps 357 | *.ncb 358 | *.opendb 359 | *.opensdf 360 | *.sdf 361 | *.cachefile 362 | *.VC.db 363 | *.VC.VC.opendb 364 | 365 | # Visual Studio profiler 366 | *.psess 367 | *.vsp 368 | *.vspx 369 | *.sap 370 | 371 | # TFS 2012 Local Workspace 372 | $tf/ 373 | 374 | # Guidance Automation Toolkit 375 | *.gpState 376 | 377 | # ReSharper is a .NET coding add-in 378 | _ReSharper*/ 379 | *.[Rr]e[Ss]harper 380 | *.DotSettings.user 381 | 382 | # JustCode is a .NET coding add-in 383 | .JustCode 384 | 385 | # TeamCity is a build add-in 386 | _TeamCity* 387 | 388 | # DotCover is a Code Coverage Tool 389 | *.dotCover 390 | 391 | # Visual Studio code coverage results 392 | *.coverage 393 | *.coveragexml 394 | 395 | # NCrunch 396 | _NCrunch_* 397 | .*crunch*.local.xml 398 | nCrunchTemp_* 399 | 400 | # MightyMoose 401 | *.mm.* 402 | AutoTest.Net/ 403 | 404 | # Web workbench (sass) 405 | .sass-cache/ 406 | 407 | # Installshield output folder 408 | [Ee]xpress/ 409 | 410 | # DocProject is a documentation generator add-in 411 | DocProject/buildhelp/ 412 | DocProject/Help/*.HxT 413 | DocProject/Help/*.HxC 414 | DocProject/Help/*.hhc 415 | DocProject/Help/*.hhk 416 | DocProject/Help/*.hhp 417 | DocProject/Help/Html2 418 | DocProject/Help/html 419 | 420 | # Click-Once directory 421 | publish/ 422 | 423 | # Publish Web Output 424 | *.[Pp]ublish.xml 425 | *.azurePubxml 426 | # TODO: Uncomment the next line to ignore your web deploy settings. 427 | # By default, sensitive information, such as encrypted password 428 | # should be stored in the .pubxml.user file. 429 | #*.pubxml 430 | *.pubxml.user 431 | *.publishproj 432 | 433 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 434 | # checkin your Azure Web App publish settings, but sensitive information contained 435 | # in these scripts will be unencrypted 436 | PublishScripts/ 437 | 438 | # NuGet Packages 439 | *.nupkg 440 | # The packages folder can be ignored because of Package Restore 441 | **/packages/* 442 | # except build/, which is used as an MSBuild target. 443 | !**/packages/build/ 444 | # Uncomment if necessary however generally it will be regenerated when needed 445 | #!**/packages/repositories.config 446 | # NuGet v3's project.json files produces more ignorable files 447 | *.nuget.props 448 | *.nuget.targets 449 | 450 | # Microsoft Azure Build Output 451 | csx/ 452 | *.build.csdef 453 | 454 | # Microsoft Azure Emulator 455 | ecf/ 456 | rcf/ 457 | 458 | # Windows Store app package directories and files 459 | AppPackages/ 460 | BundleArtifacts/ 461 | Package.StoreAssociation.xml 462 | _pkginfo.txt 463 | 464 | # Visual Studio cache files 465 | # files ending in .cache can be ignored 466 | *.[Cc]ache 467 | # but keep track of directories ending in .cache 468 | !*.[Cc]ache/ 469 | 470 | # Others 471 | ClientBin/ 472 | ~$* 473 | *.dbmdl 474 | *.dbproj.schemaview 475 | *.jfm 476 | *.pfx 477 | *.publishsettings 478 | orleans.codegen.cs 479 | 480 | # Since there are multiple workflows, uncomment next line to ignore bower_components 481 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 482 | #bower_components/ 483 | 484 | # RIA/Silverlight projects 485 | Generated_Code/ 486 | 487 | # Backup & report files from converting an old project file 488 | # to a newer Visual Studio version. Backup files are not needed, 489 | # because we have git ;-) 490 | _UpgradeReport_Files/ 491 | Backup*/ 492 | UpgradeLog*.XML 493 | UpgradeLog*.htm 494 | 495 | # SQL Server files 496 | *.mdf 497 | *.ldf 498 | *.ndf 499 | 500 | # Business Intelligence projects 501 | *.rdl.data 502 | *.bim.layout 503 | *.bim_*.settings 504 | 505 | # Microsoft Fakes 506 | FakesAssemblies/ 507 | 508 | # GhostDoc plugin setting file 509 | *.GhostDoc.xml 510 | 511 | # Node.js Tools for Visual Studio 512 | .ntvs_analysis.dat 513 | 514 | # Typescript v1 declaration files 515 | 516 | # Visual Studio 6 build log 517 | *.plg 518 | 519 | # Visual Studio 6 workspace options file 520 | *.opt 521 | 522 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 523 | *.vbw 524 | 525 | # Visual Studio LightSwitch build output 526 | **/*.HTMLClient/GeneratedArtifacts 527 | **/*.DesktopClient/GeneratedArtifacts 528 | **/*.DesktopClient/ModelManifest.xml 529 | **/*.Server/GeneratedArtifacts 530 | **/*.Server/ModelManifest.xml 531 | _Pvt_Extensions 532 | 533 | # Paket dependency manager 534 | .paket/paket.exe 535 | paket-files/ 536 | 537 | # FAKE - F# Make 538 | .fake/ 539 | 540 | # JetBrains Rider 541 | .idea/ 542 | *.sln.iml 543 | 544 | # CodeRush 545 | .cr/ 546 | 547 | # Python Tools for Visual Studio (PTVS) 548 | __pycache__/ 549 | *.pyc 550 | 551 | # Cake - Uncomment if you are using it 552 | # tools/** 553 | # !tools/packages.config 554 | 555 | # Telerik's JustMock configuration file 556 | *.jmconfig 557 | 558 | # BizTalk build output 559 | *.btp.cs 560 | *.btm.cs 561 | *.odx.cs 562 | *.xsd.cs 563 | 564 | ### VisualStudio Patch ### 565 | # By default, sensitive information, such as encrypted password 566 | # should be stored in the .pubxml.user file. 567 | 568 | 569 | # End of https://www.gitignore.io/api/vim,node,linux,macos,windows,laravel,intellij,sublimetext,visualstudio,visualstudiocode,composer 570 | --------------------------------------------------------------------------------