├── assets
├── src
│ ├── css
│ │ ├── widgets
│ │ │ ├── all.css
│ │ │ └── table.css
│ │ ├── base.css
│ │ ├── app.css
│ │ ├── components
│ │ │ ├── all.css
│ │ │ ├── counter.css
│ │ │ ├── froala.css
│ │ │ ├── badge.css
│ │ │ ├── nested-form.css
│ │ │ ├── menu.css
│ │ │ ├── button-group.css
│ │ │ ├── button.css
│ │ │ ├── form.css
│ │ │ └── fancy-layout.css
│ │ ├── custom.css
│ │ └── darkmode.css
│ └── js
│ │ ├── composables
│ │ └── state.js
│ │ ├── darkmode.js
│ │ ├── menu.js
│ │ ├── app.js
│ │ └── winter.sidepaneltab.js
├── images
│ └── background.jpg
└── dist
│ └── manifest.json
├── updates
└── version.yaml
├── skins
├── tailwindui
│ ├── layouts
│ │ ├── _flash-messages.php
│ │ ├── _context-sidenav.php
│ │ ├── _flyout-container.php
│ │ ├── _breakpoint-debugger.php
│ │ ├── partials
│ │ │ ├── notices
│ │ │ │ └── _impersonation.php
│ │ │ └── menu
│ │ │ │ ├── top
│ │ │ │ ├── _icon-classes.php
│ │ │ │ ├── _mobile-menu.php
│ │ │ │ └── _quick-actions.php
│ │ │ │ ├── _header-search.php
│ │ │ │ └── side
│ │ │ │ └── _item-contents.php
│ │ ├── _branding.php
│ │ ├── auth-simple.php
│ │ ├── auth-split.php
│ │ ├── _head_auth.php
│ │ ├── _head.php
│ │ ├── _menu-side.php
│ │ ├── default.php
│ │ └── _menu-top.php
│ └── views
│ │ └── backend
│ │ └── controllers
│ │ └── auth
│ │ ├── signin.php
│ │ ├── restore.php
│ │ ├── reset.php
│ │ ├── signin-split.php
│ │ └── signin-simple.php
└── TailwindUI.php
├── .gitignore
├── postcss.config.mjs
├── config
└── config.php
├── package.json
├── lang
├── fr
│ └── lang.php
└── en
│ └── lang.php
├── LICENSE
├── composer.json
├── models
├── preference
│ └── fields.yaml
└── brandsetting
│ └── fields.yaml
├── vite.config.mjs
├── tailwind.config.js
├── README.md
├── composer.lock
└── Plugin.php
/assets/src/css/widgets/all.css:
--------------------------------------------------------------------------------
1 | @import 'table.css';
2 |
--------------------------------------------------------------------------------
/updates/version.yaml:
--------------------------------------------------------------------------------
1 | 1.0.1: First version of TailwindUI
2 |
--------------------------------------------------------------------------------
/assets/src/css/base.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
--------------------------------------------------------------------------------
/assets/images/background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wintercms/wn-tailwindui-plugin/HEAD/assets/images/background.jpg
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/_flash-messages.php:
--------------------------------------------------------------------------------
1 |
= $this->makeLayoutPartial('flash_messages') ?>
2 |
--------------------------------------------------------------------------------
/assets/src/css/app.css:
--------------------------------------------------------------------------------
1 | @import 'base.css';
2 | @import 'components/all.css';
3 | @import 'widgets/all.css';
4 | @import 'custom.css';
5 | @import 'darkmode.css';
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | /vendor
3 |
4 | # Editor ignores
5 | nbproject
6 | .idea
7 | .vscode
8 | _ide_helper.php
9 |
10 | # laravel mix temp files
11 | /mix.webpack.js
12 |
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | 'postcss-import': {},
4 | 'tailwindcss/nesting': {},
5 | 'tailwindcss': {},
6 | 'autoprefixer': {},
7 | },
8 | };
9 |
--------------------------------------------------------------------------------
/skins/tailwindui/views/backend/controllers/auth/signin.php:
--------------------------------------------------------------------------------
1 | owner, $context->mainMenuCode);
4 |
5 | if ($contextSidenav) {
6 | echo $this->makePartial($contextSidenav);
7 | }
8 | ?>
9 |
--------------------------------------------------------------------------------
/assets/src/js/composables/state.js:
--------------------------------------------------------------------------------
1 | import { readonly, ref } from 'vue';
2 |
3 | export const useState = (initialState) => {
4 | const state = ref(initialState);
5 | const setState = (newState) => {
6 | state.value = newState;
7 | };
8 |
9 | return [readonly(state), setState];
10 | };
11 |
--------------------------------------------------------------------------------
/assets/dist/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "assets/src/css/app.css": {
3 | "file": "assets/app-Dy0DEgki.css",
4 | "src": "assets/src/css/app.css",
5 | "isEntry": true
6 | },
7 | "assets/src/js/app.js": {
8 | "file": "assets/app-Ca5XhrW-.js",
9 | "name": "app",
10 | "src": "assets/src/js/app.js",
11 | "isEntry": true
12 | }
13 | }
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/_flyout-container.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | data-control="flyout"
5 | data-flyout-width="400"
6 | data-flyout-toggle="#layout-sidenav"
7 |
8 | >
9 |
10 | = $flyoutContent ?>
11 |
12 |
--------------------------------------------------------------------------------
/assets/src/css/components/counter.css:
--------------------------------------------------------------------------------
1 | @layer components {
2 | .counter {
3 | @apply text-xs bg-red-500 rounded-full font-semibold text-white;
4 | position: absolute;
5 | top: 0;
6 | right: 0;
7 | padding: .25em .5em;
8 | text-align: center;
9 | }
10 | span + .counter {
11 | top: 50%;
12 | right: 1em;
13 | transform: translateY(-50%);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/skins/TailwindUI.php:
--------------------------------------------------------------------------------
1 | skinPath . '/layouts'
18 | ];
19 | }
20 | }
--------------------------------------------------------------------------------
/config/config.php:
--------------------------------------------------------------------------------
1 | env('TAILWIND_SHOW_BREAKPOINT_DEBUGGER', false),
16 |
17 | ];
18 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "winter-tailwindui",
3 | "private": true,
4 | "version": "1.0.1",
5 | "dependencies": {
6 | "@headlessui/vue": "~1.4.x",
7 | "@heroicons/vue": "~1.0.x",
8 | "vue": "^3.2.45"
9 | },
10 | "devDependencies": {
11 | "@tailwindcss/forms": "^0.5.3",
12 | "@tailwindcss/typography": "^0.5.9",
13 | "autoprefixer": "^10.4.13",
14 | "postcss": "^8.4.20",
15 | "postcss-import": "^15.1.0",
16 | "tailwindcss": "^3.2.4",
17 | "vue-loader": "^16.2.0",
18 | "@vitejs/plugin-vue": "^5.0.5"
19 | }
20 | }
--------------------------------------------------------------------------------
/assets/src/css/components/froala.css:
--------------------------------------------------------------------------------
1 | .fr-view {
2 | /* headings */
3 | h1 {
4 | @apply text-3xl;
5 | }
6 |
7 | h2 {
8 | @apply text-2xl;
9 | }
10 |
11 | h3 {
12 | @apply text-xl;
13 | }
14 |
15 | h4 {
16 | @apply text-base font-semibold;
17 | }
18 |
19 | /* lists */
20 | ul, ol {
21 | @apply space-y-1 list-inside;
22 | }
23 |
24 | ul {
25 | @apply list-disc;
26 | }
27 |
28 | ol {
29 | @apply list-decimal;
30 | }
31 |
32 | /* links */
33 | a {
34 | @apply text-blue-600 hover:text-blue-600 hover:underline;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/assets/src/js/darkmode.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Dark Mode / Theme Appearance switcher
3 | */
4 | window.updateColorScheme = function (scheme) {
5 | const docEl = document.documentElement;
6 | if (scheme !== undefined) {
7 | docEl.setAttribute('data-color-scheme', scheme);
8 | }
9 |
10 | const colorScheme = docEl.getAttribute('data-color-scheme') || 'light';
11 |
12 | if (
13 | colorScheme === 'dark' || (
14 | colorScheme === 'auto' && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
15 | )
16 | ) {
17 | docEl.classList.add('dark');
18 | } else {
19 | docEl.classList.remove('dark');
20 | }
21 | }
22 | updateColorScheme();
23 |
--------------------------------------------------------------------------------
/assets/src/css/components/badge.css:
--------------------------------------------------------------------------------
1 | @layer components {
2 | .badge {
3 | @apply inline-flex flex-row content-center bg-gray-100 text-gray-800 text-xs font-semibold mr-2 px-2.5 py-0.5 rounded dark:bg-gray-700 dark:text-gray-300;
4 |
5 | &.primary {
6 | @apply bg-blue-100 text-blue-800 dark:bg-blue-200 dark:text-blue-800;
7 | }
8 |
9 | &.success {
10 | @apply bg-green-100 text-green-800 dark:bg-green-200 dark:text-green-900;
11 | }
12 |
13 | &.warning {
14 | @apply bg-yellow-100 text-yellow-800 dark:bg-yellow-200 dark:text-yellow-900;
15 | }
16 |
17 | &.danger {
18 | @apply bg-red-100 text-red-800 dark:bg-red-200 dark:text-red-900;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/_breakpoint-debugger.php:
--------------------------------------------------------------------------------
1 |
2 | sm
3 | md
4 | lg
5 | xl
6 | 2xl
7 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/partials/notices/_impersonation.php:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/partials/menu/top/_icon-classes.php:
--------------------------------------------------------------------------------
1 | iconSvg): ?>
2 | svg-icon
3 |
4 | = $item->icon ?>
5 |
6 |
7 | inline-block mr-2
8 | iconSvg): ?>
9 | w-7.5 h-7.5
10 |
11 | icon-inline
12 |
13 |
14 |
15 | block mx-auto mb-1
16 | iconSvg): ?>
17 | w-7.5 h-7.5
18 |
19 | icon-tile h-7.5
20 |
21 |
22 |
23 | block mx-auto
24 | iconSvg): ?>
25 | w-7.5 h-7.5
26 |
27 | icon-only
28 |
29 |
30 |
--------------------------------------------------------------------------------
/lang/fr/lang.php:
--------------------------------------------------------------------------------
1 | [
5 | 'name' => 'Tailwind UI',
6 | 'description' => 'Skin basé sur TailwindUI pour le backend de Winter CMS.',
7 | ],
8 |
9 | 'branding' => [
10 | 'auth_layout' => [
11 | 'label' => "Disposition de l'authentification",
12 | 'simple' => 'Simple (centrée)',
13 | 'split' => 'Barre latérale gauche (fractionnée)',
14 | ],
15 | 'menu_location' => [
16 | 'label' => 'Emplacement du menu',
17 | 'top' => 'Haut',
18 | 'side' => 'Côté',
19 | ],
20 | 'menu_icons' => [
21 | 'label' => 'Emplacement des icônes',
22 | 'tile' => 'Au dessus',
23 | 'inline' => 'Sur le côte',
24 | 'hidden' => 'Cachés (texte seulement)',
25 | 'only' => 'Seuls (pas de texte)',
26 | ],
27 | ],
28 | ];
29 |
--------------------------------------------------------------------------------
/assets/src/css/components/nested-form.css:
--------------------------------------------------------------------------------
1 | @layer components {
2 | .nested-form > .form-widget > .layout-row > .control-tabs.primary-tabs {
3 | .title {
4 | &:before,
5 | &:after {
6 | transform: none !important;
7 | display: none !important;
8 | }
9 |
10 | > span {
11 | border: none !important;
12 | }
13 | }
14 |
15 | .nav-tabs > li {
16 | margin-right: -1.5px !important;
17 |
18 | &:first-child {
19 | padding-left: 0 !important;
20 | }
21 |
22 | > a {
23 | border-left: 1.5px solid !important;
24 | border-top: 1.5px solid !important;
25 | border-right: 1.5px solid !important;
26 | border-radius: 7px 7px 0 0 !important;
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/assets/src/js/menu.js:
--------------------------------------------------------------------------------
1 | document.addEventListener('DOMContentLoaded', function () {
2 |
3 | const fnmap = {
4 | toggle: 'toggle',
5 | show: 'add',
6 | hide: 'remove',
7 | }
8 |
9 | const collapseTriggers = Array.from(
10 | document.querySelectorAll('[data-toggle="collapse"]'),
11 | );
12 |
13 | const collapse = (elm, selector, cmd) => {
14 | elm.classList[fnmap[cmd]]('open');
15 | const targets = Array.from(document.querySelectorAll(selector));
16 | targets.forEach((target) => {
17 | target.classList[fnmap[cmd]]('show');
18 | });
19 | };
20 |
21 | document.addEventListener(
22 | 'click',
23 | (ev) => {
24 | const elm = ev.target;
25 |
26 | if (collapseTriggers.includes(elm)) {
27 | const selector = elm.getAttribute('data-target');
28 | collapse(elm, selector, 'toggle');
29 | }
30 | },
31 | false,
32 | );
33 | });
34 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/partials/menu/_header-search.php:
--------------------------------------------------------------------------------
1 |
6 |
22 |
--------------------------------------------------------------------------------
/assets/src/css/components/menu.css:
--------------------------------------------------------------------------------
1 | @layer components {
2 | .quick-link {
3 | @apply relative p-1 mr-2 rounded-full text-gray-400 hover:text-white placeholder:focus:outline-none focus:no-underline focus:text-white hover:no-underline;
4 |
5 | &-light {
6 | @apply text-gray-400 hover:text-gray-500 focus:text-gray-500 focus:outline-none focus:no-underline;
7 | }
8 | }
9 |
10 | .sidemenu {
11 | button[data-toggle="collapse"] {
12 | svg {
13 | @apply text-gray-200 ml-3 flex-shrink-0 h-5 w-5 transform group-hover:text-white transition ease-in-out duration-150 pointer-events-none;
14 | }
15 |
16 | &.open svg {
17 | @apply text-white rotate-90;
18 | }
19 | }
20 |
21 | li.active a {
22 | @apply bg-gray-700 text-white hover:text-white hover:bg-gray-600 focus:text-white;
23 | }
24 |
25 | li[data-menu-item] {
26 | svg {
27 | @apply pointer-events-none;
28 | }
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Winter CMS
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/assets/src/css/components/button-group.css:
--------------------------------------------------------------------------------
1 | @layer components {
2 | .btn-group {
3 |
4 | .btn {
5 | @apply
6 | border-solid
7 | border-t-0
8 | border-b-0;
9 |
10 | &.btn-default {
11 | @apply border-gray-200;
12 | }
13 |
14 | &.btn-primary {
15 | @apply border-primary;
16 | }
17 |
18 | &.btn-success {
19 | @apply border-green-500;
20 | }
21 |
22 | &.btn-danger {
23 | @apply border-red-500;
24 | }
25 |
26 | &.btn-warning {
27 | @apply border-yellow-400;
28 | }
29 |
30 | &.btn-info {
31 | @apply border-blue-400;
32 | }
33 |
34 | &.btn-outline {
35 | @apply border-gray-300;
36 | }
37 |
38 | &:first-child {
39 | @apply border-l-0 border-r-0;
40 | }
41 |
42 | &:last-child {
43 | @apply border-solid border-l-0 border-r-0;
44 | }
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "winter/wn-tailwindui-plugin",
3 | "type": "winter-plugin",
4 | "description": "Provides a TailwindUI-based skin for the Winter CMS backend.",
5 | "homepage": "https://github.com/wintercms/wn-tailwindui-plugin",
6 | "keywords": ["cms", "wintercms", "tailwind", "tailwindui", "skin"],
7 | "license": "MIT",
8 | "authors": [
9 | {
10 | "name": "Joseph Blythe",
11 | "homepage": "https://spatialmedia.io/"
12 | },
13 | {
14 | "name": "Luke Towers",
15 | "email": "wintercms@luketowers.ca"
16 | },
17 | {
18 | "name": "Winter CMS Maintainers",
19 | "homepage": "https://wintercms.com",
20 | "role": "Maintainer"
21 | }
22 | ],
23 | "support": {
24 | "issues": "https://github.com/wintercms/wn-tailwindui-plugin/issues",
25 | "discord": "https://discord.gg/D5MFSPH6Ux",
26 | "source": "https://github.com/wintercms/wn-tailwindui-plugin"
27 | },
28 | "require": {
29 | "php": ">=7.2",
30 | "composer/installers": "~1.11",
31 | "mexitek/phpcolors": "^1.0"
32 | },
33 | "config": {
34 | "allow-plugins": {
35 | "composer/installers": true
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/lang/en/lang.php:
--------------------------------------------------------------------------------
1 | [
5 | 'name' => 'Tailwind UI',
6 | 'description' => 'Provides a TailwindUI-based skin for the Winter CMS backend.',
7 | ],
8 |
9 | 'branding' => [
10 | 'background_image' => [
11 | 'label' => 'Background Image',
12 | 'comment' => 'The background image used on the Split Layout for the login screen.',
13 | ],
14 | 'auth_layout' => [
15 | 'label' => 'Authentication Layout',
16 | 'simple' => 'Simple (Centred)',
17 | 'split' => 'Left sidebar (Split)',
18 | ],
19 | 'menu_location' => [
20 | 'label' => 'Menu Location',
21 | 'top' => 'Top',
22 | 'side' => 'Side',
23 | ],
24 | 'menu_icons' => [
25 | 'label' => 'Icon Location',
26 | 'tile' => 'Above',
27 | 'inline' => 'Beside',
28 | 'hidden' => 'Hidden (text only)',
29 | 'only' => 'Only (no text)',
30 | ],
31 | ],
32 |
33 | 'permissions' => [
34 | 'manage_own_appearance' => [
35 | 'dark_mode' => 'Change own dark mode preference',
36 | 'menu_location' => 'Change own menu location',
37 | 'item_location' => 'Change own menu item icon location',
38 | ],
39 | ],
40 |
41 | 'preferences' => [
42 | 'appearance' => 'Appearance',
43 | 'dark_mode' => [
44 | 'auto' => 'Follow system preferences',
45 | 'light' => 'Light theme',
46 | 'dark' => 'Dark theme',
47 | ],
48 | ],
49 | ];
50 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/_branding.php:
--------------------------------------------------------------------------------
1 | addMonths(1), function () use ($colorString) {
11 | $color = new Color($colorString);
12 | $luminance = $color->getHsl()['L'] * 100;
13 | return [
14 | 'dark' => $color->darken(($luminance / 4)),
15 | 'darker' => $color->darken(($luminance / 4) * 2),
16 | 'darkest' => $color->darken(($luminance / 4) * 3),
17 | 'light' => $color->lighten((100 - $luminance) / 4),
18 | 'lighter' => $color->lighten((100 - $luminance) / 4 * 2),
19 | 'lightest' => $color->lighten((100 - $luminance) / 4 * 3),
20 | ];
21 | });
22 | };
23 |
24 | $colorVariations = [
25 | 'primary' => [
26 | 'value' => $primary,
27 | 'variations' => $getVariations($primary),
28 | ],
29 | 'secondary' => [
30 | 'value' => $secondary,
31 | 'variations' => $getVariations($secondary),
32 | ],
33 | ];
34 | ?>
35 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/auth-simple.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | = $this->makeLayoutPartial('head_auth') ?>
5 | = $this->fireViewEvent('backend.layout.extendHead', ['layout' => 'auth']) ?>
6 |
7 |
8 |
9 |
10 |
11 |
= e(Backend\Models\BrandSetting::get('app_tagline')); ?>
12 |
13 |
14 |
15 |
16 | = Block::placeholder('body') ?>
17 |
18 |
19 |
20 |
21 |
22 |
27 | = $this->makeLayoutPartial('flash_messages') ?>
28 |
29 |
30 |
--------------------------------------------------------------------------------
/models/preference/fields.yaml:
--------------------------------------------------------------------------------
1 | tabs:
2 | fields:
3 | dark_mode:
4 | label: 'winter.tailwindui::lang.preferences.appearance'
5 | type: 'dropdown'
6 | tab: 'winter.tailwindui::lang.preferences.appearance'
7 | default: light
8 | permissions: winter.tailwindui.manage_own_appearance.dark_mode
9 | options:
10 | auto: ['winter.tailwindui::lang.preferences.dark_mode.auto', 'icon-computer']
11 | light: ['winter.tailwindui::lang.preferences.dark_mode.light', 'icon-sun']
12 | dark: ['winter.tailwindui::lang.preferences.dark_mode.dark', 'icon-moon']
13 | menu_location:
14 | label: winter.tailwindui::lang.branding.menu_location.label
15 | tab: 'winter.tailwindui::lang.preferences.appearance'
16 | type: balloon-selector
17 | span: left
18 | permissions: winter.tailwindui.manage_own_appearance.menu_location
19 | options:
20 | top: winter.tailwindui::lang.branding.menu_location.top
21 | side: winter.tailwindui::lang.branding.menu_location.side
22 | icon_location:
23 | label: winter.tailwindui::lang.branding.menu_icons.label
24 | tab: 'winter.tailwindui::lang.preferences.appearance'
25 | type: balloon-selector
26 | span: left
27 | permissions: winter.tailwindui.manage_own_appearance.item_location
28 | options:
29 | tile: winter.tailwindui::lang.branding.menu_icons.tile
30 | inline: winter.tailwindui::lang.branding.menu_icons.inline
31 | hidden: winter.tailwindui::lang.branding.menu_icons.hidden
32 | only: winter.tailwindui::lang.branding.menu_icons.only
33 |
--------------------------------------------------------------------------------
/skins/tailwindui/views/backend/controllers/auth/restore.php:
--------------------------------------------------------------------------------
1 | = Form::open(['class' => 'space-y-6']) ?>
2 |
3 |
4 |
5 |
6 |
7 | = e(trans('backend::lang.account.enter_login')) ?>
8 |
9 |
10 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | = e(trans('backend::lang.account.restore')) ?>
32 |
33 |
34 |
35 |
40 |
41 |
42 | = Form::close() ?>
43 |
44 | = $this->fireViewEvent('backend.auth.extendRestoreView') ?>
45 |
--------------------------------------------------------------------------------
/skins/tailwindui/views/backend/controllers/auth/reset.php:
--------------------------------------------------------------------------------
1 | = Form::open(['class' => 'space-y-6']) ?>
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | = e(trans('backend::lang.account.enter_new_password')) ?>
10 |
11 |
12 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | = e(trans('backend::lang.account.reset')) ?>
34 |
35 |
36 |
37 |
42 |
43 |
44 | = Form::close() ?>
45 |
--------------------------------------------------------------------------------
/vite.config.mjs:
--------------------------------------------------------------------------------
1 | import vue from '@vitejs/plugin-vue';
2 | import laravel from 'laravel-vite-plugin';
3 | import { defineConfig } from 'vite';
4 |
5 | export default defineConfig({
6 | build: {
7 | outDir: 'assets/dist',
8 | terserOptions: {
9 | format: {
10 | comments: false
11 | }
12 | }
13 | },
14 | resolve: {
15 | alias:{
16 | vue: 'vue/dist/vue.esm-bundler.js'
17 | }
18 | },
19 | plugins: [
20 | laravel({
21 | publicDirectory: 'assets/dist',
22 | input: [
23 | 'assets/src/css/app.css',
24 | 'assets/src/js/app.js',
25 | ],
26 | refresh: {
27 | paths: [
28 | './**/*.htm',
29 | './**/*.block',
30 | 'assets/src/**/*.css',
31 | 'assets/src/**/*.js',
32 | ]
33 | },
34 | }),
35 | vue({
36 | template: {
37 | transformAssetUrls: {
38 | // The Vue plugin will re-write asset URLs, when referenced
39 | // in Single File Components, to point to the Laravel web
40 | // server. Setting this to `null` allows the Laravel plugin
41 | // to instead re-write asset URLs to point to the Vite
42 | // server instead.
43 | base: null,
44 |
45 | // The Vue plugin will parse absolute URLs and treat them
46 | // as absolute paths to files on disk. Setting this to
47 | // `false` will leave absolute URLs un-touched so they can
48 | // reference assets in the public directory as expected.
49 | includeAbsolute: false,
50 | },
51 | },
52 | }),
53 | ],
54 | });
55 |
--------------------------------------------------------------------------------
/models/brandsetting/fields.yaml:
--------------------------------------------------------------------------------
1 | tabs:
2 | fields:
3 | auth_layout:
4 | label: winter.tailwindui::lang.branding.auth_layout.label
5 | tab: backend::lang.branding.navigation
6 | type: balloon-selector
7 | span: left
8 | default: split
9 | options:
10 | simple: winter.tailwindui::lang.branding.auth_layout.simple
11 | split: winter.tailwindui::lang.branding.auth_layout.split
12 | background_image:
13 | label: winter.tailwindui::lang.branding.background_image.label
14 | commentAbove: winter.tailwindui::lang.branding.background_image.comment
15 | tab: backend::lang.branding.navigation
16 | span: right
17 | type: fileupload
18 | mode: image
19 | imageHeight: 200
20 | trigger:
21 | action: show
22 | field: auth_layout
23 | condition: value[split]
24 | menu_location:
25 | label: winter.tailwindui::lang.branding.menu_location.label
26 | tab: backend::lang.branding.navigation
27 | type: balloon-selector
28 | span: left
29 | default: side
30 | options:
31 | top: winter.tailwindui::lang.branding.menu_location.top
32 | side: winter.tailwindui::lang.branding.menu_location.side
33 | icon_location:
34 | label: winter.tailwindui::lang.branding.menu_icons.label
35 | tab: backend::lang.branding.navigation
36 | type: balloon-selector
37 | span: left
38 | default: inline
39 | options:
40 | tile: winter.tailwindui::lang.branding.menu_icons.tile
41 | inline: winter.tailwindui::lang.branding.menu_icons.inline
42 | hidden: winter.tailwindui::lang.branding.menu_icons.hidden
43 | only: winter.tailwindui::lang.branding.menu_icons.only
44 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/auth-split.php:
--------------------------------------------------------------------------------
1 |
2 | background_image)) {
7 | $backgroundImage = $brandSettings->background_image->path;
8 | }
9 | ?>
10 |
11 |
12 | = $this->makeLayoutPartial('head_auth') ?>
13 | = $this->fireViewEvent('backend.layout.extendHead', ['layout' => 'auth']) ?>
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | = Block::placeholder('body') ?>
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
44 | = $this->makeLayoutPartial('flash_messages') ?>
45 |
46 |
47 |
--------------------------------------------------------------------------------
/assets/src/css/components/button.css:
--------------------------------------------------------------------------------
1 | @layer components {
2 | .btn {
3 | @apply text-sm text-center font-medium shadow-none rounded-md px-5 py-2.5 disabled:opacity-50 disabled:cursor-not-allowed;
4 |
5 | &.btn-default:not(.ml-btn),
6 | &.btn-secondary {
7 | @apply
8 | text-gray-700
9 | bg-gray-200
10 | hover:bg-gray-300
11 | focus:bg-gray-300
12 | focus:ring-gray-200
13 | active:bg-gray-200
14 | dark:text-black
15 | dark:bg-gray-400
16 | dark:hover:bg-gray-500
17 | dark:focus:ring-gray-500;
18 | }
19 |
20 | &.btn-default.ml-btn {
21 | @apply hover:text-gray-900 mr-[8px] w-[initial];
22 | }
23 |
24 | &.btn-primary {
25 | @apply text-white bg-primary hover:bg-primary-light focus:bg-primary-light dark:bg-primary dark:hover:bg-primary-dark;
26 | }
27 |
28 | &.btn-success {
29 | @apply text-white bg-green-500 hover:bg-green-700 dark:bg-green-600 dark:hover:bg-green-700;
30 | }
31 |
32 | &.btn-danger {
33 | @apply text-white bg-red-500 hover:bg-red-700 dark:text-white dark:bg-red-600 dark:hover:bg-red-700;
34 | }
35 |
36 | &.btn-warning {
37 | @apply text-white bg-yellow-400 hover:bg-yellow-500;
38 | }
39 |
40 | &.btn-info {
41 | @apply text-white bg-blue-400 hover:bg-blue-500 dark:bg-blue-600 dark:hover:bg-blue-700;
42 | }
43 |
44 | &.btn-outline {
45 | @apply
46 | text-gray-700
47 | bg-transparent
48 | hover:bg-gray-200
49 | focus:bg-gray-200
50 | active:bg-gray-300
51 | dark:bg-gray-400
52 | dark:hover:bg-gray-500;
53 | }
54 |
55 | &.btn-link {
56 | @apply dark:text-primary-light hover:text-primary-lighter;
57 | }
58 |
59 | &.btn-xs {
60 | @apply text-xs px-1 py-0.5;
61 | }
62 |
63 | &.btn-sm {
64 | @apply text-xs px-2 py-1.5;
65 | }
66 |
67 | &.btn-md {
68 | @apply text-sm px-3 py-2.5;
69 | }
70 |
71 | &.btn-lg {
72 | @apply text-base px-4 py-3.5;
73 | }
74 |
75 | &.btn-xl {
76 | @apply text-lg px-5 py-4;
77 | }
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | const defaultTheme = require('tailwindcss/defaultTheme')
2 |
3 | module.exports = {
4 | content: [
5 | './skins/tailwindui/**/*.php',
6 | './assets/src/js/**/*.{js,vue}',
7 | ],
8 | theme: {
9 | extend: {
10 | colors: {
11 | primary: 'var(--primary)',
12 | 'primary-dark': 'var(--primary-dark)',
13 | 'primary-darker': 'var(--primary-darker)',
14 | 'primary-darkest': 'var(--primary-darkest)',
15 | 'primary-light': 'var(--primary-light)',
16 | 'primary-lighter': 'var(--primary-lighter)',
17 | 'primary-lightest': 'var(--primary-lightest)',
18 | secondary: 'var(--secondary)',
19 | 'secondary-dark': 'var(--secondary-dark)',
20 | 'secondary-darker': 'var(--secondary-darker)',
21 | 'secondary-darkest': 'var(--secondary-darkest)',
22 | 'secondary-light': 'var(--secondary-light)',
23 | 'secondary-lighter': 'var(--secondary-lighter)',
24 | 'secondary-lightest': 'var(--secondary-lightest)',
25 | },
26 | boxShadow: {
27 | 'bottom': '0px 0px 3px rgba(0, 0, 0, 0.25)',
28 | },
29 | fontFamily: {
30 | sans: ['Inter var'],
31 | },
32 | fontSize: {
33 | 'xxs': '.725rem',
34 | },
35 | gridTemplateColumns: {
36 | 'layout-inline': '180px 1fr',
37 | 'layout-only': '71px 1fr',
38 | 'layout-hidden': '148px 1fr',
39 | 'layout-tile': '124px 1fr',
40 | },
41 | width: {
42 | '7.5': '1.875rem', // 30px
43 | },
44 | height: {
45 | '7.5': '1.875rem', // 30px
46 | },
47 | maxWidth: {
48 | '1/2': '50%',
49 | '1/3': '33%',
50 | '1/4': '25%',
51 | 'vw': '100vw',
52 | },
53 | minWidth: {
54 | '6': '1.5rem',
55 | '12': '3rem',
56 | '16': '4rem',
57 | },
58 | transitionDuration: {
59 | '0': '0ms',
60 | '2000': '2000ms',
61 | },
62 | zIndex: {
63 | 'topmenu': '99',
64 | 'sidemenu': '100',
65 | },
66 | },
67 | },
68 | plugins: [
69 | require('@tailwindcss/forms'),
70 | require('@tailwindcss/typography'),
71 | ],
72 | darkMode: 'class',
73 | }
74 |
--------------------------------------------------------------------------------
/assets/src/css/components/form.css:
--------------------------------------------------------------------------------
1 | @layer base {
2 | [type='text'],
3 | [type='email'],
4 | [type='url'],
5 | [type='password'],
6 | [type='number'],
7 | [type='date'],
8 | [type='datetime-local'],
9 | [type='month'],
10 | [type='search'],
11 | [type='tel'],
12 | [type='time'],
13 | [type='week'],
14 | [multiple],
15 | textarea,
16 | select {
17 | @apply block
18 | w-full
19 | border
20 | rounded-md
21 | border-gray-300
22 | text-gray-900
23 | bg-gray-50
24 | focus:outline-none
25 | focus:ring-primary
26 | focus:border-primary
27 | focus:z-[9]
28 | disabled:opacity-50
29 | disabled:cursor-not-allowed
30 | dark:bg-gray-700
31 | dark:border-gray-600
32 | dark:placeholder-gray-400
33 | dark:text-white
34 | dark:focus:ring-primary
35 | dark:focus:border-primary;
36 | }
37 |
38 | [type='text'],
39 | [type='email'],
40 | [type='url'],
41 | [type='password'],
42 | [type='number'],
43 | [type='date'],
44 | [type='datetime-local'],
45 | [type='month'],
46 | [type='search'],
47 | [type='tel'],
48 | [type='time'],
49 | [type='week'],
50 | [multiple],
51 | textarea {
52 | &.xs {
53 | @apply text-xs px-3 py-2;
54 | }
55 |
56 | &.sm {
57 | @apply text-sm px-3 py-2;
58 | }
59 |
60 | &.md {
61 | @apply text-base px-5 py-2.5;
62 | }
63 |
64 | &.lg {
65 | @apply text-lg px-5 py-3;
66 | }
67 |
68 | &.xl {
69 | @apply text-xl px-6 py-3.5;
70 | }
71 | }
72 |
73 | select {
74 | &.xs {
75 | @apply text-xs;
76 | }
77 |
78 | &.sm {
79 | @apply text-sm;
80 | }
81 |
82 | &.md {
83 | @apply text-base;
84 | }
85 |
86 | &.lg {
87 | @apply text-lg;
88 | }
89 |
90 | &.xl {
91 | @apply text-xl;
92 | }
93 | }
94 |
95 | [type='checkbox'],
96 | [type='radio'] {
97 | @apply text-primary
98 | focus:ring-primary
99 | focus:border-primary
100 | disabled:opacity-50
101 | disabled:cursor-not-allowed
102 | dark:bg-gray-700
103 | dark:border-gray-600
104 | dark:placeholder-gray-400
105 | dark:text-primary
106 | dark:focus:ring-primary
107 | dark:focus:border-primary;
108 | }
109 |
110 | label {
111 | @apply text-sm font-medium text-gray-900 block mb-2 dark:text-gray-300 cursor-pointer;
112 | }
113 | }
114 |
115 | .custom-switch input {
116 | opacity: 0 !important;
117 | }
118 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/_head_auth.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | = e(trans('backend::lang.auth.title')) ?>
9 |
10 | addCss($style, [
20 | 'build' => 'core',
21 | 'order' => 1,
22 | ]);
23 | }
24 | $scripts = [
25 | Backend::skinAsset('assets/js/vendor/jquery.min.js'),
26 | Backend::skinAsset('assets/js/vendor/jquery-migrate.min.js'),
27 | Url::asset('modules/system/assets/js/framework.js'),
28 | Url::asset('modules/system/assets/js/framework.extras.js'),
29 | Url::asset('modules/system/assets/ui/storm-min.js'),
30 | Backend::skinAsset('assets/js/winter-min.js'),
31 | Url::asset('modules/backend/assets/js/auth/auth.js'),
32 | Url::asset('modules/system/assets/js/lang/lang.'.App::getLocale().'.js'),
33 | ];
34 | foreach ($scripts as $script) {
35 | $this->addJs($script, [
36 | 'build' => 'core',
37 | 'order' => 1,
38 | ]);
39 | }
40 | ?>
41 |
42 |
43 |
59 |
60 |
61 |
62 |
63 |
64 | addCss('/modules/system/assets/css/framework.extras.css');
67 | ?>
68 |
69 | = $this->makeAssets() ?>
70 | = Block::placeholder('head') ?>
71 | = $this->makeLayoutPartial('branding') ?>
72 | = $this->makeLayoutPartial('custom_styles') ?>
73 |
--------------------------------------------------------------------------------
/skins/tailwindui/views/backend/controllers/auth/signin-split.php:
--------------------------------------------------------------------------------
1 |
2 | = Form::open(['class' => 'space-y-6']) ?>
3 |
4 |
5 |
6 |
7 |
8 | = e(trans('backend::lang.user.login')) ?>
9 |
10 |
11 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | = e(trans('backend::lang.user.password')) ?>
31 |
32 |
33 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
60 |
61 |
62 | = e(trans('backend::lang.account.remember_me')) ?>
63 |
64 |
65 |
66 |
67 |
68 |
73 |
74 |
75 |
76 |
77 |
78 | = e(trans('backend::lang.account.login')) ?>
79 |
80 |
81 | = Form::close() ?>
82 |
83 | fireViewEvent('backend.auth.extendSigninView') ?>
84 |
--------------------------------------------------------------------------------
/assets/src/js/app.js:
--------------------------------------------------------------------------------
1 | import { createApp, onMounted } from 'vue';
2 | import './darkmode';
3 | import './menu';
4 | import './winter.sidepaneltab';
5 |
6 | import {
7 | Disclosure,
8 | DisclosureButton,
9 | DisclosurePanel,
10 | Menu,
11 | MenuButton,
12 | MenuItem,
13 | MenuItems
14 | } from '@headlessui/vue';
15 |
16 | import {
17 | BellIcon,
18 | ChevronDownIcon, MenuIcon, PlusSmIcon, SearchIcon,
19 | XIcon
20 | } from '@heroicons/vue/outline';
21 |
22 | // TODO: for now we are mounting multiple vue apps as plugins can inject
83 |
84 |
85 | = $this->makeAssets() ?>
86 | = Block::placeholder('head') ?>
87 | = $this->makeLayoutPartial('branding') ?>
88 | = $this->makeLayoutPartial('custom_styles') ?>
89 |
--------------------------------------------------------------------------------
/skins/tailwindui/views/backend/controllers/auth/signin-simple.php:
--------------------------------------------------------------------------------
1 |
2 | = Form::open(['class' => 'space-y-6']) ?>
3 |
4 |
5 |
6 |
7 |
8 |
= e(trans('backend::lang.user.login')) ?>
9 |
10 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
= e(trans('backend::lang.user.password')) ?>
32 |
33 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
65 | = e(trans('backend::lang.account.remember_me')) ?>
66 |
67 |
68 |
69 |
70 |
71 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 | = e(trans('backend::lang.account.login')) ?>
87 |
88 |
89 | = Form::close() ?>
90 |
91 | fireViewEvent('backend.auth.extendSigninView') ?>
92 |
--------------------------------------------------------------------------------
/assets/src/css/components/fancy-layout.css:
--------------------------------------------------------------------------------
1 | @layer components {
2 |
3 | .layout.fancy-layout :not(.nested-form) > .form-widget > .layout-row {
4 |
5 | /* form fields */
6 | > .form-tabless-fields {
7 | label {
8 | @apply normal-case text-white text-sm;
9 | }
10 |
11 | input[type=text] {
12 | @apply
13 | bg-white
14 | bg-opacity-10
15 | text-lg
16 | font-light
17 | px-2
18 | py-1.5
19 | mt-1
20 | focus:bg-opacity-20
21 | !important;
22 | }
23 |
24 | &[disabled="disabled"] {
25 | @apply bg-white bg-opacity-20 cursor-not-allowed;
26 | }
27 | }
28 |
29 | /* form actions */
30 | .form-buttons {
31 | @apply flex justify-start items-center p-0 my-2;
32 |
33 | span.btn-text {
34 | @apply
35 | flex
36 | items-center
37 | text-white
38 | text-sm
39 | px-0
40 | py-1.5 !important;
41 |
42 | a {
43 | @apply text-white hover:no-underline ml-2 !important;
44 | }
45 | }
46 |
47 | .btn {
48 | &:not(:last-child) {
49 | @apply mr-2;
50 | }
51 |
52 | &.btn-default {
53 | @apply
54 | text-white
55 | opacity-100
56 | rounded-md
57 | px-5
58 | py-1.5
59 | mt-0
60 | hover:opacity-80;
61 |
62 | &.empty {
63 | @apply bg-transparent;
64 | }
65 |
66 | &[class*="oc-icon-"] {
67 |
68 | }
69 | }
70 |
71 | &.btn-primary {
72 | @apply flex items-center;
73 |
74 | @apply
75 | text-white
76 | opacity-100
77 | bg-transparent
78 | rounded-md
79 | border
80 | border-solid
81 | border-transparent
82 | px-4
83 | py-1.5
84 | mt-0
85 | hover:border-white;
86 | }
87 |
88 | &.empty {
89 | @apply mt-0;
90 | }
91 | }
92 |
93 | /* right aligned buttons */
94 | &-right {
95 | @apply flex flex-grow items-center justify-end;
96 |
97 | .btn {
98 | &.btn-primary {
99 | @apply
100 | text-primary
101 | bg-white
102 | rounded-md
103 | px-4
104 | py-1.5
105 | opacity-100
106 | !important;
107 | }
108 | }
109 | }
110 | }
111 |
112 | /* secondary tabs */
113 | > .control-tabs.secondary-tabs {
114 |
115 | > div > ul.nav-tabs {
116 | @apply flex items-center bg-secondary;
117 |
118 | > li {
119 | @apply flex items-center;
120 |
121 | > a {
122 | @apply flex items-center text-white px-4 py-2.5;
123 |
124 | > .title [class*="icon-"] {
125 | @apply mr-1;
126 | }
127 | }
128 |
129 | &.active > a {
130 | @apply bg-white text-secondary;
131 | }
132 | }
133 | }
134 |
135 | /* override for winter.css */
136 | &.secondary-content-tabs > div > ul.nav-tabs > li {
137 | @apply ml-0;
138 | }
139 | }
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/_menu-side.php:
--------------------------------------------------------------------------------
1 | listItems('mysettings');
4 | $appName = e(Backend\Models\BrandSetting::get('app_name'));
5 |
6 | if (in_array($iconLocation, ['only', 'tile'])) {
7 | $itemMode = 'tile';
8 | $logoImage = Backend\Models\BrandSetting::getFavicon();
9 | } else {
10 | $itemMode = 'inline';
11 | $logoImage = Backend\Models\BrandSetting::getLogo();
12 | }
13 | ?>
14 |
99 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/default.php:
--------------------------------------------------------------------------------
1 |
2 | get('dark_mode', 'light'));
4 | ?>
5 |
6 |
7 | = $this->makeLayoutPartial('head') ?>
8 | = $this->fireViewEvent('backend.layout.extendHead', ['layout' => 'default']) ?>
9 |
17 |
18 |
19 |
24 |
25 | = $this->makeLayoutPartial('partials/notices/impersonation') ?>
26 |
27 |
88 |
89 |
90 | = $this->makeLayoutPartial('flash-messages') ?>
91 |
92 |
93 | = $this->makeLayoutPartial('breakpoint-debugger') ?>
94 |
95 |
96 | = \System\Classes\Asset\Vite::tags(['assets/src/js/app.js'], 'winter.tailwindui') ?>
97 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/assets/src/css/custom.css:
--------------------------------------------------------------------------------
1 | /* overrides for storm */
2 | html {
3 | font-size: 100%;
4 | }
5 |
6 | @media (min-width: 640px) {
7 | .sm\:block {
8 | display: block !important;
9 | visibility: visible !important;
10 | }
11 | }
12 |
13 | @media (min-width: 640px) {
14 | .sm\:flex {
15 | display: flex !important;
16 | visibility: visible !important;
17 | }
18 | }
19 |
20 | @media (min-width: 768px) {
21 | .md\:block {
22 | display: block !important;
23 | visibility: visible !important;
24 | }
25 | }
26 |
27 | @media (min-width: 768px) {
28 | .md\:flex {
29 | display: flex !important;
30 | visibility: visible !important;
31 | }
32 | }
33 |
34 | @media (min-width: 768px) {
35 | .md\:table-cell {
36 | display: table-cell !important;
37 | visibility: visible !important;
38 | }
39 | }
40 |
41 | .icon-tile,
42 | .icon-only,
43 | .icon-inline {
44 | @apply w-full;
45 | &[class^='icon-']:before {
46 | @apply block mx-auto text-center;
47 | font-size: 1.5rem;
48 | }
49 | }
50 |
51 | a.bg-primary:hover {
52 | @apply bg-primary-dark;
53 | }
54 |
55 | div[id^='headlessui-menu-items-'] {
56 | /* all menus have z-index of 50 */
57 | z-index: 999 !important;
58 |
59 | a:hover {
60 | @apply no-underline; /* all menu item links have no text-decoration: underline; */
61 | }
62 | }
63 |
64 | /* widgets */
65 | .widget-welcome div.welcome-logo {
66 | @apply bg-gray-300 w-[200px] p-4 float-left rounded-md;
67 | }
68 |
69 | .btn:active {
70 | @apply shadow-none;
71 | }
72 |
73 | .btn-group.open .dropdown-toggle {
74 | @apply shadow-none;
75 | }
76 |
77 | .open .dropdown-toggle {
78 | &.btn-default,
79 | &.btn-secondary {
80 | @apply text-gray-700 bg-gray-300 border-none;
81 | }
82 | }
83 |
84 | /* winter.css overrides */
85 | .layout-sidenav-container {
86 | width: 120px;
87 |
88 | &-inline {
89 | @apply w-[250px] max-w-[250px];
90 | }
91 |
92 | &-tile {
93 | @apply w-[120px] max-w-[120px];
94 | }
95 | }
96 |
97 | .layout > .layout-row.h-auto {
98 | height: auto !important;
99 | }
100 |
101 | /* collapse styles */
102 | .collapsible {
103 | display: block;
104 | max-height: 0px;
105 | overflow: hidden;
106 | transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
107 |
108 | &.show {
109 | max-height: 99em;
110 | transition: max-height 0.5s ease-in-out;
111 | }
112 | }
113 |
114 | /* mediamanager */
115 | div[data-control='media-manager-crop-tool'] {
116 | img {
117 | max-width: initial;
118 | }
119 | }
120 |
121 | .control-toolbar {
122 | label {
123 | display: inline-block;
124 | }
125 | }
126 |
127 | .toolbar-widget {
128 | .clear-input-text {
129 | background-color: white;
130 | }
131 | }
132 |
133 | /* layout styles */
134 |
135 | .default-layout {
136 |
137 | @apply grid w-full h-screen;
138 |
139 | @media screen {
140 |
141 | &-top {
142 | @apply grid-cols-1;
143 |
144 | .layout-content > .layout {
145 | height: calc(100vh - 4rem);
146 | @apply max-w-full;
147 | }
148 | }
149 |
150 | &-side {
151 |
152 | .layout-topmenu + .layout {
153 | height: calc(100vh - 4rem);
154 | }
155 |
156 | &-inline {
157 | @apply md:grid-cols-layout-inline print:grid-cols-1;
158 |
159 | #layout-sidenav-2 {
160 | width: 180px;
161 | }
162 | }
163 |
164 | &-only {
165 | @apply md:grid-cols-layout-only;
166 | }
167 |
168 | &-hidden {
169 | @apply md:grid-cols-layout-hidden;
170 | }
171 |
172 | &-tile {
173 | @apply md:grid-cols-layout-tile;
174 | }
175 | }
176 | }
177 | }
178 |
179 | /* Hide buttons when loading indicator is showing. @see CA-1820. */
180 | .loading-indicator ~ .btn,
181 | .loading-indicator ~ .btn-text {
182 | @apply hidden;
183 | }
184 |
185 | /* fixes froala control checkbox label alignment */
186 | .fr-checkbox-line > label {
187 | @apply inline-block;
188 | }
189 |
190 | /* fixes input group form control addons to be inline with input */
191 | .input-group {
192 | .form-control + .input-group-addon {
193 | @apply px-5 py-1.5;
194 | }
195 | }
196 |
197 | /* Froala richtext editor */
198 | .field-richeditor {
199 | .fr-toolbar .fr-command.fr-btn {
200 | &.fr-active {
201 | @apply font-semibold text-primary;
202 | }
203 | }
204 |
205 | .fr-view {
206 | @apply prose max-w-none;
207 | }
208 | }
209 |
210 | .field-markdowneditor {
211 | .editor-preview {
212 | @apply prose max-w-none;
213 | }
214 | }
215 |
216 | /* Fix for winter dropdowns not being clickable */
217 | .dropdown-overlay {
218 | pointer-events: none !important;
219 | }
220 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/partials/menu/top/_mobile-menu.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
10 |
11 | = $this->makeLayoutPartial('partials/menu/header-search'); ?>
12 |
13 |
14 |
15 |
16 |
17 | sideMenu); ?>
18 |
26 |
33 | aria-current="page"
34 |
35 | >
36 |
37 | iconSvg): ?>
38 |
43 |
44 |
45 |
46 |
47 | = e(trans($item->label)) ?>
48 |
49 |
50 |
51 |
58 |
63 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
81 |
82 | sideMenu as $child):
84 | $sideMenuIsActive = BackendMenu::isSideMenuItemActive($child);
85 | $iconDefaultClass = "$child->icon mr-3 h-4 w-4";
86 | $iconClass = $sideMenuIsActive ? 'text-white group-hover:text-white' : 'text-gray-200 group-hover:text-white group-hover:bg-transparent';
87 | ?>
88 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Tailwind UI Backend Skin
2 |
3 | 
4 |
5 | [](https://github.com/wintercms/wn-tailwindui-plugin/blob/main/LICENSE)
6 |
7 | [Tailwind UI](https://tailwindui.com/) is a Tailwind CSS component library designed by the authors of [Tailwind CSS](https://tailwindcss.com/). This is a [Winter CMS](https://wintercms.com) plugin that provides a custom, TailwindUI-based skin for the backend.
8 |
9 | Supports:
10 | - Multiple authentication page layouts (Simple, Left Sidebar)
11 | - Backend Menu location customization (Top, Side)
12 | - Backend Menu Icon location customization (Above, Beside, Hidden (Text Only), Only (No Text))
13 | - Background image for login page
14 | - Dark mode
15 |
16 | ## Installation
17 |
18 | This plugin is available for installation via [Composer](http://getcomposer.org/).
19 |
20 | ```bash
21 | composer require winter/wn-tailwindui-plugin
22 | ```
23 |
24 | After installing the plugin you will need to run the migrations and (if you are using a [public folder](https://wintercms.com/docs/develop/docs/setup/configuration#using-a-public-folder)) [republish your public directory](https://wintercms.com/docs/develop/docs/console/setup-maintenance#mirror-public-files).
25 |
26 | ```bash
27 | php artisan migrate
28 | ```
29 |
30 | ## Screenshots
31 |
32 | | Before | After |
33 | |---|---|
34 | |  |  |
35 |
36 | ### Dark Mode!
37 |
38 | Dark mode and user preferences are also supported.
39 |
40 | 
41 |
42 | 
43 |
44 | ## Getting started
45 |
46 | Use composer to install the plugin:
47 |
48 | ```bash
49 | composer require winter/wn-tailwindui-plugin
50 | ```
51 |
52 | Then, run the migrations to ensure the plugin is enabled:
53 |
54 | ```bash
55 | php artisan migrate
56 | ```
57 |
58 | ## Configuration
59 |
60 | Configuration for this plugin is handled through a [configuration file](https://wintercms.com/docs/plugin/settings#file-configuration). In order to modify the configuration values and get started you can either add the values to your `.env` environment file or copy the `plugins/winter/tailwindui/config/config.php` file to `config/winter/tailwindui/config.php` and make your changes there.
61 |
62 | Environment File Supported Values:
63 | - `TAILWIND_SHOW_BREAKPOINT_DEBUGGER=false`
64 |
65 | ## Using Tailwind in other Plugins
66 |
67 | The following steps should be taken in order to ensure the best compatibility between plugins when using Tailwind with other plugins in the Backend:
68 |
69 | - Use [Laravel Mix](https://wintercms.com/docs/v1.2/docs/console/asset-compilation) to handle compiling your plugin's Tailwind styles
70 | - In your `tailwind.config.js` file, take the following actions:
71 | - Extend the Winter.TailwindUI plugin's configuration rather than the default Tailwind configuration (ex: `const config = require('../../winter/tailwindui/tailwind.config.js');`).
72 | - Ensure that the [Preflight Tailwind plugin](https://tailwindcss.com/docs/preflight#disabling-preflight) is disabled (ex: `config.corePlugins = {preflight: false};`).
73 | - Set `config.content` to include only your plugin's paths (ex: `config.content = ['./formwidgets/**/*.{vue,php,htm}', './components/**/*.{php,htm}', './assets/src/js/**/*.{js,vue}'];`).
74 | - In your `package.json` file, include [postcss-prefixwrap](https://www.npmjs.com/package/postcss-prefixwrap) to wrap your plugin's generated styles in a plugin-specific class to prevent overriding the styles elsewhere in the backend (ex. `"postcss-prefixwrap": "~1.29.x",`).
75 | - In your `winter.mix.js` file, use postcss-prefixwrap when compiling the Tailwind styles (ex. `mix.postCss('assets/src/css/example.css', 'assets/dist/css/example.css', [..., require('postcss-prefixwrap')('.plugin-authorname-pluginname'), ...])`).
76 |
77 | ### Example `tailwind.config.js`:
78 |
79 | ```js
80 | // Extend the base tailwind config to avoid conflicts
81 | const config = require('../../winter/tailwindui/tailwind.config.js');
82 |
83 | config.content = [
84 | './formwidgets/**/*.{vue,php,htm}',
85 | './components/**/*.{php,htm}',
86 | './assets/src/js/**/*.{js,vue}',
87 | ];
88 |
89 | config.corePlugins = {
90 | preflight: false,
91 | };
92 |
93 | module.exports = config;
94 | ```
95 |
96 | ### Example `winter.mix.js`:
97 |
98 | ```js
99 | const mix = require('laravel-mix');
100 |
101 | mix.setPublicPath(__dirname)
102 |
103 | // Compile Tailwind
104 | .postCss(
105 | 'assets/src/css/myplugin.css',
106 | 'assets/dist/css/myplugin.css',
107 | [
108 | require('postcss-import'),
109 | require('tailwindcss/nesting'),
110 | require('tailwindcss'),
111 | require('autoprefixer'),
112 | require('postcss-prefixwrap')('.myauthor-pluginname', {
113 | // Don't prefix wrap modals because we can't put the wrapping class on a high enough parent element to apply the styles
114 | ignoredSelectors: ['.modal'],
115 | })
116 | ]
117 | );
118 | ```
119 |
120 | ### Example `package.json`:
121 |
122 | ```json
123 | {
124 | "name": "myauthor-pluginname",
125 | "version": "0.0.1",
126 | "private": true,
127 | "version": "1.0.0",
128 | "devDependencies": {
129 | "postcss": "~8.4.x",
130 | "postcss-prefixwrap": "~1.29.x",
131 | "postcss-import": "~14.1.x",
132 | "tailwindcss": "~3.0.x",
133 | "@tailwindcss/typography": "0.5.8"
134 | }
135 | }
136 | ```
137 |
138 | ### Future Ideas
139 |
140 | It would be ideal if it was also possible for other plugins to detect the classes that have already been generated by this plugin and prune them from their compiled styles. Pull Requests welcome to add that ability in the future if anyone has the time / motivation to do so.
141 |
142 | ## Credits
143 | This plugin was originally written by Joseph Blythe & Luke Towers for [Spatial Media](https://spatialmedia.io).
144 |
145 | It has since been modified and re-released under the Winter namespace as a first party plugin for Winter CMS maintained by the Winter CMS team.
146 |
147 | If you would like to contribute to this plugin's development, please feel free to submit issues or pull requests to the plugin's repository here: https://github.com/wintercms/wn-tailwindui-plugin
148 |
149 | If you would like to support Winter CMS, please visit [WinterCMS.com](https://wintercms.com/support)
150 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/partials/menu/side/_item-contents.php:
--------------------------------------------------------------------------------
1 | sideMenu); ?>
2 |
78 |
79 |
150 |
151 |
--------------------------------------------------------------------------------
/composer.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_readme": [
3 | "This file locks the dependencies of your project to a known state",
4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 | "This file is @generated automatically"
6 | ],
7 | "content-hash": "eb1d5ec0fb2f595aa35be10dc6b1ed0f",
8 | "packages": [
9 | {
10 | "name": "composer/installers",
11 | "version": "v1.12.0",
12 | "source": {
13 | "type": "git",
14 | "url": "https://github.com/composer/installers.git",
15 | "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19"
16 | },
17 | "dist": {
18 | "type": "zip",
19 | "url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19",
20 | "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19",
21 | "shasum": ""
22 | },
23 | "require": {
24 | "composer-plugin-api": "^1.0 || ^2.0"
25 | },
26 | "replace": {
27 | "roundcube/plugin-installer": "*",
28 | "shama/baton": "*"
29 | },
30 | "require-dev": {
31 | "composer/composer": "1.6.* || ^2.0",
32 | "composer/semver": "^1 || ^3",
33 | "phpstan/phpstan": "^0.12.55",
34 | "phpstan/phpstan-phpunit": "^0.12.16",
35 | "symfony/phpunit-bridge": "^4.2 || ^5",
36 | "symfony/process": "^2.3"
37 | },
38 | "type": "composer-plugin",
39 | "extra": {
40 | "class": "Composer\\Installers\\Plugin",
41 | "branch-alias": {
42 | "dev-main": "1.x-dev"
43 | }
44 | },
45 | "autoload": {
46 | "psr-4": {
47 | "Composer\\Installers\\": "src/Composer/Installers"
48 | }
49 | },
50 | "notification-url": "https://packagist.org/downloads/",
51 | "license": [
52 | "MIT"
53 | ],
54 | "authors": [
55 | {
56 | "name": "Kyle Robinson Young",
57 | "email": "kyle@dontkry.com",
58 | "homepage": "https://github.com/shama"
59 | }
60 | ],
61 | "description": "A multi-framework Composer library installer",
62 | "homepage": "https://composer.github.io/installers/",
63 | "keywords": [
64 | "Craft",
65 | "Dolibarr",
66 | "Eliasis",
67 | "Hurad",
68 | "ImageCMS",
69 | "Kanboard",
70 | "Lan Management System",
71 | "MODX Evo",
72 | "MantisBT",
73 | "Mautic",
74 | "Maya",
75 | "OXID",
76 | "Plentymarkets",
77 | "Porto",
78 | "RadPHP",
79 | "SMF",
80 | "Starbug",
81 | "Thelia",
82 | "Whmcs",
83 | "WolfCMS",
84 | "agl",
85 | "aimeos",
86 | "annotatecms",
87 | "attogram",
88 | "bitrix",
89 | "cakephp",
90 | "chef",
91 | "cockpit",
92 | "codeigniter",
93 | "concrete5",
94 | "croogo",
95 | "dokuwiki",
96 | "drupal",
97 | "eZ Platform",
98 | "elgg",
99 | "expressionengine",
100 | "fuelphp",
101 | "grav",
102 | "installer",
103 | "itop",
104 | "joomla",
105 | "known",
106 | "kohana",
107 | "laravel",
108 | "lavalite",
109 | "lithium",
110 | "magento",
111 | "majima",
112 | "mako",
113 | "mediawiki",
114 | "miaoxing",
115 | "modulework",
116 | "modx",
117 | "moodle",
118 | "osclass",
119 | "pantheon",
120 | "phpbb",
121 | "piwik",
122 | "ppi",
123 | "processwire",
124 | "puppet",
125 | "pxcms",
126 | "reindex",
127 | "roundcube",
128 | "shopware",
129 | "silverstripe",
130 | "sydes",
131 | "sylius",
132 | "symfony",
133 | "tastyigniter",
134 | "typo3",
135 | "wordpress",
136 | "yawik",
137 | "zend",
138 | "zikula"
139 | ],
140 | "support": {
141 | "issues": "https://github.com/composer/installers/issues",
142 | "source": "https://github.com/composer/installers/tree/v1.12.0"
143 | },
144 | "funding": [
145 | {
146 | "url": "https://packagist.com",
147 | "type": "custom"
148 | },
149 | {
150 | "url": "https://github.com/composer",
151 | "type": "github"
152 | },
153 | {
154 | "url": "https://tidelift.com/funding/github/packagist/composer/composer",
155 | "type": "tidelift"
156 | }
157 | ],
158 | "time": "2021-09-13T08:19:44+00:00"
159 | },
160 | {
161 | "name": "mexitek/phpcolors",
162 | "version": "v1.0.4",
163 | "source": {
164 | "type": "git",
165 | "url": "https://github.com/mexitek/phpColors.git",
166 | "reference": "4043974240ca7dc3c2bec3c158588148b605b206"
167 | },
168 | "dist": {
169 | "type": "zip",
170 | "url": "https://api.github.com/repos/mexitek/phpColors/zipball/4043974240ca7dc3c2bec3c158588148b605b206",
171 | "reference": "4043974240ca7dc3c2bec3c158588148b605b206",
172 | "shasum": ""
173 | },
174 | "require": {
175 | "php": "^7.2|^8.0"
176 | },
177 | "require-dev": {
178 | "nette/tester": "^2.3",
179 | "squizlabs/php_codesniffer": "^3.5"
180 | },
181 | "type": "library",
182 | "autoload": {
183 | "classmap": [
184 | "src"
185 | ]
186 | },
187 | "notification-url": "https://packagist.org/downloads/",
188 | "license": [
189 | "MIT"
190 | ],
191 | "authors": [
192 | {
193 | "name": "Arlo Carreon",
194 | "homepage": "http://arlocarreon.com",
195 | "role": "creator"
196 | }
197 | ],
198 | "description": "A series of methods that let you manipulate colors. Just incase you ever need different shades of one color on the fly.",
199 | "homepage": "http://mexitek.github.com/phpColors/",
200 | "keywords": [
201 | "color",
202 | "css",
203 | "design",
204 | "frontend",
205 | "ui"
206 | ],
207 | "support": {
208 | "issues": "https://github.com/mexitek/phpColors/issues",
209 | "source": "https://github.com/mexitek/phpColors"
210 | },
211 | "time": "2021-11-26T13:19:08+00:00"
212 | }
213 | ],
214 | "packages-dev": [],
215 | "aliases": [],
216 | "minimum-stability": "stable",
217 | "stability-flags": [],
218 | "prefer-stable": false,
219 | "prefer-lowest": false,
220 | "platform": {
221 | "php": ">=7.2"
222 | },
223 | "platform-dev": [],
224 | "plugin-api-version": "2.3.0"
225 | }
226 |
--------------------------------------------------------------------------------
/assets/src/js/winter.sidepaneltab.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Side Panel Tabs
3 | */
4 |
5 | +function ($) { "use strict";
6 |
7 | var SidePanelTab = function(element, options) {
8 | this.options = options
9 | this.$el = $(element)
10 | this.init()
11 | }
12 |
13 | SidePanelTab.prototype.init = function() {
14 | var self = this
15 | this.tabOpenDelay = 200
16 | this.tabOpenTimeout = undefined
17 | this.panelOpenTimeout = undefined
18 | this.$sideNav = $('[data-control="sidenav"][data-menu-code="' + this.$el.data('menu-code') + '"')
19 | this.$sideNavItems = $('ul li', this.$sideNav)
20 | this.$sidePanelItems = $('[data-content-id]', this.$el)
21 | this.sideNavWidth = this.$sideNavItems.outerWidth()
22 | this.mainNavHeight = $('#layout-mainmenu').outerHeight()
23 | this.panelVisible = false
24 | this.visibleItemId = false
25 | this.$fixButton = $(' ')
26 |
27 | this.$fixButton.click(function() {
28 | self.fixPanel()
29 | return false
30 | })
31 | $('.fix-button-container', this.$el).append(this.$fixButton)
32 |
33 | this.$sideNavItems.click(function() {
34 | const $this = $(this);
35 |
36 | if (!$this.data('menu-item')) {
37 | return
38 | }
39 |
40 | self.$sideNavItems.removeClass('active');
41 | $this.toggleClass('active');
42 |
43 | if ($this.data('no-side-panel')) {
44 | return
45 | }
46 |
47 | if (Modernizr.touchevents && $(window).width() < self.options.breakpoint) {
48 | if ($this.data('menu-item') == self.visibleItemId && self.panelVisible) {
49 | self.hideSidePanel()
50 | return
51 | }
52 | else {
53 | self.displaySidePanel()
54 | }
55 | }
56 |
57 | self.displayTab(this)
58 |
59 | return false
60 | })
61 |
62 | if (!Modernizr.touchevents) {
63 | // The side panel now opens only when a menu item is hovered and
64 | // when the item doesn't have the "data-no-side-panel" attribute.
65 | // TODO: remove the comment and the code below if no issues noticed.
66 | // self.$sideNav.mouseenter(function() {
67 | // if ($(window).width() < self.options.breakpoint || !self.panelFixed()) {
68 | // self.panelOpenTimeout = setTimeout(function() {
69 | // self.displaySidePanel()
70 | // }, self.tabOpenDelay)
71 | // }
72 | // })
73 |
74 | self.$sideNav.mouseleave(function() {
75 | clearTimeout(self.panelOpenTimeout)
76 | })
77 |
78 | self.$el.mouseleave(function() {
79 | self.hideSidePanel()
80 | })
81 |
82 | self.$sideNavItems.mouseenter(function() {
83 | if ($(window).width() < self.options.breakpoint || !self.panelFixed()) {
84 | if ($(this).data('no-side-panel')) {
85 | self.hideSidePanel()
86 | return
87 | }
88 |
89 | var _this = this
90 | self.tabOpenTimeout = setTimeout(function() {
91 | self.displaySidePanel()
92 | self.displayTab(_this)
93 | }, self.tabOpenDelay)
94 | }
95 | })
96 |
97 | self.$sideNavItems.mouseleave(function() {
98 | clearTimeout(self.tabOpenTimeout)
99 | })
100 |
101 | $(window).resize(function() {
102 | self.updatePanelPosition()
103 | self.updateActiveTab()
104 | })
105 | }
106 | else {
107 | $('#layout-body').click(function() {
108 | if (self.panelVisible) {
109 | self.hideSidePanel()
110 | return false
111 | }
112 | })
113 |
114 | self.$el.on('close.oc.sidePanel', function() {
115 | self.hideSidePanel()
116 | })
117 | }
118 |
119 | this.updateActiveTab()
120 | }
121 |
122 | SidePanelTab.prototype.displayTab = function(menuItem) {
123 | var menuItemId = $(menuItem).data('menu-item')
124 |
125 | this.visibleItemId = menuItemId
126 |
127 | if ($.wn.sideNav !== undefined) {
128 | $.wn.sideNav.setActiveItem(menuItemId)
129 | }
130 |
131 | this.$sidePanelItems.each(function() {
132 | var $el = $(this)
133 | $el.toggleClass('hide', $el.data('content-id') != menuItemId)
134 | })
135 |
136 | $(window).trigger('resize')
137 | }
138 |
139 | SidePanelTab.prototype.displaySidePanel = function() {
140 | $(document.body).addClass('display-side-panel')
141 |
142 | this.$el.appendTo('#layout-canvas')
143 | this.panelVisible = true
144 | this.$el.css({
145 | left: 0,
146 | top: this.mainNavHeight,
147 | })
148 |
149 | this.updatePanelPosition()
150 | $(window).trigger('resize')
151 | }
152 |
153 | SidePanelTab.prototype.hideSidePanel = function() {
154 | $(document.body).removeClass('display-side-panel')
155 | if (this.$el.next('#layout-body').length == 0) {
156 | $('#layout-body').before(this.$el)
157 | }
158 |
159 | this.panelVisible = false
160 |
161 | this.updateActiveTab()
162 | }
163 |
164 | SidePanelTab.prototype.updatePanelPosition = function() {
165 | if (!this.panelFixed() || Modernizr.touchevents) {
166 | this.$el.height($(document).height() - this.mainNavHeight)
167 | }
168 | else {
169 | this.$el.css('height', '')
170 | }
171 |
172 | if (this.panelVisible && $(window).width() > this.options.breakpoint && this.panelFixed()) {
173 | this.hideSidePanel()
174 | }
175 | }
176 |
177 | SidePanelTab.prototype.updateActiveTab = function() {
178 | if ($.wn.sideNav === undefined) {
179 | return
180 | }
181 |
182 | if (!this.panelVisible && ($(window).width() < this.options.breakpoint || !this.panelFixed())) {
183 | $.wn.sideNav.unsetActiveItem()
184 | }
185 | else {
186 | $.wn.sideNav.setActiveItem(this.visibleItemId)
187 | }
188 | }
189 |
190 | SidePanelTab.prototype.panelFixed = function() {
191 | return !($(window).width() < this.options.breakpoint) &&
192 | !$(document.body).hasClass('side-panel-not-fixed')
193 | }
194 |
195 | SidePanelTab.prototype.fixPanel = function() {
196 | $(document.body).toggleClass('side-panel-not-fixed')
197 |
198 | var self = this
199 |
200 | window.setTimeout(function() {
201 | var fixed = self.panelFixed()
202 |
203 | if (fixed) {
204 | self.updateActiveTab()
205 | $(document.body).addClass('side-panel-fix-shadow')
206 | } else {
207 | $(document.body).removeClass('side-panel-fix-shadow')
208 | self.hideSidePanel()
209 | }
210 |
211 | if (typeof(localStorage) !== 'undefined')
212 | localStorage.ocSidePanelFixed = fixed ? 1 : 0
213 | }, 0)
214 | }
215 |
216 | SidePanelTab.DEFAULTS = {
217 | breakpoint: 769
218 | }
219 |
220 | // PLUGIN DEFINITION
221 | // ============================
222 |
223 | var old = $.fn.sidePanelTab
224 |
225 | $.fn.sidePanelTab = function (option) {
226 | return this.each(function() {
227 | var $this = $(this)
228 | var data = $this.data('oc.sidePanelTab')
229 | var options = $.extend({}, SidePanelTab.DEFAULTS, $this.data(), typeof option == 'object' && option)
230 | if (!data) $this.data('oc.sidePanelTab', (data = new SidePanelTab(this, options)))
231 | if (typeof option == 'string') data[option].call(data)
232 | })
233 | }
234 |
235 | $.fn.sidePanelTab.Constructor = SidePanelTab
236 |
237 | // NO CONFLICT
238 | // =================
239 |
240 | $.fn.sidePanelTab.noConflict = function() {
241 | $.fn.sidePanelTab = old
242 | return this
243 | }
244 |
245 | // DATA-API
246 | // ============
247 |
248 | $(document).ready(function(){
249 | $('[data-control=layout-sidepanel]').sidePanelTab()
250 | })
251 |
252 | // STORED PREFERENCES
253 | // ====================
254 |
255 | $(document).ready(function() {
256 | if (Modernizr.touchevents || (typeof(localStorage) !== 'undefined')) {
257 | if (localStorage.ocSidePanelFixed == 0) {
258 | $(document.body).addClass('side-panel-not-fixed')
259 | $(window).trigger('resize')
260 | }
261 | else if (localStorage.ocSidePanelFixed == 1) {
262 | $(document.body).removeClass('side-panel-not-fixed')
263 | $(window).trigger('resize')
264 | }
265 | }
266 | })
267 | }(window.jQuery);
268 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/partials/menu/top/_quick-actions.php:
--------------------------------------------------------------------------------
1 |
10 |
11 |
15 |
16 | Create
17 |
18 |
19 |
20 |
21 |
22 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
45 |
54 |
55 |
56 |
57 |
attributes) ?>
61 | class="quick-link= $menuLocation === 'side' ? ' quick-link-light' : '' ?>"
62 | >
63 |
64 | iconSvg): ?>
65 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
79 |
80 |
83 |
84 | Open user menu
85 |
91 |
92 |
93 |
94 |
102 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 | = e(trans('backend::lang.account.signed_in_as', ['full_name' => null])) ?>
114 |
115 |
116 | = $this->user->full_name ?>
117 |
118 |
119 |
120 |
121 |
122 | $items): ?>
123 |
136 |
137 | hasAccess('winter.tailwindui.manage_own_appearance.dark_mode')) : ?>
138 |
139 | = Form::open(['class' => 'px-4 py-1']) ?>
140 |
141 |
142 |
150 |
151 |
152 |
153 |
154 |
162 |
163 |
164 |
165 |
166 |
174 |
175 |
176 |
177 |
178 | = Form::close() ?>
179 |
180 |
181 |
196 |
197 |
198 |
199 |
200 |
--------------------------------------------------------------------------------
/Plugin.php:
--------------------------------------------------------------------------------
1 | 'winter.tailwindui::lang.plugin.name',
35 | 'description' => 'winter.tailwindui::lang.plugin.description',
36 | 'author' => 'Winter CMS',
37 | 'icon' => 'icon-leaf',
38 | ];
39 | }
40 |
41 | /**
42 | * Returns the permissions provided by this plugin
43 | */
44 | public function registerPermissions(): array
45 | {
46 | return [
47 | 'winter.tailwindui.manage_own_appearance.dark_mode' => [
48 | 'label' => 'winter.tailwindui::lang.permissions.manage_appearance.dark_mode',
49 | 'tab' => 'winter.tailwindui::lang.plugin.name',
50 | 'roles' => [UserRole::CODE_PUBLISHER, UserRole::CODE_DEVELOPER],
51 | ],
52 | 'winter.tailwindui.manage_own_appearance.menu_location' => [
53 | 'label' => 'winter.tailwindui::lang.permissions.manage_appearance.menu_location',
54 | 'tab' => 'winter.tailwindui::lang.plugin.name',
55 | 'roles' => [UserRole::CODE_PUBLISHER, UserRole::CODE_DEVELOPER],
56 | ],
57 | 'winter.tailwindui.manage_own_appearance.item_location' => [
58 | 'label' => 'winter.tailwindui::lang.permissions.manage_appearance.item_location',
59 | 'tab' => 'winter.tailwindui::lang.plugin.name',
60 | 'roles' => [UserRole::CODE_PUBLISHER, UserRole::CODE_DEVELOPER],
61 | ],
62 | ];
63 | }
64 |
65 | /**
66 | * Boot method, called right before the request route.
67 | */
68 | public function boot()
69 | {
70 | // Only apply skin modifications to the backend context
71 | if ($this->app->runningInBackend()) {
72 | $this->applyBackendSkin();
73 | $this->extendBackendControllers();
74 | $this->extendBackendWidgets();
75 | $this->extendBrandSettingsForm();
76 | $this->extendBackendAuthController();
77 | }
78 | }
79 |
80 | /**
81 | * Guess the override view path for the provided object
82 | */
83 | protected function guessOverrideViewPath(object $object): string
84 | {
85 | $path = strtolower(get_class($object));
86 | $cleanPath = str_replace("\\", "/", $path);
87 | if (!in_array(Str::before($cleanPath, '/'), ['backend', 'cms', 'system'])) {
88 | $cleanPath = 'plugins/' . $cleanPath;
89 | }
90 | return '$/winter/tailwindui/skins/tailwindui/views/' . $cleanPath;
91 | }
92 |
93 | /**
94 | * Apply the TailwindUI backend skin as the selected backend skin
95 | */
96 | protected function applyBackendSkin()
97 | {
98 | Config::set('cms.backendSkin', \Winter\TailwindUI\Skins\TailwindUI::class);
99 | Config::set('brand.backgroundImage', '/plugins/winter/tailwindui/assets/images/background.jpg');
100 |
101 | // Set a default logo that will work with the default dark sidebar as a fallback
102 | // @TODO: add support for light / dark modes / variations of all primary branding (logo, favicon, colour scheme) and apply as necessary
103 | if (empty(Config::get('brand.logoPath'))) {
104 | // Config::set('brand.logoPath', '~/modules/backend/assets/images/winter-logo-white.svg');
105 | // Config::set('brand.logoPath', '~/modules/backend/assets/images/winter-logo.svg');
106 | }
107 | }
108 |
109 | /**
110 | * Extend all backend controllers to inject view overrides and apply custom
111 | * brand settings data
112 | */
113 | protected function extendBackendControllers(): void
114 | {
115 | // Add our view override paths
116 | BaseBackendController::extend(function (\Backend\Classes\Controller $controller) {
117 | $controller->addViewPath($this->guessOverrideViewPath($controller));
118 |
119 | $controller->addVite('assets/src/css/app.css', 'Winter.TailwindUI');
120 |
121 | $this->extendBrandSettingsData();
122 |
123 | $controller->addDynamicMethod('onTailwindUISetTheme', function () {
124 | $user = BackendAuth::user();
125 | if (!$user || !$user->hasAccess('winter.tailwindui.manage_own_appearance.dark_mode')) {
126 | abort(403, "You do not have permission to do that.");
127 | }
128 |
129 | $darkMode = post('dark_mode');
130 | $prefs = PreferenceModel::instance();
131 | $prefs->set('dark_mode', $darkMode);
132 | return [
133 | 'dark_mode' => $darkMode,
134 | ];
135 | });
136 | });
137 |
138 | // Extend the Settings controller to force the page to reload after updating branding
139 | SettingsController::extend(function ($controller) {
140 | $controller->bindEvent('ajax.beforeRunHandler', function ($handler) use ($controller) {
141 | if ($handler === 'onSave' && !empty(Request::post('BrandSetting'))) {
142 | $controller->update_onSave(...CoreBackendController::$params);
143 | return redirect()->refresh();
144 | }
145 | });
146 | });
147 |
148 | // Extend the Preferences controller to force the page to reload after updating preferences
149 | PreferencesController::extend(function ($controller) {
150 | $controller->bindEvent('ajax.beforeRunHandler', function ($handler) use ($controller) {
151 | if ($handler === 'onSave' && !empty(Request::post('Preference'))) {
152 | $controller->update_onSave(...CoreBackendController::$params);
153 | return redirect()->refresh();
154 | }
155 | });
156 | });
157 | }
158 |
159 | /**
160 | * Extends backend widgets to use the custom views provided by this plugin
161 | */
162 | protected function extendBackendWidgets(): void
163 | {
164 | WidgetBase::extend(function ($widget) {
165 | // @TODO: BlogMarkdown and all ML overrides break this
166 | $widget->addViewPath($this->guessOverrideViewPath($widget) . '/partials');
167 | });
168 | }
169 |
170 | /**
171 | * Populate brand settings data with initial values if not set
172 | */
173 | protected function extendBrandSettingsData(): void
174 | {
175 | $settings = BrandSetting::instance();
176 | $userSettings = (!is_null(BackendAuth::user()))
177 | ? PreferenceModel::instance()
178 | : null;
179 |
180 | // Initialize the backend branding data from the config if it's not set already
181 | $fieldDefaults = [];
182 | $fields = Yaml::parseFile(plugins_path('winter/tailwindui/models/brandsetting/fields.yaml'));
183 | if (!empty($fields['tabs'])) {
184 | foreach ($fields['tabs']['fields'] as $name => $config) {
185 | if (isset($config['default'])) {
186 | $fieldDefaults[$name] = $config['default'];
187 | }
188 | }
189 | }
190 |
191 | if (!empty($fieldDefaults)) {
192 | foreach ($fieldDefaults as $name => $default) {
193 | // Check the current user for an overridden preference
194 | $userValue = (!is_null($userSettings)) ? $userSettings->get($name) : null;
195 |
196 | if (!empty($userValue)) {
197 | $settings->setSettingsValue($name, $userValue);
198 | $settings->attributes[$name] = $userValue;
199 |
200 | // Apply defaults from brand config if no value is set in the DB
201 | } elseif (empty($settings->getSettingsValue($name))) {
202 | $settings->setSettingsValue($name, $this->app->config->get("brand.$name", $default));
203 | $settings->attributes[$name] = $this->app->config->get("brand.$name", $default);
204 | }
205 | }
206 | }
207 |
208 | // Set the default values for the User Preferences
209 | if ($userSettings) {
210 | $applyDefaults = [
211 | 'dark_mode',
212 | ];
213 | $preferenceDefaults = [];
214 | $preferenceFields = Yaml::parseFile(plugins_path('winter/tailwindui/models/preference/fields.yaml'));
215 | if (!empty($preferenceFields['tabs'])) {
216 | foreach ($preferenceFields['tabs']['fields'] as $name => $config) {
217 | if (isset($config['default']) && in_array($name, $applyDefaults)) {
218 | $preferenceDefaults[$name] = $config['default'];
219 | }
220 | }
221 | }
222 |
223 | if (!empty($preferenceDefaults)) {
224 | foreach ($preferenceDefaults as $name => $default) {
225 | // Check the current user for an overridden preference
226 | $userValue = $userSettings->get($name);
227 |
228 | if (empty($userSettings->get($name))) {
229 | $userSettings->setSettingsValue($name, $this->app->config->get("brand.$name", $default));
230 | $userSettings->attributes[$name] = $this->app->config->get("brand.$name", $default);
231 | }
232 | }
233 | }
234 | }
235 | }
236 |
237 | /**
238 | * Extend the brand settings form to include the settings provided by this plugin
239 | */
240 | protected function extendBrandSettingsForm(): void
241 | {
242 | BrandSetting::extend(function($model) {
243 | $model->addAttachOneRelation('background_image', [\System\Models\File::class]);
244 | });
245 |
246 | Event::listen('backend.form.extendFields', function ($form) {
247 | // Only extend the desired form
248 | if (!(
249 | $form instanceof \Backend\Widgets\Form
250 | && !$form->isNested
251 | && (
252 | (
253 | $form->getController() instanceof SettingsController
254 | && $form->model instanceof BrandSetting
255 | )
256 | || (
257 | $form->getController() instanceof PreferencesController
258 | && $form->model instanceof PreferenceModel
259 | )
260 | )
261 | )) {
262 | return;
263 | }
264 |
265 | $fields = [
266 | BrandSetting::class => Yaml::parseFile(plugins_path('winter/tailwindui/models/brandsetting/fields.yaml')),
267 | PreferenceModel::class => Yaml::parseFile(plugins_path('winter/tailwindui/models/preference/fields.yaml')),
268 | ];
269 |
270 | if (!empty($fields[get_class($form->model)]['tabs'])) {
271 | $form->addTabFields($fields[get_class($form->model)]['tabs']['fields']);
272 | }
273 |
274 | // Remove fields that are no longer relevant
275 | $form->removeField('menu_mode');
276 | });
277 | }
278 |
279 | /**
280 | * Extend the backend auth controller to change the layout based on the
281 | * brand settings provided by this plugin
282 | */
283 | protected function extendBackendAuthController(): void
284 | {
285 | AuthController::extend(function ($controller) {
286 | $controller->bindEvent('page.beforeDisplay', function () use ($controller) {
287 | $authLayout = BrandSetting::get('auth_layout');
288 | $controller->layout = "auth-$authLayout";
289 | });
290 | });
291 | }
292 | }
293 |
--------------------------------------------------------------------------------
/skins/tailwindui/layouts/_menu-top.php:
--------------------------------------------------------------------------------
1 | listItems('mysettings');
5 | ?>
6 |
7 |
19 |
20 |
270 |
271 |
272 |
273 | = $this->makeLayoutPartial('partials/menu/top/mobile-menu', [
274 | 'iconLocation' => $iconLocation,
275 | ]); ?>
276 |
277 |
--------------------------------------------------------------------------------
/assets/src/css/darkmode.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --drk-bg-color-a: #0d1117;
3 | --drk-bg-color-b: #161b22;
4 | --drk-bg-color-c: #1b222c;
5 | --drk-bg-color-btn: #21262d;
6 | --drk-bg-color-inset: #010409;
7 | --drk-bg-color-selection: #2c434e;
8 | --drk-color: #c9d1d9;
9 | --drk-color-danger: #f85149;
10 | --drk-border-color: #30363d;
11 | --drk-box-shadow: 0 8px 24px #010409;
12 | }
13 |
14 | @layer components {
15 | .btn-darkmode {
16 | @apply rounded-sm py-1 w-full text-center text-sm text-gray-700 hover:text-white hover:bg-gray-200 hover:text-gray-900 hover:no-underline dark:text-gray-300 dark:hover:text-white dark:hover:bg-gray-700;
17 |
18 | > i {
19 | @apply text-sm text-center min-w-[1.25em]
20 | }
21 | }
22 |
23 | html[data-color-scheme="auto"] .btn-darkmode[data-request-data="dark_mode: 'auto'"],
24 | html[data-color-scheme="dark"] .btn-darkmode[data-request-data="dark_mode: 'dark'"],
25 | html[data-color-scheme="light"] .btn-darkmode[data-request-data="dark_mode: 'light'"]
26 | {
27 | @apply
28 | bg-gray-300 text-gray-700
29 | dark:text-gray-300 dark:bg-gray-700;
30 | }
31 | }
32 |
33 | .dark {
34 | body {
35 | color: var(--drk-color);
36 | background: var(--drk-bg-color-a);
37 | }
38 |
39 | .layout.control-tabs.wn-logo-transparent:not(.has-tabs):after,
40 | .flex-layout-column.wn-logo-transparent:not(.has-tabs):after,
41 | .layout-cell.wn-logo-transparent:after {
42 | background: transparent;
43 | }
44 |
45 |
46 | nav#layout-mainmenu {
47 | background-color: var(--drk-bg-color-b);
48 | }
49 |
50 | nav#layout-mainmenu.navbar ul li.active {
51 | border-top: solid 3px #3498db;
52 | margin-top: 2px;
53 | }
54 |
55 | nav#layout-mainmenu ul li .mainmenu-accountmenu {
56 | background: var(--drk-bg-color-b);
57 | }
58 |
59 | nav#layout-mainmenu ul li .mainmenu-accountmenu:after {
60 | border-bottom-color: var(--drk-bg-color-b);
61 | }
62 |
63 | nav#layout-mainmenu ul li .mainmenu-accountmenu li a {
64 | color: var(--drk-color);
65 | }
66 |
67 | nav#layout-mainmenu ul li .mainmenu-accountmenu li a:hover,
68 | nav#layout-mainmenu ul li .mainmenu-accountmenu li a:focus {
69 | background: #1f6feb;
70 | color: #f0f6fc;
71 | }
72 |
73 | nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:hover,
74 | nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:focus {
75 | border-radius: 3px 3px 0 0;
76 | }
77 |
78 | nav#layout-mainmenu ul li .mainmenu-accountmenu li:last-child a:hover,
79 | nav#layout-mainmenu ul li .mainmenu-accountmenu li:last-child a:focus {
80 | border-radius: 0 0 3px 3px;
81 | }
82 |
83 | nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:hover:after,
84 | nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:focus:after,
85 | nav#layout-mainmenu ul li .mainmenu-accountmenu li:first-child a:active:after {
86 | border-bottom-color: #1f6feb;
87 | }
88 |
89 | nav#layout-mainmenu ul li .mainmenu-accountmenu li.divider {
90 | background-color: var(--drk-border-color);
91 | }
92 |
93 |
94 | /* sidenav */
95 | nav.layout-sidenav {
96 | background: var(--drk-bg-color-b);
97 | border-top: 1px solid var(--drk-border-color);
98 | }
99 |
100 | #layout-sidenav li.active {
101 | background: var(--drk-bg-color-btn);
102 | border-left: solid 4px #3498db;
103 | }
104 |
105 | #layout-sidenav li.active a:hover {
106 | background: var(--drk-bg-color-btn);
107 | }
108 |
109 | #layout-sidenav ul li a:hover {
110 | background: rgb(110 118 129 / 10%);
111 | }
112 |
113 | .sidenav-tree {
114 | background-color: var(--drk-bg-color-b);
115 | }
116 |
117 | .sidenav-tree ul.top-level > li > div.group:before,
118 | .sidenav-tree ul.top-level > li > div.group:after {
119 | border-top-color: #13171d;
120 | }
121 |
122 | /* .layout-sidenav-container {
123 | border-right: solid 1px var(--drk-border-color);
124 | } */
125 | /* End sidenav */
126 |
127 | .close {
128 | color: #fff;
129 | }
130 |
131 | .close:hover,
132 | .close:focus {
133 | color: #fff;
134 | }
135 |
136 | .table-striped.widget-calcs {
137 | color: #bbb;
138 | }
139 |
140 | .table > thead > tr > th {
141 | border-bottom-color: var(--drk-border-color);
142 | }
143 |
144 | .table-striped > tbody > tr:nth-child(odd) > td {
145 | background-color: #1d242e;
146 | }
147 |
148 | .table > tbody > tr > td {
149 | border-top-color: var(--drk-border-color);
150 | }
151 |
152 | .text-muted {
153 | color: #8b949e;
154 | }
155 |
156 | input.form-control.icon.search.growable:focus,
157 | input.form-control[name="search"]:focus {
158 | border-color: #1f6feb;
159 | outline: none;
160 | box-shadow: 0 0 0 3px #0c2d6b;
161 | }
162 |
163 | .toolbar-widget {
164 | .clear-input-text {
165 | color: var(--drk-color);
166 | background-color: var(--drk-bg-color-inset);
167 | &:hover, &:focus {
168 | color: var(--drk-color);
169 | }
170 | }
171 | }
172 |
173 | .field-recordfinder .btn {
174 | color: #fff;
175 | }
176 |
177 | .select2-dropdown {
178 | color: var(--drk-color);
179 | background-color: var(--drk-bg-color-b);
180 | border: 1px solid var(--drk-border-color);
181 | box-shadow: var(--drk-box-shadow);
182 | }
183 |
184 | .select2-container--default .select2-selection {
185 | background-color: #010409;
186 | border: 1px solid var(--drk-border-color);
187 | box-shadow: 0 0 transparent;
188 | }
189 |
190 | .select2-container--default .select2-selection--single .select2-selection__rendered {
191 | color: var(--drk-color);
192 | }
193 |
194 | .select2-container--default .select2-selection--single .select2-selection__arrow b:before {
195 | color: #f0f8ff;
196 | }
197 |
198 | .select2-container--default .select2-search--dropdown .select2-search__field {
199 | color: var(--drk-color);
200 | background-color: var(--drk-bg-color-a);
201 | border: 1px solid var(--drk-border-color);
202 | box-shadow: none;
203 | }
204 |
205 | .select2-container--default .select2-search--dropdown .select2-search__field:focus {
206 | border-color: #1f6feb;
207 | outline: none;
208 | box-shadow: 0 0 0 3px #0c2d6b;
209 | }
210 |
211 | .select2-container--default .select2-results__option--highlighted[aria-selected] {
212 | background-color: rgb(110 118 129 / 10%);
213 | color: var(--drk-color);
214 | }
215 |
216 | .select2-container--default .select2-results__option[aria-selected="true"] {
217 | color: #fff;
218 | background-color: rgb(110 118 129 / 10%);
219 | }
220 |
221 | .control-balloon-selector ul li {
222 | background: #373838;
223 | color: var(--drk-color);
224 | }
225 |
226 | .control-balloon-selector ul li.active {
227 | background: #005087 !important;
228 | }
229 |
230 |
231 | /* tooltip */
232 | .tooltip-inner {
233 | background: #d1d1d1;
234 | color: #000;
235 | }
236 |
237 | .tooltip.top .tooltip-arrow {
238 | border-top-color: #d1d1d1;
239 | }
240 |
241 | .tooltip.bottom .tooltip-arrow {
242 | border-bottom-color: #d1d1d1;
243 | }
244 |
245 | .tooltip.left .tooltip-arrow {
246 | border-left-color: #d1d1d1;
247 | }
248 |
249 | .tooltip.right .tooltip-arrow {
250 | border-right-color: #d1d1d1;
251 | }
252 |
253 | /* End tooltip */
254 |
255 |
256 | /* Dashboard */
257 | .report-widget {
258 | background: var(--drk-bg-color-c);
259 | }
260 |
261 | .report-widget h3 {
262 | color: #c8c8c8;
263 | }
264 |
265 | .report-container > ul .item .content .widget-control {
266 | color: #646464;
267 | text-shadow: 0 1px 0 #a5a5a5;
268 | }
269 |
270 | .report-container > ul .item .content .widget-control:hover {
271 | color: var(--drk-color);
272 | }
273 |
274 | .widget-welcome .welcome-logo {
275 | background: inherit;
276 | }
277 |
278 | .widget-welcome .welcome-message {
279 | color: #bbbbbb;
280 | }
281 |
282 | .widget-welcome .welcome-message strong {
283 | color: #c8c8c8;
284 | }
285 |
286 | .control-status-list > ul li {
287 | color: #bbb;
288 | border-bottom-color: var(--drk-border-color);
289 | }
290 |
291 | .control-status-list > ul li:last-child {
292 | border-bottom: none;
293 | }
294 |
295 | .control-status-list > ul li .status-text.success {
296 | color: #31ac5f;
297 | }
298 |
299 | .text-success {
300 | color: #31ac5f;
301 | }
302 |
303 | .control-status-list > ul li .status-text.warning {
304 | color: #ce9178;
305 | }
306 |
307 | .report-widget a:not(.btn) {
308 | color: #00b0b3;
309 | }
310 |
311 | .report-widget a:not(.btn):hover,
312 | .report-widget a:not(.btn):focus {
313 | color: #00ffff;
314 | }
315 |
316 | .report-widget a:not(.btn).status-label.primary {
317 | color: #fff;
318 | }
319 |
320 | .control-chart div.chart-legend table {
321 | color: #bbb;
322 | }
323 |
324 | .dropdown-menu .dropdown-container > ul {
325 | background-color: var(--drk-bg-color-c);
326 | box-shadow: var(--drk-box-shadow);
327 | }
328 |
329 | .dropdown-menu .dropdown-container > ul:after {
330 | border-bottom-color: var(--drk-bg-color-c);
331 | }
332 |
333 | .dropdown-menu .dropdown-container > ul li.first-item a:hover:after,
334 | .dropdown-menu .dropdown-container > ul li.first-item a:focus:after,
335 | .dropdown-menu .dropdown-container > ul li.first-item a:active:after {
336 | border-bottom-color: #1f6feb;
337 | }
338 |
339 | .dropdown-menu .dropdown-container > ul li a {
340 | color: var(--drk-color);
341 | border-left: 1px solid var(--drk-border-color);
342 | border-right: 1px solid var(--drk-border-color);
343 | }
344 |
345 | .dropdown.dropup .dropdown-menu .dropdown-container > ul:before {
346 | border-top-color: var(--drk-border-color);
347 | }
348 |
349 | .dropdown.dropup .dropdown-menu .dropdown-container > ul:after {
350 | border-top-color: var(--drk-bg-color-c);
351 | }
352 |
353 | .dropdown-menu .divider {
354 | background-color: var(--drk-border-color);
355 | }
356 |
357 | .dropdown-menu .dropdown-container > ul:first-child {
358 | border-top: 1px solid var(--drk-border-color);
359 | }
360 |
361 | .dropdown-menu .dropdown-container > ul:last-child {
362 | border-bottom: 1px solid var(--drk-border-color);
363 | }
364 |
365 | .dropdown-menu .dropdown-container > ul li a:hover,
366 | .dropdown-menu .dropdown-container > ul li a:focus {
367 | color: #f0f6fc;
368 | background-color: #1f6feb;
369 | }
370 |
371 | .dropdown.dropup .dropdown-menu .dropdown-container > ul li.last-item a:hover:after,
372 | .dropdown.dropup .dropdown-menu .dropdown-container > ul li.last-item a:focus:after,
373 | .dropdown.dropup .dropdown-menu .dropdown-container > ul li.last-item a:active:after {
374 | border-top-color: #1f6feb;
375 | }
376 |
377 | .report-container .manage-widgets:hover {
378 | border-color: #0f5acc;
379 | color: #f0f6fc;
380 | background-color: #1f6feb;
381 | }
382 |
383 | .report-container .dropdown.open .manage-widgets {
384 | background-color: #1f6feb;
385 | color: #f0f6fc;
386 | border-color: #0f5acc;
387 | }
388 |
389 | /* END Dashboard */
390 |
391 |
392 |
393 | /* CMS */
394 | .control-scrollpanel {
395 | background-color: var(--drk-bg-color-c);
396 | border-right: solid 1px var(--drk-border-color);
397 | }
398 |
399 | .control-treeview {
400 | ol li {
401 | > div {
402 | background-color: var(--drk-bg-color-b);
403 | a {
404 | color: #c5c5c5;
405 | }
406 | .submenu {
407 | filter: grayscale(100%);
408 | ::before,
409 | ::after {
410 | filter: grayscale(100%);
411 | }
412 | }
413 | }
414 |
415 | > div:hover,
416 | &.dragged div {
417 | background-color: #9a9a9a !important;
418 | }
419 | }
420 | }
421 |
422 | .control-filelist {
423 | ul li {
424 | a:hover {
425 | background: rgb(110 118 129 / 10%);
426 | }
427 | a span.title {
428 | color: #c5c5c5;
429 | }
430 | a span.description strong {
431 | color: #569cd6;
432 | }
433 |
434 | &.active {
435 | a,
436 | a:hover,
437 | a:focus {
438 | background: var(--drk-bg-color-b);
439 | }
440 | }
441 | &.group {
442 | > h4 a,
443 | > div.group > h4 a {
444 | color: #fff;
445 | }
446 | }
447 | }
448 |
449 | &.component-list ul li div.group i {
450 | color: #fff;
451 | background: var(--drk-bg-color-c);
452 | border-top: 1px solid var(--drk-border-color);
453 | }
454 |
455 | p.no-data {
456 | color: #d16969;
457 | }
458 |
459 | &.filelist-hero {
460 | ul li {
461 | background: var(--drk-bg-color-b);
462 |
463 | &.separator {
464 | background: var(--drk-bg-color-a);
465 | border-bottom-color: var(--drk-border-color);
466 | &:before {
467 | border-top-color: var(--drk-bg-color-a);
468 | }
469 | &:after {
470 | border-top-color: var(--drk-border-color);
471 | }
472 | }
473 |
474 | h5 {
475 | color: var(--drk-color);
476 | }
477 |
478 | > a {
479 | border-bottom-color: var(--drk-border-color);
480 | }
481 | }
482 |
483 | &.single-level ul li:hover > a {
484 | background: #202833;
485 | }
486 | }
487 | }
488 |
489 | .layout.control-tabs.oc-logo-transparent:not(.has-tabs):after,
490 | .flex-layout-column.oc-logo-transparent:not(.has-tabs):after,
491 | .layout-cell.oc-logo-transparent:after {
492 | background-color: transparent;
493 | }
494 |
495 | .fancy-layout :not(.nested-form) > .form-widget > .layout-row > .control-tabs.secondary-tabs > div > ul.nav-tabs > li.active > a {
496 | color: var(--drk-color);
497 | }
498 | .fancy-layout .control-tabs.has-tabs > div.tab-content,
499 | .fancy-layout.control-tabs.has-tabs > div.tab-content {
500 | background: var(--drk-bg-color-a) !important;
501 | }
502 |
503 | #layout-side-panel div.control-toolbar input.form-control {
504 | box-shadow: none;
505 | }
506 |
507 | /* Froala richtext editor */
508 | .field-richeditor {
509 | .fr-view {
510 | @apply prose-invert;
511 | }
512 | }
513 |
514 | .field-markdowneditor {
515 | .editor-preview {
516 | @apply prose-invert;
517 | }
518 | }
519 |
520 | .control-assetlist ul li a.link {
521 | color: var(--drk-color);
522 | }
523 |
524 | .control-assetlist ul li a.link:hover {
525 | background: #000;
526 | }
527 |
528 | .control-assetlist ul li.active a.link,
529 | .control-assetlist ul li a.link:hover {
530 | background: var(--drk-bg-color-b);
531 | }
532 |
533 | .control-assetlist p.parent.parent a.link:after {
534 | font-size: 7px;
535 | color: #fff;
536 | }
537 |
538 | .control-assetlist p.parent a.link:hover {
539 | background: #000 !important;
540 | }
541 |
542 | .control-assetlist p.parent.parent a.link {
543 | background-color: var(--drk-bg-color-a);
544 | color: var(--drk-color);
545 | }
546 |
547 | .component-list .components div.layout div.layout-row div.layout-cell {
548 | border-top: 1px solid var(--drk-border-color);
549 | background: var(--drk-bg-color-b);
550 | }
551 |
552 | .draggable-component-item:hover,
553 | .component-list .components div.layout-cell:hover,
554 | .component-list .components div.layout div.layout-row div.layout-cell:hover,
555 | div.control-componentlist div.components div.layout-cell:hover {
556 | background: #202833;
557 | }
558 |
559 | div.control-componentlist div.components div.layout-cell {
560 | background: var(--drk-bg-color-b);
561 | }
562 |
563 | div.control-componentlist div.components div.layout-cell:hover {
564 | background: var(--drk-bg-color-c);
565 | }
566 |
567 | div.control-componentlist div.components div.layout-cell > div.popover-highlight {
568 | background: var(--drk-bg-color-c) !important;
569 | border: 1px solid var(--drk-border-color);
570 | }
571 |
572 | .draggable-component-item > div:after,
573 | .component-list .components div.layout-cell > div:after,
574 | div.control-componentlist div.components div.layout-cell > div:after {
575 | color: var(--drk-bg-color-b);
576 | text-shadow: 0 0 1px #6fc2f1;
577 | }
578 |
579 | .component-list .components div.layout div.layout-row div.layout-cell > div:before {
580 | color: var(--drk-bg-color-b);
581 | text-shadow: 0 0 1px #6fc2f1;
582 | }
583 |
584 | div.control-componentlist div.components div.layout-cell > div:before,
585 | .component-list .components div.layout-cell > div span.name,
586 | div.control-componentlist div.components div.layout-cell > div span.name,
587 | div.control-componentlist div.components div.layout-cell > div a.remove {
588 | color: var(--drk-color);
589 | }
590 |
591 | .component-list .components div.layout-cell > div span.description,
592 | div.control-componentlist div.components div.layout-cell > div span.description {
593 | color: #bdb884;
594 | }
595 |
596 | div.control-componentlist div.components div.layout-cell > div span.alias {
597 | color: #7fffd4;
598 | }
599 |
600 | #cms-master-tabs .form-buttons .btn.btn-primary {
601 | color: #fff;
602 | border: none;
603 | }
604 |
605 | #cms-master-tabs .form-buttons .btn.btn-primary:hover {
606 | background-color: transparent;
607 | }
608 |
609 | .fancy-layout .form-buttons .btn {
610 | border: 0;
611 | }
612 |
613 | #cms-master-tabs.fancy-layout .control-tabs.primary-tabs > div > ul.nav-tabs > li a span.title {
614 | margin: -2px 0px;
615 | background: var(--drk-bg-color-a);
616 | padding: 5px 5px 3px 5px;
617 | }
618 |
619 | .fancy-layout .control-tabs.secondary-tabs > div > ul.nav-tabs {
620 | background-color: var(--drk-bg-color-b);
621 | }
622 |
623 | #cms-master-tabs .control-tabs.primary-tabs > div > ul.nav-tabs > li a > span.title > span {
624 | border-top: solid 2px #555;
625 | margin-top: -5px;
626 | }
627 |
628 | #cms-master-tabs .control-tabs.secondary-tabs > div > ul.nav-tabs > li a > span.title > span {
629 | border-top: 0;
630 | }
631 |
632 | /* END - CMS */
633 |
634 |
635 | /* backend/media */
636 | .whiteboard {
637 | background: var(--drk-bg-color-b);
638 | }
639 |
640 | .nav.selector-group li.active a {
641 | color: #d16969;
642 | }
643 |
644 | ul.tree-path li.root a {
645 | color: #ce9178;
646 | }
647 |
648 | table.name-value-list td {
649 | color: #31ac5f;
650 | }
651 |
652 | div.panel.border-left {
653 | border-left-color: var(--drk-border-color);
654 | }
655 |
656 | div.panel.border-right {
657 | border-right-color: var(--drk-border-color);
658 | }
659 |
660 | div.panel.border-bottom {
661 | border-bottom-color: var(--drk-border-color);
662 | }
663 |
664 | div.panel.triangle-down:after {
665 | border-top-color: var(--drk-bg-color-b);
666 | }
667 |
668 | div.panel.triangle-down:before {
669 | border-top-color: var(--drk-border-color);
670 | }
671 |
672 | div[data-control="media-manager"] .sidebar-image-placeholder {
673 | box-sizing: content-box;
674 | background-image: -webkit-linear-gradient(45deg, #efefef 25%, transparent 25%, transparent 75%, #efefef 75%, #efefef),
675 | -webkit-linear-gradient(45deg, #efefef 25%, transparent 25%, transparent 75%, #efefef 75%, #efefef);
676 | background-position: 0 0, 10px 10px;
677 | background-size: 21px 21px;
678 | background-color: #d2d2d2;
679 | }
680 |
681 | div[data-control="media-manager"] .sidebar-image-placeholder i.icon-level-up {
682 | color: #d16969;
683 | }
684 |
685 | div[data-control="media-manager"] .sidebar-image-placeholder p {
686 | color: #d16969;
687 | background: #fff;
688 | }
689 |
690 | #MediaManager-manager-filters .nav > li > a:hover,
691 | #MediaManager-manager-filters .nav > li > a:focus {
692 | background: var(--drk-bg-color-btn);
693 | color: var(--drk-color);
694 | }
695 |
696 | div[data-control="media-manager"] .media-list.list li {
697 | background: #555;
698 | border: 1px solid #777;
699 | }
700 |
701 | div[data-control="media-manager"] .media-list li h4 {
702 | color: #ff9800;
703 | }
704 |
705 | div[data-control="media-manager"] .media-list li[data-item-type="folder"] h4 {
706 | color: #d16969;
707 | }
708 |
709 | div[data-control="media-manager"] .media-list li[data-item-type="file"] h4 {
710 | color: #ffc107;
711 | }
712 |
713 | div[data-control="media-manager"] table.table tr[data-item-type=folder] i.icon-folder {
714 | color: #ce9178;
715 | }
716 |
717 | div[data-control="media-manager"] table.table tr[data-item-type=folder].selected i.icon-folder {
718 | color: inherit;
719 | }
720 |
721 | tr[data-item-type="file"] .item-title {
722 | color: #00ffff;
723 | }
724 |
725 | [data-control="preview-sidebar"] .panel [data-label="title"] {
726 | color: #d16969;
727 | }
728 |
729 | div[data-control="media-manager"] .upload-progress {
730 | background: inherit;
731 | }
732 |
733 | div[data-control="media-manager"] .upload-progress h5 {
734 | color: var(--drk-color);
735 | }
736 |
737 | /* END - backend/media */
738 |
739 |
740 | /* List - Список */
741 | .list-scrollable-container:after,
742 | .list-scrollable-container:before {
743 | background: var(--drk-bg-color-a);
744 | }
745 |
746 | .list-widget table {
747 | border-left: 1px solid var(--drk-border-color);
748 | }
749 |
750 | .control-table .control-scrollbar table.data tr:last-child td {
751 | border-bottom-color: var(--drk-border-color);
752 | }
753 |
754 | .control-filter {
755 | color: #fff;
756 | background-color: #1a2938;
757 | border-top: 1px solid #34495e;
758 | border-bottom: 1px solid #34495e;
759 | }
760 |
761 | table.table.data {
762 | border-bottom-color: var(--drk-border-color);
763 | }
764 |
765 | table.table.data thead {
766 | background: var(--drk-bg-color-b);
767 | }
768 |
769 | table.table.data tbody td,
770 | table.table.data tbody th {
771 | color: var(--drk-color);
772 | border-top: 1px solid var(--drk-border-color);
773 | }
774 |
775 | table.table.data tbody tr.active td {
776 | color: var(--drk-color);
777 | }
778 |
779 | table.table.data tbody tr.active td,
780 | table.table.data tbody tr.active th {
781 | background-color: #0e253c;
782 | }
783 |
784 | table.table.data tbody tr.rowlink:not(.nolink):active td {
785 | background: #395169 !important;
786 | color: var(--drk-color);
787 | ;
788 | }
789 |
790 | table.table.data tbody tr.rowlink:not(.nolink):hover td,
791 | table.table.data tbody tr:not(.no-data).selected td {
792 | background: #192634 !important;
793 | color: var(--drk-color);
794 | ;
795 | }
796 |
797 | table.table.data tbody tr:nth-child(even) td,
798 | table.table.data tbody tr:nth-child(even) th {
799 | background-color: #0c121a;
800 | }
801 |
802 | table.table.data thead td > a,
803 | table.table.data thead th > a,
804 | table.table.data thead td > span,
805 | table.table.data thead th > span {
806 | color: #deb887;
807 | }
808 |
809 | .control-list table.table.data .list-setup a {
810 | color: #deb887;
811 | }
812 |
813 | table.table.data thead td > a:hover,
814 | table.table.data thead th > a:hover,
815 | table.table.data thead td > span:hover,
816 | table.table.data thead th > span:hover {
817 | color: #daeb60;
818 | }
819 |
820 | .control-filter a,
821 | .control-filter .custom-checkbox label {
822 | color: #c3c3c3;
823 | }
824 |
825 | .control-filter > .filter-scope:hover,
826 | .control-filter > .filter-scope.active,
827 | .control-filter > .filter-scope:hover.custom-checkbox label,
828 | .control-filter > .filter-scope.active.custom-checkbox label {
829 | color: #cddc39;
830 | }
831 |
832 | .control-filter > .filter-scope:hover .filter-label,
833 | .control-filter > .filter-scope.active .filter-label {
834 | color: #cddc39;
835 | }
836 |
837 | .control-filter > .filter-has-popover:hover {
838 | color: #ffeb3b;
839 | }
840 |
841 | .control-filter > .filter-has-popover:hover .filter-label {
842 | color: #cddc39;
843 | }
844 |
845 | .control-filter-popover .filter-items {
846 | background-color: #353535;
847 | border-bottom-color: #3e71a5;
848 | }
849 |
850 | .control-filter-popover .filter-items a,
851 | .control-filter-popover .filter-active-items a {
852 | color: #999;
853 | }
854 |
855 | .control-filter-popover .filter-items,
856 | .control-filter-popover .filter-active-items {
857 | background-color: var(--drk-bg-color-b);
858 | }
859 |
860 | .control-filter-popover .filter-items a:hover,
861 | .control-filter-popover .filter-active-items a:hover {
862 | background-color: var(--drk-bg-color-c);
863 | color: var(--drk-color);
864 | }
865 |
866 |
867 | table.table.data thead td,
868 | table.table.data thead th {
869 | border-top: 1px solid #34495e !important;
870 | border-bottom: 1px solid #34495e !important;
871 | border-color: #0180ff;
872 | }
873 |
874 | table.table.data .list-checkbox {
875 | border-right: 1px solid #0180ff;
876 | }
877 |
878 | .table > thead > tr > td.active,
879 | .table > tbody > tr > td.active,
880 | .table > tfoot > tr > td.active,
881 | .table > thead > tr > th.active,
882 | .table > tbody > tr > th.active,
883 | .table > tfoot > tr > th.active,
884 | .table > thead > tr.active > td,
885 | .table > tbody > tr.active > td,
886 | .table > tfoot > tr.active > td,
887 | .table > thead > tr.active > th,
888 | .table > tbody > tr.active > th,
889 | .table > tfoot > tr.active > th {
890 | background-color: #1e1600;
891 | }
892 |
893 | table.table.data thead th.sort-asc.active {
894 | background: #1e261e;
895 | }
896 |
897 | table.table.data thead th.sort-desc.active {
898 | background: #34495e;
899 | }
900 |
901 | table.table.data tbody tr.active:nth-child(even) td,
902 | table.table.data tbody tr.active:nth-child(even) th {
903 | background-color: #0e253c;
904 | }
905 |
906 | .field-checkboxlist .field-checkboxlist-inner {
907 | background-color: var(--drk-bg-color-b);
908 | border-color: var(--drk-border-color);
909 | box-shadow: none;
910 | }
911 |
912 | .field-checkboxlist .checkboxlist-controls > div > a:hover > i {
913 | color: #1f99dc;
914 | }
915 |
916 | .custom-checkbox label:before,
917 | .custom-radio label:before {
918 | background-color: #8a8a8a;
919 | border: 1px solid #d6d6d6;
920 | box-shadow: none;
921 | }
922 |
923 | .field-fileupload.style-file-single {
924 | background-color: #000;
925 | border-color: var(--drk-border-color);
926 | -webkit-box-shadow: none;
927 | box-shadow: none;
928 | }
929 |
930 | .field-fileupload.style-file-multi .upload-object:nth-child(odd) {
931 | background-color: #3b3b3b;
932 | }
933 |
934 | .field-fileupload.style-file-multi .upload-object:nth-child(even) {
935 | background-color: #565656;
936 | }
937 |
938 | .field-fileupload.style-file-multi .upload-files-container {
939 | border: 1px solid #777;
940 | }
941 |
942 | .field-fileupload.style-file-multi .upload-object {
943 | border-bottom: 1px solid #777;
944 | }
945 |
946 | .field-fileupload.style-file-multi .upload-object .info h4,
947 | .field-fileupload.style-file-multi .upload-object .info p {
948 | color: #d6d6d6;
949 | }
950 |
951 | .field-fileupload .upload-object.is-error .info h4 {
952 | color: #ed1700;
953 | }
954 |
955 | .control-list p.no-data {
956 | color: #d7ba7d;
957 | }
958 |
959 |
960 | /* breadcrumb */
961 | .control-breadcrumb {
962 | background-color: var(--drk-bg-color-c);
963 | border: solid 1px var(--drk-border-color);
964 | }
965 |
966 | .control-breadcrumb li {
967 | background-color: var(--drk-bg-color-b);
968 | }
969 |
970 | .control-breadcrumb li:before {
971 | border-left: 15px solid var(--drk-bg-color-c);
972 | }
973 |
974 | .control-breadcrumb li:after {
975 | border-left: 15px solid var(--drk-bg-color-b);
976 | }
977 |
978 | .control-breadcrumb li:last-child {
979 | background-color: transparent;
980 | color: var(--drk-color);
981 | }
982 |
983 | /* END - breadcrumb */
984 |
985 |
986 |
987 | /* Form */
988 | .loading-indicator-container .loading-indicator {
989 | background-color: var(--drk-bg-color-a);
990 | }
991 |
992 | label {
993 | color: var(--drk-color);
994 | }
995 |
996 | .help-block {
997 | color: #a0a0a0;
998 | }
999 |
1000 | .form-control {
1001 | color: var(--drk-color);
1002 | background-color: #010409;
1003 | border-color: var(--drk-border-color);
1004 | box-shadow: 0 0 transparent;
1005 | }
1006 |
1007 | .custom-switch input:checked~span {
1008 | background-color: #238636;
1009 | }
1010 |
1011 | div[data-control="sensitive"] a[data-toggle],
1012 | div[data-control="sensitive"] a[data-copy] {
1013 | background-color: var(--drk-bg-color-inset);
1014 | color: var(--drk-color);
1015 | border-color: var(--drk-border-color);
1016 | }
1017 |
1018 | .field-recordfinder {
1019 | border-color: var(--drk-border-color);
1020 | }
1021 |
1022 | .field-section h4 {
1023 | color: #fa8072;
1024 | }
1025 |
1026 | .form-control[disabled],
1027 | .form-control[readonly],
1028 | fieldset[disabled] .form-control {
1029 | background-color: #010409 !important;
1030 | color: var(--drk-color);
1031 | }
1032 |
1033 | .field-codeeditor {
1034 | border: 2px solid #27709c;
1035 | }
1036 |
1037 | .field-repeater .field-repeater-add-item {
1038 | border-color: var(--drk-border-color);
1039 | }
1040 |
1041 | .field-repeater li.field-repeater-item {
1042 | background: var(--drk-bg-color-b);
1043 | border-color: var(--drk-border-color);
1044 | box-shadow: none;
1045 | }
1046 |
1047 | .field-fileupload.style-image-multi .upload-object {
1048 | background: #313131;
1049 | border: 1px solid #7b7b7b;
1050 | }
1051 |
1052 | .field-fileupload .upload-object h4 {
1053 | color: #d7ba7d;
1054 | }
1055 |
1056 | .field-mediafinder.style-image-single .find-button {
1057 | background: #43474a;
1058 | border: 2px dotted #898989;
1059 | }
1060 |
1061 | .field-fileupload.style-image-single .upload-button,
1062 | .field-fileupload.style-image-multi .upload-button {
1063 | background-color: #43474a;
1064 | }
1065 |
1066 | .field-mediafinder.style-image-single .find-button .find-button-icon:before {
1067 | color: var(--drk-color);
1068 | }
1069 |
1070 | .field-mediafinder.style-file-single {
1071 | background-color: #43474a;
1072 | border: 1px solid var(--drk-border-color);
1073 | box-shadow: inset 0 1px 0 #6a6a6a, 0 1px 0 #6a6a6a;
1074 | }
1075 |
1076 | .field-mediafinder.style-file-single .find-button {
1077 | color: #bbb;
1078 | }
1079 |
1080 | .field-mediafinder.style-file-single .find-button:hover {
1081 | color: var(--drk-color);
1082 | background-color: var(--drk-bg-color-btn);
1083 | }
1084 |
1085 | .field-mediafinder .find-object h4 {
1086 | color: #ff7f50;
1087 | }
1088 |
1089 | .select2-container--default .select2-selection--multiple .select2-selection__choice {
1090 | color: var(--drk-color);
1091 | background: rgb(56 139 253 / 15%);
1092 | border-color: var(--drk-border-color);
1093 | }
1094 |
1095 | .select2-container--default .select2-selection--multiple .select2-search--inline .select2-search__field {
1096 | color: var(--drk-color);
1097 | }
1098 |
1099 | .field-fileupload .upload-object .info h4 a,
1100 | .field-fileupload .upload-object .meta a.upload-remove-button,
1101 | .field-fileupload .upload-object .meta a.drag-handle {
1102 | color: #ef0319;
1103 | }
1104 |
1105 | .form-preview {
1106 | background: #343434;
1107 | border: 1px solid #626262;
1108 | }
1109 |
1110 | .nested-form.panel-styles {
1111 | background: var(--drk-bg-color-c);
1112 | border-color: var(--drk-border-color);
1113 | box-shadow: inset 0 1px 0 rgb(0 154 247 / 25%), 0 1px 0 rgb(30 94 145);
1114 | }
1115 |
1116 | .field-section {
1117 | border-bottom-color: var(--drk-border-color);
1118 | }
1119 |
1120 | /* END - Form */
1121 |
1122 | /* texteditors */
1123 | .fr-box.fr-basic .fr-wrapper,
1124 | .ace-github,
1125 | .field-markdowneditor {
1126 | background: var(--drk-bg-color-b);
1127 | }
1128 | .fr-box.fr-basic .fr-element,
1129 | .ace-github,
1130 | .ace-github .ace_cursor {
1131 | color: var(--drk-color);
1132 | }
1133 | .ace-github .ace_marker-layer .ace_selection {
1134 | background: var(--drk-bg-color-selection);
1135 | }
1136 |
1137 | /* control-popover */
1138 | div.control-popover > div {
1139 | background: var(--drk-bg-color-c);
1140 | border: 1px solid var(--drk-border-color);
1141 | box-shadow: var(--drk-box-shadow);
1142 | }
1143 |
1144 | div.control-popover.placement-bottom > div:before {
1145 | border-bottom-color: var(--drk-border-color);
1146 | }
1147 |
1148 | div.control-popover.placement-bottom > div:after {
1149 | border-bottom-color: #010409;
1150 | }
1151 |
1152 | div.control-popover .popover-head {
1153 | background: var(--drk-bg-color-b);
1154 | color: var(--drk-color);
1155 | border-top-right-radius: 6px;
1156 | border-top-left-radius: 6px;
1157 | }
1158 |
1159 | div.control-popover .popover-head h3 {
1160 | font-weight: 600;
1161 | }
1162 |
1163 | div.control-popover .popover-head p {
1164 | color: #bdb884;
1165 | }
1166 |
1167 | div.control-popover .popover-head .close {
1168 | color: #8b8b8b;
1169 | }
1170 |
1171 | div.control-popover.placement-left .popover-head:before {
1172 | border-left-color: var(--drk-border-color);
1173 | right: -9px;
1174 | }
1175 |
1176 | div.control-popover.placement-left .popover-head:after {
1177 | position: absolute;
1178 | content: '';
1179 | display: block;
1180 | width: 0;
1181 | height: 0;
1182 | border-top: 7.5px solid transparent;
1183 | border-bottom: 7.5px solid transparent;
1184 | border-left: 8px solid #f9f9f9;
1185 | right: -8px;
1186 | top: 7px;
1187 | border-left-color: var(--drk-bg-color-b);
1188 | z-index: 602;
1189 | }
1190 |
1191 | div.control-popover.placement-bottom .popover-head:before {
1192 | border-bottom-color: var(--drk-bg-color-b);
1193 | }
1194 |
1195 | div.control-popover.placement-bottom .popover-head:after {
1196 | content: '';
1197 | display: block;
1198 | width: 0;
1199 | height: 0;
1200 | border-left: 8.5px solid transparent;
1201 | border-right: 8.5px solid transparent;
1202 | border-bottom: 9px solid var(--drk-border-color);
1203 | left: 14px;
1204 | top: -10px;
1205 | position: absolute;
1206 | }
1207 |
1208 | .inspector-fields th {
1209 | color: #c5c5c5;
1210 | }
1211 |
1212 | .inspector-fields td,
1213 | .inspector-fields th {
1214 | border-bottom-color: var(--drk-border-color);
1215 | }
1216 |
1217 | .inspector-fields td {
1218 | border-left-color: var(--drk-border-color);
1219 | background: var(--drk-bg-color-c);
1220 | }
1221 |
1222 | .inspector-fields td.text.active {
1223 | background: var(--drk-bg-color-c);
1224 | }
1225 |
1226 | .inspector-fields input[type=text] {
1227 | background: var(--drk-bg-color-c);
1228 | color: var(--drk-color);
1229 | }
1230 |
1231 | .inspector-fields td div.external-param-editor-container.editor-visible div.external-editor div.controls input {
1232 | background: var(--drk-bg-color-c);
1233 | }
1234 |
1235 | .select2-dropdown.ocInspectorDropdown .select2-search {
1236 | border-bottom-color: var(--drk-border-color);
1237 | }
1238 |
1239 | div.control-popover .select2-container--default .select2-selection {
1240 | background-color: var(--drk-bg-color-c);
1241 | }
1242 |
1243 | div.control-popover.popover-danger .popover-head {
1244 | background-image: linear-gradient(rgb(248 81 73 / 15%), rgb(248 81 73 / 15%));
1245 | }
1246 |
1247 | div.control-popover.popover-danger > div {
1248 | background-image: linear-gradient(rgb(248 81 73 / 15%), rgb(248 81 73 / 15%));
1249 | border-color: #9f0700;
1250 | }
1251 |
1252 | div.control-popover.popover-danger.placement-top .popover-head:before {
1253 | display: none;
1254 | }
1255 |
1256 | div.control-popover.popover-danger.placement-top > div:after {
1257 | border-top-color: #9f0700;
1258 | }
1259 |
1260 |
1261 | /* alert */
1262 | .sweet-alert {
1263 | background-color: var(--drk-bg-color-a);
1264 | color: var(--drk-color);
1265 | border: solid 1px var(--drk-border-color);
1266 | box-shadow: var(--drk-box-shadow);
1267 | }
1268 |
1269 | .sweet-alert h2 {
1270 | color: var(--drk-color);
1271 | }
1272 |
1273 |
1274 | /* Modals */
1275 | .modal-content {
1276 | background: var(--drk-bg-color-a);
1277 | color: var(--drk-color);
1278 | border: solid 1px var(--drk-border-color);
1279 | box-shadow: var(--drk-box-shadow);
1280 | }
1281 |
1282 | .modal-header {
1283 | color: #e0dfdf;
1284 | }
1285 |
1286 | .list-preview {
1287 | background: var(--drk-bg-color-c);
1288 | border-color: var(--drk-border-color);
1289 | }
1290 |
1291 | .control-simplelist {
1292 | background: var(--drk-bg-color-c);
1293 | }
1294 |
1295 | div.popover-overlay {
1296 | background: rgb(0 0 0 / 50%);
1297 | }
1298 |
1299 |
1300 | /* Flash message */
1301 | .flash-message {
1302 | background: var(--drk-bg-color-a);
1303 | color: var(--drk-color);
1304 | border-style: solid;
1305 | border-width: 1px;
1306 | box-shadow: var(--drk-box-shadow);
1307 | }
1308 |
1309 | .flash-message.success {
1310 | background-image: linear-gradient(rgb(46 160 67 / 15%), rgb(46 160 67 / 15%));
1311 | border-color: rgb(46 160 67 / 40%);
1312 | }
1313 |
1314 | .flash-message.info {
1315 | background-image: linear-gradient(rgb(56 139 253 / 15%), rgb(56 139 253 / 15%));
1316 | border-color: rgb(56 139 253 / 40%);
1317 | }
1318 |
1319 | .flash-message.warning {
1320 | background-image: linear-gradient(rgb(187 128 9 / 15%), rgb(187 128 9 / 15%));
1321 | border-color: rgb(187 128 9 / 40%);
1322 | }
1323 |
1324 | .flash-message.error {
1325 | background-image: linear-gradient(rgb(248 81 73 / 15%), rgb(248 81 73 / 15%));
1326 | border-color: rgb(248 81 73 / 40%);
1327 | }
1328 |
1329 |
1330 | /* Callout */
1331 | .callout > .header {
1332 | background: var(--drk-bg-color-a);
1333 | color: var(--drk-color);
1334 | border-style: solid;
1335 | }
1336 |
1337 | .callout.callout-success > .header {
1338 | background-image: linear-gradient(rgb(46 160 67 / 15%), rgb(46 160 67 / 15%));
1339 | border-color: rgb(46 160 67 / 40%);
1340 | }
1341 |
1342 | .callout.callout-info > .header {
1343 | background-image: linear-gradient(rgb(56 139 253 / 15%), rgb(56 139 253 / 15%));
1344 | border-color: rgb(56 139 253 / 40%);
1345 | }
1346 |
1347 | .callout.callout-warning > .header {
1348 | background-image: linear-gradient(rgb(187 128 9 / 15%), rgb(187 128 9 / 15%));
1349 | border-color: rgb(187 128 9 / 40%);
1350 | }
1351 |
1352 | .callout.callout-danger > .header {
1353 | background-image: linear-gradient(rgb(248 81 73 / 15%), rgb(248 81 73 / 15%));
1354 | border-color: rgb(248 81 73 / 40%);
1355 | }
1356 |
1357 | .callout .content {
1358 | background: var(--drk-bg-color-a);
1359 | color: var(--drk-color);
1360 | }
1361 |
1362 | .callout .content a {
1363 | color: #58a6ff;
1364 | }
1365 |
1366 | .callout .content ::marker {
1367 | color: var(--drk-color);
1368 | }
1369 |
1370 | .callout.callout-success > .content {
1371 | background-image: linear-gradient(rgb(46 160 67 / 15%), rgb(46 160 67 / 15%));
1372 | border-color: rgb(46 160 67 / 40%);
1373 | }
1374 |
1375 | .callout.callout-info > .content {
1376 | background-image: linear-gradient(rgb(56 139 253 / 15%), rgb(56 139 253 / 15%));
1377 | border-color: rgb(56 139 253 / 40%);
1378 | }
1379 |
1380 | .callout.callout-warning > .content {
1381 | background-image: linear-gradient(rgb(187 128 9 / 15%), rgb(187 128 9 / 15%));
1382 | border-color: rgb(187 128 9 / 40%);
1383 | }
1384 |
1385 | .callout.callout-warning > .header+.content {
1386 | background-color: var(--drk-bg-color-a);
1387 | background-image: none;
1388 | }
1389 |
1390 | .callout.callout-danger > .content {
1391 | background-image: linear-gradient(rgb(248 81 73 / 15%), rgb(248 81 73 / 15%));
1392 | border-color: rgb(248 81 73 / 40%);
1393 | }
1394 |
1395 |
1396 | /* permission editor */
1397 | .permissioneditor table th {
1398 | color: var(--drk-color);
1399 | border-bottom: 1px solid var(--drk-border-color);
1400 | font-weight: 600;
1401 | font-size: 16px;
1402 | }
1403 |
1404 | .permissioneditor table td {
1405 | border-bottom: 1px solid var(--drk-bg-color-b);
1406 | }
1407 |
1408 | .permissioneditor table tr:hover td {
1409 | background: var(--drk-bg-color-b);
1410 | }
1411 |
1412 | .permissioneditor table td.permission-name {
1413 | color: #3fb950;
1414 | }
1415 |
1416 |
1417 | /* theme-selector-layout - /backend/cms/themes */
1418 | .theme-selector-layout .theme-thumbnail {
1419 | background: #10161e;
1420 | }
1421 |
1422 | .theme-selector-layout .layout-row.active .theme-thumbnail {
1423 | background: #081934;
1424 | }
1425 |
1426 | .theme-selector-layout .layout-row.active .thumbnail-container:after {
1427 | border-left-color: #081934;
1428 | }
1429 |
1430 | .theme-selector-layout .layout-row.links .theme-thumbnail {
1431 | border-bottom: 1px solid var(--drk-border-color);
1432 | }
1433 |
1434 | .theme-selector-layout .create-new-theme,
1435 | .theme-selector-layout .find-more-themes {
1436 | background: #263baf;
1437 | color: var(--drk-color);
1438 | }
1439 |
1440 | .theme-selector-layout .create-new-theme:hover,
1441 | .theme-selector-layout .find-more-themes:hover {
1442 | background: #283fc2;
1443 | }
1444 |
1445 | .theme-selector-layout .theme-description h3 {
1446 | color: #f9e23d;
1447 | }
1448 |
1449 | .theme-selector-layout .theme-description p.description {
1450 | color: var(--drk-color);
1451 | }
1452 |
1453 | .theme-selector-layout .layout-row.links .theme-description {
1454 | border-bottom: 1px solid var(--drk-border-color);
1455 | }
1456 |
1457 |
1458 | /* Tabs */
1459 | .control-tabs.primary-tabs {
1460 | > div > ul.nav-tabs > li a > span.title {
1461 | padding: 2px 25px 0px 25px;
1462 | }
1463 |
1464 | > ul.nav-tabs,
1465 | > div > ul.nav-tabs,
1466 | > div > div > ul.nav-tabs {
1467 | &:before {
1468 | border-bottom: 2px solid #555;
1469 | }
1470 |
1471 | li {
1472 | a > span.title {
1473 | background-color: var(--drk-bg-color-a) !important;
1474 |
1475 | &:before {
1476 | border-left: 2px solid #555;
1477 | }
1478 |
1479 | &:after {
1480 | border-right: 2px solid #555;
1481 | }
1482 |
1483 | &:before,
1484 | &:after {
1485 | background: var(--drk-bg-color-a) !important;
1486 | border-width: 2px !important;
1487 | border: none;
1488 | }
1489 | }
1490 |
1491 | &.active {
1492 | a {
1493 | --drk-bg-color-a: #555;
1494 |
1495 | &:before {
1496 | background-color: var(--drk-bg-color-a);
1497 | }
1498 |
1499 | > span.title {
1500 | &:before,
1501 | &:after {
1502 | border-color: #555;
1503 | }
1504 |
1505 | span {
1506 | color: #fff;
1507 | }
1508 | }
1509 | }
1510 | }
1511 | }
1512 | }
1513 | }
1514 |
1515 | .control-tabs > ul.nav-tabs > li.active a,
1516 | .control-tabs > div > ul.nav-tabs > li.active a,
1517 | .control-tabs > div > div > ul.nav-tabs > li.active a,
1518 | .control-tabs > ul.nav-tabs > li.active a:hover,
1519 | .control-tabs > div > ul.nav-tabs > li.active a:hover,
1520 | .control-tabs > div > div > ul.nav-tabs > li.active a:hover {
1521 | color: #ffd700;
1522 | }
1523 |
1524 | .control-tabs > div > ul.nav-tabs > li a {
1525 | color: #8194a5;
1526 | }
1527 |
1528 | .control-tabs > div > ul.nav-tabs > li a:hover {
1529 | color: #b2bfca;
1530 | }
1531 |
1532 | .layout-cell.w-300.form-sidebar.control-scrollpanel {
1533 | background-color: var(--drk-bg-color-c);
1534 | border-left: 1px solid var(--drk-border-color);
1535 | }
1536 |
1537 | .control-tabs.content-tabs > .tab-content > .tab-pane div.list-header,
1538 | .control-tabs.content-tabs > .tab-content > .tab-pane div.padded-container,
1539 | .control-tabs.content-tabs > .tab-content > .tab-pane div.toolbar-widget {
1540 | background: #15232c;
1541 | }
1542 |
1543 | .control-tabs.content-tabs > ul.nav-tabs li.active {
1544 | background: var(--drk-bg-color-c);
1545 | }
1546 |
1547 | .control-tabs.content-tabs > ul.nav-tabs li {
1548 | border-top-color: var(--drk-border-color);
1549 | border-right-color: var(--drk-border-color);
1550 | }
1551 |
1552 | .control-tabs.content-tabs > ul.nav-tabs li:first-child {
1553 | border-left-color: var(--drk-border-color);
1554 | }
1555 |
1556 | .control-tabs.content-tabs > ul.nav-tabs:before {
1557 | background: #565656;
1558 | }
1559 |
1560 | .control-tabs > div > ul.nav-tabs > li a > span.title > span {
1561 | border-top: 2px solid #555;
1562 | }
1563 |
1564 | .control-tabs.primary-tabs > div > ul.nav-tabs > li.active a > span.title:before,
1565 | .control-tabs.primary-tabs > div > ul.nav-tabs > li.active a > span.title:after {
1566 | background: var(--drk-bg-color-a);
1567 | }
1568 |
1569 | .control-tabs > div > ul.nav-tabs > li a > span.title > span {
1570 | margin-top: -2px;
1571 | }
1572 |
1573 | .control-tabs.secondary-tabs > div > ul.nav-tabs > li a > span.title > span {
1574 | border-top: 0;
1575 | }
1576 |
1577 | /* End - Tabs */
1578 |
1579 |
1580 | /* control-table */
1581 | .control-table .table-container {
1582 | border-color: var(--drk-border-color);
1583 | }
1584 |
1585 | .control-table .toolbar {
1586 | background: var(--drk-bg-color-b);
1587 | border-bottom-color: var(--drk-border-color);
1588 | }
1589 |
1590 | .control-table.active .toolbar {
1591 | border-bottom-color: #028dff;
1592 | }
1593 |
1594 | .control-table .toolbar a.btn {
1595 | color: var(--drk-color);
1596 | border: 0;
1597 | }
1598 |
1599 | .control-table table.headers th {
1600 | color: var(--drk-color);
1601 | background: #0d1520;
1602 | border-right-color: var(--drk-border-color);
1603 | }
1604 |
1605 | .control-table.active table.headers:after {
1606 | border-bottom-color: var(--drk-border-color);
1607 | }
1608 |
1609 | .control-table table.data tr {
1610 | background-color: var(--drk-bg-color-b);
1611 | }
1612 |
1613 | .control-table table.data tr:nth-child(2n) {
1614 | background-color: #121922;
1615 | }
1616 |
1617 | .control-table table.data td {
1618 | border-color: var(--drk-border-color);
1619 | }
1620 |
1621 | .control-table td[data-column-type=string] input[type=text] {
1622 | background: var(--drk-bg-color-inset);
1623 | }
1624 |
1625 | .control-table table td,
1626 | .control-table table th {
1627 | color: var(--drk-color);
1628 | }
1629 |
1630 | .control-table td[data-column-type=checkbox] div[data-checkbox-element] {
1631 | background-color: #3c3a3a;
1632 | border-color: var(--drk-border-color);
1633 | }
1634 |
1635 |
1636 | /* eventlogs */
1637 | .plugin-exception-beautifier .beautifier-message-container {
1638 | background: var(--drk-bg-color-c);
1639 | }
1640 |
1641 | .plugin-exception-beautifier .beautifier-formatted-content,
1642 | .plugin-exception-beautifier .beautifier-raw-content {
1643 | background: var(--drk-bg-color-c);
1644 | }
1645 |
1646 | .plugin-exception-beautifier .beautifier-class {
1647 | color: #7d8f5a;
1648 | }
1649 |
1650 | .plugin-exception-beautifier .beautifier-stacktrace-line:nth-child(odd) {
1651 | background-color: var(--drk-bg-color-b);
1652 | }
1653 |
1654 | .plugin-exception-beautifier .beautifier-stacktrace-line:nth-child(even) {
1655 | background-color: var(--drk-bg-color-a);
1656 | }
1657 |
1658 | .plugin-exception-beautifier .beautifier-stacktrace-line-number {
1659 | color: var(--drk-color);
1660 | }
1661 |
1662 | .plugin-exception-beautifier .beautifier-file {
1663 | color: #03a9f4;
1664 | }
1665 |
1666 | .plugin-exception-beautifier .beautifier-line-number {
1667 | color: red;
1668 | }
1669 |
1670 | /* Import/Export */
1671 | .import-behavior .import-file-columns,
1672 | .import-behavior .import-db-columns {
1673 | background: var(--drk-bg-color-c);
1674 | }
1675 |
1676 | .import-behavior ul li.dragged,
1677 | .import-behavior .import-file-columns > ul > li,
1678 | .import-behavior .import-db-columns > ul > li {
1679 | background: var(--drk-bg-color-a);
1680 | border-color: var(--drk-border-color);
1681 | }
1682 |
1683 | .field-fileupload.style-file-single .upload-button:hover {
1684 | color: var(--drk-color);
1685 | }
1686 |
1687 | .export-behavior .export-columns {
1688 | background: #010409;
1689 | border: solid 1px var(--drk-border-color);
1690 | }
1691 |
1692 | .import-behavior .import-file-columns > ul div.import-column-name a.column-label {
1693 | color: var(--drk-color);
1694 | }
1695 |
1696 | .import-behavior .import-column-bindings > ul {
1697 | background: var(--drk-bg-color-c);
1698 | }
1699 |
1700 | .import-behavior .import-column-bindings > ul:after {
1701 | border-left-color: var(--drk-bg-color-a);
1702 | }
1703 |
1704 | .import-behavior .import-column-bindings > ul:before {
1705 | color: #8b7964;
1706 | }
1707 |
1708 | .import-behavior .import-column-bindings > ul > li:not(.dragged) {
1709 | background: var(--drk-bg-color-b);
1710 | }
1711 |
1712 | .import-behavior .import-file-columns > ul div.import-column-name a.column-ignore-button {
1713 | background: var(--drk-border-color);
1714 | }
1715 |
1716 | .import-behavior .import-column-bindings > ul > li:hover .column-icon {
1717 | color: var(--drk-color);
1718 | }
1719 |
1720 | /* Winter.Notes */
1721 | .field-notes .field-notes-list {
1722 | background-color: var(--drk-bg-color-b);
1723 | }
1724 |
1725 | .field-notes .field-notes-form {
1726 | background-color: var(--drk-bg-color-a);
1727 | }
1728 |
1729 | .field-notes .field-notes-list > ul .checked {
1730 | background-color: var(--drk-bg-color-c);
1731 | color: var(--drk-color);
1732 | }
1733 |
1734 | .field-notes .toolbar .btn-icon {
1735 | background: var(--drk-bg-color-btn);
1736 | border-color: var(--drk-border-color);
1737 | }
1738 |
1739 | .field-notes .toolbar .btn-icon:hover {
1740 | background: #0654ca;
1741 | }
1742 |
1743 | .field-notes .toolbar [class*=" oc-icon-"]:before {
1744 | color: var(--drk-color);
1745 | }
1746 |
1747 | .field-notes .field-notes-list > ul > li a {
1748 | color: var(--drk-color);
1749 | }
1750 |
1751 | .field-notes .field-notes-list > ul > li div h4 span {
1752 | color: #777;
1753 | }
1754 |
1755 | .field-notes .field-notes-list > ul > li a h3 {
1756 | font-weight: 600;
1757 | }
1758 |
1759 | .field-notes .field-notes-list > ul > li {
1760 | border-color: var(--drk-border-color);
1761 | }
1762 |
1763 |
1764 | /* Widget Winter.User Statistics */
1765 | .user-statistics-widget {
1766 | background: #000;
1767 | }
1768 |
1769 | .table-user-statistics {
1770 | margin-top: 20px;
1771 | }
1772 |
1773 | .users-statistics-item-total,
1774 | .users-statistics-item-activated,
1775 | .users-statistics-item-banned {
1776 | background: inherit;
1777 | }
1778 |
1779 | .users-statistics-item-total {
1780 | color: aqua
1781 | }
1782 |
1783 | .users-statistics-item-activated {
1784 | color: greenyellow
1785 | }
1786 |
1787 | .users-statistics-item-banned {
1788 | color: orangered
1789 | }
1790 |
1791 | .table-user-statistics td:not(:first-child) {
1792 | color: cyan
1793 | }
1794 |
1795 |
1796 | /* Winter.Builder */
1797 | .fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active[data-tab-id="welcome"] a > span.title,
1798 | .fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active[data-tab-id="welcome"] a > span.title:before,
1799 | .fancy-layout.control-tabs.master-tabs > div > div.tabs-container > ul.nav-tabs > li.active[data-tab-id="welcome"] a > span.title:after {
1800 | background: var(--drk-bg-color-a);
1801 | }
1802 |
1803 | #layout-side-panel div.control-toolbar.separator,
1804 | .compact-toolbar div.control-toolbar.separator {
1805 | border-bottom-color: var(--drk-border-color);
1806 | }
1807 |
1808 | #layout-side-panel div.control-toolbar input.form-control,
1809 | .compact-toolbar div.control-toolbar input.form-control {
1810 | -webkit-box-shadow: inset 0 1px 0 var(--drk-border-color);
1811 | box-shadow: inset 0 1px 0 var(--drk-border-color);
1812 | }
1813 |
1814 | #layout-side-panel .sidepanel-content-header {
1815 | background: #184d70;
1816 | color: var(--drk-color);
1817 | }
1818 |
1819 | #layout-side-panel .sidepanel-content-header:after {
1820 | border-top-color: #184d70;
1821 | }
1822 |
1823 | #layout-side-panel.layout-cell.w-350 {
1824 | background: var(--drk-bg-color-c);
1825 | }
1826 |
1827 | .inspector-header {
1828 | background: var(--drk-bg-color-b);
1829 | color: var(--drk-color);
1830 | border-bottom-color: var(--drk-border-color);
1831 | }
1832 |
1833 | .inspector-header h3 {
1834 | font-weight: 600;
1835 | }
1836 |
1837 | .inspector-header span:hover,
1838 | .inspector-header a:hover {
1839 | color: var(--drk-color);
1840 | }
1841 |
1842 | .inspector-header span,
1843 | .inspector-header a {
1844 | color: var(--drk-color);
1845 | }
1846 |
1847 | .inspector-fields {
1848 | background: var(--drk-bg-color-c);
1849 | }
1850 |
1851 | .inspector-fields tr.group th {
1852 | background: var(--drk-bg-color-b);
1853 | }
1854 |
1855 | .inspector-fields th > div a.expandControl span:after {
1856 | color: var(--drk-color);
1857 | }
1858 |
1859 | .inspector-fields td.trigger-cell a.trigger {
1860 | color: #707070;
1861 | }
1862 |
1863 | .inspector-fields .select2-container--default .select2-selection {
1864 | background-color: var(--drk-bg-color-c);
1865 | }
1866 |
1867 | .inspector-fields tr.invalid th {
1868 | color: var(--drk-color-danger) !important;
1869 | }
1870 |
1871 | .fancy-layout .form-tabless-fields a.btn.btn-primary {
1872 | border: none;
1873 | color: var(--drk-color);
1874 | background: transparent;
1875 | }
1876 |
1877 | #builder-master-tabs .control-tabs > div > ul.nav-tabs > li a > span.title > span {
1878 | border-top: 0;
1879 | }
1880 |
1881 | .control-table table.headers:after {
1882 | border-bottom-color: var(--drk-border-color);
1883 | }
1884 |
1885 |
1886 | /* Winter.Docs */
1887 | #docs-content h1,
1888 | #docs-content h2 {
1889 | border-bottom-color: var(--drk-border-color);
1890 | }
1891 |
1892 | #docs-content table tr {
1893 | background-color: var(--drk-bg-color-b);
1894 | }
1895 |
1896 | #docs-content table tr:nth-child(2n) {
1897 | background-color: var(--drk-bg-color-c);
1898 | }
1899 |
1900 | #docs-content table th,
1901 | #docs-content table td {
1902 | border-color: var(--drk-border-color);
1903 | }
1904 |
1905 | #docs-content blockquote {
1906 | background: var(--drk-bg-color-b);
1907 | border-color: var(--drk-border-color);
1908 | color: var(--drk-color);
1909 | }
1910 |
1911 | #docs-content code {
1912 | display: inline-block;
1913 | padding: 0.2em 0.4em;
1914 | margin: 0;
1915 | font-size: 85%;
1916 | background: rgb(110 118 129 / 40%);
1917 | border-radius: 6px;
1918 | color: #c9d1d9;
1919 | border: 0;
1920 | }
1921 |
1922 | #docs-content pre code {
1923 | background: #2c2f38;
1924 | }
1925 | }
1926 |
--------------------------------------------------------------------------------