From e0a0b76f827d46aeddc137ff5e65de23f057bc6e Mon Sep 17 00:00:00 2001
From: webchick <webchick@24967.no-reply.drupal.org>
Date: Tue, 19 Nov 2013 18:59:45 -0800
Subject: [PATCH] Issue #1851018 by alexpott, attiks, xjm: Improve breakpoint
 configuration implementation.

---
 core/includes/theme.inc                       |  14 +-
 core/modules/breakpoint/breakpoint.install    |  20 --
 core/modules/breakpoint/breakpoint.module     | 205 ------------------
 .../breakpoint/config/breakpoint.settings.yml |   4 -
 .../config/schema/breakpoint.schema.yml       |  12 -
 .../breakpoint/BreakpointGroupInterface.php   |  24 +-
 .../breakpoint/Entity/BreakpointGroup.php     |  93 +++++---
 .../Tests/BreakpointGroupCRUDTest.php         |   3 +-
 .../Tests/BreakpointGroupTestBase.php         |   4 +-
 .../breakpoint/Tests/BreakpointThemeTest.php  |  61 ++----
 ...reakpoint_theme_test.breakpoint_groups.yml |   6 -
 ...int.theme.breakpoint_test_theme.mobile.yml |  12 +
 ...int.theme.breakpoint_test_theme.narrow.yml |  12 +
 ...akpoint.theme.breakpoint_test_theme.tv.yml |  12 +
 ...point.theme.breakpoint_test_theme.wide.yml |  12 +
 ...point_test_theme.breakpoint_test_theme.yml |  13 ++
 ...group.theme.breakpoint_test_theme.test.yml |  12 +
 ...reakpoint_test_theme.breakpoint_groups.yml |   6 -
 .../breakpoint_test_theme.breakpoints.yml     |   4 -
 .../Drupal/picture/Entity/PictureMapping.php  |   2 +-
 .../picture/PictureMappingFormController.php  |   3 +-
 .../Field/FieldFormatter/PictureFormatter.php |   5 +-
 .../picture/Tests/PictureAdminUITest.php      |   2 +-
 .../picture/Tests/PictureFieldDisplayTest.php |   2 +-
 ...point.breakpoint.module.toolbar.narrow.yml |  12 +
 ...int.breakpoint.module.toolbar.standard.yml |  12 +
 ...akpoint.breakpoint.module.toolbar.wide.yml |  12 +
 ...reakpoint_group.module.toolbar.toolbar.yml |  12 +
 .../toolbar/config/schema/toolbar.schema.yml  |  25 ---
 .../toolbar/config/toolbar.breakpoints.yml    |   3 -
 .../toolbar/config/toolbar.settings.yml       |   4 -
 core/modules/toolbar/toolbar.module           |   2 +-
 .../bartik/config/bartik.breakpoints.yml      |   3 -
 ...akpoint.breakpoint.theme.bartik.mobile.yml |  12 +
 ...akpoint.breakpoint.theme.bartik.narrow.yml |  12 +
 ...reakpoint.breakpoint.theme.bartik.wide.yml |  12 +
 ...t.breakpoint_group.theme.bartik.bartik.yml |  12 +
 37 files changed, 284 insertions(+), 392 deletions(-)
 delete mode 100644 core/modules/breakpoint/breakpoint.install
 delete mode 100644 core/modules/breakpoint/config/breakpoint.settings.yml
 delete mode 100644 core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml
 create mode 100644 core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.mobile.yml
 create mode 100644 core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.narrow.yml
 create mode 100644 core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.tv.yml
 create mode 100644 core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.wide.yml
 create mode 100644 core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.breakpoint_test_theme.yml
 create mode 100644 core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.test.yml
 delete mode 100644 core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml
 delete mode 100644 core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoints.yml
 create mode 100644 core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.narrow.yml
 create mode 100644 core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.standard.yml
 create mode 100644 core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.wide.yml
 create mode 100644 core/modules/toolbar/config/breakpoint.breakpoint_group.module.toolbar.toolbar.yml
 delete mode 100644 core/modules/toolbar/config/schema/toolbar.schema.yml
 delete mode 100644 core/modules/toolbar/config/toolbar.breakpoints.yml
 delete mode 100644 core/modules/toolbar/config/toolbar.settings.yml
 delete mode 100644 core/themes/bartik/config/bartik.breakpoints.yml
 create mode 100644 core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml
 create mode 100644 core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.narrow.yml
 create mode 100644 core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.wide.yml
 create mode 100644 core/themes/bartik/config/breakpoint.breakpoint_group.theme.bartik.bartik.yml

diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 07fda79d6ab5..e6326d8b0d0d 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -363,17 +363,11 @@ function list_themes($refresh = FALSE) {
     $list = array();
     // Extract from the database only when it is available.
     // Also check that the site is not in the middle of an install or update.
-    if (!defined('MAINTENANCE_MODE')) {
-      try {
-        $themes = system_list('theme');
-      }
-      catch (Exception $e) {
-        // If the database is not available, rebuild the theme data.
-        $themes = _system_rebuild_theme_data();
-      }
+    try {
+      $themes = system_list('theme');
     }
-    else {
-      // Scan the installation when the database should not be read.
+    catch (Exception $e) {
+      // If the database is not available, rebuild the theme data.
       $themes = _system_rebuild_theme_data();
     }
 
diff --git a/core/modules/breakpoint/breakpoint.install b/core/modules/breakpoint/breakpoint.install
deleted file mode 100644
index 7ee26037e8c8..000000000000
--- a/core/modules/breakpoint/breakpoint.install
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-/**
- * @file
- * Enable, install, update and uninstall functions for the breakpoint module.
- */
-
-/**
- * Implements hook_install().
- *
- * Import breakpoints from all enabled themes.
- */
-function breakpoint_install() {
-  // Import breakpoints from enabled themes.
-  $themes = array_filter(list_themes(), function ($theme) {return $theme->status;});
-  _breakpoint_theme_enabled(array_keys($themes));
-
-  // Import breakpoints from modules.
-  _breakpoint_modules_installed(array_keys(\Drupal::moduleHandler()->getModuleList()));
-}
diff --git a/core/modules/breakpoint/breakpoint.module b/core/modules/breakpoint/breakpoint.module
index d502691ffd42..a2450f9a8fb8 100644
--- a/core/modules/breakpoint/breakpoint.module
+++ b/core/modules/breakpoint/breakpoint.module
@@ -33,20 +33,6 @@ function breakpoint_help($path, $arg) {
   }
 }
 
-/**
- * Implements hook_themes_enabled().
- *
- * @param array $theme_list
- *   An array of theme names.
- *
- * @see _breakpoint_theme_enabled()
- *
- * @todo: This should be removed if https://drupal.org/node/1813110 is resolved.
- */
-function breakpoint_themes_enabled($theme_list) {
-  _breakpoint_theme_enabled($theme_list);
-}
-
 /**
  * Implements hook_themes_disabled().
  *
@@ -61,20 +47,6 @@ function breakpoint_themes_disabled($theme_list) {
   _breakpoint_delete_breakpoints($theme_list, Breakpoint::SOURCE_TYPE_THEME);
 }
 
-/**
- * Implements hook_modules_installed().
- *
- * @param array $modules
- *   An array of the modules that were enabled.
- *
- * @see _breakpoint_modules_enabled()
- *
- * @todo: This should be removed if https://drupal.org/node/1813110 is resolved.
- */
-function breakpoint_modules_installed($modules) {
-  _breakpoint_modules_installed($modules);
-}
-
 /**
  * Implements hook_modules_uninstalled().
  *
@@ -89,91 +61,6 @@ function breakpoint_modules_uninstalled($modules) {
   _breakpoint_delete_breakpoints($modules, Breakpoint::SOURCE_TYPE_MODULE);
 }
 
-/**
- * Import breakpoints from all new enabled themes.
- *
- * @param array $theme_list
- *   An array of theme names.
- */
-function _breakpoint_theme_enabled($theme_list) {
-  $themes = list_themes();
-  foreach ($theme_list as $theme_key) {
-    $media_queries = breakpoint_get_theme_media_queries($theme_key);
-    _breakpoint_import_media_queries($theme_key, $themes[$theme_key]->info['name'], Breakpoint::SOURCE_TYPE_THEME, $media_queries);
-    // Import custom groups.
-    _breakpoint_import_breakpoint_groups($theme_key, Breakpoint::SOURCE_TYPE_THEME);
-  }
-}
-
-/**
- * Import breakpoints from all new installed modules.
- *
- * @param array $modules
- *   An array of the modules that were installed.
- */
-function _breakpoint_modules_installed($modules) {
-  foreach ($modules as $module) {
-    $media_queries = breakpoint_get_module_media_queries($module);
-    _breakpoint_import_media_queries($module, $module, Breakpoint::SOURCE_TYPE_MODULE, $media_queries);
-    // Import custom groups.
-    _breakpoint_import_breakpoint_groups($module, Breakpoint::SOURCE_TYPE_MODULE);
-  }
-}
-
-/**
- * Import media queries from a theme or module and create a default group.
- *
- * @param string $group_name
- *   Machine readable name of the breakpoint group.
- * @param string $label
- *   Human readable name of the breakpoint group.
- * @param string $source_type
- *   Either Breakpoint::SOURCE_TYPE_THEME or Breakpoint::SOURCE_TYPE_MODULE.
- * @param array $media_queries
- *   An array of breakpoints in the form $breakpoint['name'] = 'media query'.
- */
-function _breakpoint_import_media_queries($group_name, $label, $source_type, $media_queries) {
-  if (!empty($media_queries)) {
-    // Create a new breakpoint group if it doesn't exist.
-    $breakpoint_group = _breakpoint_group_create_or_load($group_name, $label, $group_name, $source_type);
-
-    // Load all media queries, create a breakpoint for each one and add them
-    // to this breakpoint group.
-    foreach ($media_queries as $name => $media_query) {
-      $breakpoint_group->addBreakpointFromMediaQuery($name, $media_query);
-    }
-
-    $breakpoint_group->save();
-  }
-}
-
-/**
- * Import breakpoint groups from theme or module.
- *
- * @param string $source
- *   The theme or module name
- * @param string $source_type
- *   Either Breakpoint::SOURCE_TYPE_THEME or Breakpoint::SOURCE_TYPE_MODULE.
- */
-function _breakpoint_import_breakpoint_groups($source, $source_type) {
-  $breakpoint_groups = \Drupal::config($source . '.breakpoint_groups');
-  if ($breakpoint_groups) {
-    foreach ($breakpoint_groups->get() as $group_name => $data) {
-      // Breakpoints is mandatory, extra check since this is coming from config.
-      if (isset($data['breakpoints']) && !empty($data['breakpoints'])) {
-        // Create a new breakpoint group if it doesn't exist.
-        $breakpoint_group = _breakpoint_group_create_or_load($group_name, isset($data['label']) ? $data['label'] : $group_name, $source, $source_type);
-        // Add the breakpoints.
-        $breakpoint_group->addBreakpoints($data['breakpoints']);
-        $breakpoint_group->save();
-      }
-      else {
-        throw new \Exception('Illegal config file detected.');
-      }
-    }
-  }
-}
-
 /**
  * Remove breakpoints from all disabled themes or uninstalled modules.
  *
@@ -245,65 +132,6 @@ function _breakpoint_delete_breakpoint_groups($group_id, $source_type) {
   }
 }
 
-/**
- * Get a list of available breakpoints from a specified theme.
- *
- * @param string $theme_key
- *   The name of the theme.
- *
- * @return array
- *   An array of breakpoints in the form $breakpoint['name'] = 'media query'.
- */
-function breakpoint_get_theme_media_queries($theme_key) {
-  $themes = list_themes();
-  if (!isset($themes[$theme_key])) {
-    throw new \Exception('Illegal theme_key passed.');
-  }
-
-  $config = \Drupal::config($theme_key . '.breakpoints');
-  if ($config) {
-    return $config->get();
-  }
-  return array();
-}
-
-/**
- * Get a list of available breakpoints from a specified module.
- *
- * @param string $module
- *   The name of the module.
- *
- * @return array
- *   An array of breakpoints in the form $breakpoint['name'] = 'media query'.
- */
-function breakpoint_get_module_media_queries($module) {
-  if (!\Drupal::moduleHandler()->moduleExists($module)) {
-    throw new \Exception('Illegal module name passed.');
-  }
-
-  $config = \Drupal::config($module . '.breakpoints');
-  if ($config) {
-    return $config->get();
-  }
-  return array();
-}
-
-/**
- * Load one breakpoint group by its identifier.
- *
- * @param string $id
- *   The id of the breakpoint group to load.
- *
- * @return \Drupal\breakpoint\Entity\BreakpointGroup|null
- *   The breakpoint group, or NULL if there is no entity with the given id.
- *
- * @todo Remove this in a follow-up issue.
- * @see http://drupal.org/node/1798214
- */
-function breakpoint_group_load($id) {
-  return entity_load('breakpoint_group', $id);
-}
-
 /**
  * Load one breakpoint by its identifier.
  *
@@ -351,36 +179,3 @@ function breakpoint_select_options() {
   asort($options);
   return $options;
 }
-
-/**
- * Helper function to easily create/load a breakpoint group.
- *
- * @param string $name
- *   Machine readable name of the breakpoint group.
- * @param string $label
- *   Human readable name of the breakpoint group.
- * @param string $source
- *   Machine readable name of the defining theme or module.
- * @param string $source_type
- *   Either Breakpoint::SOURCE_TYPE_THEME or Breakpoint::SOURCE_TYPE_MODULE.
- *
- * @return \Drupal\breakpoint\Entity\BreakpointGroup
- *
- * @see _breakpoint_import_media_queries()
- * @see _breakpoint_import_breakpoint_groups()
- */
-function _breakpoint_group_create_or_load($name, $label, $source, $source_type) {
-  // Try loading the breakpoint group.
-  $breakpoint_group = entity_load('breakpoint_group', $source_type . '.' . $source . '.' . $name);
-  // Create a new breakpoint group if it doesn't exist.
-  if (!$breakpoint_group) {
-    // Build a new breakpoint group.
-    $breakpoint_group = entity_create('breakpoint_group', array(
-      'name' => $name,
-      'label' => $label,
-      'source' => $source,
-      'sourceType' => $source_type,
-    ));
-  }
-  return $breakpoint_group;
-}
diff --git a/core/modules/breakpoint/config/breakpoint.settings.yml b/core/modules/breakpoint/config/breakpoint.settings.yml
deleted file mode 100644
index 542675f520e5..000000000000
--- a/core/modules/breakpoint/config/breakpoint.settings.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-multipliers:
-  - 1x
-  - 1.5x
-  - 2x
diff --git a/core/modules/breakpoint/config/schema/breakpoint.schema.yml b/core/modules/breakpoint/config/schema/breakpoint.schema.yml
index 0f4184e6fcd7..a2a5d7d4aeeb 100644
--- a/core/modules/breakpoint/config/schema/breakpoint.schema.yml
+++ b/core/modules/breakpoint/config/schema/breakpoint.schema.yml
@@ -1,16 +1,4 @@
 # Schema for the configuration files of the Breakpoint module.
-
-breakpoint.settings:
-  type: mapping
-  label: 'Breakpoint settings'
-  mapping:
-    multipliers:
-      type: sequence
-      label: 'Assigning resolution multipliers to breakpoints'
-      sequence:
-        - type: string
-          label: 'Multiplier'
-
 breakpoint.breakpoint.*.*.*:
   type: mapping
   label: 'Defines the Breakpoint entity'
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroupInterface.php b/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroupInterface.php
index 59833ff74e98..3bb877b525e6 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroupInterface.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/BreakpointGroupInterface.php
@@ -41,8 +41,30 @@ public function addBreakpointFromMediaQuery($name, $media_query);
    * The breakpoint name is either the machine_name or the ID of a breakpoint.
    *
    * @param array $breakpoints
-   *   Array containing breakpoints keyed by their ID.
+   *   Array containing breakpoint objects
+   *
+   * @return \Drupal\breakpoint\Entity\BreakpointGroup
+   *   The breakpoint group object.
    */
   public function addBreakpoints($breakpoints);
 
+  /**
+   * Gets the array of breakpoints for the breakpoint group.
+   *
+   * @return array
+   *   The array of breakpoints for the breakpoint group.
+   */
+  public function getBreakpoints();
+
+  /**
+   * Gets a breakpoint from the breakpoint group by ID.
+   *
+   * @param string $id
+   *   The breakpoint ID to get.
+   *
+   * @return \Drupal\breakpoint\Entity\Breakpoint|boolean
+   *   The breakpoint or FALSE if not in the Breakpoint group.
+   */
+  public function getBreakpointById($id);
+
 }
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php
index 5f32b5ee118c..61c1ea6881ea 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php
@@ -61,15 +61,25 @@ class BreakpointGroup extends ConfigEntityBase implements BreakpointGroupInterfa
    */
   public $label;
 
+  /**
+   * The breakpoint group breakpoint IDs.
+   *
+   * @var array
+   *   Array containing all breakpoints IDs of this group.
+   *
+   * @see \Drupal\breakpoint\Entity\Breakpoint
+   */
+  protected $breakpoint_ids = array();
+
   /**
    * The breakpoint group breakpoints.
    *
    * @var array
-   *   Array containing all breakpoints of this group.
+   *   Array containing all breakpoints objects of this group.
    *
    * @see \Drupal\breakpoint\Entity\Breakpoint
    */
-  public $breakpoints = array();
+  protected $breakpoints = array();
 
   /**
    * The breakpoint group source: theme or module name. Use 'user' for
@@ -97,7 +107,6 @@ class BreakpointGroup extends ConfigEntityBase implements BreakpointGroupInterfa
    */
   public function __construct(array $values, $entity_type) {
     parent::__construct($values, $entity_type);
-    $this->loadAllBreakpoints();
   }
 
   /**
@@ -111,10 +120,7 @@ public function save() {
     if (empty($this->id)) {
       $this->id = $this->sourceType . '.' . $this->source . '.' . $this->name;
     }
-    // Only save the keys, but return the full objects.
-    $this->breakpoints = array_keys($this->breakpoints);
     parent::save();
-    $this->loadAllBreakpoints();
   }
 
   /**
@@ -156,47 +162,70 @@ public function addBreakpointFromMediaQuery($name, $media_query) {
         'mediaQuery' => $media_query,
         'source' => $this->name,
         'sourceType' => $this->sourceType,
-        'weight' => count($this->breakpoints),
+        'weight' => count($this->breakpoint_ids),
       ));
       $breakpoint->save();
     }
-    $this->breakpoints[$breakpoint->id()] = $breakpoint;
+    return $this->addBreakpoints(array($breakpoint));
   }
 
   /**
    * {@inheritdoc}
    */
   public function addBreakpoints($breakpoints) {
-    foreach ($breakpoints as $breakpoint_name) {
-      // Check if breakpoint exists, assume $breakpoint_name is a machine name.
-      $breakpoint = entity_load('breakpoint', $this->sourceType . '.' . $this->source . '.' . $breakpoint_name);
-      // If the breakpoint doesn't exist, assume $breakpoint_name is an id.
-      if (!$breakpoint) {
-        $breakpoint = entity_load('breakpoint', $breakpoint_name);
-      }
-      // If the breakpoint doesn't exists, do not add it.
-      if ($breakpoint) {
-        // Add breakpoint to group.
-        $this->breakpoints[$breakpoint->id()] = $breakpoint;
-      }
+    foreach ($breakpoints as $breakpoint) {
+      // Add breakpoint to group.
+      $this->breakpoints[$breakpoint->id()] = $breakpoint;
+      $this->breakpoint_ids[] = $breakpoint->id();
     }
+    return $this;
   }
 
   /**
-   * Loads all breakpoints, remove non-existing ones.
-   *
-   * @return array
-   *   Array containing breakpoints keyed by their id.
-   */
-  protected function loadAllBreakpoints() {
-    $breakpoints = $this->breakpoints;
-    $this->breakpoints = array();
-    foreach ($breakpoints as $breakpoint_id) {
-      $breakpoint = breakpoint_load($breakpoint_id);
-      if ($breakpoint) {
-        $this->breakpoints[$breakpoint_id] = $breakpoint;
+   * {@inheritdoc}
+   */
+  public function getBreakpoints() {
+    if (empty($this->breakpoints)) {
+      foreach ($this->breakpoint_ids as $breakpoint_id) {
+        $breakpoint = breakpoint_load($breakpoint_id);
+        if ($breakpoint) {
+          $this->breakpoints[$breakpoint_id] = $breakpoint;
+        }
       }
     }
+    return $this->breakpoints;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getBreakpointById($id) {
+    $breakpoints = $this->getBreakpoints();
+    if (isset($breakpoints[$id])) {
+      return $breakpoints[$id];
+    }
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getExportProperties() {
+    $names = array(
+      'id',
+      'uuid',
+      'name',
+      'label',
+      'breakpoint_ids',
+      'source',
+      'sourceType',
+      'status',
+      'langcode',
+    );
+    $properties = array();
+    foreach ($names as $name) {
+      $properties[$name] = $this->get($name);
+    }
+    return $properties;
+  }
 }
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupCRUDTest.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupCRUDTest.php
index bd5a2a841ff3..e9eeb007069b 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupCRUDTest.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupCRUDTest.php
@@ -50,8 +50,7 @@ public function testBreakpointGroupCRUD() {
     $this->verifyBreakpointGroup($group);
 
     // Update the breakpoint group.
-    $group->breakpoints = array_keys($breakpoints);
-    $group->save();
+    $group->addBreakpoints($breakpoints)->save();
     $this->verifyBreakpointGroup($group);
 
     // Delete the breakpoint group.
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupTestBase.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupTestBase.php
index 0f7e471788cd..95141e32931b 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupTestBase.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointGroupTestBase.php
@@ -33,7 +33,6 @@ public function verifyBreakpointGroup(BreakpointGroup $group, BreakpointGroup $c
       'label',
       'id',
       'name',
-      'breakpoints',
       'sourceType',
     );
 
@@ -58,5 +57,8 @@ public function verifyBreakpointGroup(BreakpointGroup $group, BreakpointGroup $c
         $this->assertEqual($compare_set->{$property}, $group->{$property}, format_string('breakpoint_group_load: Proper %property: %property1 == %property2 for breakpoint group %group.', $t_args), 'Breakpoint API');
       }
     }
+
+    // Ensure that the breakpoint group has the expected breakpoints.
+    $this->assertEqual(array_keys($compare_set->getBreakpoints()), array_keys($group->getBreakpoints()));
   }
 }
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
index e00af059af15..ed8888190d27 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
+++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointThemeTest.php
@@ -47,12 +47,14 @@ public function testThemeBreakpoints() {
       'sourceType' => Breakpoint::SOURCE_TYPE_THEME,
       'id' => Breakpoint::SOURCE_TYPE_THEME . '.breakpoint_test_theme.breakpoint_test_theme',
     ));
-    $breakpoint_group_obj->breakpoints = array(
-      'theme.breakpoint_test_theme.mobile' => array(),
-      'theme.breakpoint_test_theme.narrow' => array(),
-      'theme.breakpoint_test_theme.wide' => array(),
-      'theme.breakpoint_test_theme.tv' => array(),
-    );
+    $breakpoint_group_obj->addBreakpoints(entity_load_multiple('breakpoint',
+      array(
+        'theme.breakpoint_test_theme.mobile',
+        'theme.breakpoint_test_theme.narrow',
+        'theme.breakpoint_test_theme.wide',
+        'theme.breakpoint_test_theme.tv',
+      )
+    ));
 
     // Verify we can load this breakpoint defined by the theme.
     $this->verifyBreakpointGroup($breakpoint_group_obj);
@@ -74,11 +76,13 @@ public function testThemeBreakpointGroup() {
       'source' => 'breakpoint_test_theme',
       'id' => Breakpoint::SOURCE_TYPE_THEME . '.breakpoint_test_theme.test',
     ));
-    $breakpoint_group_obj->breakpoints = array(
-      'theme.breakpoint_test_theme.mobile' => array('1.5x', '2.x'),
-      'theme.breakpoint_test_theme.narrow' => array(),
-      'theme.breakpoint_test_theme.wide' => array(),
-    );
+    $breakpoint_group_obj->addBreakpoints(entity_load_multiple('breakpoint',
+      array(
+        'theme.breakpoint_test_theme.mobile',
+        'theme.breakpoint_test_theme.narrow',
+        'theme.breakpoint_test_theme.wide',
+      )
+    ));
 
     // Verify we can load this breakpoint defined by the theme.
     $this->verifyBreakpointGroup($breakpoint_group_obj);
@@ -88,39 +92,4 @@ public function testThemeBreakpointGroup() {
     $this->assertFalse(entity_load('breakpoint_group', $breakpoint_group_obj->id()), 'breakpoint_group_load: Loading a deleted breakpoint group returns false.', 'Breakpoint API');
   }
 
-  /**
-   * Test the breakpoints defined by the custom group in the module.
-   */
-  public function testThemeBreakpointGroupModule() {
-    // Call the import manually, since the testbot needs to enable the module
-    // first, otherwise the theme isn't detected.
-    _breakpoint_import_breakpoint_groups('breakpoint_theme_test', Breakpoint::SOURCE_TYPE_MODULE);
-
-    // Verify the breakpoint group 'module_test' was created by
-    // breakpoint_theme_test module.
-    $breakpoint_group_obj = entity_create('breakpoint_group', array(
-      'label' => 'Test Module',
-      'name' => 'module_test',
-      'sourceType' => Breakpoint::SOURCE_TYPE_MODULE,
-      'source' => 'breakpoint_theme_test',
-      'id' => Breakpoint::SOURCE_TYPE_MODULE . '.breakpoint_theme_test.module_test',
-    ));
-    $breakpoint_group_obj->breakpoints = array(
-      'theme.breakpoint_test_theme.mobile' => array(),
-      'theme.breakpoint_test_theme.narrow' => array(),
-      'theme.breakpoint_test_theme.wide' => array(),
-    );
-
-    // Verify we can load this breakpoint defined by the theme.
-    $this->verifyBreakpointGroup($breakpoint_group_obj);
-
-    // Disable the test theme and verify the breakpoint group still exists.
-    theme_disable(array('breakpoint_test_theme'));
-    $this->assertTrue(entity_load('breakpoint_group', $breakpoint_group_obj->id()), 'Breakpoint group still exists if theme is disabled.');
-
-    // Uninstall the test module and verify the breakpoint group is deleted.
-    module_uninstall(array('breakpoint_theme_test'));
-    $this->assertFalse(entity_load('breakpoint_group', $breakpoint_group_obj->id()), 'Breakpoint group is removed if module is uninstalled.');
-  }
-
 }
diff --git a/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml b/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml
deleted file mode 100644
index 4e3e6f0d6079..000000000000
--- a/core/modules/breakpoint/tests/config/breakpoint_theme_test.breakpoint_groups.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-module_test:
-  label: Test Module
-  breakpoints:
-    - theme.breakpoint_test_theme.mobile
-    - theme.breakpoint_test_theme.narrow
-    - theme.breakpoint_test_theme.wide
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.mobile.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.mobile.yml
new file mode 100644
index 000000000000..3f3059571d34
--- /dev/null
+++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.mobile.yml
@@ -0,0 +1,12 @@
+id: theme.breakpoint_test_theme.mobile
+uuid: 3ae8bfe6-496b-478c-a811-17424038f49c
+name: mobile
+label: mobile
+mediaQuery: '(min-width: 0px)'
+source: breakpoint_test_theme
+sourceType: theme
+weight: 0
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.narrow.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.narrow.yml
new file mode 100644
index 000000000000..e0773e32d781
--- /dev/null
+++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.narrow.yml
@@ -0,0 +1,12 @@
+id: theme.breakpoint_test_theme.narrow
+uuid: 1d791b4a-7ccf-4c93-a800-c2bc2594cc62
+name: narrow
+label: narrow
+mediaQuery: '(min-width: 560px)'
+source: breakpoint_test_theme
+sourceType: theme
+weight: 1
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.tv.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.tv.yml
new file mode 100644
index 000000000000..9f4d18913aab
--- /dev/null
+++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.tv.yml
@@ -0,0 +1,12 @@
+id: theme.breakpoint_test_theme.tv
+uuid: e0ffa737-0570-4891-9809-9bce925673ca
+name: tv
+label: tv
+mediaQuery: 'only screen and (min-width: 3456px)'
+source: breakpoint_test_theme
+sourceType: theme
+weight: 3
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.wide.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.wide.yml
new file mode 100644
index 000000000000..112a8e663c3b
--- /dev/null
+++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint.theme.breakpoint_test_theme.wide.yml
@@ -0,0 +1,12 @@
+id: theme.breakpoint_test_theme.wide
+uuid: 1561574d-99f8-48a6-b304-4e2b617673b2
+name: wide
+label: wide
+mediaQuery: '(min-width: 851px)'
+source: breakpoint_test_theme
+sourceType: theme
+weight: 2
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.breakpoint_test_theme.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.breakpoint_test_theme.yml
new file mode 100644
index 000000000000..62ac756bc0e2
--- /dev/null
+++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.breakpoint_test_theme.yml
@@ -0,0 +1,13 @@
+id: theme.breakpoint_test_theme.breakpoint_test_theme
+uuid: 94b96e6e-a032-4b29-8100-efd5bf854fd1
+name: breakpoint_test_theme
+label: 'Breakpoint test theme'
+breakpoint_ids:
+  - theme.breakpoint_test_theme.mobile
+  - theme.breakpoint_test_theme.narrow
+  - theme.breakpoint_test_theme.wide
+  - theme.breakpoint_test_theme.tv
+source: breakpoint_test_theme
+sourceType: theme
+status: true
+langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.test.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.test.yml
new file mode 100644
index 000000000000..e185e7f761ba
--- /dev/null
+++ b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint.breakpoint_group.theme.breakpoint_test_theme.test.yml
@@ -0,0 +1,12 @@
+id: theme.breakpoint_test_theme.test
+uuid: fcc25180-7e18-4149-8962-98d706faa59a
+name: test
+label: 'Test Theme'
+breakpoint_ids:
+  - theme.breakpoint_test_theme.mobile
+  - theme.breakpoint_test_theme.narrow
+  - theme.breakpoint_test_theme.wide
+source: breakpoint_test_theme
+sourceType: theme
+status: true
+langcode: en
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml
deleted file mode 100644
index bde92d8bfb82..000000000000
--- a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoint_groups.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-test:
-  label: Test Theme
-  breakpoints:
-    - mobile
-    - narrow
-    - wide
diff --git a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoints.yml b/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoints.yml
deleted file mode 100644
index 534fbf5b0d9a..000000000000
--- a/core/modules/breakpoint/tests/themes/breakpoint_test_theme/config/breakpoint_test_theme.breakpoints.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-mobile: '(min-width: 0px)'
-narrow: '(min-width: 560px)'
-wide: '(min-width: 851px)'
-tv: 'only screen and (min-width: 3456px)'
diff --git a/core/modules/picture/lib/Drupal/picture/Entity/PictureMapping.php b/core/modules/picture/lib/Drupal/picture/Entity/PictureMapping.php
index 0f056a9f92a5..e6ce43649db2 100644
--- a/core/modules/picture/lib/Drupal/picture/Entity/PictureMapping.php
+++ b/core/modules/picture/lib/Drupal/picture/Entity/PictureMapping.php
@@ -128,7 +128,7 @@ protected function loadAllMappings() {
     $loaded_mappings = $this->mappings;
     $this->mappings = array();
     if ($this->breakpointGroup) {
-      foreach ($this->breakpointGroup->breakpoints as $breakpoint_id => $breakpoint) {
+      foreach ($this->breakpointGroup->getBreakpoints() as $breakpoint_id => $breakpoint) {
         // Get the mapping for the default multiplier.
         $this->mappings[$breakpoint_id]['1x'] = '';
         if (isset($loaded_mappings[$breakpoint_id]['1x'])) {
diff --git a/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php b/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php
index 00f5b9f09a8e..5651ef9bb8ef 100644
--- a/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php
+++ b/core/modules/picture/lib/Drupal/picture/PictureMappingFormController.php
@@ -73,7 +73,8 @@ public function form(array $form, array &$form_state) {
     $image_styles = image_style_options(TRUE);
     foreach ($picture_mapping->mappings as $breakpoint_id => $mapping) {
       foreach ($mapping as $multiplier => $image_style) {
-        $label = $multiplier . ' ' . $picture_mapping->breakpointGroup->breakpoints[$breakpoint_id]->name . ' [' . $picture_mapping->breakpointGroup->breakpoints[$breakpoint_id]->mediaQuery . ']';
+        $breakpoint = $picture_mapping->breakpointGroup->getBreakpointById($breakpoint_id);
+        $label = $multiplier . ' ' . $breakpoint->name . ' [' . $breakpoint->mediaQuery . ']';
         $form['mappings'][$breakpoint_id][$multiplier] = array(
           '#type' => 'select',
           '#title' => check_plain($label),
diff --git a/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php b/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php
index f34b37acb416..a28e5fb19454 100644
--- a/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php
+++ b/core/modules/picture/lib/Drupal/picture/Plugin/Field/FieldFormatter/PictureFormatter.php
@@ -133,9 +133,8 @@ public function viewElements(FieldItemListInterface $items) {
           // Make sure that the breakpoint exists and is enabled.
           // @todo add the following when breakpoint->status is added again:
           // $picture_mapping->breakpointGroup->breakpoints[$breakpoint_name]->status
-          if (isset($picture_mapping->breakpointGroup->breakpoints[$breakpoint_name])) {
-            $breakpoint = $picture_mapping->breakpointGroup->breakpoints[$breakpoint_name];
-
+          $breakpoint = $picture_mapping->breakpointGroup->getBreakpointById($breakpoint_name);
+          if ($breakpoint) {
             // Determine the enabled multipliers.
             $multipliers = array_intersect_key($multipliers, $breakpoint->multipliers);
             foreach ($multipliers as $multiplier => $image_style) {
diff --git a/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php b/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php
index b023fe52e7ee..3b908dbe3c11 100644
--- a/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php
+++ b/core/modules/picture/lib/Drupal/picture/Tests/PictureAdminUITest.php
@@ -67,7 +67,7 @@ public function setUp() {
         ),
       ));
       $breakpoint->save();
-      $breakpoint_group->breakpoints[$breakpoint->id()] = $breakpoint;
+      $breakpoint_group->addBreakpoints(array($breakpoint));
     }
     $breakpoint_group->save();
 
diff --git a/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php b/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php
index c19b63cd4eed..7c11a6fd30e1 100644
--- a/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php
+++ b/core/modules/picture/lib/Drupal/picture/Tests/PictureFieldDisplayTest.php
@@ -77,7 +77,7 @@ public function setUp() {
         ),
       ));
       $breakpoint->save();
-      $breakpoint_group->breakpoints[$breakpoint->id()] = $breakpoint;
+      $breakpoint_group->addBreakpoints(array($breakpoint));
     }
     $breakpoint_group->save();
 
diff --git a/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.narrow.yml b/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.narrow.yml
new file mode 100644
index 000000000000..742e76f7f628
--- /dev/null
+++ b/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.narrow.yml
@@ -0,0 +1,12 @@
+id: module.toolbar.narrow
+uuid: cb5e5f7c-b443-4d0b-ae5e-948ba336a0cb
+name: narrow
+label: narrow
+mediaQuery: 'only screen and (min-width: 16.5em)'
+source: toolbar
+sourceType: module
+weight: 0
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.standard.yml b/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.standard.yml
new file mode 100644
index 000000000000..e5c5c333c0ff
--- /dev/null
+++ b/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.standard.yml
@@ -0,0 +1,12 @@
+id: module.toolbar.standard
+uuid: 19981d7a-2dc3-4b3f-be00-a4d8a7c12c07
+name: standard
+label: standard
+mediaQuery: 'only screen and (min-width: 38.125em)'
+source: toolbar
+sourceType: module
+weight: 1
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.wide.yml b/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.wide.yml
new file mode 100644
index 000000000000..ab5ed2f76bfb
--- /dev/null
+++ b/core/modules/toolbar/config/breakpoint.breakpoint.module.toolbar.wide.yml
@@ -0,0 +1,12 @@
+id: module.toolbar.wide
+uuid: 8797545b-0b39-493d-8c00-b4ae721bf447
+name: wide
+label: wide
+mediaQuery: 'only screen and (min-width: 52em)'
+source: toolbar
+sourceType: module
+weight: 2
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/modules/toolbar/config/breakpoint.breakpoint_group.module.toolbar.toolbar.yml b/core/modules/toolbar/config/breakpoint.breakpoint_group.module.toolbar.toolbar.yml
new file mode 100644
index 000000000000..4d09153df94c
--- /dev/null
+++ b/core/modules/toolbar/config/breakpoint.breakpoint_group.module.toolbar.toolbar.yml
@@ -0,0 +1,12 @@
+id: module.toolbar.toolbar
+uuid: 03945598-b3ae-4ea7-ad25-375b52f6f0a4
+name: toolbar
+label: toolbar
+breakpoint_ids:
+  - module.toolbar.narrow
+  - module.toolbar.standard
+  - module.toolbar.wide
+source: toolbar
+sourceType: module
+status: true
+langcode: en
diff --git a/core/modules/toolbar/config/schema/toolbar.schema.yml b/core/modules/toolbar/config/schema/toolbar.schema.yml
deleted file mode 100644
index c0949f2043cb..000000000000
--- a/core/modules/toolbar/config/schema/toolbar.schema.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-# Schema for the configuration files of the toolbar module.
-
-toolbar.settings:
-  type: mapping
-  label: 'Toolbar settings'
-  mapping:
-    breakpoints:
-      type: sequence
-      label: 'Breakpoints'
-      sequence:
-        - type: string
-
-toolbar.breakpoints:
-  type: mapping
-  label: 'Toolbar breakpoint settings'
-  mapping:
-    narrow:
-      type: string
-      label: 'Narrow'
-    standard:
-      type: string
-      label: 'Standard'
-    wide:
-      type: string
-      label: 'Wide'
diff --git a/core/modules/toolbar/config/toolbar.breakpoints.yml b/core/modules/toolbar/config/toolbar.breakpoints.yml
deleted file mode 100644
index 74b318ebac2e..000000000000
--- a/core/modules/toolbar/config/toolbar.breakpoints.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-narrow: 'only screen and (min-width: 16.5em)'
-standard: 'only screen and (min-width: 38.125em)'
-wide: 'only screen and (min-width: 52em)'
diff --git a/core/modules/toolbar/config/toolbar.settings.yml b/core/modules/toolbar/config/toolbar.settings.yml
deleted file mode 100644
index 1f2de5576b42..000000000000
--- a/core/modules/toolbar/config/toolbar.settings.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-breakpoints:
-  - module.toolbar.narrow
-  - module.toolbar.standard
-  - module.toolbar.wide
diff --git a/core/modules/toolbar/toolbar.module b/core/modules/toolbar/toolbar.module
index 85bfafabbdb9..45610c1b0306 100644
--- a/core/modules/toolbar/toolbar.module
+++ b/core/modules/toolbar/toolbar.module
@@ -192,7 +192,7 @@ function toolbar_pre_render($element) {
       function ($object) {
         return $object->mediaQuery;
       },
-      $breakpoints->breakpoints
+      $breakpoints->getBreakpoints()
     );
 
     $element['#attached']['js'][] = array(
diff --git a/core/themes/bartik/config/bartik.breakpoints.yml b/core/themes/bartik/config/bartik.breakpoints.yml
deleted file mode 100644
index 501f417e18fc..000000000000
--- a/core/themes/bartik/config/bartik.breakpoints.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-mobile: '(min-width: 0px)'
-narrow: 'all and (min-width: 560px) and (max-width: 850px)'
-wide: 'all and (min-width: 851px)'
diff --git a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml
new file mode 100644
index 000000000000..99740ce48627
--- /dev/null
+++ b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml
@@ -0,0 +1,12 @@
+id: theme.bartik.mobile
+uuid: 676e11ac-c254-415a-881c-28786167ed69
+name: mobile
+label: mobile
+mediaQuery: '(min-width: 0px)'
+source: bartik
+sourceType: theme
+weight: 0
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.narrow.yml b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.narrow.yml
new file mode 100644
index 000000000000..26597aea8d78
--- /dev/null
+++ b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.narrow.yml
@@ -0,0 +1,12 @@
+id: theme.bartik.narrow
+uuid: da7ce8eb-f006-4a2f-8557-87ac4f62d5cd
+name: narrow
+label: narrow
+mediaQuery: 'all and (min-width: 560px) and (max-width: 850px)'
+source: bartik
+sourceType: theme
+weight: 1
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.wide.yml b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.wide.yml
new file mode 100644
index 000000000000..90b38db8b6aa
--- /dev/null
+++ b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.wide.yml
@@ -0,0 +1,12 @@
+id: theme.bartik.wide
+uuid: 42288274-fd42-49cc-bb0d-131c13e2b46b
+name: wide
+label: wide
+mediaQuery: 'all and (min-width: 851px)'
+source: bartik
+sourceType: theme
+weight: 2
+multipliers:
+  1x: 1x
+status: true
+langcode: en
diff --git a/core/themes/bartik/config/breakpoint.breakpoint_group.theme.bartik.bartik.yml b/core/themes/bartik/config/breakpoint.breakpoint_group.theme.bartik.bartik.yml
new file mode 100644
index 000000000000..9ae2b82a3481
--- /dev/null
+++ b/core/themes/bartik/config/breakpoint.breakpoint_group.theme.bartik.bartik.yml
@@ -0,0 +1,12 @@
+id: theme.bartik.bartik
+uuid: 7f6492dc-028c-47e9-bb00-c280cc21586c
+name: bartik
+label: Bartik
+breakpoint_ids:
+  - theme.bartik.mobile
+  - theme.bartik.narrow
+  - theme.bartik.wide
+source: bartik
+sourceType: theme
+status: true
+langcode: en
-- 
GitLab