diff --git a/core/modules/layout_builder/layout_builder.layouts.yml b/core/modules/layout_builder/layout_builder.layouts.yml new file mode 100644 index 0000000000000000000000000000000000000000..3512c52677ea0e3ecedba0fcc4a3d906c5e5a93e --- /dev/null +++ b/core/modules/layout_builder/layout_builder.layouts.yml @@ -0,0 +1,52 @@ +layout_twocol_section: + label: 'Two column' + path: layouts/twocol_section + template: layout--twocol-section + library: layout_builder/twocol_section + class: '\Drupal\layout_builder\Plugin\Layout\TwoColumnLayout' + category: 'Columns: 2' + default_region: first + icon_map: + - [first, second] + regions: + first: + label: First + second: + label: Second + +layout_threecol_section: + label: 'Three column' + path: layouts/threecol_section + template: layout--threecol-section + library: layout_builder/threecol_section + class: '\Drupal\layout_builder\Plugin\Layout\ThreeColumnLayout' + category: 'Columns: 3' + default_region: second + icon_map: + - [first, second, third] + regions: + first: + label: First + second: + label: Second + third: + label: Third + +layout_fourcol_section: + label: 'Four column' + path: layouts/fourcol_section + template: layout--fourcol-section + library: layout_builder/fourcol_section + category: 'Columns: 4' + default_region: first + icon_map: + - [first, second, third, fourth] + regions: + first: + label: First + second: + label: Second + third: + label: Third + fourth: + label: Fourth diff --git a/core/modules/layout_builder/layout_builder.libraries.yml b/core/modules/layout_builder/layout_builder.libraries.yml index 84727756365b2ee349ece0872bd059cb6fc7b1f3..21573e681414b02e8d970865e01f8f4c0911bbf8 100644 --- a/core/modules/layout_builder/layout_builder.libraries.yml +++ b/core/modules/layout_builder/layout_builder.libraries.yml @@ -8,3 +8,20 @@ drupal.layout_builder: dependencies: - core/jquery.ui.sortable - core/drupal.dialog.off_canvas + +# CSS libraries for Layout plugins. +twocol_section: + version: VERSION + css: + theme: + layouts/twocol_section/twocol_section.css: {} +threecol_section: + version: VERSION + css: + theme: + layouts/threecol_section/threecol_section.css: {} +fourcol_section: + version: VERSION + css: + theme: + layouts/fourcol_section/fourcol_section.css: {} diff --git a/core/modules/layout_builder/layout_builder.module b/core/modules/layout_builder/layout_builder.module index 3021b9af93208ffe161863e8085ce8e368d61796..f9ef0855daeb0459a6771e9bdbd30c8ad7b0521c 100644 --- a/core/modules/layout_builder/layout_builder.module +++ b/core/modules/layout_builder/layout_builder.module @@ -234,3 +234,35 @@ function layout_builder_layout_builder_section_storage_alter(array &$definitions $definitions['overrides']->getContextDefinition('entity') ->addConstraint('EntityHasField', OverridesSectionStorage::FIELD_NAME); } + +/** + * Implements hook_plugin_filter_TYPE__CONSUMER_alter(). + */ +function layout_builder_plugin_filter_layout__layout_builder_alter(array &$definitions, array $extra) { + // Remove layouts provide by layout discovery that are not needed because of + // layouts provided by this module. + $duplicate_layouts = [ + 'layout_twocol', + 'layout_twocol_bricks', + 'layout_threecol_25_50_25', + 'layout_threecol_33_34_33', + ]; + + foreach ($duplicate_layouts as $duplicate_layout) { + /** @var \Drupal\Core\Layout\LayoutDefinition[] $definitions */ + if (isset($definitions[$duplicate_layout])) { + if ($definitions[$duplicate_layout]->getProvider() === 'layout_discovery') { + unset($definitions[$duplicate_layout]); + } + } + } + + // Move the one column layout to the top. + if (isset($definitions['layout_onecol']) && $definitions['layout_onecol']->getProvider() === 'layout_discovery') { + $one_col = $definitions['layout_onecol']; + unset($definitions['layout_onecol']); + $definitions = [ + 'layout_onecol' => $one_col, + ] + $definitions; + } +} diff --git a/core/modules/layout_builder/layouts/fourcol_section/fourcol_section.css b/core/modules/layout_builder/layouts/fourcol_section/fourcol_section.css new file mode 100644 index 0000000000000000000000000000000000000000..de1f3f87f39625074f3af7435faa07680d966a9d --- /dev/null +++ b/core/modules/layout_builder/layouts/fourcol_section/fourcol_section.css @@ -0,0 +1,19 @@ +/* + * @file + * Provides the layout styles for four-column layout section. + */ + +.layout--fourcol-section { + display: flex; + flex-wrap: wrap; +} + +.layout--fourcol-section > .layout__region { + flex: 0 1 100%; +} + +@media screen and (min-width: 40em) { + .layout--fourcol-section > .layout__region { + flex: 0 1 25%; + } +} diff --git a/core/modules/layout_builder/layouts/fourcol_section/layout--fourcol-section.html.twig b/core/modules/layout_builder/layouts/fourcol_section/layout--fourcol-section.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..9a380f76e01dc3d54252c76ed86e4a50fd5b378f --- /dev/null +++ b/core/modules/layout_builder/layouts/fourcol_section/layout--fourcol-section.html.twig @@ -0,0 +1,47 @@ +{# +/** + * @file + * Default theme implementation for a four-column 25%-25%-25%-25% layout. + * + * Available variables: + * - content: The content for this layout. + * - attributes: HTML attributes for the layout <div>. + * + * @ingroup themeable + */ +#} +{% + set classes = [ + 'layout', + 'layout--fourcol-section', + ] +%} +{% if content %} + <div{{ attributes.addClass(classes) }}> + + {% if content.first %} + <div {{ region_attributes.first.addClass('layout__region', 'layout__region--first') }}> + {{ content.first }} + </div> + {% endif %} + + {% if content.second %} + <div {{ region_attributes.second.addClass('layout__region', 'layout__region--second') }}> + {{ content.second }} + </div> + {% endif %} + + {% if content.third %} + <div {{ region_attributes.third.addClass('layout__region', 'layout__region--third') }}> + {{ content.third }} + </div> + {% endif %} + + {% if content.fourth %} + <div {{ region_attributes.fourth.addClass('layout__region', 'layout__region--fourth') }}> + {{ content.fourth }} + </div> + {% endif %} + + </div> +{% endif %} diff --git a/core/modules/layout_builder/layouts/threecol_section/layout--threecol-section.html.twig b/core/modules/layout_builder/layouts/threecol_section/layout--threecol-section.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..1311f28ab2a18bb98e873177804ba5a5dbbb0d42 --- /dev/null +++ b/core/modules/layout_builder/layouts/threecol_section/layout--threecol-section.html.twig @@ -0,0 +1,35 @@ +{# +/** + * @file + * Default theme implementation for a three-column layout. + * + * Available variables: + * - content: The content for this layout. + * - attributes: HTML attributes for the layout <div>. + * + * @ingroup themeable + */ +#} +{% if content %} + <div{{ attributes.addClass(classes) }}> + + {% if content.first %} + <div {{ region_attributes.first.addClass('layout__region', 'layout__region--first') }}> + {{ content.first }} + </div> + {% endif %} + + {% if content.second %} + <div {{ region_attributes.second.addClass('layout__region', 'layout__region--second') }}> + {{ content.second }} + </div> + {% endif %} + + {% if content.third %} + <div {{ region_attributes.third.addClass('layout__region', 'layout__region--third') }}> + {{ content.third }} + </div> + {% endif %} + + </div> +{% endif %} diff --git a/core/modules/layout_builder/layouts/threecol_section/threecol_section.css b/core/modules/layout_builder/layouts/threecol_section/threecol_section.css new file mode 100644 index 0000000000000000000000000000000000000000..49b5578bfc3cab7492a084d98599b394d14b4a11 --- /dev/null +++ b/core/modules/layout_builder/layouts/threecol_section/threecol_section.css @@ -0,0 +1,36 @@ +/* + * @file + * Provides the layout styles for three-column layout section. + */ + +.layout--threecol-section { + display: flex; + flex-wrap: wrap; +} + +.layout--threecol-section > .layout__region { + flex: 0 1 100%; +} + +@media screen and (min-width: 40em) { + .layout--threecol-section--25-50-25 > .layout__region--first, + .layout--threecol-section--25-50-25 > .layout__region--third, + .layout--threecol-section--25-25-50 > .layout__region--first, + .layout--threecol-section--25-25-50 > .layout__region--second, + .layout--threecol-section--50-25-25 > .layout__region--second, + .layout--threecol-section--50-25-25 > .layout__region--third { + flex: 0 1 25%; + } + .layout--threecol-section--25-50-25 > .layout__region--second, + .layout--threecol-section--25-25-50 > .layout__region--third, + .layout--threecol-section--50-25-25 > .layout__region--first { + flex: 0 1 50%; + } + .layout--threecol-section--33-34-33 > .layout__region--first, + .layout--threecol-section--33-34-33 > .layout__region--third { + flex: 0 1 33%; + } + .layout--threecol-section--33-34-33 > .layout__region--second { + flex: 0 1 34%; + } +} diff --git a/core/modules/layout_builder/layouts/twocol_section/layout--twocol-section.html.twig b/core/modules/layout_builder/layouts/twocol_section/layout--twocol-section.html.twig new file mode 100644 index 0000000000000000000000000000000000000000..a5d1d36376b75a26b074f5739fde80971c220603 --- /dev/null +++ b/core/modules/layout_builder/layouts/twocol_section/layout--twocol-section.html.twig @@ -0,0 +1,29 @@ +{# +/** + * @file + * Default theme implementation to display a two-column layout. + * + * Available variables: + * - content: The content for this layout. + * - attributes: HTML attributes for the layout <div>. + * + * @ingroup themeable + */ +#} +{% if content %} + <div{{ attributes }}> + + {% if content.first %} + <div {{ region_attributes.first.addClass('layout__region', 'layout__region--first') }}> + {{ content.first }} + </div> + {% endif %} + + {% if content.second %} + <div {{ region_attributes.second.addClass('layout__region', 'layout__region--second') }}> + {{ content.second }} + </div> + {% endif %} + + </div> +{% endif %} diff --git a/core/modules/layout_builder/layouts/twocol_section/twocol_section.css b/core/modules/layout_builder/layouts/twocol_section/twocol_section.css new file mode 100644 index 0000000000000000000000000000000000000000..0d212233508e58adab640bf0531e68ed1a8f811c --- /dev/null +++ b/core/modules/layout_builder/layouts/twocol_section/twocol_section.css @@ -0,0 +1,40 @@ +/* + * @file + * Provides the layout styles for two-column layout section. + */ + +.layout--twocol-section { + display: flex; + flex-wrap: wrap; +} + +.layout--twocol-section > .layout__region { + flex: 0 1 100%; +} + +@media screen and (min-width: 40em) { + .layout--twocol-section.layout--twocol-section--50-50 > .layout__region--first, + .layout--twocol-section.layout--twocol-section--50-50 > .layout__region--second { + flex: 0 1 50%; + } + + .layout--twocol-section.layout--twocol-section--33-67 > .layout__region--first, + .layout--twocol-section.layout--twocol-section--67-33 > .layout__region--second { + flex: 0 1 33%; + } + + .layout--twocol-section.layout--twocol-section--33-67 > .layout__region--second, + .layout--twocol-section.layout--twocol-section--67-33 > .layout__region--first { + flex: 0 1 67%; + } + + .layout--twocol-section.layout--twocol-section--25-75 > .layout__region--first, + .layout--twocol-section.layout--twocol-section--75-25 > .layout__region--second { + flex: 0 1 25%; + } + + .layout--twocol-section.layout--twocol-section--25-75 > .layout__region--second, + .layout--twocol-section.layout--twocol-section--75-25 > .layout__region--first { + flex: 0 1 75%; + } +} diff --git a/core/modules/layout_builder/src/Plugin/Layout/MultiWidthLayoutBase.php b/core/modules/layout_builder/src/Plugin/Layout/MultiWidthLayoutBase.php new file mode 100644 index 0000000000000000000000000000000000000000..8afed5aa50db7fcc21f3a8804e0d7d6d3573ac8e --- /dev/null +++ b/core/modules/layout_builder/src/Plugin/Layout/MultiWidthLayoutBase.php @@ -0,0 +1,84 @@ +<?php + +namespace Drupal\layout_builder\Plugin\Layout; + +use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Layout\LayoutDefault; +use Drupal\Core\Plugin\PluginFormInterface; +use Drupal\Core\StringTranslation\StringTranslationTrait; + +/** + * Base class of layouts with configurable widths. + * + * @internal + * Layout Builder is currently experimental and should only be leveraged by + * experimental modules and development releases of contributed modules. + * See https://www.drupal.org/core/experimental for more information. + */ +abstract class MultiWidthLayoutBase extends LayoutDefault implements PluginFormInterface { + + use StringTranslationTrait; + + /** + * {@inheritdoc} + */ + public function defaultConfiguration() { + $width_classes = array_keys($this->getWidthOptions()); + return [ + 'column_widths' => array_shift($width_classes), + ]; + } + + /** + * {@inheritdoc} + */ + public function buildConfigurationForm(array $form, FormStateInterface $form_state) { + $form['column_widths'] = [ + '#type' => 'select', + '#title' => $this->t('Column widths'), + '#default_value' => $this->configuration['column_widths'], + '#options' => $this->getWidthOptions(), + '#description' => $this->t('Choose the column widths for this layout.'), + ]; + return $form; + } + + /** + * {@inheritdoc} + */ + public function validateConfigurationForm(array &$form, FormStateInterface $form_state) { + } + + /** + * {@inheritdoc} + */ + public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { + $this->configuration['column_widths'] = $form_state->getValue('column_widths'); + } + + /** + * {@inheritdoc} + */ + public function build(array $regions) { + $build = parent::build($regions); + $build['#attributes']['class'] = [ + 'layout', + $this->getPluginDefinition()->getTemplate(), + $this->getPluginDefinition()->getTemplate() . '--' . $this->configuration['column_widths'], + ]; + return $build; + } + + /** + * Gets the width options for the configuration form. + * + * The first option will be used as the default 'column_widths' configuration + * value. + * + * @return string[] + * The width options array where the keys are strings that will be added to + * the CSS classes and the values are the human readable labels. + */ + abstract protected function getWidthOptions(); + +} diff --git a/core/modules/layout_builder/src/Plugin/Layout/ThreeColumnLayout.php b/core/modules/layout_builder/src/Plugin/Layout/ThreeColumnLayout.php new file mode 100644 index 0000000000000000000000000000000000000000..b42121f78eb335d3ae97b50458694a0959ff7ac7 --- /dev/null +++ b/core/modules/layout_builder/src/Plugin/Layout/ThreeColumnLayout.php @@ -0,0 +1,25 @@ +<?php + +namespace Drupal\layout_builder\Plugin\Layout; + +/** + * Configurable three column layout plugin class. + * + * @internal + * Plugin classes are internal. + */ +class ThreeColumnLayout extends MultiWidthLayoutBase { + + /** + * {@inheritdoc} + */ + protected function getWidthOptions() { + return [ + '25-50-25' => '25%/50%/25%', + '33-34-33' => '33%/34%/33%', + '25-25-50' => '25%/25%/50%', + '50-25-25' => '50%/25%/25%', + ]; + } + +} diff --git a/core/modules/layout_builder/src/Plugin/Layout/TwoColumnLayout.php b/core/modules/layout_builder/src/Plugin/Layout/TwoColumnLayout.php new file mode 100644 index 0000000000000000000000000000000000000000..68296af7d1791c266a83342c76cb94e0d35b0d06 --- /dev/null +++ b/core/modules/layout_builder/src/Plugin/Layout/TwoColumnLayout.php @@ -0,0 +1,26 @@ +<?php + +namespace Drupal\layout_builder\Plugin\Layout; + +/** + * Configurable two column layout plugin class. + * + * @internal + * Plugin classes are internal. + */ +class TwoColumnLayout extends MultiWidthLayoutBase { + + /** + * {@inheritdoc} + */ + protected function getWidthOptions() { + return [ + '50-50' => '50%/50%', + '33-67' => '33%/67%', + '67-33' => '67%/33%', + '25-75' => '25%/75%', + '75-25' => '75%/25%', + ]; + } + +} diff --git a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php index 98277a133d5646e0cf8d1e305585cd599cec7c83..277819e093aa98bd3d25f68f5f2c9a077ac25888 100644 --- a/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php +++ b/core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php @@ -192,8 +192,11 @@ public function testLayoutBuilderUi() { // Add a new section. $this->clickLink('Add Section'); + $this->assertCorrectLayouts(); $assert_session->linkExists('Two column'); $this->clickLink('Two column'); + $assert_session->buttonExists('Add section'); + $page->pressButton('Add section'); $assert_session->linkExists('Save Layout'); $this->clickLink('Save Layout'); $assert_session->pageTextNotContains('The first node body'); @@ -518,7 +521,8 @@ public function testLayoutBuilderChooseBlocksAlter() { $this->clickLink('Add Section', 1); $assert_session->linkExists('Two column'); $this->clickLink('Two column'); - + $assert_session->buttonExists('Add section'); + $this->getSession()->getPage()->pressButton('Add section'); // Add a new block to second section. $this->clickLink('Add Block', 1); @@ -680,4 +684,31 @@ public function testSimpleConfigBasedLayout() { $assert_session->elementsCount('css', '.layout--onecol', 1); } + /** + * Asserts that the correct layouts are available. + */ + protected function assertCorrectLayouts() { + $assert_session = $this->assertSession(); + // Ensure the layouts provided by layout_builder are available. + $expected_layouts_hrefs = [ + 'layout_builder/add/section/overrides/node.1/0/layout_onecol', + 'layout_builder/configure/section/overrides/node.1/0/layout_twocol_section', + 'layout_builder/configure/section/overrides/node.1/0/layout_threecol_section', + 'layout_builder/add/section/overrides/node.1/0/layout_fourcol_section', + ]; + foreach ($expected_layouts_hrefs as $expected_layouts_href) { + $assert_session->linkByHrefExists($expected_layouts_href); + } + // Ensure the layout_discovery module's layouts were removed. + $unexpected_layouts = [ + 'twocol', + 'twocol_bricks', + 'threecol_25_50_25', + 'threecol_33_34_33', + ]; + foreach ($unexpected_layouts as $unexpected_layout) { + $assert_session->linkByHrefNotExists("layout_builder/add/section/overrides/node.1/0/$unexpected_layout"); + } + } + } diff --git a/core/modules/layout_builder/tests/src/FunctionalJavascript/TestMultiWidthLayoutsTest.php b/core/modules/layout_builder/tests/src/FunctionalJavascript/TestMultiWidthLayoutsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2de8a4d07283fe47edd6ef272fd8665e522c8d5c --- /dev/null +++ b/core/modules/layout_builder/tests/src/FunctionalJavascript/TestMultiWidthLayoutsTest.php @@ -0,0 +1,137 @@ +<?php + +namespace Drupal\Tests\layout_builder\FunctionalJavascript; + +use Drupal\FunctionalJavascriptTests\WebDriverTestBase; + +/** + * Test the multi-width layout plugins. + * + * @group layout_builder + */ +class TestMultiWidthLayoutsTest extends WebDriverTestBase { + + /** + * Path prefix for the field UI for the test bundle. + * + * @var string + */ + const FIELD_UI_PREFIX = 'admin/structure/types/manage/bundle_with_section_field'; + + public static $modules = [ + 'layout_builder', + 'block', + 'node', + ]; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + // @todo The Layout Builder UI relies on local tasks; fix in + // https://www.drupal.org/project/drupal/issues/2917777. + $this->drupalPlaceBlock('local_tasks_block'); + + $this->createContentType(['type' => 'bundle_with_section_field']); + + $this->drupalLogin($this->drupalCreateUser([ + 'configure any layout', + 'administer node display', + 'administer node fields', + ])); + } + + /** + * Test changing the columns widths of a multi-width section. + */ + public function testWidthChange() { + $assert_session = $this->assertSession(); + $page = $this->getSession()->getPage(); + + // Enable layout builder. + $this->drupalPostForm( + static::FIELD_UI_PREFIX . '/display/default', + ['layout[enabled]' => TRUE], + 'Save' + ); + + $this->clickLink('Manage layout'); + $assert_session->addressEquals(static::FIELD_UI_PREFIX . '/display-layout/default'); + + $width_options = [ + [ + 'label' => 'Two column', + 'widths' => [ + '50-50', + '33-67', + '67-33', + '25-75', + '75-25', + ], + 'class' => 'layout--twocol-section--', + ], + [ + 'label' => 'Three column', + 'widths' => [ + '25-50-25', + '33-34-33', + '25-25-50', + '50-25-25', + ], + 'class' => 'layout--threecol-section--', + ], + ]; + foreach ($width_options as $width_option) { + $width = array_shift($width_option['widths']); + $assert_session->linkExists('Add Section'); + $page->clickLink('Add Section'); + $this->assertNotEmpty($assert_session->waitForElementVisible('css', "#drupal-off-canvas a:contains(\"{$width_option['label']}\")")); + $page->clickLink($width_option['label']); + $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas input[type="submit"][value="Add section"]')); + $page->pressButton("Add section"); + $this->assertWidthClassApplied($width_option['class'] . $width); + foreach ($width_option['widths'] as $width) { + $width_class = $width_option['class'] . $width; + $assert_session->linkExists('Configure section'); + $page->clickLink('Configure section'); + $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas input[type="submit"][value="Update"]')); + $page->findField('layout_settings[column_widths]')->setValue($width); + $page->pressButton("Update"); + $this->assertWidthClassApplied($width_class); + } + $assert_session->linkExists('Remove section'); + $this->clickLink('Remove section'); + $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#drupal-off-canvas input[type="submit"][value="Remove"]')); + $page->pressButton('Remove'); + $this->waitForNoElement(".$width_class"); + } + } + + /** + * Waits for an element to be removed from the page. + * + * @param string $selector + * CSS selector. + * @param int $timeout + * (optional) Timeout in milliseconds, defaults to 10000. + * + * @todo Remove in https://www.drupal.org/node/2892440. + */ + protected function waitForNoElement($selector, $timeout = 10000) { + $condition = "(typeof jQuery !== 'undefined' && jQuery('$selector').length === 0)"; + $this->assertJsCondition($condition, $timeout); + } + + /** + * Asserts the width class is applied to the first section. + * + * @param string $width_class + * The width class. + */ + protected function assertWidthClassApplied($width_class) { + $this->assertNotEmpty($this->assertSession()->waitForElementVisible('css', ".{$width_class}[data-layout-delta=\"0\"]")); + } + +} diff --git a/core/modules/layout_discovery/layouts/threecol_25_50_25/threecol_25_50_25.css b/core/modules/layout_discovery/layouts/threecol_25_50_25/threecol_25_50_25.css index 1f41f460540bb4d15ebd48af527750f1c9f5fc3d..bcbf766bb44b13f3e1fc9eff631889f7d03edcfb 100644 --- a/core/modules/layout_discovery/layouts/threecol_25_50_25/threecol_25_50_25.css +++ b/core/modules/layout_discovery/layouts/threecol_25_50_25/threecol_25_50_25.css @@ -1,9 +1,6 @@ /* * @file * Provides the layout styles for layout_threecol_25_50_25. - * - * @todo Using display: flex requires https://www.drupal.org/node/2842298 to be - * in before this can be marked as stable. */ .layout--threecol-25-50-25 { display: flex; diff --git a/core/modules/layout_discovery/layouts/threecol_33_34_33/threecol_33_34_33.css b/core/modules/layout_discovery/layouts/threecol_33_34_33/threecol_33_34_33.css index 7f651176789794ac96184b819bd7de6c68c7c0bf..afca9c33f5a945b04120895cbb4b07fce4670b8f 100644 --- a/core/modules/layout_discovery/layouts/threecol_33_34_33/threecol_33_34_33.css +++ b/core/modules/layout_discovery/layouts/threecol_33_34_33/threecol_33_34_33.css @@ -1,9 +1,6 @@ /* * @file * Provides the layout styles for layout_threecol_33_34_33. - * - * @todo Using display: flex requires https://www.drupal.org/node/2842298 to be - * in before this can be marked as stable. */ .layout--threecol-33-34-33 { diff --git a/core/modules/layout_discovery/layouts/twocol/twocol.css b/core/modules/layout_discovery/layouts/twocol/twocol.css index be9b59bb73a94528b58239843fb4531c86a67268..c554c9716eb515a76cb533cfe3c469d052bceac2 100644 --- a/core/modules/layout_discovery/layouts/twocol/twocol.css +++ b/core/modules/layout_discovery/layouts/twocol/twocol.css @@ -1,9 +1,6 @@ /* * @file * Provides the layout styles for layout_twocol. - * - * @todo Using display: flex requires https://www.drupal.org/node/2842298 to be - * in before this can be marked as stable. */ .layout--twocol { diff --git a/core/modules/layout_discovery/layouts/twocol_bricks/twocol_bricks.css b/core/modules/layout_discovery/layouts/twocol_bricks/twocol_bricks.css index c8466aff7da4413b485a340f0226aa48c0aaea98..bb0bf3d64177382ebc4c03bc49aba6c42c352e94 100644 --- a/core/modules/layout_discovery/layouts/twocol_bricks/twocol_bricks.css +++ b/core/modules/layout_discovery/layouts/twocol_bricks/twocol_bricks.css @@ -1,9 +1,6 @@ /* * @file * Provides the layout styles for layout_twocol_bricks. - * - * @todo Using display: flex requires https://www.drupal.org/node/2842298 to be - * in before this can be marked as stable. */ .layout--twocol-bricks {