├── .gitignore ├── LICENSE.md ├── README.md ├── composer.json ├── config └── nova-theme-responsive.php ├── resources ├── css │ └── theme.css └── js │ └── theme.js └── src └── ThemeServiceProvider.php /.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /.idea 3 | /vendor 4 | /node_modules 5 | package-lock.json 6 | composer.phar 7 | composer.lock 8 | phpunit.xml 9 | .phpunit.result.cache 10 | .DS_Store 11 | Thumbs.db 12 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Spatie bvba 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Deprecation notice 2 | New Nova 4 release is fully responsive (https://nova.laravel.com/docs/4.0/releases.html#responsive-design), so this package is no longer needed and it will not be updated anymore. 3 | 4 | Thanks to everybody for the support during this years and I hope the package was useful to many people. 5 | 6 | If you are using and old (<= 3) version of Nova, you still can use this package, but there will be no more releases or bug fixes. 7 | 8 | # Laravel Nova Responsive Theme 9 | [![Latest Version on Packagist](https://img.shields.io/packagist/v/gregoriohc/laravel-nova-theme-responsive.svg?style=flat-square)](https://packagist.org/packages/gregoriohc/laravel-nova-theme-responsive) 10 | [![Total Downloads](https://img.shields.io/packagist/dt/gregoriohc/laravel-nova-theme-responsive.svg?style=flat-square)](https://packagist.org/packages/gregoriohc/laravel-nova-theme-responsive) 11 | 12 | A simple Laravel Nova theme that add responsiveness to the site. 13 | 14 | It can be used as is, or as a base theme to your own ones. 15 | 16 | ## Installation 17 | 18 | You can install the nova theme into a Laravel app that uses [Nova](https://nova.laravel.com) via composer: 19 | 20 | ```bash 21 | composer require gregoriohc/laravel-nova-theme-responsive 22 | ``` 23 | 24 | This theme include some config based options. To use them, first publish the config file: 25 | 26 | ```bash 27 | php artisan vendor:publish --provider="Gregoriohc\LaravelNovaThemeResponsive\ThemeServiceProvider" 28 | ``` 29 | 30 | And then you can configure the options editing the `config/nova-theme-responsive.php` file. 31 | 32 | ## Screenshots 33 | 34 | Dashboard | Menu | Index 35 | ------------ | ------------- | ------------- 36 | ![nova-responsive-dashboard-view](https://user-images.githubusercontent.com/29180903/45772680-5ff51600-bc16-11e8-85c8-da33d9a6fea5.png) | ![nova-responsive-index-menu-view](https://user-images.githubusercontent.com/29180903/45772682-608dac80-bc16-11e8-9b15-b69131c2f02a.png) | ![nova-responsive-index-view](https://user-images.githubusercontent.com/29180903/45772683-608dac80-bc16-11e8-9266-404617968c3f.png) 37 | 38 | Detail | Create | Delete 39 | ------------ | ------------- | ------------- 40 | ![nova-responsive-detail-view](https://user-images.githubusercontent.com/29180903/45772677-5ff51600-bc16-11e8-90e9-17e6025f8998.png) | ![nova-responsive-create-view](https://user-images.githubusercontent.com/29180903/45772681-5ff51600-bc16-11e8-84c9-c0f61890bfed.png)| ![nova-responsive-delete-view](https://user-images.githubusercontent.com/29180903/45772679-5ff51600-bc16-11e8-93d5-cd2a88b7e54a.png) 41 | 42 | 43 | ## Credits 44 | 45 | - [Gregorio Hernández Caso](https://github.com/gregoriohc) 46 | 47 | ## Support the development 48 | **Do you like this project? Support it by donating** 49 | 50 | - PayPal: [Donate](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=GM9RYQ4R22LKG¤cy_code=EUR&source=url) 51 | - Patreon: [Donate](https://www.patreon.com/gregoriohc) 52 | 53 | ## License 54 | 55 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 56 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gregoriohc/laravel-nova-theme-responsive", 3 | "description": "A Laravel Nova responsive theme.", 4 | "type": "library", 5 | "homepage": "https://github.com/gregoriohc/laravel-nova-theme-responsive", 6 | "authors": [ 7 | { 8 | "name": "Gregorio Hernández Caso", 9 | "email": "gregoriohc@gmail.com", 10 | "homepage": "https://github.com/gregoriohc", 11 | "role": "Developer" 12 | } 13 | ], 14 | "keywords": [ 15 | "laravel", 16 | "nova" 17 | ], 18 | "license": "MIT", 19 | "require": { 20 | "php": ">=7.1.0" 21 | }, 22 | "autoload": { 23 | "psr-4": { 24 | "Gregoriohc\\LaravelNovaThemeResponsive\\": "src/" 25 | } 26 | }, 27 | "extra": { 28 | "laravel": { 29 | "providers": [ 30 | "Gregoriohc\\LaravelNovaThemeResponsive\\ThemeServiceProvider" 31 | ] 32 | } 33 | }, 34 | "config": { 35 | "sort-packages": true 36 | }, 37 | "minimum-stability": "dev", 38 | "prefer-stable": true 39 | } 40 | -------------------------------------------------------------------------------- /config/nova-theme-responsive.php: -------------------------------------------------------------------------------- 1 | false, 7 | 8 | // List of sidebar headlines to hide (Ex.: ["Other"]) 9 | 'hidden_sidebar_headlines' => [], 10 | 11 | // If true, the resource tables actions will be always visible (sticky) 12 | 'resource_tables_sticky_actions' => false, 13 | 14 | // If true, the resource tables actions will be always visible (sticky) on mobile 15 | 'resource_tables_sticky_actions_on_mobile' => false, 16 | 17 | // If true, hides the "Update & Continue Editing" button on "Update" forms 18 | 'hide_update_and_continue_editing_button' => false, 19 | 20 | // If true, hides the "Update & Continue Editing" button on "Update" forms (mobile only) 21 | 'hide_update_and_continue_editing_button_on_mobile' => false, 22 | 23 | // If true, the sidebar will stay fixed on desktop view 24 | 'fixed_sidebar' => false, 25 | 26 | ]; 27 | -------------------------------------------------------------------------------- /resources/css/theme.css: -------------------------------------------------------------------------------- 1 | .hamburger-menu { 2 | cursor: pointer; 3 | position: relative; 4 | height: 19px; 5 | display: none; 6 | } 7 | html:not([dir="rtl"]) .hamburger-menu { 8 | padding-left: 1.25em; 9 | margin-right: 9px; 10 | } 11 | html[dir="rtl"] .hamburger-menu { 12 | padding-right: 1.25em; 13 | margin-left: 9px; 14 | } 15 | 16 | .hamburger-menu:before { 17 | content: ""; 18 | position: absolute; 19 | top: 0.21em; 20 | bottom: 0.21em; 21 | width: 1em; 22 | background: linear-gradient( 23 | to bottom, 24 | black, black 20%, 25 | white 20%, white 40%, 26 | black 40%, black 60%, 27 | white 60%, white 80%, 28 | black 80%, black 100% 29 | ); 30 | } 31 | html:not([dir="rtl"]) .hamburger-menu:before { 32 | left: 0; 33 | } 34 | html[dir="rtl"] .hamburger-menu:before { 35 | right: 0; 36 | } 37 | 38 | .content.hide-update-and-continue-editing-button button[dusk$='update-and-continue-editing-button'] { 39 | display: none; 40 | } 41 | 42 | /* Resource tables */ 43 | .content.sticky-actions .card table.w-full tbody tr td:last-child, .content.sticky-actions .card table.w-full thead tr th:last-child { 44 | position: -webkit-sticky; 45 | position: -moz-sticky; 46 | position: -ms-sticky; 47 | position: -o-sticky; 48 | position: sticky; 49 | right: 0; 50 | } 51 | 52 | .content.sticky-actions .card table.w-full tbody tr td:last-child { 53 | background: white; 54 | } 55 | 56 | .content.sticky-actions .card table.w-full tbody tr td:last-child:before { 57 | content: ''; 58 | height: 100%; 59 | top: 0; 60 | margin-left: -.75rem; 61 | position: absolute; 62 | border-left: 1px solid #eee; 63 | } 64 | 65 | @media (min-width: 992px) { 66 | body.fixed-sidebar .bg-grad-sidebar { 67 | position: fixed; 68 | padding-top: 5.5rem !important; 69 | overflow: auto; 70 | height: 100%; 71 | } 72 | 73 | body.fixed-sidebar .content { 74 | padding-left: 13.75rem; 75 | max-width: 100%; 76 | } 77 | } 78 | 79 | @media (max-width: 80rem) { 80 | .min-w-site { 81 | min-width: auto; 82 | } 83 | 84 | .content { 85 | min-width: auto; 86 | width: 100%; 87 | } 88 | 89 | /* Resource tables */ 90 | .content.sticky-actions-on-mobile .card table.w-full tbody tr td:last-child, .content.sticky-actions-on-mobile .card table.w-full thead tr th:last-child { 91 | position: -webkit-sticky; 92 | position: -moz-sticky; 93 | position: -ms-sticky; 94 | position: -o-sticky; 95 | position: sticky; 96 | right: 0; 97 | } 98 | 99 | .content.sticky-actions-on-mobile .card table.w-full tbody tr td:last-child { 100 | background: white; 101 | } 102 | 103 | .content.sticky-actions-on-mobile .card table.w-full tbody tr td:last-child:before { 104 | content: ''; 105 | height: 100%; 106 | top: 0; 107 | margin-left: -.75rem; 108 | position: absolute; 109 | border-left: 1px solid #eee; 110 | } 111 | } 112 | 113 | @media (max-width: 992px) { 114 | /* Sidebar */ 115 | .w-sidebar { 116 | position: fixed; 117 | padding-top: 5.5rem !important; 118 | z-index: 1000; 119 | height: 100%; 120 | overflow: auto; 121 | } 122 | 123 | .w-sidebar.pt-header { 124 | padding-top: 1.75rem; 125 | } 126 | 127 | .sidebar-hidden { 128 | display: none; 129 | } 130 | 131 | /* Header */ 132 | .h-header { 133 | z-index: 1000; 134 | position: fixed; 135 | width: 100%; 136 | margin-top: -3.75rem; 137 | } 138 | 139 | .hamburger-menu { 140 | display: block; 141 | } 142 | html:not([dir="rtl"]) .hamburger-menu { 143 | margin-right: 1rem; 144 | } 145 | html[dir="rtl"] .hamburger-menu { 146 | margin-left: 1rem; 147 | } 148 | 149 | .bg-logo { 150 | display: none !important; 151 | } 152 | 153 | html:not([dir="rtl"]) .h-header .dropdown-trigger { 154 | margin-right: -20px; 155 | } 156 | html[dir="rtl"] .h-header .dropdown-trigger { 157 | margin-left: -20px; 158 | } 159 | 160 | .h-header .dropdown-trigger span, .h-header .dropdown-trigger svg { 161 | display: none; 162 | } 163 | 164 | html:not([dir="rtl"]) .h-header .dropdown-trigger img.mr-3 { 165 | margin-right: 0; 166 | } 167 | html[dir="rtl"] .h-header .dropdown-trigger img.mr-3 { 168 | margin-left: 0; 169 | } 170 | 171 | 172 | span.hamburger-menu + a { 173 | display: none; 174 | } 175 | 176 | .h-header .pl-search { 177 | width: 85%; 178 | } 179 | 180 | /* Content */ 181 | .content { 182 | padding-top: 3.75rem; 183 | max-width: none; 184 | } 185 | 186 | .content .px-view { 187 | padding-left: 1.125rem; 188 | padding-right: 1.125rem; 189 | } 190 | 191 | .content .py-view { 192 | padding-top: 1.125rem; 193 | padding-bottom: 1.125rem; 194 | } 195 | 196 | /* Forms */ 197 | form .w-1\/2 { 198 | width: 80%; 199 | } 200 | 201 | form .w-1\/2 > div.flex { 202 | display: block; 203 | } 204 | 205 | form > .flex { 206 | display: block; 207 | } 208 | 209 | form > .flex > button { 210 | margin-bottom: 10px; 211 | } 212 | 213 | .content.hide-update-and-continue-editing-button-on-mobile button[dusk$='update-and-continue-editing-button'] { 214 | display: none; 215 | } 216 | 217 | .content form .card > .flex, 218 | div[dusk$='detail-component'] .card > .flex{ 219 | display: block; 220 | } 221 | .content form .card > .flex > div, 222 | div[dusk$='detail-component'] .card > .flex > div { 223 | width: 100%; 224 | } 225 | 226 | .content form .card > .flex > .py-6, 227 | div[dusk$='detail-component'] .card > .flex > .py-4 { 228 | padding-top: .5rem; 229 | padding-bottom: 0; 230 | } 231 | 232 | .content form .card > .flex > .py-6, 233 | div[dusk$='detail-component'] .card > .flex.bg-20 > .py-4 { 234 | padding-bottom: .5rem; 235 | } 236 | 237 | .content form .card > .flex > .py-6 + .py-6, 238 | div[dusk$='detail-component'] .card > .flex > .py-4 + .py-4 { 239 | padding-bottom: .5rem; 240 | } 241 | 242 | .card > form > div header.flex { 243 | display: block; 244 | } 245 | 246 | .card > form > div header.flex ul:first-child { 247 | border-bottom: 1px solid var(--60); 248 | } 249 | 250 | html:not([dir="rtl"]) .card > form > div header.flex ul:nth-child(2) button:first-child { 251 | border-left: none; 252 | } 253 | html[dir="rtl"] .card > form > div header.flex ul:nth-child(2) button:first-child { 254 | border-right: none; 255 | } 256 | 257 | html:not([dir="rtl"]) .card > form > div header.flex ul:nth-child(2) button:last-child { 258 | border-right: 1px solid var(--60); 259 | } 260 | html[dir="rtl"] .card > form > div header.flex ul:nth-child(2) button:last-child { 261 | border-left: 1px solid var(--60); 262 | } 263 | 264 | .card > form > div div.pin { 265 | z-index: 2000; 266 | } 267 | 268 | trix-toolbar .trix-button-row { 269 | display: inline-block !important; 270 | } 271 | 272 | html:not([dir="rtl"]) trix-toolbar .trix-button-group { 273 | float: left !important; 274 | } 275 | html[dir="rtl"] trix-toolbar .trix-button-group { 276 | float: right !important; 277 | } 278 | 279 | /* Cards */ 280 | .content .flex-wrap > .w-1\/2, 281 | .content .flex-wrap > .w-1\/3, 282 | .content .flex-wrap > .w-1\/4, 283 | .content .flex-wrap > .w-1\/5, 284 | .content .flex-wrap > .w-1\/6, 285 | .content .flex-wrap > .w-2\/3, 286 | .content .flex-wrap > .w-2\/5, 287 | .content .flex-wrap > .w-3\/4, 288 | .content .flex-wrap > .w-3\/5, 289 | .content .flex-wrap > .w-4\/5, 290 | .content .flex-wrap > .w-5\/6 { 291 | width: 100%; 292 | } 293 | 294 | .content .card table td.w-1\/2 { 295 | display: table-row; 296 | } 297 | 298 | /* Other */ 299 | .btn { 300 | white-space: nowrap; 301 | } 302 | 303 | div[dusk$='index-component'] .pl-search { 304 | width: auto; 305 | } 306 | 307 | div[dusk$='index-component'] .btn[dusk='create-button'], 308 | div[dusk$='index-component'] .btn[dusk='attach-button'] { 309 | font-weight: bolder; 310 | font-size: 26px; 311 | padding: 0 12px; 312 | width: 39px; 313 | overflow: hidden; 314 | } 315 | 316 | div[dusk$='index-component'] .btn[dusk='create-button']::before, 317 | div[dusk$='index-component'] .btn[dusk='attach-button']::before { 318 | content: "+"; 319 | position: relative; 320 | } 321 | html:not([dir="rtl"]) div[dusk$='index-component'] .btn[dusk='create-button']::before, 322 | html:not([dir="rtl"]) div[dusk$='index-component'] .btn[dusk='attach-button']::before { 323 | margin-right: 20px; 324 | } 325 | html[dir="rtl"] div[dusk$='index-component'] .btn[dusk='attach-button']::before, 326 | html[dir="rtl"] div[dusk$='index-component'] .btn[dusk='create-button']::before { 327 | margin-left: 20px; 328 | } 329 | 330 | .modal { 331 | top: auto; 332 | } 333 | 334 | .modal form { 335 | width: 100% !important; 336 | } 337 | 338 | div[dusk$='index-component'] > div.card > div.py-3.flex.items-center.border-b.border-50 { 339 | padding-bottom: 0.35rem; 340 | } 341 | 342 | div[dusk$='detail-component'] > div > div.flex.items-center.mb-3 { 343 | display: block; 344 | } 345 | 346 | div[dusk$='detail-component'] > div > div.flex.items-center.mb-3 > h4 { 347 | position: absolute; 348 | } 349 | 350 | div[dusk$='index-component'] > div.card > div.py-3.flex.items-center.border-b.border-50 > div.flex.items-center.ml-auto.px-3, 351 | div[dusk$='detail-component'] > div > div.flex.items-center.mb-3 > div.ml-3.w-full.flex.items-center { 352 | display: inline-block; 353 | } 354 | 355 | div[dusk$='detail-component'] > div > div.flex.items-center.mb-3 > div.ml-3.w-full.flex.items-center { 356 | display: inline-block; 357 | padding-top: 1.5rem 358 | } 359 | 360 | div[dusk$='index-component'] > div.card > div.py-3.flex.items-center.border-b.border-50 > div.flex.items-center.ml-auto.px-3 > div, 361 | div[dusk$='detail-component'] > div > div.flex.items-center.mb-3 > div.ml-3.w-full.flex.items-center > div, 362 | div[dusk$='detail-component'] > div > div.flex.items-center.mb-3 > div.ml-3.w-full.flex.items-center > button, 363 | div[dusk$='detail-component'] > div > div.flex.items-center.mb-3 > div.ml-3.w-full.flex.items-center > a { 364 | display: inline-flex; 365 | vertical-align: top; 366 | margin-bottom: 0.4rem; 367 | } 368 | 369 | html:not([dir="rtl"]) div[dusk$='detail-component'] > div > div.flex.items-center.mb-3 > div.ml-3.w-full.flex.items-center > div.ml-3 { 370 | margin-left: 0; 371 | } 372 | html[dir="rtl"] div[dusk$='detail-component'] > div > div.flex.items-center.mb-3 > div.ml-3.w-full.flex.items-center > div.ml-3 { 373 | margin-right: 0; 374 | } 375 | } 376 | 377 | @media (max-width: 500px) { 378 | select[dusk=action-select] { 379 | width: 8.9rem; 380 | } 381 | } 382 | 383 | @media (max-width: 310px) { 384 | select[dusk=action-select] { 385 | width: 5.6rem; 386 | } 387 | } 388 | 389 | @media (max-height: 610px) { 390 | .z-50.open .scroll-wrap { 391 | max-height: 270px !important; 392 | } 393 | } 394 | 395 | @media (max-height: 540px) { 396 | .z-50.open .scroll-wrap { 397 | max-height: 180px !important; 398 | } 399 | } 400 | 401 | @media (max-height: 440px) { 402 | .z-50.open .scroll-wrap { 403 | max-height: 110px !important; 404 | } 405 | } 406 | -------------------------------------------------------------------------------- /resources/js/theme.js: -------------------------------------------------------------------------------- 1 | function load() { 2 | // Set viewport 3 | var viewport = document.querySelector("meta[name=viewport]"); 4 | viewport.setAttribute('content', 'width=device-width, initial-scale=1, shrink-to-fit=no'); 5 | 6 | // Add hidden class to sidebar 7 | var sidebar = document.querySelector('.w-sidebar'); 8 | sidebar.classList.add("sidebar-hidden"); 9 | 10 | // Add hamburger menu to header 11 | var hamburger = document.createElement("span"); 12 | hamburger.className = 'hamburger-menu'; 13 | var contentHeader = document.querySelector('.content .h-header'); 14 | contentHeader.prepend(hamburger); 15 | 16 | // Hamburger click event 17 | hamburger.addEventListener("click", function (e) { 18 | e.stopPropagation(); 19 | var sidebar = document.querySelector('.w-sidebar'); 20 | sidebar.classList.toggle("sidebar-hidden"); 21 | }, true); 22 | 23 | // Sidebar links click event 24 | var sidebarLinks = document.querySelectorAll('.w-sidebar a, .w-sidebar .cursor-pointer'); 25 | sidebarLinks.forEach(function(sidebarLink) { 26 | sidebarLink.addEventListener("click", function() { 27 | var sidebar = document.querySelector('.w-sidebar'); 28 | sidebar.classList.add("sidebar-hidden"); 29 | }, false); 30 | }); 31 | 32 | // Hide sidebar when clicking outside 33 | var rootElements = document.querySelectorAll('body,html'); 34 | rootElements.forEach(function(rootElement) { 35 | rootElement.addEventListener("click", function(e) { 36 | var sidebar = document.querySelector('.w-sidebar'); 37 | if (e.target !== sidebar && !sidebar.contains(e.target)) { 38 | sidebar.classList.add("sidebar-hidden"); 39 | } 40 | }); 41 | }); 42 | 43 | // Config based theme tweaking 44 | if (Nova.config.ntr) { 45 | // Hide sidebar headlines 46 | var sidebarHeadlines = document.querySelectorAll('.w-sidebar h4'); 47 | sidebarHeadlines.forEach(function(sidebarHeadline) { 48 | if (Nova.config.ntr.hide_all_sidebar_headlines 49 | || Nova.config.ntr.hidden_sidebar_headlines.indexOf(sidebarHeadline.textContent) !== -1) { 50 | sidebarHeadline.classList.add("hidden"); 51 | } 52 | }); 53 | 54 | // Sticky resource table actions 55 | if (Nova.config.ntr.resource_tables_sticky_actions) { 56 | var contents = document.querySelectorAll('.content'); 57 | contents.forEach(function(content) { 58 | content.classList.add("sticky-actions"); 59 | }); 60 | } 61 | if (Nova.config.ntr.resource_tables_sticky_actions_on_mobile) { 62 | var contents = document.querySelectorAll('.content'); 63 | contents.forEach(function(content) { 64 | content.classList.add("sticky-actions-on-mobile"); 65 | }); 66 | } 67 | 68 | // Hide "Update & Continue Editing" button 69 | if (Nova.config.ntr.hide_update_and_continue_editing_button) { 70 | var contents = document.querySelectorAll('.content'); 71 | contents.forEach(function(content) { 72 | content.classList.add("hide-update-and-continue-editing-button"); 73 | }); 74 | } 75 | if (Nova.config.ntr.hide_update_and_continue_editing_button_on_mobile) { 76 | var contents = document.querySelectorAll('.content'); 77 | contents.forEach(function(content) { 78 | content.classList.add("hide-update-and-continue-editing-button-on-mobile"); 79 | }); 80 | } 81 | 82 | // Fixed sidebar on desktop 83 | if (Nova.config.ntr.fixed_sidebar) { 84 | document.querySelector('body').classList.add("fixed-sidebar"); 85 | } 86 | } 87 | } 88 | 89 | document.addEventListener("DOMContentLoaded", load, false); 90 | -------------------------------------------------------------------------------- /src/ThemeServiceProvider.php: -------------------------------------------------------------------------------- 1 | config('nova-theme-responsive') 25 | ]); 26 | }); 27 | 28 | $this->publishes([ 29 | self::CONFIG_PATH => config_path('nova-theme-responsive.php'), 30 | ], 'config'); 31 | } 32 | 33 | /** 34 | * Register any application services. 35 | * 36 | * @return void 37 | */ 38 | public function register() 39 | { 40 | $this->mergeConfigFrom( 41 | self::CONFIG_PATH, 42 | 'nova-theme-responsive' 43 | ); 44 | } 45 | } 46 | --------------------------------------------------------------------------------