diff --git a/Build/Resources/Public/Less/Component/avatar.less b/Build/Resources/Public/Less/Component/avatar.less index 0d1d67f99f9eac6822bec32722a8ea5e8ccce5a5..82254c0388ab5757221abf1fb17683d7a79919b4 100644 --- a/Build/Resources/Public/Less/Component/avatar.less +++ b/Build/Resources/Public/Less/Component/avatar.less @@ -85,21 +85,3 @@ height: @avatar-size / 2; width: @avatar-size / 2; } - - -// -// Avatar in dropdowns -// -.dropdown-toggle { - > .avatar { - height: @avatar-dropdown-size; - width: @avatar-dropdown-size; - float: left; - margin-right: 0.5em; - margin-top: -@avatar-dropdown-correction; - } - .avatar-image { - height: @avatar-dropdown-size; - width: @avatar-dropdown-size; - } -} \ No newline at end of file diff --git a/Build/Resources/Public/Less/Component/dropdown.less b/Build/Resources/Public/Less/Component/dropdown.less new file mode 100644 index 0000000000000000000000000000000000000000..5ad19a0071b60ecd4398b7c7b970845150a38ce1 --- /dev/null +++ b/Build/Resources/Public/Less/Component/dropdown.less @@ -0,0 +1,125 @@ +// +// Dropdowns +// +.dropdown-menu { + line-height: 1.45em; + border: 0; + margin: 0; + border-radius: 0; + a { + display: block; + &:hover { + text-decoration: none; + } + } + hr { + border-top: 1px solid rgba(0,0,0,0.25); + margin: 1.25em -15px; + } + > *:last-child { + margin-bottom: 0; + } + .form-group { + margin-bottom: 0.75em; + } + .form-control { + border-color: #aaaaaa; + color: inherit; + border-radius: 0; + background-color: #333333; + &:focus { + box-shadow: none; + border-color: #bbbbbb; + } + } + .btn { + border: none; + border-radius: 0; + padding: 6px 10px; + } +} +.dropdown-headline { + font-size: 1.15em; + margin-top: 0; + margin-bottom: 0.5em; +} +.dropdown-text { + a { + display: inline-block; + } +} +div.dropdown-menu { + padding: 1.5em; +} +.dropdown-list { + .list-unstyled(); + > li { + &:extend(.clearfix all); + position: relative; + } + > li + li { + margin-top: 0.5em; + } +} +.dropdown-list-link { + display: block; + text-decoration: none; + &:hover, + &:focus { + text-decoration: none; + } +} + +// +// Dropdown Table +// +.dropdown-table { + display: table; + width: 100%; +} +.dropdown-table-row { + display: table-row; +} +.dropdown-table-column { + display: table-cell; + padding-top: 0.25em; + padding-bottom: 0.25em; + vertical-align: middle; +} +.dropdown-table-column-top { + vertical-align: top; +} +.dropdown-table-icon { + width: 16px; + padding-right: 0.5em; +} +.dropdown-table-title { + white-space: nowrap; + padding-right: 1.5em; +} +.dropdown-table-title-ellipsis { + max-width: 230px; + overflow: hidden; + display: block; + white-space: nowrap; + text-overflow: ellipsis; +} +.dropdown-table-actions { + white-space: nowrap; + text-align: right; +} +.dropdown-table-actions-btn { + text-align: center; + display: inline-block!important; + margin-top: -4px; + margin-bottom: -4px; + padding: 4px; + vertical-align: middle; +} +.dropdown-table-actions-btn-close:hover, +.dropdown-table-actions-btn-edit:hover { + background-color: @brand-notice; +} +.dropdown-table-actions-btn-delete:hover { + background-color: @brand-danger; +} diff --git a/Build/Resources/Public/Less/Component/module.less b/Build/Resources/Public/Less/Component/module.less index ce64d250794aa61e403c2697b9d6609fa885d51c..e033e4a82a66ac7d70a803367739951f8db712af 100644 --- a/Build/Resources/Public/Less/Component/module.less +++ b/Build/Resources/Public/Less/Component/module.less @@ -130,6 +130,7 @@ } .container-small { max-width: 768px; + margin: 0 auto; } } .module-docheader + .module-body { diff --git a/Build/Resources/Public/Less/Scaffold/_modulemenu.less b/Build/Resources/Public/Less/Scaffold/_modulemenu.less new file mode 100644 index 0000000000000000000000000000000000000000..3953cee50e0285afe26166dea19b44fd3dc5a2d9 --- /dev/null +++ b/Build/Resources/Public/Less/Scaffold/_modulemenu.less @@ -0,0 +1,103 @@ +// +// Module menu +// + +// Module links +@modulemenu-item-padding-vertical: 2px; +@modulemenu-item-padding-horizontal: 4px; + +// Module menu wrapper +.module-wrapper { + position: relative; + iframe { + border: none; + } +} + +// Module menu styling +.modulemenu { + + /// Module menu group + .modulemenu-group-container { + clear: both; + &:extend(.list-unstyled all); + } + .modulemenu-group { + position: relative; + padding: 5px 0; + border-bottom: 1px solid rgba(0,0,0,0.2); + } + .modulemenu-group-header, + .modulemenu-item-link { + &:extend(.clearfix all); + position: relative; + display: block; + cursor: pointer; + padding: @modulemenu-item-padding-vertical @modulemenu-item-padding-horizontal; + text-decoration: none; + } + .modulemenu-group-header { + user-select: none; + text-transform: uppercase; + } + .modulemenu-item-link { + &:focus, + &:hover { + outline: none; + background-color: rgba(0,0,0,0.1); + } + } + .modulemenu-item.active { + .modulemenu-item-link { + background-color: rgba(0,0,0,0.15); + } + } + + // Module menu icons + .modulemenu-icon { + float: left; + margin-right: @modulemenu-item-padding-horizontal; + .fa { + font-size: 0.5em; + } + } + + // Module menu group and item titles + .modulemenu-group-title, + .modulemenu-item-title { + white-space: nowrap; + text-overflow: ellipsis; + padding-top: 7px; + padding-left: @modulemenu-item-padding-horizontal; + display: none; + overflow: hidden; + *zoom: 1; + } + .modulemenu-group-title { + padding-right: 20px; + .caret { + .rotate(90deg); + position: absolute; + top: 17px; + right: 18px; + } + } + + // Module Group Expanded + .expanded { + .modulemenu-group-title { + .caret { + .rotate(0deg); + } + } + } +} + + +// Module menu snapped +.scaffold-modulemenu-expanded { + .modulemenu-group-title, + .modulemenu-item-title { + display: block; + } +} diff --git a/Build/Resources/Public/Less/Scaffold/_toolbar.less b/Build/Resources/Public/Less/Scaffold/_toolbar.less new file mode 100644 index 0000000000000000000000000000000000000000..73a104c14e3151a5e0b48b2b5d62131442e67a58 --- /dev/null +++ b/Build/Resources/Public/Less/Scaffold/_toolbar.less @@ -0,0 +1,216 @@ +// +// Toolbar +// +@toolbar-item-padding-vertical: 9px; +@toolbar-item-padding-horizontal: 10px; + +@toolbar-color: #ddd; +@toolbar-height: 45px; +@toolbar-zindex: @zindex-navbar; +@toolbar-bg: @navbar-inverse-bg; + +@toolbar-navigation-color: @toolbar-color; +@toolbar-navigation-bg: #2f2f2f; +@toolbar-navigation-border-color: #111; + +@toolbar-dropdown-padding: 16px; +@toolbar-dropdown-color: @toolbar-navigation-color; +@toolbar-dropdown-bg: @toolbar-navigation-bg; + +@toolbar-dropdown-link-bg: @toolbar-navigation-bg; +@toolbar-dropdown-link-color: #ddd; +@toolbar-dropdown-link-hover-bg: #333; +@toolbar-dropdown-link-hover-color: #fff; +@toolbar-dropdown-link-active-bg: lighten(@toolbar-dropdown-bg, 15%); +@toolbar-dropdown-link-active-color: #fff; + +@toolbar-navigation-search-bg: @toolbar-navigation-bg; +@toolbar-navigation-search-hover-bg: @toolbar-dropdown-link-hover-bg; +@toolbar-navigation-search-focus-bg: @toolbar-dropdown-link-active-bg; + + +.toolbar { + padding: 8px; + @media (min-width: @scaffold-breakpoint) { + padding: 0; + } + &:after { + clear: both; + display: table; + content: ''; + } +} + +.toolbar-list { + list-style: none; + padding: 0; + margin: 0; +} + +// Toolbar Item +.toolbar-item { + padding: 4px; + position: relative; + display: block; + float: left; + width: 100%; + @media (min-width: 600px) { + width: 50%; + } + @media (min-width: 750px) { + width: 33.33%; + } + @media (min-width: @scaffold-breakpoint) { + padding: 0; + width: auto; + margin-left: 1px; + } +} + +// Dropdown Menu +.toolbar-item { + .dropdown-menu { + width: 350px; + } + @media (max-width: @scaffold-breakpoint-max) { + .dropdown-menu { + overflow: auto; + padding: @grid-gutter-width / 2; + position: fixed; + max-height: 90%; + max-width: 90%; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + .dropdown-backdrop { + background: rgba(0,0,0,0.65); + } + } + +} + +// Toolbar Item +.toolbar-item-avatar { + width: 32px; + display: inline-block; + .avatar { + position: absolute; + top: 50%; + left: 10px; + transform: translate(0,-50%); + } +} +.toolbar-item-badge { + position: absolute; + bottom: 4px; + right: 4px; + padding: 3px 4px; + border-radius: 0; + font-size: 10px; + font-weight: normal; + min-width: 16px; + +} + +// Toolbar Item Link +.toolbar-item-link { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + border: 1px solid rgba(0,0,0,0.5); + position: relative; + display: block; + text-decoration: none; + padding: @toolbar-item-padding-vertical @toolbar-item-padding-horizontal; + height: @toolbar-height; + line-height: @toolbar-height - (@toolbar-item-padding-vertical * 2); + &:hover, + &:focus { + text-decoration: none; + } + @media (min-width: @scaffold-breakpoint) { + border: none; + } +} +.open { + .toolbar-item-link { + background-color: #424242; + } +} +@media (min-width: @scaffold-breakpoint) { + .toolbar-item-title { + display: none; + } +} + +// Search +.toolbar-item-search { + @media (min-width: @scaffold-breakpoint) { + width: 300px; + } + form { + padding: 0; + margin: 0; + } + .toolbar-item-link { + padding: 0; + margin: 0; + height: 0; + } + .form-group { + margin: 0; + } + .close { + color: #ffffff; + text-shadow: none; + opacity: 1; + } + .dropdown-menu { + @media (max-width: @scaffold-breakpoint-max) { + top: 114px; + left: 14px; + right: 14px; + width: auto; + max-width: none; + max-height: none; + transform: none; + bottom: 14px; + } + @media (min-width: @scaffold-breakpoint) { + left: auto; + right: 0; + } + } + .autocomplete-suggestions { + position: static!important; + } + .autocomplete-suggestion { + border: none; + } + &.open { + .toolbar-item-search-form { + position: relative; + z-index: 991; + } + } +} +.toolbar-item-search-field { + color: inherit; + background-color: @toolbar-navigation-search-bg; + margin: 0; + border-radius: 0; + border: 1px solid rgba(0,0,0,0.5); + @media (min-width: @scaffold-breakpoint) { + border: none; + } + height: @toolbar-height; + box-shadow: none; + &:hover { + background-color: @toolbar-navigation-search-hover-bg; + } + &:focus { + box-shadow: none; + background-color: @toolbar-navigation-search-focus-bg; + } +} diff --git a/Build/Resources/Public/Less/Scaffold/_topbar.less b/Build/Resources/Public/Less/Scaffold/_topbar.less new file mode 100644 index 0000000000000000000000000000000000000000..fb5d4047b434c484b2d906bec706f2aebfc84de7 --- /dev/null +++ b/Build/Resources/Public/Less/Scaffold/_topbar.less @@ -0,0 +1,187 @@ +// +// Topbar +// ====== +// + +// +// Variables +// +@topbar-bg: @scaffold-topbar-bg; +@topbar-color: @scaffold-topbar-color; +@topbar-height: @scaffold-topbar-height; +@topbar-zindex: @scaffold-topbar-zindex; + +@topbar-workspace-bg: #6d860d; + +@topbar-toolbar-bg: @scaffold-topbar-toolbar-bg; +@topbar-toolbar-color: @scaffold-topbar-toolbar-color; + +@topbar-button-bg: @topbar-toolbar-bg; +@topbar-button-hover-bg: lighten(@topbar-button-bg, 3%); +@topbar-button-active-bg: @scaffold-modulemenu-bg; +@topbar-button-width: 40px; + +@toolbar-item-padding-vertical: 9px; +@toolbar-item-padding-horizontal: 15px; + + +// +// Component +// +.topbar { + background-color: inherit; + position: relative; + height: @topbar-height; + a { + color: inherit; + text-decoration: none; + } +} + + +// +// Buttons +// +.topbar-button { + position: absolute; + top: 0; + display: inline-block; + border: 0; + background-color: @topbar-button-bg; + height: @topbar-height; + width: @topbar-button-width; + &:hover { + background-color: @topbar-button-hover-bg; + } + &.topbar-button-modulemenu { + left: 0; + @media (min-width: @scaffold-breakpoint) { + background-color: @topbar-button-active-bg; + } + } + &.topbar-button-navigationcomponent { + left: @topbar-button-width; + } + &.topbar-button-toolbar { + right: @topbar-button-width; + } + &.topbar-button-search { + right: 0; + } +} +.scaffold-modulemenu-expanded { + .topbar-button.topbar-button-modulemenu { + background-color: @topbar-button-active-bg; + } +} +.scaffold-content-navigation-expanded { + .topbar-button-navigationcomponent { + background-color: @topbar-button-active-bg; + } +} +.scaffold-toolbar-expanded { + @media (max-width: @scaffold-breakpoint-max) { + .toolbar-item-search { + display: none; + } + } + .topbar-button-toolbar { + background-color: @topbar-button-active-bg; + } +} +.scaffold-search-expanded { + @media (max-width: @scaffold-breakpoint-max) { + .toolbar-item { + display: none; + } + .toolbar-item-search { + display: block; + width: 100%; + } + } + .topbar-button-search { + background-color: @topbar-button-active-bg; + } +} + + +.topbar-button-toolbar, +.topbar-button-search { + display: block; +} +@media (min-width: @scaffold-breakpoint) { + .topbar-button-toolbar, + .topbar-button-search { + display: none; + } +} + + + +// +// Header +// +.topbar-header { + padding-left: @topbar-button-width * 2; + padding-right: @topbar-button-width * 2; +} +.topbar-header-site { + position: relative; + display: block; + @media (min-width: @scaffold-breakpoint) { + display: inline-block; + } + max-width: 100%; + height: @topbar-height; + line-height: @topbar-height; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; + &:before, + &:after { + display: block; + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 1em; + } + &:before { + left: 0; + background: linear-gradient(to right, fade(@topbar-bg, 100%) 0%, fade(@topbar-bg, 0%) 100%); + } + &:after { + right: 0; + background: linear-gradient(to right, fade(@topbar-bg, 0%) 0%, fade(@topbar-bg, 100%) 100%); + } +} +.typo3-in-workspace { + .topbar-header-site { + background-color: @topbar-workspace-bg; + &:before { + background: linear-gradient(to right, fade(@topbar-workspace-bg, 100%) 0%, fade(@topbar-workspace-bg, 0%) 100%); + } + &:after { + background: linear-gradient(to right, fade(@topbar-workspace-bg, 0%) 0%, fade(@topbar-workspace-bg, 100%) 100%); + } + } +} +.topbar-header-site-logo { + height: @topbar-height; + display: none; + padding-right: 0.5em; + @media (min-width: 320px) { + display: inline-block; + } +} +.topbar-header-site-title { + line-height: 1.2em; + display: inline-block; + vertical-align: middle; +} +.topbar-header-site-name { + display: block; +} +.topbar-header-site-version { + opacity: 0.5; +} diff --git a/Build/Resources/Public/Less/Scaffold/scaffold.less b/Build/Resources/Public/Less/Scaffold/scaffold.less new file mode 100644 index 0000000000000000000000000000000000000000..e77834d1247dc1950d5eabd318e66636a94b1eec --- /dev/null +++ b/Build/Resources/Public/Less/Scaffold/scaffold.less @@ -0,0 +1,276 @@ +// +// Scaffold +// ======== +// + + +// +// Variables +// +@scaffold-breakpoint-max: (@screen-md - 1); +@scaffold-breakpoint: @screen-md; + +@scaffold-overlay-bg: rgba(0,0,0,0.65); +@scaffold-overlay-zindex: @zindex-modal-background; + +@scaffold-bg: #f5f5f5; +@scaffold-color: #333333; +@scaffold-secondary-bg: #1f1f1e; +@scaffold-secondary-color: #f5f5f5; + +@scaffold-topbar-bg: @scaffold-secondary-bg; +@scaffold-topbar-color: @scaffold-secondary-color; +@scaffold-topbar-height: 45px; +@scaffold-topbar-zindex: @zindex-navbar; + +@scaffold-topbar-toolbar-bg: #222; +@scaffold-topbar-toolbar-color: #fff; + +@scaffold-modulemenu-bg: #424242; +@scaffold-modulemenu-color: #fff; +@scaffold-modulemenu-snapped-width: 40px; +@scaffold-modulemenu-expanded-width: 230px; +@scaffold-modulemenu-zindex: @zindex-navbar; + +@scaffold-toolbar-bg: #424242; +@scaffold-toolbar-color: #fff; +@scaffold-toolbar-zindex: @zindex-navbar; + +@scaffold-content-navigation-width: 300px; + +@scaffold-content-toggle-bg: #333; +@scaffold-content-toggle-color: #fff; + + +// +// Prevent Browser Rebounce +// +html { + height: 100%; + overflow: hidden; +} +body { + height: 100%; + overflow: auto; +} + + +// +// Component +// +.scaffold { + background-color: @scaffold-bg; + color: @scaffold-color; + position: relative; + padding-top: @scaffold-topbar-height; + height: 100vh; +} + + +// +// Topbar +// +.scaffold-topbar { + background-color: @scaffold-topbar-bg; + color: @scaffold-topbar-color; + height: @scaffold-topbar-height; + position: absolute; + top: 0; + right: 0; + left: 0; +} + + +// +// ModuleMenu +// +.scaffold-modulemenu { + background-color: @scaffold-modulemenu-bg; + color: @scaffold-modulemenu-color; + position: fixed; + top: @scaffold-topbar-height; + left: 0; + bottom: 0; + width: @scaffold-modulemenu-snapped-width; + max-width: 100%; + z-index: @scaffold-modulemenu-zindex; + overflow: hidden; + a { + color: fade(@scaffold-modulemenu-color, 70%); + &:hover { + color: @scaffold-modulemenu-color; + } + } + .active > a { + color: @scaffold-modulemenu-color; + } +} + + +// +// Toolbar +// +.scaffold-toolbar { + overflow: auto; + background-color: @scaffold-toolbar-bg; + color: @scaffold-toolbar-color; + z-index: @scaffold-toolbar-zindex; + position: fixed; + top: @scaffold-topbar-height; + left: 0; + right: 0; + bottom: 0; + display: none; + a { + color: fade(@scaffold-toolbar-color, 70%); + &:hover { + color: @scaffold-toolbar-color; + } + } + .active > a { + color: @scaffold-toolbar-color; + } + @media (min-width: @scaffold-breakpoint) { + overflow: visible; + background-color: transparent; + height: @scaffold-topbar-height; + top: 0; + left: auto; + bottom: auto; + display: block; + } +} +.scaffold-toolbar-expanded, +.scaffold-search-expanded { + .scaffold-toolbar { + @media (max-width: @scaffold-breakpoint-max) { + display: block; + } + } +} + + +// +// Content +// +.scaffold-content { + position: fixed!important; + top: @scaffold-topbar-height; + left: 0; + right: 0; + bottom: 0; + @media (max-width: @scaffold-breakpoint-max) { + left: 0!important; + } +} +.scaffold-content-navigation-iframe, +.scaffold-content-module-iframe { + display: block; + border: none; + height: 100%; + width: 100%; +} +.scaffold-content-navigation { + display: none; + position: absolute!important; + left: 0; + top: 0; + bottom: 0; + width: @scaffold-content-navigation-width; +} +.scaffold-content-navigation-component { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + // EXTJS PAGETREE FIXES START + #typo3-pagetree-treeContainer > div > .x-panel-body { + overflow: auto; + } + // EXTJS PAGETREE FIXES END +} +.scaffold-content-module { + @media (max-width: @screen-xs-max) { + width: 100%; + } + position: absolute!important; + top: 0; + left: 0; + bottom: 0; + right: 0; +} + + +// +// Content Overlay +// +.scaffold-content-overlay { + display: none; + position: absolute; + z-index: @scaffold-overlay-zindex; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: @scaffold-overlay-bg; +} +.scaffold-modulemenu-expanded { + .scaffold-content-overlay { + display: block; + @media (min-width: @scaffold-breakpoint) { + display: none; + } + } +} + + +// +// Medium Screen +// +.scaffold { + @media (min-width: @scaffold-breakpoint) { + padding-left: @scaffold-modulemenu-snapped-width; + } + .scaffold-modulemenu { + width: @scaffold-modulemenu-snapped-width; + @media (max-width: @scaffold-breakpoint-max) { + display: none; + } + } +} +.scaffold-modulemenu-expanded { + display: block; + padding-left: @scaffold-modulemenu-expanded-width; + .scaffold-modulemenu { + width: @scaffold-modulemenu-expanded-width; + @media (max-width: @scaffold-breakpoint-max){ + display: block; + } + } + .scaffold-content { + transform: translate(@scaffold-modulemenu-expanded-width, 0); + } +} +.scaffold-content-navigation-expanded { + .scaffold-content-navigation { + display: block; + } + .scaffold-content-module { + left: @scaffold-content-navigation-width; + } +} + +@media (min-width: @scaffold-breakpoint){ + .scaffold { + .scaffold-content { + left: @scaffold-modulemenu-snapped-width; + } + } + .scaffold-modulemenu-expanded { + .scaffold-content { + left: @scaffold-modulemenu-expanded-width; + transform: none; + } + } +} diff --git a/Build/Resources/Public/Less/TYPO3/_element_docheader.less b/Build/Resources/Public/Less/TYPO3/_element_docheader.less index 60fb41ff2b188beb82bf9867560ddca1b2ebd31b..4e8154a697e631037698cdda516e8e8200ad1b20 100644 --- a/Build/Resources/Public/Less/TYPO3/_element_docheader.less +++ b/Build/Resources/Public/Less/TYPO3/_element_docheader.less @@ -94,94 +94,3 @@ border-bottom: 1px solid #C3C3C3; } } - -// -// ExtJS Viewport -// - - -// override the ExtJS collapse page tree button -// ------------------------- - -@module-menu-border-color-lighter: #F5F5F5; -@module-menu-border-color-light: #C3C3C3; - -#typo3-navigationContainer-xcollapsed { - &:before { - content: ""; - position: absolute; - top: 0; - width: 8px; - height: 100%; - background-color: lighten(@module-menu-bg,25%); - border-right: 1px solid lighten(@module-menu-border-color,20%); - border-left: 1px solid @module-menu-border-color; - .box-shadow(3px 0 0 rgba(0,0,0,0.15)); - } -} - -// center collapse button vertical -.x-panel-body { - .x-layout-cmini-west .x-layout-mini, - .x-layout-split-west .x-layout-mini { - top: 50%; - margin-top: -40px; - } -} - - -// styling for the page tree collapse button -// this class will be extended from ExtJS CSS Class setup (ExtJS close and open html setup) -.typo3-btn-collapse-page-tree { - height: 80px; - width: 14px; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - background: none; - border: 1px solid @module-menu-border-color-light; - border-left: 1px solid @module-menu-border-color-lighter; - display: block; - font-size: 0; - .opacity(1); - &:after { - font-family: 'FontAwesome'; - content: "\f0d9"; - position: absolute; - top: 50%; - display: block; - width: 100%; - margin-top: -1px; - color: #000; - font-size: 12px; - vertical-align: middle; - text-align: center; - } -} - -// close page tree button -.x-layout-split-west .x-layout-mini { - &:extend(.typo3-btn-collapse-page-tree all); - background-color: @module-menu-border-color-lighter; - &:hover { - background-color: darken(@module-menu-border-color-lighter,5%); - } -} - -// open page tree button -.x-layout-cmini-west .x-layout-mini { - &:extend(.typo3-btn-collapse-page-tree all); - background-color: lighten(@module-menu-bg, 25%); - margin-left: 7px; - border: 1px solid lighten(@module-menu-border-color, 20%); - border-left: 0; - - &:hover { - .opacity(1); - background-color: lighten(@module-menu-bg,30%); - } - &:after { - margin-top: -9px; - color: #fff; - content: "\f0da"; - } -} diff --git a/Build/Resources/Public/Less/TYPO3/_element_pagetree.less b/Build/Resources/Public/Less/TYPO3/_element_pagetree.less index 59c472b05e3915d1a375f845eceda9700f8d6483..943f811f8de1ece6d95a970d738d342226ef3abb 100644 --- a/Build/Resources/Public/Less/TYPO3/_element_pagetree.less +++ b/Build/Resources/Public/Less/TYPO3/_element_pagetree.less @@ -1,6 +1,9 @@ // // Pagetree // +#typo3-pagetree-topPanelItems { + background-color: #eee; +} #typo3-pagetree { height: 100%; diff --git a/Build/Resources/Public/Less/TYPO3/_main_body.less b/Build/Resources/Public/Less/TYPO3/_main_body.less index 92c092c0301b2a369df2ffa1d7368d12108a6fe5..b150be3f3f720752d420087e5ac534541b1a87c1 100644 --- a/Build/Resources/Public/Less/TYPO3/_main_body.less +++ b/Build/Resources/Public/Less/TYPO3/_main_body.less @@ -1,7 +1,3 @@ -// -// Body -// - // // specific wrappers // diff --git a/Build/Resources/Public/Less/TYPO3/_main_form.less b/Build/Resources/Public/Less/TYPO3/_main_form.less index e997567cccbf87f089df819c20f7ec21e071593e..054a6ab980cc26ffe4fdeacf425471ae37cecd60 100644 --- a/Build/Resources/Public/Less/TYPO3/_main_form.less +++ b/Build/Resources/Public/Less/TYPO3/_main_form.less @@ -103,6 +103,22 @@ fieldset[disabled] .form-control { } +// +// Form control icon +// +.form-control-icon { + position: absolute; + top: 50%; + left: 15px; + transform: translate(0, -50%); + z-index: 1; + + .form-control, + + .form-control-clearable .form-control { + padding-left: 3.25em; + } +} + + // // Form group validation states // diff --git a/Build/Resources/Public/Less/TYPO3/_main_scaffolding.less b/Build/Resources/Public/Less/TYPO3/_main_scaffolding.less deleted file mode 100644 index 2cb66c6328e09bf061145db8ada6248b8b8e1f4f..0000000000000000000000000000000000000000 --- a/Build/Resources/Public/Less/TYPO3/_main_scaffolding.less +++ /dev/null @@ -1,26 +0,0 @@ -// -// TYPO3 backend scaffolding -// - -body#typo3-backend-php { - margin: 0; - padding: 0; -} - -#typo3-main-container { - clear: both; -} - -#typo3-top { - margin-left: 160px; -} - -iframe { - width: 100%; -} - -#typo3-side-menu, -iframe { - height: 100%; - overflow: auto; -} \ No newline at end of file diff --git a/Build/Resources/Public/Less/TYPO3/_module_menu.less b/Build/Resources/Public/Less/TYPO3/_module_menu.less deleted file mode 100644 index 2964bfe409467c32902a9a4a71a3e0b23dd3b9bb..0000000000000000000000000000000000000000 --- a/Build/Resources/Public/Less/TYPO3/_module_menu.less +++ /dev/null @@ -1,172 +0,0 @@ -// -// Module menu -// - -// Module base -@module-menu-color: #fff; -@module-menu-bg: #222; -@module-menu-border-color: #111; - -// Module group -@module-menu-group-color: @module-menu-color; -@module-menu-group-bg: @module-menu-bg; -@module-menu-group-expanded-bg: @module-menu-bg; - -// Module links -@module-menu-link-border-radius: 0 @border-radius-small @border-radius-small 0; -@module-menu-link-color: #aaa; -@module-menu-link-hover-color: @module-menu-color; -@module-menu-link-hover-bg: lighten(@module-menu-bg,3%); -@module-menu-link-active-color: #fff; -@module-menu-link-active-bg: lighten(@module-menu-bg,15%); -@module-menu-item-padding-vertical: 4px; -@module-menu-item-padding-horizontal: 9px; - -// Module menu container -[id="typo3-module-menu"] { - background: @module-menu-bg; - color: @module-menu-color; -} - -// Invisible module menu drag handler -[id="typo3-module-menu-xsplit"] { - z-index: 10; - width: 1px; - background-color: lighten(@module-menu-border-color,10%); - .box-shadow(2px 0px 3px rgba(0,0,0,0.5)); - &:hover { - .box-shadow(2px 0px 3px rgba(0,0,0,0.9)); - } - .x-layout-mini-wrapper { - left: -7px; - width: 15px; - } -} - -// Module menu styling -[id="typo3-menu"] { - .list-unstyled(); - - /// Module menu group - .typo3-module-menu-group-container { - clear: both; - .list-unstyled(); - padding-right: 15px; - } - .typo3-module-menu-group { - .transition(background-color 0.4s ease-in-out); - position: relative; - color: @module-menu-group-color; - background-color: @module-menu-group-bg; - border-top: 1px solid lighten(@module-menu-border-color,10%); - border-bottom: 1px solid @module-menu-border-color; - padding: 5px 0; - } - .typo3-module-menu-group.expanded { - background-color: @module-menu-group-expanded-bg; - } - .typo3-module-menu-group-header { - &:extend(.clearfix all); - position: relative; - cursor: pointer; - display: block; - padding: @module-menu-item-padding-vertical @module-menu-item-padding-horizontal; - text-transform: uppercase; - } - - // Module menu item - .typo3-module-menu-item { - margin: 1px 0; - } - - // Module menu links - .typo3-module-menu-item-link { - &:extend(.clearfix all); - position: relative; - cursor: pointer; - display: block; - padding: @module-menu-item-padding-vertical @module-menu-item-padding-horizontal; - color: @module-menu-link-color; - border-radius: @module-menu-link-border-radius; - text-decoration: none; - &:focus, - &:hover { - outline: none; - color: @module-menu-link-hover-color; - background-color: @module-menu-link-hover-bg; - } - } - .typo3-module-menu-item.active { - .typo3-module-menu-item-link { - color: @module-menu-link-active-color; - background-color: @module-menu-link-active-bg; - } - } - - // Module menu icons - .typo3-module-menu-group-icon, - .typo3-module-menu-item-icon { - float: left; - margin-right: 10px; - } - .typo3-module-menu-group-icon { - background-color: transparent; - > span { - line-height: @app-icon-height; - > .t3-icon { - width: @app-icon-width; - height: @app-icon-height; - &:before { - line-height: @app-icon-height; - } - } - } - &:after { - display: none; - } - } - - // Module menu group and item titles - .typo3-module-menu-group-title, - .typo3-module-menu-item-title { - white-space: nowrap; - text-overflow: ellipsis; - padding-top: 7px; - display: block; - overflow: hidden; - *zoom: 1; - } - .typo3-module-menu-group-title { - padding-right: 20px; - .caret { - .transition(all 0.25s ease-in-out); - .rotate(90deg); - position: absolute; - top: 15px; - right: 18px; - } - } - - // Module Group Expanded - .expanded { - .typo3-module-menu-group-title { - .caret { - .rotate(0deg); - } - } - } -} - -// Module menu snapped -.typo3-module-menu-snapped { - .typo3-module-menu-group-container { - padding-right: 0; - } - .typo3-module-menu-item-link { - border-radius: 0; - } - .typo3-module-menu-group-title, - .typo3-module-menu-item-title { - display: none; - } -} diff --git a/Build/Resources/Public/Less/TYPO3/_module_viewpage.less b/Build/Resources/Public/Less/TYPO3/_module_viewpage.less index 705f812dfcbc6463fa625649f340a7b37a2bc4cc..3651fec3bcb2a4c0730357d814cbdd5f6a7fe275 100644 --- a/Build/Resources/Public/Less/TYPO3/_module_viewpage.less +++ b/Build/Resources/Public/Less/TYPO3/_module_viewpage.less @@ -2,56 +2,66 @@ * Style definitions for the whole viewpage module */ #typo3-inner-docbody { - display: block; - position: absolute; - height: auto; - bottom: 0; - top: 0; - left: 0; - right: 0; - padding: 30px; + display: block; + position: absolute; + height: auto; + bottom: 0; + top: 0; + left: 0; + right: 0; + padding: 30px; } #resizeable { - height: 100%; + height: 100%; } #tx_viewpage_iframe { - -webkit-box-shadow: 0px 0px 15px 0px #888888; - -moz-box-shadow: 0px 0px 15px 0px #888888; - box-shadow:0px 0px 15px 0px #888888; + -webkit-box-shadow: 0px 0px 15px 0px #888888; + -moz-box-shadow: 0px 0px 15px 0px #888888; + box-shadow:0px 0px 15px 0px #888888; } /** * adjust jquery-ui resize handles */ .ui-resizable-handle { - border: solid #dadada; + border: solid #dadada; + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; + -webkit-transform: translateX(50%); + -moz-transform: translateX(50%); + -ms-transform: translateX(50%); + -o-transform: translateX(50%); + transform: translateX(50%); } .ui-resizable-handle:hover { - border-color: #585858; + border-color: #585858; } .ui-resizable-s { - cursor: row-resize; - height: 2px; - width: 40%; - bottom: -15px; - left: 30%; - border-width: 2px 0; + cursor: row-resize; + height: 2px; + width: 40%; + bottom: -15px; + left: 30%; + border-width: 2px 0; } .ui-resizable-e { - cursor: col-resize; - width: 2px; - right: -15px; - top: 30%; - height: 40%; - border-width: 0 2px; + cursor: e-resize; + width: 25px; + right: -5px; + top: 0; + height: 100%; + border-width: 0 2px; } .ui-resizable-se { - cursor: nwse-resize; - width: 12px; - height: 12px; - right: -15px; - bottom: -15px; - background-position: -80px -224px; - border-width: 0; + cursor: nwse-resize; + width: 12px; + height: 12px; + right: -15px; + bottom: -15px; + background-position: -80px -224px; + border-width: 0; } diff --git a/Build/Resources/Public/Less/TYPO3/_topbar.less b/Build/Resources/Public/Less/TYPO3/_topbar.less deleted file mode 100644 index 988f38de4f8b6bfb1fad7c50e7be2df8dd6f5192..0000000000000000000000000000000000000000 --- a/Build/Resources/Public/Less/TYPO3/_topbar.less +++ /dev/null @@ -1,415 +0,0 @@ -// -// Topbar -// - -@topbar-color: #ddd; -@topbar-height: 45px; -@topbar-zindex: @zindex-navbar; -@topbar-bg: @navbar-inverse-bg; - -@topbar-navigation-color: @topbar-color; -@topbar-navigation-bg: #222; -@topbar-navigation-border-color: #111; - -@topbar-dropdown-padding: 16px; -@topbar-dropdown-color: @topbar-navigation-color; -@topbar-dropdown-bg: @topbar-navigation-bg; - -@topbar-dropdown-link-bg: @topbar-navigation-bg; -@topbar-dropdown-link-color: #ddd; -@topbar-dropdown-link-hover-bg: #333; -@topbar-dropdown-link-hover-color: #fff; -@topbar-dropdown-link-active-bg: lighten(@topbar-dropdown-bg, 15%); -@topbar-dropdown-link-active-color: #fff; - -@tobar-navigation-search-bg: @topbar-navigation-bg; -@tobar-navigation-search-hover-bg: @topbar-dropdown-link-hover-bg; -@tobar-navigation-search-focus-bg: @topbar-dropdown-link-active-bg; - - -// HOTFIX SCAFFOLDING -[id="typo3-topbar"], -[id="typo3-topbar"] .x-panel-body { - min-width: 1000px; -} - -// Topbar -[id="typo3-topbar"]{ - height: @topbar-height; - position: relative; - background-color: @topbar-bg; - color: @topbar-color; - .x-panel-bwrap, - .x-panel-body { - overflow: visible; - } -} -.typo3-in-workspace [id="typo3-topbar"] { - background-color: #6d860d; - .typo3-topbar-site-name { - color: #fff; - } -} - -// Container -.typo3-topbar-container { - .user-select(none); - height: @topbar-height; - position: relative; -} - -// Site -.typo3-topbar-site { - display: table; - padding: 0; - height: @navbar-height; - float: left; -} -.typo3-topbar-site-logo, -.typo3-topbar-site-name { - display: table-cell; - vertical-align: middle; - text-align: center; -} -.typo3-topbar-site-logo { - background-color: @topbar-bg; - width: 51px; - .box-shadow(2px 0px 0px rgba(0, 0, 0, 0.15)); - &:hover { - background-color: @tobar-navigation-search-hover-bg; - } - > img { - max-height: 50px; - } -} -.typo3-topbar-site-name { - cursor: default; - padding: 0 (@grid-gutter-width / 2); -} - - -// Shared -.typo3-topbar-navigation { - color: @topbar-navigation-color; - background-color: @topbar-navigation-bg; - float: right; - // Shortcut - .shortcut { - min-width: 180px; - } - .shortcut-form { - padding: @topbar-dropdown-padding; - margin: (@topbar-dropdown-padding / 4) -@topbar-dropdown-padding; - border-top: 1px solid lighten(@topbar-navigation-border-color,15%); - background-color: lighten(@topbar-navigation-border-color,10%); - border-bottom: 1px solid @topbar-navigation-border-color; - } -} - - -// Navigation Items -.typo3-topbar-navigation-items { - height: @topbar-height; - margin-bottom: 0; - padding-left: 0; - list-style: none; - float: left; - .icon-color { - fill: @topbar-navigation-color; - } - a { - color: @topbar-navigation-color; - text-decoration: none; - } - > li { - float: left; - height: @topbar-height; - > a { - position: relative; - display: block; - padding: @navbar-padding-vertical 10px; - border-left: 1px solid lighten(@topbar-navigation-border-color,10%); - border-right: 1px solid @topbar-navigation-border-color; - &:hover, - &:focus, - &:active { - color: @topbar-dropdown-link-hover-color; - background-color: @topbar-dropdown-link-hover-bg; - border-left-color: lighten(@topbar-dropdown-link-hover-bg,3%) - } - } - } - > li.open { - > a { - color: @topbar-dropdown-link-active-color; - background-color: @topbar-dropdown-link-active-bg; - border-left-color: lighten(@topbar-dropdown-link-active-bg,3%); - } - } -} - -// Dropdown -.typo3-topbar-navigation-items { - .dropdown { - min-width: @topbar-height; - text-align: center; - > a > .fa { - font-size: 16px; - margin: 0; - display: inline-block; - position: relative; - vertical-align: middle; - width: auto; - height: auto; - } - > a .icon-size-default .icon-unify, - > a .icon-size-small .icon-unify { - line-height: 16px; - font-size: 16px; - } - } - .dropdown-toggle { - position: relative; - .badge { - display: none; - font-size: 10px; - min-width: 15px; - height: 15px; - position: absolute; - padding: 0; - border-radius: @border-radius-small; - line-height: 15px; - bottom: 5px; - right: 5px; - } - } - .live-search-wrapper { - &+ .dropdown-menu { - width: 100%; - .dropdown-list { - position: relative!important; // Needs to be important to override inline styles of autocomplete - } - } - } - .dropdown-menu { - left: auto; - right: 0; - margin: 0; - z-index: 2000; - padding: (@topbar-dropdown-padding / 2) @topbar-dropdown-padding; - color: @topbar-dropdown-color; - background-color: @topbar-dropdown-bg; - border-color: @topbar-navigation-border-color; - border-top: 1px solid lighten(@topbar-navigation-border-color, 20%); - border-left: 0; - border-right: 0; - border-radius: 0 0 @border-radius-small @border-radius-small; - .box-shadow(0px 3px 0px rgba(0, 0, 0, 0.15)); - a { - color: @topbar-dropdown-link-color; - white-space: nowrap; - } - > *:last-child { - margin-bottom: 0; - } - } - .dropdown-list { - .list-unstyled(); - > li { - &:extend(.clearfix all); - position: relative; - &.active .dropdown-list-link { - background-color: @topbar-dropdown-link-active-bg; - color: @topbar-dropdown-link-active-color; - } - } - > li + li { - margin-top: 1px; - } - > li.divider + li { - margin-top: 0; - } - .divider { - border-top: 1px solid @topbar-navigation-border-color; - background-color: lighten(@topbar-navigation-border-color, 10%); - margin: (@topbar-dropdown-padding / 2) -@topbar-dropdown-padding; - padding: 1px 0 0; - } - .modlink { - &:extend(.clearfix all); - width: 210px; - .submodule-icon { - float: left; - margin-right: 10px; - } - .submodule-label { - white-space: nowrap; - text-overflow: ellipsis; - padding-top: 7px; - display: block; - overflow: hidden; - *zoom: 1; - } - } - .dropdown-header { - font-size: 1em; - margin-left: -@topbar-dropdown-padding; - margin-right: -@topbar-dropdown-padding; - padding: (@topbar-dropdown-padding / 2) @topbar-dropdown-padding; - } - .dropdown-intro, - .dropdown-info { - color: darken(@topbar-color, 20%); - margin-left: -@topbar-dropdown-padding; - margin-right: -@topbar-dropdown-padding; - padding: (@topbar-dropdown-padding / 2) @topbar-dropdown-padding; - } - .dl-horizontal { - dt { - width: 140px; - text-align: left; - font-weight: normal; - } - dd { - margin-left: 150px; - width: 170px; - word-wrap: break-word; - } - } - } - .dropdown-list-link { - max-width: 300px; - overflow: hidden; - text-overflow: ellipsis; - display: block; - text-decoration: none; - cursor: pointer; - white-space: nowrap; - color: @topbar-dropdown-link-color; - margin-left: -@topbar-dropdown-padding; - margin-right: -@topbar-dropdown-padding; - padding: (@topbar-dropdown-padding / 4) @topbar-dropdown-padding; - &:hover { - color: @topbar-dropdown-link-hover-color; - background-color: @topbar-dropdown-link-hover-bg; - } - .badge { - background-color: @brand-danger; - color: @btn-danger-color; - } - small { - white-space: normal; - width: 270px; - display: block; - padding-left: 21px; - } - } - .dropdown-list-link-edit, - .dropdown-list-link-delete, - .dropdown-list-link-close { - position: absolute; - top: 0; - bottom: 0; - right: -(@topbar-dropdown-padding / 2); - padding: 0; - text-align: center; - line-height: 26px; - width: 26px; - height: 26px; - &:hover { - background-color: @topbar-dropdown-link-hover-bg; - } - } - .dropdown-list-link-edit { - right: 18px; - } - .dropdown-list-link-delete, - .dropdown-list-link-close { - &:hover { - background-color: @btn-danger-bg; - } - } - .dropdown-link-list-add-close { - padding-right: 50px; - } - .dropdown-link-list-add-editdelete { - padding-right: 85px; - } - .topbar-workspaces-title { - margin-left: 3px; - } -} - -// Navigation Search -.typo3-topbar-navigation-search { - position: relative; - padding: 0; - margin: 0; - .form-group { - margin-top: 0; - margin-bottom: 0; - &:before { - content: "\f002"; - font: normal normal normal 14px/1 FontAwesome; - position: absolute; - top: 50%; - left: 15px; - margin-top: -8px; - z-index: 1; - } - - button.close { - opacity: 1; - color: @topbar-navigation-color; - text-shadow: none; - } - } - .form-control { - background-color: @tobar-navigation-search-bg; - color: @topbar-navigation-color; - height: @topbar-height; - width: 300px; - padding: 14px 30px 13px 35px; - border: none; - border-left: 1px solid lighten(@topbar-navigation-border-color, 10%); - border-radius: 0; - &:hover { - border-left-color: lighten(@topbar-navigation-border-color, 15%); - background-color: @tobar-navigation-search-hover-bg; - } - &:focus { - outline: none; - border-left-color: lighten(@topbar-navigation-border-color, 25%); - background-color: @tobar-navigation-search-focus-bg; - .box-shadow(none); - } - + .t3-icon { - text-align: center; - position: absolute; - top: 50%; - right: 15px; - margin-right: 0; - margin-top: -8px; - } - } - .dropdown-menu { - left: auto!important; // Needs to be important to override inline styes of typeahead - width: 350px; - } - .dropdown-list-link { - max-width: none; - .typeahead-highlight { - font-weight: normal; - } - } -} - -// Bookmark dropdown menu -#typo3-cms-backend-backend-toolbaritems-shortcuttoolbaritem { - .dropdown-list { - max-height: (10 * (18px + (@topbar-dropdown-padding / 2) + 1px)); // 18px=12px font with line-height 1.5; 1px margin-top for padding; 10 rows - overflow: hidden; - overflow-y: auto; - padding-right: 10px; - } -} diff --git a/Build/Resources/Public/Less/_minimal.less b/Build/Resources/Public/Less/_minimal.less index 1b7681dfb1960334561999486135a006c9bf8eac..0a40d76ae008614d8e7d7d09b34b870197671a3c 100644 --- a/Build/Resources/Public/Less/_minimal.less +++ b/Build/Resources/Public/Less/_minimal.less @@ -101,10 +101,19 @@ @import "@{path-bower}/bootstrap/less/tooltip.less"; @import "@{path-bower}/bootstrap/less/carousel.less"; +// +// Scaffold +// +@import "Scaffold/scaffold.less"; +@import "Scaffold/_topbar.less"; +@import "Scaffold/_toolbar.less"; +@import "Scaffold/_modulemenu.less"; + // // Custom Components // @import "Component/autocomplete.less"; +@import "Component/dropdown.less"; @import "Component/avatar.less"; @import "Component/callout.less"; @import "Component/icon.less"; diff --git a/Build/Resources/Public/Less/_variables.less b/Build/Resources/Public/Less/_variables.less index 709322c5a6a9f7d91f083afac4c6fc8d74fc4b9a..522352449edeec639c0537ca4a5c8515442c532b 100644 --- a/Build/Resources/Public/Less/_variables.less +++ b/Build/Resources/Public/Less/_variables.less @@ -200,3 +200,16 @@ // Modal @zindex-modal: 5000; + +@dropdown-bg: #424242; +@dropdown-border: rgba(0,0,0,.15); +@dropdown-fallback-border: #ccc; +@dropdown-divider-bg: #525252; +@dropdown-link-color: #fff; +@dropdown-link-hover-color: #fff; +@dropdown-link-hover-bg: #525252; +@dropdown-link-active-color: #fff; +@dropdown-link-active-bg: #525252; +@dropdown-link-disabled-color: @gray-light; +@dropdown-header-color: @gray-light; +@dropdown-caret-color: #000; diff --git a/Build/Resources/Public/Less/backend.less b/Build/Resources/Public/Less/backend.less index 93272106f4cd8b55a965a940bedd0843db4dbca3..fe0151d76bc32cdb36bd71d0bcaf79a92281265d 100644 --- a/Build/Resources/Public/Less/backend.less +++ b/Build/Resources/Public/Less/backend.less @@ -69,8 +69,6 @@ @import "TYPO3/_main_backend_layout_wizard"; @import "TYPO3/_main_form.less"; @import "TYPO3/_main_linkbrowser.less"; -@import "TYPO3/_main_scaffolding.less"; -@import "TYPO3/_module_menu.less"; @import "TYPO3/_module_database.less"; @import "TYPO3/_module_recycler.less"; @import "TYPO3/_module_scheduler.less"; @@ -78,7 +76,6 @@ @import "TYPO3/_module_web_page.less"; @import "TYPO3/_module_viewpage.less"; @import "TYPO3/_module_workspaces.less"; -@import "TYPO3/_topbar.less"; @import "TYPO3/_debugconsole.less"; @import "TYPO3/_module_web_list_sysnote.less"; diff --git a/Build/Resources/Public/Less/nprogress/nprogress.less b/Build/Resources/Public/Less/nprogress/nprogress.less index 871e5e556c06720eb877fed5d2d0cfd5e3719df2..a6aa3b52f9f6b9910390592294a69b7b1d341414 100644 --- a/Build/Resources/Public/Less/nprogress/nprogress.less +++ b/Build/Resources/Public/Less/nprogress/nprogress.less @@ -20,7 +20,7 @@ left: 0; width: 100%; - height: 4px; + height: 2px; } /* Fancy blur effect */ diff --git a/typo3/sysext/about/Resources/Private/Templates/About/Index.html b/typo3/sysext/about/Resources/Private/Templates/About/Index.html index fa438b49ca6b5a0c6dd25db397fafecbed2e2394..226e61ebd6352172403fb2ac159e99bc4bd2f940 100644 --- a/typo3/sysext/about/Resources/Private/Templates/About/Index.html +++ b/typo3/sysext/about/Resources/Private/Templates/About/Index.html @@ -1,7 +1,7 @@ <f:layout name="Default" /> <f:section name="Content"> - <div class="container container-small"> + <div class="container-small"> <f:render partial="Logo" arguments="{_all}" /> <f:render partial="About" arguments="{_all}" /> <f:render partial="Donation" arguments="{_all}" /> diff --git a/typo3/sysext/about/Resources/Private/Templates/Modules/Index.html b/typo3/sysext/about/Resources/Private/Templates/Modules/Index.html index 5bbdd19636c9a799a2940f1cacfe0ed6ae4a5c20..703b0e5117484bff1d20fbc12ddfdcf5fbaba6aa 100644 --- a/typo3/sysext/about/Resources/Private/Templates/Modules/Index.html +++ b/typo3/sysext/about/Resources/Private/Templates/Modules/Index.html @@ -2,7 +2,7 @@ <f:layout name="Default" /> <f:section name="Content"> - <div class="container container-small"> + <div class="container-small"> <f:render partial="Logo" arguments="{_all}" /> <p> <f:translate key="LLL:EXT:lang/locallang_alt_intro.xlf:introtext2" /> diff --git a/typo3/sysext/backend/Classes/Backend/ToolbarItems/ClearCacheToolbarItem.php b/typo3/sysext/backend/Classes/Backend/ToolbarItems/ClearCacheToolbarItem.php index 38af53738787d6f989cdc02508590cec0657fdc3..47429506c11ea4744ef232b45ea04b5623fcb540 100644 --- a/typo3/sysext/backend/Classes/Backend/ToolbarItems/ClearCacheToolbarItem.php +++ b/typo3/sysext/backend/Classes/Backend/ToolbarItems/ClearCacheToolbarItem.php @@ -122,9 +122,11 @@ class ClearCacheToolbarItem implements ToolbarItemInterface public function getItem() { $title = htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:rm.clearCache_clearCache')); - return '<span title="' . $title . '">' - . $this->iconFactory->getIcon('apps-toolbar-menu-cache', Icon::SIZE_SMALL)->render('inline') - . '</span>'; + $icon = $this->iconFactory->getIcon('apps-toolbar-menu-cache', Icon::SIZE_SMALL)->render('inline'); + return ' + <span class="toolbar-item-icon" title="' . $title . '">' . $icon . '</span> + <span class="toolbar-item-title">' . $title . '</span> + '; } /** @@ -135,17 +137,30 @@ class ClearCacheToolbarItem implements ToolbarItemInterface public function getDropDown() { $result = []; - $result[] = '<ul class="dropdown-list">'; + $result[] = '<h3 class="dropdown-headline">'; + $result[] = htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:rm.clearCache_clearCache')); + $result[] = '</h3>'; + $result[] = '<hr>'; + $result[] = '<div class="dropdown-table">'; foreach ($this->cacheActions as $cacheAction) { $title = $cacheAction['description'] ?: $cacheAction['title']; - $result[] = '<li>'; - $result[] = '<a class="dropdown-list-link" href="' . htmlspecialchars($cacheAction['href']) . '">'; - $result[] = $cacheAction['icon'] . ' ' . htmlspecialchars($cacheAction['title']); - $result[] = '<br/><small>' . htmlspecialchars($title) . '</small>'; + + $result[] = '<div class="dropdown-table-row">'; + + $result[] = '<div class="dropdown-table-column dropdown-table-column-top dropdown-table-icon">'; + $result[] = $cacheAction['icon']; + $result[] = '</div>'; + + $result[] = '<div class="dropdown-table-column dropdown-table-column-top dropdown-table-text">'; + $result[] = '<a href="' . htmlspecialchars($cacheAction['href']) . '">'; + $result[] = htmlspecialchars($cacheAction['title']); + $result[] = '<br><small class="text-muted">' . htmlspecialchars($title) . '</small>'; $result[] = '</a>'; - $result[] = '</li>'; + $result[] = '</div>'; + + $result[] = '</div>'; } - $result[] = '</ul>'; + $result[] = '</div>'; return implode(LF, $result); } diff --git a/typo3/sysext/backend/Classes/Backend/ToolbarItems/HelpToolbarItem.php b/typo3/sysext/backend/Classes/Backend/ToolbarItems/HelpToolbarItem.php index bb624a9986b65a2785e5d33461738ce99c23531d..cbbfc867c4248f5ab48b24a773eb516ed8f230f4 100644 --- a/typo3/sysext/backend/Classes/Backend/ToolbarItems/HelpToolbarItem.php +++ b/typo3/sysext/backend/Classes/Backend/ToolbarItems/HelpToolbarItem.php @@ -69,7 +69,12 @@ class HelpToolbarItem implements ToolbarItemInterface */ public function getItem() { - return $this->iconFactory->getIcon('apps-toolbar-menu-help', Icon::SIZE_SMALL)->render('inline'); + $title = htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.help')); + $icon = $this->iconFactory->getIcon('apps-toolbar-menu-help', Icon::SIZE_SMALL)->render('inline'); + return ' + <span class="toolbar-item-icon" title="' . $title . '">' . $icon . '</span> + <span class="toolbar-item-title">' . $title . '</span> + '; } /** @@ -80,25 +85,28 @@ class HelpToolbarItem implements ToolbarItemInterface public function getDropDown() { $dropdown = []; - $dropdown[] = '<ul class="dropdown-list">'; + $dropdown[] = '<h3 class="dropdown-headline">' . htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.help')) . '</h3>'; + $dropdown[] = '<hr>'; + $dropdown[] = '<div class="dropdown-table">'; foreach ($this->helpModuleMenu->getChildren() as $module) { /** @var BackendModule $module */ - $moduleIcon = $module->getIcon(); - $dropdown[] ='<li' + $dropdown[] = '<div' + . ' class="dropdown-table-row"' . ' id="' . htmlspecialchars($module->getName()) . '"' - . ' class="typo3-module-menu-item submodule mod-' . htmlspecialchars($module->getName()) . '" ' . ' data-modulename="' . htmlspecialchars($module->getName()) . '"' . ' data-navigationcomponentid="' . htmlspecialchars($module->getNavigationComponentId()) . '"' . ' data-navigationframescript="' . htmlspecialchars($module->getNavigationFrameScript()) . '"' . ' data-navigationframescriptparameters="' . htmlspecialchars($module->getNavigationFrameScriptParameters()) . '"' . '>'; - $dropdown[] = '<a title="' . htmlspecialchars($module->getDescription()) . '" href="' . htmlspecialchars($module->getLink()) . '" class="dropdown-list-link modlink">'; - $dropdown[] = '<span class="submodule-icon typo3-app-icon"><span><span>' . $moduleIcon . '</span></span></span>'; - $dropdown[] = '<span class="submodule-label">' . htmlspecialchars($module->getTitle()) . '</span>'; + $dropdown[] = '<div class="dropdown-table-column dropdown-table-icon">' . $module->getIcon() . '</div>'; + $dropdown[] = '<div class="dropdown-table-column dropdown-table-title">'; + $dropdown[] = '<a title="' . htmlspecialchars($module->getDescription()) . '" href="' . htmlspecialchars($module->getLink()) . '" class="modlink">'; + $dropdown[] = htmlspecialchars($module->getTitle()); $dropdown[] = '</a>'; - $dropdown[] = '</li>'; + $dropdown[] = '</div>'; + $dropdown[] = '</div>'; } - $dropdown[] = '</ul>'; + $dropdown[] = '</div>'; return implode(LF, $dropdown); } @@ -109,7 +117,7 @@ class HelpToolbarItem implements ToolbarItemInterface */ public function getAdditionalAttributes() { - return ['class' => 'typo3-module-menu-group']; + return []; } /** @@ -131,4 +139,14 @@ class HelpToolbarItem implements ToolbarItemInterface { return 70; } + + /** + * Returns LanguageService + * + * @return \TYPO3\CMS\Lang\LanguageService + */ + protected function getLanguageService() + { + return $GLOBALS['LANG']; + } } diff --git a/typo3/sysext/backend/Classes/Backend/ToolbarItems/LiveSearchToolbarItem.php b/typo3/sysext/backend/Classes/Backend/ToolbarItems/LiveSearchToolbarItem.php index 644fca975873027854cc7147978131833c0c3c7e..de040e0b3f89a4019b78c2d81b84937f2cbe05c7 100644 --- a/typo3/sysext/backend/Classes/Backend/ToolbarItems/LiveSearchToolbarItem.php +++ b/typo3/sysext/backend/Classes/Backend/ToolbarItems/LiveSearchToolbarItem.php @@ -16,6 +16,8 @@ namespace TYPO3\CMS\Backend\Backend\ToolbarItems; use TYPO3\CMS\Backend\Domain\Repository\Module\BackendModuleRepository; use TYPO3\CMS\Backend\Toolbar\ToolbarItemInterface; +use TYPO3\CMS\Core\Imaging\Icon; +use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Lang\LanguageService; @@ -25,12 +27,18 @@ use TYPO3\CMS\Lang\LanguageService; */ class LiveSearchToolbarItem implements ToolbarItemInterface { + /** + * @var IconFactory + */ + protected $iconFactory; + /** * Constructor */ public function __construct() { $this->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Backend/LiveSearch'); + $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class); } /** @@ -58,11 +66,17 @@ class LiveSearchToolbarItem implements ToolbarItemInterface public function getItem() { return ' - <form class="typo3-topbar-navigation-search t3js-topbar-navigation-search live-search-wrapper" role="search"> + <form class="t3js-topbar-navigation-search toolbar-item-search-form live-search-wrapper" role="search"> <div class="form-group"> - <input type="text" class="form-control t3js-topbar-navigation-search-field" placeholder="' . htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.search')) . '" id="live-search-box" autocomplete="off"> + <div class="form-control-holder"> + <div class="form-control-icon"> + ' . $this->iconFactory->getIcon('apps-toolbar-menu-search', Icon::SIZE_SMALL)->render('inline') . ' + </div> + <input type="text" class="form-control toolbar-item-search-field t3js-topbar-navigation-search-field" placeholder="' . htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.search')) . '" id="live-search-box" autocomplete="off"> + </div> </div> </form> + <a href="#" class="dropdown-toggle t3js-toolbar-search-dropdowntoggle" data-toggle="dropdown" aria-expanded="false"></a> <div class="dropdown-menu" role="menu"></div> '; } @@ -74,7 +88,7 @@ class LiveSearchToolbarItem implements ToolbarItemInterface */ public function getAdditionalAttributes() { - return ['class' => 'dropdown']; + return ['class' => 'toolbar-item-search t3js-toolbar-item-search']; } /** diff --git a/typo3/sysext/backend/Classes/Backend/ToolbarItems/ShortcutToolbarItem.php b/typo3/sysext/backend/Classes/Backend/ToolbarItems/ShortcutToolbarItem.php index 9eabf97a75e76591ae7de9208662bcfba17632be..1f297f297ea5ff931fbb94dae0dd2f9987d0532c 100644 --- a/typo3/sysext/backend/Classes/Backend/ToolbarItems/ShortcutToolbarItem.php +++ b/typo3/sysext/backend/Classes/Backend/ToolbarItems/ShortcutToolbarItem.php @@ -130,7 +130,11 @@ class ShortcutToolbarItem implements ToolbarItemInterface public function getItem() { $title = htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.bookmarks')); - return '<span title="' . $title . '">' . $this->iconFactory->getIcon('apps-toolbar-menu-shortcut', Icon::SIZE_SMALL)->render('inline') . '</span>'; + $icon = $this->iconFactory->getIcon('apps-toolbar-menu-shortcut', Icon::SIZE_SMALL)->render('inline'); + return ' + <span class="toolbar-item-icon" title="' . $title . '">' . $icon . '</span> + <span class="toolbar-item-title">' . $title . '</span> + '; } /** @@ -141,67 +145,57 @@ class ShortcutToolbarItem implements ToolbarItemInterface public function getDropDown() { $languageService = $this->getLanguageService(); - $shortcutGroup = htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.bookmarksGroup')); $shortcutEdit = htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.bookmarksEdit')); $shortcutDelete = htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.bookmarksDelete')); - $editIcon = '<a href="#" class="dropdown-list-link-edit shortcut-edit" ' . $shortcutEdit . '>' + $editIcon = '<a href="#" class="dropdown-table-actions-btn dropdown-table-actions-btn-edit t3js-shortcut-edit" title="' . $shortcutEdit . '">' . $this->iconFactory->getIcon('actions-open', Icon::SIZE_SMALL)->render('inline') . '</a>'; - $deleteIcon = '<a href="#" class="dropdown-list-link-delete shortcut-delete" title="' . $shortcutDelete . '">' + $deleteIcon = '<a href="#" class="dropdown-table-actions-btn dropdown-table-actions-btn-delete t3js-shortcut-delete" title="' . $shortcutDelete . '">' . $this->iconFactory->getIcon('actions-delete', Icon::SIZE_SMALL)->render('inline') . '</a>'; - $shortcutMenu[] = '<ul class="dropdown-list">'; - - // Render shortcuts with no group (group id = 0) first - $noGroupShortcuts = $this->getShortcutsByGroup(0); - foreach ($noGroupShortcuts as $shortcut) { - $shortcutMenu[] = ' - <li class="shortcut" data-shortcutid="' . (int)$shortcut['raw']['uid'] . '"> - <a class="dropdown-list-link dropdown-link-list-add-editdelete" href="#" onclick="' . htmlspecialchars($shortcut['action']) . ' return false;">' . - $shortcut['icon'] . ' ' . - htmlspecialchars($shortcut['label']) . - '</a> - ' . $editIcon . $deleteIcon . ' - </li>'; - } - // Now render groups and the contained shortcuts + $shortcutMenu = []; + $shortcutMenu[] = '<h3 class="dropdown-headline">' . htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.bookmarks')) . '</h3>'; + $shortcutMenu[] = '<hr>'; + + // Render groups and the contained shortcuts $groups = $this->getGroupsFromShortcuts(); - krsort($groups, SORT_NUMERIC); + $groupCount = 0; + arsort($groups, SORT_NUMERIC); foreach ($groups as $groupId => $groupLabel) { - if ($groupId != 0) { - $shortcutGroup = ''; - if (count($shortcutMenu) > 1) { - $shortcutGroup .= '<li class="divider"></li>'; + $shortcuts = $this->getShortcutsByGroup($groupId); + if (count($shortcuts) > 0) { + if ($groupCount !== 0) { + $shortcutMenu[] = '<hr>'; + } + $groupCount++; + if ($groupLabel) { + $shortcutMenu[] = '<h3 class="dropdown-headline" id="shortcut-group-' . (int)$groupId . '">' . $groupLabel . '</h3>'; } - $shortcutGroup .= ' - <li class="dropdown-header" id="shortcut-group-' . (int)$groupId . '"> - ' . $groupLabel . ' - </li>'; - $shortcuts = $this->getShortcutsByGroup($groupId); - $i = 0; + $shortcutMenu[] = '<div class="dropdown-table" data-shortcutgroup="' . (int)$groupId . '">'; foreach ($shortcuts as $shortcut) { - $i++; - $shortcutGroup .= ' - <li class="shortcut" data-shortcutid="' . (int)$shortcut['raw']['uid'] . '" data-shortcutgroup="' . (int)$groupId . '"> - <a class="dropdown-list-link dropdown-link-list-add-editdelete" href="#" onclick="' . htmlspecialchars($shortcut['action']) . ' return false;">' . - $shortcut['icon'] . ' ' . - htmlspecialchars($shortcut['label']) . - '</a> - ' . $editIcon . $deleteIcon . ' - </li>'; + $shortcutItem = '<div class="dropdown-table-row t3js-topbar-shortcut" data-shortcutid="' . (int)$shortcut['raw']['uid'] . '" data-shortcutgroup="' . (int)$groupId . '">'; + $shortcutItem .= '<div class="dropdown-table-column dropdown-table-icon">'; + $shortcutItem .= $shortcut['icon']; + $shortcutItem .= '</div>'; + $shortcutItem .= '<div class="dropdown-table-column dropdown-table-title">'; + $shortcutItem .= '<a class="dropdown-table-title-ellipsis" href="#" onclick="' . htmlspecialchars($shortcut['action']) . ' return false;">'; + $shortcutItem .= htmlspecialchars($shortcut['label']); + $shortcutItem .= '</a>'; + $shortcutItem .= '</div>'; + $shortcutItem .= '<div class="dropdown-table-column dropdown-table-actions">' . $editIcon . $deleteIcon . '</div>'; + $shortcutItem .= '</div>'; + $shortcutMenu[] = $shortcutItem; } - $shortcutMenu[] = $shortcutGroup; + $shortcutMenu[] = '</div>'; } } - $shortcutMenu[] = '</ul>'; + $compiledShortcutMenu = implode(LF, $shortcutMenu); if (count($shortcutMenu) === 2) { // No shortcuts added yet, show a small help message how to add shortcuts $title = htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.bookmarks')); $icon = '<span title="' . $title . '">' . $this->iconFactory->getIcon('actions-system-shortcut-new', Icon::SIZE_SMALL)->render('inline') . '</span>'; $label = str_replace('%icon%', $icon, htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_misc.xlf:bookmarkDescription'))); - $compiledShortcutMenu = '<p>' . $label . '</p>'; - } else { - $compiledShortcutMenu = implode(LF, $shortcutMenu); + $compiledShortcutMenu .= '<p>' . $label . '</p>'; } return $compiledShortcutMenu; @@ -477,6 +471,7 @@ class ShortcutToolbarItem implements ToolbarItemInterface */ public function editFormAction(ServerRequestInterface $request, ResponseInterface $response) { + $languageService = $this->getLanguageService(); $parsedBody = $request->getParsedBody(); $queryParams = $request->getQueryParams(); @@ -495,11 +490,14 @@ class ShortcutToolbarItem implements ToolbarItemInterface // build the form $content = ' - <form class="shortcut-form" role="form"> + <form class="shortcut-form" role="form" data-shortcutid="' . (int)$selectedShortcutId . '"> + <h3 class="dropdown-headline"> + ' . htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.bookmarksEdit')) . ' + </h3> + <hr> <div class="form-group"> <input type="text" class="form-control" name="shortcut-title" value="' . htmlspecialchars($selectedShortcut['label']) . '"> </div>'; - $content .= ' <div class="form-group"> <select class="form-control" name="shortcut-group">'; @@ -509,6 +507,7 @@ class ShortcutToolbarItem implements ToolbarItemInterface $content .= ' </select> </div> + <hr> <input type="button" class="btn btn-default shortcut-form-cancel" value="Cancel"> <input type="button" class="btn btn-success shortcut-form-save" value="Save"> </form>'; diff --git a/typo3/sysext/backend/Classes/Backend/ToolbarItems/SystemInformationToolbarItem.php b/typo3/sysext/backend/Classes/Backend/ToolbarItems/SystemInformationToolbarItem.php index 3c9de2345e42051c771f0d87f457eacdca8e9268..55c66f89507c475ddfa605c684fca3809a475837 100644 --- a/typo3/sysext/backend/Classes/Backend/ToolbarItems/SystemInformationToolbarItem.php +++ b/typo3/sysext/backend/Classes/Backend/ToolbarItems/SystemInformationToolbarItem.php @@ -376,7 +376,11 @@ class SystemInformationToolbarItem implements ToolbarItemInterface { $title = htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.sysinfo')); $icon = $this->iconFactory->getIcon('actions-system-list-open', Icon::SIZE_SMALL)->render('inline'); - return '<span title="' . $title . '">' . $icon . '<span id="t3js-systeminformation-counter" class="badge"></span></span>'; + return ' + <span class="toolbar-item-icon" title="' . $title . '">' . $icon . '</span> + <span class="toolbar-item-title">' . $title . '</span> + <span class="toolbar-item-badge t3js-systeminformation-counter badge"></span> + '; } /** diff --git a/typo3/sysext/backend/Classes/Backend/ToolbarItems/UserToolbarItem.php b/typo3/sysext/backend/Classes/Backend/ToolbarItems/UserToolbarItem.php index c6f7fa8c6dd873ea9e0e413c89afafddf7c41f5e..7a38a23b3266572dd3a0da374c1b5a810ba69fdd 100644 --- a/typo3/sysext/backend/Classes/Backend/ToolbarItems/UserToolbarItem.php +++ b/typo3/sysext/backend/Classes/Backend/ToolbarItems/UserToolbarItem.php @@ -77,10 +77,10 @@ class UserToolbarItem implements ToolbarItemInterface } $html = []; - $html[] = $icon; - $html[] = '<span title="' . htmlspecialchars($title) . '">'; + $html[] = '<span class="toolbar-item-avatar">' . $icon . '</span>'; + $html[] = '<span class="toolbar-item-name" title="' . htmlspecialchars($title) . '">'; $html[] = htmlspecialchars($label); - $html[] = '<span class="caret"></span></span>'; + $html[] = '</span>'; return implode(LF, $html); } @@ -96,7 +96,7 @@ class UserToolbarItem implements ToolbarItemInterface $languageService = $this->getLanguageService(); $dropdown = []; - $dropdown[] = '<ul class="dropdown-list">'; + $dropdown[] = '<div class="dropdown-table">'; /** @var BackendModuleRepository $backendModuleRepository */ $backendModuleRepository = GeneralUtility::makeInstance(BackendModuleRepository::class); @@ -105,33 +105,32 @@ class UserToolbarItem implements ToolbarItemInterface if ($userModuleMenu != false && $userModuleMenu->getChildren()->count() > 0) { foreach ($userModuleMenu->getChildren() as $module) { /** @var BackendModule $module */ - $dropdown[] ='<li' + $dropdown[] = '<div' + . ' class="dropdown-table-row"' . ' id="' . htmlspecialchars($module->getName()) . '"' - . ' class="typo3-module-menu-item submodule mod-' . htmlspecialchars($module->getName()) . '" ' . ' data-modulename="' . htmlspecialchars($module->getName()) . '"' . ' data-navigationcomponentid="' . htmlspecialchars($module->getNavigationComponentId()) . '"' . ' data-navigationframescript="' . htmlspecialchars($module->getNavigationFrameScript()) . '"' . ' data-navigationframescriptparameters="' . htmlspecialchars($module->getNavigationFrameScriptParameters()) . '"' . '>'; - $dropdown[] = '<a title="' . htmlspecialchars($module->getDescription()) . '" href="' . htmlspecialchars($module->getLink()) . '" class="dropdown-list-link modlink">'; - $dropdown[] = '<span class="submodule-icon typo3-app-icon"><span><span>' . $module->getIcon() . '</span></span></span>'; - $dropdown[] = '<span class="submodule-label">' . htmlspecialchars($module->getTitle()) . '</span>'; + $dropdown[] = '<div class="dropdown-table-column dropdown-table-icon">' . $module->getIcon() . '</div>'; + $dropdown[] = '<div class="dropdown-table-column dropdown-table-title">'; + $dropdown[] = '<a title="' . htmlspecialchars($module->getDescription()) . '" href="' . htmlspecialchars($module->getLink()) . '" class="modlink">'; + $dropdown[] = htmlspecialchars($module->getTitle()); $dropdown[] = '</a>'; - $dropdown[] = '</li>'; + $dropdown[] = '</div>'; + $dropdown[] = '</div>'; } - $dropdown[] = '<li class="divider"></li>'; } + $dropdown[] = '</div>'; + $dropdown[] = '<hr>'; // Logout button $buttonLabel = 'LLL:EXT:lang/locallang_core.xlf:' . ($backendUser->user['ses_backuserid'] ? 'buttons.exit' : 'buttons.logout'); - $dropdown[] = '<li class="reset-dropdown">'; $dropdown[] = '<a href="' . htmlspecialchars(BackendUtility::getModuleUrl('logout')) . '" class="btn btn-danger pull-right" target="_top">'; $dropdown[] = $this->iconFactory->getIcon('actions-logout', Icon::SIZE_SMALL)->render('inline') . ' '; $dropdown[] = htmlspecialchars($languageService->sL($buttonLabel)); $dropdown[] = '</a>'; - $dropdown[] = '</li>'; - - $dropdown[] = '</ul>'; return implode(LF, $dropdown); } @@ -144,8 +143,9 @@ class UserToolbarItem implements ToolbarItemInterface public function getAdditionalAttributes() { $result = []; + $result['class'] = 'toolbar-item-user'; if ($this->getBackendUser()->user['ses_backuserid']) { - $result['class'] = 'su-user'; + $result['class'] .= ' su-user'; } return $result; } diff --git a/typo3/sysext/backend/Classes/Controller/BackendController.php b/typo3/sysext/backend/Classes/Controller/BackendController.php index a0861a6f7e4911daed19787a5a365865a17abcc7..b1a3bfad7dfc7bd882ec7a71a50b274ffce12309 100644 --- a/typo3/sysext/backend/Classes/Controller/BackendController.php +++ b/typo3/sysext/backend/Classes/Controller/BackendController.php @@ -20,6 +20,7 @@ use TYPO3\CMS\Backend\Domain\Repository\Module\BackendModuleRepository; use TYPO3\CMS\Backend\Module\ModuleLoader; use TYPO3\CMS\Backend\Toolbar\ToolbarItemInterface; use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -93,6 +94,11 @@ class BackendController */ protected $pageRenderer; + /** + * @var IconFactory + */ + protected $iconFactory; + /** * Constructor */ @@ -100,6 +106,7 @@ class BackendController { $this->getLanguageService()->includeLLFile('EXT:lang/locallang_misc.xlf'); $this->backendModuleRepository = GeneralUtility::makeInstance(BackendModuleRepository::class); + $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class); // Set debug flag for BE development only $this->debug = (int)$GLOBALS['TYPO3_CONF_VARS']['BE']['debug'] === 1; @@ -119,10 +126,7 @@ class BackendController 'modulemenu' => 'EXT:backend/Resources/Public/JavaScript/modulemenu.js', 'evalfield' => 'EXT:backend/Resources/Public/JavaScript/jsfunc.evalfield.js', 'backend' => 'EXT:backend/Resources/Public/JavaScript/backend.js', - 'viewport' => 'EXT:backend/Resources/Public/JavaScript/extjs/viewport.js', 'iframepanel' => 'EXT:backend/Resources/Public/JavaScript/iframepanel.js', - 'backendcontentiframe' => 'EXT:backend/Resources/Public/JavaScript/extjs/backendcontentiframe.js', - 'viewportConfiguration' => 'EXT:backend/Resources/Public/JavaScript/extjs/viewportConfiguration.js', ]; $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/LoginRefresh', 'function(LoginRefresh) { LoginRefresh.setIntervalTime(' . MathUtility::forceIntegerInRange((int)$GLOBALS['TYPO3_CONF_VARS']['BE']['sessionTimeout'] - 60, 60) . '); @@ -131,6 +135,9 @@ class BackendController LoginRefresh.initialize(); }'); + // load Toolbar class + $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/Toolbar'); + // load Utility class $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/Utility'); @@ -327,9 +334,8 @@ class BackendController $extOnReadyCode .= 'Ext.state.Manager.getProvider().initState(' . json_encode($states) . ');'; } - $extOnReadyCode .= ' - TYPO3.Backend = new TYPO3.Viewport(TYPO3.Viewport.configuration)'; $this->pageRenderer->addExtOnReadyCode($extOnReadyCode); + // Set document title: $title = $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] ? $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] . ' [TYPO3 CMS ' . TYPO3_version . ']' : 'TYPO3 CMS ' . TYPO3_version; // Renders the module page @@ -406,9 +412,8 @@ class BackendController // Merge class: Add dropdown class if hasDropDown, add classes from additonal attributes $classes = []; - if ($hasDropDown) { - $classes[] = 'dropdown'; - } + $classes[] = 'toolbar-item'; + $classes[] = 't3js-toolbar-item'; if (isset($additionalAttributes['class'])) { $classes[] = $additionalAttributes['class']; unset($additionalAttributes['class']); @@ -430,7 +435,7 @@ class BackendController $toolbar[] = '<li ' . implode(' ', $liAttributes) . '>'; if ($hasDropDown) { - $toolbar[] = '<a href="#" class="dropdown-toggle" data-toggle="dropdown">'; + $toolbar[] = '<a href="#" class="toolbar-item-link dropdown-toggle" data-toggle="dropdown">'; $toolbar[] = $toolbarItem->getItem(); $toolbar[] = '</a>'; $toolbar[] = '<div class="dropdown-menu" role="menu">'; diff --git a/typo3/sysext/backend/Resources/Private/Templates/Backend/Main.html b/typo3/sysext/backend/Resources/Private/Templates/Backend/Main.html index c82fc334460f48da44d2b63537d7a731c4bb7454..4300e71fa59a0affcd331660b26ed5744c15c7f2 100644 --- a/typo3/sysext/backend/Resources/Private/Templates/Backend/Main.html +++ b/typo3/sysext/backend/Resources/Private/Templates/Backend/Main.html @@ -1,14 +1,55 @@ -<div class="typo3-topbar-container" role="navigation" id="typo3-top-container"> - <div class="typo3-topbar-site"> - <a class="typo3-topbar-site-logo" href="{logoLink}" target="_blank"> - <img src="{logoUrl}" width="{logoWidth}" height="{logoHeight}" title="TYPO3 Content Management System" alt="" /> - </a> - <span class="typo3-topbar-site-name">{siteName} [{applicationVersion}]</span> - </div> - <div class="typo3-topbar-navigation" id="typo3-topbar-navigation"> - <ul class="typo3-topbar-navigation-items" data-typo3-role="typo3-module-menu"> - <f:format.raw>{toolbar}</f:format.raw> - </ul> +{namespace core = TYPO3\CMS\Core\ViewHelpers} +<div class="scaffold t3js-scaffold scaffold-modulemenu-expanded"> + <div class="scaffold-topbar t3js-scaffold-topbar"> + + <div class="topbar"> + <div class="topbar-header"> + <button class="topbar-button topbar-button-modulemenu t3js-topbar-button-modulemenu"> + <core:icon identifier="actions-move-move" alternativeMarkupIdentifier="inline" /> + </button> + <button class="topbar-button topbar-button-navigationcomponent t3js-topbar-button-navigationcomponent"> + <core:icon identifier="apps-pagetree-category-collapse-all" alternativeMarkupIdentifier="inline" /> + </button> + <a href="{logoLink}" class="topbar-header-site" target="_blank"> + <span class="topbar-header-site-logo"> + <img src="{logoUrl}" width="{logoWidth}" height="{logoHeight}" title="TYPO3 Content Management System" alt="" /> + </span> + <span class="topbar-header-site-title"> + <span class="topbar-header-site-name">{siteName}</span> + <span class="topbar-header-site-version">{applicationVersion}</span> + </span> + </a> + <button class="topbar-button topbar-button-toolbar t3js-topbar-button-toolbar"> + <core:icon identifier="actions-system-extension-configure" alternativeMarkupIdentifier="inline" /> + </button> + <button class="topbar-button topbar-button-search t3js-topbar-button-search"> + <core:icon identifier="actions-search" alternativeMarkupIdentifier="inline" /> + </button> + </div> + </div> + + </div> + <div class="scaffold-modulemenu t3js-scaffold-modulemenu"> + <div class="modulemenu t3js-modulemenu"> + <f:format.raw>{moduleMenu}</f:format.raw> + </div> + </div> + <div class="scaffold-toolbar t3js-scaffold-toolbar"> + <div class="toolbar t3js-topbar-toolbar"> + <ul class="toolbar-list" data-typo3-role="typo3-module-menu"> + <f:format.raw>{toolbar}</f:format.raw> + </ul> + </div> + </div> + <div class="scaffold-content t3js-scaffold-content"> + <div class="scaffold-content-navigation t3js-scaffold-content-navigation"> + <div class="scaffold-content-navigation-component" data-component="typo3-navigationIframe"> + <iframe src="about:blank" id="typo3-navigationContainerIframe" class="scaffold-content-navigation-iframe t3js-scaffold-content-navigation-iframe"></iframe> + </div> + </div> + <div class="scaffold-content-module t3js-scaffold-content-module"> + <iframe name="contentIframe" id="typo3-contentIframe" class="scaffold-content-module-iframe t3js-scaffold-content-module-iframe"></iframe> + </div> + <div class="scaffold-content-overlay t3js-scaffold-content-overlay"></div> </div> </div> -<f:format.raw>{moduleMenu}</f:format.raw> diff --git a/typo3/sysext/backend/Resources/Private/Templates/ModuleMenu/Main.html b/typo3/sysext/backend/Resources/Private/Templates/ModuleMenu/Main.html index 4ac7d05038bcb8ed11acf9a38e7e2aad521a5db0..2fc216a5677a20eccc673a5e75cab448960656d5 100644 --- a/typo3/sysext/backend/Resources/Private/Templates/ModuleMenu/Main.html +++ b/typo3/sysext/backend/Resources/Private/Templates/ModuleMenu/Main.html @@ -1,35 +1,30 @@ -<ul class="nav nav-modules" data-typo3-role="typo3-module-menu" id="typo3-menu"> +{namespace core = TYPO3\CMS\Core\ViewHelpers} +<ul class="nav nav-modules" data-role="modulemenu" id="menu"> <f:for each="{modules}" as="mainModule"> - <li class="typo3-module-menu-group expanded" id="{mainModule.name}" data-modulename="{mainModule.name}" data-navigationcomponentid="{mainModule.navigationComponentId}" data-navigationframescript="{mainModule.navigationFrameScript}" data-navigationframescriptparameters="{mainModule.navigationFrameScriptParameters}"> - <div class="typo3-module-menu-group-header"> - <span class="typo3-app-icon typo3-module-menu-group-icon"> - <span> + <li class="modulemenu-group expanded" id="{mainModule.name}" data-modulename="{mainModule.name}" data-navigationcomponentid="{mainModule.navigationComponentId}" data-navigationframescript="{mainModule.navigationFrameScript}" data-navigationframescriptparameters="{mainModule.navigationFrameScriptParameters}"> + <div class="modulemenu-group-header"> + <span class="modulemenu-icon modulemenu-group-icon"> <f:if condition="{mainModule.icon}"> <f:then> <f:format.raw>{mainModule.icon}</f:format.raw> </f:then> <f:else> - <span><i class="fa fa-bars"></i></span> + <core:icon identifier="actions-move-move" size="default" alternativeMarkupIdentifier="inline" /> </f:else> </f:if> - </span> </span> - <span class="typo3-module-menu-group-title"> + <span class="modulemenu-group-title"> {mainModule.title} <span class="caret"></span> </span> </div> - <ul class="typo3-module-menu-group-container"> + <ul class="modulemenu-group-container"> <f:for each="{mainModule.children}" as="subModule"> - <li id="{subModule.name}" class="typo3-module-menu-item t3js-mainmodule" data-modulename="{mainModule.name}" data-navigationcomponentid="{subModule.navigationComponentId}" data-navigationframescript="{subModule.navigationFrameScript}" data-navigationframescriptparameters="{subModule.navigationFrameScriptParameters}"> - <a title="{subModule.description}" href="{subModule.link}" class="typo3-module-menu-item-link"> - <span class="typo3-app-icon typo3-module-menu-item-icon"> - <span> - <span> - <f:format.raw>{subModule.icon}</f:format.raw> - </span> - </span> + <li id="{subModule.name}" class="modulemenu-item t3js-mainmodule" data-modulename="{mainModule.name}" data-navigationcomponentid="{subModule.navigationComponentId}" data-navigationframescript="{subModule.navigationFrameScript}" data-navigationframescriptparameters="{subModule.navigationFrameScriptParameters}"> + <a title="{subModule.description}" href="{subModule.link}" class="modulemenu-item-link"> + <span class="modulemenu-icon modulemenu-item-icon"> + <f:format.raw>{subModule.icon}</f:format.raw> </span> - <span class="typo3-module-menu-item-title"> + <span class="modulemenu-item-title"> {subModule.title} </span> </a> diff --git a/typo3/sysext/backend/Resources/Private/Templates/ToolbarMenu/SystemInformation.html b/typo3/sysext/backend/Resources/Private/Templates/ToolbarMenu/SystemInformation.html index 1273283426492f50d2f48b0af2b6553cfa604477..fd481b443b57170333b8dc5a4c19ab1ac9a750b5 100644 --- a/typo3/sysext/backend/Resources/Private/Templates/ToolbarMenu/SystemInformation.html +++ b/typo3/sysext/backend/Resources/Private/Templates/ToolbarMenu/SystemInformation.html @@ -1,43 +1,45 @@ -<ul class="dropdown-list" data-count="{count}" data-severityclass="{severityBadgeClass}"> - <li class="dropdown-header"><f:translate key="systemmessage.header" /></li> - <li id="systeminformation_installtool" class="dropdown-intro typo3-module-menu-item submodule mod-system_extinstall" data-modulename="system_extinstall"> - <f:format.raw><f:translate key="systemmessage.intro" arguments="{0: '{installToolUrl}'}" /></f:format.raw> - </li> - <li> - <dl class="dl-horizontal"> - <f:for each="{systemInformation}" as="info"> - <dt title="{info.title}"><f:format.raw>{info.icon}</f:format.raw> {info.title}</dt> - <dd><f:if condition="{info.status}"> - <f:then> - <span class="text-{info.status}">{info.value}</span> - </f:then> - <f:else> - {info.value} - </f:else> - </f:if></dd> - </f:for> - </dl> - </li> - <li class="divider"></li> - <f:if condition="{messages -> f:count()} > 0"> - <f:then> - <f:for each="{messages}" as="message"> - <f:if condition="{message.module}"> - <f:then> - <li id="systeminformation_{message.module}" class="t3js-systeminformation-module dropdown-intro typo3-module-menu-item submodule mod-{message.module}" data-modulename="{message.module}"> - <span class="text-{message.status}"><f:format.raw>{message.text}</f:format.raw></span> - </li> - </f:then> - <f:else> - <li> - <span class="text-{message.status}"><f:format.raw>{message.text}</f:format.raw></span> - </li> - </f:else> - </f:if> - </f:for> - </f:then> - <f:else> - <li><span class="text-success"><f:format.nl2br><f:translate key="systemmessage.allgood" /></f:format.nl2br></span></li> - </f:else> - </f:if> -</ul> +<span class="systeminformationtoolbaritem-container t3js-systeminformation-container" data-count="{count}" data-severityclass="{severityBadgeClass}"></span> + +<h3 class="dropdown-headline"> + <f:translate key="systemmessage.header" /> +</h3> +<p class="dropdown-text typo3-module-menu-item submodule mod-system_extinstall" data-modulename="system_extinstall"> + <f:format.raw><f:translate key="systemmessage.intro" arguments="{0: '{installToolUrl}'}" /></f:format.raw> +</p> + +<f:if condition="{systemInformation}"> + <hr> + <div class="dropdown-table"> + <f:for each="{systemInformation}" as="info"> + <div class="dropdown-table-row"> + <div class="dropdown-table-column dropdown-table-icon"><f:format.raw>{info.icon}</f:format.raw></div> + <div class="dropdown-table-column dropdown-table-title">{info.title}</div> + <div class="dropdown-table-column dropdown-table-value {f:if(condition: info.status, then: 'text-{info.status}')}">{info.value}</div> + </div> + </f:for> + </div> +</f:if> + +<hr> + +<f:if condition="{messages -> f:count()} > 0"> + <f:then> + <f:for each="{messages}" as="message"> + <f:if condition="{message.module}"> + <f:then> + <p id="systeminformation_{message.module}" class="dropdown-text t3js-systeminformation-module typo3-module-menu-item submodule mod-{message.module}" data-modulename="{message.module}"> + <span class="text-{message.status}"><f:format.raw>{message.text}</f:format.raw></span> + </p> + </f:then> + <f:else> + <p class="dropdown-text text-{message.status}"> + <f:format.raw>{message.text}</f:format.raw> + </p> + </f:else> + </f:if> + </f:for> + </f:then> + <f:else> + <p class="dropdown-text text-success"><f:format.nl2br><f:translate key="systemmessage.allgood" /></f:format.nl2br></p> + </f:else> +</f:if> diff --git a/typo3/sysext/backend/Resources/Public/Css/backend.css b/typo3/sysext/backend/Resources/Public/Css/backend.css index fa1a51000cc81794e05d614f440138e3db27e6e5..cc0751d00041aed5941a26abaff7fda9a0037e93 100644 --- a/typo3/sysext/backend/Resources/Public/Css/backend.css +++ b/typo3/sysext/backend/Resources/Public/Css/backend.css @@ -2754,7 +2754,8 @@ ul ol, ol ol { margin-bottom: 0; } -.list-unstyled { +.list-unstyled, +.modulemenu .modulemenu-group-container { padding-left: 0; list-style: none; } @@ -4836,7 +4837,7 @@ tbody.collapse.in { list-style: none; font-size: 12px; text-align: left; - background-color: #fff; + background-color: #424242; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 2px; @@ -4851,7 +4852,7 @@ tbody.collapse.in { height: 1px; margin: 8px 0; overflow: hidden; - background-color: #e5e5e5; + background-color: #525252; } .dropdown-menu > li > a { display: block; @@ -4859,14 +4860,14 @@ tbody.collapse.in { clear: both; font-weight: normal; line-height: 1.5; - color: #5a5a5a; + color: #fff; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { text-decoration: none; - color: #4d4d4d; - background-color: #f5f5f5; + color: #fff; + background-color: #525252; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, @@ -4874,7 +4875,7 @@ tbody.collapse.in { color: #fff; text-decoration: none; outline: 0; - background-color: #0078e6; + background-color: #525252; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, @@ -7074,210 +7075,898 @@ button.close { bottom: 20px; } } -.autocomplete { +html { + height: 100%; + overflow: hidden; +} +body { + height: 100%; + overflow: auto; +} +.scaffold { + background-color: #f5f5f5; + color: #333333; position: relative; + padding-top: 45px; + height: 100vh; } -.autocomplete-results { - z-index: 1000; +.scaffold-topbar { + background-color: #1f1f1e; + color: #f5f5f5; + height: 45px; position: absolute; - margin: 5px 0; - top: 100%; + top: 0; right: 0; - border: 1px solid #ddd; - border-radius: 2px; - background-color: #fff; + left: 0; +} +.scaffold-modulemenu { + background-color: #424242; + color: #fff; + position: fixed; + top: 45px; + left: 0; + bottom: 0; + width: 40px; + max-width: 100%; + z-index: 1000; overflow: hidden; - box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.25); } -.autocomplete-suggestion { - border-top: 1px solid #ddd; +.scaffold-modulemenu a { + color: rgba(255, 255, 255, 0.7); } -.autocomplete-suggestion:first-child { - border-top: none; +.scaffold-modulemenu a:hover { + color: #fff; } -.autocomplete-suggestion-link { - padding: 5px 13px 5px 28px; - display: block; - text-decoration: none; +.scaffold-modulemenu .active > a { + color: #fff; } -.autocomplete-selected .autocomplete-suggestion-link, -.autocomplete-suggestion-link:hover { - background-color: #fafafa; - text-decoration: none; +.scaffold-toolbar { + overflow: auto; + background-color: #424242; + color: #fff; + z-index: 1000; + position: fixed; + top: 45px; + left: 0; + right: 0; + bottom: 0; + display: none; } -.autocomplete-info { - padding: 5px 15px; +.scaffold-toolbar a { + color: rgba(255, 255, 255, 0.7); } -.avatar { - position: relative; - display: inline-block; - height: 32px; - width: 32px; - vertical-align: middle; +.scaffold-toolbar a:hover { + color: #fff; } -.avatar-image { - display: block; - height: 32px; - width: 32px; - overflow: hidden; - border-radius: 50%; +.scaffold-toolbar .active > a { + color: #fff; } -.avatar-image:after { - display: block; - content: ''; - position: absolute; - top: 0; +@media (min-width: 992px) { + .scaffold-toolbar { + overflow: visible; + background-color: transparent; + height: 45px; + top: 0; + left: auto; + bottom: auto; + display: block; + } +} +@media (max-width: 991px) { + .scaffold-toolbar-expanded .scaffold-toolbar, + .scaffold-search-expanded .scaffold-toolbar { + display: block; + } +} +.scaffold-content { + position: fixed!important; + top: 45px; left: 0; + right: 0; + bottom: 0; +} +@media (max-width: 991px) { + .scaffold-content { + left: 0!important; + } +} +.scaffold-content-navigation-iframe, +.scaffold-content-module-iframe { + display: block; + border: none; height: 100%; width: 100%; - border-radius: 50%; - border: 1px solid rgba(255, 255, 255, 0.1); } -.avatar-image > img { - width: 100% !important; - height: auto !important; +.scaffold-content-navigation { + display: none; + position: absolute!important; + left: 0; + top: 0; + bottom: 0; + width: 300px; } -.avatar-icon { +.scaffold-content-navigation-component { position: absolute; + top: 0; bottom: 0; + left: 0; right: 0; - height: 16px; - width: 16px; } -.dropdown-toggle > .avatar { - height: 28px; - width: 28px; - float: left; - margin-right: 0.5em; - margin-top: -5px; +.scaffold-content-navigation-component #typo3-pagetree-treeContainer > div > .x-panel-body { + overflow: auto; } -.dropdown-toggle .avatar-image { - height: 28px; - width: 28px; +.scaffold-content-module { + position: absolute!important; + top: 0; + left: 0; + bottom: 0; + right: 0; } -.callout { - background-color: #f0f0f0; - border-left: 3px solid #ccc; - margin: 20px 0; - padding: 20px; - color: #333; +@media (max-width: 767px) { + .scaffold-content-module { + width: 100%; + } } -.callout .media { - margin: 0; +.scaffold-content-overlay { + display: none; + position: absolute; + z-index: 1040; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.65); } -.callout .media .fa-stack { - color: #fff; +.scaffold-modulemenu-expanded .scaffold-content-overlay { + display: block; } -.callout .media .fa-stack > .fa:first-child { - color: #ccc; +@media (min-width: 992px) { + .scaffold-modulemenu-expanded .scaffold-content-overlay { + display: none; + } } -.callout .media-body { - vertical-align: middle; +@media (min-width: 992px) { + .scaffold { + padding-left: 40px; + } } -.callout-icon { - margin-top: -2px; +.scaffold .scaffold-modulemenu { + width: 40px; } -.callout-title { - font-size: 1.3em; - margin: 0 0 0.5em; +@media (max-width: 991px) { + .scaffold .scaffold-modulemenu { + display: none; + } } -.callout-body > *:last-child { - margin-bottom: 0; +.scaffold-modulemenu-expanded { + display: block; + padding-left: 230px; } -.callout-success { - background-color: #d1e2bd; - border-color: #79a548; - color: #333; +.scaffold-modulemenu-expanded .scaffold-modulemenu { + width: 230px; } -.callout-success .media { - margin: 0; +@media (max-width: 991px) { + .scaffold-modulemenu-expanded .scaffold-modulemenu { + display: block; + } } -.callout-success .media .fa-stack { - color: #fff; +.scaffold-modulemenu-expanded .scaffold-content { + transform: translate(230px, 0); } -.callout-success .media .fa-stack > .fa:first-child { - color: #79a548; +.scaffold-content-navigation-expanded .scaffold-content-navigation { + display: block; } -.callout-info { - background-color: #ebf3fb; - border-color: #6daae0; - color: #333; +.scaffold-content-navigation-expanded .scaffold-content-module { + left: 300px; } -.callout-info .media { - margin: 0; +@media (min-width: 992px) { + .scaffold .scaffold-content { + left: 40px; + } + .scaffold-modulemenu-expanded .scaffold-content { + left: 230px; + transform: none; + } } -.callout-info .media .fa-stack { - color: #fff; +.topbar { + background-color: inherit; + position: relative; + height: 45px; } -.callout-info .media .fa-stack > .fa:first-child { - color: #6daae0; +.topbar a { + color: inherit; + text-decoration: none; } -.callout-warning { - background-color: #fbefdd; - border-color: #e8a33d; - color: #333; +.topbar-button { + position: absolute; + top: 0; + display: inline-block; + border: 0; + background-color: #222; + height: 45px; + width: 40px; } -.callout-warning .media { - margin: 0; +.topbar-button:hover { + background-color: #2a2a2a; } -.callout-warning .media .fa-stack { - color: #fff; +.topbar-button.topbar-button-modulemenu { + left: 0; } -.callout-warning .media .fa-stack > .fa:first-child { - color: #e8a33d; +@media (min-width: 992px) { + .topbar-button.topbar-button-modulemenu { + background-color: #424242; + } } -.callout-danger { - background-color: #efc7c7; - border-color: #c83c3c; - color: #333; +.topbar-button.topbar-button-navigationcomponent { + left: 40px; } -.callout-danger .media { - margin: 0; +.topbar-button.topbar-button-toolbar { + right: 40px; } -.callout-danger .media .fa-stack { - color: #fff; +.topbar-button.topbar-button-search { + right: 0; } -.callout-danger .media .fa-stack > .fa:first-child { - color: #c83c3c; +.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu { + background-color: #424242; } -.callout-notice { - background-color: #f9f9f9; - border-color: #a0a0a0; - color: #333; +.scaffold-content-navigation-expanded .topbar-button-navigationcomponent { + background-color: #424242; } -.callout-notice .media { - margin: 0; +@media (max-width: 991px) { + .scaffold-toolbar-expanded .toolbar-item-search { + display: none; + } } -.callout-notice .media .fa-stack { - color: #fff; +.scaffold-toolbar-expanded .topbar-button-toolbar { + background-color: #424242; } -.callout-notice .media .fa-stack > .fa:first-child { - color: #a0a0a0; +@media (max-width: 991px) { + .scaffold-search-expanded .toolbar-item { + display: none; + } + .scaffold-search-expanded .toolbar-item-search { + display: block; + width: 100%; + } } -.icon { - position: relative; - display: inline-block; - overflow: hidden; - white-space: nowrap; - vertical-align: -22%; +.scaffold-search-expanded .topbar-button-search { + background-color: #424242; } -.icon svg, -.icon img { +.topbar-button-toolbar, +.topbar-button-search { display: block; - height: 100%; - width: 100%; - transform: translate3d(0, 0, 0); } -.icon * { - display: block; - line-height: inherit; +@media (min-width: 992px) { + .topbar-button-toolbar, + .topbar-button-search { + display: none; + } } -.icon-markup { - position: absolute; +.topbar-header { + padding-left: 80px; + padding-right: 80px; +} +.topbar-header-site { + position: relative; display: block; - text-align: center; - top: 0; - left: 0; + max-width: 100%; + height: 45px; + line-height: 45px; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; +} +@media (min-width: 992px) { + .topbar-header-site { + display: inline-block; + } +} +.topbar-header-site:before, +.topbar-header-site:after { + display: block; + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 1em; +} +.topbar-header-site:before { + left: 0; + background: linear-gradient(to right, #1f1f1e 0%, rgba(31, 31, 30, 0) 100%); +} +.topbar-header-site:after { + right: 0; + background: linear-gradient(to right, rgba(31, 31, 30, 0) 0%, #1f1f1e 100%); +} +.typo3-in-workspace .topbar-header-site { + background-color: #6d860d; +} +.typo3-in-workspace .topbar-header-site:before { + background: linear-gradient(to right, #6d860d 0%, rgba(109, 134, 13, 0) 100%); +} +.typo3-in-workspace .topbar-header-site:after { + background: linear-gradient(to right, rgba(109, 134, 13, 0) 0%, #6d860d 100%); +} +.topbar-header-site-logo { + height: 45px; + display: none; + padding-right: 0.5em; +} +@media (min-width: 320px) { + .topbar-header-site-logo { + display: inline-block; + } +} +.topbar-header-site-title { + line-height: 1.2em; + display: inline-block; + vertical-align: middle; +} +.topbar-header-site-name { + display: block; +} +.topbar-header-site-version { + opacity: 0.5; +} +.toolbar { + padding: 8px; +} +@media (min-width: 992px) { + .toolbar { + padding: 0; + } +} +.toolbar:after { + clear: both; + display: table; + content: ''; +} +.toolbar-list { + list-style: none; + padding: 0; + margin: 0; +} +.toolbar-item { + padding: 4px; + position: relative; + display: block; + float: left; + width: 100%; +} +@media (min-width: 600px) { + .toolbar-item { + width: 50%; + } +} +@media (min-width: 750px) { + .toolbar-item { + width: 33.33%; + } +} +@media (min-width: 992px) { + .toolbar-item { + padding: 0; + width: auto; + margin-left: 1px; + } +} +.toolbar-item .dropdown-menu { + width: 350px; +} +@media (max-width: 991px) { + .toolbar-item .dropdown-menu { + overflow: auto; + padding: 15px; + position: fixed; + max-height: 90%; + max-width: 90%; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + .toolbar-item .dropdown-backdrop { + background: rgba(0, 0, 0, 0.65); + } +} +.toolbar-item-avatar { + width: 32px; + display: inline-block; +} +.toolbar-item-avatar .avatar { + position: absolute; + top: 50%; + left: 10px; + transform: translate(0, -50%); +} +.toolbar-item-badge { + position: absolute; + bottom: 4px; + right: 4px; + padding: 3px 4px; + border-radius: 0; + font-size: 10px; + font-weight: normal; + min-width: 16px; +} +.toolbar-item-link { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + border: 1px solid rgba(0, 0, 0, 0.5); + position: relative; + display: block; + text-decoration: none; + padding: 9px 10px; + height: 45px; + line-height: 27px; +} +.toolbar-item-link:hover, +.toolbar-item-link:focus { + text-decoration: none; +} +@media (min-width: 992px) { + .toolbar-item-link { + border: none; + } +} +.open .toolbar-item-link { + background-color: #424242; +} +@media (min-width: 992px) { + .toolbar-item-title { + display: none; + } +} +@media (min-width: 992px) { + .toolbar-item-search { + width: 300px; + } +} +.toolbar-item-search form { + padding: 0; + margin: 0; +} +.toolbar-item-search .toolbar-item-link { + padding: 0; + margin: 0; + height: 0; +} +.toolbar-item-search .form-group { + margin: 0; +} +.toolbar-item-search .close { + color: #ffffff; + text-shadow: none; + opacity: 1; +} +@media (max-width: 991px) { + .toolbar-item-search .dropdown-menu { + top: 114px; + left: 14px; + right: 14px; + width: auto; + max-width: none; + max-height: none; + transform: none; + bottom: 14px; + } +} +@media (min-width: 992px) { + .toolbar-item-search .dropdown-menu { + left: auto; + right: 0; + } +} +.toolbar-item-search .autocomplete-suggestions { + position: static!important; +} +.toolbar-item-search .autocomplete-suggestion { + border: none; +} +.toolbar-item-search.open .toolbar-item-search-form { + position: relative; + z-index: 991; +} +.toolbar-item-search-field { + color: inherit; + background-color: #2f2f2f; + margin: 0; + border-radius: 0; + border: 1px solid rgba(0, 0, 0, 0.5); + height: 45px; + box-shadow: none; +} +@media (min-width: 992px) { + .toolbar-item-search-field { + border: none; + } +} +.toolbar-item-search-field:hover { + background-color: #333; +} +.toolbar-item-search-field:focus { + box-shadow: none; + background-color: #555555; +} +.module-wrapper { + position: relative; +} +.module-wrapper iframe { + border: none; +} +.modulemenu .modulemenu-group-container { + clear: both; +} +.modulemenu .modulemenu-group { + position: relative; + padding: 5px 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); +} +.modulemenu .modulemenu-group-header, +.modulemenu .modulemenu-item-link { + position: relative; + display: block; + cursor: pointer; + padding: 2px 4px; + text-decoration: none; +} +.modulemenu .modulemenu-group-header { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-transform: uppercase; +} +.modulemenu .modulemenu-item-link:focus, +.modulemenu .modulemenu-item-link:hover { + outline: none; + background-color: rgba(0, 0, 0, 0.1); +} +.modulemenu .modulemenu-item.active .modulemenu-item-link { + background-color: rgba(0, 0, 0, 0.15); +} +.modulemenu .modulemenu-icon { + float: left; + margin-right: 4px; +} +.modulemenu .modulemenu-icon .fa { + font-size: 0.5em; +} +.modulemenu .modulemenu-group-title, +.modulemenu .modulemenu-item-title { + white-space: nowrap; + text-overflow: ellipsis; + padding-top: 7px; + padding-left: 4px; + display: none; + overflow: hidden; + *zoom: 1; +} +.modulemenu .modulemenu-group-title { + padding-right: 20px; +} +.modulemenu .modulemenu-group-title .caret { + transform: rotate(90deg); + position: absolute; + top: 17px; + right: 18px; +} +.modulemenu .expanded .modulemenu-group-title .caret { + transform: rotate(0deg); +} +.scaffold-modulemenu-expanded .modulemenu-group-title, +.scaffold-modulemenu-expanded .modulemenu-item-title { + display: block; +} +.autocomplete { + position: relative; +} +.autocomplete-results { + z-index: 1000; + position: absolute; + margin: 5px 0; + top: 100%; + right: 0; + border: 1px solid #ddd; + border-radius: 2px; + background-color: #fff; + overflow: hidden; + box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.25); +} +.autocomplete-suggestion { + border-top: 1px solid #ddd; +} +.autocomplete-suggestion:first-child { + border-top: none; +} +.autocomplete-suggestion-link { + padding: 5px 13px 5px 28px; + display: block; + text-decoration: none; +} +.autocomplete-selected .autocomplete-suggestion-link, +.autocomplete-suggestion-link:hover { + background-color: #fafafa; + text-decoration: none; +} +.autocomplete-info { + padding: 5px 15px; +} +.dropdown-menu { + line-height: 1.45em; + border: 0; + margin: 0; + border-radius: 0; +} +.dropdown-menu a { + display: block; +} +.dropdown-menu a:hover { + text-decoration: none; +} +.dropdown-menu hr { + border-top: 1px solid rgba(0, 0, 0, 0.25); + margin: 1.25em -15px; +} +.dropdown-menu > *:last-child { + margin-bottom: 0; +} +.dropdown-menu .form-group { + margin-bottom: 0.75em; +} +.dropdown-menu .form-control { + border-color: #aaaaaa; + color: inherit; + border-radius: 0; + background-color: #333333; +} +.dropdown-menu .form-control:focus { + box-shadow: none; + border-color: #bbbbbb; +} +.dropdown-menu .btn { + border: none; + border-radius: 0; + padding: 6px 10px; +} +.dropdown-headline { + font-size: 1.15em; + margin-top: 0; + margin-bottom: 0.5em; +} +.dropdown-text a { + display: inline-block; +} +div.dropdown-menu { + padding: 1.5em; +} +.dropdown-list { + padding-left: 0; + list-style: none; +} +.dropdown-list > li { + position: relative; +} +.dropdown-list > li + li { + margin-top: 0.5em; +} +.dropdown-list-link { + display: block; + text-decoration: none; +} +.dropdown-list-link:hover, +.dropdown-list-link:focus { + text-decoration: none; +} +.dropdown-table { + display: table; + width: 100%; +} +.dropdown-table-row { + display: table-row; +} +.dropdown-table-column { + display: table-cell; + padding-top: 0.25em; + padding-bottom: 0.25em; + vertical-align: middle; +} +.dropdown-table-column-top { + vertical-align: top; +} +.dropdown-table-icon { + width: 16px; + padding-right: 0.5em; +} +.dropdown-table-title { + white-space: nowrap; + padding-right: 1.5em; +} +.dropdown-table-title-ellipsis { + max-width: 230px; + overflow: hidden; + display: block; + white-space: nowrap; + text-overflow: ellipsis; +} +.dropdown-table-actions { + white-space: nowrap; + text-align: right; +} +.dropdown-table-actions-btn { + text-align: center; + display: inline-block !important; + margin-top: -4px; + margin-bottom: -4px; + padding: 4px; + vertical-align: middle; +} +.dropdown-table-actions-btn-close:hover, +.dropdown-table-actions-btn-edit:hover { + background-color: #333; +} +.dropdown-table-actions-btn-delete:hover { + background-color: #c83c3c; +} +.avatar { + position: relative; + display: inline-block; + height: 32px; + width: 32px; + vertical-align: middle; +} +.avatar-image { + display: block; + height: 32px; + width: 32px; + overflow: hidden; + border-radius: 50%; +} +.avatar-image:after { + display: block; + content: ''; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + border-radius: 50%; + border: 1px solid rgba(255, 255, 255, 0.1); +} +.avatar-image > img { + width: 100% !important; + height: auto !important; +} +.avatar-icon { + position: absolute; + bottom: 0; + right: 0; + height: 16px; + width: 16px; +} +.callout { + background-color: #f0f0f0; + border-left: 3px solid #ccc; + margin: 20px 0; + padding: 20px; + color: #333; +} +.callout .media { + margin: 0; +} +.callout .media .fa-stack { + color: #fff; +} +.callout .media .fa-stack > .fa:first-child { + color: #ccc; +} +.callout .media-body { + vertical-align: middle; +} +.callout-icon { + margin-top: -2px; +} +.callout-title { + font-size: 1.3em; + margin: 0 0 0.5em; +} +.callout-body > *:last-child { + margin-bottom: 0; +} +.callout-success { + background-color: #d1e2bd; + border-color: #79a548; + color: #333; +} +.callout-success .media { + margin: 0; +} +.callout-success .media .fa-stack { + color: #fff; +} +.callout-success .media .fa-stack > .fa:first-child { + color: #79a548; +} +.callout-info { + background-color: #ebf3fb; + border-color: #6daae0; + color: #333; +} +.callout-info .media { + margin: 0; +} +.callout-info .media .fa-stack { + color: #fff; +} +.callout-info .media .fa-stack > .fa:first-child { + color: #6daae0; +} +.callout-warning { + background-color: #fbefdd; + border-color: #e8a33d; + color: #333; +} +.callout-warning .media { + margin: 0; +} +.callout-warning .media .fa-stack { + color: #fff; +} +.callout-warning .media .fa-stack > .fa:first-child { + color: #e8a33d; +} +.callout-danger { + background-color: #efc7c7; + border-color: #c83c3c; + color: #333; +} +.callout-danger .media { + margin: 0; +} +.callout-danger .media .fa-stack { + color: #fff; +} +.callout-danger .media .fa-stack > .fa:first-child { + color: #c83c3c; +} +.callout-notice { + background-color: #f9f9f9; + border-color: #a0a0a0; + color: #333; +} +.callout-notice .media { + margin: 0; +} +.callout-notice .media .fa-stack { + color: #fff; +} +.callout-notice .media .fa-stack > .fa:first-child { + color: #a0a0a0; +} +.icon { + position: relative; + display: inline-block; + overflow: hidden; + white-space: nowrap; + vertical-align: -22%; +} +.icon svg, +.icon img { + display: block; + height: 100%; + width: 100%; + transform: translate3d(0, 0, 0); +} +.icon * { + display: block; + line-height: inherit; +} +.icon-markup { + position: absolute; + display: block; + text-align: center; + top: 0; + left: 0; right: 0; bottom: 0; } @@ -7501,6 +8190,7 @@ button.close { } .module-body .container-small { max-width: 768px; + margin: 0 auto; } .module-docheader + .module-body { padding-top: 89px; @@ -7579,17 +8269,16 @@ button.close { .panel-body:after, .modal-header:after, .modal-footer:after, +.modulemenu .modulemenu-group-header:after, +.modulemenu .modulemenu-item-link:after, +.dropdown-list > li:after, .module-docheader:after, .module-docheader .module-docheader-bar:after, .panel-heading:after, .pagination-block:after, .typo3-login-copyright-link:after, .form-irre-header-body dl dd:after, -[id="typo3-menu"] .typo3-module-menu-group-header:after, -[id="typo3-menu"] .typo3-module-menu-item-link:after, .t3-page-ce .t3-page-ce-header:after, -.typo3-topbar-navigation-items .dropdown-list > li:after, -.typo3-topbar-navigation-items .dropdown-list .modlink:after, #typo3-debug-console .topbar:after, .distribution-holder:after, .distribution-detail:after { @@ -8125,7 +8814,8 @@ button.close { left: auto; right: 7px; } -.bootstrap-datetimepicker-widget .list-unstyled { +.bootstrap-datetimepicker-widget .list-unstyled, +.bootstrap-datetimepicker-widget .modulemenu .modulemenu-group-container { margin: 0; } .bootstrap-datetimepicker-widget a[data-action] { @@ -8679,7 +9369,7 @@ button.close { top: 0; left: 0; width: 100%; - height: 4px; + height: 2px; } /* Fancy blur effect */ #nprogress .peg { @@ -9142,74 +9832,6 @@ div#contentMenu1 { padding-bottom: 3px; border-bottom: 1px solid #C3C3C3; } -#typo3-navigationContainer-xcollapsed:before { - content: ""; - position: absolute; - top: 0; - width: 8px; - height: 100%; - background-color: #626262; - border-right: 1px solid #444444; - border-left: 1px solid #111; - box-shadow: 3px 0 0 rgba(0, 0, 0, 0.15); -} -.x-panel-body .x-layout-cmini-west .x-layout-mini, -.x-panel-body .x-layout-split-west .x-layout-mini { - top: 50%; - margin-top: -40px; -} -.typo3-btn-collapse-page-tree, -.x-layout-split-west .x-layout-mini, -.x-layout-cmini-west .x-layout-mini { - height: 80px; - width: 14px; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - background: none; - border: 1px solid #C3C3C3; - border-left: 1px solid #F5F5F5; - display: block; - font-size: 0; - opacity: 1; - filter: alpha(opacity=100); -} -.typo3-btn-collapse-page-tree:after, -.x-layout-split-west .x-layout-mini:after, -.x-layout-cmini-west .x-layout-mini:after { - font-family: 'FontAwesome'; - content: "\f0d9"; - position: absolute; - top: 50%; - display: block; - width: 100%; - margin-top: -1px; - color: #000; - font-size: 12px; - vertical-align: middle; - text-align: center; -} -.x-layout-split-west .x-layout-mini { - background-color: #F5F5F5; -} -.x-layout-split-west .x-layout-mini:hover { - background-color: #e8e8e8; -} -.x-layout-cmini-west .x-layout-mini { - background-color: #626262; - margin-left: 7px; - border: 1px solid #444444; - border-left: 0; -} -.x-layout-cmini-west .x-layout-mini:hover { - opacity: 1; - filter: alpha(opacity=100); - background-color: #6f6f6f; -} -.x-layout-cmini-west .x-layout-mini:after { - margin-top: -9px; - color: #fff; - content: "\f0da"; -} .alert-notice { background-color: #333; border-color: transparent; @@ -9398,6 +10020,9 @@ div#contentMenu1 { .modal-image-manipulation .modal-panel-body img { max-width: 100%; } +#typo3-pagetree-topPanelItems { + background-color: #eee; +} #typo3-pagetree { height: 100%; } @@ -11874,6 +12499,17 @@ label .icon img { fieldset[disabled] .form-control { color: #737373; } +.form-control-icon { + position: absolute; + top: 50%; + left: 15px; + transform: translate(0, -50%); + z-index: 1; +} +.form-control-icon + .form-control, +.form-control-icon + .form-control-clearable .form-control { + padding-left: 3.25em; +} .form-group.has-error label:before { font-family: FontAwesome; font-size: 12px; @@ -12165,167 +12801,28 @@ select.icon-select option { .checkbox-inline.radio label, .radio-inline.checkbox label, .checkbox-inline.checkbox label { - white-space: nowrap; - } -} -textarea.formengine-textarea { - resize: none; -} -.link-browser-section { - border-bottom: 1px solid #d7d7d7; - margin: 0 15px 15px 15px; -} -.link-browser-section.link-browser-current-link, -.link-browser-section.link-browser-tabs { - padding-bottom: 0; - border-bottom: none; -} -.link-browser-section.link-browser-pagetree h3, -.link-browser-section.link-browser-filetree h3 { - margin-top: 0; -} -.link-browser-section:last-child { - padding-bottom: 0; - border: none; -} -body#typo3-backend-php { - margin: 0; - padding: 0; -} -#typo3-main-container { - clear: both; -} -#typo3-top { - margin-left: 160px; -} -iframe { - width: 100%; -} -#typo3-side-menu, -iframe { - height: 100%; - overflow: auto; -} -[id="typo3-module-menu"] { - background: #222; - color: #fff; -} -[id="typo3-module-menu-xsplit"] { - z-index: 10; - width: 1px; - background-color: #2b2b2b; - box-shadow: 2px 0px 3px rgba(0, 0, 0, 0.5); -} -[id="typo3-module-menu-xsplit"]:hover { - box-shadow: 2px 0px 3px rgba(0, 0, 0, 0.9); -} -[id="typo3-module-menu-xsplit"] .x-layout-mini-wrapper { - left: -7px; - width: 15px; -} -[id="typo3-menu"] { - padding-left: 0; - list-style: none; -} -[id="typo3-menu"] .typo3-module-menu-group-container { - clear: both; - padding-left: 0; - list-style: none; - padding-right: 15px; -} -[id="typo3-menu"] .typo3-module-menu-group { - transition: background-color 0.4s ease-in-out; - position: relative; - color: #fff; - background-color: #222; - border-top: 1px solid #2b2b2b; - border-bottom: 1px solid #111; - padding: 5px 0; -} -[id="typo3-menu"] .typo3-module-menu-group.expanded { - background-color: #222; -} -[id="typo3-menu"] .typo3-module-menu-group-header { - position: relative; - cursor: pointer; - display: block; - padding: 4px 9px; - text-transform: uppercase; -} -[id="typo3-menu"] .typo3-module-menu-item { - margin: 1px 0; -} -[id="typo3-menu"] .typo3-module-menu-item-link { - position: relative; - cursor: pointer; - display: block; - padding: 4px 9px; - color: #aaa; - border-radius: 0 2px 2px 0; - text-decoration: none; -} -[id="typo3-menu"] .typo3-module-menu-item-link:focus, -[id="typo3-menu"] .typo3-module-menu-item-link:hover { - outline: none; - color: #fff; - background-color: #2a2a2a; -} -[id="typo3-menu"] .typo3-module-menu-item.active .typo3-module-menu-item-link { - color: #fff; - background-color: #484848; -} -[id="typo3-menu"] .typo3-module-menu-group-icon, -[id="typo3-menu"] .typo3-module-menu-item-icon { - float: left; - margin-right: 10px; -} -[id="typo3-menu"] .typo3-module-menu-group-icon { - background-color: transparent; -} -[id="typo3-menu"] .typo3-module-menu-group-icon > span { - line-height: 32px; -} -[id="typo3-menu"] .typo3-module-menu-group-icon > span > .t3-icon { - width: 32px; - height: 32px; -} -[id="typo3-menu"] .typo3-module-menu-group-icon > span > .t3-icon:before { - line-height: 32px; -} -[id="typo3-menu"] .typo3-module-menu-group-icon:after { - display: none; -} -[id="typo3-menu"] .typo3-module-menu-group-title, -[id="typo3-menu"] .typo3-module-menu-item-title { - white-space: nowrap; - text-overflow: ellipsis; - padding-top: 7px; - display: block; - overflow: hidden; - *zoom: 1; -} -[id="typo3-menu"] .typo3-module-menu-group-title { - padding-right: 20px; + white-space: nowrap; + } } -[id="typo3-menu"] .typo3-module-menu-group-title .caret { - transition: all 0.25s ease-in-out; - transform: rotate(90deg); - position: absolute; - top: 15px; - right: 18px; +textarea.formengine-textarea { + resize: none; } -[id="typo3-menu"] .expanded .typo3-module-menu-group-title .caret { - transform: rotate(0deg); +.link-browser-section { + border-bottom: 1px solid #d7d7d7; + margin: 0 15px 15px 15px; } -.typo3-module-menu-snapped .typo3-module-menu-group-container { - padding-right: 0; +.link-browser-section.link-browser-current-link, +.link-browser-section.link-browser-tabs { + padding-bottom: 0; + border-bottom: none; } -.typo3-module-menu-snapped .typo3-module-menu-item-link { - border-radius: 0; +.link-browser-section.link-browser-pagetree h3, +.link-browser-section.link-browser-filetree h3 { + margin-top: 0; } -.typo3-module-menu-snapped .typo3-module-menu-group-title, -.typo3-module-menu-snapped .typo3-module-menu-item-title { - display: none; +.link-browser-section:last-child { + padding-bottom: 0; + border: none; } .query-builder .form-inline > .form-control-clearable { display: inline; @@ -12582,6 +13079,12 @@ iframe { */ .ui-resizable-handle { border: solid #dadada; + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; + transform: translateX(50%); } .ui-resizable-handle:hover { border-color: #585858; @@ -12595,11 +13098,11 @@ iframe { border-width: 2px 0; } .ui-resizable-e { - cursor: col-resize; - width: 2px; - right: -15px; - top: 30%; - height: 40%; + cursor: e-resize; + width: 25px; + right: -5px; + top: 0; + height: 100%; border-width: 0 2px; } .ui-resizable-se { @@ -12650,363 +13153,6 @@ span.item-state-deleted { display: inline-block; padding: 4px 4px; } -[id="typo3-topbar"], -[id="typo3-topbar"] .x-panel-body { - min-width: 1000px; -} -[id="typo3-topbar"] { - height: 45px; - position: relative; - background-color: #111; - color: #ddd; -} -[id="typo3-topbar"] .x-panel-bwrap, -[id="typo3-topbar"] .x-panel-body { - overflow: visible; -} -.typo3-in-workspace [id="typo3-topbar"] { - background-color: #6d860d; -} -.typo3-in-workspace [id="typo3-topbar"] .typo3-topbar-site-name { - color: #fff; -} -.typo3-topbar-container { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - height: 45px; - position: relative; -} -.typo3-topbar-site { - display: table; - padding: 0; - height: 45px; - float: left; -} -.typo3-topbar-site-logo, -.typo3-topbar-site-name { - display: table-cell; - vertical-align: middle; - text-align: center; -} -.typo3-topbar-site-logo { - background-color: #111; - width: 51px; - box-shadow: 2px 0px 0px rgba(0, 0, 0, 0.15); -} -.typo3-topbar-site-logo:hover { - background-color: #333; -} -.typo3-topbar-site-logo > img { - max-height: 50px; -} -.typo3-topbar-site-name { - cursor: default; - padding: 0 15px; -} -.typo3-topbar-navigation { - color: #ddd; - background-color: #222; - float: right; -} -.typo3-topbar-navigation .shortcut { - min-width: 180px; -} -.typo3-topbar-navigation .shortcut-form { - padding: 16px; - margin: 4px -16px; - border-top: 1px solid #373737; - background-color: #2b2b2b; - border-bottom: 1px solid #111; -} -.typo3-topbar-navigation-items { - height: 45px; - margin-bottom: 0; - padding-left: 0; - list-style: none; - float: left; -} -.typo3-topbar-navigation-items .icon-color { - fill: #ddd; -} -.typo3-topbar-navigation-items a { - color: #ddd; - text-decoration: none; -} -.typo3-topbar-navigation-items > li { - float: left; - height: 45px; -} -.typo3-topbar-navigation-items > li > a { - position: relative; - display: block; - padding: 13.5px 10px; - border-left: 1px solid #2b2b2b; - border-right: 1px solid #111; -} -.typo3-topbar-navigation-items > li > a:hover, -.typo3-topbar-navigation-items > li > a:focus, -.typo3-topbar-navigation-items > li > a:active { - color: #fff; - background-color: #333; - border-left-color: #3b3b3b; -} -.typo3-topbar-navigation-items > li.open > a { - color: #fff; - background-color: #484848; - border-left-color: #505050; -} -.typo3-topbar-navigation-items .dropdown { - min-width: 45px; - text-align: center; -} -.typo3-topbar-navigation-items .dropdown > a > .fa { - font-size: 16px; - margin: 0; - display: inline-block; - position: relative; - vertical-align: middle; - width: auto; - height: auto; -} -.typo3-topbar-navigation-items .dropdown > a .icon-size-default .icon-unify, -.typo3-topbar-navigation-items .dropdown > a .icon-size-small .icon-unify { - line-height: 16px; - font-size: 16px; -} -.typo3-topbar-navigation-items .dropdown-toggle { - position: relative; -} -.typo3-topbar-navigation-items .dropdown-toggle .badge { - display: none; - font-size: 10px; - min-width: 15px; - height: 15px; - position: absolute; - padding: 0; - border-radius: 2px; - line-height: 15px; - bottom: 5px; - right: 5px; -} -.typo3-topbar-navigation-items .live-search-wrapper + .dropdown-menu { - width: 100%; -} -.typo3-topbar-navigation-items .live-search-wrapper + .dropdown-menu .dropdown-list { - position: relative!important; -} -.typo3-topbar-navigation-items .dropdown-menu { - left: auto; - right: 0; - margin: 0; - z-index: 2000; - padding: 8px 16px; - color: #ddd; - background-color: #222; - border-color: #111; - border-top: 1px solid #444444; - border-left: 0; - border-right: 0; - border-radius: 0 0 2px 2px; - box-shadow: 0px 3px 0px rgba(0, 0, 0, 0.15); -} -.typo3-topbar-navigation-items .dropdown-menu a { - color: #ddd; - white-space: nowrap; -} -.typo3-topbar-navigation-items .dropdown-menu > *:last-child { - margin-bottom: 0; -} -.typo3-topbar-navigation-items .dropdown-list { - padding-left: 0; - list-style: none; -} -.typo3-topbar-navigation-items .dropdown-list > li { - position: relative; -} -.typo3-topbar-navigation-items .dropdown-list > li.active .dropdown-list-link { - background-color: #484848; - color: #fff; -} -.typo3-topbar-navigation-items .dropdown-list > li + li { - margin-top: 1px; -} -.typo3-topbar-navigation-items .dropdown-list > li.divider + li { - margin-top: 0; -} -.typo3-topbar-navigation-items .dropdown-list .divider { - border-top: 1px solid #111; - background-color: #2b2b2b; - margin: 8px -16px; - padding: 1px 0 0; -} -.typo3-topbar-navigation-items .dropdown-list .modlink { - width: 210px; -} -.typo3-topbar-navigation-items .dropdown-list .modlink .submodule-icon { - float: left; - margin-right: 10px; -} -.typo3-topbar-navigation-items .dropdown-list .modlink .submodule-label { - white-space: nowrap; - text-overflow: ellipsis; - padding-top: 7px; - display: block; - overflow: hidden; - *zoom: 1; -} -.typo3-topbar-navigation-items .dropdown-list .dropdown-header { - font-size: 1em; - margin-left: -16px; - margin-right: -16px; - padding: 8px 16px; -} -.typo3-topbar-navigation-items .dropdown-list .dropdown-intro, -.typo3-topbar-navigation-items .dropdown-list .dropdown-info { - color: #aaaaaa; - margin-left: -16px; - margin-right: -16px; - padding: 8px 16px; -} -.typo3-topbar-navigation-items .dropdown-list .dl-horizontal dt { - width: 140px; - text-align: left; - font-weight: normal; -} -.typo3-topbar-navigation-items .dropdown-list .dl-horizontal dd { - margin-left: 150px; - width: 170px; - word-wrap: break-word; -} -.typo3-topbar-navigation-items .dropdown-list-link { - max-width: 300px; - overflow: hidden; - text-overflow: ellipsis; - display: block; - text-decoration: none; - cursor: pointer; - white-space: nowrap; - color: #ddd; - margin-left: -16px; - margin-right: -16px; - padding: 4px 16px; -} -.typo3-topbar-navigation-items .dropdown-list-link:hover { - color: #fff; - background-color: #333; -} -.typo3-topbar-navigation-items .dropdown-list-link .badge { - background-color: #c83c3c; - color: #fff; -} -.typo3-topbar-navigation-items .dropdown-list-link small { - white-space: normal; - width: 270px; - display: block; - padding-left: 21px; -} -.typo3-topbar-navigation-items .dropdown-list-link-edit, -.typo3-topbar-navigation-items .dropdown-list-link-delete, -.typo3-topbar-navigation-items .dropdown-list-link-close { - position: absolute; - top: 0; - bottom: 0; - right: -8px; - padding: 0; - text-align: center; - line-height: 26px; - width: 26px; - height: 26px; -} -.typo3-topbar-navigation-items .dropdown-list-link-edit:hover, -.typo3-topbar-navigation-items .dropdown-list-link-delete:hover, -.typo3-topbar-navigation-items .dropdown-list-link-close:hover { - background-color: #333; -} -.typo3-topbar-navigation-items .dropdown-list-link-edit { - right: 18px; -} -.typo3-topbar-navigation-items .dropdown-list-link-delete:hover, -.typo3-topbar-navigation-items .dropdown-list-link-close:hover { - background-color: #c83c3c; -} -.typo3-topbar-navigation-items .dropdown-link-list-add-close { - padding-right: 50px; -} -.typo3-topbar-navigation-items .dropdown-link-list-add-editdelete { - padding-right: 85px; -} -.typo3-topbar-navigation-items .topbar-workspaces-title { - margin-left: 3px; -} -.typo3-topbar-navigation-search { - position: relative; - padding: 0; - margin: 0; -} -.typo3-topbar-navigation-search .form-group { - margin-top: 0; - margin-bottom: 0; -} -.typo3-topbar-navigation-search .form-group:before { - content: "\f002"; - font: normal normal normal 14px/1 FontAwesome; - position: absolute; - top: 50%; - left: 15px; - margin-top: -8px; - z-index: 1; -} -.typo3-topbar-navigation-search .form-group button.close { - opacity: 1; - color: #ddd; - text-shadow: none; -} -.typo3-topbar-navigation-search .form-control { - background-color: #222; - color: #ddd; - height: 45px; - width: 300px; - padding: 14px 30px 13px 35px; - border: none; - border-left: 1px solid #2b2b2b; - border-radius: 0; -} -.typo3-topbar-navigation-search .form-control:hover { - border-left-color: #373737; - background-color: #333; -} -.typo3-topbar-navigation-search .form-control:focus { - outline: none; - border-left-color: #515151; - background-color: #484848; - box-shadow: none; -} -.typo3-topbar-navigation-search .form-control + .t3-icon { - text-align: center; - position: absolute; - top: 50%; - right: 15px; - margin-right: 0; - margin-top: -8px; -} -.typo3-topbar-navigation-search .dropdown-menu { - left: auto!important; - width: 350px; -} -.typo3-topbar-navigation-search .dropdown-list-link { - max-width: none; -} -.typo3-topbar-navigation-search .dropdown-list-link .typeahead-highlight { - font-weight: normal; -} -#typo3-cms-backend-backend-toolbaritems-shortcuttoolbaritem .dropdown-list { - max-height: 270px; - overflow: hidden; - overflow-y: auto; - padding-right: 10px; -} #typo3-debug-console { background-color: #f5f5f5; width: 100%; diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/DebugConsole.js b/typo3/sysext/backend/Resources/Public/JavaScript/DebugConsole.js index ae7c1e65bbe6f050e0499b8bbebe403cbe4cfc38..7ef7c118635e3b6482463e723a74a227c665fe52 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/DebugConsole.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/DebugConsole.js @@ -122,7 +122,7 @@ define(['jquery'], function ($) { * Attach the Debugger Console to the viewport */ DebugConsole.attachToViewport = function() { - var $viewport = $('#typo3-contentContainer'); + var $viewport = $('.t3js-scaffold-content'); if ($viewport.has(DebugConsole.$consoleDom).length === 0) { $viewport.append(DebugConsole.$consoleDom); } diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/LiveSearch.js b/typo3/sysext/backend/Resources/Public/JavaScript/LiveSearch.js index c7f2cf75a8559c530c670a65678f72c9eaaa2a74..32d8cee916e33475bb2e3a07dd8f28a87845eaa7 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/LiveSearch.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/LiveSearch.js @@ -20,8 +20,11 @@ define(['jquery', 'jquery/autocomplete', 'TYPO3/CMS/Backend/jquery.clearable'], 'use strict'; var containerSelector = '#typo3-cms-backend-backend-toolbaritems-livesearchtoolbaritem'; + var toolbarItem = '.t3js-toolbar-item-search'; + var dropdownToggle = '.t3js-toolbar-search-dropdowntoggle'; var searchFieldSelector = '.t3js-topbar-navigation-search-field'; var formSelector = '.t3js-topbar-navigation-search'; + var autocompleteContainer = '.t3js-toolbar-search-autocomplete'; var url = TYPO3.settings.ajaxUrls['livesearch']; var category = ''; @@ -32,18 +35,19 @@ define(['jquery', 'jquery/autocomplete', 'TYPO3/CMS/Backend/jquery.clearable'], paramName: 'q', dataType: 'json', minChars: 2, + width: '100%', groupBy: 'typeLabel', - containerClass: 'dropdown-list', + containerClass: 'autocomplete-suggestions ' + autocompleteContainer.substr(1, autocompleteContainer.length), appendTo: containerSelector + ' .dropdown-menu', forceFixPosition: false, preserveInput: true, showNoSuggestionNotice: true, triggerSelectOnValidInput: false, preventBadQueries: false, - noSuggestionNotice: '<div class="dropdown-info">' + TYPO3.LLL.liveSearch.listEmptyText + '</div>' - + '<div class="search-list-help-content"><strong>' + TYPO3.LLL.liveSearch.helpTitle + '</strong>' - + '<p>' + TYPO3.LLL.liveSearch.helpDescription + '<br>' + TYPO3.LLL.liveSearch.helpDescriptionPages + '</p>' - + '</div>', + noSuggestionNotice: '<h3 class="dropdown-headline">' + TYPO3.LLL.liveSearch.listEmptyText + '</h3>' + + '<p>' + TYPO3.LLL.liveSearch.helpTitle + '</p>' + + '<hr>' + + '<p>' + TYPO3.LLL.liveSearch.helpDescription + '<br>' + TYPO3.LLL.liveSearch.helpDescriptionPages + '</p>', // put the AJAX results in the right format transformResult: function(response) { return { @@ -62,30 +66,47 @@ define(['jquery', 'jquery/autocomplete', 'TYPO3/CMS/Backend/jquery.clearable'], var html = ''; // add a divider if it's not the first group if (i > 0) { - html = '<div class="divider"></div>'; + html = '<hr>'; } - return html + '<div class="dropdown-header">' + category + '</div>'; + return html + '<h3 class="dropdown-headline">' + category + '</h3>'; }, // Rendering of each item formatResult: function(suggestion, value) { - return '<a class="dropdown-list-link" href="#" data-pageid="' + suggestion.data.pageId + '" data-target="' + suggestion.data.editLink + '">' + - suggestion.data.iconHTML + ' ' + suggestion.data.title + - '</a>'; + return '' + + '<div class="dropdown-table">' + + '<div class="dropdown-table-row">' + + '<div class="dropdown-table-column dropdown-table-icon">' + suggestion.data.iconHTML + '</div>' + + '<div class="dropdown-table-column dropdown-table-title">' + + '<a class="dropdown-table-title-ellipsis dropdown-list-link" href="#" data-pageid="' + suggestion.data.pageId + '" data-target="' + suggestion.data.editLink + '">' + + suggestion.data.title + + '</a>' + + '</div>' + + '</div>' + + '</div>' + + ''; }, - onSearchComplete: function() { - $(containerSelector).addClass('open'); + onSearchComplete: function(query, suggestions) { + if (!$(toolbarItem).hasClass('open') && $(searchFieldSelector).val().length > 1) { + $(dropdownToggle).dropdown('toggle'); + $(searchFieldSelector).focus(); + } }, beforeRender: function(container) { // Unset height, width and z-index again, should be fixed by the plugin at a later point - container.attr('style', '').append('<div class="divider"></div><div>' + + container.attr('style', '').append('<hr><div>' + '<a href="#" class="btn btn-primary pull-right t3js-live-search-show-all">' + TYPO3.LLL.liveSearch.showAllResults + '</a>' + '</div>'); - $(containerSelector).addClass('open'); + if (!$(toolbarItem).hasClass('open')) { + $(dropdownToggle).dropdown('toggle'); + $(searchFieldSelector).focus(); + } }, onHide: function() { - $(containerSelector).removeClass('open'); + if ($(toolbarItem).hasClass('open')) { + $(dropdownToggle).dropdown('toggle'); + } } }); @@ -93,15 +114,19 @@ define(['jquery', 'jquery/autocomplete', 'TYPO3/CMS/Backend/jquery.clearable'], $(containerSelector).on('click', '.t3js-live-search-show-all', function(evt) { evt.preventDefault(); TYPO3.ModuleMenu.App.showModule('web_list', 'id=0&search_levels=-1&search_field=' + encodeURIComponent($(searchFieldSelector).val())); + $(searchFieldSelector).val('').trigger('change'); }); $(containerSelector).on('click', '.dropdown-list-link', function(evt) { evt.preventDefault(); jump($(this).data('target'), 'web_list', 'web', $(this).data('pageid')); + $(searchFieldSelector).val('').trigger('change'); }); $(searchFieldSelector).clearable({ onClear: function() { - $(containerSelector).removeClass('open'); + if ($(toolbarItem).hasClass('open')) { + $(dropdownToggle).dropdown('toggle'); + } } }); diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar.js b/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar.js new file mode 100644 index 0000000000000000000000000000000000000000..05340c9facd9eb8ed1b261bd6581affbbd8b8863 --- /dev/null +++ b/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar.js @@ -0,0 +1,60 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Backend/Toolbar + * Toolbar component of the TYPO3 backend + * @exports TYPO3/CMS/Backend/Toolbar + */ +require( + [ + 'jquery', + 'TYPO3/CMS/Backend/Icons', + 'TYPO3/CMS/Backend/modulemenu' + ], + function ($) { + + TYPO3.Toolbar = {}; + TYPO3.Toolbar.App = { + initialize: function () { + this.initializeEvents(); + }, + initializeEvents: function () { + $('.t3js-toolbar-item').parent().on('hidden.bs.dropdown', function () { + $('.scaffold') + .removeClass('scaffold-toolbar-expanded') + .removeClass('scaffold-search-expanded'); + }); + $(document).on('click', '.toolbar-item [data-modulename]', function (evt) { + var moduleName = $(this).data('modulename'); + TYPO3.ModuleMenu.App.showModule(moduleName); + evt.preventDefault(); + }); + $(document).on('click', '.t3js-topbar-button-toolbar', function () { + $('.scaffold') + .removeClass('scaffold-modulemenu-expanded') + .removeClass('scaffold-search-expanded') + .toggleClass('scaffold-toolbar-expanded'); + }); + $(document).on('click', '.t3js-topbar-button-search', function () { + $('.scaffold') + .removeClass('scaffold-modulemenu-expanded') + .removeClass('scaffold-toolbar-expanded') + .toggleClass('scaffold-search-expanded'); + }); + } + }; + // start the module menu app + TYPO3.Toolbar.App.initialize(); + } +); diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/ClearCacheMenu.js b/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/ClearCacheMenu.js index 55158a87c14899fcee8b7ecb68e2b7c40c09bae2..b3ff39b1b7c48e33160bd4fea3cf218af580e522 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/ClearCacheMenu.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/ClearCacheMenu.js @@ -28,7 +28,7 @@ define(['jquery', 'TYPO3/CMS/Backend/Icons', 'TYPO3/CMS/Backend/Notification'], options: { containerSelector: '#typo3-cms-backend-backend-toolbaritems-clearcachetoolbaritem', menuItemSelector: '.dropdown-menu a', - toolbarIconSelector: '.dropdown-toggle span.icon' + toolbarIconSelector: '.toolbar-item-icon .t3js-icon', } }; diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/ShortcutMenu.js b/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/ShortcutMenu.js index b2ff220a45683889683142ca80064761603a23e3..91145a99221938474e629a06c786f682a3c5142c 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/ShortcutMenu.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/ShortcutMenu.js @@ -33,9 +33,11 @@ define(['jquery', containerSelector: '#typo3-cms-backend-backend-toolbaritems-shortcuttoolbaritem', toolbarIconSelector: '.dropdown-toggle span.icon', toolbarMenuSelector: '.dropdown-menu', - shortcutItemSelector: '.dropdown-menu .shortcut', - shortcutDeleteSelector: '.shortcut-delete', - shortcutEditSelector: '.shortcut-edit', + + shortcutItemSelector: '.t3js-topbar-shortcut', + shortcutDeleteSelector: '.t3js-shortcut-delete', + shortcutEditSelector: '.t3js-shortcut-edit', + shortcutFormTitleSelector: 'input[name="shortcut-title"]', shortcutFormGroupSelector: 'select[name="shortcut-group"]', shortcutFormSaveSelector: '.shortcut-form-save', @@ -59,22 +61,22 @@ define(['jquery', }, cache: false }).done(function(data) { - $shortcutRecord.html(data); + $(ShortcutMenu.options.containerSelector).find(ShortcutMenu.options.toolbarMenuSelector).html(data); }); }; /** * Save the data from the in-place-editor for a shortcut * - * @param {Object} $shortcutRecord + * @param {Object} $shortcutForm */ - ShortcutMenu.saveShortcutForm = function($shortcutRecord) { + ShortcutMenu.saveShortcutForm = function($shortcutForm) { $.ajax({ url: TYPO3.settings.ajaxUrls['shortcut_saveform'], data: { - shortcutId: $shortcutRecord.data('shortcutid'), - shortcutTitle: $shortcutRecord.find(ShortcutMenu.options.shortcutFormTitleSelector).val(), - shortcutGroup: $shortcutRecord.find(ShortcutMenu.options.shortcutFormGroupSelector).val() + shortcutId: $shortcutForm.data('shortcutid'), + shortcutTitle: $shortcutForm.find(ShortcutMenu.options.shortcutFormTitleSelector).val(), + shortcutGroup: $shortcutForm.find(ShortcutMenu.options.shortcutFormGroupSelector).val() }, type: 'post', cache: false @@ -186,18 +188,24 @@ define(['jquery', evt.preventDefault(); evt.stopImmediatePropagation(); ShortcutMenu.deleteShortcut($(this).closest(ShortcutMenu.options.shortcutItemSelector)); + }).on('click', ShortcutMenu.options.shortcutFormGroupSelector, function(evt) { + evt.preventDefault(); + evt.stopImmediatePropagation(); }).on('click', ShortcutMenu.options.shortcutEditSelector, function(evt) { evt.preventDefault(); evt.stopImmediatePropagation(); ShortcutMenu.editShortcut($(this).closest(ShortcutMenu.options.shortcutItemSelector)); }).on('click', ShortcutMenu.options.shortcutFormSaveSelector, function(evt) { - ShortcutMenu.saveShortcutForm($(this).closest(ShortcutMenu.options.shortcutItemSelector)); + evt.preventDefault(); + evt.stopImmediatePropagation(); + ShortcutMenu.saveShortcutForm($(this).closest(ShortcutMenu.options.shortcutFormSelector)); }).on('submit', ShortcutMenu.options.shortcutFormSelector, function(evt) { evt.preventDefault(); evt.stopImmediatePropagation(); - ShortcutMenu.saveShortcutForm($(this).closest(ShortcutMenu.options.shortcutItemSelector)); - }).on('click', ShortcutMenu.options.shortcutFormCancelSelector, function() { - // re-render the menu on canceling the update of a shortcut + ShortcutMenu.saveShortcutForm($(this).closest(ShortcutMenu.options.shortcutFormSelector)); + }).on('click', ShortcutMenu.options.shortcutFormCancelSelector, function(evt) { + evt.preventDefault(); + evt.stopImmediatePropagation(); ShortcutMenu.refreshMenu(); }); }; diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/SystemInformationMenu.js b/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/SystemInformationMenu.js index 9db960503236b7b6074fb79aef7f159e18a47f69..bf03794c4110f83fba2ce3108fcfcc41baac803a 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/SystemInformationMenu.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/Toolbar/SystemInformationMenu.js @@ -26,12 +26,12 @@ define(['jquery', 'TYPO3/CMS/Backend/Icons', 'TYPO3/CMS/Backend/Storage'], funct var SystemInformationMenu = { identifier: { containerSelector: '#typo3-cms-backend-backend-toolbaritems-systeminformationtoolbaritem', - toolbarIconSelector: '.dropdown-toggle span.icon', + toolbarIconSelector: '.toolbar-item-icon .t3js-icon', menuContainerSelector: '.dropdown-menu', moduleLinks: '.t3js-systeminformation-module' }, elements: { - $counter: $('#t3js-systeminformation-counter') + $counter: $('.t3js-systeminformation-counter') } }; @@ -77,15 +77,15 @@ define(['jquery', 'TYPO3/CMS/Backend/Icons', 'TYPO3/CMS/Backend/Storage'], funct * Updates the counter */ SystemInformationMenu.updateCounter = function() { - var $ul = $(SystemInformationMenu.identifier.containerSelector).find(SystemInformationMenu.identifier.menuContainerSelector).find('ul'), - count = $ul.data('count'), - badgeClass = $ul.data('severityclass'); + var $container = $(SystemInformationMenu.identifier.containerSelector).find(SystemInformationMenu.identifier.menuContainerSelector).find('.t3js-systeminformation-container'), + count = $container.data('count'), + badgeClass = $container.data('severityclass'); SystemInformationMenu.elements.$counter.text(count).toggle(parseInt(count) > 0); SystemInformationMenu.elements.$counter.removeClass(); if (badgeClass !== '') { - SystemInformationMenu.elements.$counter.addClass('badge ' + badgeClass); + SystemInformationMenu.elements.$counter.addClass('toolbar-item-badge badge ' + badgeClass); } }; diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Utility.js b/typo3/sysext/backend/Resources/Public/JavaScript/Utility.js index 95757656229884788ff36b60a8138380f2e5d79f..bc69091bc49a887746ae278c85d38613b3fa0c5a 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/Utility.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/Utility.js @@ -46,6 +46,9 @@ define(['jquery'], function($) { * @returns {String} */ Utility.getParameterFromUrl = function(url, parameter) { + if (typeof url.split !== 'function') { + return ''; + } var parts = url.split('?'), value = ''; diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Viewport.js b/typo3/sysext/backend/Resources/Public/JavaScript/Viewport.js new file mode 100644 index 0000000000000000000000000000000000000000..49a7db53942ab2b22975b2f4f4203cfbf8587be1 --- /dev/null +++ b/typo3/sysext/backend/Resources/Public/JavaScript/Viewport.js @@ -0,0 +1,138 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Backend/Viewport + * Handles the main logic of the TYPO3 backend viewport + * @exports TYPO3/CMS/Backend/Viewport + */ +define( + 'TYPO3/CMS/Backend/Viewport', + [ + 'jquery' + ], + function ($) { + 'use strict'; + + TYPO3.Backend = { + initialize: function() { + TYPO3.Backend.doLayout(); + $(document).on('resize', TYPO3.Backend.doLayout); + }, + /** + * This function is triggered whenever a re-layouting of component is needed + */ + doLayout: function () { + TYPO3.Backend.NavigationContainer.cleanup(); + TYPO3.Backend.NavigationContainer.calculateScrollbar(); + if (Ext.getCmp('typo3-pagetree') !== undefined) { + Ext.getCmp('typo3-pagetree').doLayout(); + } + }, + Loader: { + start: function() { + require(['nprogress'], function(NProgress) { + NProgress.configure({parent: '.t3js-scaffold-content-module', showSpinner: false}); + NProgress.start(); + }); + }, + finish: function() { + require(['nprogress'], function(NProgress) { + NProgress.done(); + }); + } + }, + NavigationContainer: { + toggle: function () { + $('.t3js-scaffold').toggleClass('scaffold-content-navigation-expanded') + }, + cleanup: function() { + $('.t3js-scaffold-modulemenu').removeAttr('style'); + $('t3js-scaffold-content').removeAttr('style'); + }, + hide: function () { + $('.t3js-scaffold').removeClass('scaffold-content-navigation-expanded'); + $('.t3js-scaffold-content-module').removeAttr('style'); + }, + show: function (component) { + if(component !== undefined) { + $('.t3js-scaffold').addClass('scaffold-content-navigation-expanded'); + } + $('.t3js-scaffold-content-navigation [data-component]').hide(); + $('.t3js-scaffold-content-navigation [data-component=' + component + ']').show(); + }, + setUrl: function(urlToLoad) { + $('.t3js-scaffold').addClass('scaffold-content-navigation-expanded'); + $('.t3js-scaffold-content-navigation-iframe').attr('src', urlToLoad); + }, + getUrl: function() { + return $('.t3js-scaffold-content-navigation-iframe').attr('src'); + }, + refresh: function() { + console.log('refresh navi'); + }, + calculateScrollbar: function (){ + TYPO3.Backend.NavigationContainer.cleanup(); + var $scaffold = $('.t3js-scaffold'); + var $moduleMenuContainer = $('.t3js-scaffold-modulemenu'); + var $contentContainer = $('.t3js-scaffold-content'); + var $moduleMenu = $('.t3js-modulemenu'); + $moduleMenuContainer.css('overflow', 'auto'); + var moduleMenuContainerWidth = $moduleMenuContainer.outerWidth(); + var moduleMenuWidth = $moduleMenu.outerWidth(); + $moduleMenuContainer.removeAttr('style').css('overflow', 'hidden'); + if ($scaffold.hasClass('scaffold-modulemenu-expanded') === false) { + $moduleMenuContainer.width(moduleMenuContainerWidth + (moduleMenuContainerWidth - moduleMenuWidth)); + $contentContainer.css('left', moduleMenuContainerWidth + (moduleMenuContainerWidth - moduleMenuWidth)) + } else { + $moduleMenuContainer.removeAttr('style'); + $contentContainer.removeAttr('style'); + } + $moduleMenuContainer.css('overflow', 'auto'); + } + }, + /** + * Contentcontainer + */ + ContentContainer: { + setUrl: function (urlToLoad) { + TYPO3.Backend.Loader.start(); + $('.t3js-scaffold-content-module-iframe') + .attr('src', urlToLoad) + .one('load', function() { + TYPO3.Backend.Loader.finish(); + }); + }, + getUrl: function() { + return $('.t3js-scaffold-content-navigation-iframe').attr('src'); + }, + refresh: function() { + console.log('refresh content'); + }, + getIdFromUrl: function() { + if(this.getUrl) { + return TYPO3.Utility.getParameterFromUrl(this.getUrl, 'id'); + } else { + return 0; + } + } + } + }; + + // start the module menu app + TYPO3.Backend.initialize(); + return TYPO3.Backend; + } +); + + diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/backendcontentiframe.js b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/backendcontentiframe.js deleted file mode 100644 index a2557e68e7327b6b6d7cbd1fd26ec21fb726a033..0000000000000000000000000000000000000000 --- a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/backendcontentiframe.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -Ext.ns('TYPO3'); - -TYPO3.backendContentIframePanel = Ext.extend(TYPO3.iframePanel ,{ - setUrl: function(source) { - var card; - var wrapper; - wrapper = Ext.getCmp('typo3-contentContainerWrapper'); - this.url = source; - if(wrapper) { - card = Ext.getCmp('typo3-card-' + TYPO3.ModuleMenu.App.loadedModule); - if((card != undefined) && (source.search('extjspaneldummy.html') > -1)) { - wrapper.getLayout().setActiveItem('typo3-card-' + TYPO3.ModuleMenu.App.loadedModule); - if (typeof wrapper.getComponent(('typo3-card-' + TYPO3.ModuleMenu.App.loadedModule)).setUrl === 'function') { - wrapper.getComponent(('typo3-card-' + TYPO3.ModuleMenu.App.loadedModule)).setUrl(source); - } - } else { - wrapper.getLayout().setActiveItem(this.id); - this.body.dom.src = source; - this.startLoader(); - } - } - }, - - getUrl: function () { - var wrapper; - var card; - wrapper = Ext.getCmp('typo3-contentContainerWrapper'); - - if(wrapper) { - card = wrapper.getLayout().activeItem; - if(card.id == this.id) { - return this.body.dom.src; - } else if(typeof card.getUrl == 'function') { - return card.getUrl(); - } else { - return this.url; - } - } - } -}); -Ext.reg('backendContentIframePanel', TYPO3.backendContentIframePanel); \ No newline at end of file diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/actions.js b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/actions.js index 75ad1c0fdca8e83aacef052e6c6d8a5e56beb6fb..b74bb2c8ad5fcb754b8faa929e7488a5c90ce9b3 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/actions.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/actions.js @@ -282,9 +282,9 @@ TYPO3.Components.PageTree.Actions = { } TYPO3.Components.PageTree.Configuration.temporaryMountPoint = response; - TYPO3.Backend.NavigationContainer.PageTree.addTemporaryMountPointIndicator(); + Ext.getCmp('typo3-pagetree-tree').app.addTemporaryMountPointIndicator(); - var selectedNode = TYPO3.Backend.NavigationContainer.PageTree.getSelected(); + var selectedNode = Ext.getCmp('typo3-pagetree-tree').app.getSelected(); tree.stateId = 'Pagetree' + TYPO3.Components.PageTree.Configuration.temporaryMountPoint; tree.refreshTree(function() { var nodeIsSelected = false; @@ -314,7 +314,7 @@ TYPO3.Components.PageTree.Actions = { */ editPageProperties: function(node) { node.select(); - var returnUrl = TYPO3.Backend.ContentContainer.src; + var returnUrl = TYPO3.Backend.ContentContainer.getUrl(); if (returnUrl.indexOf('returnUrl') !== -1) { returnUrl = TYPO3.Utility.getParameterFromUrl(returnUrl, 'returnUrl'); } else { @@ -719,14 +719,6 @@ TYPO3.Components.PageTree.Actions = { node.select(); if (tree.stateHash) { tree.stateHash.lastSelectedNode = node.id; - } else { - TYPO3.Components.PageTree.Commands.addRootlineOfNodeToStateHash( - TYPO3.Backend.NavigationContainer.PageTree.mainTree.stateId, - node.attributes.nodeData.id, function(stateHash) { - TYPO3.Backend.NavigationContainer.PageTree.mainTree.stateHash = stateHash; - TYPO3.Backend.NavigationContainer.PageTree.mainTree.refreshTree(); - } - ); } fsMod.recentIds['web'] = node.attributes.nodeData.id; diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/app.js b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/app.js index 19844e89ad3e6a28a5c692a5961c06d793f6be9e..bb9970d1d21a476ada965bb8f67946099e7e87f0 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/app.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/app.js @@ -42,6 +42,13 @@ TYPO3.Components.PageTree.App = Ext.extend(Ext.Panel, { */ layout:'fit', + /** + * Monitor resize + * + * @type {Boolean} + */ + monitorResize: true, + /** * Active tree * @@ -85,18 +92,19 @@ TYPO3.Components.PageTree.App = Ext.extend(Ext.Panel, { stateId: 'Pagetree' + TYPO3.Components.PageTree.Configuration.temporaryMountPoint, stateEvents: [], autoScroll: true, - autoHeight: false, - plugins: new Ext.ux.state.TreePanel(), + autoHeight: true, + autoWidth: true, + plugins: [new Ext.ux.state.TreePanel()], commandProvider: TYPO3.Components.PageTree.Actions, contextMenuProvider: TYPO3.Components.PageTree.ContextMenuDataProvider, treeDataProvider: TYPO3.Components.PageTree.DataProvider, + monitorResize: true, app: this, listeners: { resize: { fn: function() { - var treeContainer = Ext.getCmp(this.id + '-treeContainer'); - Ext.getCmp(this.id + '-filteringTree').setSize(treeContainer.getSize()); - treeContainer.doLayout(); + this.doLayout(true); + TYPO3.Backend.doLayout(); }, scope: this, buffer: 250 @@ -151,6 +159,7 @@ TYPO3.Components.PageTree.App = Ext.extend(Ext.Panel, { this.add({ layout: 'border', border: false, + monitorResize: true, items: [ topPanelItems, { @@ -158,6 +167,7 @@ TYPO3.Components.PageTree.App = Ext.extend(Ext.Panel, { id: this.id + '-treeContainer', region: 'center', layout: 'fit', + monitorResize: true, items: [this.mainTree, filteringTree] }, deletionDropZone @@ -175,9 +185,6 @@ TYPO3.Components.PageTree.App = Ext.extend(Ext.Panel, { } this.doLayout(); - this.ownerCt.on('resize', function() { - this.doLayout(); - }); }, this); TYPO3.Components.PageTree.App.superclass.initComponent.apply(this, arguments); @@ -207,7 +214,7 @@ TYPO3.Components.PageTree.App = Ext.extend(Ext.Panel, { border: false, id: this.id + '-indicatorBar-temporaryMountPoint', cls: this.id + '-indicatorBar-item', - + scope: this, listeners: { afterrender: { fn: function() { @@ -411,16 +418,19 @@ TYPO3.Components.PageTree.App = Ext.extend(Ext.Panel, { * * @return {TYPO3.Components.PageTree.App} */ -TYPO3.ModuleMenu.App.registerNavigationComponent('typo3-pagetree', function() { - TYPO3.Backend.NavigationContainer.PageTree = new TYPO3.Components.PageTree.App(); - - // compatibility code - top.nav = TYPO3.Backend.NavigationContainer.PageTree; - top.nav_frame = TYPO3.Backend.NavigationContainer.PageTree; - top.content.nav_frame = TYPO3.Backend.NavigationContainer.PageTree; - - return TYPO3.Backend.NavigationContainer.PageTree; -}); +require( + [ + 'TYPO3/CMS/Backend/modulemenu' + ], + function () { + // extjs loading bugfix + window.setTimeout(function() { + TYPO3.ModuleMenu.App.registerNavigationComponent('typo3-pagetree', function () { + return new TYPO3.Components.PageTree.App(); + }); + }, 5000); + } +); // XTYPE Registration Ext.reg('TYPO3.Components.PageTree.App', TYPO3.Components.PageTree.App); diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/toppanel.js b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/toppanel.js index 1b2c16bae923a972df41c43347f2b41d78ab1b12..c3706935d090e8257ecde08f0efbb10685e4cd59 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/toppanel.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/toppanel.js @@ -40,7 +40,7 @@ TYPO3.Components.PageTree.TopPanel = Ext.extend(Ext.Panel, { * * @type {Boolean} */ - border: false, + border: true, /** * Toolbar Object @@ -248,14 +248,11 @@ TYPO3.Components.PageTree.TopPanel = Ext.extend(Ext.Panel, { textField.setHideTrigger(false); this.tree.hide(); - this.app.ownerCt.getEl().mask('', 'x-mask-loading-message'); - this.app.ownerCt.getEl().addClass('t3-mask-loading'); this.filteringTree.show().refreshTree(function() { if (selectedNode) { this.app.select(selectedNode.attributes.nodeData.id, false); } textField.focus(); - this.app.ownerCt.getEl().unmask(); }, this); } diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/viewport.js b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/viewport.js deleted file mode 100644 index fd0c74d530aa2efd9494e06e828841eaf93c53b4..0000000000000000000000000000000000000000 --- a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/viewport.js +++ /dev/null @@ -1,148 +0,0 @@ -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -Ext.ns('TYPO3'); - - // override splitregion to fit the splitbars in our design -Ext.override(Ext.layout.BorderLayout.SplitRegion, { - render : function(ct, p) { - Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p); - - var ps = this.position; - - this.splitEl = ct.createChild({ - cls: "x-layout-split x-layout-split-" + ps, html: " ", - id: this.panel.id + '-xsplit' - }); - - if (this.enableChildSplit) { - this.splitChildEl = this.splitEl.createChild({ - cls: 'x-layout-mini-wrapper' - }); - - } - if (this.collapseMode == 'mini') { - this.miniSplitEl = this.splitEl.createChild({ - cls: "x-layout-mini x-layout-mini-" + ps, html: " " - }); - this.miniSplitEl.addClassOnOver('x-layout-mini-over'); - this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true}); - this.miniSplitEl.dom.title = this.collapsible ? this.collapsibleSplitClickTip : this.splitTip; - } - - var s = this.splitSettings[ps]; - - if (this.enableChildSplit) { - this.split = new Ext.SplitBar(this.splitChildEl.dom, p.el, s.orientation); - } else { - this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation); - } - this.split.tickSize = this.tickSize; - this.split.placement = s.placement; - this.split.getMaximumSize = this[s.maxFn].createDelegate(this); - this.split.minSize = this.minSize || this[s.minProp]; - this.split.on("beforeapply", this.onSplitMove, this); - this.split.useShim = this.useShim === true; - this.maxSize = this.maxSize || this[s.maxProp]; - - if (p.hidden) { - this.splitEl.hide(); - } - - if (this.useSplitTips) { - this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip; - } - if (this.collapsible) { - this.splitEl.on("dblclick", this.onCollapseClick, this); - } - } -}); -/** - * Extends the viewport with some functionality for TYPO3. - */ -TYPO3.Viewport = Ext.extend(Ext.Viewport, { - /** - * Contains the navigation widgets in a simple array and identified by an unique idea - * - * @see registerNavigationWidget() - * @var object - */ - navigationWidgetContainer: {}, - - /** - * Contains the meta informations of the navigation widgets - * - * @see registerNavigationWidget() - * @var object - */ - navigationWidgetMetaData: {}, - - /** - * The topbar area - * - * @var Ext.Panel - */ - Topbar: null, - - /** - * The content area - * - * @var Ext.Panel - */ - ContentContainer: null, - - /** - * The navigation frame area - * - * @var Ext.Panel - */ - NavigationContainer: null, - - /** - * The iframe navigation component - * - * @var TYPO3.iframePanel - */ - NavigationIframe: null, - - /** - * The module menu area - * - * @var Ext.Panel - */ - ModuleMenuContainer: null, - - /** - * Initializes the ExtJS viewport with the given configuration. - * - * @return void - */ - initComponent: function() { - // adjust the module menu and the height of the topbar - this.initialConfig.items[0].height = TYPO3.configuration.topBarHeight; - - var moduleMenu = this.initialConfig.items[1]; - moduleMenu.width = TYPO3.configuration.moduleMenuWidth; - - // call parent constructor - TYPO3.Viewport.superclass.initComponent.apply(this, arguments); - - this.ContentContainer = Ext.getCmp('typo3-contentContainer'); - this.NavigationContainer = Ext.getCmp('typo3-navigationContainer'); - this.NavigationIframe = Ext.getCmp('typo3-navigationIframe'); - this.Topbar = Ext.getCmp('typo3-topbar'); - this.ModuleMenuContainer = Ext.getCmp('typo3-module-menu'); - } -}); - -Ext.reg('typo3Viewport', TYPO3.Viewport); diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/viewportConfiguration.js b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/viewportConfiguration.js deleted file mode 100644 index 9c85edfbf87017c6f659e9dd2f6dda04d16a0ab0..0000000000000000000000000000000000000000 --- a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/viewportConfiguration.js +++ /dev/null @@ -1,149 +0,0 @@ -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -Ext.ns('TYPO3'); - -/** - * The Cards Configuration for the BE Module Cards - * - * New items need to be appended here - * cards id needs to be prepended with typo3-card- the rest of the id is the - * be module name as passed it is normally in TYPO3 - * Cards shouldn't be simple iframes for performance reasons - */ - -TYPO3.Viewport.ContentCards = { - // Add a card to either the config or if already rendered to the wrapper - addContentCard: function(name,config) { - config.id = 'typo3-card-' + name; - if (Ext.ready) { - Ext.getCmp('typo3-contentContainerWrapper').add(config); - } else { - this.cards.push(config); - } - }, - cards: [ - // add the old card to be compatible - { - id: 'typo3-contentContainer', - border: false, - xtype: 'backendContentIframePanel', - name: 'content' - } - ] -}; - -/** - * The backend viewport configuration - */ -TYPO3.Viewport.configuration = { - layout: 'border', - id: 'typo3-viewport', - renderTo: Ext.getBody(), - border: false, - items: [ - { - layout: 'absolute', - region: 'north', - id: 'typo3-topbar', - height: 45, - contentEl: 'typo3-top-container', - border: false - }, - { - layout: 'fit', - region: 'west', - id: 'typo3-module-menu', - contentEl: 'typo3-menu', - collapsible: false, - collapseMode: null, - floatable: true, - minWidth: 50, - maxWidth: 250, - hideCollapseTool: true, - split: true, - useSplitTips: true, - splitTip: top.TYPO3.LLL.viewPort.tooltipModuleMenuSplit, - enableChildSplit: true, - border: false, - autoScroll: true, - listeners: { - resize: function(cmp, adjWidth, adjHeight, rawWidth, rawHeight) { - var containerWidth = adjWidth, - moduleMenuWidth = document.getElementById('typo3-menu').clientWidth, - moduleMenuMinWidth = 100, - moduleMenuSnappedWidth = 50, - moduleMenuSnappingClass = 'typo3-module-menu-snapped', - forceSnapMode = (containerWidth <= moduleMenuMinWidth); - if (forceSnapMode){ - cmp.addClass(moduleMenuSnappingClass); - snappedWidth = moduleMenuSnappedWidth + containerWidth - moduleMenuWidth; - cmp.setWidth(snappedWidth); - if(snappedWidth !== containerWidth && TYPO3.Backend){ - TYPO3.Backend.syncSize(); - } - } else{ - this.removeClass(moduleMenuSnappingClass); - } - } - } - }, - { - region: 'center', - layout: 'border', - border: false, - items: [ - { - region: 'west', - layout: 'fit', - id: 'typo3-navigationContainer', - width: 300, - minWidth: 250, - maxWidth: 500, - floatable: true, - animCollapse: false, - split: true, - enableChildSplit: true, - collapsible: true, - collapseMode: 'mini', - useSplitTips: true, - collapsibleSplitTip: top.TYPO3.LLL.viewPort.tooltipNavigationContainerSplitDrag, - collapsibleSplitClickTip: top.TYPO3.LLL.viewPort.tooltipNavigationContainerSplitClick, - hideCollapseTool: true, - hidden: true, - border: false, - name: 'navigation', - autoScroll: true, - items: [ - { - id: 'typo3-navigationIframe', - border: false, - hidden: true, - xtype: 'iframePanel', - name: 'navigation' - } - ] - }, - { - id: 'typo3-contentContainerWrapper', - name: 'content', - border: false, - xtype: 'panel', - region: 'center', - layout: 'card', - items: TYPO3.Viewport.ContentCards.cards - } - ] - } - ] -}; diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/iframepanel.js b/typo3/sysext/backend/Resources/Public/JavaScript/iframepanel.js index 5a9a250911403bb0fbe32e7696ae377298775841..4fe35b550860099eb9a90f280a1623a4828f3be3 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/iframepanel.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/iframepanel.js @@ -86,7 +86,7 @@ TYPO3.iframePanel = Ext.extend(Ext.Panel, { startLoader: function() { if (this.showLoadingIndicator) { require(['nprogress'], function(NProgress) { - NProgress.configure({parent: '#typo3-contentContainer', showSpinner: false}); + NProgress.configure({parent: '.t3js-scaffold-content-module', showSpinner: false}); NProgress.start(); }); } diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/modulemenu.js b/typo3/sysext/backend/Resources/Public/JavaScript/modulemenu.js index c01a76c2ca2293ddf95cd80e300ac4a92808caa3..96e078d8661a305cb2f9ba60ca98a26f830b3384 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/modulemenu.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/modulemenu.js @@ -15,275 +15,299 @@ /** * Class to render the module menu and handle the BE navigation */ - - -Ext.ns('TYPO3', 'ModuleMenu'); - -TYPO3.ModuleMenu = {}; - -TYPO3.ModuleMenu.App = { - loadedModule: null, - loadedNavigationComponentId: '', - availableNavigationComponents: {}, - - initialize: function() { - var me = this; - - // load the start module - if (top.startInModule && top.startInModule[0] && TYPO3.jQuery('#' + top.startInModule[0]).length > 0) { - me.showModule(top.startInModule[0], top.startInModule[1]); - } else { - // fetch first module - me.showModule(TYPO3.jQuery('.t3js-mainmodule:first').attr('id')); +require( + [ + 'jquery', + 'TYPO3/CMS/Backend/Icons', + 'TYPO3/CMS/Backend/Viewport' + ], + function ($, Icons) { + if (typeof TYPO3.ModuleMenu !== 'undefined') { + return TYPO3.ModuleMenu.App; } + TYPO3.ModuleMenu = {}; + TYPO3.ModuleMenu.App = { + loadedModule: null, + loadedNavigationComponentId: '', + availableNavigationComponents: {}, + + initialize: function () { + var me = this; + + // load the start module + if (top.startInModule && top.startInModule[0] && $('#' + top.startInModule[0]).length > 0) { + me.showModule(top.startInModule[0], top.startInModule[1]); + } else { + // fetch first module + me.showModule($('.t3js-mainmodule:first').attr('id')); + } - // check if there are collapsed items in the users' configuration - require(['TYPO3/CMS/Backend/Storage'], function() { - var collapsedMainMenuItems = me.getCollapsedMainMenuItems(); - TYPO3.jQuery.each(collapsedMainMenuItems, function(key, itm) { - if (itm !== true) { - return; + // check if module menu should be collapsed or not + var state = Ext.state.Manager.getProvider().get('typo3-module-menu'); + if (state && state.collapsed) { + TYPO3.ModuleMenu.App.toggleMenu(state.collapsed); } - var $group = TYPO3.jQuery('#' + key); - if ($group.length > 0) { - var $groupContainer = $group.find('.typo3-module-menu-group-container'); - $group.addClass('collapsed').removeClass('expanded'); - $groupContainer.hide().promise().done(function() { - TYPO3.Backend.doLayout(); + + // check if there are collapsed items in the users' configuration + require(['TYPO3/CMS/Backend/Storage'], function () { + var collapsedMainMenuItems = me.getCollapsedMainMenuItems(); + $.each(collapsedMainMenuItems, function (key, itm) { + if (itm !== true) { + return; + } + var $group = $('#' + key); + if ($group.length > 0) { + var $groupContainer = $group.find('.modulemenu-group-container'); + $group.addClass('collapsed').removeClass('expanded'); + TYPO3.Backend.NavigationContainer.cleanup(); + $groupContainer.hide().promise().done(function () { + TYPO3.Backend.doLayout(); + }); + } }); - } - }); - me.initializeEvents(); - }); - }, - - initializeEvents: function() { - var me = this; - TYPO3.jQuery(document).on('click', '.typo3-module-menu-group .typo3-module-menu-group-header', function() { - var $group = TYPO3.jQuery(this).parent('.typo3-module-menu-group'); - var $groupContainer = $group.find('.typo3-module-menu-group-container'); - if ($group.hasClass('expanded')) { - me.addCollapsedMainMenuItem($group.attr('id')); - $group.addClass('collapsed').removeClass('expanded'); - $groupContainer.stop().slideUp().promise().done(function() { - TYPO3.Backend.doLayout(); + me.initializeEvents(); }); - } else { - me.removeCollapseMainMenuItem($group.attr('id')); - $group.addClass('expanded').removeClass('collapsed'); - $groupContainer.stop().slideDown().promise().done(function() { + }, + + initializeEvents: function () { + var me = this; + $(document).on('click', '.modulemenu-group .modulemenu-group-header', function () { + var $group = $(this).parent('.modulemenu-group'); + var $groupContainer = $group.find('.modulemenu-group-container'); + + TYPO3.Backend.NavigationContainer.cleanup(); + if ($group.hasClass('expanded')) { + me.addCollapsedMainMenuItem($group.attr('id')); + $group.addClass('collapsed').removeClass('expanded'); + $groupContainer.stop().slideUp().promise().done(function () { + TYPO3.Backend.doLayout(); + }); + } else { + me.removeCollapseMainMenuItem($group.attr('id')); + $group.addClass('expanded').removeClass('collapsed'); + $groupContainer.stop().slideDown().promise().done(function () { + TYPO3.Backend.doLayout(); + }); + } + + }); + // register clicking on sub modules + $(document).on('click', '.modulemenu-item,.t3-menuitem-submodule', function (evt) { + evt.preventDefault(); + me.showModule($(this).attr('id')); TYPO3.Backend.doLayout(); }); - } - }); - // register clicking on sub modules - TYPO3.jQuery(document).on('click', '.typo3-module-menu-item,.t3-menuitem-submodule', function(evt) { - evt.preventDefault(); - me.showModule(TYPO3.jQuery(this).attr('id')); - }); - }, - - /* fetch the data for a submodule */ - getRecordFromName: function(name) { - var $subModuleElement = TYPO3.jQuery('#' + name); - return { - name: name, - navigationComponentId: $subModuleElement.data('navigationcomponentid'), - navigationFrameScript: $subModuleElement.data('navigationframescript'), - navigationFrameScriptParam: $subModuleElement.data('navigationframescriptparameters'), - link: $subModuleElement.find('a').attr('href') - }; - }, - - showModule: function(mod, params) { - params = params || ''; - params = this.includeId(mod, params); - var record = this.getRecordFromName(mod); - this.loadModuleComponents(record, params); - }, - - loadModuleComponents: function(record, params) { - var mod = record.name; - if (record.navigationComponentId) { - this.loadNavigationComponent(record.navigationComponentId); - TYPO3.Backend.NavigationIframe.getEl().parent().setStyle('overflow', 'auto'); - } else if (record.navigationFrameScript) { - TYPO3.Backend.NavigationContainer.show(); - this.loadNavigationComponent('typo3-navigationIframe'); - this.openInNavFrame(record.navigationFrameScript, record.navigationFrameScriptParam); - TYPO3.Backend.NavigationIframe.getEl().parent().setStyle('overflow', 'hidden'); - } else { - TYPO3.Backend.NavigationContainer.hide(); - } - - this.highlightModuleMenuItem(mod); - this.loadedModule = mod; - this.openInContentFrame(record.link, params); - - // compatibility - top.currentSubScript = record.link; - top.currentModuleLoaded = mod; - - TYPO3.Backend.doLayout(); - }, - - includeId: function(mod, params) { - //get id - var section = mod.split('_')[0]; - if (top.fsMod.recentIds[section]) { - params = 'id=' + top.fsMod.recentIds[section] + '&' + params; - } - - return params; - }, - - loadNavigationComponent: function(navigationComponentId) { - if (navigationComponentId === this.loadedNavigationComponentId) { - if (TYPO3.Backend.NavigationContainer.hidden) { - TYPO3.Backend.NavigationContainer.show(); - } - - return; - } - - if (this.loadedNavigationComponentId !== '') { - Ext.getCmp(this.loadedNavigationComponentId).hide(); - } + $(document).on('click', '.t3js-topbar-button-modulemenu', + function (evt) { + evt.preventDefault(); + TYPO3.ModuleMenu.App.toggleMenu(); + } + ); + $(document).on('click', '.t3js-scaffold-content-overlay', + function (evt) { + evt.preventDefault(); + TYPO3.ModuleMenu.App.toggleMenu(true); + } + ); + $(document).on('click', '.t3js-topbar-button-navigationcomponent', + function (evt) { + evt.preventDefault(); + TYPO3.Backend.NavigationContainer.toggle(); + } + ); + + }, + toggleMenu: function (collapse) { + TYPO3.Backend.NavigationContainer.cleanup(); + + var $mainContainer = $('.t3js-scaffold'); + var expandedClass = 'scaffold-modulemenu-expanded'; + + if (typeof collapse === 'undefined') { + collapse = $mainContainer.hasClass(expandedClass); + } + if (collapse) { + $mainContainer.removeClass(expandedClass); + } else { + $mainContainer.addClass(expandedClass); + $('.scaffold').removeClass('scaffold-search-expanded'); + $('.scaffold').removeClass('scaffold-toolbar-expanded'); + } - var component = Ext.getCmp(navigationComponentId); - if (typeof component !== 'object') { - if (typeof this.availableNavigationComponents[navigationComponentId] !== 'function') { - throw 'The navigation component "' + navigationComponentId + '" is not available ' + - 'or has no valid callback function'; - } + // @todo remove once we have a new state manager + Ext.state.Manager.set( + 'typo3-module-menu', + { + collapsed: collapse + } + ); + + TYPO3.Backend.doLayout(); + }, + + /* fetch the data for a submodule */ + getRecordFromName: function (name) { + var $subModuleElement = $('#' + name); + return { + name: name, + navigationComponentId: $subModuleElement.data('navigationcomponentid'), + navigationFrameScript: $subModuleElement.data('navigationframescript'), + navigationFrameScriptParam: $subModuleElement.data('navigationframescriptparameters'), + link: $subModuleElement.find('a').attr('href') + }; + }, + + showModule: function (mod, params) { + params = params || ''; + params = this.includeId(mod, params); + var record = this.getRecordFromName(mod); + this.loadModuleComponents(record, params); + }, + + loadModuleComponents: function (record, params) { + var mod = record.name; + if (record.navigationComponentId) { + this.loadNavigationComponent(record.navigationComponentId); + } else if (record.navigationFrameScript) { + TYPO3.Backend.NavigationContainer.show('typo3-navigationIframe'); + this.openInNavFrame(record.navigationFrameScript, record.navigationFrameScriptParam); + } else { + TYPO3.Backend.NavigationContainer.hide(); + } - component = this.availableNavigationComponents[navigationComponentId](); - TYPO3.Backend.NavigationContainer.add(component); - } + this.highlightModuleMenuItem(mod); + this.loadedModule = mod; + this.openInContentFrame(record.link, params); - component.show() + // compatibility + top.currentSubScript = record.link; + top.currentModuleLoaded = mod; - // backwards compatibility - top.nav = component; + TYPO3.Backend.doLayout(); + }, - TYPO3.Backend.NavigationContainer.show(); - this.loadedNavigationComponentId = navigationComponentId; - }, + includeId: function (mod, params) { + if (typeof mod === 'undefined') { + return params; + } + //get id + var section = mod.split('_')[0]; + if (top.fsMod.recentIds[section]) { + params = 'id=' + top.fsMod.recentIds[section] + '&' + params; + } - registerNavigationComponent: function(componentId, initCallback) { - this.availableNavigationComponents[componentId] = initCallback; - }, + return params; + }, - openInNavFrame: function(url, params) { - var navUrl = url + (params ? (url.indexOf('?') !== -1 ? '&' : '?') + params : ''); - var currentUrl = this.relativeUrl(TYPO3.Backend.NavigationIframe.getUrl()); - if (currentUrl !== navUrl) { - TYPO3.Backend.NavigationIframe.setUrl(navUrl); - } - }, - - openInContentFrame: function(url, params) { - if (top.nextLoadModuleUrl) { - TYPO3.Backend.ContentContainer.setUrl(top.nextLoadModuleUrl); - top.nextLoadModuleUrl = ''; - } else { - var urlToLoad = url + (params ? (url.indexOf('?') !== -1 ? '&' : '?') + params : '') - TYPO3.Backend.ContentContainer.setUrl(urlToLoad); - } - }, - - highlightModuleMenuItem: function(module, mainModule) { - TYPO3.jQuery('.typo3-module-menu-item.active').removeClass('active'); - TYPO3.jQuery('#' + module).addClass('active'); - }, - - relativeUrl: function(url) { - return url.replace(TYPO3.configuration.siteUrl + 'typo3/', ''); - }, - - // refresh the HTML by fetching the menu again - refreshMenu: function() { - TYPO3.jQuery.ajax(TYPO3.settings.ajaxUrls['modulemenu']).done(function(result) { - TYPO3.jQuery('#typo3-menu').replaceWith(result.menu); - if (top.currentModuleLoaded) { - TYPO3.ModuleMenu.App.highlightModuleMenuItem(top.currentModuleLoaded); + loadNavigationComponent: function (navigationComponentId) { + TYPO3.Backend.NavigationContainer.show(navigationComponentId); + if (navigationComponentId === this.loadedNavigationComponentId) { + return; + } + if (this.loadedNavigationComponentId !== '') { + Ext.getCmp(this.loadedNavigationComponentId).hide(); + } + if ($('.t3js-scaffold-content-navigation [data-component="' + navigationComponentId + '"]').length < 1) { + $('.t3js-scaffold-content-navigation') + .append('<div class="scaffold-content-navigation-component" data-component="' + navigationComponentId + '" id="navigationComponent-' + navigationComponentId + '"></div>'); + } + var component = Ext.getCmp(navigationComponentId); + if (typeof component === 'undefined') { + /** @todo fix hard coded pagetree **/ + component = new TYPO3.Components.PageTree.App(); + component.render('navigationComponent-' + navigationComponentId); + } + TYPO3.Backend.NavigationContainer.show(navigationComponentId); + this.loadedNavigationComponentId = navigationComponentId; + }, + + registerNavigationComponent: function (componentId, initCallback) { + this.availableNavigationComponents[componentId] = initCallback; + }, + + openInNavFrame: function (url, params) { + var navUrl = url + (params ? (url.indexOf('?') !== -1 ? '&' : '?') + params : ''); + var currentUrl = this.relativeUrl(TYPO3.Backend.NavigationContainer.getUrl()); + if (currentUrl !== navUrl) { + TYPO3.Backend.NavigationContainer.refresh(); + } + TYPO3.Backend.NavigationContainer.setUrl(url); + }, + + openInContentFrame: function (url, params) { + if (top.nextLoadModuleUrl) { + TYPO3.Backend.ContentContainer.setUrl(top.nextLoadModuleUrl); + top.nextLoadModuleUrl = ''; + } else { + var urlToLoad = url + (params ? (url.indexOf('?') !== -1 ? '&' : '?') + params : ''); + TYPO3.Backend.ContentContainer.setUrl(urlToLoad); + } + }, + + highlightModuleMenuItem: function (module, mainModule) { + $('.modulemenu-item.active').removeClass('active'); + $('#' + module).addClass('active'); + }, + + relativeUrl: function (url) { + if (url) { + return url.replace(TYPO3.configuration.siteUrl + 'typo3/', ''); + } else { + return ''; + } + }, + + // refresh the HTML by fetching the menu again + refreshMenu: function () { + $.ajax(TYPO3.settings.ajaxUrls['modulemenu']).done(function (result) { + $('#typo3-menu').replaceWith(result.menu); + if (top.currentModuleLoaded) { + TYPO3.ModuleMenu.App.highlightModuleMenuItem(top.currentModuleLoaded); + } + TYPO3.Backend.doLayout(); + }); + }, + + reloadFrames: function () { + TYPO3.Backend.NavigationContainer.refresh(); + TYPO3.Backend.ContentContainer.refresh(); + }, + + /** + * fetches all module menu elements in the local storage that should be collapsed + * @returns {*} + */ + getCollapsedMainMenuItems: function () { + if (TYPO3.Storage.Persistent.isset('modulemenu')) { + return JSON.parse(TYPO3.Storage.Persistent.get('modulemenu')); + } else { + return {}; + } + }, + + /** + * adds a module menu item to the local storage + * @param item + */ + addCollapsedMainMenuItem: function (item) { + var existingItems = this.getCollapsedMainMenuItems(); + existingItems[item] = true; + TYPO3.Storage.Persistent.set('modulemenu', JSON.stringify(existingItems)); + }, + + /** + * removes a module menu item from the local storage + * @param item + */ + removeCollapseMainMenuItem: function (item) { + var existingItems = this.getCollapsedMainMenuItems(); + delete existingItems[item]; + TYPO3.Storage.Persistent.set('modulemenu', JSON.stringify(existingItems)); } - TYPO3.Backend.doLayout(); - }); - }, - - reloadFrames: function() { - TYPO3.Backend.NavigationIframe.refresh(); - TYPO3.Backend.ContentContainer.refresh(); - }, - - /** - * fetches all module menu elements in the local storage that should be collapsed - * @returns {*} - */ - getCollapsedMainMenuItems: function() { - if (TYPO3.Storage.Persistent.isset('modulemenu')) { - return JSON.parse(TYPO3.Storage.Persistent.get('modulemenu')); - } else { - return {}; - } - }, - - /** - * adds a module menu item to the local storage - * @param item - */ - addCollapsedMainMenuItem: function(item) { - var existingItems = this.getCollapsedMainMenuItems(); - existingItems[item] = true; - TYPO3.Storage.Persistent.set('modulemenu', JSON.stringify(existingItems)); - }, - - /** - * removes a module menu item from the local storage - * @param item - */ - removeCollapseMainMenuItem: function(item) { - var existingItems = this.getCollapsedMainMenuItems(); - delete existingItems[item]; - TYPO3.Storage.Persistent.set('modulemenu', JSON.stringify(existingItems)); - } - -}; - - -Ext.onReady(function() { - TYPO3.ModuleMenu.App.initialize(); - - // keep backward compatibility - top.list = TYPO3.Backend.ContentContainer; - top.list_frame = top.list.getIframe(); - top.nav_frame = TYPO3.Backend.NavigationContainer.PageTree; - - // not in use anymore - top.TYPO3ModuleMenu = TYPO3.ModuleMenu.App; - top.content = { - nav_frame: TYPO3.Backend.NavigationContainer.PageTree, - list_frame: TYPO3.Backend.ContentContainer.getIframe(), - location: TYPO3.Backend.ContentContainer.getIframe().location, - document: TYPO3.Backend.ContentContainer.getIframe() + }; + // start the module menu app + TYPO3.ModuleMenu.App.initialize(); + return TYPO3.ModuleMenu; } -}); - - -/******************************************************************************* -* -* Backwards compatibility handling down here -* -******************************************************************************/ - -/** -* Highlight module: -*/ -var currentlyHighLightedId = ''; -var currentlyHighLighted_restoreValue = ''; -var currentlyHighLightedMain = ''; -function highlightModuleMenuItem(trId, mainModule) { - TYPO3.ModuleMenu.App.highlightModule(trId, mainModule); -} +); diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-52877-RemoveExtJSViewport.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-52877-RemoveExtJSViewport.rst new file mode 100644 index 0000000000000000000000000000000000000000..6a639fca544cd352d7bcb55391be640a9a009de2 --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/master/Breaking-52877-RemoveExtJSViewport.rst @@ -0,0 +1,34 @@ +.. include:: ../../Includes.txt + +======================================== +Breaking: #52877 - Remove ExtJS Viewport +======================================== + +See :forge:`52877` + +Description +=========== + +The ExtJS component `TYPO3.Viewport` has been removed from the TYPO3 Core, `Ext.layout` and `Ext.Viewport` are no longer +used in the backend viewport. + + +Impact +====== + +- Calling the removed ExtJS components `TYPO3.Viewport` or `TYPO3.backendContentIframePanel` will result in an error +- The ability to stack content with cards with `TYPO3.Viewport.ContentCards` is no longer supported + + +Affected Installations +====================== + +Any TYPO3 installations using custom extensions based on ExtJS which rely on the above mentioned components. + + +Migration +========= + +There is no migration available. + +.. index:: Backend, JavaScript diff --git a/typo3/sysext/core/Tests/Acceptance/Support/Helper/Topbar.php b/typo3/sysext/core/Tests/Acceptance/Support/Helper/Topbar.php index 4a38aa1c816798188bba74ae351ff068c4bcc640..f3595919d936ee481e62529f7fbae01748a835ec 100644 --- a/typo3/sysext/core/Tests/Acceptance/Support/Helper/Topbar.php +++ b/typo3/sysext/core/Tests/Acceptance/Support/Helper/Topbar.php @@ -24,7 +24,7 @@ class Topbar * * @var string */ - public static $containerSelector = '#typo3-top-container'; + public static $containerSelector = '.t3js-scaffold-topbar'; /** * Selector for the dropdown container diff --git a/typo3/sysext/install/Resources/Public/Css/install.css b/typo3/sysext/install/Resources/Public/Css/install.css index a5c172cc18b69f017e9f86b591b7d669c32ff25d..52866a9b19b8836f8350bbb60b6c5cbb7b2156c8 100644 --- a/typo3/sysext/install/Resources/Public/Css/install.css +++ b/typo3/sysext/install/Resources/Public/Css/install.css @@ -2752,7 +2752,8 @@ ul ol, ol ol { margin-bottom: 0; } -.list-unstyled { +.list-unstyled, +.modulemenu .modulemenu-group-container { padding-left: 0; list-style: none; } @@ -4834,7 +4835,7 @@ tbody.collapse.in { list-style: none; font-size: 12px; text-align: left; - background-color: #fff; + background-color: #424242; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 2px; @@ -4849,7 +4850,7 @@ tbody.collapse.in { height: 1px; margin: 8px 0; overflow: hidden; - background-color: #e5e5e5; + background-color: #525252; } .dropdown-menu > li > a { display: block; @@ -4857,14 +4858,14 @@ tbody.collapse.in { clear: both; font-weight: normal; line-height: 1.5; - color: #5a5a5a; + color: #fff; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { text-decoration: none; - color: #4d4d4d; - background-color: #f5f5f5; + color: #fff; + background-color: #525252; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, @@ -4872,7 +4873,7 @@ tbody.collapse.in { color: #fff; text-decoration: none; outline: 0; - background-color: #0078e6; + background-color: #525252; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, @@ -7065,6 +7066,589 @@ button.close { bottom: 20px; } } +html { + height: 100%; + overflow: hidden; +} +body { + height: 100%; + overflow: auto; +} +.scaffold { + background-color: #f5f5f5; + color: #333333; + position: relative; + padding-top: 45px; + height: 100vh; +} +.scaffold-topbar { + background-color: #1f1f1e; + color: #f5f5f5; + height: 45px; + position: absolute; + top: 0; + right: 0; + left: 0; +} +.scaffold-modulemenu { + background-color: #424242; + color: #fff; + position: fixed; + top: 45px; + left: 0; + bottom: 0; + width: 40px; + max-width: 100%; + z-index: 1000; + overflow: hidden; +} +.scaffold-modulemenu a { + color: rgba(255, 255, 255, 0.7); +} +.scaffold-modulemenu a:hover { + color: #fff; +} +.scaffold-modulemenu .active > a { + color: #fff; +} +.scaffold-toolbar { + overflow: auto; + background-color: #424242; + color: #fff; + z-index: 1000; + position: fixed; + top: 45px; + left: 0; + right: 0; + bottom: 0; + display: none; +} +.scaffold-toolbar a { + color: rgba(255, 255, 255, 0.7); +} +.scaffold-toolbar a:hover { + color: #fff; +} +.scaffold-toolbar .active > a { + color: #fff; +} +@media (min-width: 992px) { + .scaffold-toolbar { + overflow: visible; + background-color: transparent; + height: 45px; + top: 0; + left: auto; + bottom: auto; + display: block; + } +} +@media (max-width: 991px) { + .scaffold-toolbar-expanded .scaffold-toolbar, + .scaffold-search-expanded .scaffold-toolbar { + display: block; + } +} +.scaffold-content { + position: fixed!important; + top: 45px; + left: 0; + right: 0; + bottom: 0; +} +@media (max-width: 991px) { + .scaffold-content { + left: 0!important; + } +} +.scaffold-content-navigation-iframe, +.scaffold-content-module-iframe { + display: block; + border: none; + height: 100%; + width: 100%; +} +.scaffold-content-navigation { + display: none; + position: absolute!important; + left: 0; + top: 0; + bottom: 0; + width: 300px; +} +.scaffold-content-navigation-component { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +.scaffold-content-navigation-component #typo3-pagetree-treeContainer > div > .x-panel-body { + overflow: auto; +} +.scaffold-content-module { + position: absolute!important; + top: 0; + left: 0; + bottom: 0; + right: 0; +} +@media (max-width: 767px) { + .scaffold-content-module { + width: 100%; + } +} +.scaffold-content-overlay { + display: none; + position: absolute; + z-index: 1040; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.65); +} +.scaffold-modulemenu-expanded .scaffold-content-overlay { + display: block; +} +@media (min-width: 992px) { + .scaffold-modulemenu-expanded .scaffold-content-overlay { + display: none; + } +} +@media (min-width: 992px) { + .scaffold { + padding-left: 40px; + } +} +.scaffold .scaffold-modulemenu { + width: 40px; +} +@media (max-width: 991px) { + .scaffold .scaffold-modulemenu { + display: none; + } +} +.scaffold-modulemenu-expanded { + display: block; + padding-left: 230px; +} +.scaffold-modulemenu-expanded .scaffold-modulemenu { + width: 230px; +} +@media (max-width: 991px) { + .scaffold-modulemenu-expanded .scaffold-modulemenu { + display: block; + } +} +.scaffold-modulemenu-expanded .scaffold-content { + transform: translate(230px, 0); +} +.scaffold-content-navigation-expanded .scaffold-content-navigation { + display: block; +} +.scaffold-content-navigation-expanded .scaffold-content-module { + left: 300px; +} +@media (min-width: 992px) { + .scaffold .scaffold-content { + left: 40px; + } + .scaffold-modulemenu-expanded .scaffold-content { + left: 230px; + transform: none; + } +} +.topbar { + background-color: inherit; + position: relative; + height: 45px; +} +.topbar a { + color: inherit; + text-decoration: none; +} +.topbar-button { + position: absolute; + top: 0; + display: inline-block; + border: 0; + background-color: #222; + height: 45px; + width: 40px; +} +.topbar-button:hover { + background-color: #2a2a2a; +} +.topbar-button.topbar-button-modulemenu { + left: 0; +} +@media (min-width: 992px) { + .topbar-button.topbar-button-modulemenu { + background-color: #424242; + } +} +.topbar-button.topbar-button-navigationcomponent { + left: 40px; +} +.topbar-button.topbar-button-toolbar { + right: 40px; +} +.topbar-button.topbar-button-search { + right: 0; +} +.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu { + background-color: #424242; +} +.scaffold-content-navigation-expanded .topbar-button-navigationcomponent { + background-color: #424242; +} +@media (max-width: 991px) { + .scaffold-toolbar-expanded .toolbar-item-search { + display: none; + } +} +.scaffold-toolbar-expanded .topbar-button-toolbar { + background-color: #424242; +} +@media (max-width: 991px) { + .scaffold-search-expanded .toolbar-item { + display: none; + } + .scaffold-search-expanded .toolbar-item-search { + display: block; + width: 100%; + } +} +.scaffold-search-expanded .topbar-button-search { + background-color: #424242; +} +.topbar-button-toolbar, +.topbar-button-search { + display: block; +} +@media (min-width: 992px) { + .topbar-button-toolbar, + .topbar-button-search { + display: none; + } +} +.topbar-header { + padding-left: 80px; + padding-right: 80px; +} +.topbar-header-site { + position: relative; + display: block; + max-width: 100%; + height: 45px; + line-height: 45px; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; +} +@media (min-width: 992px) { + .topbar-header-site { + display: inline-block; + } +} +.topbar-header-site:before, +.topbar-header-site:after { + display: block; + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 1em; +} +.topbar-header-site:before { + left: 0; + background: linear-gradient(to right, #1f1f1e 0%, rgba(31, 31, 30, 0) 100%); +} +.topbar-header-site:after { + right: 0; + background: linear-gradient(to right, rgba(31, 31, 30, 0) 0%, #1f1f1e 100%); +} +.typo3-in-workspace .topbar-header-site { + background-color: #6d860d; +} +.typo3-in-workspace .topbar-header-site:before { + background: linear-gradient(to right, #6d860d 0%, rgba(109, 134, 13, 0) 100%); +} +.typo3-in-workspace .topbar-header-site:after { + background: linear-gradient(to right, rgba(109, 134, 13, 0) 0%, #6d860d 100%); +} +.topbar-header-site-logo { + height: 45px; + display: none; + padding-right: 0.5em; +} +@media (min-width: 320px) { + .topbar-header-site-logo { + display: inline-block; + } +} +.topbar-header-site-title { + line-height: 1.2em; + display: inline-block; + vertical-align: middle; +} +.topbar-header-site-name { + display: block; +} +.topbar-header-site-version { + opacity: 0.5; +} +.toolbar { + padding: 8px; +} +@media (min-width: 992px) { + .toolbar { + padding: 0; + } +} +.toolbar:after { + clear: both; + display: table; + content: ''; +} +.toolbar-list { + list-style: none; + padding: 0; + margin: 0; +} +.toolbar-item { + padding: 4px; + position: relative; + display: block; + float: left; + width: 100%; +} +@media (min-width: 600px) { + .toolbar-item { + width: 50%; + } +} +@media (min-width: 750px) { + .toolbar-item { + width: 33.33%; + } +} +@media (min-width: 992px) { + .toolbar-item { + padding: 0; + width: auto; + margin-left: 1px; + } +} +.toolbar-item .dropdown-menu { + width: 350px; +} +@media (max-width: 991px) { + .toolbar-item .dropdown-menu { + overflow: auto; + padding: 15px; + position: fixed; + max-height: 90%; + max-width: 90%; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + .toolbar-item .dropdown-backdrop { + background: rgba(0, 0, 0, 0.65); + } +} +.toolbar-item-avatar { + width: 32px; + display: inline-block; +} +.toolbar-item-avatar .avatar { + position: absolute; + top: 50%; + left: 10px; + transform: translate(0, -50%); +} +.toolbar-item-badge { + position: absolute; + bottom: 4px; + right: 4px; + padding: 3px 4px; + border-radius: 0; + font-size: 10px; + font-weight: normal; + min-width: 16px; +} +.toolbar-item-link { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + border: 1px solid rgba(0, 0, 0, 0.5); + position: relative; + display: block; + text-decoration: none; + padding: 9px 10px; + height: 45px; + line-height: 27px; +} +.toolbar-item-link:hover, +.toolbar-item-link:focus { + text-decoration: none; +} +@media (min-width: 992px) { + .toolbar-item-link { + border: none; + } +} +.open .toolbar-item-link { + background-color: #424242; +} +@media (min-width: 992px) { + .toolbar-item-title { + display: none; + } +} +@media (min-width: 992px) { + .toolbar-item-search { + width: 300px; + } +} +.toolbar-item-search form { + padding: 0; + margin: 0; +} +.toolbar-item-search .toolbar-item-link { + padding: 0; + margin: 0; + height: 0; +} +.toolbar-item-search .form-group { + margin: 0; +} +.toolbar-item-search .close { + color: #ffffff; + text-shadow: none; + opacity: 1; +} +@media (max-width: 991px) { + .toolbar-item-search .dropdown-menu { + top: 114px; + left: 14px; + right: 14px; + width: auto; + max-width: none; + max-height: none; + transform: none; + bottom: 14px; + } +} +@media (min-width: 992px) { + .toolbar-item-search .dropdown-menu { + left: auto; + right: 0; + } +} +.toolbar-item-search .autocomplete-suggestions { + position: static!important; +} +.toolbar-item-search .autocomplete-suggestion { + border: none; +} +.toolbar-item-search.open .toolbar-item-search-form { + position: relative; + z-index: 991; +} +.toolbar-item-search-field { + color: inherit; + background-color: #2f2f2f; + margin: 0; + border-radius: 0; + border: 1px solid rgba(0, 0, 0, 0.5); + height: 45px; + box-shadow: none; +} +@media (min-width: 992px) { + .toolbar-item-search-field { + border: none; + } +} +.toolbar-item-search-field:hover { + background-color: #333; +} +.toolbar-item-search-field:focus { + box-shadow: none; + background-color: #555555; +} +.module-wrapper { + position: relative; +} +.module-wrapper iframe { + border: none; +} +.modulemenu .modulemenu-group-container { + clear: both; +} +.modulemenu .modulemenu-group { + position: relative; + padding: 5px 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); +} +.modulemenu .modulemenu-group-header, +.modulemenu .modulemenu-item-link { + position: relative; + display: block; + cursor: pointer; + padding: 2px 4px; + text-decoration: none; +} +.modulemenu .modulemenu-group-header { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-transform: uppercase; +} +.modulemenu .modulemenu-item-link:focus, +.modulemenu .modulemenu-item-link:hover { + outline: none; + background-color: rgba(0, 0, 0, 0.1); +} +.modulemenu .modulemenu-item.active .modulemenu-item-link { + background-color: rgba(0, 0, 0, 0.15); +} +.modulemenu .modulemenu-icon { + float: left; + margin-right: 4px; +} +.modulemenu .modulemenu-icon .fa { + font-size: 0.5em; +} +.modulemenu .modulemenu-group-title, +.modulemenu .modulemenu-item-title { + white-space: nowrap; + text-overflow: ellipsis; + padding-top: 7px; + padding-left: 4px; + display: none; + overflow: hidden; + *zoom: 1; +} +.modulemenu .modulemenu-group-title { + padding-right: 20px; +} +.modulemenu .modulemenu-group-title .caret { + transform: rotate(90deg); + position: absolute; + top: 17px; + right: 18px; +} +.modulemenu .expanded .modulemenu-group-title .caret { + transform: rotate(0deg); +} +.scaffold-modulemenu-expanded .modulemenu-group-title, +.scaffold-modulemenu-expanded .modulemenu-item-title { + display: block; +} .autocomplete { position: relative; } @@ -7099,6 +7683,122 @@ button.close { .autocomplete-info { padding: 5px 15px; } +.dropdown-menu { + line-height: 1.45em; + border: 0; + margin: 0; + border-radius: 0; +} +.dropdown-menu a { + display: block; +} +.dropdown-menu a:hover { + text-decoration: none; +} +.dropdown-menu hr { + border-top: 1px solid rgba(0, 0, 0, 0.25); + margin: 1.25em -15px; +} +.dropdown-menu > *:last-child { + margin-bottom: 0; +} +.dropdown-menu .form-group { + margin-bottom: 0.75em; +} +.dropdown-menu .form-control { + border-color: #aaaaaa; + color: inherit; + border-radius: 0; + background-color: #333333; +} +.dropdown-menu .form-control:focus { + box-shadow: none; + border-color: #bbbbbb; +} +.dropdown-menu .btn { + border: none; + border-radius: 0; + padding: 6px 10px; +} +.dropdown-headline { + font-size: 1.15em; + margin-top: 0; + margin-bottom: 0.5em; +} +.dropdown-text a { + display: inline-block; +} +div.dropdown-menu { + padding: 1.5em; +} +.dropdown-list { + padding-left: 0; + list-style: none; +} +.dropdown-list > li { + position: relative; +} +.dropdown-list > li + li { + margin-top: 0.5em; +} +.dropdown-list-link { + display: block; + text-decoration: none; +} +.dropdown-list-link:hover, +.dropdown-list-link:focus { + text-decoration: none; +} +.dropdown-table { + display: table; + width: 100%; +} +.dropdown-table-row { + display: table-row; +} +.dropdown-table-column { + display: table-cell; + padding-top: 0.25em; + padding-bottom: 0.25em; + vertical-align: middle; +} +.dropdown-table-column-top { + vertical-align: top; +} +.dropdown-table-icon { + width: 16px; + padding-right: 0.5em; +} +.dropdown-table-title { + white-space: nowrap; + padding-right: 1.5em; +} +.dropdown-table-title-ellipsis { + max-width: 230px; + overflow: hidden; + display: block; + white-space: nowrap; + text-overflow: ellipsis; +} +.dropdown-table-actions { + white-space: nowrap; + text-align: right; +} +.dropdown-table-actions-btn { + text-align: center; + display: inline-block !important; + margin-top: -4px; + margin-bottom: -4px; + padding: 4px; + vertical-align: middle; +} +.dropdown-table-actions-btn-close:hover, +.dropdown-table-actions-btn-edit:hover { + background-color: #333; +} +.dropdown-table-actions-btn-delete:hover { + background-color: #c83c3c; +} .avatar { position: relative; display: inline-block; @@ -7135,17 +7835,6 @@ button.close { height: 16px; width: 16px; } -.dropdown-toggle > .avatar { - height: 28px; - width: 28px; - float: left; - margin-right: 0.5em; - margin-top: -5px; -} -.dropdown-toggle .avatar-image { - height: 28px; - width: 28px; -} .callout { background-color: #f0f0f0; border-left: 3px solid #ccc; @@ -7492,6 +8181,7 @@ button.close { } .module-body .container-small { max-width: 768px; + margin: 0 auto; } .module-docheader + .module-body { padding-top: 89px; @@ -7570,6 +8260,9 @@ button.close { .panel-body:after, .modal-header:after, .modal-footer:after, +.modulemenu .modulemenu-group-header:after, +.modulemenu .modulemenu-item-link:after, +.dropdown-list > li:after, .module-docheader:after, .module-docheader .module-docheader-bar:after, .panel-heading:after, diff --git a/typo3/sysext/lang/locallang_core.xlf b/typo3/sysext/lang/locallang_core.xlf index c4444811c59e5608bf53f0c8333c9db943fded79..2a74c611ebb141a201074b3b26dfc4c16d2cf3d5 100644 --- a/typo3/sysext/lang/locallang_core.xlf +++ b/typo3/sysext/lang/locallang_core.xlf @@ -1197,6 +1197,9 @@ Do you want to refresh it now?</source> <trans-unit id="toolbarItems.bookmarkSavedMessage"> <source>The bookmark was saved.</source> </trans-unit> + <trans-unit id="toolbarItems.help"> + <source>Help</source> + </trans-unit> <trans-unit id="toolbarItems.search"> <source>Search</source> </trans-unit> diff --git a/typo3/sysext/opendocs/Classes/Backend/ToolbarItems/OpendocsToolbarItem.php b/typo3/sysext/opendocs/Classes/Backend/ToolbarItems/OpendocsToolbarItem.php index 11a822c9300111b0278a377289696320d29d4659..4a0e8540eeef2ef8c96974ae03a8a105b65cdacd 100644 --- a/typo3/sysext/opendocs/Classes/Backend/ToolbarItems/OpendocsToolbarItem.php +++ b/typo3/sysext/opendocs/Classes/Backend/ToolbarItems/OpendocsToolbarItem.php @@ -87,12 +87,12 @@ class OpendocsToolbarItem implements ToolbarItemInterface { $numDocs = count($this->openDocs); $title = htmlspecialchars($this->getLanguageService()->getLL('toolbaritem')); - - $opendocsMenu = []; - $opendocsMenu[] = '<span title="' . $title . '">' . $this->iconFactory->getIcon('apps-toolbar-menu-opendocs', Icon::SIZE_SMALL)->render('inline') . '</span>'; - $opendocsMenu[] = '<span class="badge" id="tx-opendocs-counter">' . $numDocs . '</span>'; - - return implode(LF, $opendocsMenu); + $icon = $this->iconFactory->getIcon('apps-toolbar-menu-opendocs', Icon::SIZE_SMALL)->render('inline'); + return ' + <span class="toolbar-item-icon" title="' . $title . '">' . $icon . '</span> + <span class="toolbar-item-title">' . $title . '</span> + <span class="toolbar-item-badge badge" id="tx-opendocs-counter">' . $numDocs . '</span> + '; } /** @@ -106,26 +106,40 @@ class OpendocsToolbarItem implements ToolbarItemInterface $openDocuments = $this->openDocs; $recentDocuments = $this->recentDocs; $entries = []; + + $entries[] = '<h3 class="dropdown-headline">'; + $entries[] = htmlspecialchars($this->getLanguageService()->getLL('toolbaritem')); + $entries[] = '</h3>'; + $entries[] = '<hr>'; + if (!empty($openDocuments)) { - $entries[] = '<li class="dropdown-header">' . htmlspecialchars($languageService->getLL('open_docs')) . '</li>'; + $entries[] = '<h3 class="dropdown-headline">'; + $entries[] = htmlspecialchars($languageService->getLL('open_docs')); + $entries[] = '</h3>'; + $entries[] = '<div class="dropdown-table">'; $i = 0; foreach ($openDocuments as $md5sum => $openDocument) { $i++; $entries[] = $this->renderMenuEntry($openDocument, $md5sum, false, $i == 1); } - $entries[] = '<li class="divider"></li>'; + $entries[] = '</div>'; + $entries[] = '<hr>'; } // If there are "recent documents" in the list, add them if (!empty($recentDocuments)) { - $entries[] = '<li class="dropdown-header">' . htmlspecialchars($languageService->getLL('recent_docs')) . '</li>'; + $entries[] = '<h3 class="dropdown-headline">'; + $entries[] = htmlspecialchars($languageService->getLL('recent_docs')); + $entries[] = '</h3>'; + $entries[] = '<div class="dropdown-table">'; $i = 0; foreach ($recentDocuments as $md5sum => $recentDocument) { $i++; $entries[] = $this->renderMenuEntry($recentDocument, $md5sum, true, $i == 1); } + $entries[] = '</div>'; } if (!empty($entries)) { - $content = '<ul class="dropdown-list">' . implode('', $entries) . '</ul>'; + $content = implode('', $entries); } else { $content = '<p>' . htmlspecialchars($languageService->getLL('no_docs')) . '</p>'; } @@ -152,9 +166,7 @@ class OpendocsToolbarItem implements ToolbarItemInterface } $label = htmlspecialchars(strip_tags(htmlspecialchars_decode($document[0]))); $icon = $this->iconFactory->getIconForRecord($table, $record, Icon::SIZE_SMALL)->render(); - $link = BackendUtility::getModuleUrl('record_edit') - . '&' . $document[2] - . '&returnUrl=' . rawurlencode(BackendUtility::getModuleUrl('web_list') . '&id=' . (int)$document[3]['pid']); + $link = BackendUtility::getModuleUrl('record_edit') . '&' . $document[2]; $pageId = (int)$document[3]['uid']; if ($document[3]['table'] !== 'pages') { $pageId = (int)$document[3]['pid']; @@ -163,18 +175,33 @@ class OpendocsToolbarItem implements ToolbarItemInterface if (!$isRecentDoc) { $title = htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:rm.closeDoc')); // Open document - $closeIcon = $this->iconFactory->getIcon('actions-close', Icon::SIZE_SMALL)->render('inline'); - $entry = ' - <li class="opendoc"> - <a href="#" class="dropdown-list-link dropdown-link-list-add-close" onclick="' . htmlspecialchars($onClickCode) . '" target="content">' . $icon . ' ' . $label . '</a> - <a href="#" class="dropdown-list-link-close" data-opendocsidentifier="' . $md5sum . '" title="' . $title . '">' . $closeIcon . '</a> - </li>'; + $entry = '<div class="dropdown-table-row t3js-topbar-opendocs-item">'; + $entry .= '<div class="dropdown-table-column dropdown-table-icon">'; + $entry .= $icon; + $entry .= '</div>'; + $entry .= '<div class="dropdown-table-column dropdown-table-title">'; + $entry .= '<a class="dropdown-table-title-ellipsis" href="#" onclick="' . htmlspecialchars($onClickCode) . '" target="contentIframe">'; + $entry .= $label; + $entry .= '</a>'; + $entry .= '</div>'; + $entry .= '<div class="dropdown-table-column dropdown-table-actions">'; + $entry .= '<a href="#" class="dropdown-table-actions-btn dropdown-table-actions-btn-close t3js-topbar-opendocs-close" data-opendocsidentifier="' . $md5sum . '" title="' . $title . '">'; + $entry .= $this->iconFactory->getIcon('actions-close', Icon::SIZE_SMALL)->render('inline'); + $entry .= '</a>'; + $entry .= '</div>'; + $entry .= '</div>'; } else { // Recently used document - $entry = ' - <li> - <a href="#" class="dropdown-list-link" onclick="' . htmlspecialchars($onClickCode) . '" target="content">' . $icon . ' ' . $label . '</a> - </li>'; + $entry = '<div class="dropdown-table-row t3js-topbar-recentdoc">'; + $entry .= '<div class="dropdown-table-column dropdown-table-icon">'; + $entry .= $icon; + $entry .= '</div>'; + $entry .= '<div class="dropdown-table-column dropdown-table-title">'; + $entry .= '<a class="dropdown-table-title-ellipsis" href="#" onclick="' . htmlspecialchars($onClickCode) . '" target="contentIframe">'; + $entry .= $label; + $entry .= '</a>'; + $entry .= '</div>'; + $entry .= '</div>'; } return $entry; } diff --git a/typo3/sysext/opendocs/Resources/Public/JavaScript/Toolbar/OpendocsMenu.js b/typo3/sysext/opendocs/Resources/Public/JavaScript/Toolbar/OpendocsMenu.js index 1bd9836b116d1038a89bb088119b6a56ade14ef3..da228a78fd42dd0148607be99db10a8b61739346 100644 --- a/typo3/sysext/opendocs/Resources/Public/JavaScript/Toolbar/OpendocsMenu.js +++ b/typo3/sysext/opendocs/Resources/Public/JavaScript/Toolbar/OpendocsMenu.js @@ -22,18 +22,17 @@ define(['jquery', 'TYPO3/CMS/Backend/Icons'], function($, Icons) { /** * - * @type {{options: {containerSelector: string, hashDataAttributeName: string, closeSelector: string, menuContainerSelector: string, menuItemSelector: string, toolbarIconSelector: string, openDocumentsItemsSelector: string, counterSelector: string}}} + * @type {{options: {containerSelector: string, hashDataAttributeName: string, closeSelector: string, menuContainerSelector: string, toolbarIconSelector: string, openDocumentsItemsSelector: string, counterSelector: string}}} * @exports TYPO3/CMS/Opendocs/OpendocsMenu */ var OpendocsMenu = { options: { containerSelector: '#typo3-cms-opendocs-backend-toolbaritems-opendocstoolbaritem', hashDataAttributeName: 'opendocsidentifier', - closeSelector: '.dropdown-list-link-close', + closeSelector: '.t3js-topbar-opendocs-close', menuContainerSelector: '.dropdown-menu', - menuItemSelector: '.dropdown-menu li a', - toolbarIconSelector: '.dropdown-toggle span.icon', - openDocumentsItemsSelector: 'li.opendoc', + toolbarIconSelector: '.toolbar-item-icon .t3js-icon', + openDocumentsItemsSelector: '.t3js-topbar-opendocs-item', counterSelector: '#tx-opendocs-counter' } }; @@ -110,6 +109,7 @@ define(['jquery', 'TYPO3/CMS/Backend/Icons'], function($, Icons) { * closes the menu (e.g. when clicked on an item) */ OpendocsMenu.toggleMenu = function() { + $('.scaffold').removeClass('scaffold-toolbar-expanded'); $(OpendocsMenu.options.containerSelector).toggleClass('open'); }; diff --git a/typo3/sysext/sys_action/Classes/Backend/ToolbarItems/ActionToolbarItem.php b/typo3/sysext/sys_action/Classes/Backend/ToolbarItems/ActionToolbarItem.php index f57d05e2e177795ce4256a30d5a96f20b6318b1b..b934fdf2a42229950a1e19967cf17c278704766a 100644 --- a/typo3/sysext/sys_action/Classes/Backend/ToolbarItems/ActionToolbarItem.php +++ b/typo3/sysext/sys_action/Classes/Backend/ToolbarItems/ActionToolbarItem.php @@ -57,7 +57,11 @@ class ActionToolbarItem implements ToolbarItemInterface public function getItem() { $title = htmlspecialchars($this->getLanguageService()->getLL('action_toolbaritem')); - return '<span title="' . $title . '">' . $this->iconFactory->getIcon('apps-toolbar-menu-actions', Icon::SIZE_SMALL)->render('inline') . '</span>'; + $icon = $this->iconFactory->getIcon('apps-toolbar-menu-actions', Icon::SIZE_SMALL)->render('inline'); + return ' + <span class="toolbar-item-icon" title="' . $title . '">' . $icon . '</span> + <span class="toolbar-item-title">' . $title . '</span> + '; } /** @@ -68,15 +72,22 @@ class ActionToolbarItem implements ToolbarItemInterface public function getDropDown() { $actionMenu = []; - $actionMenu[] = '<ul class="dropdown-list">'; + $actionMenu[] = '<h3 class="dropdown-headline">' . htmlspecialchars($this->getLanguageService()->getLL('sys_action')) . '</h3>'; + $actionMenu[] = '<hr>'; + $actionMenu[] = '<div class="dropdown-table">'; foreach ($this->actionEntries as $linkConf) { - $actionMenu[] = '<li>'; - $actionMenu[] = '<a href="' . htmlspecialchars($linkConf[1]) . '" target="content" class="dropdown-list-link">'; - $actionMenu[] = $linkConf[2] . ' ' . htmlspecialchars($linkConf[0]); + $actionMenu[] = '<div class="dropdown-table-row">'; + $actionMenu[] = '<div class="dropdown-table-column dropdown-table-icon">'; + $actionMenu[] = $linkConf[2]; + $actionMenu[] = '</div>'; + $actionMenu[] = '<div class="dropdown-table-column dropdown-table-title">'; + $actionMenu[] = '<a class="t3js-topbar-link" href="' . htmlspecialchars($linkConf[1]) . '" target="contentIframe">'; + $actionMenu[] = htmlspecialchars($linkConf[0]); $actionMenu[] = '</a>'; - $actionMenu[] = '</li>'; + $actionMenu[] = '</div>'; + $actionMenu[] = '</div>'; } - $actionMenu[] = '</ul>'; + $actionMenu[] = '</div>'; return implode(LF, $actionMenu); } diff --git a/typo3/sysext/workspaces/Classes/Backend/ToolbarItems/WorkspaceSelectorToolbarItem.php b/typo3/sysext/workspaces/Classes/Backend/ToolbarItems/WorkspaceSelectorToolbarItem.php index 1491053608e51130f761c3da4d65b99ebbe7574b..1e909a5a8fa0d690caed0784bd4f55e6dda5c7ec 100644 --- a/typo3/sysext/workspaces/Classes/Backend/ToolbarItems/WorkspaceSelectorToolbarItem.php +++ b/typo3/sysext/workspaces/Classes/Backend/ToolbarItems/WorkspaceSelectorToolbarItem.php @@ -71,9 +71,12 @@ class WorkspaceSelectorToolbarItem implements ToolbarItemInterface if (empty($this->availableWorkspaces)) { return ''; } - - return '<span title="' . htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.workspace')) . '">' - . $this->iconFactory->getIcon('apps-toolbar-menu-workspace', Icon::SIZE_SMALL)->render('inline') . '</span>'; + $title = htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.workspace')); + $icon = $this->iconFactory->getIcon('apps-toolbar-menu-workspace', Icon::SIZE_SMALL)->render('inline'); + return ' + <span class="toolbar-item-icon" title="' . $title . '">' . $icon . '</span> + <span class="toolbar-item-title">' . $title . '</span> + '; } /** @@ -98,33 +101,59 @@ class WorkspaceSelectorToolbarItem implements ToolbarItemInterface foreach ($this->availableWorkspaces as $workspaceId => $label) { $workspaceId = (int)$workspaceId; $iconState = ($workspaceId === $activeWorkspace ? $stateCheckedIcon : $stateUncheckedIcon); - $classValue = ($workspaceId === $activeWorkspace ? ' class="selected"' : ''); + $classValue = ($workspaceId === $activeWorkspace ? 'selected' : ''); $sectionName = ($index++ === 0 ? 'top' : 'items'); - $workspaceSections[$sectionName][] = '<li' . $classValue . '>' - . '<a href="' . htmlspecialchars(\TYPO3\CMS\Backend\Utility\BackendUtility::getModuleUrl('main', ['changeWorkspace' => $workspaceId])) . '" data-workspaceid="' . $workspaceId . '" class="dropdown-list-link tx-workspaces-switchlink">' - . $iconState . ' ' . htmlspecialchars($label) - . '</a></li>'; + $workspaceSections[$sectionName][] = ' + <div class="dropdown-table-row t3js-workspace-item ' . $classValue . '"> + <div class="dropdown-table-column dropdown-table-icon"> + ' . $iconState . ' + </div> + <div class="dropdown-table-column"> + <a href="' . htmlspecialchars(\TYPO3\CMS\Backend\Utility\BackendUtility::getModuleUrl('main', ['changeWorkspace' => $workspaceId])) . '" data-workspaceid="' . $workspaceId . '" class="t3js-workspaces-switchlink"> + ' . htmlspecialchars($label) . ' + </a> + </div> + </div> + '; } if (!empty($workspaceSections['top'])) { // Add the "Go to workspace module" link // if there is at least one icon on top and if the access rights are there if ($backendUser->check('modules', 'web_WorkspacesWorkspaces')) { - $workspaceSections['top'][] = '<li><a target="content" data-module="web_WorkspacesWorkspaces" class="dropdown-list-link tx-workspaces-modulelink">' - . $stateUncheckedIcon . ' ' . htmlspecialchars($languageService->getLL('bookmark_workspace')) - . '</a></li>'; + $workspaceSections['top'][] = ' + <div class="dropdown-table-row"> + <div class="dropdown-table-column dropdown-table-icon"> + ' . $stateUncheckedIcon . ' + </div> + <div class="dropdown-table-column"> + <a href="#" target="contentIframe" data-module="web_WorkspacesWorkspaces" class="t3js-workspaces-modulelink"> + ' . htmlspecialchars($languageService->getLL('bookmark_workspace')) . ' + </a> + </div> + </div> + '; } } else { // no items on top (= no workspace to work in) - $workspaceSections['top'][] = '<li>' . $stateUncheckedIcon . ' ' . htmlspecialchars($languageService->getLL('bookmark_noWSfound')) . '</li>'; + $workspaceSections['top'][] = ' + <div class="dropdown-table-row"> + <div class="dropdown-table-column dropdown-table-icon"> + ' . $stateUncheckedIcon . ' + </div> + <div class="dropdown-table-column"> + ' . htmlspecialchars($languageService->getLL('bookmark_noWSfound')) . ' + </div> + </div> + '; } $workspaceMenu = [ - '<ul class="dropdown-list">' , - implode(LF, $workspaceSections['top']), - (!empty($workspaceSections['items']) ? '<li class="divider"></li>' : ''), - implode(LF, $workspaceSections['items']), - '</ul>' + '<h3 class="dropdown-headline">' . htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:toolbarItems.workspace')) . '</h3>', + '<hr>', + '<div class="dropdown-table">' . implode(LF, $workspaceSections['top']) . '</div>', + (!empty($workspaceSections['items']) ? '<hr>' : ''), + '<div class="dropdown-table">' . implode(LF, $workspaceSections['items']) . '</div>', ]; return implode(LF, $workspaceMenu); diff --git a/typo3/sysext/workspaces/Resources/Public/JavaScript/Toolbar/WorkspacesMenu.js b/typo3/sysext/workspaces/Resources/Public/JavaScript/Toolbar/WorkspacesMenu.js index 184c85e76b274d2dc228d63f24009e68f1ab9b0a..bc4e17d616ca47d9e0113393482bd2b649467c6f 100644 --- a/typo3/sysext/workspaces/Resources/Public/JavaScript/Toolbar/WorkspacesMenu.js +++ b/typo3/sysext/workspaces/Resources/Public/JavaScript/Toolbar/WorkspacesMenu.js @@ -27,12 +27,12 @@ define(['jquery'], function($) { var WorkspacesMenu = { options: { containerSelector: '#typo3-cms-workspaces-backend-toolbaritems-workspaceselectortoolbaritem', - menuItemSelector: '.dropdown-menu li a.tx-workspaces-switchlink', + menuItemSelector: '.t3js-workspaces-switchlink', activeMenuItemSelector: '.dropdown-menu .selected', toolbarItemSelector: '.dropdown-toggle', workspaceBodyClass: 'typo3-in-workspace', // attached to <body> when in a workspace - workspacesTitleInToolbarClass: 'topbar-workspaces-title', - workspaceModuleLinkSelector: '.tx-workspaces-modulelink' + workspacesTitleInToolbarClass: 'toolbar-item-name', + workspaceModuleLinkSelector: '.t3js-workspaces-modulelink' } }; @@ -123,8 +123,8 @@ define(['jquery'], function($) { // add "selected" class and checkmark var $activeElement = $(WorkspacesMenu.options.menuItemSelector + '[data-workspaceid=' + id + ']', WorkspacesMenu.options.containerSelector); - $activeElement.find('i').removeClass(stateInactiveClass).addClass(stateActiveClass); - $activeElement.parent().addClass('selected'); + $activeElement.parent().parent().find('i').removeClass(stateInactiveClass).addClass(stateActiveClass); + $activeElement.parent().parent().addClass('selected'); }; /**