Move into nested docroot

This commit is contained in:
Rob Davies 2017-02-13 15:31:17 +00:00
parent 83a0d3a149
commit c8b70abde9
13405 changed files with 0 additions and 0 deletions

View file

@ -0,0 +1,6 @@
name: Breakpoint
type: module
description: 'Manage breakpoints and breakpoint groups for responsive designs.'
package: Core
version: VERSION
core: 8.x

View file

@ -0,0 +1,51 @@
<?php
/**
* @file
* Manage breakpoints and breakpoint groups for responsive designs.
*/
use Drupal\Core\Routing\RouteMatchInterface;
/**
* Implements hook_help().
*/
function breakpoint_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.breakpoint':
$output = '';
$output .= '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('The Breakpoint module keeps track of the height, width, and resolution breakpoints where a responsive design needs to change in order to respond to different devices being used to view the site. This module does not have a user interface. For more information, see the <a href=":docs">online documentation for the Breakpoint module</a>.', array(':docs' => 'https://www.drupal.org/documentation/modules/breakpoint')) . '</p>';
$output .= '<h4>' . t('Terminology') . '</h4>';
$output .= '<dl>';
$output .= '<dt>' . t('Breakpoint') . '</dt>';
$output .= '<dd>' . t('A breakpoint separates the height or width of viewports (screens, printers, and other media output types) into steps. For instance, a width breakpoint of 40em creates two steps: one for widths up to 40em and one for widths above 40em. Breakpoints can be used to define when layouts should shift from one form to another, when images should be resized, and other changes that need to respond to changes in viewport height or width.') . '</dd>';
$output .= '<dt>' . t('Media query') . '</dt>';
$output .= '<dd>' . t('<a href=":w3">Media queries</a> are a formal way to encode breakpoints. For instance, a width breakpoint at 40em would be written as the media query "(min-width: 40em)". Breakpoints are really just media queries with some additional meta-data, such as a name and multiplier information.', array(':w3' => 'http://www.w3.org/TR/css3-mediaqueries/')) . '</dd>';
$output .= '<dt>' . t('Resolution multiplier') . '</dt>';
$output .= '<dd>' . t('Resolution multipliers are a measure of the viewport\'s device resolution, defined to be the ratio between the physical pixel size of the active device and the <a href="http://en.wikipedia.org/wiki/Device_independent_pixel">device-independent pixel</a> size. The Breakpoint module defines multipliers of 1, 1.5, and 2; when defining breakpoints, modules and themes can define which multipliers apply to each breakpoint.') . '</dd>';
$output .= '<dt>' . t('Breakpoint group') . '</dt>';
$output .= '<dd>' . t('Breakpoints can be organized into groups. Modules and themes should use groups to separate out breakpoints that are meant to be used for different purposes, such as breakpoints for layouts or breakpoints for image sizing.') . '</dd>';
$output .= '</dl>';
$output .= '<h3>' . t('Uses') . '</h3>';
$output .= '<dl>';
$output .= '<dt>' . t('Defining breakpoints and breakpoint groups') . '</dt>';
$output .= '<dd>' . t('Modules and themes can use the API provided by the Breakpoint module to define breakpoints and breakpoint groups, and to assign resolution multipliers to breakpoints.') . '</dd>';
$output .= '</dl>';
return $output;
}
}
/**
* Implements hook_themes_installed()
*/
function breakpoint_themes_installed($theme_list) {
\Drupal::service('breakpoint.manager')->clearCachedDefinitions();
}
/**
* Implements hook_themes_uninstalled()
*/
function breakpoint_themes_uninstalled($theme_list) {
\Drupal::service('breakpoint.manager')->clearCachedDefinitions();
}

View file

@ -0,0 +1,6 @@
services:
breakpoint.manager:
class: Drupal\breakpoint\BreakpointManager
arguments: ['@module_handler', '@theme_handler', '@cache.discovery', '@string_translation']
tags:
- { name: plugin_manager_cache_clear }

View file

@ -0,0 +1,57 @@
<?php
namespace Drupal\breakpoint;
use Drupal\Core\Plugin\PluginBase;
/**
* Default object used for breakpoint plugins.
*
* @see \Drupal\breakpoint\BreakpointManager
* @see plugin_api
*/
class Breakpoint extends PluginBase implements BreakpointInterface {
/**
* {@inheritdoc}
*/
public function getLabel() {
return $this->t($this->pluginDefinition['label'], array(), array('context' => 'breakpoint'));
}
/**
* {@inheritdoc}
*/
public function getWeight() {
return (int) $this->pluginDefinition['weight'];
}
/**
* {@inheritdoc}
*/
public function getMediaQuery() {
return $this->pluginDefinition['mediaQuery'];
}
/**
* {@inheritdoc}
*/
public function getMultipliers() {
return $this->pluginDefinition['multipliers'];
}
/**
* {@inheritdoc}
*/
public function getProvider() {
return $this->pluginDefinition['provider'];
}
/**
* {@inheritdoc}
*/
public function getGroup() {
return $this->pluginDefinition['group'];
}
}

View file

@ -0,0 +1,58 @@
<?php
namespace Drupal\breakpoint;
/**
* Interface for Breakpoint plugins.
*/
interface BreakpointInterface {
/**
* Returns the translated label.
*
* @return string
* The translated label.
*/
public function getLabel();
/**
* Returns the weight.
*
* @return int
* The weight.
*/
public function getWeight();
/**
* Returns the media query.
*
* @return string
* The media query.
*/
public function getMediaQuery();
/**
* Returns the multipliers.
*
* @return array
* The multipliers.
*/
public function getMultipliers();
/**
* Returns the provider.
*
* @return string
* The provider.
*/
public function getProvider();
/**
* Returns the breakpoint group.
*
* @return string
* The breakpoint group.
*/
public function getGroup();
}

View file

@ -0,0 +1,259 @@
<?php
namespace Drupal\breakpoint;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Extension\ThemeHandlerInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\Core\Plugin\Discovery\ContainerDerivativeDiscoveryDecorator;
use Drupal\Core\Plugin\Discovery\YamlDiscovery;
use Drupal\Core\Plugin\Factory\ContainerFactory;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
/**
* Defines a breakpoint plugin manager to deal with breakpoints.
*
* Extension can define breakpoints in a EXTENSION_NAME.breakpoints.yml file
* contained in the extension's base directory. Each breakpoint has the
* following structure:
* @code
* MACHINE_NAME:
* label: STRING
* mediaQuery: STRING
* weight: INTEGER
* multipliers:
* - STRING
* @endcode
* For example:
* @code
* bartik.mobile:
* label: mobile
* mediaQuery: '(min-width: 0px)'
* weight: 0
* multipliers:
* - 1x
* - 2x
* @endcode
* Optionally a breakpoint can provide a group key. By default an extensions
* breakpoints will be placed in a group labelled with the extension name.
*
* @see \Drupal\breakpoint\Breakpoint
* @see \Drupal\breakpoint\BreakpointInterface
* @see plugin_api
*/
class BreakpointManager extends DefaultPluginManager implements BreakpointManagerInterface {
use StringTranslationTrait;
/**
* {@inheritdoc}
*/
protected $defaults = array(
// Human readable label for breakpoint.
'label' => '',
// The media query for the breakpoint.
'mediaQuery' => '',
// Weight used for ordering breakpoints.
'weight' => 0,
// Breakpoint multipliers.
'multipliers' => array(),
// The breakpoint group.
'group' => '',
// Default class for breakpoint implementations.
'class' => 'Drupal\breakpoint\Breakpoint',
// The plugin id. Set by the plugin system based on the top-level YAML key.
'id' => '',
);
/**
* The theme handler.
*
* @var \Drupal\Core\Extension\ThemeHandlerInterface
*/
protected $themeHandler;
/**
* Static cache of breakpoints keyed by group.
*
* @var array
*/
protected $breakpointsByGroup;
/**
* The plugin instances.
*
* @var array
*/
protected $instances = array();
/**
* Constructs a new BreakpointManager instance.
*
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler.
* @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
* The theme handler.
* @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
* The cache backend.
* @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
* The string translation service.
*/
public function __construct(ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler, CacheBackendInterface $cache_backend, TranslationInterface $string_translation) {
$this->factory = new ContainerFactory($this);
$this->moduleHandler = $module_handler;
$this->themeHandler = $theme_handler;
$this->setStringTranslation($string_translation);
$this->alterInfo('breakpoints');
$this->setCacheBackend($cache_backend, 'breakpoints', array('breakpoints'));
}
/**
* {@inheritdoc}
*/
protected function getDiscovery() {
if (!isset($this->discovery)) {
$this->discovery = new YamlDiscovery('breakpoints', $this->moduleHandler->getModuleDirectories() + $this->themeHandler->getThemeDirectories());
$this->discovery = new ContainerDerivativeDiscoveryDecorator($this->discovery);
}
return $this->discovery;
}
/**
* {@inheritdoc}
*/
public function processDefinition(&$definition, $plugin_id) {
parent::processDefinition($definition, $plugin_id);
// Allow custom groups and therefore more than one group per extension.
if (empty($definition['group'])) {
$definition['group'] = $definition['provider'];
}
// Ensure a 1x multiplier exists.
if (!in_array('1x', $definition['multipliers'])) {
$definition['multipliers'][] = '1x';
}
// Ensure that multipliers are sorted correctly.
sort($definition['multipliers']);
}
/**
* {@inheritdoc}
*/
protected function providerExists($provider) {
return $this->moduleHandler->moduleExists($provider) || $this->themeHandler->themeExists($provider);
}
/**
* {@inheritdoc}
*/
public function getBreakpointsByGroup($group) {
if (!isset($this->breakpointsByGroup[$group])) {
if ($cache = $this->cacheBackend->get($this->cacheKey . ':' . $group)) {
$this->breakpointsByGroup[$group] = $cache->data;
}
else {
$breakpoints = array();
foreach ($this->getDefinitions() as $plugin_id => $plugin_definition) {
if ($plugin_definition['group'] == $group) {
$breakpoints[$plugin_id] = $plugin_definition;
}
}
uasort($breakpoints, array('Drupal\Component\Utility\SortArray', 'sortByWeightElement'));
$this->cacheBackend->set($this->cacheKey . ':' . $group, $breakpoints, Cache::PERMANENT, array('breakpoints'));
$this->breakpointsByGroup[$group] = $breakpoints;
}
}
$instances = array();
foreach ($this->breakpointsByGroup[$group] as $plugin_id => $definition) {
if (!isset($this->instances[$plugin_id])) {
$this->instances[$plugin_id] = $this->createInstance($plugin_id);
}
$instances[$plugin_id] = $this->instances[$plugin_id];
}
return $instances;
}
/**
* {@inheritdoc}
*/
public function getGroups() {
// Use a double colon so as to not clash with the cache for each group.
if ($cache = $this->cacheBackend->get($this->cacheKey . '::groups')) {
$groups = $cache->data;
}
else {
$groups = array();
foreach ($this->getDefinitions() as $plugin_definition) {
if (!isset($groups[$plugin_definition['group']])) {
$groups[$plugin_definition['group']] = $plugin_definition['group'];
}
}
$this->cacheBackend->set($this->cacheKey . '::groups', $groups, Cache::PERMANENT, array('breakpoints'));
}
// Get the labels. This is not cacheable due to translation.
$group_labels = array();
foreach ($groups as $group) {
$group_labels[$group] = $this->getGroupLabel($group);
}
asort($group_labels);
return $group_labels;
}
/**
* {@inheritdoc}
*/
public function getGroupProviders($group) {
$providers = array();
$breakpoints = $this->getBreakpointsByGroup($group);
foreach ($breakpoints as $breakpoint) {
$provider = $breakpoint->getProvider();
$extension = FALSE;
if ($this->moduleHandler->moduleExists($provider)) {
$extension = $this->moduleHandler->getModule($provider);
}
elseif ($this->themeHandler->themeExists($provider)) {
$extension = $this->themeHandler->getTheme($provider);
}
if ($extension) {
$providers[$extension->getName()] = $extension->getType();
}
}
return $providers;
}
/**
* {@inheritdoc}
*/
public function clearCachedDefinitions() {
parent::clearCachedDefinitions();
$this->breakpointsByGroup = NULL;
$this->instances = array();
}
/**
* Gets the label for a breakpoint group.
*
* @param string $group
* The breakpoint group.
*
* @return string
* The label.
*/
protected function getGroupLabel($group) {
// Extension names are not translatable.
if ($this->moduleHandler->moduleExists($group)) {
$label = $this->moduleHandler->getName($group);
}
elseif ($this->themeHandler->themeExists($group)) {
$label = $this->themeHandler->getName($group);
}
else {
// Custom group label that should be translatable.
$label = $this->t($group, array(), array('context' => 'breakpoint'));
}
return $label;
}
}

View file

@ -0,0 +1,41 @@
<?php
namespace Drupal\breakpoint;
/**
* Defines an interface for breakpoint managers.
*/
interface BreakpointManagerInterface {
/**
* Gets breakpoints for the specified group.
*
* @param string $group
* The breakpoint group to retrieve.
*
* @return \Drupal\breakpoint\BreakpointInterface[]
* Array of breakpoint plugins keyed by machine name.
*/
public function getBreakpointsByGroup($group);
/**
* Gets all the existing breakpoint groups.
*
* @return array
* Array of breakpoint group labels. Keyed by group name.
*/
public function getGroups();
/**
* Gets all the providers for the specified breakpoint group.
*
* @param string $group
* The breakpoint group to retrieve.
*
* @return array
* An array keyed by provider name with values of provider type (module or
* theme).
*/
public function getGroupProviders($group);
}

View file

@ -0,0 +1,21 @@
breakpoint_module_test.mobile:
label: mobile
mediaQuery: '(min-width: 0px)'
weight: 0
# Don't include multipliers. A 1x multiplier this will be enforced by default.
breakpoint_module_test.standard:
label: standard
mediaQuery: '(min-width: 560px)'
weight: 1
# Don't include a 1x multiplier this will be enforced by default.
multipliers:
- 2x
# Test providing a breakpoint for group matching the group provided by
# breakpoint_test_theme.
breakpoint_module_test.breakpoint_theme_test.group2.tv:
label: tv
mediaQuery: '(min-width: 6000px)'
weight: 2
multipliers:
- 1x
group: breakpoint_theme_test.group2

View file

@ -0,0 +1,7 @@
name: 'Breakpoint test module'
type: module
description: 'Test module for breakpoint.'
package: Testing
version: VERSION
core: 8.x

View file

@ -0,0 +1,201 @@
<?php
namespace Drupal\Tests\breakpoint\Kernel;
use Drupal\KernelTests\KernelTestBase;
/**
* Tests discovery of breakpoints provided by themes and modules.
*
* @group breakpoint
*/
class BreakpointDiscoveryTest extends KernelTestBase {
/**
* Modules to install.
*
* @var array
*/
public static $modules = array('system', 'breakpoint', 'breakpoint_module_test');
protected function setUp() {
parent::setUp();
\Drupal::service('theme_handler')->install(array('breakpoint_theme_test'));
}
/**
* Test the breakpoint group created for a theme.
*/
public function testThemeBreakpoints() {
// Verify the breakpoint group for breakpoint_theme_test was created.
$expected_breakpoints = array(
'breakpoint_theme_test.mobile' => array(
'label' => 'mobile',
'mediaQuery' => '(min-width: 0px)',
'weight' => 0,
'multipliers' => array(
'1x',
),
'provider' => 'breakpoint_theme_test',
'id' => 'breakpoint_theme_test.mobile',
'group' => 'breakpoint_theme_test',
'class' => 'Drupal\\breakpoint\\Breakpoint',
),
'breakpoint_theme_test.narrow' => array(
'label' => 'narrow',
'mediaQuery' => '(min-width: 560px)',
'weight' => 1,
'multipliers' => array(
'1x',
),
'provider' => 'breakpoint_theme_test',
'id' => 'breakpoint_theme_test.narrow',
'group' => 'breakpoint_theme_test',
'class' => 'Drupal\\breakpoint\\Breakpoint',
),
'breakpoint_theme_test.wide' => array(
'label' => 'wide',
'mediaQuery' => '(min-width: 851px)',
'weight' => 2,
'multipliers' => array(
'1x',
),
'provider' => 'breakpoint_theme_test',
'id' => 'breakpoint_theme_test.wide',
'group' => 'breakpoint_theme_test',
'class' => 'Drupal\\breakpoint\\Breakpoint',
),
'breakpoint_theme_test.tv' => array(
'label' => 'tv',
'mediaQuery' => 'only screen and (min-width: 1220px)',
'weight' => 3,
'multipliers' => array(
'1x',
),
'provider' => 'breakpoint_theme_test',
'id' => 'breakpoint_theme_test.tv',
'group' => 'breakpoint_theme_test',
'class' => 'Drupal\\breakpoint\\Breakpoint',
),
);
$breakpoints = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup('breakpoint_theme_test');
foreach ($expected_breakpoints as $id => $expected_breakpoint) {
$this->assertEqual($expected_breakpoint, $breakpoints[$id]->getPluginDefinition());
}
// Test that the order is as expected.
$this->assertIdentical(array_keys($expected_breakpoints), array_keys($breakpoints));
}
/**
* Test the custom breakpoint group provided by a theme and a module.
*/
public function testCustomBreakpointGroups() {
// Verify the breakpoint group for breakpoint_theme_test.group2 was created.
$expected_breakpoints = array(
'breakpoint_theme_test.group2.narrow' => array(
'label' => 'narrow',
'mediaQuery' => '(min-width: 560px)',
'weight' => 0,
'multipliers' => array(
'1x',
'2x',
),
'provider' => 'breakpoint_theme_test',
'id' => 'breakpoint_theme_test.group2.narrow',
'group' => 'breakpoint_theme_test.group2',
'class' => 'Drupal\\breakpoint\\Breakpoint',
),
'breakpoint_theme_test.group2.wide' => array(
'label' => 'wide',
'mediaQuery' => '(min-width: 851px)',
'weight' => 1,
'multipliers' => array(
'1x',
'2x',
),
'provider' => 'breakpoint_theme_test',
'id' => 'breakpoint_theme_test.group2.wide',
'group' => 'breakpoint_theme_test.group2',
'class' => 'Drupal\\breakpoint\\Breakpoint',
),
'breakpoint_module_test.breakpoint_theme_test.group2.tv' => array(
'label' => 'tv',
'mediaQuery' => '(min-width: 6000px)',
'weight' => 2,
'multipliers' => array(
'1x',
),
'provider' => 'breakpoint_module_test',
'id' => 'breakpoint_module_test.breakpoint_theme_test.group2.tv',
'group' => 'breakpoint_theme_test.group2',
'class' => 'Drupal\\breakpoint\\Breakpoint',
),
);
$breakpoints = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup('breakpoint_theme_test.group2');
foreach ($expected_breakpoints as $id => $expected_breakpoint) {
$this->assertEqual($expected_breakpoint, $breakpoints[$id]->getPluginDefinition());
}
}
/**
* Test the breakpoint group created for a module.
*/
public function testModuleBreakpoints() {
$expected_breakpoints = array(
'breakpoint_module_test.mobile' => array(
'label' => 'mobile',
'mediaQuery' => '(min-width: 0px)',
'weight' => 0,
'multipliers' => array(
'1x',
),
'provider' => 'breakpoint_module_test',
'id' => 'breakpoint_module_test.mobile',
'group' => 'breakpoint_module_test',
'class' => 'Drupal\\breakpoint\\Breakpoint',
),
'breakpoint_module_test.standard' => array(
'label' => 'standard',
'mediaQuery' => '(min-width: 560px)',
'weight' => 1,
'multipliers' => array(
'1x',
'2x',
),
'provider' => 'breakpoint_module_test',
'id' => 'breakpoint_module_test.standard',
'group' => 'breakpoint_module_test',
'class' => 'Drupal\\breakpoint\\Breakpoint',
),
);
$breakpoints = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup('breakpoint_module_test');
$this->assertEqual(array_keys($expected_breakpoints), array_keys($breakpoints));
}
/**
* Test the collection of breakpoint groups.
*/
public function testBreakpointGroups() {
$expected = array(
'bartik' => 'Bartik',
'breakpoint_module_test' => 'Breakpoint test module',
'breakpoint_theme_test' => 'Breakpoint test theme',
'breakpoint_theme_test.group2' => 'breakpoint_theme_test.group2',
);
$breakpoint_groups = \Drupal::service('breakpoint.manager')->getGroups();
// Ensure the order is as expected. Should be sorted by label.
$this->assertIdentical($expected, $this->castSafeStrings($breakpoint_groups));
$expected = array(
'breakpoint_theme_test' => 'theme',
'breakpoint_module_test' => 'module',
);
$breakpoint_group_providers = \Drupal::service('breakpoint.manager')->getGroupProviders('breakpoint_theme_test.group2');
$this->assertEqual($expected, $breakpoint_group_providers);
}
}

View file

@ -0,0 +1,114 @@
<?php
namespace Drupal\Tests\breakpoint\Unit;
use Drupal\breakpoint\Breakpoint;
use Drupal\Tests\UnitTestCase;
use Drupal\Core\StringTranslation\TranslatableMarkup;
/**
* @coversDefaultClass \Drupal\breakpoint\Breakpoint
* @group Breakpoint
*/
class BreakpointTest extends UnitTestCase {
/**
* The used plugin ID.
*
* @var string
*/
protected $pluginId = 'breakpoint';
/**
* The used plugin definition.
*
* @var array
*/
protected $pluginDefinition = array(
'id' => 'breakpoint',
);
/**
* The breakpoint under test.
*
* @var \Drupal\breakpoint\Breakpoint
*/
protected $breakpoint;
/**
* The mocked translator.
*
* @var \Drupal\Core\StringTranslation\TranslationInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $stringTranslation;
protected function setUp() {
parent::setUp();
$this->stringTranslation = $this->getMock('Drupal\Core\StringTranslation\TranslationInterface');
}
/**
* Sets up the breakpoint defaults.
*/
protected function setupBreakpoint() {
$this->breakpoint = new Breakpoint(array(), $this->pluginId, $this->pluginDefinition);
$this->breakpoint->setStringTranslation($this->stringTranslation);
}
/**
* @covers ::getLabel
*/
public function testGetLabel() {
$this->pluginDefinition['label'] = 'Test label';
$this->setupBreakpoint();
$this->assertEquals(new TranslatableMarkup('Test label', array(), array('context' => 'breakpoint'), $this->stringTranslation), $this->breakpoint->getLabel());
}
/**
* @covers ::getWeight
*/
public function testGetWeight() {
$this->pluginDefinition['weight'] = '4';
$this->setupBreakpoint();
// Assert that the type returned in an integer.
$this->assertSame(4, $this->breakpoint->getWeight());
}
/**
* @covers ::getMediaQuery
*/
public function testGetMediaQuery() {
$this->pluginDefinition['mediaQuery'] = 'only screen and (min-width: 1220px)';
$this->setupBreakpoint();
$this->assertEquals('only screen and (min-width: 1220px)', $this->breakpoint->getMediaQuery());
}
/**
* @covers ::getMultipliers
*/
public function testGetMultipliers() {
$this->pluginDefinition['multipliers'] = array('1x', '2x');
$this->setupBreakpoint();
$this->assertSame(array('1x', '2x'), $this->breakpoint->getMultipliers());
}
/**
* @covers ::getProvider
*/
public function testGetProvider() {
$this->pluginDefinition['provider'] = 'Breakpoint';
$this->setupBreakpoint();
$this->assertEquals('Breakpoint', $this->breakpoint->getProvider());
}
/**
* @covers ::getGroup
*/
public function testGetGroup() {
$this->pluginDefinition['group'] = 'Breakpoint';
$this->setupBreakpoint();
$this->assertEquals('Breakpoint', $this->breakpoint->getGroup());
}
}

View file

@ -0,0 +1,41 @@
breakpoint_theme_test.mobile:
label: mobile
mediaQuery: '(min-width: 0px)'
weight: 0
multipliers:
- 1x
breakpoint_theme_test.narrow:
label: narrow
mediaQuery: '(min-width: 560px)'
weight: 1
multipliers:
- 1x
# Out of order breakpoint to test sorting.
breakpoint_theme_test.tv:
label: tv
mediaQuery: 'only screen and (min-width: 1220px)'
weight: 3
multipliers:
- 1x
breakpoint_theme_test.wide:
label: wide
mediaQuery: '(min-width: 851px)'
weight: 2
multipliers:
- 1x
breakpoint_theme_test.group2.narrow:
label: narrow
mediaQuery: '(min-width: 560px)'
weight: 0
multipliers:
- 1x
- 2x
group: breakpoint_theme_test.group2
breakpoint_theme_test.group2.wide:
label: wide
mediaQuery: '(min-width: 851px)'
weight: 1
multipliers:
- 1x
- 2x
group: breakpoint_theme_test.group2

View file

@ -0,0 +1,6 @@
name: 'Breakpoint test theme'
type: theme
description: 'Test theme for breakpoint.'
version: VERSION
core: 8.x
base theme: bartik