diff --git a/core/misc/tableheader.js b/core/misc/tableheader.js index 0d4f7cd..3ae33c2 100644 --- a/core/misc/tableheader.js +++ b/core/misc/tableheader.js @@ -130,6 +130,7 @@ $.extend(TableHeader, { /** * Sum all [data-offset-top] values and cache it. + * @todo move this out of tableheader.js into a move generic place like drupal.js. */ computeOffsetTop: function () { var $offsets = $('[data-offset-top]'); diff --git a/core/modules/shortcut/shortcut.base.css b/core/modules/shortcut/shortcut.base.css index 90a1046..5af1151 100644 --- a/core/modules/shortcut/shortcut.base.css +++ b/core/modules/shortcut/shortcut.base.css @@ -5,19 +5,6 @@ */ /** - * Toolbar. - */ -#edit-shortcuts { - float: right; /* LTR */ -} -#shortcut-toolbar ul { - float: left; /* LTR */ -} -#shortcut-toolbar .icon { - float: left; /* LTR */ -} - -/** * Add/remove links. */ .add-or-remove-shortcuts .icon { diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module index 9bbb12a..840a68b 100644 --- a/core/modules/shortcut/shortcut.module +++ b/core/modules/shortcut/shortcut.module @@ -716,10 +716,10 @@ function shortcut_preprocess_page(&$variables) { * Implements hook_page_alter(). */ function shortcut_page_alter(&$page) { - if (isset($page['page_top']['toolbar'])) { + if (isset($page['page_bottom']['toolbar'])) { // If the toolbar is available, add a pre-render function to display the // current shortcuts in the toolbar drawer. - $page['page_top']['toolbar']['#pre_render'][] = 'shortcut_toolbar_pre_render'; + $page['page_bottom']['toolbar']['#pre_render'][] = 'shortcut_toolbar_pre_render'; } } @@ -734,8 +734,6 @@ function shortcut_toolbar_pre_render($toolbar) { drupal_get_path('module', 'shortcut') . '/shortcut.theme.css', ), ); - $links['#prefix'] = '
'; - $links['#suffix'] = '
'; $shortcut_set = shortcut_current_displayed_set(); $configure_link = NULL; if (shortcut_set_edit_access($shortcut_set)) { @@ -752,7 +750,7 @@ function shortcut_toolbar_pre_render($toolbar) { 'configure' => $configure_link, ); - $toolbar['toolbar_drawer'][] = $drawer; + $toolbar['toolbar_shortcuts'][] = $drawer; return $toolbar; } diff --git a/core/modules/shortcut/shortcut.theme.css b/core/modules/shortcut/shortcut.theme.css index 9e2dc69..930f466 100644 --- a/core/modules/shortcut/shortcut.theme.css +++ b/core/modules/shortcut/shortcut.theme.css @@ -5,45 +5,6 @@ */ /** - * Toolbar. - */ -.toolbar #edit-shortcuts { - line-height: 24px; - padding: 5px 10px; -} -#edit-shortcuts:focus, -#edit-shortcuts:hover, -#edit-shortcuts.active { - text-decoration: underline; -} -#shortcut-toolbar ul { - line-height: 24px; - margin-left: 5px; /* LTR */ - padding: 5px 0; -} -#shortcut-toolbar a { - border-radius: 5px; - margin-right: 5px; /* LTR */ - padding: 0 5px; -} -#shortcut-toolbar a:focus, -#shortcut-toolbar a:hover, -#shortcut-toolbar a.active:focus { - background: #555; -} -#shortcut-toolbar a.active:hover, -#shortcut-toolbar a.active { - background-color: #000; -} -#shortcut-toolbar .icon { - background-color: #444; - border-radius: 5px; - height: 30px; - margin-right: 5px; /* LTR */ - width: 30px; -} - -/** * Add/remove links. */ .add-or-remove-shortcuts .icon { @@ -65,15 +26,3 @@ .remove-shortcut a:hover .icon { background-position: -12px -12px; /* LTR */ } -.add-or-remove-shortcuts .text { - padding: 0 6px 0 10px; /* LTR */ -} -.add-or-remove-shortcuts a:focus .text, -.add-or-remove-shortcuts a:hover .text { - background-color: #5f605b; - border-radius: 0 5px 5px 0; /* LTR */ - color: #fff; - cursor: pointer; - font-size: 10px; - line-height: 12px; -} diff --git a/core/modules/system/system.module b/core/modules/system/system.module index bb3f2b4..6702d40 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -1860,7 +1860,6 @@ function system_library_info() { array('system', 'jquery'), ), ); - $libraries['drupal.tableselect'] = array( 'title' => 'Tableselect', 'version' => VERSION, diff --git a/core/modules/toolbar/css/toolbar.base-rtl.css b/core/modules/toolbar/css/toolbar.base-rtl.css new file mode 100644 index 0000000..253b758 --- /dev/null +++ b/core/modules/toolbar/css/toolbar.base-rtl.css @@ -0,0 +1,26 @@ + +#toolbar, +#toolbar * { + text-align: right; +} +#toolbar ul li { + float: right; +} +#toolbar ul li a { + display: inline-block; + float: none; + zoom: 1; +} +#toolbar-user { + float: left; +} +#toolbar #toolbar-user li { + float: none; + display: inline; +} +#toolbar-menu { + float: none; +} +#toolbar-home { + float: right; +} diff --git a/core/modules/toolbar/css/toolbar.base.css b/core/modules/toolbar/css/toolbar.base.css new file mode 100644 index 0000000..8791997 --- /dev/null +++ b/core/modules/toolbar/css/toolbar.base.css @@ -0,0 +1,258 @@ +/** + * @file toolbar.admin.css + * + * + * Aggressive resets so we can achieve a consistent look in hostile CSS + * environments. + */ +body.toolbar { + -moz-box-sizing: border-box; + -o-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} +#toolbar, +#toolbar * { + -moz-box-sizing: border-box; + -o-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + list-style: none; + margin: 0; + outline: 0; + padding: 0; + -moz-tap-highlight-color: rgba(0,0,0,0); + -o-tap-highlight-color: rgba(0,0,0,0); + -webkit-tap-highlight-color: rgba(0,0,0,0); + tap-highlight-color: rgba(0,0,0,0); + text-align: left; /* LTR */ + -moz-text-size-adjust: none; + -o-text-size-adjust: none; + -webkit-text-size-adjust: none; + text-size-adjust: none; + -moz-touch-callout: none; + -o-touch-callout: none; + -webkit-touch-callout: none; + touch-callout: none; + -moz-user-select: none; + -o-user-select: none; + -webkit-user-select: none; + user-select: none; + vertical-align: baseline; +} +#toolbar { + font-size: 100%; + font-size: 1rem; + line-height: 1; +} + +/** + * Administration menu. + */ +#toolbar .toolbar-bar { + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 600; +} +@media screen and (max-width:28.124em) { + #toolbar .toolbar-bar { + position: absolute; + } +} +@media screen and (min-width:16.5em) { + #toolbar-actions { + float: left; /* LTR */ + } + #toolbar-user { + float: right; /* LTR */ + } + #toolbar .toolbar-bar .section { + min-height: 2.875em; + } + #toolbar .toolbar-bar .section.first, + #toolbar .toolbar-bar .section.second { + min-width: 6.6667em; + } + #toolbar .toolbar-bar .section.first { + float: left; /* LTR */ + } + #toolbar .toolbar-bar .section.second { + float: right; /* LTR */ + } + #toolbar .toolbar-bar .section.actions { + overflow: hidden; + } + #toolbar .toolbar-bar .menu li { + display: block; + float: left; /* LTR */ + } + #toolbar .toolbar-bar .menu a { + display: inline-block; + } +} +/** + * Toolbar tray. + */ +#toolbar .toolbar-tray.positioned { + bottom: 0; + left: -320px; + left: -20rem; + max-width: 92%; + overflow-y: auto; + position: fixed; + width: 320px; + width: 20rem; + z-index: 600; +} +#toolbar .toolbar-tray.positioned > .slider { + left: -100%; /* LTR */ + overflow:hidden; + position: absolute; + -moz-transition: left, 0.2s ease-out; + -o-transition: left, 0.2s ease-out; + -webkit-transition: left, 0.2s ease-out; + transition: left, 0.2s ease-out; + width: 100%; +} +#toolbar .toolbar-tray.positioned.active, +#toolbar .toolbar-tray.positioned.active > .slider { + left: 0; /* LTR */ +} +/** + * At larger screen sizes, the tray pushes the page content + * using padding instead of left. + */ +@media screen and (max-width:28.124em) { + body.menu-tray-open { + overflow: hidden; + } + #toolbar .toolbar-tray.positioned { + position: absolute; + } +} +/** + * At larger screen sizes, the tray pushes the page content + * using padding instead of left. + */ +@media screen and (min-width:28.125em) { + body.menu-tray-open { + padding-left: 320px; + padding-left: 20rem; + } +} +#toolbar .toolbar-tray .toolbar-menu li a { + display: block; +} +/* This style seems to belong neither in toolbar nor in shortcut. */ +#toolbar .toolbar-tray #shortcut-toolbar + a { + margin-top: 0.3333em; +} +/** + * Fleximenu accordion. + */ + +#toolbar .fleximenu { + position: relative; + overflow: hidden; +} +#toolbar ul { + list-style: none; + margin: 0; + padding: 0; +} +#toolbar .fleximenu li { + display: block; +} +#toolbar .box { + position: relative; +} +#toolbar .dormant { + display: none; +} +#toolbar .trail > ul { /* Show the sub-menus */ + display: block; +} +#toolbar .active > ul { + z-index: 51; /* Pull the active trail li's above the other li's */ +} +#toolbar .fleximenu .box { + display: block; + line-height: 1em; /* this prevents the value "normal" from being returned as the line-height */ + width: auto; +} +#toolbar .fleximenu a { + display: block; + line-height: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +#toolbar .handle { + bottom: 0; + display: block; + height: 1.5em; + position: absolute; + right: 22px; + top: 0.2em; + -moz-transform: rotate(0deg); + -moz-transition: -moz-transform 0.1s ease-in; + -webkit-transform: rotate(0deg); + -webkit-transition: -webkit-transform 0.1s ease-in; + -o-transform: rotate(0deg); + -o-transition: -o-transform 0.1s ease-in; + transform: rotate(0deg); + transition: transform 0.1s ease-in; + width: 1.2em; + z-index: 1; +} +#toolbar .handle::after, +#toolbar .handle::before { + background-color: #999; + border-radius: 0px; + content: " "; + display: block; + height: 1em; + left: 50%; + position: absolute; + width: 2px; +} +#toolbar .handle::before { + -moz-transform: rotate(-135deg); + -o-transform: rotate(-135deg); + -webkit-transform: rotate(-135deg); + transform: rotate(-135deg); + top: 0.6em; +} +#toolbar .handle::after { + -moz-transform: rotate(135deg); + -o-transform: rotate(135deg); + -webkit-transform: rotate(135deg); + transform: rotate(135deg); + top: 0; +} +#toolbar .toolbar-tray .level-1 > li > .box .handle { + top: 0.7em; +} +#toolbar .toolbar-tray .level-1 > li.open > .box .handle { + top: 0.6em; +} +#toolbar .handle.open { + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +#toolbar .handle + * { + margin-right: 60px; +} +#toolbar .handle:hover { + cursor: pointer; +} +/* Shortcuts */ +#toolbar #edit-shortcuts { + clear: left; + display: block; +} diff --git a/core/modules/toolbar/css/toolbar.theme-rtl.css b/core/modules/toolbar/css/toolbar.theme-rtl.css new file mode 100644 index 0000000..5017ad0 --- /dev/null +++ b/core/modules/toolbar/css/toolbar.theme-rtl.css @@ -0,0 +1,7 @@ +#toolbar .toolbar-bar .menu li + li { + margin-left: auto; + margin-right: 1em; +} +#toolbar .toolbar-shortcuts .menu li { + float: right; +} diff --git a/core/modules/toolbar/css/toolbar.theme.css b/core/modules/toolbar/css/toolbar.theme.css new file mode 100644 index 0000000..ae63a3a --- /dev/null +++ b/core/modules/toolbar/css/toolbar.theme.css @@ -0,0 +1,362 @@ +/** + * @file toolbar.theme.css + * + * + * We use a keyword for the toolbar font size to make it display consistently + * across different themes, while still allowing browsers to resize the text. + */ +#toolbar { + font-family: "Lucida Grande", Verdana, sans-serif; + /* Drupal themes set font size to 13px. This sets it to 14px. */ + font-size: 1.0769em; + /* Set base font size to 14px based on root ems. */ + font-size: 0.875rem; +} +#toolbar a { + text-decoration: none; +} +#toolbar a:hover { + text-decoration: underline; +} +/** + * Toolbar bar. + */ +#toolbar .toolbar-bar { + background-color: #383838; + color: #dddddd; +} +#toolbar .toolbar-bar a { + color: #ffffff; +} +#toolbar .toolbar-bar .home-link { + background-position: 9px -19px; +} +#toolbar .toolbar-bar .toggle-tray { + background-position: -13px -19px; + -moz-transition: background-color, 0.2s ease-in; + -o-transition: background-color, 0.2s ease-in; + -webkit-transition: background-color, 0.2s ease-in; + transition: background-color, 0.2s ease-in; +} +#toolbar .toolbar-bar .toggle-tray.active { + background-color: white; + color: black; +} +#toolbar .toolbar-bar .tab { + background-attachment: scroll; + background-color: transparent; + background-repeat: no-repeat; + cursor: pointer; + display: block; + padding: 0.3333em 0.1667em; +} +#toolbar .toolbar-bar .menu li:hover { + background-image: -moz-linear-gradient(rgba(135, 135, 135, 0.2), rgba(135, 135, 135, 0.1)); + background-image: -o-linear-gradient(rgba(135, 135, 135, 0.2), rgba(135, 135, 135, 0.1)); + background-image: -webkit-linear-gradient(rgba(135, 135, 135, 0.2), rgba(135, 135, 135, 0.1)); + background-image: linear-gradient(rgba(135, 135, 135, 0.2), rgba(135, 135, 135, 0.1)); +} +@media screen and (min-width:16.5em) { + #toolbar .toolbar-bar .section.actions { + padding-bottom: 0.5em; + padding-top: 0.5em; + } +} +/** + * Toolbar tray. + */ +#toolbar .toolbar-tray { + background-color: white; + border-right: 1px solid #aaaaaa; + -moz-box-shadow: 0px 1px 7px 0px rgba(0, 0, 0, 0.4); + -o-box-shadow: 0px 1px 7px 0px rgba(0, 0, 0, 0.4); + -webkit-box-shadow: 0px 1px 7px 0px rgba(0, 0, 0, 0.4); + box-shadow: 0px 5px 7px 0px rgba(0, 0, 0, 0.4); +} +#toolbar .toolbar-tray a { + color: #333333; +} +#toolbar .toolbar-tray .lining { + padding-bottom: 1em; + padding-top: 1em; +} +#toolbar .toolbar-tray .lining > * + * { + margin-top: 1em; +} +#toolbar .toolbar-tray .toolbar-menu { + border-bottom-color: #dddddd; + border-bottom-style: solid; + border-bottom-width: 1px; +} +#toolbar .toolbar-tray li { + border-top-color: transparent; + border-top-style: solid; + border-top-width: 1px; +} +#toolbar .toolbar-tray li.open > .box { + border-bottom-color: transparent; + border-bottom-style: solid; + border-bottom-width: 1px; +} +#toolbar .toolbar-menu li a { + padding: 1em 0; + text-indent: 3px; +} +#toolbar .toolbar-tray .level-1 > li { + border-top-color: #dddddd; +} +#toolbar .toolbar-tray .level-1 > li.open > .box { + border-bottom-color: #dddddd; +} +#toolbar .toolbar-tray .level-1 a { + color: black; + padding: 1em 0; + font-weight: bold; +} +#toolbar .toolbar-tray .level-1 .menu { + margin-left: 5px; +} +#toolbar .toolbar-tray .level-2 { + background-color: #f5f5f5; +} +#toolbar .toolbar-tray .level-2 a { + color: #333333; + padding: 0.5em 0; + font-weight: normal; + text-indent: 2.6429em; +} +#toolbar .toolbar-tray .level-2 > li + li { + border-top-color: #cccccc; +} +#toolbar .toolbar-tray .level-2 > li.open > .box { + border-bottom-color: #cccccc; +} +#toolbar .toolbar-tray .level-3 { + background-color: #e5e5e5; +} +#toolbar .toolbar-tray .level-3 > li + li { + border-top-color: #bbbbbb; +} +#toolbar .toolbar-tray .level-3 > li.open > .box { + border-bottom-color: #bbbbbb; +} +#toolbar .toolbar-tray .level-3 a { + color: #303030; + text-indent: 2.2857em; +} +#toolbar .toolbar-tray .level-4 { + background-color: #d5d5d5; +} +#toolbar .toolbar-tray .level-4 > li + li { + border-top-color: #aaaaaa; +} +#toolbar .toolbar-tray .level-4 > li.open > .box { + border-bottom-color: #aaaaaa; +} +#toolbar .toolbar-tray .level-4 a { + color: #2d2d2d; +} +#toolbar .toolbar-tray .level-5 { + background-color: #c5c5c5; +} +#toolbar .toolbar-tray .level-5 > li + li { + border-top-color: #999999; +} +#toolbar .toolbar-tray .level-5 > li.open > .box { + border-bottom-color: #999999; +} +#toolbar .toolbar-tray .level-5 a { + color: #2a2a2a; +} +#toolbar .toolbar-tray .level-6 { + background-color: #b5b5b5; +} +#toolbar .toolbar-tray .level-6 > li + li { + border-top-color: #888888; +} +#toolbar .toolbar-tray .level-6 > li.open > .box { + border-bottom-color: #888888; +} +#toolbar .toolbar-tray .level-6 a { + color: #272727; +} +#toolbar .toolbar-tray .level-7 { + background-color: #a5a5a5; +} +#toolbar .toolbar-tray .level-7 > li + li { + border-top-color: #777777; +} +#toolbar .toolbar-tray .level-7 > li.open > .box { + border-bottom-color: #777777; +} +#toolbar .toolbar-tray .level-7 a { + color: #242424; +} +#toolbar .toolbar-tray .level-8 { + background-color: #959595; +} +#toolbar .toolbar-tray .level-8 > li + li { + border-top-color: #666666; +} +#toolbar .toolbar-tray .level-8 > li.open > .box { + border-bottom-color: #666666; +} +#toolbar .toolbar-tray .level-8 a { + color: #212121; +} +#toolbar .toolbar-tray .level-9 { + background-color: #858585; +} +#toolbar .toolbar-tray .level-9 > li + li { + border-top-color: #555555; +} +#toolbar .toolbar-tray .level-9 a { + color: #1e1e1e; +} +#toolbar .toolbar-tray .form-type-search { + padding-left: 0.75em; + padding-right: 0.75em; +} +#toolbar .toolbar-tray .filter { + width: 100%; +} +@media screen and (min-width:16.5em) and (max-width:34em) { + #toolbar .toolbar-bar .tab { + text-indent: -9999px; + } +} +#toolbar .toolbar-tray .level-1 > li > .box > a, +#toolbar .toolbar-bar .tab { + background-attachment: scroll; + background-position: 0.4545em center; + background-repeat: no-repeat; + background-size: 2em; +} +#toolbar #toolbar-link-admin-content { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGw9IiMwMTAxMDEiIGQ9Ik02NC4wNjcsMGwyNi45NjgsMjcuNjMxVjEwMEg4Ljk2NVYwSDY0LjA2N3ogTTIwLjgwOSw4OC4xNTZoNTguMzl2LTU2LjU4SDU3Ljk3OVYxMS44NDFoLTM3LjE3Vjg4LjE1NnoNCgkgTTI4Ljg2Nyw0OS41MDRoNDEuNzc3di00LjYwNUgyOC44NjdWNDkuNTA0eiBNMjguODY3LDYyLjY2NWg0MS43NzdWNTguMDZIMjguODY3VjYyLjY2NXogTTI4Ljg2Nyw3NS44MThoNDEuNzc3di00LjYwNUgyOC44NjcNCglWNzUuODE4eiIvPg0KPC9zdmc+DQo=); +} +#toolbar #toolbar-link-admin-structure { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwb2x5Z29uIHBvaW50cz0iODguMDAxLDY0LjA0NSA4OC4wMDEsNTEuOTk4IDg4LjAwMSw0OC4wMDIgODQuMDAxLDQ4LjAwMiA1MS45OTcsNDguMDAyIDUxLjk5NywzNS45NTMgNjQuMDAzLDM1Ljk1MyA2NC4wMDMsMTUuOTEgDQoJMzYsMTUuOTEgMzYsMzUuOTUzIDQ4LjAwMSwzNS45NTMgNDguMDAxLDQ4LjAwMiAxNS45OTgsNDguMDAyIDEyLjAwMyw0OC4wMDIgMTIuMDAzLDUxLjk5OCAxMi4wMDMsNjQuMDQ1IDAsNjQuMDQ1IDAsODQuMDkyIA0KCTI4LDg0LjA5MiAyOCw2NC4wNDUgMTUuOTk4LDY0LjA0NSAxNS45OTgsNTEuOTk4IDQ4LjAwMSw1MS45OTggNDguMDAxLDY0LjA0NSAzNiw2NC4wNDUgMzYsODQuMDkyIDY0LjAwMyw4NC4wOTIgNjQuMDAzLDY0LjA0NSANCgk1MS45OTcsNjQuMDQ1IDUxLjk5Nyw1MS45OTggODQuMDAxLDUxLjk5OCA4NC4wMDEsNjQuMDQ1IDcyLjAwMiw2NC4wNDUgNzIuMDAyLDg0LjA5MiAxMDAsODQuMDkyIDEwMCw2NC4wNDUgIi8+DQo8L3N2Zz4NCg==); +} +#toolbar #toolbar-link-admin-structure { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwb2x5Z29uIHBvaW50cz0iODguMDAxLDY0LjA0NSA4OC4wMDEsNTEuOTk4IDg4LjAwMSw0OC4wMDIgODQuMDAxLDQ4LjAwMiA1MS45OTcsNDguMDAyIDUxLjk5NywzNS45NTMgNjQuMDAzLDM1Ljk1MyA2NC4wMDMsMTUuOTEgDQoJMzYsMTUuOTEgMzYsMzUuOTUzIDQ4LjAwMSwzNS45NTMgNDguMDAxLDQ4LjAwMiAxNS45OTgsNDguMDAyIDEyLjAwMyw0OC4wMDIgMTIuMDAzLDUxLjk5OCAxMi4wMDMsNjQuMDQ1IDAsNjQuMDQ1IDAsODQuMDkyIA0KCTI4LDg0LjA5MiAyOCw2NC4wNDUgMTUuOTk4LDY0LjA0NSAxNS45OTgsNTEuOTk4IDQ4LjAwMSw1MS45OTggNDguMDAxLDY0LjA0NSAzNiw2NC4wNDUgMzYsODQuMDkyIDY0LjAwMyw4NC4wOTIgNjQuMDAzLDY0LjA0NSANCgk1MS45OTcsNjQuMDQ1IDUxLjk5Nyw1MS45OTggODQuMDAxLDUxLjk5OCA4NC4wMDEsNjQuMDQ1IDcyLjAwMiw2NC4wNDUgNzIuMDAyLDg0LjA5MiAxMDAsODQuMDkyIDEwMCw2NC4wNDUgIi8+DQo8L3N2Zz4NCg==); +} +#toolbar #toolbar-link-admin-appearance { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNTMuNDgyLDUzLjAxNUw0MC44NzUsNjYuMTY4TDMwLjA2Miw1NC44NjRsMjEuNzI2LTI5Ljg5OWwxNC4yNjksMTQuODk4DQoJTDUzLjQ4Miw1My4wMTV6IE01OC4xNzEsMjUuNDQ4YzAsMC0xNC42NzUtMjAuNjI1LTE2LjI0LTIzLjM4N2MtMS41NjUtMi43NjMtNy4yMDEtMy4yMjktMTAuODAzLDEuNjIyDQoJQzI5LjQxMyw1Ljk5NCwzLjk3OSwzMS43NzMsMi43NjQsMzMuMjIxYy0xLjIxMywxLjQ0Ny0xLjk1Miw0Ljc3NiwwLjI5Niw2LjQ3NUM1LjMwOCw0MS4zOTgsMjcuMDksNTcuOTIyLDI3LjA5LDU3LjkyMg0KCWwxMC44NTUsMTEuMzUzbC0xLjQ4NiwxLjUyNmM0LjYzNiw0Ljg2NSw1LjQwNiw1LjY3Niw2LjkzNyw1LjcyNWM0Ljk1OCwwLjA5MiwxNC45MS05LjkxMiwxOC4wMTYtNS44OTYNCgljNi4yMiw4LjAxNCwyMi41MjIsMjYuNjE4LDIyLjUyMiwyNi42MThjMy4zNzUsMy41NTIsOC44MzIsMy42OTIsMTIuMDc5LDAuMjY5YzMuMjc4LTMuNDI0LDMuMTQ5LTkuMTAxLTAuMjc0LTEyLjY1Mw0KCWMwLDAtMTcuNzQzLTE3LjAzNS0yNS40NTItMjMuNTZjLTMuODI3LTMuMTk4LDUuNzYyLTEzLjYwMiw1LjYzNC0xOC44MjhjLTAuMDQ5LTEuNTc5LTAuODEyLTIuMzg4LTUuNDU3LTcuMjU0bC0xLjQ3NywxLjU4DQoJTDU4LjE3MSwyNS40NDh6Ii8+DQo8L3N2Zz4NCg==); +} +#toolbar #toolbar-link-admin-people { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTguMjcxLDIwLjYzNWMwLDcuNjQsNi4yMzEsMTMuODE4LDEzLjg2NywxMy44MTgNCglDMzkuODE2LDM0LjQ1Myw0NiwyOC4yNzUsNDYsMjAuNjM1YzAtNy42MzgtNi4xODMtMTMuODE4LTEzLjg2Mi0xMy44MThDMjQuNTAyLDYuODE3LDE4LjI3MSwxMi45OTcsMTguMjcxLDIwLjYzNXogTTUzLjM2NCw0MC43NzUNCgljLTQuNzI5LTEuNjQyLTExLjUwMS0yLjU5Mi0yMS4yMjctMi41OTJDMC43NzIsMzguMTgzLDAsNDcuMzE3LDAsNjAuODE2aDQ5LjMxOWMwLDAtMi4zMjUtNC43Ni0wLjg5My0xMC44NjgNCglDNDkuOTcsNDMuMzY5LDUzLjM2NCw0MC43NzUsNTMuMzY0LDQwLjc3NXogTTUzLjk5OSw1M2MwLDcuNjMzLDYuMTgzLDEzLjgxNiwxMy44NjEsMTMuODE2YzcuNjM1LDAsMTMuODY3LTYuMTgzLDEzLjg2Ny0xMy44MTYNCgljMC03LjU5MS02LjIzMS0xMy44MTgtMTMuODY3LTEzLjgxOEM2MC4xODIsMzkuMTgyLDUzLjk5OSw0NS40MDksNTMuOTk5LDUzeiBNMTAwLDkzLjE4M2MwLTEzLTAuNzI2LTIyLjU5NS0zMi4xNC0yMi41OTUNCgljLTMxLjQwOSwwLTMyLjEzNyw5LjEzNy0zMi4xMzcsMjIuNTk1SDEwMHoiLz4NCjwvc3ZnPg0K); +} +#toolbar #toolbar-link-admin-modules { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGQ9Ik0xMDAsOTEuMzM2TDc5LjM4OSw3MC43MjVsMTEuNzQzLTExLjc0MmMzLjEyNS0zLjEyNSwzLjEyNS04LjE5MS0wLjAwMS0xMS4zMTRsLTMwLjkwNy0zMC45MWwtNi42ODcsNi42ODdMMzAuMDkyLDANCglsLTYuMjU5LDYuMjZsMjMuNDQ1LDIzLjQ0NEwyOS43MDQsNDcuMjc4TDYuMjU5LDIzLjgzM0wwLDMwLjA5M2wyMy40NDUsMjMuNDQzbC02LjY4Nyw2LjY4N2wzMC45MTEsMzAuOTENCgljMy4xMjEsMy4xMjMsOC4xODgsMy4xMjMsMTEuMzEyLDBMNzAuNzI1LDc5LjM5TDkxLjMzNiwxMDBMMTAwLDkxLjMzNnoiLz4NCjwvc3ZnPg0K); +} +#toolbar #toolbar-link-admin-config { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS4wOTcsNTMuMDAyYzkuNDk5LDkuNSwyMy41NDEsMTEuNTQ0LDM1LjA0Miw2LjIyNmwzNy42MzQsMzcuNjM3DQoJYzQuMTgxLDQuMTgxLDEwLjk1Myw0LjE4MSwxNS4wOTEsMGM0LjE4MS00LjEzOCw0LjE4MS0xMC45MSwwLTE1LjA5MUw1OS4yMjcsNDQuMTM5YzUuMzE5LTExLjUsMy4yNzQtMjUuNTQzLTYuMjIzLTM1LjA0Mg0KCUM0NC41OTcsMC42OTEsMzIuNTUtMS45MDEsMjEuOTYsMS4zN2wyMy40OTcsMjMuNTAybC00LjQxMiwxNi4wODRsLTE2LjE3NCw0LjUwMUwxLjM3LDIxLjk2DQoJQy0xLjkwMSwzMi41NSwwLjY5MSw0NC41OTcsOS4wOTcsNTMuMDAyeiIvPg0KPC9zdmc+DQo=); +} +#toolbar #toolbar-link-admin-reports { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zNy4yMDYsMTguNzI2VjBMMTIuNDk4LDI0LjcwOGgxOC43MjZDMzQuNTI5LDI0LjcwOCwzNy4yMDYsMjIuMDMyLDM3LjIwNiwxOC43MjZ6Ii8+DQoJPHBhdGggZD0iTTI3Ljk0Nyw1MC40OTJoNy40NjljMC44NDMsMCwxLjUyNS0wLjY4NSwxLjUyNS0xLjUyNXYtNy40NjZjMC0wLjg0MS0wLjY4Mi0xLjUzMi0xLjUyNS0xLjUzMmgtNy40NjkNCgkJYy0wLjgzOCwwLTEuNTIsMC42OTEtMS41MiwxLjUzMnY3LjQ2NkMyNi40MjgsNDkuODA4LDI3LjEwOSw1MC40OTIsMjcuOTQ3LDUwLjQ5MnoiLz4NCgk8cGF0aCBkPSJNODEuNDk2LDBINDMuNTM5djIyLjI3NGMwLDQuODQtMy45MjQsOC43NjYtOC43NjMsOC43NjZIMTIuNDk4djYyLjk2MmMwLDMuMzEsMi42ODgsNS45OTgsNiw1Ljk5OGg2Mi45OTkNCgkJYzMuMzE4LDAsNi4wMDctMi42ODgsNi4wMDctNS45OThWNS45OTdDODcuNTAzLDIuNjg5LDg0LjgxNCwwLDgxLjQ5NiwweiBNMjMuODA1LDM5LjY0YzAtMS4yNiwxLjAyMy0yLjI4OCwyLjI4OC0yLjI4OGgxMS4xODMNCgkJYzEuMjYsMCwyLjI4NywxLjAyOCwyLjI4NywyLjI4OHYxMS4xODFjMCwxLjI2NS0xLjAyNywyLjI4Ny0yLjI4NywyLjI4N0gyNi4wOTNjLTEuMjY1LDAtMi4yODgtMS4wMjItMi4yODgtMi4yODdWMzkuNjR6DQoJCSBNNzYuMTk0LDgxLjM5N2MwLDEuODI2LTEuNDc5LDMuMzA1LTMuMzAyLDMuMzA1SDI3LjEwOWMtMS44MjcsMC0zLjMwNS0xLjQ3OS0zLjMwNS0zLjMwNXYtMS4xMDZjMC0xLjgyLDEuNDc4LTMuMzAyLDMuMzA1LTMuMzAyDQoJCWg0NS43ODNjMS44MjMsMCwzLjMwMiwxLjQ4MSwzLjMwMiwzLjMwMlY4MS4zOTd6IE03Ni4xOTQsNjMuNzQ4YzAsMS44MjMtMS40NzksMy4zMDItMy4zMDIsMy4zMDJIMjcuMTA5DQoJCWMtMS44MjcsMC0zLjMwNS0xLjQ3OS0zLjMwNS0zLjMwMnYtMS4xMDZjMC0xLjgyNiwxLjQ3OC0zLjMwMiwzLjMwNS0zLjMwMmg0NS43ODNjMS44MjMsMCwzLjMwMiwxLjQ3NiwzLjMwMiwzLjMwMlY2My43NDh6DQoJCSBNNzYuMTk0LDQ2LjY5NmMwLDEuODI2LTEuNDc5LDMuMzA2LTMuMzAyLDMuMzA2SDQ2LjI3N2MtMS44MjEsMC0zLjMwMi0xLjQ3OS0zLjMwMi0zLjMwNnYtMS4xMDVjMC0xLjgyNSwxLjQ4MS0zLjMwMywzLjMwMi0zLjMwMw0KCQloMjYuNjE2YzEuODIzLDAsMy4zMDIsMS40NzgsMy4zMDIsMy4zMDNWNDYuNjk2eiIvPg0KPC9nPg0KPC9zdmc+DQo=); +} +#toolbar #toolbar-link-admin-help { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjMjMxRjIwIiBkPSJNMTAwLDUwYzAsMjcuNjE0LTIyLjM4Niw1MC01MC4wMDEsNTBDMjIuMzg1LDEwMCwwLDc3LjYxMywwLDUwDQoJQzAsMjIuMzg2LDIyLjM4NSwwLDQ5Ljk5OSwwQzc3LjYxNCwwLDEwMCwyMi4zODYsMTAwLDUweiBNNTUuMjA5LDY1LjQzNHYtMy4yNjhjMC0yLjE3NiwwLjQ2Mi0zLjkzOCwxLjM4OC01LjI3OQ0KCWMwLjkyNC0xLjM0LDMuMTMyLTMuMzAxLDYuNjE2LTUuODgxYzUuMDgyLTMuNjI1LDguNTIxLTYuODkyLDEwLjM0MS05Ljc5N2MxLjgxNC0yLjkwNSwyLjcyMS02LjM0OSwyLjcyMS0xMC4zNDINCgljMC01Ljk4Ny0yLjIwMy0xMC43NzgtNi42MTMtMTQuMzcyYy00LjQwOC0zLjU5MS0xMC4zNTItNS4zODktMTcuODI2LTUuMzg5Yy05LjA3MSwwLTE3LjY1OSwyLjI2Ni0yNS43NDgsNi44MDVsNS45MzMsMTEuOTIxDQoJYzYuOTY4LTMuNTU4LDEzLjE3My01LjMzNSwxOC42MTctNS4zMzVjMy4xMjIsMCw1LjU1MiwwLjYyMSw3LjI5MywxLjg1MmMxLjc0MiwxLjIzMSwyLjYxMywzLjAyOCwyLjYxMyw1LjM4OA0KCWMwLDIuMTAzLTAuNjA1LDQuMDA5LTEuODIzLDUuNzE2Yy0xLjIxOSwxLjcwOC0zLjcyOSwzLjkyLTcuNTM5LDYuNjQxYy0zLjk1NCwyLjkwNi02LjY3Niw1LjY0Mi04LjE2Niw4LjIxOQ0KCWMtMS40OTEsMi41NzgtMi4yMzEsNS42MDctMi4yMzEsOS4wOTJ2NC4wMjlINTUuMjA5eiBNNDEuNTQ0LDg4LjI3MWMxLjY2NywxLjYxMyw0LjAyOSwyLjQyMiw3LjA3OCwyLjQyMg0KCWMyLjk3MiwwLDUuMzAxLTAuODI0LDYuOTY4LTIuNDc3YzEuNjY1LTEuNjU2LDIuNTAzLTMuOTE0LDIuNTAzLTYuNzc3YzAtMi45NzUtMC44MjItNS4yNTgtMi40NzYtNi44NjENCgljLTEuNjU0LTEuNTk4LTMuOTgxLTIuMzk1LTYuOTk1LTIuMzk1Yy0zLjEyMywwLTUuNDk3LDAuNzgzLTcuMTMsMi4zNDJjLTEuNjM1LDEuNTU5LTIuNDQ5LDMuODYzLTIuNDQ5LDYuOTE0DQoJQzM5LjA0Miw4NC4zNzksMzkuODc4LDg2LjY1Niw0MS41NDQsODguMjcxeiIvPg0KPC9zdmc+DQo=); +} + +@media screen and (min-width:16.5em) { +/** + * Icons + * + * Hide icons from UAs that don't support media queries. They + * are not sophisticated enough for this enhancement. + */ + #toolbar .toolbar-bar .tab { + background-attachment: scroll; + background-position: 0.4545em center; + background-repeat: no-repeat; + background-size: 2em; + height: 3.3333em; + width: 3.3333em; + } + #toolbar #toolbar-actions .home a { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwb2x5Z29uIHBvaW50cz0iODIuMDAxLDQwLjU3NyA4Mi4wMDEsMTYuNzY4IDY4LDE2Ljc2OCA2OCwyNi4xOTQgNDkuOTk4LDcuNjk1IDAsNTkuMDcyIDEyLDU5LjA3MiAxMiw5Mi4zMDYgNDIuOTk2LDkyLjMwNiANCgk0Mi45OTYsNjUuMTE0IDU3LjAwMSw2NS4xMTQgNTcuMDAxLDkyLjMwNiA4Ny45OTUsOTIuMzA2IDg3Ljk5NSw1OS4wNzIgMTAwLDU5LjA3MiAiLz4NCjwvc3ZnPg0K); + } + #toolbar #toolbar-actions .toolbar-tray-toggle a { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxyZWN0IHk9IjM5LjkzNyIgZmlsbD0iIzIzMUYyMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxOS40ODUiLz4NCjxyZWN0IGZpbGw9IiMyMzFGMjAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMTkuNDg1Ii8+DQo8cmVjdCB5PSI4MC41MTYiIGZpbGw9IiMyMzFGMjAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMTkuNDg0Ii8+DQo8L3N2Zz4NCg==); + } + #toolbar #toolbar-user .account a { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMTAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjguNDI1LDI5LjM0N0MyOC40MjUsNDEuMzEsMzguMDc4LDUxLDQ5Ljk5OCw1MQ0KCWMxMS45MjYsMCwyMS41NzktOS42OSwyMS41NzktMjEuNjUzYzAtMTEuOTYyLTkuNjUyLTIxLjY1My0yMS41NzktMjEuNjUzQzM4LjA3OCw3LjY5MywyOC40MjUsMTcuMzg0LDI4LjQyNSwyOS4zNDd6IE0xMDAsOTIuMzA3DQoJYzAtMjAuMzQ2LTEuMTItMzUuNDIxLTUwLjAwMi0zNS40MjFDMS4xOTUsNTYuODg1LDAsNzEuMTkyLDAsOTIuMzA3SDEwMHoiLz4NCjwvc3ZnPg0K); + } +} + +#toolbar .toolbar-tray .level-1 > li > .box > a { + padding: 1em 2em 1em 2.75em; +} + +@media screen and (min-width:34em) { + #toolbar .toolbar-bar .tab { + padding: 1em 2em 1em 2.75em; + width: auto; + } +} +/* @end */ + +/* Shortcuts */ +#toolbar .toolbar-shortcuts { + padding-left: 0.40em; + padding-right: 0.40em; +} +#toolbar .toolbar-shortcuts .menu li { + display: block; + float: left; /* LTR */ + padding: 0 0.35em; + margin-bottom: 0.5em; +} +#toolbar .toolbar-shortcuts .menu a { + display: inline-block; +} +#toolbar .toolbar-shortcuts .menu a { + background-color: #DDDDDD; + border-radius: 0.4545em; + line-height: 1; + padding: 0.7857em 1em; +} +#toolbar #edit-shortcuts { + padding: 0.7857em 0.35em; +} + +/* Dropbutton */ + +#toolbar .section.second .dropbutton { + right: 100%; +} +#toolbar .section.second .dropbutton-widget { + right: -10em; + max-width: 10em; +} +#toolbar .section.second .dropbutton.open .dropbutton-widget { + max-width: none; +} +#toolbar .dropbutton-widget { + background-color: #4894DA; + border: 0; + font-size: inherit; +} +#toolbar .dropbutton-multiple .dropbutton-widget { + padding-right: 2em; +} +#toolbar .dropbutton-content a { + padding: 0.6667em 1em; + line-height: 1; +} +#toolbar .dropbutton .dropbutton-arrow { + border-bottom-width: 0; + border-left-width: 0.55em; + border-right-width: 0.55em; + border-top-width: 0.6em; + right: 7px; + top: 0.75em; +} +#toolbar .dropbutton.open .dropbutton-arrow { + border-bottom-width: 0.6em; + border-left-width: 0.55em; + border-right-width: 0.55em; + border-top-width: 0.05em; +} diff --git a/core/modules/toolbar/js/toolbar.js b/core/modules/toolbar/js/toolbar.js new file mode 100644 index 0000000..94afb90 --- /dev/null +++ b/core/modules/toolbar/js/toolbar.js @@ -0,0 +1,323 @@ +/** + * @file toolbar.js + * + * Defines the behavior of the Drupal administration toolbar. + */ +(function ($, undefined) { + +"use strict"; + +/** + * Attach toggling behavior and notify the overlay of the toolbar. + */ +Drupal.behaviors.toolbar = { + attach: function(context, settings) { + var $toolbar = $(context).find('#toolbar').once('toolbar'); + if ($toolbar.length) { + var $bar = $toolbar.find('.toolbar-bar'); + var $tray = $toolbar.find('.toolbar-tray'); + var $trigger = $toolbar.find('.toggle-tray'); + // Instanstiate the bar. + if ($bar.length) { + ToolBar.bar = new ToolBar($bar); + } + // Instantiate the tray. + if ($tray.length && $trigger.length) { + ToolBar.tray = new TraySlider($tray, $trigger); + } + } + } +}; +/** + * Store references to the ToolBar and TraySlider objects in the ToolBar object. + * + * These references will be available in Drupal.ToolBar.bar and + * Drupal.ToolBar.tray. + */ +$.extend(ToolBar, { + bar: null, + tray: null +}); +/** + * A toolbar is an administration action button container. + */ +function ToolBar ($toolbar) { + this.$toolbar = $toolbar; + // Recalculate the offset top on screen resize. + var setHeight = $.proxy(this, 'setHeight'); + // Use debounce if it exists. + setHeight = ('debounce' in Drupal) ? Drupal.debounce(setHeight, 250) : setHeight; + $(window) + .on({ + 'resize.toolbar': setHeight + }); + // Toolbar event handlers. + this.$toolbar + .on({ + 'setup.toolbar': setHeight + }) + .trigger('setup'); +}; + +/** + * Extend the prototype of the TraySlider class. + */ +$.extend(ToolBar.prototype, { + /** + * The height of the toolbar offsets the top of the page content. + * + * Page components can register with the offsettopchange event to know when + * the height of the toolbar changes. + */ + setHeight: function() { + this.height = this.$toolbar.outerHeight(); + this.$toolbar.attr('data-offset-top', this.height); + // Alter the padding on the top of the body element. + // @todo, this should be moved to drupal.js and register for + // the offsettopchange event. + $('body').css('paddingTop', this.height); + $(document).trigger('offsettopchange'); + } +}); +/** + * + */ +function TraySlider ($tray, $trigger) { + this.$tray = $tray; + this.$trigger = $trigger; + // Initiate the object. + this.state = 'closed'; + this.ui = { + 'activeClass': 'active', + 'trayOpenBodyClass': 'menu-tray-open' + }; + // Add a click handler to the toggle. + this.$trigger + .on({ + 'setup.toolbar': $.proxy(this, 'toggleTrigger'), + 'click.toolbar': $.proxy(this, 'handleTriggerClick'), + 'toggled.toolbar': $.proxy(this, 'toggleTrigger') + }) + .trigger('setup', this.state); + // The tray has a couple setup methods to run. + var setup = $.Callbacks(); + setup.add($.proxy(this, 'renderAccordion')); + setup.add($.proxy(this, 'displace')); + this.$tray + // Register event handlers. + .on({ + 'setup.toolbar': setup.fire, + 'toggled.toolbar': $.proxy(this, 'toggleTray') + }) + // The tray will be positioned at the edge of the window. + .addClass('positioned') + // Triger setup. + .trigger('setup', this.state); + // Register for offsettopchange events. + $(document) + .on({ + // Offset value vas changed by a third party script. + 'offsettopchange.toolbar': $.proxy(this, 'displace') + }); +}; +/** + * Extend the prototype of the TraySlider class. + */ +$.extend(TraySlider.prototype, { + /** + * + */ + handleTriggerClick: function (event) { + event.preventDefault(); + event.stopImmediatePropagation(); + this.state = (this.state === 'closed') ? 'open' : 'closed'; + this.$tray.trigger('toggled', this.state); + this.$trigger.trigger('toggled', this.state); + }, + /** + * + */ + toggleTrigger: function (event, state) { + this.$trigger[((state === 'open') ? 'add' : 'remove') + 'Class'](this.ui.activeClass); + }, + /** + * + */ + toggleTray: function (event, state) { + this.$tray[((state === 'open') ? 'add' : 'remove') + 'Class'](this.ui.activeClass); + // Add a class to the body so it can be styled to react to the tray. + $('body')[((state === 'open') ? 'add' : 'remove') + 'Class'](this.ui.trayOpenBodyClass); + }, + /** + * + */ + displace: function (event) { + this.$tray.css({ + 'top': this.computeOffsetTop() + 'px' + }); + }, + /** + * Sum all [data-offset-top] values and cache it. + * @todo move this out of tableheader.js into a move generic place like drupal.js. + */ + computeOffsetTop: function () { + var $offsets = $('[data-offset-top]'); + var value, sum = 0; + for (var i = 0, il = $offsets.length; i < il; i++) { + value = parseInt($offsets[i].getAttribute('data-offset-top'), 10); + sum += !isNaN(value) ? value : 0; + } + this.offsetTop = sum; + return sum; + }, + /** + * Accordion behavior. + */ + renderAccordion: function (event) { + event.stopPropagation(); + var context = this; + this.$tray.find('.toolbar-menu > .menu').each(function (index, element) { + var $root = $(this).addClass('root'); + // Wrap the list in a div to provide a positioning context. + var $wrapper = $root.wrap($('
') + .css({ + height: '100%', + position: 'relative' + }) + .addClass('fleximenu') + ) + .parent() + // Bind event handlers. + .on({ + 'setup.toolbar': context.accordionSetup + }); + // Create a set of list-manipulation callbacks. + // Called when items are added or removed. + var listUpdate = $.Callbacks(); + // Set visibility + listUpdate.add(context.initItems); + listUpdate.add($.proxy(context, 'markListLevels', $root)); + listUpdate.add($.proxy(context, 'setLevelVisibility', $root, 1)); + $wrapper + .on('listChange.toolbar', listUpdate.fire) + .on('clean.toolbar.accordionMode', 'li', context.cleanItem) + .on('activate.toolbar.accordionMode', 'li', context.activateItem) + .on('click.toolbar.accordionMode', '.handle', context.accordionToggle) + .trigger('setup'); + }); + }, + accordionSetup: function (event) { + event.stopPropagation(); + // Mark up the lists and items. + $(this) + .trigger('listChange'); + + }, + cleanItem: function (event) {}, + activateItem: function (event) {}, + accordionToggle: function (event) { + // The toggle. + var $toggle = $(this); + var $item = $toggle.closest('li'); + var $list = $item.children('ul'); + var isHidden = $list.hasClass('dormant'); + // Toggle the item open state. + $item + [((isHidden) ? 'add' : 'remove') + 'Class']('open'); + // Toggle the item list visibility. + $list + ['slide' + ((isHidden) ? 'Down' : 'Up')]() + [((isHidden) ? 'remove' : 'add') + 'Class']('dormant'); + // Twist the toggle. + $toggle + [((isHidden) ? 'add' : 'remove') + 'Class']('open'); + + }, + initItems: function (event) { + // The accordion wrapper. + var $wrapper = $(this); + var rootClass = 'root'; + var boxClass = 'box'; + var handleClass = 'handle'; + // Get lists and items. + var $root = $wrapper.children('.' + rootClass); + var $ul = $wrapper.find('ul').once('fleximenu'); + var $li = $wrapper.find('li').once('fleximenu'); + // Basic setup + $ul + .each(function (index, element) { + $(this).data('toolbar', { + processed: false, + type: 'list', + level: NaN + }); + }); + // Initialize items and their links. + $li + .each(function (index, element) { + $(this).data('toolbar', { + processed: false, + type: 'item' + }); + }) + // Add a class to item links. + .children('a') + .wrap( + $('
', { + 'class': boxClass + }) + ) + .end() + // Add a handle to each list item if it has a menu. + .each(function (index, element) { + var $item = $(this); + if ($item.children('ul').length > 0) { + $item + .children('.' + boxClass) + .prepend( + $('', { + 'class': handleClass, + text: '' + }) + ); + } + }); + }, + /** + * Adds a level class to each list based on its depth in the menu. + */ + markListLevels: function ($lists, level, event) { + level = (typeof level === 'object') ? 1 : level; + $lists + .addClass('level-' + level) + .each(function (index, element) { + $(this).data().toolbar.level = level; + }); + $lists = $lists.children('li').children('ul'); + if ($lists.length > 0) { + this.markListLevels($lists, (level + 1)); + } + }, + setLevelVisibility: function ($lists, visibleAfter) { + var level; + $lists + .each(function (index, element) { + var $this = $(this); + level = $(this).data().toolbar.level; + if (level > visibleAfter) { + $this.addClass('dormant'); + } + else { + $this.addClass('visible'); + } + }); + $lists = $lists.children('li').children('ul'); + if ($lists.length > 0) { + this.setLevelVisibility($lists, visibleAfter); + } + } +}); + +// Assign the ToolBar obect to the Drupal namespace. +Drupal.ToolBar = ToolBar; +}(jQuery)); diff --git a/core/modules/toolbar/templates/toolbar.tpl.php b/core/modules/toolbar/templates/toolbar.tpl.php index 5b03fee..8b8c4af 100644 --- a/core/modules/toolbar/templates/toolbar.tpl.php +++ b/core/modules/toolbar/templates/toolbar.tpl.php @@ -19,15 +19,33 @@ * @ingroup themeable */ ?> - +
+
+ +
+

+ +
+ + + + +
+
+
diff --git a/core/modules/toolbar/toolbar-rtl.css b/core/modules/toolbar/toolbar-rtl.css deleted file mode 100644 index e121547..0000000 --- a/core/modules/toolbar/toolbar-rtl.css +++ /dev/null @@ -1,37 +0,0 @@ - -#toolbar, -#toolbar * { - text-align: right; -} -#toolbar ul li { - float: right; -} -#toolbar ul li a { - display: inline-block; - float: none; - zoom: 1; -} -#toolbar div.toolbar-menu { - padding: 5px 50px 5px 50px; -} -#toolbar-user { - float: left; -} -#toolbar ul#toolbar-user li { - float: none; - display: inline; -} -#toolbar-menu { - float: none; -} -#toolbar-home { - float: right; -} -#toolbar ul li.home a { - position: absolute; - right: 10px; -} -#toolbar div.toolbar-menu a.toggle { - left: 10px; - right: auto; -} diff --git a/core/modules/toolbar/toolbar.css b/core/modules/toolbar/toolbar.css deleted file mode 100644 index bd18110..0000000 --- a/core/modules/toolbar/toolbar.css +++ /dev/null @@ -1,129 +0,0 @@ - -body.toolbar { - padding-top: 2.2em; -} -body.toolbar-drawer { - padding-top: 5.3em; -} - -/** - * Aggressive resets so we can achieve a consistent look in hostile CSS - * environments. - */ -#toolbar, -#toolbar * { - border: 0; - font-size: 100%; - line-height: inherit; - list-style: none; - margin: 0; - outline: 0; - padding: 0; - text-align: left; /* LTR */ - vertical-align: baseline; -} - -/** - * Base styles. - * - * We use a keyword for the toolbar font size to make it display consistently - * across different themes, while still allowing browsers to resize the text. - */ -#toolbar { - background: #666; - color: #ccc; - font: normal small "Lucida Grande", Verdana, sans-serif; - left: 0; - margin: 0 -20px; - padding: 0 20px; - position: fixed; - right: 0; - top: 0; - box-shadow: 0 3px 20px #000; - z-index: 600; -} -#toolbar div.collapsed { - display: none; - visibility: hidden; -} -#toolbar a { - color: #fff; - font-size: .846em; - text-decoration: none; -} -#toolbar ul li, -#toolbar ul li a { - float: left; /* LTR */ -} - -/** - * Administration menu. - */ -#toolbar div.toolbar-menu { - background: #000; - line-height: 20px; - padding: 5px 50px 5px 10px; /* LTR */ - position: relative; -} -#toolbar-home a span { - background: url(toolbar.png) no-repeat 0 -45px; - display: block; - height: 14px; - margin: 3px 0px; - text-indent: -9999px; - vertical-align: text-bottom; - width: 11px; -} -#toolbar-user { - float: right; /* LTR */ -} -#toolbar-menu { - float: left; /* LTR */ -} -#toolbar div.toolbar-menu a.toggle { - background: url(toolbar.png) 0 -20px no-repeat; - bottom: 0; - cursor: pointer; - height: 25px; - overflow: hidden; - position: absolute; - right: 10px; /* LTR */ - text-indent: -9999px; - width: 25px; -} -#toolbar div.toolbar-menu a.toggle:focus, -#toolbar div.toolbar-menu a.toggle:hover { - background-position: -50px -20px; -} -#toolbar div.toolbar-menu a.toggle-active { - background-position: -25px -20px; -} -#toolbar div.toolbar-menu a.toggle-active.toggle:focus, -#toolbar div.toolbar-menu a.toggle-active.toggle:hover { - background-position: -75px -20px; -} -#toolbar div.toolbar-menu ul li a { - padding: 0 10px; - border-radius: 10px; -} -#toolbar div.toolbar-menu ul li a:focus, -#toolbar div.toolbar-menu ul li a:hover, -#toolbar div.toolbar-menu ul li a:active, -#toolbar div.toolbar-menu ul li a.active:focus { - background: #444; -} -#toolbar div.toolbar-menu ul li a.active:hover, -#toolbar div.toolbar-menu ul li a.active:active, -#toolbar div.toolbar-menu ul li a.active, -#toolbar div.toolbar-menu ul li.active-trail a { - background: url(toolbar.png) 0 0 repeat-x; - text-shadow: #333 0 1px 0; -} - -/** - * Collapsed drawer of additional toolbar content. - */ -#toolbar div.toolbar-drawer { - position: relative; - padding: 0 10px; -} diff --git a/core/modules/toolbar/toolbar.js b/core/modules/toolbar/toolbar.js deleted file mode 100644 index 2353050..0000000 --- a/core/modules/toolbar/toolbar.js +++ /dev/null @@ -1,115 +0,0 @@ -(function ($) { - -"use strict"; - -Drupal.toolbar = Drupal.toolbar || {}; - -/** - * Attach toggling behavior and notify the overlay of the toolbar. - */ -Drupal.behaviors.toolbar = { - attach: function(context, settings) { - var $toolbar = $('#toolbar').once('toolbar'); - if ($toolbar.length) { - - // Set the initial state of the toolbar. - Drupal.toolbar.init(); - - $(window).on('resize.toolbar', Drupal.toolbar.height); - - // Toggling toolbar drawer. - $toolbar.find('a.toggle').once('toolbar-toggle').click(function(e) { - e.preventDefault(); - Drupal.toolbar.toggle(); - // Allow resize event handlers to recalculate sizes/positions. - $(window).triggerHandler('resize'); - }); - } - } -}; - -/** - * Retrieve last saved cookie settings and set up the initial toolbar state. - */ -Drupal.toolbar.init = function() { - // Retrieve the collapsed status from a stored cookie. - var collapsed = $.cookie('Drupal.toolbar.collapsed'); - - // Expand or collapse the toolbar based on the cookie value. - if (collapsed === '1') { - Drupal.toolbar.collapse(); - } - else { - Drupal.toolbar.expand(); - } -}; - -/** - * Collapse the toolbar. - */ -Drupal.toolbar.collapse = function() { - var toggle_text = Drupal.t('Show shortcuts'); - $('#toolbar div.toolbar-drawer').addClass('collapsed'); - $('#toolbar a.toggle') - .removeClass('toggle-active') - .attr('title', toggle_text) - .html(toggle_text); - $('body').removeClass('toolbar-drawer').css('paddingTop', Drupal.toolbar.height()); - $.cookie( - 'Drupal.toolbar.collapsed', - 1, - { - path: Drupal.settings.basePath, - // The cookie should "never" expire. - expires: 36500 - } - ); - Drupal.toolbar.height(); - $(document).trigger('offsettopchange'); -}; - -/** - * Expand the toolbar. - */ -Drupal.toolbar.expand = function() { - var toggle_text = Drupal.t('Hide shortcuts'); - $('#toolbar div.toolbar-drawer').removeClass('collapsed'); - $('#toolbar a.toggle') - .addClass('toggle-active') - .attr('title', toggle_text) - .html(toggle_text); - $('body').addClass('toolbar-drawer').css('paddingTop', Drupal.toolbar.height()); - $.cookie( - 'Drupal.toolbar.collapsed', - 0, - { - path: Drupal.settings.basePath, - // The cookie should "never" expire. - expires: 36500 - } - ); - Drupal.toolbar.height(); - $(document).trigger('offsettopchange'); -}; - -/** - * Toggle the toolbar. - */ -Drupal.toolbar.toggle = function() { - if ($('#toolbar div.toolbar-drawer').hasClass('collapsed')) { - Drupal.toolbar.expand(); - } - else { - Drupal.toolbar.collapse(); - } -}; - -Drupal.toolbar.height = function() { - // @TODO this needs to be cached outside this function. - var $toolbar = $('#toolbar'); - var height = $toolbar.outerHeight(); - $toolbar.attr('data-offset-top', height); - return height; -}; - -})(jQuery); diff --git a/core/modules/toolbar/toolbar.module b/core/modules/toolbar/toolbar.module index 3717d7b..f60a817 100644 --- a/core/modules/toolbar/toolbar.module +++ b/core/modules/toolbar/toolbar.module @@ -41,87 +41,18 @@ function toolbar_theme($existing, $type, $theme, $path) { 'render element' => 'toolbar', 'template' => 'toolbar', ); - $items['toolbar_toggle'] = array( - 'variables' => array( - 'collapsed' => NULL, - 'attributes' => array(), - ), - ); return $items; } /** - * Implements hook_menu(). - */ -function toolbar_menu() { - $items['toolbar/toggle'] = array( - 'title' => 'Toggle drawer visibility', - 'type' => MENU_CALLBACK, - 'page callback' => 'toolbar_toggle_page', - 'access arguments' => array('access toolbar'), - ); - return $items; -} - -/** - * Page callback: Toggles the visibility of the toolbar drawer. - * - * @see toolbar_menu(). - */ -function toolbar_toggle_page() { - global $base_path; - // Toggle the value in the cookie. - setcookie('Drupal.toolbar.collapsed', !_toolbar_is_collapsed(), NULL, $base_path); - // Redirect the user from where he used the toggle element. - drupal_goto(); -} - -/** - * Formats an element used to toggle the toolbar drawer's visibility. - * - * @param $variables - * An associative array containing: - * - collapsed: A boolean value representing the toolbar drawer's visibility. - * - attributes: An associative array of HTML attributes. - * - * @return - * An HTML string representing the element for toggling. - * - * @ingroup themable - */ -function theme_toolbar_toggle($variables) { - if ($variables['collapsed']) { - $toggle_text = t('Show shortcuts'); - } - else { - $toggle_text = t('Hide shortcuts'); - $variables['attributes']['class'][] = 'toggle-active'; - } - return l($toggle_text, 'toolbar/toggle', array('query' => drupal_get_destination(), 'attributes' => array('title' => $toggle_text) + $variables['attributes'])); -} - -/** - * Determines the current state of the toolbar drawer's visibility. - * - * @return - * TRUE when drawer is collapsed, FALSE when it is expanded. - */ -function _toolbar_is_collapsed() { - // PHP converts dots into underscores in cookie names to avoid problems with - // its parser, so we use a converted cookie name. - return isset($_COOKIE['Drupal_toolbar_collapsed']) ? $_COOKIE['Drupal_toolbar_collapsed'] : 0; -} - -/** * Implements hook_page_build(). * - * Add admin toolbar to the page_top region automatically. + * Add admin toolbar to the page_bottom region automatically. */ function toolbar_page_build(&$page) { - $page['page_top']['toolbar'] = array( + $page['page_bottom']['toolbar'] = array( '#pre_render' => array('toolbar_pre_render'), '#access' => user_access('access toolbar'), - 'toolbar_drawer' => array(), ); } @@ -144,11 +75,8 @@ function toolbar_pre_render($toolbar) { * Add some page classes, so global page theming can adjust to the toolbar. */ function toolbar_preprocess_html(&$vars) { - if (isset($vars['page']['page_top']['toolbar']) && user_access('access toolbar')) { + if (isset($vars['page']['page_bottom']['toolbar']) && user_access('access toolbar')) { $vars['attributes']['class'][] = 'toolbar'; - if (!_toolbar_is_collapsed()) { - $vars['attributes']['class'][] = 'toolbar-drawer'; - } } } @@ -165,7 +93,7 @@ function toolbar_preprocess_toolbar(&$variables) { /** * Implements hook_system_info_alter(). * - * Indicate that the 'page_top' region (in which the toolbar will be displayed) + * Indicate that the 'page_bottom' region (in which the toolbar will be displayed) * is an overlay supplemental region that should be refreshed whenever its * content is updated. * @@ -174,7 +102,7 @@ function toolbar_preprocess_toolbar(&$variables) { */ function toolbar_system_info_alter(&$info, $file, $type) { if ($type == 'theme') { - $info['overlay_supplemental_regions'][] = 'page_top'; + $info['overlay_supplemental_regions'][] = 'page_bottom'; } } @@ -196,15 +124,6 @@ function toolbar_view() { ), ); - // Retrieve the admin menu from the database. - $links = toolbar_menu_navigation_links(toolbar_get_menu_tree()); - $build['toolbar_menu'] = array( - '#theme' => 'links__toolbar_menu', - '#links' => $links, - '#attributes' => array('id' => 'toolbar-menu'), - '#heading' => array('text' => t('Administrative toolbar'), 'level' => 'h2', 'class' => 'element-invisible'), - ); - // Add logout & user account links or login link. if ($user->uid) { $links = array( @@ -212,11 +131,17 @@ function toolbar_view() { 'title' => t('Hello @username', array('@username' => user_format_name($user))), 'href' => 'user', 'html' => TRUE, - 'attributes' => array('title' => t('User account')), + 'attributes' => array( + 'title' => t('User account'), + 'class' => array('tab'), + ), ), 'logout' => array( 'title' => t('Log out'), 'href' => 'user/logout', + 'attributes' => array( + 'class' => array('tab'), + ), ), ); } @@ -225,47 +150,64 @@ function toolbar_view() { 'login' => array( 'title' => t('Log in'), 'href' => 'user', + 'attributes' => array( + 'class' => array('tab'), + ), ), ); } + // Theme the toolbar user action links. $build['toolbar_user'] = array( '#theme' => 'links__toolbar_user', '#links' => $links, - '#attributes' => array('id' => 'toolbar-user'), + '#attributes' => array( + 'id' => 'toolbar-user', + 'class' => array('menu'), + ), + '#heading' => array('text' => t('Toolbar user actions'), 'level' => 'h2', 'class' => 'element-invisible'), ); - // Add a "home" link. - $link = array( + // Build the default toolbar navigation links. + $links = array( + 'toolbar_tray_toggle' => array( + 'title' => t('Menu'), + 'href' => '', + 'html' => FALSE, + 'attributes' => array( + 'class' => array('tab', 'toggle', 'toggle-tray'), + 'role' => 'button', + ), + ), 'home' => array( - 'title' => 'Home', + 'title' => t('Home'), 'href' => '', - 'html' => TRUE, - 'attributes' => array('title' => t('Home')), + 'html' => FALSE, + 'attributes' => array( + 'title' => t('Home'), + 'class' => array('tab', 'home-link'), + ), ), ); - $build['toolbar_home'] = array( + + // Toolbar navigation links. + $build['toolbar_navigation'] = array( '#theme' => 'links', - '#links' => $link, - '#attributes' => array('id' => 'toolbar-home'), + '#links' => $links, + '#attributes' => array( + 'id' => 'toolbar-actions', + 'class' => array('menu'), + ), + '#heading' => array('text' => t('Toolbar navigation'), 'level' => 'h2', 'class' => 'element-invisible'), ); - // Add an anchor to be able to toggle the visibility of the drawer. - $build['toolbar_toggle'] = array( - '#theme' => 'toolbar_toggle', - '#collapsed' => _toolbar_is_collapsed(), - '#attributes' => array('class' => array('toggle')), - ); + // Retrieve the admin menu from the database. + $tree = toolbar_get_menu_tree(); + // Add attributes to the links before rendering. + toolbar_menu_navigation_links($tree); + $build['toolbar_menu'] = menu_tree_output($tree); - // Prepare the drawer links CSS classes. - $toolbar_drawer_classes = array( - 'toolbar-drawer', - 'clearfix', - ); - if (_toolbar_is_collapsed()) { - $toolbar_drawer_classes[] = 'collapsed'; - } - $build['toolbar_drawer']['#type'] = 'container'; - $build['toolbar_drawer']['#attributes']['class'] = $toolbar_drawer_classes; + // Shortcuts. + $build['toolbar_shortcuts'] = array(); return $build; } @@ -280,14 +222,13 @@ function toolbar_get_menu_tree() { $tree = array(); $admin_link = db_query('SELECT * FROM {menu_links} WHERE menu_name = :menu_name AND module = :module AND link_path = :path', array(':menu_name' => 'management', ':module' => 'system', ':path' => 'admin'))->fetchAssoc(); if ($admin_link) { - $tree = menu_build_tree('management', array( - 'expanded' => array($admin_link['mlid']), - 'min_depth' => $admin_link['depth'] + 1, - 'max_depth' => $admin_link['depth'] + 1, - )); + $tree = menu_tree_all_data('management'); } - - return $tree; + // Return the sub-menus of the management menu root. + foreach ($tree as $key => $menu) { + return (!empty($tree[$key]['below'])) ? $tree[$key]['below'] : array(); + } + return array(); } /** @@ -299,34 +240,16 @@ function toolbar_get_menu_tree() { * @return * An array of links as defined above. */ -function toolbar_menu_navigation_links($tree) { - $links = array(); - foreach ($tree as $item) { - if (!$item['link']['hidden'] && $item['link']['access']) { - // Make sure we have a path specific ID in place, so we can attach icons - // and behaviors to the items. - $id = str_replace(array('/', '<', '>'), array('-', '', ''), $item['link']['href']); - - $link = $item['link']['localized_options']; - $link['href'] = $item['link']['href']; - // Add icon placeholder. - $link['title'] = '' . check_plain($item['link']['title']); - // Add admin link ID. - $link['attributes'] = array('id' => 'toolbar-link-' . $id); - if (!empty($item['link']['description'])) { - $link['title'] .= ' (' . $item['link']['description'] . ')'; - $link['attributes']['title'] = $item['link']['description']; - } - $link['html'] = TRUE; - - $class = ' path-' . $id; - if (toolbar_in_active_trail($item['link']['href'])) { - $class .= ' active-trail'; - } - $links['menu-' . $item['link']['mlid'] . $class] = $link; +function toolbar_menu_navigation_links(&$tree) { + foreach ($tree as $key => $item) { + // Configure sub-items. + if (!empty($item['below'])) { + toolbar_menu_navigation_links($tree[$key]['below']); } + // Make sure we have a path specific ID in place, so we can attach icons + // and behaviors to the items. + $tree[$key]['link']['localized_options']['attributes']['id'] = 'toolbar-link-' . str_replace(array('/', '<', '>'), array('-', '', ''), $item['link']['link_path']); } - return $links; } /** @@ -365,10 +288,11 @@ function toolbar_library_info() { 'title' => 'Toolbar', 'version' => VERSION, 'js' => array( - drupal_get_path('module', 'toolbar') . '/toolbar.js' => array(), + drupal_get_path('module', 'toolbar') . '/js/toolbar.js' => array(), ), 'css' => array( - drupal_get_path('module', 'toolbar') . '/toolbar.css', + drupal_get_path('module', 'toolbar') . '/css/toolbar.base.css', + drupal_get_path('module', 'toolbar') . '/css/toolbar.theme.css', ), 'dependencies' => array( array('system', 'jquery'), diff --git a/core/modules/toolbar/toolbar.png b/core/modules/toolbar/toolbar.png deleted file mode 100644 index f2c7f35..0000000 --- a/core/modules/toolbar/toolbar.png +++ /dev/null @@ -1,4 +0,0 @@ -PNG - - IHDRd9,~OPLTEfffffffffffffff===>>>GGGHHHPPPQQQXXXfffstRNSO^zIDATx[O@o -VK71i}.f.Ifbd`pg01\. \ԌP`MRhUl DB(gŰ8!+2VL,Z$MNY16:V,fKzANJZ?6 se]OԍI_"[Wߺ, }8D !yP,G9BUĩ%W'X"_U!N<*"IENDB` \ No newline at end of file