diff --git a/core/misc/icons/545560/ex.svg b/core/misc/icons/545560/ex.svg
new file mode 100644
index 0000000000..bef63c1022
--- /dev/null
+++ b/core/misc/icons/545560/ex.svg
@@ -0,0 +1 @@
+
diff --git a/core/misc/icons/545560/pencil.svg b/core/misc/icons/545560/pencil.svg
new file mode 100644
index 0000000000..2808993ddf
--- /dev/null
+++ b/core/misc/icons/545560/pencil.svg
@@ -0,0 +1 @@
+
diff --git a/core/themes/claro/claro.libraries.yml b/core/themes/claro/claro.libraries.yml
index d4fbca8419..f809f6cc82 100644
--- a/core/themes/claro/claro.libraries.yml
+++ b/core/themes/claro/claro.libraries.yml
@@ -185,6 +185,12 @@ checkbox:
js/checkbox.js: {}
dependencies:
- core/drupal
+ -
+icon-link:
+ version: VERSION
+ css:
+ component:
+ css/components/icon-link.css: {}
dropbutton:
version: VERSION
@@ -258,6 +264,8 @@ media_library.theme:
css:
theme:
css/theme/media-library.css: {}
+ dependencies:
+ - claro/icon-link
media_library.ui:
version: VERSION
diff --git a/core/themes/claro/claro.theme b/core/themes/claro/claro.theme
index 5d735acb6b..00d7ba624a 100644
--- a/core/themes/claro/claro.theme
+++ b/core/themes/claro/claro.theme
@@ -639,7 +639,7 @@ function claro_views_ui_display_tab_alter(&$element) {
}
/**
- * Implements hook_preprocess_HOOK for views_exposed_form.
+ * Implements hook_preprocess_HOOK() for views_exposed_form.
*/
function claro_preprocess_views_exposed_form(&$variables) {
$form = &$variables['form'];
@@ -1263,7 +1263,10 @@ function claro_form_media_library_add_form_alter(array &$form, FormStateInterfac
*/
function claro_form_media_library_add_form_upload_alter(array &$form, FormStateInterface $form_state) {
$form['#attributes']['class'][] = 'media-library-add-form--upload';
-
+ if (isset($form['container']['upload'])) {
+ // Set this flag so we can remove the details element.
+ $form['container']['upload']['#media_library_upload'] = TRUE;
+ }
if (isset($form['container'])) {
$form['container']['#attributes']['class'][] = 'media-library-add-form__input-wrapper';
}
@@ -1291,15 +1294,21 @@ function claro_form_media_library_add_form_oembed_alter(array &$form, FormStateI
* they are saved.
*/
function claro_preprocess_item_list__media_library_add_form_media_list(array &$variables) {
+ $variables['attributes']['class'][] = 'form--small';
+
foreach ($variables['items'] as &$item) {
$item['value']['preview']['#attributes']['class'][] = 'media-library-add-form__preview';
$item['value']['fields']['#attributes']['class'][] = 'media-library-add-form__fields';
- $item['value']['remove_button']['#attributes']['class'][] = 'media-library-add-form__remove-button';
+ $item['value']['remove_button']['#attributes']['class'][] = 'media-library-add-form__remove-button button--extrasmall';
// #source_field_name is set by AddFormBase::buildEntityFormElement()
// to help themes and form_alter hooks identify the source field.
$fields = &$item['value']['fields'];
$source_field_name = $fields['#source_field_name'];
+
+ // Set this flag so we can remove the details element.
+ $fields[$source_field_name]['widget'][0]['#media_library_upload'] = TRUE;
+
if (isset($fields[$source_field_name])) {
$fields[$source_field_name]['#attributes']['class'][] = 'media-library-add-form__source-field';
}
@@ -1312,7 +1321,7 @@ function claro_preprocess_item_list__media_library_add_form_media_list(array &$v
* This targets each media item selected in an entity reference field.
*/
function claro_preprocess_media_library_item__widget(array &$variables) {
- $variables['content']['remove_button']['#attributes']['class'][] = 'media-library-item__remove';
+ $variables['content']['remove_button']['#attributes']['class'][] = 'media-library-item__remove icon-link';
}
/**
@@ -1333,6 +1342,9 @@ function claro_preprocess_media_library_item__small(array &$variables) {
*/
function claro_preprocess_fieldset__media_library_widget(array &$variables) {
if (isset($variables['prefix']['weight_toggle'])) {
+ $variables['prefix']['weight_toggle']['#attributes']['class'][] = 'action-link';
+ $variables['prefix']['weight_toggle']['#attributes']['class'][] = 'action-link--extrasmall';
+ $variables['prefix']['weight_toggle']['#attributes']['class'][] = 'action-link--icon-show';
$variables['prefix']['weight_toggle']['#attributes']['class'][] = 'media-library-widget__toggle-weight';
}
if (isset($variables['suffix']['open_button'])) {
@@ -1367,10 +1379,10 @@ function claro_views_pre_render(ViewExecutable $view) {
$add_classes($view->field['rendered_entity']->options['element_class'], ['media-library-item__content']);
}
if (array_key_exists('edit_media', $view->field)) {
- $add_classes($view->field['edit_media']->options['alter']['link_class'], ['media-library-item__edit']);
+ $add_classes($view->field['edit_media']->options['alter']['link_class'], ['media-library-item__edit icon-link']);
}
if (array_key_exists('delete_media', $view->field)) {
- $add_classes($view->field['delete_media']->options['alter']['link_class'], ['media-library-item__remove']);
+ $add_classes($view->field['delete_media']->options['alter']['link_class'], ['media-library-item__remove icon-link']);
}
}
elseif (strpos($view->current_display, 'widget') === 0) {
@@ -1402,6 +1414,9 @@ function claro_views_pre_render(ViewExecutable $view) {
*/
function claro_preprocess_links__media_library_menu(array &$variables) {
foreach ($variables['links'] as &$link) {
+ // Add a class to the Media Library menu items.
+ $link['attributes']->addClass('media-library-menu__item');
+
// This conditional exists because the media-library-menu__link class is
// currently added by Classy, but Claro will eventually not use Classy as a
// base theme.
diff --git a/core/themes/claro/css/base/variables.css b/core/themes/claro/css/base/variables.css
index 69dc17481c..7040f564a9 100644
--- a/core/themes/claro/css/base/variables.css
+++ b/core/themes/claro/css/base/variables.css
@@ -49,4 +49,8 @@
/**
* Breadcrumb.
*/
+
+ /**
+ * Vertical Tabs.
+ */
}
diff --git a/core/themes/claro/css/base/variables.pcss.css b/core/themes/claro/css/base/variables.pcss.css
index c0987bb801..3fa8e3c6d2 100644
--- a/core/themes/claro/css/base/variables.pcss.css
+++ b/core/themes/claro/css/base/variables.pcss.css
@@ -196,4 +196,22 @@
* Breadcrumb.
*/
--breadcrumb-height: 1.25rem;
+
+ /**
+ * Vertical Tabs.
+ */
+ --vertical-tabs-margin-vertical: var(--space-s);
+ --vertical-tabs-border-radius: var(--details-accordion-border-size-radius);
+ --vertical-tabs-shadow: var(--details-box-shadow);
+ --vertical-tabs-border-color: var(--details-border-color);
+ --vertical-tabs-border-size: 1px;
+ --vertical-tabs-border: var(--vertical-tabs-border-size) solid var(--vertical-tabs-border-color);
+ --vertical-tabs-menu-item-shadow-extraspace: 0.5rem;
+ --vertical-tabs-menu-separator-color: var(--color-lightgray);
+ --vertical-tabs-menu-separator-size: 1px;
+ --vertical-tabs-menu-width: 20em;
+ --vertical-tabs-pane-width: calc(100% - var(--vertical-tabs-menu-width));
+ --vertical-tabs-menu-link-focus-border-size: var(--details-summary-focus-border-size);
+ --vertical-tabs-menu-link--active-border-size: 4px;
+ --vertical-tabs-menu-link--active-border-color: var(--color-absolutezero);
}
diff --git a/core/themes/claro/css/components/form--select.css b/core/themes/claro/css/components/form--select.css
index c40f66165b..a749fa05aa 100644
--- a/core/themes/claro/css/components/form--select.css
+++ b/core/themes/claro/css/components/form--select.css
@@ -55,6 +55,10 @@
/**
* Breadcrumb.
*/
+
+ /**
+ * Vertical Tabs.
+ */
}
.form-element--type-select {
diff --git a/core/themes/claro/css/components/icon-link.css b/core/themes/claro/css/components/icon-link.css
new file mode 100644
index 0000000000..fa37c2ae89
--- /dev/null
+++ b/core/themes/claro/css/components/icon-link.css
@@ -0,0 +1,95 @@
+/*
+ * DO NOT EDIT THIS FILE.
+ * See the following change record for more information,
+ * https://www.drupal.org/node/2815083
+ * @preserve
+ */
+
+/**
+ * @file
+ * Icon link component.
+ */
+
+:root {
+ /*
+ * Color Palette.
+ */
+ /* Secondary. */
+ /* Variations. */ /* 5% darker than base. */ /* 10% darker than base. */ /* 10% darker than base. */ /* 20% darker than base. */ /* 5% darker than base. */ /* 10% darker than base. */ /* 5% darker than base. */ /* 10% darker than base. */ /* 5% darker than base. */ /* 10% darker than base. */
+ /*
+ * Base.
+ */
+ /*
+ * Typography.
+ */ /* 1rem = 16px if font root is 100% ands browser defaults are used. */ /* ~32px */ /* ~29px */ /* ~26px */ /* ~23px */ /* ~20px */ /* 18px */ /* ~14px */ /* ~13px */ /* ~11px */
+ /**
+ * Spaces.
+ */ /* 3 * 16px = 48px */ /* 1.5 * 16px = 24px */ /* 1 * 16px = 16px */ /* 0.75 * 16px = 12px */ /* 0.5 * 16px = 8px */
+ /*
+ * Common.
+ */
+ /*
+ * Inputs.
+ */ /* Absolute zero with opacity. */ /* Davy's gray with 0.6 opacity. */ /* Light gray with 0.3 opacity on white bg. */ /* Old silver with 0.5 opacity on white bg. */ /* (1/8)em ~ 2px */ /* (1/16)em ~ 1px */ /* 48px */ /* 150% */ /* 32px */ /* 150 % */ /* 24px */ /* 150% */ /* 7px inside the form element label. */ /* 8px with the checkbox width of 19px */
+ /*
+ * Details.
+ */
+ /**
+ * Buttons.
+ */
+ /**
+ * jQuery.UI dropdown.
+ */ /* Light gray with 0.8 opacity. */ /* Text color with 0.1 opacity. */
+ /**
+ * jQuery.UI dialog.
+ */
+ /**
+ * Progress bar.
+ */
+ /**
+ * Tabledrag icon size.
+ */ /* 17px */
+ /**
+ * Ajax progress.
+ */
+ /**
+ * Breadcrumb.
+ */
+
+ /**
+ * Vertical Tabs.
+ */
+}
+
+:root {
+ /* default */
+ /* active */
+ /* hover */
+}
+
+.icon-link {
+ display: flex;
+ padding: 0;
+ border: 1px solid #d4d4d8;
+ border-radius: 50%;
+ background-color: #fff;
+}
+
+.icon-link:hover {
+ border-color: rgba(212, 212, 218, 0.8);
+ background-color: #f0f5fd;
+}
+
+.icon-link:focus {
+ box-shadow: 0 0 0 1.5px #fff, 0 0 0 3.5px #26a769;
+}
+
+.icon-link:active,
+.open > .icon-link {
+ border-color: #003cc5;
+ background-color: #003cc5;
+}
+
+.icon-link--small:focus {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px #26a769;
+}
diff --git a/core/themes/claro/css/components/icon-link.pcss.css b/core/themes/claro/css/components/icon-link.pcss.css
new file mode 100644
index 0000000000..cdbfc8e685
--- /dev/null
+++ b/core/themes/claro/css/components/icon-link.pcss.css
@@ -0,0 +1,45 @@
+/**
+ * @file
+ * Icon link component.
+ */
+
+@import "../base/variables.pcss.css";
+
+:root {
+ /* default */
+ --icon-link-bg-color: var(--color-white);
+ --icon-link-border-color: var(--color-lightgray);
+ /* active */
+ --icon-link--active-bg-color: var(--color-absolutezero);
+ --icon-link--active-border-color: var(--color-absolutezero);
+ /* hover */
+ --icon-link--hover-bg-color: var(--color-bgblue-hover);
+ --icon-link--hover-border-color: var(--color-lightgray-o-80);
+}
+
+.icon-link {
+ display: flex;
+ padding: 0;
+ border: 1px solid var(--icon-link-border-color);
+ border-radius: 50%;
+ background-color: var(--icon-link-bg-color);
+}
+
+.icon-link:hover {
+ border-color: var(--icon-link--hover-border-color);
+ background-color: var(--icon-link--hover-bg-color);
+}
+
+.icon-link:focus {
+ box-shadow: 0 0 0 1.5px var(--color-white), 0 0 0 3.5px var(--color-focus);
+}
+
+.icon-link:active,
+.open > .icon-link {
+ border-color: var(--icon-link--active-border-color);
+ background-color: var(--icon-link--active-bg-color);
+}
+
+.icon-link--small:focus {
+ box-shadow: 0 0 0 1px var(--color-white), 0 0 0 3px var(--color-focus);
+}
diff --git a/core/themes/claro/css/components/vertical-tabs.css b/core/themes/claro/css/components/vertical-tabs.css
index 7e939da826..2ab57a36a1 100644
--- a/core/themes/claro/css/components/vertical-tabs.css
+++ b/core/themes/claro/css/components/vertical-tabs.css
@@ -57,6 +57,10 @@
/**
* Breadcrumb.
*/
+
+ /**
+ * Vertical Tabs.
+ */
}
/**
diff --git a/core/themes/claro/css/components/vertical-tabs.pcss.css b/core/themes/claro/css/components/vertical-tabs.pcss.css
index 12ed6a8647..de2fb5a50c 100644
--- a/core/themes/claro/css/components/vertical-tabs.pcss.css
+++ b/core/themes/claro/css/components/vertical-tabs.pcss.css
@@ -7,23 +7,6 @@
@import "../base/variables.pcss.css";
-:root {
- --vertical-tabs-margin-vertical: var(--space-s);
- --vertical-tabs-border-radius: var(--details-accordion-border-size-radius);
- --vertical-tabs-shadow: var(--details-box-shadow);
- --vertical-tabs-border-color: var(--details-border-color);
- --vertical-tabs-border-size: 1px;
- --vertical-tabs-border: var(--vertical-tabs-border-size) solid var(--vertical-tabs-border-color);
- --vertical-tabs-menu-item-shadow-extraspace: 0.5rem;
- --vertical-tabs-menu-separator-color: var(--color-lightgray);
- --vertical-tabs-menu-separator-size: 1px;
- --vertical-tabs-menu-width: 20em;
- --vertical-tabs-pane-width: calc(100% - var(--vertical-tabs-menu-width));
- --vertical-tabs-menu-link-focus-border-size: var(--details-summary-focus-border-size);
- --vertical-tabs-menu-link--active-border-size: 4px;
- --vertical-tabs-menu-link--active-border-color: var(--color-absolutezero);
-}
-
/**
* Main wrapper of vertical tabs.
* This wrapper div is added by JavaScript.
diff --git a/core/themes/claro/css/theme/media-library.css b/core/themes/claro/css/theme/media-library.css
index 4c2c2de241..74cdec3407 100644
--- a/core/themes/claro/css/theme/media-library.css
+++ b/core/themes/claro/css/theme/media-library.css
@@ -11,9 +11,60 @@
* Styling for Media Library.
*/
+:root {
+ /*
+ * Color Palette.
+ */
+ /* Secondary. */
+ /* Variations. */ /* 5% darker than base. */ /* 10% darker than base. */ /* 10% darker than base. */ /* 20% darker than base. */ /* 5% darker than base. */ /* 10% darker than base. */ /* 5% darker than base. */ /* 10% darker than base. */ /* 5% darker than base. */ /* 10% darker than base. */
+ /*
+ * Base.
+ */
+ /*
+ * Typography.
+ */ /* 1rem = 16px if font root is 100% ands browser defaults are used. */ /* ~32px */ /* ~29px */ /* ~26px */ /* ~23px */ /* ~20px */ /* 18px */ /* ~14px */ /* ~13px */ /* ~11px */
+ /**
+ * Spaces.
+ */ /* 3 * 16px = 48px */ /* 1.5 * 16px = 24px */ /* 1 * 16px = 16px */ /* 0.75 * 16px = 12px */ /* 0.5 * 16px = 8px */
+ /*
+ * Common.
+ */
+ /*
+ * Inputs.
+ */ /* Absolute zero with opacity. */ /* Davy's gray with 0.6 opacity. */ /* Light gray with 0.3 opacity on white bg. */ /* Old silver with 0.5 opacity on white bg. */ /* (1/8)em ~ 2px */ /* (1/16)em ~ 1px */ /* 48px */ /* 150% */ /* 32px */ /* 150 % */ /* 24px */ /* 150% */ /* 7px inside the form element label. */ /* 8px with the checkbox width of 19px */
+ /*
+ * Details.
+ */
+ /**
+ * Buttons.
+ */
+ /**
+ * jQuery.UI dropdown.
+ */ /* Light gray with 0.8 opacity. */ /* Text color with 0.1 opacity. */
+ /**
+ * jQuery.UI dialog.
+ */
+ /**
+ * Progress bar.
+ */
+ /**
+ * Tabledrag icon size.
+ */ /* 17px */
+ /**
+ * Ajax progress.
+ */
+ /**
+ * Breadcrumb.
+ */
+
+ /**
+ * Vertical Tabs.
+ */
+}
+
.media-library-wrapper {
display: flex;
- margin: -1em;
+ margin: -1em -1.5em -1em -1em;
}
/**
@@ -22,17 +73,18 @@
*/
.media-library-menu {
+ position: relative;
display: block;
- width: 600px;
- max-width: 20%;
- margin: 0; /* LTR */
- padding: 0;
- border-bottom: 1px solid #ccc;
- background-color: #e6e5e1;
- line-height: 1;
+ float: left; /* LTR */
+ width: 20em;
+ margin: 0;
+ padding-top: 0.5rem;
+ list-style: none;
+ color: #222330;
}
[dir="rtl"] .media-library-menu {
+ float: right;
margin: 0;
}
@@ -41,68 +93,166 @@
* https://www.drupal.org/project/drupal/issues/3029227
*/
-.media-library-menu li {
+.media-library-menu__item {
+ overflow: hidden;
+ margin: -1rem -1px -0.5rem -0.5rem; /* LTR */
+ padding: 0.5rem 0; /* LTR */
+}
+
+[dir="rtl"] .media-library-menu__item {
+ margin-right: -0.5rem;
+ margin-left: -1px;
+ padding-right: 0.5rem;
+ padding-left: 0;
+}
+
+.media-library-menu__item::before {
+ z-index: 1; /* The line should be kept above the vertical tabs menu link to keep it visible even if the link is hovered and gets the 'hover' background color. */
display: block;
- padding: 0;
- list-style: none;
+ width: 100%;
+ margin-top: -1px;
+ content: "";
+ border-top: 1px solid #d4d4d8;
}
.media-library-menu__link {
position: relative;
display: block;
- box-sizing: border-box;
- padding: 15px;
+ margin-top: -1px;
+ padding: 0.75rem 0.75rem 0.75rem calc(1.5rem - 4px); /* LTR */
text-decoration: none;
- border-bottom: 1px solid #b3b2ad;
- background-color: #f2f2f0;
- text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+ word-wrap: break-word;
+ -webkit-hyphens: auto;
+ -ms-hyphens: auto;
+ hyphens: auto;
+ color: #222330;
+ border: 1px solid transparent;
+ border-width: 1px 0 1px 4px; /* LTR */
+ border-radius: 2px 0 0 2px; /* LTR */
+}
+
+[dir="rtl"] .media-library-menu__link {
+ padding-right: calc(1.5rem - 4px);
+ padding-left: 0.75rem;
+ border-width: 1px 4px 1px 0;
+ border-radius: 0 2px 2px 0;
+}
+
+@media screen and (-ms-high-contrast: active) {
+ .media-library-menu__link {
+ border-color: transparent;
+ }
}
-.media-library-menu__link:active,
-.media-library-menu__link:hover,
+/* Menu link states. */
+
.media-library-menu__link:focus {
- background: #fcfcfa;
- text-shadow: none;
+ z-index: 4; /* Focus state should be on the highest level to make the focus effect be fully visible. This also means that it should have bigger z-index than the selected link. */
+ text-decoration: none;
+ box-shadow: none;
}
-.media-library-menu__link:focus,
-.media-library-menu__link:active {
- outline: none;
+.media-library-menu__link:hover {
+ text-decoration: none;
+ color: #003cc5;
+ /* These borders are necessary to replace the dividing lines while in the hover state. */
+ border-top: 1px solid #d4d4d8;
+ border-bottom: 1px solid #d4d4d8;
+ background: #f0f5fd;
+}
+
+/* This pseudo element provides the background for the hover state. */
+
+.media-library-menu__link::before {
+ position: absolute;
+ z-index: 0; /* This should be on a lower level than the menu-item separator lines. */
+ top: -1px;
+ right: 0; /* LTR */
+ bottom: -1px;
+ left: -4px; /* LTR */
+ content: "";
+ pointer-events: none;
+ background-clip: padding-box;
+}
+
+[dir="rtl"] .media-library-menu__link::before {
+ right: -4px;
+ left: 0;
+}
+
+.media-library-menu__link:focus::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ margin: -1px -4px;
+ content: "";
+ pointer-events: none;
+ border: 3px solid #26a769;
+ border-radius: 2px;
}
.media-library-menu__link.active {
- z-index: 1;
- margin-right: -1px; /* LTR */
- color: #000;
- border-right: 1px solid #fcfcfa; /* LTR */
- border-bottom: 1px solid #b3b2ad;
+ z-index: 3; /* The selected menu link should be on a higher level than the white masking line that hides the grey separator. */
+ color: #003cc5;
+ border-color: rgba(216, 217, 224, 0.8) transparent;
background-color: #fff;
- box-shadow: 0 5px 5px -5px hsla(0, 0%, 0%, 0.3);
+ box-shadow: 0
+2px
+4px
+rgba(0, 0, 0, 0.1);
}
-[dir="rtl"] .media-library-menu__link.active {
- margin-right: 0;
- margin-left: -1px;
- border-right: 0;
- border-left: 1px solid #fcfcfa;
+.media-library-menu__link.active:hover {
+ color: #0036b1;
+ background-color: #f0f5fd;
+}
+
+.media-library-menu__link.active::before {
+ z-index: 1; /* The blue active-tab indication should be on a higher level than the green focus border. */
+ border-left: 4px solid #003cc5; /* LTR */
+ border-radius: 2px 0 0 2px; /* LTR */
+}
+
+[dir=rtl] .media-library-menu__link.active::before {
+ border-right: 4px solid #003cc5;
+ border-left: 0;
+ border-radius: 0 2px 2px 0;
+}
+
+.media-library-menu__link.active:hover::before {
+ background: none;
}
.media-library-content {
width: 100%;
padding: 1em;
- border-left: 1px solid #b3b2ad; /* LTR */
outline: none;
}
-[dir="rtl"] .media-library-content {
- border-right: 1px solid #b3b2ad;
+.media-library-menu + .media-library-content {
+ z-index: 1;
+ border-left: 1px
+solid
+rgba(216, 217, 224, 0.8); /* LTR */
+ box-shadow: 0
+2px
+4px
+rgba(0, 0, 0, 0.1);
+}
+
+[dir="rtl"] .media-library-menu + .media-library-content {
+ border-right: 1px
+solid
+rgba(216, 217, 224, 0.8);
border-left: 0;
}
/* Generic media add form styles. */
.media-library-add-form--without-input .form-item {
- margin: 0 0 1em;
+ margin-right: 1rem;
}
/**
@@ -118,11 +268,31 @@
outline: none;
}
+/* This Media Library form is an exception to the extrasmall button pattern. */
+
+.media-library-add-form__added-media .media-library-add-form__remove-button.button--extrasmall {
+ margin: 0.5rem 0.5rem 0.5rem 0; /* LTR */
+ padding: calc(0.25rem - 1px) calc(0.75rem - 1px); /* 1 */
+ font-size: 0.79rem;
+}
+
+[dir="rtl"].media-library-add-form__added-media .media-library-add-form__remove-button.button--extrasmall {
+ margin-right: 0;
+ margin-left: 0.5rem;
+}
+
.media-library-add-form__input-wrapper {
- padding: 16px;
- border: 1px solid #bfbfbf;
+ margin-top: 1.5rem;
+ margin-bottom: 1.5rem;
+ padding: 0.5rem 1.5rem 1.5rem 1.5rem;
+ border: 1px solid rgba(216, 217, 224, 0.8);
border-radius: 2px;
- background: #fcfcfa;
+ background-color: #fff;
+ box-shadow: 0
+2px
+4px
+rgba(0, 0, 0, 0.1);
+ /* background: #fcfcfa; */
}
/* Style the media add upload form. */
@@ -131,6 +301,15 @@
margin-bottom: 0;
}
+.media-library-add-form--upload.media-library-add-form--with-input .form-managed-file_meta {
+ margin-top: 0;
+}
+
+.media-library-add-form--upload.media-library-add-form--with-input .form-managed-file__main,
+.media-library-add-form--upload.media-library-add-form--with-input .form-managed-file.no-upload {
+ display: block;
+}
+
.media-library-add-form .file-upload-help {
margin: 8px 0 0;
}
@@ -139,6 +318,7 @@
.media-library-add-form--oembed .media-library-add-form__input-wrapper {
display: flex;
+ align-items: center;
}
@media screen and (max-width: 37.5em) {
@@ -302,6 +482,40 @@
position: relative;
}
+/**
+ * Ajax throbbers inside a media library item.
+ */
+
+.media-library-item .ajax-progress.ajax-progress.ajax-progress {
+ position: absolute;
+ z-index: 1;
+ top: 50%;
+ left: 50%;
+ box-sizing: border-box;
+ width: 3rem; /* 56px */
+ height: 3rem;
+ margin: -1.5rem;
+ border: 1px solid rgba(216, 217, 224, 0.8);
+ border-radius: 3.5rem;
+ background: #fff;
+ box-shadow: 0 0.25rem 0.625rem rgba(34, 35, 48, 0.1);
+}
+
+.media-library-item .ajax-progress__throbber {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 1.75rem;
+ height: 1.75rem;
+ margin: -0.875rem;
+ border: 3px solid #003cc5;
+ border-right: 3px dotted transparent;
+}
+
+.media-library-item .ajax-progress__message {
+ display: none;
+}
+
/**
* The media library item container receives screen reader focus when items are
* removed. Since it is not an interactive element, it does not need an
@@ -431,12 +645,20 @@
top: 5px;
left: 5px;
border-width: 3px;
- border-color: #40b6ff;
border-radius: 3px;
}
+.media-library-item--grid.is-hover:before,
+.media-library-item--grid.checked.is-hover:before {
+ border-color: #0036b1;
+}
+
+.media-library-item--grid.is-focus:before {
+ border-color: #26a769;
+}
+
.media-library-item--grid.checked:before {
- border-color: #0076c0;
+ border-color: #003cc5;
}
.media-library-item__click-to-select-checkbox {
@@ -516,16 +738,13 @@
background: white;
}
-.media-library-item__name {
- font-size: 14px;
-}
-
.media-library-item__name {
display: block;
overflow: hidden;
- margin: 2px;
+ margin: 0.25rem 0.5rem;
white-space: nowrap;
text-overflow: ellipsis;
+ font-size: 14px;
}
.media-library-item__attributes:hover .media-library-item__name,
@@ -565,15 +784,16 @@
margin-left: 1em;
}
-.media-library-widget__toggle-weight {
+.media-library-widget__toggle-weight.media-library-widget__toggle-weight {
position: absolute;
- top: 5px;
- right: 5px; /* LTR */
+ top: 0.75rem;
+ right: 1rem; /* LTR */
+ text-decoration: none;
}
-[dir="rtl"] .media-library-widget__toggle-weight {
+[dir="rtl"] .media-library-widget__toggle-weight.media-library-widget__toggle-weight {
right: auto;
- left: 5px;
+ left: 1rem;
}
/* Add negative margin for flex grid. */
@@ -605,15 +825,13 @@
z-index: 1;
top: 10px;
overflow: hidden;
- width: 21px;
- height: 21px;
+ width: 24px;
+ height: 24px;
margin: 5px;
padding: 0;
transition: 0.2s border-color;
color: transparent;
- border: 2px solid #ccc;
- border-radius: 20px;
- background-size: 13px;
+ background-size: 12px;
text-shadow: none;
font-size: 0;
}
@@ -637,8 +855,16 @@
}
.media-library-item__edit {
- background: url("../../../../misc/icons/787878/pencil.svg") #fff center no-repeat;
- background-size: 13px;
+ /* !important to override button class border. */
+ border: 1px solid #d4d4d8 !important;
+ background-image: url("../../../../misc/icons/545560/pencil.svg");
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 12px;
+}
+
+.media-library-item__edit:active {
+ background-image: url("../../../../misc/icons/ffffff/pencil.svg");
}
.media-library-item__remove,
@@ -648,18 +874,20 @@
.media-library-item__remove.button:disabled:active,
.media-library-item__remove.button:hover,
.media-library-item__remove.button:focus {
- background: url("../../../../misc/icons/787878/ex.svg") #fff center no-repeat;
- background-size: 13px;
+ /* !important to override button class border. */
+ border: 1px solid #d4d4d8 !important;
+ background-image: url("../../../../misc/icons/545560/ex.svg");
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 12px;
}
-.media-library-item__edit:hover,
-.media-library-item__edit:focus,
-.media-library-item__remove:hover,
-.media-library-item__remove:focus,
-.media-library-item__remove.button:hover,
-.media-library-item__remove.button:focus,
+.media-library-item__remove:active,
+.media-library-item__remove.button:active,
.media-library-item__remove.button:disabled:active {
- border-color: #40b6ff;
+ /* !important to override button class border. */
+ border-color: #003cc5 !important;
+ background-image: url("../../../../misc/icons/ffffff/ex.svg");
}
/**
@@ -708,7 +936,7 @@
justify-content: center;
width: 220px;
margin-right: 20px; /* LTR */
- background: #ebebeb;
+ background: rgba(243, 244, 249, 0.4);
}
[dir="rtl"] .media-library-add-form__preview {
diff --git a/core/themes/claro/css/theme/media-library.pcss.css b/core/themes/claro/css/theme/media-library.pcss.css
index 3ae30c1799..b7bb9e6335 100644
--- a/core/themes/claro/css/theme/media-library.pcss.css
+++ b/core/themes/claro/css/theme/media-library.pcss.css
@@ -4,9 +4,11 @@
* Styling for Media Library.
*/
+@import "../base/variables.pcss.css";
+
.media-library-wrapper {
display: flex;
- margin: -1em;
+ margin: -1em -1.5em -1em -1em;
}
/**
@@ -14,16 +16,17 @@
* https://www.drupal.org/project/drupal/issues/3023767
*/
.media-library-menu {
+ position: relative;
display: block;
- width: 600px;
- max-width: 20%;
- margin: 0; /* LTR */
- padding: 0;
- border-bottom: 1px solid #ccc;
- background-color: #e6e5e1;
- line-height: 1;
+ float: left; /* LTR */
+ width: var(--vertical-tabs-menu-width);
+ margin: 0;
+ padding-top: var(--vertical-tabs-menu-item-shadow-extraspace);
+ list-style: none;
+ color: var(--color-text);
}
[dir="rtl"] .media-library-menu {
+ float: right;
margin: 0;
}
@@ -31,65 +34,149 @@
* @todo Use a class instead of the li element.
* https://www.drupal.org/project/drupal/issues/3029227
*/
-.media-library-menu li {
+.media-library-menu__item {
+ overflow: hidden;
+ margin: calc(var(--vertical-tabs-menu-item-shadow-extraspace) * -2) calc(var(--vertical-tabs-border-size) * -1) calc(var(--vertical-tabs-menu-item-shadow-extraspace) * -1) calc(var(--vertical-tabs-menu-item-shadow-extraspace) * -1); /* LTR */
+ padding: var(--vertical-tabs-menu-item-shadow-extraspace) 0; /* LTR */
+}
+
+[dir="rtl"] .media-library-menu__item {
+ margin-right: calc(var(--vertical-tabs-menu-item-shadow-extraspace) * -1);
+ margin-left: calc(var(--vertical-tabs-border-size) * -1);
+ padding-right: var(--vertical-tabs-menu-item-shadow-extraspace);
+ padding-left: 0;
+}
+
+.media-library-menu__item::before {
+ z-index: 1; /* The line should be kept above the vertical tabs menu link to keep it visible even if the link is hovered and gets the 'hover' background color. */
display: block;
- padding: 0;
- list-style: none;
+ width: 100%;
+ margin-top: calc(var(--vertical-tabs-menu-separator-size) * -1);
+ content: "";
+ border-top: var(--vertical-tabs-menu-separator-size) solid var(--vertical-tabs-menu-separator-color);
}
.media-library-menu__link {
position: relative;
display: block;
- box-sizing: border-box;
- padding: 15px;
+ margin-top: calc(var(--vertical-tabs-border-size) * -1);
+ padding: var(--space-s) var(--space-s) var(--space-s) calc(var(--space-l) - var(--vertical-tabs-menu-link--active-border-size)); /* LTR */
text-decoration: none;
- border-bottom: 1px solid #b3b2ad;
- background-color: #f2f2f0;
- text-shadow: 0 1px hsla(0, 0%, 100%, 0.6);
+ word-wrap: break-word;
+ hyphens: auto;
+ color: var(--color-text);
+ border: var(--vertical-tabs-border-size) solid transparent;
+ border-width: var(--vertical-tabs-border-size) 0 var(--vertical-tabs-border-size) var(--vertical-tabs-menu-link--active-border-size); /* LTR */
+ border-radius: var(--vertical-tabs-border-radius) 0 0 var(--vertical-tabs-border-radius); /* LTR */
+}
+
+[dir="rtl"] .media-library-menu__link {
+ padding-right: calc(var(--space-l) - var(--vertical-tabs-menu-link--active-border-size));
+ padding-left: var(--space-s);
+ border-width: var(--vertical-tabs-border-size) var(--vertical-tabs-menu-link--active-border-size) var(--vertical-tabs-border-size) 0;
+ border-radius: 0 var(--vertical-tabs-border-radius) var(--vertical-tabs-border-radius) 0;
}
-.media-library-menu__link:active,
-.media-library-menu__link:hover,
+@media screen and (-ms-high-contrast: active) {
+ .media-library-menu__link {
+ border-color: transparent;
+ }
+}
+
+/* Menu link states. */
.media-library-menu__link:focus {
- background: #fcfcfa;
- text-shadow: none;
+ z-index: 4; /* Focus state should be on the highest level to make the focus effect be fully visible. This also means that it should have bigger z-index than the selected link. */
+ text-decoration: none;
+ box-shadow: none;
}
-.media-library-menu__link:focus,
-.media-library-menu__link:active {
- outline: none;
+.media-library-menu__link:hover {
+ text-decoration: none;
+ color: var(--color-absolutezero);
+ /* These borders are necessary to replace the dividing lines while in the hover state. */
+ border-top: var(--vertical-tabs-menu-separator-size) solid var(--vertical-tabs-menu-separator-color);
+ border-bottom: var(--vertical-tabs-menu-separator-size) solid var(--vertical-tabs-menu-separator-color);
+ background: var(--color-bgblue-hover);
+}
+
+/* This pseudo element provides the background for the hover state. */
+.media-library-menu__link::before {
+ position: absolute;
+ z-index: 0; /* This should be on a lower level than the menu-item separator lines. */
+ top: calc(var(--vertical-tabs-border-size) * -1);
+ right: 0; /* LTR */
+ bottom: calc(var(--vertical-tabs-border-size) * -1);
+ left: calc(var(--vertical-tabs-menu-link--active-border-size) * -1); /* LTR */
+ content: "";
+ pointer-events: none;
+ background-clip: padding-box;
+}
+[dir="rtl"] .media-library-menu__link::before {
+ right: calc(var(--vertical-tabs-menu-link--active-border-size) * -1);
+ left: 0;
+}
+
+.media-library-menu__link:focus::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ margin: calc(var(--vertical-tabs-border-size) * -1) calc(var(--vertical-tabs-menu-link--active-border-size) * -1);
+ content: "";
+ pointer-events: none;
+ border: var(--vertical-tabs-menu-link-focus-border-size) solid var(--color-focus);
+ border-radius: var(--vertical-tabs-border-radius);
}
.media-library-menu__link.active {
- z-index: 1;
- margin-right: -1px; /* LTR */
- color: #000;
- border-right: 1px solid #fcfcfa; /* LTR */
- border-bottom: 1px solid #b3b2ad;
- background-color: #fff;
- box-shadow: 0 5px 5px -5px hsla(0, 0%, 0%, 0.3);
-}
-[dir="rtl"] .media-library-menu__link.active {
- margin-right: 0;
- margin-left: -1px;
- border-right: 0;
- border-left: 1px solid #fcfcfa;
+ z-index: 3; /* The selected menu link should be on a higher level than the white masking line that hides the grey separator. */
+ color: var(--color-absolutezero);
+ border-color: var(--vertical-tabs-border-color) transparent;
+ background-color: var(--color-white);
+ box-shadow: var(--vertical-tabs-shadow);
+}
+
+.media-library-menu__link.active:hover {
+ color: var(--color-absolutezero-hover);
+ background-color: var(--color-bgblue-hover);
+}
+
+.media-library-menu__link.active::before {
+ z-index: 1; /* The blue active-tab indication should be on a higher level than the green focus border. */
+ border-left: var(--vertical-tabs-menu-link--active-border-size) solid var(--vertical-tabs-menu-link--active-border-color); /* LTR */
+ border-radius: var(--base-border-radius) 0 0 var(--base-border-radius); /* LTR */
+}
+[dir=rtl] .media-library-menu__link.active::before {
+ border-right: var(--vertical-tabs-menu-link--active-border-size) solid var(--vertical-tabs-menu-link--active-border-color);
+ border-left: 0;
+ border-radius: 0 var(--base-border-radius) var(--base-border-radius) 0;
+}
+
+.media-library-menu__link.active:hover::before {
+ background: none;
}
.media-library-content {
width: 100%;
padding: 1em;
- border-left: 1px solid #b3b2ad; /* LTR */
outline: none;
}
-[dir="rtl"] .media-library-content {
- border-right: 1px solid #b3b2ad;
+
+.media-library-menu + .media-library-content {
+ z-index: 1;
+ border-left: var(--vertical-tabs-border); /* LTR */
+ box-shadow: var(--vertical-tabs-shadow);
+}
+
+[dir="rtl"] .media-library-menu + .media-library-content {
+ border-right: var(--vertical-tabs-border);
border-left: 0;
}
/* Generic media add form styles. */
.media-library-add-form--without-input .form-item {
- margin: 0 0 1em;
+ margin-right: 1rem;
}
/**
@@ -104,17 +191,40 @@
outline: none;
}
+/* This Media Library form is an exception to the extrasmall button pattern. */
+.media-library-add-form__added-media .media-library-add-form__remove-button.button--extrasmall {
+ margin: var(--space-xs) var(--space-xs) var(--space-xs) 0; /* LTR */
+ padding: calc(calc(var(--space-xs) / 2) - 1px) calc(var(--space-s) - 1px); /* 1 */
+ font-size: var(--font-size-xs);
+}
+
+[dir="rtl"].media-library-add-form__added-media .media-library-add-form__remove-button.button--extrasmall {
+ margin-right: 0;
+ margin-left: var(--space-xs);
+}
+
.media-library-add-form__input-wrapper {
- padding: 16px;
- border: 1px solid #bfbfbf;
- border-radius: 2px;
- background: #fcfcfa;
+ margin-top: var(--space-l);
+ margin-bottom: var(--space-l);
+ padding: var(--space-xs) var(--space-l) var(--space-l) var(--space-l);
+ border: var(--details-border-size) solid var(--details-border-color);
+ border-radius: var(--base-border-radius);
+ background-color: var(--color-white);
+ box-shadow: var(--details-box-shadow);
+ /* background: #fcfcfa; */
}
/* Style the media add upload form. */
.media-library-add-form--upload.media-library-add-form--without-input .form-item-upload {
margin-bottom: 0;
}
+.media-library-add-form--upload.media-library-add-form--with-input .form-managed-file_meta {
+ margin-top: 0;
+}
+.media-library-add-form--upload.media-library-add-form--with-input .form-managed-file__main,
+.media-library-add-form--upload.media-library-add-form--with-input .form-managed-file.no-upload {
+ display: block;
+}
.media-library-add-form .file-upload-help {
margin: 8px 0 0;
@@ -123,6 +233,7 @@
/* Style the media add oEmbed form. */
.media-library-add-form--oembed .media-library-add-form__input-wrapper {
display: flex;
+ align-items: center;
}
@media screen and (max-width: 37.5em) {
@@ -273,6 +384,37 @@
position: relative;
}
+/**
+ * Ajax throbbers inside a media library item.
+ */
+.media-library-item .ajax-progress.ajax-progress.ajax-progress {
+ position: absolute;
+ z-index: 1;
+ top: 50%;
+ left: 50%;
+ box-sizing: border-box;
+ width: 3rem; /* 56px */
+ height: 3rem;
+ margin: -1.5rem;
+ border: var(--input-border-size) solid var(--jui-dropdown-border-color);
+ border-radius: 3.5rem;
+ background: var(--color-white);
+ box-shadow: 0 0.25rem 0.625rem var(--jui-dropdown-shadow-color);
+}
+.media-library-item .ajax-progress__throbber {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 1.75rem;
+ height: 1.75rem;
+ margin: -0.875rem;
+ border: 3px solid var(--color-absolutezero);
+ border-right: 3px dotted transparent;
+}
+.media-library-item .ajax-progress__message {
+ display: none;
+}
+
/**
* The media library item container receives screen reader focus when items are
* removed. Since it is not an interactive element, it does not need an
@@ -396,12 +538,20 @@
top: 5px;
left: 5px;
border-width: 3px;
- border-color: #40b6ff;
border-radius: 3px;
}
+.media-library-item--grid.is-hover:before,
+.media-library-item--grid.checked.is-hover:before {
+ border-color: var(--color-absolutezero-hover);
+}
+
+.media-library-item--grid.is-focus:before {
+ border-color: var(--color-focus);
+}
+
.media-library-item--grid.checked:before {
- border-color: #0076c0;
+ border-color: var(--color-absolutezero);
}
.media-library-item__click-to-select-checkbox {
@@ -477,16 +627,13 @@
background: white;
}
-.media-library-item__name {
- font-size: 14px;
-}
-
.media-library-item__name {
display: block;
overflow: hidden;
- margin: 2px;
+ margin: calc(var(--space-xs) / 2) var(--space-xs);
white-space: nowrap;
text-overflow: ellipsis;
+ font-size: 14px;
}
.media-library-item__attributes:hover .media-library-item__name,
@@ -523,14 +670,15 @@
margin-left: 1em;
}
-.media-library-widget__toggle-weight {
+.media-library-widget__toggle-weight.media-library-widget__toggle-weight {
position: absolute;
- top: 5px;
- right: 5px; /* LTR */
+ top: var(--space-s);
+ right: var(--space-m); /* LTR */
+ text-decoration: none;
}
-[dir="rtl"] .media-library-widget__toggle-weight {
+[dir="rtl"] .media-library-widget__toggle-weight.media-library-widget__toggle-weight {
right: auto;
- left: 5px;
+ left: var(--space-m);
}
/* Add negative margin for flex grid. */
@@ -560,15 +708,13 @@
z-index: 1;
top: 10px;
overflow: hidden;
- width: 21px;
- height: 21px;
+ width: 24px;
+ height: 24px;
margin: 5px;
padding: 0;
transition: 0.2s border-color;
color: transparent;
- border: 2px solid #ccc;
- border-radius: 20px;
- background-size: 13px;
+ background-size: 12px;
text-shadow: none;
font-size: 0;
}
@@ -590,8 +736,15 @@
}
.media-library-item__edit {
- background: url("../../../../misc/icons/787878/pencil.svg") #fff center no-repeat;
- background-size: 13px;
+ /* !important to override button class border. */
+ border: 1px solid var(--color-lightgray) !important;
+ background-image: url("../../../../misc/icons/545560/pencil.svg");
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 12px;
+}
+.media-library-item__edit:active {
+ background-image: url("../../../../misc/icons/ffffff/pencil.svg");
}
.media-library-item__remove,
.media-library-item__remove.button,
@@ -600,17 +753,20 @@
.media-library-item__remove.button:disabled:active,
.media-library-item__remove.button:hover,
.media-library-item__remove.button:focus {
- background: url("../../../../misc/icons/787878/ex.svg") #fff center no-repeat;
- background-size: 13px;
+ /* !important to override button class border. */
+ border: 1px solid var(--color-lightgray) !important;
+ background-image: url("../../../../misc/icons/545560/ex.svg");
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 12px;
}
-.media-library-item__edit:hover,
-.media-library-item__edit:focus,
-.media-library-item__remove:hover,
-.media-library-item__remove:focus,
-.media-library-item__remove.button:hover,
-.media-library-item__remove.button:focus,
+
+.media-library-item__remove:active,
+.media-library-item__remove.button:active,
.media-library-item__remove.button:disabled:active {
- border-color: #40b6ff;
+ /* !important to override button class border. */
+ border-color: var(--color-absolutezero) !important;
+ background-image: url("../../../../misc/icons/ffffff/ex.svg");
}
/**
@@ -655,7 +811,7 @@
justify-content: center;
width: 220px;
margin-right: 20px; /* LTR */
- background: #ebebeb;
+ background: var(--color-whitesmoke-o-40);
}
[dir="rtl"] .media-library-add-form__preview {
margin-right: 0;
diff --git a/core/themes/claro/src/ClaroPreRender.php b/core/themes/claro/src/ClaroPreRender.php
index d702543451..8b4074880c 100644
--- a/core/themes/claro/src/ClaroPreRender.php
+++ b/core/themes/claro/src/ClaroPreRender.php
@@ -25,8 +25,9 @@ public static function managedFile($element) {
$element['upload_button']['#attributes']['class'][] = 'upload-button';
}
- // Wrap single-cardinality widgets with a details element.
- $single_file_widget = !empty($element['#cardinality']) && $element['#cardinality'] === 1;
+ // Wrap single-cardinality widgets with a details element. Do not wrap Media
+ // Library upload element.
+ $single_file_widget = empty($element['#media_library_upload']) && !empty($element['#cardinality']) && $element['#cardinality'] === 1;
if ($single_file_widget && empty($element['#single_wrapped'])) {
$element['#theme_wrappers']['details'] = [
'#title' => $element['#title'],