diff --git a/core/core.services.yml b/core/core.services.yml index f371585..7d7a882 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -89,6 +89,11 @@ services: factory_method: get factory_service: config.context.factory arguments: [Drupal\Core\Config\Context\FreeConfigContext] + config.creation_id_generator: + class: Drupal\Core\Config\CreationId + tags: + - { name: persist } + arguments: ['@uuid'] config.factory: class: Drupal\Core\Config\ConfigFactory tags: diff --git a/core/includes/theme.inc b/core/includes/theme.inc index e6326d8..ead0b95 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -1133,6 +1133,8 @@ function theme_enable($theme_list) { drupal_clear_css_cache(); $theme_config = \Drupal::config('system.theme'); $disabled_themes = \Drupal::config('system.theme.disabled'); + $creation_id_generator = \Drupal::service('config.creation_id_generator'); + $creation_id_generator->useStaticPrefix(); foreach ($theme_list as $key) { // Throw an exception if the theme name is too long. if (strlen($key) > DRUPAL_EXTENSION_NAME_MAX_LENGTH) { @@ -1160,6 +1162,7 @@ function theme_enable($theme_list) { // Invoke hook_themes_enabled() after the themes have been enabled. \Drupal::moduleHandler()->invokeAll('themes_enabled', array($theme_list)); + $creation_id_generator->unsetStaticPrefix(); } /** diff --git a/core/lib/Drupal/Core/Config/CreationId.php b/core/lib/Drupal/Core/Config/CreationId.php new file mode 100644 index 0000000..9a7407f --- /dev/null +++ b/core/lib/Drupal/Core/Config/CreationId.php @@ -0,0 +1,99 @@ +uuidGenerator = $uuid_generator; + } + + /** + * {@inheritdoc} + */ + public function useStaticPrefix() { + $this->staticPrefixNestingLevel++; + } + + /** + * {@inheritdoc} + */ + public function getPrefix() { + if ($this->staticPrefixNestingLevel > 0) { + $prefix = $this::STATIC_PREFIX; + } + else { + $prefix = $this->uuidGenerator->generate(); + } + return $prefix; + } + + /** + * {@inheritdoc} + */ + public function generate($id) { + // We need to replace dots in the ids since the uuid is being used in field + // and table names. Without this \Drupal\field\Tests\FieldImportDeleteTest + // does not pass. + return $this->getPrefix() . '__' . str_replace('.', '__', $id); + } + + /** + * {@inheritdoc} + */ + public function unsetStaticPrefix() { + $this->staticPrefixNestingLevel--; + if ($this->staticPrefixNestingLevel < 0) { + throw new ConfigException('Cannot use this method when \Drupal\Core\Config\CreationId::useStaticPrefix() has not been called or \Drupal\Core\Config\CreationId::unsetStaticPrefix() has been called so many times the nesting level is now negative.'); + } + return $this->staticPrefixNestingLevel; + } +} diff --git a/core/lib/Drupal/Core/Config/CreationIdInterface.php b/core/lib/Drupal/Core/Config/CreationIdInterface.php new file mode 100644 index 0000000..ee8857a --- /dev/null +++ b/core/lib/Drupal/Core/Config/CreationIdInterface.php @@ -0,0 +1,52 @@ +idKey = $this->entityInfo['entity_keys']['id']; @@ -107,7 +107,7 @@ public function __construct($entity_type, array $entity_info, ConfigFactory $con $this->configFactory = $config_factory; $this->configStorage = $config_storage; $this->entityQueryFactory = $entity_query_factory; - $this->uuidService = $uuid_service; + $this->creationIdGenerator = $creation_id_generator; } /** @@ -120,7 +120,7 @@ public static function createInstance(ContainerInterface $container, $entity_typ $container->get('config.factory'), $container->get('config.storage'), $container->get('entity.query'), - $container->get('uuid') + $container->get('config.creation_id_generator') ); } @@ -332,12 +332,7 @@ public function create(array $values) { // whether a configuration entity with the same ID (if any) already exists. $entity->enforceIsNew(); - // Assign a new UUID if there is none yet. - if (!isset($entity->{$this->uuidKey})) { - $entity->{$this->uuidKey} = $this->uuidService->generate(); - } $entity->postCreate($this); - // Modules might need to add or change the data initially held by the new // entity object, for instance to fill-in default values. $this->invokeHook('create', $entity); @@ -347,6 +342,11 @@ public function create(array $values) { $entity->{$this->statusKey} = TRUE; } + // Assign a new UUID if there is none yet. + if (!isset($entity->{$this->uuidKey})) { + $entity->{$this->uuidKey} = $this->creationIdGenerator->generate($entity->id()); + } + return $entity; } diff --git a/core/lib/Drupal/Core/Extension/ModuleHandler.php b/core/lib/Drupal/Core/Extension/ModuleHandler.php index 92cf2a4..f0efed8 100644 --- a/core/lib/Drupal/Core/Extension/ModuleHandler.php +++ b/core/lib/Drupal/Core/Extension/ModuleHandler.php @@ -502,6 +502,8 @@ public static function parseDependency($dependency) { * {@inheritdoc} */ public function install(array $module_list, $enable_dependencies = TRUE) { + $creation_id_generator = \Drupal::service('config.creation_id_generator'); + $creation_id_generator->useStaticPrefix(); $module_config = \Drupal::config('system.module'); if ($enable_dependencies) { // Get all module data so we can find dependencies and sort. @@ -658,6 +660,7 @@ public function install(array $module_list, $enable_dependencies = TRUE) { $this->invokeAll('modules_installed', array($modules_installed)); } + $creation_id_generator->unsetStaticPrefix(); return TRUE; } diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/Breakpoint.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/Breakpoint.php index 0736131..6c634d8 100644 --- a/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/Breakpoint.php +++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/Breakpoint.php @@ -8,6 +8,7 @@ namespace Drupal\breakpoint\Entity; use Drupal\Core\Config\Entity\ConfigEntityBase; +use Drupal\Core\Entity\EntityStorageControllerInterface; use Drupal\breakpoint\BreakpointInterface; use Drupal\breakpoint\InvalidBreakpointException; use Drupal\breakpoint\InvalidBreakpointNameException; @@ -119,17 +120,11 @@ class Breakpoint extends ConfigEntityBase implements BreakpointInterface { public $multipliers = array(); /** - * Overrides Drupal\config\ConfigEntityBase::save(). + * {@inheritdoc} */ - public function save() { - // Check if everything is valid. - if (!$this->isValid()) { - throw new InvalidBreakpointException('Invalid data detected.'); - } - - // Build an id if none is set. - // Since a particular name can be used by multiple theme/modules we need - // to make a unique id. + public function postCreate(EntityStorageControllerInterface $storage_controller) { + // Build an id if none is set. Since a particular name can be used by + // multiple theme/modules we need to make a unique id. if (empty($this->id)) { $this->id = $this->sourceType . '.' . $this->source . '.' . $this->name; } @@ -138,6 +133,16 @@ public function save() { if (empty($this->label)) { $this->label = $this->name; } + } + + /** + * Overrides Drupal\config\ConfigEntityBase::save(). + */ + public function save() { + // Check if everything is valid. + if (!$this->isValid()) { + throw new InvalidBreakpointException('Invalid data detected.'); + } // Remove unused multipliers. $this->multipliers = array_filter($this->multipliers); diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php index 61c1ea6..a83a7e6 100644 --- a/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php +++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Entity/BreakpointGroup.php @@ -8,6 +8,7 @@ namespace Drupal\breakpoint\Entity; use Drupal\Core\Config\Entity\ConfigEntityBase; +use Drupal\Core\Entity\EntityStorageControllerInterface; use Drupal\breakpoint\BreakpointGroupInterface; use Drupal\breakpoint\InvalidBreakpointSourceException; use Drupal\breakpoint\InvalidBreakpointSourceTypeException; @@ -110,6 +111,15 @@ public function __construct(array $values, $entity_type) { } /** + * {@inheritdoc} + */ + public function postCreate(EntityStorageControllerInterface $storage_controller) { + if (empty($this->id)) { + $this->id = $this->sourceType . '.' . $this->source . '.' . $this->name; + } + } + + /** * Overrides Drupal\Core\Entity\Entity::save(). */ public function save() { @@ -117,9 +127,6 @@ public function save() { if (!$this->isValid()) { throw new InvalidBreakpointException('Invalid data detected.'); } - if (empty($this->id)) { - $this->id = $this->sourceType . '.' . $this->source . '.' . $this->name; - } parent::save(); } diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointAPITest.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointAPITest.php index 85d0711..49101c3 100644 --- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointAPITest.php +++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointAPITest.php @@ -31,7 +31,7 @@ public static function getInfo() { public function testConfigName() { // Try an invalid sourceType. $breakpoint = entity_create('breakpoint', array( - 'label' => drupal_strtolower($this->randomName()), + 'name' => drupal_strtolower($this->randomName()), 'source' => 'custom_module', 'sourceType' => 'oops', )); @@ -74,8 +74,9 @@ public function testConfigName() { $this->assertTrue($exception, 'breakpoint_config_name: An exception is thrown when an invalid name is entered.'); // Try a valid breakpoint. - $breakpoint->id = ''; - $breakpoint->name = drupal_strtolower($this->randomName()); + $breakpoint = entity_create('breakpoint', array( + 'name' => drupal_strtolower($this->randomName()), + )); $breakpoint->mediaQuery = 'all'; $exception = FALSE; @@ -83,9 +84,10 @@ public function testConfigName() { $breakpoint->save(); } catch (\Exception $e) { + $this->fail($e->getMessage()); $exception = TRUE; } $this->assertFalse($exception, 'breakpoint_config_name: No exception is thrown when a valid breakpoint is passed.'); - $this->assertEqual($breakpoint->id(), Breakpoint::SOURCE_TYPE_USER_DEFINED . '.custom_module.' . $breakpoint->name, 'breakpoint_config_name: A id is set when a valid breakpoint is passed.'); + $this->assertEqual($breakpoint->id(), Breakpoint::SOURCE_TYPE_USER_DEFINED . '.user.' . $breakpoint->name, 'breakpoint_config_name: A id is set when a valid breakpoint is passed.'); } } diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointCRUDTest.php b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointCRUDTest.php index 4358869..92e0b80 100644 --- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointCRUDTest.php +++ b/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointCRUDTest.php @@ -28,7 +28,7 @@ public static function getInfo() { public function testBreakpointCRUD() { // Add a breakpoint with minimum data only. $breakpoint = entity_create('breakpoint', array( - 'label' => drupal_strtolower($this->randomName()), + 'name' => drupal_strtolower($this->randomName()), 'mediaQuery' => '(min-width: 600px)', )); $breakpoint->save(); diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigInstallWebTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigInstallWebTest.php index 3bb7839..fcd425f 100644 --- a/core/modules/config/lib/Drupal/config/Tests/ConfigInstallWebTest.php +++ b/core/modules/config/lib/Drupal/config/Tests/ConfigInstallWebTest.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\config\Tests\ConfigInstallTest. + * Definition of Drupal\config\Tests\ConfigInstallWebTest. */ namespace Drupal\config\Tests; @@ -92,4 +92,44 @@ function testIntegrationModuleReinstallation() { $this->assertIdentical($config_entity->get('label'), 'Customized integration config label'); } + protected function testCreationIdGeneration() { + \Drupal::moduleHandler()->install(array('config_test')); + // Ensure routes provided by the config_test module work. + drupal_flush_all_caches(); + $default_config_entity = entity_load('config_test', 'dotted.default'); + $default_config_entity_creation_id = $default_config_entity->uuid(); + $this->assertEqual($default_config_entity_creation_id, 'static-creation-id__dotted__default'); + + $edit = array( + 'id' => 'test_creation_id', + 'label' => $this->randomName(), + ); + $this->drupalPostForm('admin/structure/config_test/add', $edit, 'Save'); + $custom_config_entity = entity_load('config_test', 'test_creation_id'); + $custom_config_entity_creation_id = $custom_config_entity->uuid(); + $this->assertIdentical(FALSE, strpos($custom_config_entity_creation_id, 'static-creation-id'), "Runtime generated configuration creation hash does not contain ModuleHandler::install"); + + \Drupal::moduleHandler()->uninstall(array('config_test')); + + // Ensure the config entities have been deleted. + $config = \Drupal::config('config_test.dynamic.dotted.default'); + $this->assertIdentical($config->isNew(), TRUE); + $config = \Drupal::config('config_test.dynamic.test_creation_id'); + $this->assertIdentical($config->isNew(), TRUE); + + \Drupal::moduleHandler()->install(array('config_test')); + $default_config_entity = entity_load('config_test', 'dotted.default'); + // Ensure that the creation ID has not changed after uninstalling and + // re-installing. + $this->assertIdentical($default_config_entity_creation_id, $default_config_entity->uuid()); + + $edit = array( + 'id' => 'test_creation_id', + 'label' => $this->randomName(), + ); + $this->drupalPostForm('admin/structure/config_test/add', $edit, 'Save'); + $custom_config_entity = entity_load('config_test', 'test_creation_id'); + $this->assertNotIdentical($custom_config_entity_creation_id, $custom_config_entity->uuid()); + } + } diff --git a/core/modules/field/lib/Drupal/field/FieldInstanceStorageController.php b/core/modules/field/lib/Drupal/field/FieldInstanceStorageController.php index 5d8fa9c..fcf7285 100644 --- a/core/modules/field/lib/Drupal/field/FieldInstanceStorageController.php +++ b/core/modules/field/lib/Drupal/field/FieldInstanceStorageController.php @@ -8,6 +8,7 @@ namespace Drupal\field; use Drupal\Core\Config\Config; +use Drupal\Core\Config\CreationIdInterface; use Drupal\Core\Config\Entity\ConfigStorageController; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\Query\QueryFactory; @@ -62,8 +63,8 @@ class FieldInstanceStorageController extends ConfigStorageController { * The config storage service. * @param \Drupal\Core\Entity\Query\QueryFactory $entity_query_factory * The entity query factory. - * @param \Drupal\Component\Uuid\UuidInterface $uuid_service - * The UUID service. + * @param \Drupal\Core\Config\CreationIdInterface $creation_id_generator + * The configuration creation ID generator. * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager. * @param \Drupal\Core\Extension\ModuleHandler $module_handler @@ -71,8 +72,8 @@ class FieldInstanceStorageController extends ConfigStorageController { * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state * The state key value store. */ - public function __construct($entity_type, array $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, UuidInterface $uuid_service, EntityManagerInterface $entity_manager, ModuleHandler $module_handler, KeyValueStoreInterface $state) { - parent::__construct($entity_type, $entity_info, $config_factory, $config_storage, $entity_query_factory, $uuid_service); + public function __construct($entity_type, array $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, CreationIdInterface $creation_id_generator, EntityManagerInterface $entity_manager, ModuleHandler $module_handler, KeyValueStoreInterface $state) { + parent::__construct($entity_type, $entity_info, $config_factory, $config_storage, $entity_query_factory, $creation_id_generator); $this->entityManager = $entity_manager; $this->moduleHandler = $module_handler; $this->state = $state; @@ -88,7 +89,7 @@ public static function createInstance(ContainerInterface $container, $entity_typ $container->get('config.factory'), $container->get('config.storage'), $container->get('entity.query'), - $container->get('uuid'), + $container->get('config.creation_id_generator'), $container->get('entity.manager'), $container->get('module_handler'), $container->get('state') diff --git a/core/modules/field/lib/Drupal/field/FieldStorageController.php b/core/modules/field/lib/Drupal/field/FieldStorageController.php index 24db2c2..fe567e5 100644 --- a/core/modules/field/lib/Drupal/field/FieldStorageController.php +++ b/core/modules/field/lib/Drupal/field/FieldStorageController.php @@ -7,8 +7,8 @@ namespace Drupal\field; -use Drupal\Component\Uuid\UuidInterface; use Drupal\Core\Config\Config; +use Drupal\Core\Config\CreationIdInterface; use Drupal\Core\Config\Entity\ConfigStorageController; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\Query\QueryFactory; @@ -57,8 +57,8 @@ class FieldStorageController extends ConfigStorageController { * The config storage service. * @param \Drupal\Core\Entity\Query\QueryFactory $entity_query_factory * The entity query factory. - * @param \Drupal\Component\Uuid\UuidInterface $uuid_service - * The UUID service. + * @param \Drupal\Core\Config\CreationIdInterface $creation_id_generator + * The configuration creation ID generator. * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager. * @param \Drupal\Core\Extension\ModuleHandler $module_handler @@ -66,8 +66,8 @@ class FieldStorageController extends ConfigStorageController { * @param \Drupal\Core\KeyValueStore\KeyValueStoreInterface $state * The state key value store. */ - public function __construct($entity_type, array $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, UuidInterface $uuid_service, EntityManagerInterface $entity_manager, ModuleHandler $module_handler, KeyValueStoreInterface $state) { - parent::__construct($entity_type, $entity_info, $config_factory, $config_storage, $entity_query_factory, $uuid_service); + public function __construct($entity_type, array $entity_info, ConfigFactory $config_factory, StorageInterface $config_storage, QueryFactory $entity_query_factory, CreationIdInterface $creation_id_generator, EntityManagerInterface $entity_manager, ModuleHandler $module_handler, KeyValueStoreInterface $state) { + parent::__construct($entity_type, $entity_info, $config_factory, $config_storage, $entity_query_factory, $creation_id_generator); $this->entityManager = $entity_manager; $this->moduleHandler = $module_handler; $this->state = $state; @@ -83,7 +83,7 @@ public static function createInstance(ContainerInterface $container, $entity_typ $container->get('config.factory'), $container->get('config.storage'), $container->get('entity.query'), - $container->get('uuid'), + $container->get('config.creation_id_generator'), $container->get('entity.manager'), $container->get('module_handler'), $container->get('state') diff --git a/core/modules/node/config/views.view.frontpage.yml b/core/modules/node/config/views.view.frontpage.yml index 1a7afa5..c8bf158 100644 --- a/core/modules/node/config/views.view.frontpage.yml +++ b/core/modules/node/config/views.view.frontpage.yml @@ -229,5 +229,4 @@ label: Frontpage module: node id: frontpage tag: default -uuid: 5c8da842-af9f-4a6e-bd00-af738b26ec3c langcode: en diff --git a/core/profiles/standard/lib/Drupal/standard/Tests/StandardTest.php b/core/profiles/standard/lib/Drupal/standard/Tests/StandardTest.php index 9857b83..ec257b6 100644 --- a/core/profiles/standard/lib/Drupal/standard/Tests/StandardTest.php +++ b/core/profiles/standard/lib/Drupal/standard/Tests/StandardTest.php @@ -67,6 +67,10 @@ function testStandard() { $this->drupalLogout(); $this->assertText('Main navigation'); + // Verify the configuration entity creation IDs are as expected when + // created by enabling modules and themes during installation. + $this->assertEqual(entity_load('view', 'frontpage')->uuid(), 'static-creation-id__frontpage'); + $this->assertEqual(entity_load('breakpoint', 'theme.bartik.mobile')->uuid(), 'static-creation-id__theme__bartik__mobile'); } } diff --git a/core/tests/Drupal/Tests/Core/Config/CreationIdTest.php b/core/tests/Drupal/Tests/Core/Config/CreationIdTest.php new file mode 100644 index 0000000..bde46ab --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Config/CreationIdTest.php @@ -0,0 +1,84 @@ + 'Config creation ID test', + 'description' => 'Tests the use of static and UUID prefixes by \Drupal\Core\Config\CreationId.', + 'group' => 'Configuration' + ); + } + + public function testCreationIdNoStaticPrefix() { + $uuid = $this->getMock('Drupal\Component\Uuid\UuidInterface'); + $uuid->expects($this->once()) + ->method('generate') + ->will($this->returnValue('generated-uuid')); + + $creationIdGenerator = new CreationId($uuid); + $this->assertEquals('generated-uuid__test__id', $creationIdGenerator->generate('test.id')); + } + + public function testCreationIdStaticPrefix() { + $uuid = $this->getMock('Drupal\Component\Uuid\UuidInterface'); + $uuid->expects($this->once()) + ->method('generate') + ->will($this->returnValue('generated-uuid')); + + $creationIdGenerator = new CreationId($uuid); + $creationIdGenerator->useStaticPrefix(); + $this->assertEquals('static-creation-id__test__id', $creationIdGenerator->generate('test.id')); + + // Unset the current prefix and ensure that we fallback to using UUID generator. + $creationIdGenerator->unsetStaticPrefix(); + $this->assertEquals('generated-uuid__test__id', $creationIdGenerator->generate('test.id')); + } + + public function testCreationIdNestingStaticPrefix() { + $uuid = $this->getMock('Drupal\Component\Uuid\UuidInterface'); + $uuid->expects($this->once()) + ->method('generate') + ->will($this->returnValue('generated-uuid')); + + $creationIdGenerator = new CreationId($uuid); + $creationIdGenerator->useStaticPrefix(); + $this->assertEquals('static-creation-id__test__id', $creationIdGenerator->generate('test.id')); + + $creationIdGenerator->useStaticPrefix(); + $this->assertEquals('static-creation-id__test__id', $creationIdGenerator->generate('test.id')); + + $nesting_level = $creationIdGenerator->unsetStaticPrefix(); + $this->assertEquals(1, $nesting_level); + $this->assertEquals('static-creation-id__test__id', $creationIdGenerator->generate('test.id')); + + // Unset the current prefix and ensure that we fallback to using UUID generator. + $nesting_level = $creationIdGenerator->unsetStaticPrefix(); + $this->assertEquals(0, $nesting_level); + $this->assertEquals('generated-uuid__test__id', $creationIdGenerator->generate('test.id')); + } + + /** + * @expectedException \Drupal\Core\Config\ConfigException + */ + public function testUnsetPrefixException () { + $uuid = $this->getMock('Drupal\Component\Uuid\UuidInterface'); + $uuid->expects($this->never()) + ->method('generate') + ->will($this->returnValue('generated-uuid')); + + $creationIdGenerator = new CreationId($uuid); + $creationIdGenerator->unsetStaticPrefix(); + } + +} diff --git a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml index 99740ce..7add4c0 100644 --- a/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml +++ b/core/themes/bartik/config/breakpoint.breakpoint.theme.bartik.mobile.yml @@ -1,5 +1,4 @@ id: theme.bartik.mobile -uuid: 676e11ac-c254-415a-881c-28786167ed69 name: mobile label: mobile mediaQuery: '(min-width: 0px)'