diff --git a/core/includes/menu.inc b/core/includes/menu.inc
index 88dc5b8..07a737b 100644
--- a/core/includes/menu.inc
+++ b/core/includes/menu.inc
@@ -2359,6 +2359,28 @@ function menu_local_tabs() {
}
/**
+ * Returns a renderable element for the primary tabs.
+ */
+function menu_local_primary_tabs() {
+ $build = array(
+ '#theme' => 'menu_local_tasks',
+ '#primary' => menu_primary_local_tasks(),
+ );
+ return !empty($build['#primary']) || !empty($build['#secondary']) ? $build : array();
+}
+
+/**
+ * Returns a renderable element for the secondary tabs.
+ */
+function menu_local_secondary_tabs() {
+ $build = array(
+ '#theme' => 'menu_local_tasks',
+ '#secondary' => menu_secondary_local_tasks(),
+ );
+ return !empty($build['#primary']) || !empty($build['#secondary']) ? $build : array();
+}
+
+/**
* Returns HTML for primary and secondary local tasks.
*
* @param $variables
diff --git a/core/misc/icons/0074bd/chevron-left.png b/core/misc/icons/0074bd/chevron-left.png
new file mode 100644
index 0000000..e42435d
--- /dev/null
+++ b/core/misc/icons/0074bd/chevron-left.png
@@ -0,0 +1,3 @@
+PNG
+
+
IHDR a EIDATxݓ ɑ28d |5p#鑔'A,ɂ,pnr/?zG IENDB`
\ No newline at end of file
diff --git a/core/misc/icons/0074bd/chevron-left.svg b/core/misc/icons/0074bd/chevron-left.svg
new file mode 100644
index 0000000..122e1c0
--- /dev/null
+++ b/core/misc/icons/0074bd/chevron-left.svg
@@ -0,0 +1 @@
+
diff --git a/core/misc/icons/0074bd/chevron-right.png b/core/misc/icons/0074bd/chevron-right.png
new file mode 100644
index 0000000..e2ff9a9
--- /dev/null
+++ b/core/misc/icons/0074bd/chevron-right.png
@@ -0,0 +1,3 @@
+PNG
+
+
IHDR a FIDATxݓ C;#eqh~PNi1vtGB-#)@`;^zG IENDB`
\ No newline at end of file
diff --git a/core/misc/icons/0074bd/chevron-right.svg b/core/misc/icons/0074bd/chevron-right.svg
new file mode 100644
index 0000000..b16a8ce
--- /dev/null
+++ b/core/misc/icons/0074bd/chevron-right.svg
@@ -0,0 +1 @@
+
diff --git a/core/misc/jquery.collapse.js b/core/misc/jquery.collapse.js
new file mode 100644
index 0000000..5a21a66
--- /dev/null
+++ b/core/misc/jquery.collapse.js
@@ -0,0 +1,98 @@
+/**
+ * @file
+ */
+
+;( function( $, window, document, undefined ) {
+ 'use strict';
+
+ var pluginName = 'collapse';
+ var defaults = {
+ target: false,
+ trigger: false,
+ initState: 'closed'
+ };
+
+ function Collapse( element, options ) {
+ this.options = $.extend( {}, defaults, options );
+ this.element = element;
+ this.$element = $(element);
+ this.$target = null;
+ this.$trigger = null;
+
+ this._defaults = defaults;
+ this._name = pluginName;
+
+ this.init();
+ }
+
+ Collapse.prototype.init = function() {
+ var self = this;
+ var opts = self.options;
+
+ if (opts.target) {
+ if ( opts.target.jquery ) {
+ this.$target = opts.target;
+ } else {
+ this.$target = this.$element.withinOrUnique(opts.target);
+ }
+ }
+
+ if (opts.trigger) {
+ if ( opts.trigger.jquery ) {
+ this.$trigger = opts.trigger;
+ } else {
+ this.$trigger = this.$element.withinOrUnique(opts.trigger);
+ }
+ } else {
+ this.$trigger = this.$element;
+ }
+
+ this.refresh();
+
+ if (this.options.initState !== 'closed') {
+ this.$target.addClass('is-open');
+ }
+
+ this.$trigger.on('click', function(event) {
+ self.toggle(event);
+ });
+
+ this.$element.on('transitionend webkitTransitionEnd', function() {
+ if ( self.$target.hasClass('is-closing') ) {
+ self.$target.removeClass('is-closing is-open');
+ self.$target[0].style.removeProperty('max-height');
+ }
+ });
+ };
+
+ Collapse.prototype.refresh = function() {
+ this.$target.data( 'intrinsicHeight', this.$target.intrinsic('height') + 'px' );
+ };
+
+ Collapse.prototype.toggle = function(event) {
+ event.preventDefault();
+
+ if ( this.$target.hasClass('is-open') ) {
+ if ( Modernizr.csstransitions ) {
+ this.$target.css('max-height', '0').addClass('is-closing');
+ }
+ else {
+ this.$target.removeClass('is-open');
+ }
+ } else {
+ if ( Modernizr.csstransitions ) {
+ this.$target.css( 'max-height', this.$target.data('intrinsicHeight') );
+ }
+ this.$target.addClass('is-open');
+ }
+ };
+
+ $.fn[pluginName] = function( options ) {
+ return this.each( function() {
+ if ( ! $.data(this, 'plugin_' + pluginName) ) {
+ $.data( this, 'plugin_' + pluginName, new Collapse(this, options) );
+ }
+ });
+ };
+
+})( jQuery, window, document );
diff --git a/core/misc/jquery.dom-utils.js b/core/misc/jquery.dom-utils.js
new file mode 100644
index 0000000..641006b
--- /dev/null
+++ b/core/misc/jquery.dom-utils.js
@@ -0,0 +1,59 @@
+/**
+ * @file
+ * Lowish-level DOM utilities for UI components
+ */
+;( function( $, w, undefined ) {
+ 'use strict';
+
+ // Find a given selector only within the current scope, except ids, which
+ // are found anywhere.
+ $.fn.withinOrUnique = function(selector) {
+ if ( selector.charAt(0) === '#' ) {
+ return $(selector);
+ } else {
+ return this.find(selector);
+ }
+ };
+
+ $.extend({
+ kebabCase: function(string) {
+ return string.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
+ },
+
+ safeTrim: function(object) {
+ if (typeof object === 'string') {
+ return $.trim(object);
+ }
+ return object;
+ }
+ });
+
+ // Parse options passed via data-attribute component initialization and
+ // turn them into an object.
+ $.fn.dataOptions = function(pluginName, namespace) {
+ var options = {};
+ var optPair;
+ var key;
+ var value;
+ var dataPrefix = 'data-' + ( typeof namespace === 'string' ? namespace + '-' : '' );
+ var optionsArray = ($(this).attr(dataPrefix + $.kebabCase(pluginName)) || ':').split(';');
+
+ // parse options
+ for (var i = optionsArray.length - 1; i >= 0; i--) {
+ optPair = optionsArray[i].split(':');
+ key = optPair[0];
+ value = optPair[1];
+
+ if (/true/i.test(value)) { value = true; }
+ if (/false/i.test(value)) { value = false; }
+ if ($.isNumeric(value)) { value = parseFloat(value); }
+
+ if (optPair.length === 2 && key.length > 0) {
+ options[$.safeTrim(key)] = $.safeTrim(value);
+ }
+ }
+
+ return options;
+ };
+
+})( jQuery, window );
diff --git a/core/misc/jquery.intrinsic.js b/core/misc/jquery.intrinsic.js
new file mode 100644
index 0000000..d803652
--- /dev/null
+++ b/core/misc/jquery.intrinsic.js
@@ -0,0 +1,51 @@
+/**
+ * @file
+ * Measure an element’s intrinsic width or height when neither constrained by
+ * a container nor forced full width as in 'display: block'.
+ */
+;( function( $, document, undefined ) {
+ 'use strict';
+
+ // Style block applied momentarily in order to measure the element.
+ //
+ // 1. Shrink-wrap the element. Block display would give us the width of the
+ // container, not the element’s intrinsic width.
+ // 2. Preventative measure. The styles should be reverted before the browser’s
+ // UI thread updates.
+ //
+ // We avoid 'position: absolute' because this causes the element to wrap if
+ // it’s wider than the viewport, regardless of the width of and .
+ //
+ var tempElementCSS = {
+ display: 'table', /* 1 */
+ visibility: 'hidden', /* 2 */
+ width: 'auto',
+ height: 'auto',
+ maxWidth: 'none',
+ maxHeight: 'none'
+ };
+
+ // Style block applied momentarily to the body in order to ensure the
+ // element’s layout area isn’t constrained.
+ //
+ var tempBodyCSS = {
+ width: '999em',
+ height: '999em'
+ };
+
+ $.fn.intrinsic = function(dimension) {
+ // The measured element may be a plain object or jQuery.
+ var element = this instanceof jQuery ? this[0] : this;
+ var measurement;
+
+ // Use jQuery’s internal swap() method to temporarily apply the styles, then
+ // measure the element’s width() or height().
+ $.swap( document.body, tempBodyCSS, function() {
+ $.swap( element, tempElementCSS, function() {
+ measurement = $(element)[dimension]();
+ });
+ });
+
+ return measurement;
+ };
+})( jQuery, document );
diff --git a/core/misc/jquery.nav-tabs.js b/core/misc/jquery.nav-tabs.js
new file mode 100644
index 0000000..9d0f21d
--- /dev/null
+++ b/core/misc/jquery.nav-tabs.js
@@ -0,0 +1,70 @@
+/**
+ * @file
+ */
+
+;( function( $, window, document, undefined ) {
+ 'use strict';
+
+ var pluginName = 'navTabs';
+ var defaults = {
+ target: '.js-nav-tabs__target',
+ trigger: '.js-nav-tabs__trigger',
+ collapsible: false
+ };
+
+ function NavTabs( element, dataOptions, options ) {
+ this.options = $.extend( {}, defaults, dataOptions, options );
+ this.element = element;
+ this.$element = $(element);
+
+ this._defaults = defaults;
+ this._name = pluginName;
+
+ this.init();
+ }
+
+ NavTabs.prototype.init = function() {
+
+ if (this.options.collapsible) {
+ this.$element.collapse({
+ target: this.options.target,
+ trigger: this.options.trigger
+ });
+ this.$element.addClass('is-collapse-enabled');
+ }
+
+ $(window).on('resize.navTabs', $.proxy(this, 'refresh'));
+
+ this.$element.addClass('position-container is-horizontal-enabled');
+ this.refreshAll();
+ };
+
+ NavTabs.prototype.refreshAll = function() {
+ this.intrinsicWidth = this.$element.addClass('is-horizontal').intrinsic('width');
+ this.$element.removeClass('is-horizontal');
+ this.refresh();
+ };
+
+ NavTabs.prototype.refresh = function() {
+ if ( this.$element.parent().width() > this.intrinsicWidth ) {
+ this.$element.addClass('is-horizontal');
+ } else {
+ this.$element.removeClass('is-horizontal');
+ }
+ };
+
+ NavTabs.prototype.destroy = function() {
+ window.off('resize.navTabs');
+ this.removeData('plugin_' + pluginName);
+ };
+
+ $.fn[pluginName] = function( options ) {
+ return this.each( function() {
+ if ( ! $.data(this, 'plugin_' + pluginName) ) {
+ var dataOptions = $(this).dataOptions(pluginName, 'drupal');
+ $.data( this, 'plugin_' + pluginName, new NavTabs(this, dataOptions, options) );
+ }
+ });
+ };
+
+})( jQuery, window, document );
diff --git a/core/modules/shortcut/css/shortcut.icons.css b/core/modules/shortcut/css/shortcut.icons.css
index d7f5970..d356696 100644
--- a/core/modules/shortcut/css/shortcut.icons.css
+++ b/core/modules/shortcut/css/shortcut.icons.css
@@ -25,42 +25,29 @@
* Add/remove links.
*/
.add-or-remove-shortcuts .icon {
- background: transparent url("../images/shortcut-add.png") no-repeat;
- height: 12px;
- margin-left: 8px; /* LTR */
- overflow: hidden;
- text-indent: 12px;
- width: 12px;
+ background: transparent url('../images/favstar.svg') no-repeat left top;
+ width: 20px;
+ height: 20px;
+ vertical-align: text-bottom;
+ text-indent: -999em;
}
.no-svg .add-or-remove-shortcuts .icon {
- background: transparent url("../images/shortcut-add.png") no-repeat;
+ background-image: url('../images/favstar.png');
}
-[dir="rtl"] .add-or-remove-shortcuts .icon {
- margin-left: 0;
- margin-right: 8px;
-}
-[dir="rtl"] .add-or-remove-shortcuts .text {
- padding: 0 10px 0 6px;
-}
-[dir="rtl"] .add-or-remove-shortcuts a:focus .text,
-[dir="rtl"] .add-or-remove-shortcuts a:hover .text {
- border-radius: 5px 0 0 5px;
-}
-.add-shortcut a:focus .icon,
-.add-shortcut a:hover .icon {
- background-position: 0 -12px; /* LTR */
+.add-shortcut a:hover .icon,
+.add-shortcut a:focus .icon {
+ background-position: -20px top;
}
[dir="rtl"] .add-shortcut a:focus .icon,
[dir="rtl"] .add-shortcut a:hover .icon {
background-position: 0 -24px;
}
.remove-shortcut .icon {
- margin-top: 4px;
- background-position: -12px 0;
+ background-position: -40px top;
}
.remove-shortcut a:focus .icon,
.remove-shortcut a:hover .icon {
- background-position: -12px -12px; /* LTR */
+ background-position: -60px top; /* LTR */
}
[dir="rtl"] .remove-shortcut a:focus .icon,
[dir="rtl"] .remove-shortcut a:hover .icon {
diff --git a/core/modules/shortcut/css/shortcut.module.css b/core/modules/shortcut/css/shortcut.module.css
index 05672e9..9ec5829 100644
--- a/core/modules/shortcut/css/shortcut.module.css
+++ b/core/modules/shortcut/css/shortcut.module.css
@@ -7,13 +7,11 @@
* Add/remove links.
*/
.add-or-remove-shortcuts .icon {
- display: block;
- float: left; /* LTR */
+ display: inline-block;
margin-top: 5px;
}
.add-or-remove-shortcuts .text {
display: none;
- float: left; /* LTR */
padding-top: 2px;
}
[dir="rtl"] .add-or-remove-shortcuts .icon,
diff --git a/core/modules/shortcut/css/shortcut.theme.css b/core/modules/shortcut/css/shortcut.theme.css
index 018f328..3d29110 100644
--- a/core/modules/shortcut/css/shortcut.theme.css
+++ b/core/modules/shortcut/css/shortcut.theme.css
@@ -19,3 +19,12 @@
[dir="rtl"] .toolbar .toolbar-tray-horizontal .edit-shortcuts {
float: right;
}
+
+/**
+ * Add/remove links.
+ */
+.add-or-remove-shortcuts {
+ display: inline-block;
+ margin-left: 0.3em;
+}
+
diff --git a/core/modules/shortcut/images/favstar.png b/core/modules/shortcut/images/favstar.png
new file mode 100755
index 0000000..bd51fde
--- /dev/null
+++ b/core/modules/shortcut/images/favstar.png
@@ -0,0 +1,8 @@
+PNG
+
+
IHDR P غ IDATXGXkPSG{@X"tF?RG೭'QecSZz[!Z:(@m%Gl"vFhA^{{21$&Ow&ݳߞ
b 㚝(&ܩ<~N#`lZF6AuL$p,nGz88xDTiƆDn##m/ 7L\x*dqV@!@j694orM&O^6.ji#ҧ*dfZ[_JbP34O)y$6'ڲ#M9pOwGg,ndx0*ɍ#'P6{}2U'ӦpaZKlRد
+f5I1U5E6kmk3#Ï>G5?ԜМVPJ( e18s,JDneU䕱m$S1qg8 /EfGG-6k{ Ww$xP