Docs v1.6.0  /  Laravel + Vue.js HTML5 Angular Vue.js React Laravel Rails Rails + Turbolinks ASP.NET Core ASP.NET Core MVC ASP.NET MVC ASP.NET MVC + Webpack Settings panel Layout helpers

Instructions can vary depending on whatever you use theme settings panel or not. Please select the appropriate version.

laravel-vue-starter directory structure

laravel-vue-starter
app
Console
Exceptions
Http
Controllers
Auth
ApplicationController.php
Main controller
...
Middleware
...
Providers
...
bootstrap
config
database
public
resources
assets
src
Vue.js application
components
layout
Page layouts
Layout1.vue
Layout1Flex.vue
...
router
Router config
vendor
Appwork's sources
libs
Vue components
vue-color
vue-gallery
...
styles
SCSS sources
_appwork
Appwork includes
_custom-variables
Custom variables
_theme
Theme includes
_uikit
UIKit includes
pages
Page styles
rtl
Styles with RTL support enabled
appwork.scss
appwork-material.scss
appwork-dark.scss
...
App.vue
entry-point.js
Webpack entry point
globals.js
Global properties and methods
...
vendor
Appwork's static assets
fonts
Iconic fonts
fontawesome.css
ionicons.css
...
js
Javascripts
layout-helpers.js
material-ripple.js
...
lang
views
application.blade.php
Main view
routes
storage
tests
vendor
package.json
webpack.mix.js
Laravel mix config
...

Third-party components

The starter project by default includes all third-party components.
Optionally you can remove unwanted components to reduce bundle size and compile time:

  1. Remove unwanted packages from the devDependencies section in the package.json file.
  2. Remove related directories within the resources/assets/src/vendor/libs directory.
  3. Remove related @imports and @includes in the resources/assets/src/vendor/styles/_theme/_libs.scss file.

For example, if you want to exclude vue-multiselect component, you will need to:

  1. Remove vue-multiselect dependency in the package.json file.
  2. Remove the resources/assets/src/vendor/libs/vue-multiselect directory.
  3. Remove @import "~@/vendor/libs/vue-multiselect/mixins";, @include vue-multiselect-theme($background, $color); and @include material-vue-multiselect-theme($background, $color); lines in the resources/assets/src/vendor/styles/_theme/_libs.scss file.

Installation

Windows
  1. Download and install latest Node.js LTS: https://nodejs.org/en/.
  2. Download and install Git: https://git-scm.com/downloads.
  3. Logout from the system and login again.
  4. Launch cmd.exe as an administrator and run command npm install --add-python-to-path='true' --global --production windows-build-tools.
  5. Download PHP: https://windows.php.net/download. Unpack the downloaded archive into C:\php. Add C:\php to your PATH, then logout from the system and login again.
  6. Download and install Composer: https://getcomposer.org/doc/00-intro.md#installation-windows.
  7. Logout from the system and login again.
  8. Open C:\php\php.ini and ensure extension=fileinfo line is uncommented.
  9. Go to the laravel-vue-starter directory.
  10. Run command composer install.
  11. Rename .env.example file to .env by running ren .env.example .env.
  12. Run command php artisan key:generate.
  13. Run command npm install.
  14. Run command npm run hot.
    Note: Hot reloading isn't working with multi-theming (when ThemeSettings plugin is enabled) since it includes all stylesheets into the HTML code. In this case use npm run dev and npm run watch commands.
  15. Now you can run the server: php artisan serve
Ubuntu
  1. Update system: sudo apt-get update && sudo apt-get upgrade.
  2. Install curl: sudo apt-get install curl.
  3. Install latest Node.js LTS and build tools: https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions-enterprise-linux-fedora-and-snap-packages.
  4. Install Git: https://git-scm.com/download/linux.
  5. Install PHP: sudo add-apt-repository ppa:ondrej/php; sudo apt-get update; sudo apt-get install php7.3 php-pear php7.3-curl php7.3-dev php7.3-gd php7.3-mbstring php7.3-zip php7.3-mysql php7.3-xml.
  6. Install Composer: https://getcomposer.org/download/.
  7. Make composer available globally: https://getcomposer.org/doc/00-intro.md#globally.
  8. Open php.ini and ensure extension=mbstring line is uncommented.
  9. Go to the laravel-vue-starter directory and run command composer install.
  10. Rename .env.example file to .env by running mv .env.example .env.
  11. Run command php artisan key:generate.
  12. Run command npm install.
  13. Run command npm run hot.
    Note: Hot reloading isn't working with multi-theming (when ThemeSettings plugin is enabled) since it includes all stylesheets into the HTML code. In this case use npm run dev and npm run watch commands.
  14. Now you can run the server: php artisan serve.
Mac OS X
  1. Install Xcode from App Store. After installing, launch the Xcode, accept the license agreement and wait while components installed.
  2. Download and install latest Node.js LTS: https://nodejs.org/en/.
  3. Download and install Git: https://git-scm.com/downloads.
  4. Check PHP version php -v. If PHP is not installed or PHP version is less than 7.3.0, install Homebrew (https://brew.sh) and then run brew install php.
  5. Install Composer: https://getcomposer.org/download/.
  6. Make composer available globally: https://getcomposer.org/doc/00-intro.md#globally.
  7. Go to the laravel-vue-starter directory and run command composer install.
  8. Rename .env.example file to .env by running mv .env.example .env.
  9. Run command php artisan key:generate.
  10. Run command npm install.
  11. Run command npm run hot.
    Note: Hot reloading isn't working with multi-theming (when ThemeSettings plugin is enabled) since it includes all stylesheets into the HTML code. In this case use npm run dev and npm run watch commands.
  12. Now you can run the server: php artisan serve.

Page structure

Instead of configuring the layout manually, you can use the Starter template generator. It will dramatically simplify the initial setup.

application.blade.php

resources/views/application.blade.php
<!DOCTYPE html>

<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="light-style">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge,chrome=1">
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>Laravel + Vue.js Starter</title>

    <!-- Main font -->
    <link href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i,700,700i,900" rel="stylesheet">

    <!-- Icons. Uncomment required icon fonts -->
    <!-- <link rel="stylesheet" href="{{ mix('/vendor/fonts/fontawesome.css') }}"> -->
    <link rel="stylesheet" href="{{ mix('/vendor/fonts/ionicons.css') }}">
    <!-- <link rel="stylesheet" href="{{ mix('/vendor/fonts/linearicons.css') }}"> -->
    <!-- <link rel="stylesheet" href="{{ mix('/vendor/fonts/open-iconic.css') }}"> -->
    <!-- <link rel="stylesheet" href="{{ mix('/vendor/fonts/pe-icon-7-stroke.css') }}"> -->

    <!-- Layout helpers -->
    <script src="{{ mix('/vendor/js/layout-helpers.js') }}"></script>

    <!-- IE10 polyfills (remove if you don't plan to support IE10) -->
    <script>
      if (navigator.userAgent.match('MSIE 10.0;')) {
        document.write(
          '<script src="https:\/\/cdn.polyfill.io\/v2\/polyfill.min.js?features=Intl.~locale.en"><\/script>');
      }
    </script>

</head>
<body>

    <div id="app"></div>

    <script src="{{ mix('/entry-point.js') }}"></script>

</body>
</html>
<!DOCTYPE html>

<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="light-style">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge,chrome=1">
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>Laravel + Vue.js Starter</title>

    <!-- Main font -->
    <link href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i,700,700i,900" rel="stylesheet">

    <!-- Icons. Uncomment required icon fonts -->
    <!-- <link rel="stylesheet" href="{{ mix('/vendor/fonts/fontawesome.css') }}"> -->
    <link rel="stylesheet" href="{{ mix('/vendor/fonts/ionicons.css') }}">
    <!-- <link rel="stylesheet" href="{{ mix('/vendor/fonts/linearicons.css') }}"> -->
    <!-- <link rel="stylesheet" href="{{ mix('/vendor/fonts/open-iconic.css') }}"> -->
    <!-- <link rel="stylesheet" href="{{ mix('/vendor/fonts/pe-icon-7-stroke.css') }}"> -->

    <!-- Core stylesheets -->
    <link rel="stylesheet" href="{{ mix('/vendor/css/bootstrap.css') }}" class="theme-settings-bootstrap-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/appwork.css') }}" class="theme-settings-appwork-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/theme-corporate.css') }}" class="theme-settings-theme-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/colors.css') }}" class="theme-settings-colors-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/uikit.css') }}">

    <!-- Layout helpers -->
    <script src="{{ mix('/vendor/js/layout-helpers.js') }}"></script>

    <!-- Theme settings -->
    <script src="{{ mix('/vendor/js/theme-settings.js') }}"></script>
    <script>
        // Use settings panel generator to configure the plugin
        window.themeSettings = new ThemeSettings({
            cssPath: '',
            themesPath: '',
            pathResolver: function(path) {
                var resolvedPaths = {
                    // Core stylesheets
                    //
                    @foreach (['bootstrap', 'appwork', 'colors'] as $name)
                    '{{ $name }}.css': '{{ mix("/vendor/css/{$name}.css") }}',
                    '{{ $name }}-material.css': '{{ mix("/vendor/css/{$name}-material.css") }}',
                    '{{ $name }}-dark.css': '{{ mix("/vendor/css/{$name}-dark.css") }}',
                    @endforeach

                    // UI Kit
                    'uikit.css': '{{ mix("/vendor/css/uikit.css") }}',

                    // Themes
                    //
                    @foreach (['air', 'corporate', 'cotton', 'gradient', 'paper', 'shadow', 'soft', 'sunrise', 'twitlight', 'vibrant'] as $name)
                    'theme-{{ $name }}.css': '{{ mix("/vendor/css/theme-{$name}.css") }}',
                    'theme-{{ $name }}-material.css': '{{ mix("/vendor/css/theme-{$name}-material.css") }}',
                    'theme-{{ $name }}-dark.css': '{{ mix("/vendor/css/theme-{$name}-dark.css") }}',
                    @endforeach
                }

                return resolvedPaths[path] || path;
            }
        });
    </script>

    <!-- IE10 polyfills (remove if you don't plan to support IE10) -->
    <script>
        if (navigator.userAgent.match('MSIE 10.0;')) {
            document.write('<script src="https:\/\/cdn.polyfill.io\/v2\/polyfill.min.js?features=Intl.~locale.en"><\/script>');
        }
    </script>

</head>
<body>

    <div id="app"></div>

    <script src="{{ mix('/entry-point.js') }}"></script>

</body>
</html>

Layouts

To display a page with the selected layout just define the page component as a child of the layout component.

You can find navbar, sidenav and footer components in the resources/assets/src/layout directory.

resources/assets/src/router/index.js
...

import Layout1 from '@/layout/Layout1'

...

const router = new Router({
  ...

  routes: [{
    ...
  }, {
    path: '/page',
    component: Layout1,
    children: [{
      path: '',
      component: () => import('@/components/Page')
    }]
  }, {
    ...
  }]

  ...
];
resources/assets/src/router/index.js
...

import Layout1Flex from '@/layout/Layout1Flex'

...

const router = new Router({
  ...

  routes: [{
    ...
  }, {
    path: '/page',
    component: Layout1Flex,
    children: [{
      path: '',
      component: () => import('@/components/Page')
    }]
  }, {
    ...
  }]

  ...
];
resources/assets/src/router/index.js
...

import Layout2 from '@/layout/Layout2'

...

const router = new Router({
  ...

  routes: [{
    ...
  }, {
    path: '/page',
    component: Layout2,
    children: [{
      path: '',
      component: () => import('@/components/Page')
    }]
  }, {
    ...
  }]

  ...
];
resources/assets/src/router/index.js
...

import Layout2Flex from '@/layout/Layout2Flex'

...

const router = new Router({
  ...

  routes: [{
    ...
  }, {
    path: '/page',
    component: Layout2Flex,
    children: [{
      path: '',
      component: () => import('@/components/Page')
    }]
  }, {
    ...
  }]

  ...
];
resources/assets/src/router/index.js
...

import LayoutWithoutNavbar from '@/layout/LayoutWithoutNavbar'

...

const router = new Router({
  ...

  routes: [{
    ...
  }, {
    path: '/page',
    component: LayoutWithoutNavbar,
    children: [{
      path: '',
      component: () => import('@/components/Page')
    }]
  }, {
    ...
  }]

  ...
];
resources/assets/src/router/index.js
...

import LayoutWithoutNavbarFlex from '@/layout/LayoutWithoutNavbarFlex'

...

const router = new Router({
  ...

  routes: [{
    ...
  }, {
    path: '/page',
    component: LayoutWithoutNavbarFlex,
    children: [{
      path: '',
      component: () => import('@/components/Page')
    }]
  }, {
    ...
  }]

  ...
];
resources/assets/src/router/index.js
...

import LayoutWithoutSidenav from '@/layout/LayoutWithoutSidenav'

...

const router = new Router({
  ...

  routes: [{
    ...
  }, {
    path: '/page',
    component: LayoutWithoutSidenav,
    children: [{
      path: '',
      component: () => import('@/components/Page')
    }]
  }, {
    ...
  }]

  ...
];
resources/assets/src/router/index.js
...

import LayoutHorizontalSidenav from '@/layout/LayoutHorizontalSidenav'

...

const router = new Router({
  ...

  routes: [{
    ...
  }, {
    path: '/page',
    component: LayoutHorizontalSidenav,
    children: [{
      path: '',
      component: () => import('@/components/Page')
    }]
  }, {
    ...
  }]

  ...
];
resources/assets/src/router/index.js
...

import LayoutBlank from '@/layout/LayoutBlank'

...

const router = new Router({
  ...

  routes: [{
    ...
  }, {
    path: '/page',
    component: LayoutBlank,
    children: [{
      path: '',
      component: () => import('@/components/Page')
    }]
  }, {
    ...
  }]

  ...
];

Appwork's stylesheets

To use settings panel, you need to:

  • Add Appwork's stylesheets to the Laravel Mix config (use the generator to see the example):

    webpack.mix.js
    ...
    
    // Core stylesheets
    mix.sass('resources/assets/src/vendor/styles/bootstrap.scss', 'public/vendor/css', sassOptions)
       .sass('resources/assets/src/vendor/styles/bootstrap-material.scss', 'public/vendor/css', sassOptions)
       .sass('resources/assets/src/vendor/styles/bootstrap-dark.scss', 'public/vendor/css', sassOptions)
       ...
    
    // Themes
    mix.sass('resources/assets/src/vendor/styles/theme-air.scss', 'public/vendor/css', sassOptions)
       .sass('resources/assets/src/vendor/styles/theme-air-material.scss', 'public/vendor/css', sassOptions)
       .sass('resources/assets/src/vendor/styles/theme-air-dark.scss', 'public/vendor/css', sassOptions)
       ...
    
    ...
  • Remove all vendor stylesheet imports in the resources/assets/src/App.vue file.

Theming

To enable a theme, import theme SCSS file in the resources/assets/src/App.vue file.

resources/assets/src/App.vue
<style src="@/vendor/styles/theme-air.scss" lang="scss"></style>

To enable a theme just include the required theme stylesheet.

resources/views/application.blade.php
<link rel="stylesheet" href="{{ mix('/vendor/css/theme-air.css') }}" class="theme-settings-theme-css">

Material styling

To enable material styling you need to:

  1. Set $enable-material-style variable to true.

    resources/assets/src/vendor/styles/_custom-variables/_features.scss
    ...
    $enable-material-style: true;
    ...
  2. Set material-style class on the <html> element instead of light-style.

    resources/views/application.blade.php
    <html class="material-style">
  3. Add -material suffix to bootstrap.scss, appwork.scss, theme-*.scss and colors.scss imports in the resources/assets/src/App.vue file.

    resources/assets/src/App.vue
    <style src="@/vendor/styles/bootstrap-material.scss" lang="scss"></style>
    <style src="@/vendor/styles/appwork-material.scss" lang="scss"></style>
    <style src="@/vendor/styles/theme-corporate-material.scss" lang="scss"></style>
    <style src="@/vendor/styles/colors-material.scss" lang="scss"></style>
  4. Add -material suffix to bootstrap.css, appwork.css, theme-*.css and colors.css stylesheets.

    resources/views/application.blade.php
    <link rel="stylesheet" href="{{ mix('/vendor/css/bootstrap-material.css') }}" class="theme-settings-bootstrap-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/appwork-material.css') }}" class="theme-settings-appwork-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/theme-corporate-material.css') }}" class="theme-settings-theme-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/colors-material.css') }}" class="theme-settings-colors-css">
  5. Optionally you can enable material ripple. Just append material-ripple.js script to the <head> section and call attachMaterialRippleOnLoad() function.

    resources/views/application.blade.php
    <script src="{{ mix('/vendor/js/material-ripple.js') }}"></script>
    <script>
      window.attachMaterialRippleOnLoad();
    </script>
  6. Optionally you can enable material ripple. Just append material-ripple.js script to the <head> section.

    resources/views/application.blade.php
    <script src="{{ mix('/vendor/js/material-ripple.js') }}"></script>

Dark styling

To enable dark styling you need to:

  1. Set $enable-dark-style variable to true.

    resources/assets/src/vendor/styles/_custom-variables/_features.scss
    ...
    $enable-dark-style: true;
    ...
  2. Set dark-style class on the <html> element instead of light-style.

    resources/views/application.blade.php
    <html class="dark-style">
  3. Add -dark suffix to bootstrap.scss, appwork.scss, theme-*.scss and colors.scss imports in the resources/assets/src/App.vue file.

    resources/assets/src/App.vue
    <style src="@/vendor/styles/bootstrap-dark.scss" lang="scss"></style>
    <style src="@/vendor/styles/appwork-dark.scss" lang="scss"></style>
    <style src="@/vendor/styles/theme-corporate-dark.scss" lang="scss"></style>
    <style src="@/vendor/styles/colors-dark.scss" lang="scss"></style>
  4. Add -dark suffix to bootstrap.css, appwork.css, theme-*.css and colors.css stylesheets.

    resources/views/application.blade.php
    <link rel="stylesheet" href="{{ mix('/vendor/css/bootstrap-dark.css') }}" class="theme-settings-bootstrap-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/appwork-dark.css') }}" class="theme-settings-appwork-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/theme-corporate-dark.css') }}" class="theme-settings-theme-css">
    <link rel="stylesheet" href="{{ mix('/vendor/css/colors-dark.css') }}" class="theme-settings-colors-css">

RTL support

To enable RTL direction support, first of all, you need to set $enable-rtl-support variable to true.

resources/assets/src/vendor/styles/_custom-variables/_features.scss
$enable-rtl-support: true;
...

Then import Appwork's SCSS files from the vendor/styles/rtl/ directory instead of vendor/styles/.

resources/assets/src/App.vue
<style src="@/vendor/styles/rtl/bootstrap.scss" lang="scss"></style>
<style src="@/vendor/styles/rtl/appwork.scss" lang="scss"></style>
<style src="@/vendor/styles/rtl/theme-corporate.scss" lang="scss"></style>
<style src="@/vendor/styles/rtl/colors.scss" lang="scss"></style>
<style src="@/vendor/styles/rtl/uikit.scss" lang="scss"></style>

Then open webpack.mix.js file and edit paths to load Appwork's stylesheets from the resources/assets/src/vendor/styles/rtl/ directory instead of resources/assets/src/vendor/styles/.

webpack.mix.js
...

// Core stylesheets
mix.sass('resources/assets/src/vendor/styles/rtl/bootstrap.scss', 'public/vendor/css', sassOptions)
   .sass('resources/assets/src/vendor/styles/rtl/bootstrap-material.scss', 'public/vendor/css', sassOptions)
   .sass('resources/assets/src/vendor/styles/rtl/bootstrap-dark.scss', 'public/vendor/css', sassOptions)
   ...

// Themes
mix.sass('resources/assets/src/vendor/styles/rtl/theme-air.scss', 'public/vendor/css', sassOptions)
   .sass('resources/assets/src/vendor/styles/rtl/theme-air-material.scss', 'public/vendor/css', sassOptions)
   .sass('resources/assets/src/vendor/styles/rtl/theme-air-dark.scss', 'public/vendor/css', sassOptions)
   ...

...

To enable RTL direction, add dir="rtl" attribute to the <html> element.

resources/views/application.blade.php
<html dir="rtl">

Layout options

You can configure the initial layout by setting control classes to the <html> element.

After the initial layout setup the recommended way to control layout options is layout helpers, because the helpers do some extra work, such as: setting container paddings (when navbar is fixed), performing layout animations, setting correct sidenav state classes depending on screen size etc.
resources/views/application.blade.php
<html class="layout-fixed layout-collapsed">
Control class Description
.layout-reversed Reverse layout direction without markup change.
.layout-expanded Expand layout sidenav on small screens (< 992px).
.layout-collapsed Collapse layout sidenav on large screens (>= 992px).
.layout-offcanvas Make layout sidenav offcanvas.
.layout-fixed Set layout position to fixed.
.layout-fixed-offcanvas Set layout position to fixed with offcanvas sidenav.
.layout-navbar-fixed Set layout navbar position to fixed.
.layout-footer-fixed Set layout footer position to fixed.

Generator

Use starter template generator to simplify the initial setup. Just replace a content of appropriate files with the generated code within the laravel-vue-starter directory.

Available tasks

Troubleshooting

  • When you execute composer install, the error occurs: ... requires ext-fileinfo * -> the requested PHP extension fileinfo is missing from your system.

    1. Execute php --ini
    2. Open the file that is pointed out in "Loaded Configuration File:"
    3. Replace ;extension=fileinfo with extension=fileinfo

Migration guide

Do not forget to commit changes or clone the project before performing migration steps.

Official Laravel upgrade guide: https://laravel.com/docs/8.x/upgrade.

  1. Check the PHP version php -v. Upgrade it if the version is less than 7.3.0.

  2. Upgrade Node.js to the latest LTS release (https://nodejs.org/en/)

  3. Changes within app/ directory:

    app/User.php is moved to app/Models/User.php. Diff

    app/Http/Middleware/CheckForMaintenanceMode.php is renamed to PreventRequestsDuringMaintenance.php. Diff

    New app/Http/Middleware/TrustHosts.php. Copy this file from appwork-v1_6_0/laravel-vue-starter/app/Http/Middleware/

    app/Exceptions/Handler.php. Diff

    app/Http/Middleware/RedirectIfAuthenticated.php. Diff

    app/Http/Middleware/TrustProxies.php. Diff

    app/Http/Kernel.php. Diff

    app/Providers/AuthServiceProvider.php. Diff

    app/Providers/EventServiceProvider.php. Diff

    app/Providers/RouteServiceProvider.php. Diff

  4. Changes within config/ directory:

    config/app.php. Diff

    config/auth.php. Diff

    config/broadcasting.php. Diff

    config/cache.php. Diff

    config/cors.php. Diff

    config/filesystems.php. Diff

    config/hashing.php. Diff

    config/logging.php. Diff

    config/mail.php. Diff

    config/queue.php. Diff

    config/session.php. Diff

    config/view.php. Diff

  5. Changes within database/ directory:

    database/seeds/DatabaseSeeder.php is moved to database/seeders/ directory. Diff

    New database/migrations/XXXX_XX_XX_XXXXXX_create_password_resets_table.php migration.

    database/factories/UserFactory.php. Diff

    database/migrations/2019_08_19_000000_create_failed_jobs_table.php. Diff

  6. Other changes:

    Remove webpack.config.js file.

    .env. Diff

    package.json. Diff

    composer.json. Diff

    webpack.mix.js. Diff

    routes/channels.php. Diff

    routes/console.php. Diff

    routes/web.php. Diff

  7. Copy with replace all SCSS files within resources/assets/src/vendor/styles/ and resources/assets/src/vendor/styles/rtl/ directories:

    resources/assets/src/vendor/styles/*.scss
    resources/assets/src/vendor/styles/rtl/*.scss
  8. Copy with replace changed files and directories:

    .gitignore
    .styleci.yml
    phpunit.xml
    public/index.php
    resources/assets/src/style.scss
    resources/assets/src/vendor/styles/_appwork/
    resources/assets/src/vendor/styles/_uikit/
    resources/assets/src/vendor/libs/nouislider/
    resources/assets/src/vendor/libs/sidenav/
    resources/assets/src/vendor/libs/vue-multiselect/
    resources/assets/src/vendor/libs/vue-plyr/
    resources/assets/src/vendor/libs/vue-simple-calendar/
    resources/assets/src/vendor/libs/vuejs-datepicker/
    resources/assets/vendor/fonts/
    resources/assets/vendor/js/
  9. Remove composer.lock

  10. Execute composer install

  11. Remove node_modules directory and package-lock.json. Then execute npm install


Changes in third-party components:

  • Copy with replace the next files and directories:

    resources/assets/src/vendor/styles/_appwork/_functions.scss
    resources/assets/src/vendor/libs/vue-flatpickr-component/
    resources/assets/src/vendor/libs/vue-input-tag/
    resources/assets/src/vendor/libs/vue-multiselect/
    resources/assets/src/vendor/libs/vue-notification/
    resources/assets/src/vendor/libs/vue-plyr/
    resources/assets/src/vendor/libs/vue-slider-component/
    resources/assets/src/vendor/libs/vuejs-datepicker/
  • Add plyr package to your package.json:

    {
      ...,
      "dependencies": {
        ...
        "plyr": "~3.5.6",
        ...
      },
      ...
    }
  • Copy with replace the next file:

    resources/assets/src/vendor/libs/vue-flatpickr-component/flatpickr.scss

Official Laravel upgrade guide: https://laravel.com/docs/7.x/upgrade.

  1. Check the PHP version php -v. Upgrade it if the version is less than 7.2.5.

  2. Upgrade Node.js to the latest LTS release (https://nodejs.org/en/)

    Note: Yarn package manager is not reqired anymore.

  3. All authentication scaffolding has been moved to the laravel/ui repository, see https://laravel.com/docs/7.x/upgrade#authentication-scaffolding. Remove:

    app/Http/Controllers/Auth/
    database/migrations/2014_10_12_100000_create_password_resets_table.php
  4. Remove the next files and directories:

    tests/Bootstrap.php
    resources/assets/src/vendor/styles/migrate/
    resources/assets/src/vendor/libs/plyr/
  5. Copy new files and directories:

    config/cors.php
    resources/assets/src/vendor/libs/vue-plyr/
    resources/assets/src/vendor/styles/_custom-variables/_appwork-dark.scss
    resources/assets/src/vendor/styles/_custom-variables/_features.scss
  6. Copy with replace all SCSS files within resources/assets/src/vendor/styles/ and resources/assets/src/vendor/styles/rtl/ directories:

    resources/assets/src/vendor/styles/*.scss
    resources/assets/src/vendor/styles/rtl/*.scss
  7. Copy with replace changed files and directories:

    .styleci.yml
    phpunit.xml
    resources/assets/vendor/fonts/fontawesome/
    resources/assets/vendor/fonts/fontawesome.css
    resources/assets/vendor/js/
    resources/assets/src/style.scss
    resources/assets/src/vendor/styles/_appwork/
    resources/assets/src/vendor/styles/_theme/
    resources/assets/src/vendor/styles/_uikit/
    resources/assets/src/vendor/styles/pages/
    resources/assets/src/vendor/libs/c3/
    resources/assets/src/vendor/libs/nouislider/
    resources/assets/src/vendor/libs/perfect-scrollbar/
    resources/assets/src/vendor/libs/sidenav/
    resources/assets/src/vendor/libs/spinkit/
    resources/assets/src/vendor/libs/sweet-modal-vue/
    resources/assets/src/vendor/libs/theme-settings/
    resources/assets/src/vendor/libs/v-img/
    resources/assets/src/vendor/libs/vue-awesome-swiper/
    resources/assets/src/vendor/libs/vue-color/
    resources/assets/src/vendor/libs/vue-context-menu/
    resources/assets/src/vendor/libs/vue-data-tables/
    resources/assets/src/vendor/libs/vue-dropzone/
    resources/assets/src/vendor/libs/vue-flatpickr-component/
    resources/assets/src/vendor/libs/vue-form-wizard/
    resources/assets/src/vendor/libs/vue-gallery/
    resources/assets/src/vendor/libs/vue-input-tag/
    resources/assets/src/vendor/libs/vue-jstree/
    resources/assets/src/vendor/libs/vue-multiselect/
    resources/assets/src/vendor/libs/vue-notification/
    resources/assets/src/vendor/libs/vue-number-input-spinner/
    resources/assets/src/vendor/libs/vue-password-strength-meter/
    resources/assets/src/vendor/libs/vue-quill-editor/
    resources/assets/src/vendor/libs/vue-simple-calendar/
    resources/assets/src/vendor/libs/vue-simplemde/
    resources/assets/src/vendor/libs/vue-slider-component/
    resources/assets/src/vendor/libs/vue-toasted/
    resources/assets/src/vendor/libs/vuejs-datepicker/
  8. Update:

    .env.example. Diff

    composer.json. Diff

    package.json. Diff

    webpack.mix.js. Diff

    resources/assets/src/entry-point.js. Diff

    resources/assets/src/globals.js. Diff

    resources/assets/src/main.js. Diff

    resources/assets/src/vendor/styles/_custom-variables/_libs.scss. Diff

    resources/assets/src/vendor/styles/_custom-variables/_pages.scss. Diff

    resources/assets/src/vendor/styles/_custom-variables/_uikit.scss. Diff

    app/Exceptions/Handler.php. Diff

    app/Http/Middleware/RedirectIfAuthenticated.php. Diff

    app/Http/Kernel.php. Diff

    app/Providers/RouteServiceProvider.php. Diff

    config/app.php. Diff

    config/auth.php. Diff

    config/database.php. Diff

    config/filesystems.php. Diff

    config/logging.php. Diff

    config/mail.php. Diff

    config/session.php. Diff

    config/view.php. Diff

    database/migrations/2014_10_12_000000_create_users_table.php. Diff

    database/migrations/2019_08_19_000000_create_failed_jobs_table.php. Diff

    resources/lang/en/passwords.php. Diff

    resources/lang/en/validation.php. Diff

    routes/api.php. Diff

    routes/channels.php. Diff

    routes/console.php. Diff

    routes/web.php. Diff

    tests/Unit/ExampleTest.php. Diff

  9. If you're using multi-theming setup (with ThemeSettings plugin enabled), you need to update your webpack.mix.js. Use Starter template generator.

  10. Edit variables in the resources/assets/src/vendor/styles/_custom-variables/_features.scss file according your setup.

    Variable Feature
    $enable-rtl-support Set to true to enable RTL mode support, otherwise set to false.
    $enable-light-style Set to true to enable light (previously default) style support, otherwise set to false.
    $enable-material-style Set to true to enable material style support, otherwise set to false.
    $enable-dark-style Set to true to enable dark style support, otherwise set to false.
  11. Remove composer.lock

  12. Execute composer install

  13. Remove node_modules directory and then execute npm install


  • theme-default class is renamed to theme-light.

    [Before] resources/views/layouts/application.blade.php
    <html lang="{{ app()->getLocale() }}" class="default-style">
    [After] resources/views/layouts/application.blade.php
    <html lang="{{ app()->getLocale() }}" class="light-style">
  • If you need IE10 support, add the next code to the end of the head block.

    resources/views/layouts/application.blade.php
    <script>
      if (navigator.userAgent.match('MSIE 10.0;')) {
        document.write('<script src="https:\/\/cdn.polyfill.io\/v2\/polyfill.min.js?features=Intl.~locale.en"><\/script>');
      }
    </script>
  • ThemeSettings plugin settings are changed. Use Settings Panel Generator to get updated settings.

  • ThemeSettings.setMaterial() method is removed.
    Added ThemeSettings.setStyle(), ThemeSettings.isLightStyle(), ThemeSettings.isMaterialStyle(), ThemeSettings.isDarkStyle() methods.
    See Settings panel docs.

  • New style-dependent utility classes, which change its color depending on the current active style:

    • .theme-text-white - White (light or material style) / dark (dark style) text.
    • .theme-text-dark - Dark (light or material style) / white (dark style) text.
    • .theme-bg-white - White (light or material style) / dark (dark style) background.
    • .theme-bg-dark - Dark (light or material style) / white (dark style) background.
    • .theme-border-white - White (light or material style) / dark (dark style) border.
    • .theme-border-dark - Dark (light or material style) / white (dark style) border.
  • If you're using splash screen, edit router.afterEach callback in the resources/assets/src/router/index.js:

    Before
    // Remove initial splash screen
    const splashScreen = document.querySelector('.app-splash-screen')
    if (splashScreen) {
      splashScreen.style.opacity = 0
      setTimeout(() => splashScreen && splashScreen.parentNode.removeChild(splashScreen), 300)
    }
    After
    // Remove initial splash screen
    const splashScreen = document.querySelector('.app-splash-screen')
    if (splashScreen) {
      splashScreen.style.opacity = 0
      setTimeout(() =>
        splashScreen && splashScreen.parentNode && splashScreen.parentNode.removeChild(splashScreen)
      , 300)
    }

Changes in third-party components:

  1. Server requirements for Laravel 6 was changed, see https://laravel.com/docs/6.x/installation#server-requirements. Upgrade your environment regarding this list.

    Official upgrade guide: https://laravel.com/docs/6.x/upgrade.

  2. (Optional) Upgrade Node.js to 10.16 LTS and Yarn

  3. Copy with replace changed files and directories:

    resources/assets/src/vendor/styles/_appwork/
    resources/assets/src/vendor/libs/c3/
    resources/assets/src/vendor/libs/nouislider/
    resources/assets/src/vendor/libs/sidenav/
    resources/assets/src/vendor/libs/vue-flatpickr-component/
    resources/assets/src/vendor/libs/vue-quill-editor/
    resources/assets/src/vendor/libs/vue-simplemde/
    resources/assets/vendor/fonts/fontawesome/
    resources/assets/vendor/fonts/fontawesome.css
    resources/assets/vendor/fonts/ionicons/
    resources/assets/vendor/fonts/ionicons.css
    resources/assets/vendor/fonts/linearicons/
    resources/assets/vendor/js/
  4. (Optional) Copy new default "Not Found" page:

    1. Copy resources/assets/src/components/NotFound.vue.
    2. Edit resources/assets/src/router/index.js. Diff
  5. Copy new files:

    .styleci.yml
    tests/Bootstrap.php
    database/migrations/2019_08_19_000000_create_failed_jobs_table.php
  6. Update:

    .editorconfig. Diff

    .gitignore. Diff

    composer.json. Diff

    package.json. Diff

    phpunit.xml. Diff

    webpack.mix.js. Diff

    webpack.config.js. Diff

    app/Http/Kernel.php. Diff

    app/Http/Middleware/TrustProxies.php. Diff

    config/broadcasting.php. Diff

    config/cache.php. Diff

    config/database.php. Diff

    config/filesystems.php. Diff

    config/hashing.php. Diff

    config/mail.php. Diff

    config/queue.php. Diff

    config/services.php. Diff

    database/.gitignore. Diff

    database/factories/UserFactory.php. Diff

    resources/lang/en/passwords.php. Diff

    resources/lang/en/validation.php. Diff

    resources/assets/src/entry-point.js. Diff

    resources/assets/src/globals.js. Diff

    resources/assets/src/style.scss. Diff

  7. Remove composer.lock.
  8. Execute composer install.
  9. Execute yarn upgrade.
  10. Execute npm run dev.

Some changes in Bootstrap-Vue (See full list on https://bootstrap-vue.js.org/docs/misc/changelog):

  • Introduced new b-toast component.
    Note: :variant and :solid options have no effect, use :toastClass instead.
  • To set classes to b-table's inner <table> element use :table-class instead of :class.
  • b-table's slot syntax was changed:

    Before:

    <template slot="title" slot-scope="data">
      {{data.item.title}}
    </template>

    After:

    <template v-slot:cell(title)="data">
      {{data.item.title}}
    </template>

  • To set classes to b-modal's inner .modal element use modal-class= instead of class=.
  • Form's :state behaviour was changed, pass true for success state and false for error state.
  • To set classes to b-popover's and b-tooltip's inner .popover and .tooltip elements use custom-class= instead of class=.
  • b-tooltip's markup was changed. See laravel-vue-demo/resources/assets/src/components/ui/TooltipsAndPopovers.vue for example.

Changes in third-party components:

  • Directory structure of vue-simplemde package is changed. Replace require('vue-simplemde/src/markdown-editor').default with require('vue-simplemde/src/index').default.
  1. (Optional) Upgrade Node.js to 10.15 LTS and Yarn

  2. Copy new files and directories:

    webpack.config.js
    resources/assets/src/vendor/styles/migrate/
  3. Copy with replace all SCSS files within resources/assets/src/vendor/styles/ and resources/assets/src/vendor/styles/rtl/ directories:

    resources/assets/src/vendor/styles/*.scss
    resources/assets/src/vendor/styles/rtl/*.scss
  4. Copy with replace changed files and directories:

    resources/assets/vendor/fonts/
    resources/assets/vendor/js/
    resources/assets/src/vendor/styles/_appwork/
    resources/assets/src/vendor/styles/_theme/
    resources/assets/src/vendor/styles/_uikit/_social.scss
    resources/assets/src/vendor/styles/pages/clients.scss
    resources/assets/src/vendor/styles/pages/messages.scss
    resources/assets/src/vendor/libs/mega-dropdown/
    resources/assets/src/vendor/libs/nouislider/
    resources/assets/src/vendor/libs/plyr/
    resources/assets/src/vendor/libs/sidenav/
    resources/assets/src/vendor/libs/vue-awesome-swiper/
    resources/assets/src/vendor/libs/vue-flatpickr-component/
    resources/assets/src/vendor/libs/vue-miltiselect/
    resources/assets/src/vendor/libs/vue-quill-editor/
    resources/assets/src/vendor/libs/vue-simple-calendar/
    resources/assets/src/vendor/libs/vue-simplemde/
    resources/assets/src/vendor/libs/vue-slider-component/
    resources/assets/src/vendor/libs/vue-toasted/
    resources/assets/src/vendor/libs/vuejs-datepicker/
  5. Update:

    package.json. Diff

    webpack.mix.js. Diff

    resources/views/application.blade.php. Diff

    resources/assets/src/entry-point.js. Diff

    resources/assets/src/globals.js. Diff

    resources/assets/src/style.scss. Diff

  6. Find and replace all occurences of "baseUrl" with "publicUrl" within resources/assets/src directory

  7. Execute yarn upgrade

  8. (Optional) Upgrade Laravel framework:

    Note: Possibly, you also will have to upgrade PHP and Composer versions.
    1. Update:

      composer.json. Diff

      phpunit.xml. Diff

      app/Http/Controllers/Auth/RegisterController.php. Diff

      app/Providers/AuthServiceProvider.php. Diff

      app/User.php. Diff

      config/app.php. Diff

      config/auth.php. Diff

      config/cache.php. Diff

      config/database.php. Diff

      config/logging.php. Diff

      config/mail.php. Diff

      config/queue.php. Diff

      config/services.php. Diff

      config/session.php. Diff

      database/factories/UserFactory.php. Diff

      database/migrations/2014_10_12_000000_create_users_table.php. Diff

      resources/lang/en/passwords.php. Diff

      resources/lang/en/validation.php. Diff

    2. Remove composer.lock

    3. Execute composer install

  • Bootstrap CSS:

    Import migration SCSS file in resources/assets/src/style.scss:

    @import '~@/vendor/styles/migrate/appwork-130';

    Remove this import after you correct all changed CSS classes in your HTML code.

    Changed classes:

    .font-weight-thin → .font-weight-lighter
    .text-dark → .text-body
    .bg-none → .bg-transparent
    .font-sans-serif → .text-sans-serif
    .font-serif → .text-serif
    .font-monospace → .text-monospace
    .box-shadow-none → .shadow-none
    .container-m--x → .container-m-nx
    .container-m--y → .container-m-ny
    .btn-round → .rounded-pill
    
    Negative horizontal margins:
    .m{sides}--{size} → .m{sides}-n{size}
    .m{sides}-{breakpoint}--{size} → .m{sides}-{breakpoint}-n{size}
  • Bootstrap-Vue:

    Add custom-controls-stacked class to all <b-check-group stacked> elements

    Prop horizontal of <b-form-group> is deprecated, use label-cols-{size} instead. See examples: vue-demo/src/cui-components/CuiForms.vue

  • Components changed:


Note: Validation icons are disabled by default. To enable it, add the next variable in the resources/assets/src/vendor/styles/_custom-variables/_appwork.scss and resources/assets/src/vendor/styles/_custom-variables/_appwork-material.scss:

$enable-validation-icons: true;
  1. Update package.json. Diff

  2. Remove node_modules directory

  3. Execute yarn install

  4. Execute npm run dev

  1. Update .env. Diff

  2. Update .gitignore. Diff

  3. Update phpunit.xml. Diff

  4. Update composer.json. Diff

  5. Update app/Http/Controllers/Auth/RegisterController.php. Diff

  6. Update app/Http/Kernel.php. Diff

  7. Update app/Http/Middleware/VerifyCsrfToken.php. Diff

  8. Update app/Providers/EventServiceProvider.php. Diff

  9. Update app/User.php. Diff

  10. Update bootstrap/app.php. Diff

  11. Update config/app.php. Diff

  12. Update config/cache.php. Diff

  13. Update config/database.php. Diff

  14. Update config/hashing.php. Diff

  15. Update config/logging.php. Diff

  16. Update config/mail.php. Diff

  17. Update config/queue.php. Diff

  18. Update config/services.php. Diff

  19. Update config/session.php. Diff

  20. Update config/view.php. Diff

  21. Update database/factories/UserFactory.php. Diff

  22. Update database/migrations/2014_10_12_000000_create_users_table.php. Diff

  23. Update resources/lang/en/validation.php. Diff

  24. Update storage/framework/cache/.gitignore. Diff

  25. Update tests/CreatesApplication.php. Diff

  26. Copy new files and directories:

    app/Http/Controllers/Auth/VerificationController.php
    app/Http/Middleware/Authenticate.php
    app/Http/Middleware/CheckForMaintenanceMode.php
    public/web.config
    storage/logs/
    storage/framework/cache/data/
    .editorconfig
  27. Execute composer install

  28. Execute yarn install

  29. Execute npm run dev

  1. Update composer.json. Diff

  2. Update package.json. Diff

  3. Update webpack.mix.js. Diff

  4. Update resources/assets/src/entry-point.js. Diff

  5. Update resources/assets/src/globals.js. Diff

  6. Update resources/assets/src/main.js. Diff

  7. Update resources/assets/src/style.scss. Diff

  8. Copy with replace changed files and directories:

    resources/assets/vendor/js/
    resources/assets/vendor/fonts/fontawesome/
    resources/assets/vendor/fonts/ionicons/
    resources/assets/vendor/fonts/fontawesome.css
    resources/assets/vendor/fonts/ionicons.css
    resources/assets/src/vendor/libs/vue-gallery/
    resources/assets/src/vendor/libs/vue-simplemde/
    resources/assets/src/vendor/libs/vue-toasted/
    resources/assets/src/vendor/libs/mega-dropdown/mega-dropdown.js
    resources/assets/src/vendor/libs/sidenav/sidenav.js
    resources/assets/src/vendor/libs/spinkit/spinkit.scss
    resources/assets/src/vendor/libs/vue-dropzone/vue-dropzone.scss
    resources/assets/src/vendor/libs/vue-multiselect/vue-multiselect.scss
    resources/assets/src/vendor/libs/vuejs-datepicker/vuejs-datepicker.scss
    resources/assets/src/vendor/styles/_appwork/_accordion.scss
    resources/assets/src/vendor/styles/_appwork/_breadcrumb.scss
    resources/assets/src/vendor/styles/_appwork/_buttons.scss
    resources/assets/src/vendor/styles/_appwork/_close.scss
    resources/assets/src/vendor/styles/_appwork/_custom-forms.scss
    resources/assets/src/vendor/styles/_appwork/_mixins.scss
    resources/assets/src/vendor/styles/_appwork/_switcher.scss
    resources/assets/src/vendor/styles/_appwork/_variables-material.scss
    resources/assets/src/vendor/styles/_appwork/_variables.scss
    resources/assets/src/vendor/styles/colors-material.scss
  9. Update your code regarding breaking changes:

  10. Execute composer install

  11. Execute yarn install

  12. Execute npm run dev