diff --git a/README.md b/README.md index 011aaca..ef47dff 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ To run an image reading from two content services (`blog-articles` and `scholarl pages: homepage: path: '/' + primary_listing: 'scholarly-articles/items' content: blog-articles: path: '/blog/{id}' diff --git a/config/packages/dev/libero_page.yaml b/config/packages/dev/libero_page.yaml index 62eb72f..ea475b1 100644 --- a/config/packages/dev/libero_page.yaml +++ b/config/packages/dev/libero_page.yaml @@ -2,6 +2,7 @@ libero_page: pages: homepage: path: '/' + primary_listing: 'scholarly-articles/items' content: blog-articles: path: '/blog/{id}' diff --git a/config/packages/test/libero_page.yaml b/config/packages/test/libero_page.yaml index 62eb72f..2266d80 100644 --- a/config/packages/test/libero_page.yaml +++ b/config/packages/test/libero_page.yaml @@ -2,6 +2,7 @@ libero_page: pages: homepage: path: '/' + primary_listing: 'search' content: blog-articles: path: '/blog/{id}' diff --git a/tests/WebTest.php b/tests/WebTest.php index 8259676..abf4a0f 100644 --- a/tests/WebTest.php +++ b/tests/WebTest.php @@ -17,12 +17,56 @@ public function it_has_a_homepage() : void { $client = static::createClient(); + self::mockApiResponse( + new Request( + 'GET', + 'http://localhost/search', + ['Accept' => 'application/xml'] + ), + new Response( + 200, + [], + << + + + +XML + ) + ); + + self::mockApiResponse( + new Request( + 'GET', + 'http://localhost/scholarly-articles/items/article1/versions/latest', + ['Accept' => 'application/xml'] + ), + new Response( + 200, + [], + << + + + article1 + scholarly-articles + + + article1 + Scholarly article 1 + + +XML + ) + ); + $crawler = $client->request('GET', '/'); $response = $client->getResponse(); $this->assertSame(200, $response->getStatusCode()); $this->assertSame('text/html; charset=UTF-8', $response->headers->get('Content-Type')); $this->assertSame('Site Name', trim($crawler->filter('.content-header__title')->text())); + $this->assertSame('Scholarly article 1', trim($crawler->filter('.teaser__heading')->text())); } /** @@ -45,8 +89,11 @@ public function it_shows_scholarly_articles(string $id) : void << - + {$id} + scholarly-articles + + Scholarly article {$id} @@ -82,8 +129,11 @@ public function it_shows_blog_articles(string $id) : void << + + {$id} + scholarly-articles + - ${id} Blog article ${id} diff --git a/vendor-extra/JatsContentBundle/src/EventListener/BuildView/FrontArticleTitleTeaserListener.php b/vendor-extra/JatsContentBundle/src/EventListener/BuildView/FrontArticleTitleTeaserListener.php new file mode 100644 index 0000000..22eba7a --- /dev/null +++ b/vendor-extra/JatsContentBundle/src/EventListener/BuildView/FrontArticleTitleTeaserListener.php @@ -0,0 +1,60 @@ +converter = $converter; + } + + protected function handle(Element $object, TemplateView $view) : View + { + $heading = $object->ownerDocument->xpath() + ->firstOf( + 'jats:article-meta/jats:title-group/jats:article-title', + $object + ); + + if (!$heading instanceof Element) { + return $view; + } + + return $view + ->withArgument( + 'heading', + $this->converter + ->convert($heading, '@LiberoPatterns/heading.html.twig', $view->getContext()) + ->getArguments() + ); + } + + protected function canHandleTemplate(?string $template) : bool + { + return '@LiberoPatterns/teaser.html.twig' === $template; + } + + protected function canHandleElement(string $element) : bool + { + return '{http://jats.nlm.nih.gov}front' === $element; + } + + protected function canHandleArguments(array $arguments) : bool + { + return !array_has_key($arguments, 'heading'); + } +} diff --git a/vendor-extra/JatsContentBundle/src/EventListener/BuildView/ItemTeaserListener.php b/vendor-extra/JatsContentBundle/src/EventListener/BuildView/ItemTeaserListener.php new file mode 100644 index 0000000..31a9cc0 --- /dev/null +++ b/vendor-extra/JatsContentBundle/src/EventListener/BuildView/ItemTeaserListener.php @@ -0,0 +1,71 @@ +converter = $converter; + } + + public function onBuildView(BuildViewEvent $event) : void + { + $object = $event->getObject(); + $view = $event->getView(); + + if (!$view instanceof TemplateView || !$this->canHandleTemplate($view->getTemplate())) { + return; + } + + if (!$this->canHandleElement(sprintf('{%s}%s', $object->namespaceURI, $object->localName))) { + return; + } + + $handled = $this->handle($object, $view); + + if (!$handled instanceof View) { + return; + } + + $event->setView($handled); + + $event->stopPropagation(); + } + + protected function handle(Element $object, TemplateView $view) : ?View + { + $front = $object->ownerDocument->xpath() + ->firstOf( + '/libero:item/jats:article/jats:front', + $object + ); + + if (!$front instanceof Element) { + return null; + } + + return $this->converter->convert($front, $view->getTemplate(), $view->getContext()); + } + + protected function canHandleTemplate(?string $template) : bool + { + return '@LiberoPatterns/teaser.html.twig' === $template; + } + + protected function canHandleElement(string $element) : bool + { + return '{http://libero.pub}item' === $element; + } +} diff --git a/vendor-extra/JatsContentBundle/src/Resources/config/services.xml b/vendor-extra/JatsContentBundle/src/Resources/config/services.xml index 6b900e5..7b82820 100644 --- a/vendor-extra/JatsContentBundle/src/Resources/config/services.xml +++ b/vendor-extra/JatsContentBundle/src/Resources/config/services.xml @@ -146,6 +146,18 @@ + + + + + + + + + + diff --git a/vendor-extra/JatsContentBundle/tests/EventListener/BuildView/FrontArticleTitleTeaserListenerTest.php b/vendor-extra/JatsContentBundle/tests/EventListener/BuildView/FrontArticleTitleTeaserListenerTest.php new file mode 100644 index 0000000..a02a27e --- /dev/null +++ b/vendor-extra/JatsContentBundle/tests/EventListener/BuildView/FrontArticleTitleTeaserListenerTest.php @@ -0,0 +1,170 @@ +createFailingConverter()); + + $element = $this->loadElement($xml); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + public function nodeProvider() : iterable + { + yield 'different namespace' => ['foo']; + yield 'different element' => ['foo']; + } + + /** + * @test + */ + public function it_does_nothing_if_is_not_the_teaser_template() : void + { + $listener = new FrontArticleTitleTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement( + << + + + + foo + + + +XML + ); + + $event = new BuildViewEvent($element, new TemplateView('template')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('template', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_title_group() : void + { + $listener = new FrontArticleTitleTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_already_a_teaser_heading_set() : void + { + $listener = new FrontArticleTitleTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement( + << + + + + foo + + + +XML + ); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser.html.twig', ['heading' => 'bar']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertSame(['heading' => 'bar'], $view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_sets_the_heading_argument() : void + { + $listener = new FrontArticleTitleTeaserListener($this->createDumpingConverter()); + + $element = $this->loadElement( + << + + + + foo + + + +XML + ); + + $context = ['bar' => 'baz']; + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser.html.twig', [], $context) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEquals( + [ + 'heading' => [ + 'node' => '/jats:front/jats:article-meta/jats:title-group/jats:article-title', + 'template' => '@LiberoPatterns/heading.html.twig', + 'context' => ['bar' => 'baz'], + ], + ], + $view->getArguments() + ); + $this->assertSame(['bar' => 'baz'], $view->getContext()); + } +} diff --git a/vendor-extra/JatsContentBundle/tests/EventListener/BuildView/ItemTeaserListenerTest.php b/vendor-extra/JatsContentBundle/tests/EventListener/BuildView/ItemTeaserListenerTest.php new file mode 100644 index 0000000..9ec6774 --- /dev/null +++ b/vendor-extra/JatsContentBundle/tests/EventListener/BuildView/ItemTeaserListenerTest.php @@ -0,0 +1,158 @@ +createFailingConverter()); + + $element = $this->loadElement($xml); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + public function nodeProvider() : iterable + { + yield 'different namespace' => ['foo']; + yield 'different element' => ['foo']; + } + + /** + * @test + */ + public function it_does_nothing_if_is_not_the_teaser_template() : void + { + $listener = new ItemTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement( + << + + + article1 + scholarly-articles + +
+ + + + foo + + + +
+
+XML + ); + + $event = new BuildViewEvent($element, new TemplateView('template')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('template', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_jats_front() : void + { + $listener = new ItemTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement( + << + + + article1 + scholarly-articles + + +XML + ); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_converts_a_jats_front_into_a_teaser() : void + { + $listener = new ItemTeaserListener($this->createDumpingConverter()); + + $element = $this->loadElement( + << + + + article1 + scholarly-articles + + + + + + foo + + + + + +XML + ); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser.html.twig', [], ['con' => 'text']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame( + [ + 'node' => '/libero:item/jats:article/jats:front', + 'template' => '@LiberoPatterns/teaser.html.twig', + 'context' => ['con' => 'text'], + ], + $view->getArguments() + ); + $this->assertTrue($event->isPropagationStopped()); + } +} diff --git a/vendor-extra/LiberoContentBundle/src/EventListener/BuildView/FrontTitleTeaserListener.php b/vendor-extra/LiberoContentBundle/src/EventListener/BuildView/FrontTitleTeaserListener.php new file mode 100644 index 0000000..030289b --- /dev/null +++ b/vendor-extra/LiberoContentBundle/src/EventListener/BuildView/FrontTitleTeaserListener.php @@ -0,0 +1,56 @@ +converter = $converter; + } + + protected function handle(Element $object, TemplateView $view) : View + { + $title = $object->ownerDocument->xpath() + ->firstOf('libero:title[1]', $object); + + if (!$title instanceof Element) { + return $view; + } + + return $view->withArgument( + 'heading', + $this->converter + ->convert($title, '@LiberoPatterns/heading.html.twig', $view->getContext()) + ->getArguments() + ); + } + + protected function canHandleTemplate(?string $template) : bool + { + return '@LiberoPatterns/teaser.html.twig' === $template; + } + + protected function canHandleElement(string $element) : bool + { + return '{http://libero.pub}front' === $element; + } + + protected function canHandleArguments(array $arguments) : bool + { + return !array_has_key($arguments, 'heading'); + } +} diff --git a/vendor-extra/LiberoContentBundle/src/EventListener/BuildView/ItemTeaserListener.php b/vendor-extra/LiberoContentBundle/src/EventListener/BuildView/ItemTeaserListener.php new file mode 100644 index 0000000..15cb2c9 --- /dev/null +++ b/vendor-extra/LiberoContentBundle/src/EventListener/BuildView/ItemTeaserListener.php @@ -0,0 +1,71 @@ +converter = $converter; + } + + public function onBuildView(BuildViewEvent $event) : void + { + $object = $event->getObject(); + $view = $event->getView(); + + if (!$view instanceof TemplateView || !$this->canHandleTemplate($view->getTemplate())) { + return; + } + + if (!$this->canHandleElement(sprintf('{%s}%s', $object->namespaceURI, $object->localName))) { + return; + } + + $handled = $this->handle($object, $view); + + if (!$handled instanceof View) { + return; + } + + $event->setView($handled); + + $event->stopPropagation(); + } + + protected function handle(Element $object, TemplateView $view) : ?View + { + $front = $object->ownerDocument->xpath() + ->firstOf( + '/libero:item/libero:front', + $object + ); + + if (!$front instanceof Element) { + return null; + } + + return $this->converter->convert($front, $view->getTemplate(), $view->getContext()); + } + + protected function canHandleTemplate(?string $template) : bool + { + return '@LiberoPatterns/teaser.html.twig' === $template; + } + + protected function canHandleElement(string $element) : bool + { + return '{http://libero.pub}item' === $element; + } +} diff --git a/vendor-extra/LiberoContentBundle/src/Resources/config/services.xml b/vendor-extra/LiberoContentBundle/src/Resources/config/services.xml index 393d636..6243e1c 100644 --- a/vendor-extra/LiberoContentBundle/src/Resources/config/services.xml +++ b/vendor-extra/LiberoContentBundle/src/Resources/config/services.xml @@ -26,12 +26,24 @@
+ + + + + + + + + + diff --git a/vendor-extra/LiberoContentBundle/tests/EventListener/BuildView/FrontTitleTeaserListenerTest.php b/vendor-extra/LiberoContentBundle/tests/EventListener/BuildView/FrontTitleTeaserListenerTest.php new file mode 100644 index 0000000..bb1c599 --- /dev/null +++ b/vendor-extra/LiberoContentBundle/tests/EventListener/BuildView/FrontTitleTeaserListenerTest.php @@ -0,0 +1,143 @@ +createFailingConverter()); + + $element = $this->loadElement($xml); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + public function nodeProvider() : iterable + { + yield 'different namespace' => ['foo']; + yield 'different element' => ['foo']; + } + + /** + * @test + */ + public function it_does_nothing_if_is_not_the_teaser_template() : void + { + $listener = new FrontTitleTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement('foo'); + + $event = new BuildViewEvent($element, new TemplateView('template')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('template', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_title() : void + { + $listener = new FrontTitleTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement('foo'); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_already_a_teaser_heading_set() : void + { + $listener = new FrontTitleTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement('foo'); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser.html.twig', ['heading' => 'bar']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertSame(['heading' => 'bar'], $view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_sets_the_heading_argument() : void + { + $listener = new FrontTitleTeaserListener($this->createDumpingConverter()); + + $element = $this->loadElement( + << + foo + +XML + ); + + $context = ['bar' => 'baz']; + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser.html.twig', [], $context) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEquals( + [ + 'heading' => [ + 'node' => '/libero:front/libero:title', + 'template' => '@LiberoPatterns/heading.html.twig', + 'context' => ['bar' => 'baz'], + ], + ], + $view->getArguments() + ); + $this->assertSame(['bar' => 'baz'], $view->getContext()); + } +} diff --git a/vendor-extra/LiberoContentBundle/tests/EventListener/BuildView/ItemTeaserListenerTest.php b/vendor-extra/LiberoContentBundle/tests/EventListener/BuildView/ItemTeaserListenerTest.php new file mode 100644 index 0000000..ffcbcfa --- /dev/null +++ b/vendor-extra/LiberoContentBundle/tests/EventListener/BuildView/ItemTeaserListenerTest.php @@ -0,0 +1,146 @@ +createFailingConverter()); + + $element = $this->loadElement($xml); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + public function nodeProvider() : iterable + { + yield 'different namespace' => ['foo']; + yield 'different element' => ['foo']; + } + + /** + * @test + */ + public function it_does_nothing_if_is_not_the_teaser_template() : void + { + $listener = new ItemTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement( + << + + + article1 + scholarly-articles + + + foo + + +XML + ); + + $event = new BuildViewEvent($element, new TemplateView('template')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('template', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_libero_front() : void + { + $listener = new ItemTeaserListener($this->createFailingConverter()); + + $element = $this->loadElement( + << + + + article1 + scholarly-articles + + +XML + ); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_converts_a_libero_front_into_a_teaser() : void + { + $listener = new ItemTeaserListener($this->createDumpingConverter()); + + $element = $this->loadElement( + << + + + article1 + scholarly-articles + + + foo + + +XML + ); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser.html.twig', [], ['con' => 'text']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame( + [ + 'node' => '/libero:item/libero:front', + 'template' => '@LiberoPatterns/teaser.html.twig', + 'context' => ['con' => 'text'], + ], + $view->getArguments() + ); + $this->assertTrue($event->isPropagationStopped()); + } +} diff --git a/vendor-extra/LiberoPageBundle/src/DependencyInjection/LiberoPageConfiguration.php b/vendor-extra/LiberoPageBundle/src/DependencyInjection/LiberoPageConfiguration.php index 4763358..0793fc8 100644 --- a/vendor-extra/LiberoPageBundle/src/DependencyInjection/LiberoPageConfiguration.php +++ b/vendor-extra/LiberoPageBundle/src/DependencyInjection/LiberoPageConfiguration.php @@ -61,6 +61,9 @@ private function getHomepageDefinition() : ArrayNodeDefinition ->scalarNode('path') ->isRequired() ->end() + ->scalarNode('primary_listing') + ->isRequired() + ->end() ->end() ; return $pagesNode; diff --git a/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemListEmptyListener.php b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemListEmptyListener.php new file mode 100644 index 0000000..dfe01ee --- /dev/null +++ b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemListEmptyListener.php @@ -0,0 +1,50 @@ +translator = $translator; + } + + protected function handle(Element $object, TemplateView $view) : View + { + if (!$view->hasContext('list_empty')) { + return $view; + } + + return $view->withArgument( + 'list', + ['empty' => $this->translate($view->getContext('list_empty'), $view->getContext())] + ); + } + + protected function canHandleTemplate(?string $template) : bool + { + return '@LiberoPatterns/teaser-list.html.twig' === $template; + } + + protected function canHandleElement(string $element) : bool + { + return '{http://libero.pub}item-list' === $element; + } + + protected function canHandleArguments(array $arguments) : bool + { + return !isset($arguments['list']['empty']); + } +} diff --git a/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemListListener.php b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemListListener.php new file mode 100644 index 0000000..d8218c5 --- /dev/null +++ b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemListListener.php @@ -0,0 +1,78 @@ +converter = $converter; + } + + protected function handle(Element $object, TemplateView $view) : View + { + /** @var DOMNodeList $itemRefs */ + $itemRefs = $object('libero:item-ref'); + + if (0 === count($itemRefs)) { + return $view; + } + + $context = $view->getContext(); + unset($context['list_empty']); + + $items = []; + foreach ($itemRefs as $itemRef) { + $items[] = $this->converter->convert($itemRef, '@LiberoPatterns/teaser.html.twig', $context); + } + + return new LazyView( + function () use ($view, $items) { + $list = $view->getArgument('list') ?? []; + $list['items'] = array_map( + function (ArrayAccess $view) { + return ['content' => $view['arguments']]; + }, + $items + ); + + return $view->withArgument('list', $list); + }, + $context + ); + } + + protected function canHandleTemplate(?string $template) : bool + { + return '@LiberoPatterns/teaser-list.html.twig' === $template; + } + + protected function canHandleElement(string $element) : bool + { + return '{http://libero.pub}item-list' === $element; + } + + protected function canHandleArguments(array $arguments) : bool + { + return !isset($arguments['list']['items']); + } +} diff --git a/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemListTitleListener.php b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemListTitleListener.php new file mode 100644 index 0000000..0cefefd --- /dev/null +++ b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemListTitleListener.php @@ -0,0 +1,55 @@ +translator = $translator; + } + + protected function handle(Element $object, TemplateView $view) : View + { + if (!$view->hasContext('list_title')) { + return $view; + } + + $level = $view->getContext()['level'] ?? 1; + + return $view + ->withArgument( + 'title', + ['level' => $level, 'text' => $this->translate($view->getContext('list_title'), $view->getContext())] + ) + ->withContext(['level' => $level + 1]); + } + + protected function canHandleTemplate(?string $template) : bool + { + return '@LiberoPatterns/teaser-list.html.twig' === $template; + } + + protected function canHandleElement(string $element) : bool + { + return '{http://libero.pub}item-list' === $element; + } + + protected function canHandleArguments(array $arguments) : bool + { + return !array_has_key($arguments, 'title'); + } +} diff --git a/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemRefTeaserHrefListener.php b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemRefTeaserHrefListener.php new file mode 100644 index 0000000..f594f6b --- /dev/null +++ b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemRefTeaserHrefListener.php @@ -0,0 +1,56 @@ +urlGenerator = $urlGenerator; + } + + protected function handle(Element $object, TemplateView $view) : View + { + /** @var string $id */ + $id = $object->getAttribute('id'); + /** @var string $service */ + $service = $object->getAttribute('service'); + + if ('' === $id || '' === $service) { + return $view; + } + + return $view->withArgument( + 'href', + $this->urlGenerator->generate("libero.page.content.{$service}", ['id' => $id]) + ); + } + + protected function canHandleTemplate(?string $template) : bool + { + return '@LiberoPatterns/teaser.html.twig' === $template; + } + + protected function canHandleElement(string $element) : bool + { + return '{http://libero.pub}item-ref' === $element; + } + + protected function canHandleArguments(array $arguments) : bool + { + return !array_has_key($arguments, 'href'); + } +} diff --git a/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemRefTeaserListener.php b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemRefTeaserListener.php new file mode 100644 index 0000000..e8dc669 --- /dev/null +++ b/vendor-extra/LiberoPageBundle/src/EventListener/BuildView/ItemRefTeaserListener.php @@ -0,0 +1,83 @@ +client = $client; + $this->converter = $converter; + } + + protected function handle(Element $object, TemplateView $view) : View + { + $service = $object->getAttribute('service'); + $id = $object->getAttribute('id'); + + if (!$service || !$id) { + return $view; + } + + $itemTeaser = $this->client->requestAsync( + 'GET', + "{$service}/items/{$id}/versions/latest", + [ + 'headers' => ['Accept' => 'application/xml'], + 'http_errors' => true, + ] + ) + ->then( + function (ResponseInterface $response) use ($object, $view) : View { + $item = FluentDOM::load((string) $response->getBody()); + $item->namespaces($object->ownerDocument->namespaces()); + + $itemTeaser = $this->converter->convert( + $item->documentElement, + $view->getTemplate(), + $view->getContext() + ); + + if (!$itemTeaser instanceof TemplateView) { + return $itemTeaser; + } + + return $view->withArguments($itemTeaser['arguments'])->withContext($itemTeaser->getContext()); + } + ); + + return new LazyView( + function () use ($itemTeaser) : TemplateView { + return $itemTeaser->wait(); + }, + $view->getContext() + ); + } + + protected function canHandleTemplate(?string $template) : bool + { + return '@LiberoPatterns/teaser.html.twig' === $template; + } + + protected function canHandleElement(string $element) : bool + { + return '{http://libero.pub}item-ref' === $element; + } +} diff --git a/vendor-extra/LiberoPageBundle/src/EventListener/HomepageContentListListener.php b/vendor-extra/LiberoPageBundle/src/EventListener/HomepageContentListListener.php new file mode 100644 index 0000000..5296add --- /dev/null +++ b/vendor-extra/LiberoPageBundle/src/EventListener/HomepageContentListListener.php @@ -0,0 +1,71 @@ +client = $client; + $this->converter = $converter; + } + + public function onLoadPageData(LoadPageDataEvent $event) : void + { + if (!$event->isFor('homepage')) { + return; + } + + $page = $event->getRequest()->attributes->get('libero_page'); + + $list = $this->client + ->requestAsync( + 'GET', + $page['primary_listing'], + [ + 'headers' => ['Accept' => 'application/xml'], + 'http_errors' => true, + ] + ) + ->then( + function (ResponseInterface $response) : Document { + return FluentDOM::load((string) $response->getBody()); + } + ); + + $event->addDocument('content_list', $list); + } + + public function onCreatePagePart(CreatePagePartEvent $event) : void + { + if ('homepage' !== $event->getRequest()->attributes->get('libero_page')['type']) { + return; + } + + $context = [ + 'area' => CONTENT_GRID_PRIMARY, + 'level' => ($event->getContext()['level'] ?? 1) + 1, + 'list_empty' => 'libero.page.homepage.primary_listing.empty', + 'list_title' => 'libero.page.homepage.primary_listing.title', + ] + $event->getContext(); + + $list = $event->getDocument('content_list'); + $event->addContent( + $this->converter->convert($list->documentElement, '@LiberoPatterns/teaser-list.html.twig', $context) + ); + } +} diff --git a/vendor-extra/LiberoPageBundle/src/Resources/config/services.xml b/vendor-extra/LiberoPageBundle/src/Resources/config/services.xml index e902f6d..a346396 100644 --- a/vendor-extra/LiberoPageBundle/src/Resources/config/services.xml +++ b/vendor-extra/LiberoPageBundle/src/Resources/config/services.xml @@ -22,6 +22,15 @@ + + + + + + + + @@ -34,6 +43,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + libero diff --git a/vendor-extra/LiberoPageBundle/src/Resources/translations/messages+intl-icu.en.xlf b/vendor-extra/LiberoPageBundle/src/Resources/translations/messages+intl-icu.en.xlf index 65e0996..6bf3d46 100644 --- a/vendor-extra/LiberoPageBundle/src/Resources/translations/messages+intl-icu.en.xlf +++ b/vendor-extra/LiberoPageBundle/src/Resources/translations/messages+intl-icu.en.xlf @@ -16,6 +16,14 @@ {page_title} | {site_name} + + Content + + + + No items available. + + diff --git a/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemListEmptyListenerTest.php b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemListEmptyListenerTest.php new file mode 100644 index 0000000..665de5d --- /dev/null +++ b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemListEmptyListenerTest.php @@ -0,0 +1,150 @@ +loadElement($xml); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser-list.html.twig', [], ['list_empty' => 'empty_key']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser-list.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertSame(['list_empty' => 'empty_key'], $view->getContext()); + } + + public function nodeProvider() : iterable + { + yield 'different namespace' => ['']; + yield 'different element' => ['']; + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_not_the_teaser_list_template() : void + { + $listener = new ItemListEmptyListener(new IdentityTranslator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent( + $element, + new TemplateView('template', [], ['list_empty' => 'empty_key']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('template', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertSame(['list_empty' => 'empty_key'], $view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_already_an_empty_list_argument() : void + { + $listener = new ItemListEmptyListener(new IdentityTranslator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent( + $element, + new TemplateView( + '@LiberoPatterns/teaser-list.html.twig', + ['list' => ['empty' => 'foo']], + ['list_empty' => 'empty_key',] + ) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser-list.html.twig', $view->getTemplate()); + $this->assertSame(['list' => ['empty' => 'foo']], $view->getArguments()); + $this->assertSame(['list_empty' => 'empty_key'], $view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_list_empty_context() : void + { + $listener = new ItemListEmptyListener(new IdentityTranslator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser-list.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser-list.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_sets_the_empty_list_argument() : void + { + $translator = new Translator('es'); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource( + 'array', + ['empty_key' => 'empty_key in es'], + 'es', + 'messages' + ); + + $listener = new ItemListEmptyListener($translator); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent( + $element, + new TemplateView( + '@LiberoPatterns/teaser-list.html.twig', + ['list' => []], + ['lang' => 'es', 'list_empty' => 'empty_key'] + ) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame(['list' => ['empty' => 'empty_key in es']], $view->getArguments()); + } +} diff --git a/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemListListenerTest.php b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemListListenerTest.php new file mode 100644 index 0000000..e08f11a --- /dev/null +++ b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemListListenerTest.php @@ -0,0 +1,175 @@ +createFailingConverter()); + + $element = $this->loadElement($xml); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser-list.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser-list.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + public function nodeProvider() : iterable + { + yield 'different namespace' => ['']; + yield 'different element' => ['']; + } + + /** + * @test + */ + public function it_does_nothing_if_is_not_the_teaser_list_template() : void + { + $listener = new ItemListListener($this->createFailingConverter()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('template')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('template', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_already_a_list_items_argument() : void + { + $listener = new ItemListListener($this->createDumpingConverter()); + + $element = $this->loadElement( + << + + + + +XML + ); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser-list.html.twig', ['list' => ['items' => 'foo']]) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser-list.html.twig', $view->getTemplate()); + $this->assertSame(['list' => ['items' => 'foo']], $view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_are_no_item_refs() : void + { + $listener = new ItemListListener($this->createDumpingConverter()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser-list.html.twig', [], ['list_empty' => 'foo']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser-list.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertSame(['list_empty' => 'foo'], $view->getContext()); + } + + /** + * @test + */ + public function it_sets_the_list_items_argument() : void + { + $listener = new ItemListListener($this->createDumpingConverter()); + + $element = $this->loadElement( + << + + + + +XML + ); + + $event = new BuildViewEvent( + $element, + new TemplateView( + '@LiberoPatterns/teaser-list.html.twig', + ['list' => []], + ['con' => 'text', 'list_empty' => 'foo'] + ) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(LazyView::class, $view); + $this->assertSame( + [ + 'list' => [ + 'items' => [ + [ + 'content' => [ + 'node' => '/libero:item-list/libero:item-ref[1]', + 'template' => '@LiberoPatterns/teaser.html.twig', + 'context' => [ + 'con' => 'text', + ], + ], + ], + [ + 'content' => [ + 'node' => '/libero:item-list/libero:item-ref[2]', + 'template' => '@LiberoPatterns/teaser.html.twig', + 'context' => [ + 'con' => 'text', + ], + ], + ], + ], + ], + ], + $view['arguments'] + ); + $this->assertSame(['con' => 'text'], $view->getContext()); + } +} diff --git a/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemListTitleListenerTest.php b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemListTitleListenerTest.php new file mode 100644 index 0000000..e011f8b --- /dev/null +++ b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemListTitleListenerTest.php @@ -0,0 +1,143 @@ +loadElement($xml); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser-list.html.twig', [], ['list_title' => 'title_key']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser-list.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertSame(['list_title' => 'title_key'], $view->getContext()); + } + + public function nodeProvider() : iterable + { + yield 'different namespace' => ['']; + yield 'different element' => ['']; + } + + /** + * @test + */ + public function it_does_nothing_if_is_not_the_teaser_list_template() : void + { + $listener = new ItemListTitleListener(new IdentityTranslator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent( + $element, + new TemplateView('template', [], ['list_title' => 'title_key']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('template', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertSame(['list_title' => 'title_key'], $view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_already_a_title_argument() : void + { + $listener = new ItemListTitleListener(new IdentityTranslator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser-list.html.twig', ['title' => 'foo'], ['list_title' => 'title_key']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser-list.html.twig', $view->getTemplate()); + $this->assertSame(['title' => 'foo'], $view->getArguments()); + $this->assertSame(['list_title' => 'title_key'], $view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_list_title_context() : void + { + $listener = new ItemListTitleListener(new IdentityTranslator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser-list.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser-list.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_sets_the_title_argument() : void + { + $translator = new Translator('es'); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource( + 'array', + ['title_key' => 'title_key in es'], + 'es', + 'messages' + ); + + $listener = new ItemListTitleListener($translator); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser-list.html.twig', [], ['lang' => 'es', 'list_title' => 'title_key']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame(['title' => ['level' => 1, 'text' => 'title_key in es']], $view->getArguments()); + $this->assertSame(['lang' => 'es', 'list_title' => 'title_key', 'level' => 2], $view->getContext()); + } +} diff --git a/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemRefTeaserHrefListenerTest.php b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemRefTeaserHrefListenerTest.php new file mode 100644 index 0000000..f405867 --- /dev/null +++ b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemRefTeaserHrefListenerTest.php @@ -0,0 +1,123 @@ +createFailingUrlGenerator()); + + $element = $this->loadElement($xml); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + public function nodeProvider() : iterable + { + yield 'different namespace' => ['']; + yield 'different element' => ['']; + } + + /** + * @test + */ + public function it_does_nothing_if_is_not_the_teaser_template() : void + { + $listener = new ItemRefTeaserHrefListener($this->createFailingUrlGenerator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('template')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('template', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_id() : void + { + $listener = new ItemRefTeaserHrefListener($this->createFailingUrlGenerator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_service() : void + { + $listener = new ItemRefTeaserHrefListener($this->createFailingUrlGenerator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_sets_the_href_argument() : void + { + $listener = new ItemRefTeaserHrefListener($this->createDumpingUrlGenerator()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser.html.twig', [], ['con' => 'text']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame(['href' => 'libero.page.content.service/{"id":"id"}'], $view->getArguments()); + } +} diff --git a/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemRefTeaserListenerTest.php b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemRefTeaserListenerTest.php new file mode 100644 index 0000000..dc26bc3 --- /dev/null +++ b/vendor-extra/LiberoPageBundle/tests/EventListener/BuildView/ItemRefTeaserListenerTest.php @@ -0,0 +1,156 @@ +client, $this->createFailingConverter()); + + $element = $this->loadElement($xml); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + public function nodeProvider() : iterable + { + yield 'different namespace' => ['']; + yield 'different element' => ['']; + } + + /** + * @test + */ + public function it_does_nothing_if_is_not_the_teaser_template() : void + { + $listener = new ItemRefTeaserListener($this->client, $this->createFailingConverter()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('template')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('template', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_id() : void + { + $listener = new ItemRefTeaserListener($this->client, $this->createFailingConverter()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_does_nothing_if_there_is_no_service() : void + { + $listener = new ItemRefTeaserListener($this->client, $this->createFailingConverter()); + + $element = $this->loadElement(''); + + $event = new BuildViewEvent($element, new TemplateView('@LiberoPatterns/teaser.html.twig')); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(TemplateView::class, $view); + $this->assertSame('@LiberoPatterns/teaser.html.twig', $view->getTemplate()); + $this->assertEmpty($view->getArguments()); + $this->assertEmpty($view->getContext()); + } + + /** + * @test + */ + public function it_loads_the_item_and_converts_to_a_teaser() : void + { + $listener = new ItemRefTeaserListener($this->client, $this->createDumpingConverter()); + + $element = $this->loadElement(''); + + $this->mock->save( + new Request( + 'GET', + 'service/items/id/versions/latest', + ['Accept' => 'application/xml'] + ), + new Response( + 200, + [], + << + + + id + service + + +XML + ) + ); + + $event = new BuildViewEvent( + $element, + new TemplateView('@LiberoPatterns/teaser.html.twig', ['arg' => 'ument'], ['con' => 'text']) + ); + $listener->onBuildView($event); + $view = $event->getView(); + + $this->assertInstanceOf(LazyView::class, $view); + $this->assertSame( + [ + 'arg' => 'ument', + 'node' => '/libero:item', + 'template' => '@LiberoPatterns/teaser.html.twig', + 'context' => ['con' => 'text'], + ], + $view['arguments'] + ); + $this->assertSame(['con' => 'text'], $view->getContext()); + } +} diff --git a/vendor-extra/LiberoPageBundle/tests/UrlGeneratorTestCase.php b/vendor-extra/LiberoPageBundle/tests/UrlGeneratorTestCase.php new file mode 100644 index 0000000..e703f6c --- /dev/null +++ b/vendor-extra/LiberoPageBundle/tests/UrlGeneratorTestCase.php @@ -0,0 +1,33 @@ +createMock(UrlGeneratorInterface::class); + + $urlGenerator->method('generate')->willReturnCallback( + function (string $name, array $parameters) : string { + return "{$name}/".json_encode($parameters); + } + ); + + return $urlGenerator; + } + + final protected function createFailingUrlGenerator() : UrlGeneratorInterface + { + $urlGenerator = $this->createMock(UrlGeneratorInterface::class); + + $urlGenerator->expects($this->never())->method($this->anything()); + + return $urlGenerator; + } +} diff --git a/vendor-extra/LiberoPatternsBundle/src/Resources/public/css/all.css b/vendor-extra/LiberoPatternsBundle/src/Resources/public/css/all.css index f3b8a8d..bf28f7d 100644 --- a/vendor-extra/LiberoPatternsBundle/src/Resources/public/css/all.css +++ b/vendor-extra/LiberoPatternsBundle/src/Resources/public/css/all.css @@ -1,3 +1,3 @@ -@font-face{font-display:fallback;font-family:"Noto Sans";src:url("../fonts/NotoSans-Regular-webfont-custom-2-subsetting.woff2") format("woff2")}@font-face{font-display:fallback;font-family:"Noto Sans";src:url("../fonts/NotoSans-SemiBold-webfont-custom-2-subsetting.woff2") format("woff2");font-weight:600}@font-face{font-display:fallback;font-family:"Noto Serif";src:url("../fonts/NotoSerif-Regular-webfont-custom-2-subsetting.woff2") format("woff2")}@font-face{font-display:fallback;font-family:"Noto Serif";src:url("../fonts/NotoSerif-Bold-webfont-basic-latin-subsetting.woff2") format("woff2");font-weight:bold}/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}*,*:before,*:after{box-sizing:border-box}html{font-size:100%}html,body{min-height:100%;min-block-size:100%}body{background-color:#fff;color:#212121;text-rendering:optimizeLegibility;font-family:"Noto Serif",serif;font-size:16px;font-size:1rem;line-height:1.5;font-weight:normal}h1{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:36px;font-size:2.25rem;line-height:1.33333;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}h2{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:26px;font-size:1.625rem;line-height:1.15385;margin-top:0;margin-bottom:18px;margin-bottom:1.125rem;margin-block-start:0;margin-block-end:1.125rem}h3{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:23px;font-size:1.4375rem;line-height:1.04348;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}h4{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:20px;font-size:1.25rem;line-height:1.2;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}h5{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:18px;font-size:1.125rem;line-height:1.33333;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}h6{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:16px;font-size:1rem;line-height:1.5;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}address,article,aside,blockquote,caption,details,dl,fieldset,figcaption,figure,footer,form,header,hr,main,nav,ol,p,pre,section,table,ul{margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}b,code,kbd,strong{line-height:1}hr{border:0;border-bottom:1px solid #e0e0e0;border-block-end:1px solid #e0e0e0;margin-top:0;margin-bottom:23px;margin-bottom:1.4375rem;margin-block-start:0;margin-block-end:1.4375rem}figure{margin-left:0;margin-right:0;margin-inline:0}dd>dl,li>dl,dd>ol,li>ol,dd>ul,li>ul{margin-top:0;margin-bottom:0;margin-block:0}a{color:#0288d1;text-decoration:none}dt{font-weight:bold}dd+dt{margin-top:24px;margin-top:1.5rem;margin-bottom:0;margin-block-start:1.5rem;margin-block-end:0}html[dir="ltr"] dd:not([dir]),dd[dir="ltr"]{margin-left:0}html[dir="rtl"] dd:not([dir]),dd[dir="rtl"]{margin-right:0}html[dir][dir] dd{margin-inline-start:0}address{font-size:11px;font-size:.6875rem;line-height:2.18182}small{font-size:11px;font-size:.6875rem}sub{font-size:75%;line-height:0;position:relative;vertical-align:baseline;bottom:-0.25em}@supports (font-variant-position: sub){sub{font-size:inherit;font-variant-position:sub;position:static}}sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;top:-0.5em}@supports (font-variant-position: super){sup{font-size:inherit;font-variant-position:super;position:static}}img{max-height:100%;max-block-size:100%;max-width:100%;max-inline-size:100%}h1 img,h2 img,h3 img,h4 img,h5 img,h6 img,p img{margin-bottom:.1em;margin-block-end:.1em;max-height:1em;max-block-size:1em;vertical-align:middle}em:lang(ja){font-style:normal;text-emphasis-style:open sesame;text‑emphasis‑position:over right}strong:lang(ja){font-style:normal;text-emphasis-style:filled sesame;text‑emphasis‑position:over right}u:lang(ja){text-underline-position:right}em:lang(ko){font-style:normal;text-decoration:underline;text-underline-position:under right}strong:lang(ko){font-style:normal;text-emphasis-style:filled dot;text‑emphasis‑position:over right}em:lang(zh){font-style:normal;text-emphasis-style:open dot;text‑emphasis‑position:under right}strong:lang(zh){font-style:normal;text-emphasis-style:filled dot;text‑emphasis‑position:under right}cite:lang(zh){font-style:normal;text-decoration:underline;text-underline-style:wavy}em:lang(zh-Hant){text‑emphasis‑position:over right}strong:lang(zh-Hant){text‑emphasis‑position:over right}:root{--GRID-COLUMN-GAP: 1.6%;--GRID-EDGE-SPACE: 7vw;--GRID-COLUMN-WIDTH: calc((100% - (var(--GRID-EDGE-SPACE) * 2) - (var(--GRID-COLUMN-GAP) * 11)) / 12);min-width:320px;min-inline-size:320px}@media (min-width: 45.625em){:root{--GRID-EDGE-SPACE: 14vw}}@media (min-width: 75em){:root{--GRID-COLUMN-GAP: 17.824px;--GRID-COLUMN-WIDTH: calc((1114px - (var(--GRID-COLUMN-GAP) * 11)) / 12)}}.content-meta{overflow:auto;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}html[dir="ltr"] .content-meta:not([dir]),.content-meta[dir="ltr"]{padding-left:0}html[dir="rtl"] .content-meta:not([dir]),.content-meta[dir="rtl"]{padding-right:0}html[dir][dir] .content-meta{padding-inline-start:0}.content-meta__item{display:inline-block;color:#888;font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:normal;font-size:11px;font-size:.6875rem;line-height:2.18182;letter-spacing:1px;text-transform:uppercase}.content-meta__item:after{content:"\a0\2022\a0"}.content-meta__item:last-child:after{content:""}.content-meta__link{color:inherit;text-decoration:inherit;all:inherit;cursor:pointer}.content-meta__link:hover{color:#0277bd}.section__body{margin-top:0;margin-bottom:48px;margin-bottom:3rem;margin-block-start:0;margin-block-end:3rem}.tag-list{margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}.tag-list__title{color:#888;font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:normal;font-size:11px;font-size:.6875rem;line-height:2.18182;letter-spacing:1px;text-transform:uppercase;margin-top:0;margin-bottom:0;margin-block:0}.tag-list__list{overflow:auto;color:#0288d1;font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:normal;font-size:11px;font-size:.6875rem;line-height:2.18182;letter-spacing:1px;text-transform:uppercase}html[dir="ltr"] .tag-list__list:not([dir]),.tag-list__list[dir="ltr"]{padding-left:0}html[dir="rtl"] .tag-list__list:not([dir]),.tag-list__list[dir="rtl"]{padding-right:0}html[dir][dir] .tag-list__list{padding-inline-start:0}.tag-list__list--single-line{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tag-list__list--single-line:lang(zh-Hant-HK){text-overflow:"⋯"}.tag-list__item{display:inline-block;color:#0288d1;font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:normal;font-size:11px;font-size:.6875rem;line-height:2.18182;letter-spacing:1px;text-transform:uppercase}.tag-list__item:after{display:inline;content:",\a0"}.tag-list__item:lang(ar):after{content:"،\a0"}.tag-list__item:lang(ja):after{content:"、"}.tag-list__item:last-child:after{content:""}.tag-list__link{color:inherit;text-decoration:inherit;all:inherit;cursor:pointer}.tag-list__link:hover{color:#0277bd}.content-header{text-align:center;padding-top:48px;padding-top:3rem;padding-block-start:3rem;margin-top:0;margin-bottom:47px;margin-bottom:2.9375rem;margin-block-start:0;margin-block-end:2.9375rem;border-bottom:1px solid #e0e0e0;border-block-end:1px solid #e0e0e0}.content-header__title{margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}.content-header__title:last-child{margin-top:0;margin-bottom:48px;margin-bottom:3rem;margin-block-start:0;margin-block-end:3rem}.content-header__title--xx-short{font-size:46px;font-size:2.875rem}@media (min-width: 30em){.content-header__title--xx-short{font-size:52px;font-size:3.25rem}}.content-header__title--x-short{font-size:41px;font-size:2.5625rem}@media (min-width: 45.625em){.content-header__title--x-short{font-size:46px;font-size:2.875rem}}@media (min-width: 56.25em){.content-header__title--x-short{font-size:52px;font-size:3.25rem}}.content-header__title--short{font-size:32px;font-size:2rem}@media (min-width: 30em){.content-header__title--short{font-size:36px;font-size:2.25rem}}@media (min-width: 45.625em){.content-header__title--short{font-size:41px;font-size:2.5625rem}}@media (min-width: 56.25em){.content-header__title--short{font-size:46px;font-size:2.875rem}}@media (min-width: 75em){.content-header__title--short{font-size:52px;font-size:3.25rem}}.content-header__title--medium{font-size:26px;font-size:1.625rem}@media (min-width: 30em){.content-header__title--medium{font-size:32px;font-size:2rem}}@media (min-width: 45.625em){.content-header__title--medium{font-size:36px;font-size:2.25rem}}@media (min-width: 56.25em){.content-header__title--medium{font-size:41px;font-size:2.5625rem}}@media (min-width: 75em){.content-header__title--medium{font-size:52px;font-size:3.25rem}}.content-header__title--long{font-size:20px;font-size:1.25rem}@media (min-width: 30em){.content-header__title--long{font-size:26px;font-size:1.625rem}}@media (min-width: 45.625em){.content-header__title--long{font-size:36px;font-size:2.25rem}}@media (min-width: 75em){.content-header__title--long{font-size:41px;font-size:2.5625rem}}.content-header__title--x-long{font-size:20px;font-size:1.25rem}@media (min-width: 45.625em){.content-header__title--x-long{font-size:26px;font-size:1.625rem}}@media (min-width: 56.25em){.content-header__title--x-long{font-size:26px;font-size:1.625rem}}@media (min-width: 75em){.content-header__title--x-long{font-size:32px;font-size:2rem}}.content-header__title--xx-long{font-size:18px;font-size:1.125rem}@media (min-width: 30em){.content-header__title--xx-long{font-size:20px;font-size:1.25rem}}@media (min-width: 56.25em){.content-header__title--xx-long{font-size:26px;font-size:1.625rem}}.item-tags{padding-top:47px;padding-top:2.9375rem;padding-block-start:2.9375rem;margin-top:0;margin-bottom:48px;margin-bottom:3rem;margin-block-start:0;margin-block-end:3rem;border-top:1px solid #e0e0e0;border-block-start:1px solid #e0e0e0;text-align:center}@media (min-width: 45.625em){.item-tags{text-align:initial}}.content-grid{--primary-column-width: calc((12 * var(--GRID-COLUMN-WIDTH)) + (11 * var(--GRID-COLUMN-GAP)));max-width:1114px;max-width:69.625rem;max-inline-size:69.625rem;margin-top:0;margin-bottom:0;margin-block:0;margin-left:auto;margin-right:auto;margin-inline:auto;padding-left:1.6%;padding-right:1.6%;padding-inline:1.6%;box-sizing:content-box;grid-template-areas:". menu ." ". primary .";grid-template-columns:[full-start] 1fr [main-start] var(--primary-column-width) [main-end] 1fr [full-end];grid-column-gap:var(--GRID-COLUMN-GAP)}@supports (display: grid) and (--custom: property){.content-grid{display:grid;max-width:unset;max-inline-size:unset;margin-left:unset;margin-right:unset;margin-inline:unset;padding-left:unset;padding-right:unset;padding-inline:unset;box-sizing:border-box}}@media (min-width: 56.25em){.content-grid{--primary-column-width: calc((10 * var(--GRID-COLUMN-WIDTH)) + (9 * var(--GRID-COLUMN-GAP)));--secondary-column-width: calc((1 * var(--GRID-COLUMN-WIDTH)) + (0 * var(--GRID-COLUMN-GAP)));--menu-column-width: calc((1 * var(--GRID-COLUMN-WIDTH)) + (0 * var(--GRID-COLUMN-GAP)));grid-template-areas:". . menu . ." ". . primary . .";grid-template-columns:[full-start] 1fr [main-start] var(--menu-column-width) var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end]}}@media (min-width: 75em){.content-grid{--primary-column-width: calc((8 * var(--GRID-COLUMN-WIDTH)) + (7 * var(--GRID-COLUMN-GAP)));--secondary-column-width: calc((2 * var(--GRID-COLUMN-WIDTH)) + (1 * var(--GRID-COLUMN-GAP)));--menu-column-width: calc((2 * var(--GRID-COLUMN-WIDTH)) + (1 * var(--GRID-COLUMN-GAP)));grid-template-areas:". menu primary . ."}}.content-grid--has-secondary{grid-template-areas:". menu ." ". primary ." ". secondary ."}@media (min-width: 56.25em){.content-grid--has-secondary{--primary-column-width: calc((8 * var(--GRID-COLUMN-WIDTH)) + (7 * var(--GRID-COLUMN-GAP)));--secondary-column-width: calc((4 * var(--GRID-COLUMN-WIDTH)) + (3 * var(--GRID-COLUMN-GAP)));grid-template-areas:". menu menu ." ". primary secondary .";grid-template-columns:[full-start] 1fr [main-start] var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end]}}@media (min-width: 75em){.content-grid--has-secondary{--primary-column-width: calc((7 * var(--GRID-COLUMN-WIDTH)) + (6 * var(--GRID-COLUMN-GAP)));--secondary-column-width: calc((3 * var(--GRID-COLUMN-WIDTH)) + (2 * var(--GRID-COLUMN-GAP)));--menu-column-width: calc((2 * var(--GRID-COLUMN-WIDTH)) + (1 * var(--GRID-COLUMN-GAP)));grid-template-areas:". menu primary secondary .";grid-template-columns:[full-start] 1fr [main-start] var(--menu-column-width) var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end]}}.content-grid__item,.content-grid__item--main{grid-column:main}.content-grid__item--full{grid-column:full}.content-grid__item--primary{grid-column:primary}.content-grid__item--secondary{grid-column:secondary}.content-grid__item--menu{grid-column:menu}.page-grid{max-width:1114px;max-width:69.625rem;max-inline-size:69.625rem;margin-top:0;margin-bottom:0;margin-block:0;margin-left:auto;margin-right:auto;margin-inline:auto;padding-left:1.6%;padding-right:1.6%;padding-inline:1.6%;box-sizing:content-box;grid-template-areas:"start" "main" "end"}@supports (display: grid) and (--custom: property){.page-grid{display:grid;max-width:unset;max-inline-size:unset;margin-left:unset;margin-right:unset;margin-inline:unset;padding-left:unset;padding-right:unset;padding-inline:unset;box-sizing:border-box}}.page-grid__start{grid-row:start;border-bottom:1px solid #e0e0e0;border-block-end:1px solid #e0e0e0}.page-grid__main{grid-row:main}.page-grid__end{grid-row:end;border-top:1px solid #e0e0e0;border-block-start:1px solid #e0e0e0} +@font-face{font-display:fallback;font-family:"Noto Sans";src:url("../fonts/NotoSans-Regular-webfont-custom-2-subsetting.woff2") format("woff2")}@font-face{font-display:fallback;font-family:"Noto Sans";src:url("../fonts/NotoSans-SemiBold-webfont-custom-2-subsetting.woff2") format("woff2");font-weight:600}@font-face{font-display:fallback;font-family:"Noto Serif";src:url("../fonts/NotoSerif-Regular-webfont-custom-2-subsetting.woff2") format("woff2")}@font-face{font-display:fallback;font-family:"Noto Serif";src:url("../fonts/NotoSerif-Bold-webfont-basic-latin-subsetting.woff2") format("woff2");font-weight:bold}/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}*,*:before,*:after{box-sizing:border-box}html{font-size:100%}html,body{min-height:100%;min-block-size:100%}body{background-color:#fff;color:#212121;text-rendering:optimizeLegibility;font-family:"Noto Serif",serif;font-size:16px;font-size:1rem;line-height:1.5;font-weight:normal}h1{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:36px;font-size:2.25rem;line-height:1.33333;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}h2{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:26px;font-size:1.625rem;line-height:1.15385;margin-top:0;margin-bottom:18px;margin-bottom:1.125rem;margin-block-start:0;margin-block-end:1.125rem}h3{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:23px;font-size:1.4375rem;line-height:1.04348;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}h4{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:20px;font-size:1.25rem;line-height:1.2;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}h5{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:18px;font-size:1.125rem;line-height:1.33333;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}h6{font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:600;font-size:16px;font-size:1rem;line-height:1.5;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}address,article,aside,blockquote,caption,details,dl,fieldset,figcaption,figure,footer,form,header,hr,main,nav,ol,p,pre,section,table,ul{margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}b,code,kbd,strong{line-height:1}hr{border:0;border-bottom:1px solid #e0e0e0;border-block-end:1px solid #e0e0e0;margin-top:0;margin-bottom:23px;margin-bottom:1.4375rem;margin-block-start:0;margin-block-end:1.4375rem}figure{margin-left:0;margin-right:0;margin-inline:0}dd>dl,li>dl,dd>ol,li>ol,dd>ul,li>ul{margin-top:0;margin-bottom:0;margin-block:0}a{color:#0288d1;text-decoration:none}dt{font-weight:bold}dd+dt{margin-top:24px;margin-top:1.5rem;margin-bottom:0;margin-block-start:1.5rem;margin-block-end:0}html[dir="ltr"] dd:not([dir]),dd[dir="ltr"]{margin-left:0}html[dir="rtl"] dd:not([dir]),dd[dir="rtl"]{margin-right:0}html[dir][dir] dd{margin-inline-start:0}address{font-size:11px;font-size:.6875rem;line-height:2.18182}small{font-size:11px;font-size:.6875rem}sub{font-size:75%;line-height:0;position:relative;vertical-align:baseline;bottom:-0.25em}@supports (font-variant-position: sub){sub{font-size:inherit;font-variant-position:sub;position:static}}sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;top:-0.5em}@supports (font-variant-position: super){sup{font-size:inherit;font-variant-position:super;position:static}}img{max-height:100%;max-block-size:100%;max-width:100%;max-inline-size:100%}h1 img,h2 img,h3 img,h4 img,h5 img,h6 img,p img{margin-bottom:.1em;margin-block-end:.1em;max-height:1em;max-block-size:1em;vertical-align:middle}em:lang(ja){font-style:normal;text-emphasis-style:open sesame;text‑emphasis‑position:over right}strong:lang(ja){font-style:normal;text-emphasis-style:filled sesame;text‑emphasis‑position:over right}u:lang(ja){text-underline-position:right}em:lang(ko){font-style:normal;text-decoration:underline;text-underline-position:under right}strong:lang(ko){font-style:normal;text-emphasis-style:filled dot;text‑emphasis‑position:over right}em:lang(zh){font-style:normal;text-emphasis-style:open dot;text‑emphasis‑position:under right}strong:lang(zh){font-style:normal;text-emphasis-style:filled dot;text‑emphasis‑position:under right}cite:lang(zh){font-style:normal;text-decoration:underline;text-underline-style:wavy}em:lang(zh-Hant){text‑emphasis‑position:over right}strong:lang(zh-Hant){text‑emphasis‑position:over right}:root{--GRID-COLUMN-GAP: 1.6%;--GRID-EDGE-SPACE: 7vw;--GRID-COLUMN-WIDTH: calc((100% - (var(--GRID-EDGE-SPACE) * 2) - (var(--GRID-COLUMN-GAP) * 11)) / 12);min-width:320px;min-inline-size:320px}@media (min-width: 45.625em){:root{--GRID-EDGE-SPACE: 14vw}}@media (min-width: 75em){:root{--GRID-COLUMN-GAP: 17.824px;--GRID-COLUMN-WIDTH: calc((1114px - (var(--GRID-COLUMN-GAP) * 11)) / 12)}}.heading__link{color:inherit;text-decoration:inherit;all:inherit;cursor:pointer}.heading__link:hover{color:#0277bd}.content-meta{overflow:auto;margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}html[dir="ltr"] .content-meta:not([dir]),.content-meta[dir="ltr"]{padding-left:0}html[dir="rtl"] .content-meta:not([dir]),.content-meta[dir="rtl"]{padding-right:0}html[dir][dir] .content-meta{padding-inline-start:0}.content-meta__item{display:inline-block;color:#888;font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:normal;font-size:11px;font-size:.6875rem;line-height:2.18182;letter-spacing:1px;text-transform:uppercase}.content-meta__item:after{content:"\a0\2022\a0"}.content-meta__item:last-child:after{content:""}.content-meta__link{color:inherit;text-decoration:inherit;all:inherit;cursor:pointer}.content-meta__link:hover{color:#0277bd}.section__body{margin-top:0;margin-bottom:48px;margin-bottom:3rem;margin-block-start:0;margin-block-end:3rem}.tag-list{margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}.tag-list__title{color:#888;font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:normal;font-size:11px;font-size:.6875rem;line-height:2.18182;letter-spacing:1px;text-transform:uppercase;margin-top:0;margin-bottom:0;margin-block:0}.tag-list__list{overflow:auto;color:#0288d1;font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:normal;font-size:11px;font-size:.6875rem;line-height:2.18182;letter-spacing:1px;text-transform:uppercase}html[dir="ltr"] .tag-list__list:not([dir]),.tag-list__list[dir="ltr"]{padding-left:0}html[dir="rtl"] .tag-list__list:not([dir]),.tag-list__list[dir="rtl"]{padding-right:0}html[dir][dir] .tag-list__list{padding-inline-start:0}.tag-list__list--single-line{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tag-list__list--single-line:lang(zh-Hant-HK){text-overflow:"⋯"}.tag-list__item{display:inline-block;color:#0288d1;font-family:"Noto Sans",Arial,Helvetica,sans-serif;font-weight:normal;font-size:11px;font-size:.6875rem;line-height:2.18182;letter-spacing:1px;text-transform:uppercase}.tag-list__item:after{display:inline;content:",\a0"}.tag-list__item:lang(ar):after{content:"،\a0"}.tag-list__item:lang(ja):after{content:"、"}.tag-list__item:last-child:after{content:""}.tag-list__link{color:inherit;text-decoration:inherit;all:inherit;cursor:pointer}.tag-list__link:hover{color:#0277bd}.content-header{text-align:center;padding-top:48px;padding-top:3rem;padding-block-start:3rem;margin-top:0;margin-bottom:47px;margin-bottom:2.9375rem;margin-block-start:0;margin-block-end:2.9375rem;border-bottom:1px solid #e0e0e0;border-block-end:1px solid #e0e0e0}.content-header__title{margin-top:0;margin-bottom:24px;margin-bottom:1.5rem;margin-block-start:0;margin-block-end:1.5rem}.content-header__title:last-child{margin-top:0;margin-bottom:48px;margin-bottom:3rem;margin-block-start:0;margin-block-end:3rem}.content-header__title--xx-short{font-size:46px;font-size:2.875rem}@media (min-width: 30em){.content-header__title--xx-short{font-size:52px;font-size:3.25rem}}.content-header__title--x-short{font-size:41px;font-size:2.5625rem}@media (min-width: 45.625em){.content-header__title--x-short{font-size:46px;font-size:2.875rem}}@media (min-width: 56.25em){.content-header__title--x-short{font-size:52px;font-size:3.25rem}}.content-header__title--short{font-size:32px;font-size:2rem}@media (min-width: 30em){.content-header__title--short{font-size:36px;font-size:2.25rem}}@media (min-width: 45.625em){.content-header__title--short{font-size:41px;font-size:2.5625rem}}@media (min-width: 56.25em){.content-header__title--short{font-size:46px;font-size:2.875rem}}@media (min-width: 75em){.content-header__title--short{font-size:52px;font-size:3.25rem}}.content-header__title--medium{font-size:26px;font-size:1.625rem}@media (min-width: 30em){.content-header__title--medium{font-size:32px;font-size:2rem}}@media (min-width: 45.625em){.content-header__title--medium{font-size:36px;font-size:2.25rem}}@media (min-width: 56.25em){.content-header__title--medium{font-size:41px;font-size:2.5625rem}}@media (min-width: 75em){.content-header__title--medium{font-size:52px;font-size:3.25rem}}.content-header__title--long{font-size:20px;font-size:1.25rem}@media (min-width: 30em){.content-header__title--long{font-size:26px;font-size:1.625rem}}@media (min-width: 45.625em){.content-header__title--long{font-size:36px;font-size:2.25rem}}@media (min-width: 75em){.content-header__title--long{font-size:41px;font-size:2.5625rem}}.content-header__title--x-long{font-size:20px;font-size:1.25rem}@media (min-width: 45.625em){.content-header__title--x-long{font-size:26px;font-size:1.625rem}}@media (min-width: 56.25em){.content-header__title--x-long{font-size:26px;font-size:1.625rem}}@media (min-width: 75em){.content-header__title--x-long{font-size:32px;font-size:2rem}}.content-header__title--xx-long{font-size:18px;font-size:1.125rem}@media (min-width: 30em){.content-header__title--xx-long{font-size:20px;font-size:1.25rem}}@media (min-width: 56.25em){.content-header__title--xx-long{font-size:26px;font-size:1.625rem}}.item-tags{padding-top:47px;padding-top:2.9375rem;padding-block-start:2.9375rem;margin-top:0;margin-bottom:48px;margin-bottom:3rem;margin-block-start:0;margin-block-end:3rem;border-top:1px solid #e0e0e0;border-block-start:1px solid #e0e0e0;text-align:center}@media (min-width: 45.625em){.item-tags{text-align:initial}}.content-grid{--primary-column-width: calc((12 * var(--GRID-COLUMN-WIDTH)) + (11 * var(--GRID-COLUMN-GAP)));max-width:1114px;max-width:69.625rem;max-inline-size:69.625rem;margin-top:0;margin-bottom:0;margin-block:0;margin-left:auto;margin-right:auto;margin-inline:auto;padding-left:1.6%;padding-right:1.6%;padding-inline:1.6%;box-sizing:content-box;grid-template-areas:". menu ." ". primary .";grid-template-columns:[full-start] 1fr [main-start] var(--primary-column-width) [main-end] 1fr [full-end];grid-column-gap:var(--GRID-COLUMN-GAP)}@supports (display: grid) and (--custom: property){.content-grid{display:grid;max-width:unset;max-inline-size:unset;margin-left:unset;margin-right:unset;margin-inline:unset;padding-left:unset;padding-right:unset;padding-inline:unset;box-sizing:border-box}}@media (min-width: 56.25em){.content-grid{--primary-column-width: calc((10 * var(--GRID-COLUMN-WIDTH)) + (9 * var(--GRID-COLUMN-GAP)));--secondary-column-width: calc((1 * var(--GRID-COLUMN-WIDTH)) + (0 * var(--GRID-COLUMN-GAP)));--menu-column-width: calc((1 * var(--GRID-COLUMN-WIDTH)) + (0 * var(--GRID-COLUMN-GAP)));grid-template-areas:". . menu . ." ". . primary . .";grid-template-columns:[full-start] 1fr [main-start] var(--menu-column-width) var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end]}}@media (min-width: 75em){.content-grid{--primary-column-width: calc((8 * var(--GRID-COLUMN-WIDTH)) + (7 * var(--GRID-COLUMN-GAP)));--secondary-column-width: calc((2 * var(--GRID-COLUMN-WIDTH)) + (1 * var(--GRID-COLUMN-GAP)));--menu-column-width: calc((2 * var(--GRID-COLUMN-WIDTH)) + (1 * var(--GRID-COLUMN-GAP)));grid-template-areas:". menu primary . ."}}.content-grid--has-secondary{grid-template-areas:". menu ." ". primary ." ". secondary ."}@media (min-width: 56.25em){.content-grid--has-secondary{--primary-column-width: calc((8 * var(--GRID-COLUMN-WIDTH)) + (7 * var(--GRID-COLUMN-GAP)));--secondary-column-width: calc((4 * var(--GRID-COLUMN-WIDTH)) + (3 * var(--GRID-COLUMN-GAP)));grid-template-areas:". menu menu ." ". primary secondary .";grid-template-columns:[full-start] 1fr [main-start] var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end]}}@media (min-width: 75em){.content-grid--has-secondary{--primary-column-width: calc((7 * var(--GRID-COLUMN-WIDTH)) + (6 * var(--GRID-COLUMN-GAP)));--secondary-column-width: calc((3 * var(--GRID-COLUMN-WIDTH)) + (2 * var(--GRID-COLUMN-GAP)));--menu-column-width: calc((2 * var(--GRID-COLUMN-WIDTH)) + (1 * var(--GRID-COLUMN-GAP)));grid-template-areas:". menu primary secondary .";grid-template-columns:[full-start] 1fr [main-start] var(--menu-column-width) var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end]}}.content-grid__item,.content-grid__item--main{grid-column:main}.content-grid__item--full{grid-column:full}.content-grid__item--primary{grid-column:primary}.content-grid__item--secondary{grid-column:secondary}.content-grid__item--menu{grid-column:menu}.page-grid{max-width:1114px;max-width:69.625rem;max-inline-size:69.625rem;margin-top:0;margin-bottom:0;margin-block:0;margin-left:auto;margin-right:auto;margin-inline:auto;padding-left:1.6%;padding-right:1.6%;padding-inline:1.6%;box-sizing:content-box;grid-template-areas:"start" "main" "end"}@supports (display: grid) and (--custom: property){.page-grid{display:grid;max-width:unset;max-inline-size:unset;margin-left:unset;margin-right:unset;margin-inline:unset;padding-left:unset;padding-right:unset;padding-inline:unset;box-sizing:border-box}}.page-grid__start{grid-row:start;border-bottom:1px solid #e0e0e0;border-block-end:1px solid #e0e0e0}.page-grid__main{grid-row:main}.page-grid__end{grid-row:end;border-top:1px solid #e0e0e0;border-block-start:1px solid #e0e0e0} /*# sourceMappingURL=all.css.map */ diff --git a/vendor-extra/LiberoPatternsBundle/src/Resources/public/css/all.css.map b/vendor-extra/LiberoPatternsBundle/src/Resources/public/css/all.css.map index d481acf..f539e64 100644 --- a/vendor-extra/LiberoPatternsBundle/src/Resources/public/css/all.css.map +++ b/vendor-extra/LiberoPatternsBundle/src/Resources/public/css/all.css.map @@ -1 +1 @@ -{"version":3,"file":"all.css","sources":["base.scss","_fonts.scss","_normalize.scss","mixins/_decorations.scss","mixins/_logical-properties.scss","mixins/_types.scss","variables/_font.scss","vendor/sass-rem/_rem.scss","mixins/_validation.scss","functions/_validation.scss","variables/_color.scss","variables/_grid.scss","mixins/_spacing.scss","mixins/_media-query.scss","variables/_breakpoint.scss","vendor/sass-mq/_mq.scss","mixins/_sizes.scss","variables/_baselinegrid.scss","mixins/_typography.scss","mixins/_utilities.scss","mixins/_scale.scss","vendor/modularscale-sass/stylesheets/_modularscale.scss","vendor/modularscale-sass/stylesheets/modularscale/_vars.scss","vendor/modularscale-sass/stylesheets/modularscale/_settings.scss","vendor/modularscale-sass/stylesheets/modularscale/_pow.scss","vendor/modularscale-sass/stylesheets/modularscale/_strip-units.scss","vendor/modularscale-sass/stylesheets/modularscale/_sort.scss","vendor/modularscale-sass/stylesheets/modularscale/_target.scss","vendor/modularscale-sass/stylesheets/modularscale/_function.scss","vendor/modularscale-sass/stylesheets/modularscale/_round-px.scss","vendor/modularscale-sass/stylesheets/modularscale/_respond.scss","vendor/modularscale-sass/stylesheets/modularscale/_sugar.scss","vendor/normalize.css/normalize.css","_grid.scss","patterns/molecules/content-meta.scss","patterns/molecules/section.scss","patterns/molecules/tag-list.scss","patterns/organisms/content-header.scss","functions/_types.scss","patterns/organisms/item-tags.scss","patterns/templates/content-grid.scss","functions/_grid.scss","mixins/_grid.scss","patterns/templates/page-grid.scss"],"sourcesContent":["@import \"fonts\";\n@import \"normalize\";\n@import \"grid\";\n@import \"patterns/molecules/content-meta.scss\";\n@import \"patterns/molecules/section.scss\";\n@import \"patterns/molecules/tag-list.scss\";\n@import \"patterns/organisms/content-header.scss\";\n@import \"patterns/organisms/item-tags.scss\";\n@import \"patterns/templates/content-grid.scss\";\n@import \"patterns/templates/page-grid.scss\";\n","@font-face {\n font-display: fallback;\n font-family: \"Noto Sans\";\n src: url(\"../../fonts/NotoSans-Regular-webfont-custom-2-subsetting.woff2\") format(\"woff2\");\n}\n\n@font-face {\n font-display: fallback;\n font-family: \"Noto Sans\";\n src: url(\"../../fonts/NotoSans-SemiBold-webfont-custom-2-subsetting.woff2\") format(\"woff2\");\n font-weight: 600;\n}\n\n@font-face {\n font-display: fallback;\n font-family: \"Noto Serif\";\n src: url(\"../../fonts/NotoSerif-Regular-webfont-custom-2-subsetting.woff2\") format(\"woff2\");\n}\n\n@font-face {\n font-display: fallback;\n font-family: \"Noto Serif\";\n src: url(\"../../fonts/NotoSerif-Bold-webfont-basic-latin-subsetting.woff2\") format(\"woff2\");\n font-weight: bold;\n}\n","@import \"mixins/decorations\";\n@import \"mixins/spacing\";\n@import \"mixins/typography\";\n@import \"variables/color\";\n@import \"variables/grid\";\n@import \"vendor/normalize.css/normalize\";\n\n*,\n*:before,\n*:after {\n box-sizing: border-box;\n}\n\nhtml {\n font-size: ($font-size / 16px) * 100%;\n}\n\nhtml,\nbody {\n @include min-block-size(100%);\n}\n\nbody {\n background-color: $color-background;\n color: $color-text-normal;\n text-rendering: optimizeLegibility;\n @include body-typography();\n}\n\nh1 {\n @include h1-typography();\n @include h1-spacing();\n}\n\nh2 {\n @include h2-typography();\n @include h2-spacing();\n}\n\nh3 {\n @include h3-typography();\n @include h3-spacing();\n}\n\nh4 {\n @include h4-typography();\n @include h4-spacing();\n}\n\nh5 {\n @include h5-typography();\n @include h5-spacing();\n}\n\nh6 {\n @include h6-typography();\n @include h6-spacing();\n}\n\naddress,\narticle,\naside,\nblockquote,\ncaption,\ndetails,\ndl,\nfieldset,\nfigcaption,\nfigure,\nfooter,\nform,\nheader,\nhr,\nmain,\nnav,\nol,\np,\npre,\nsection,\ntable,\nul {\n @include block-spacing();\n}\n\nb,\ncode,\nkbd,\nstrong {\n line-height: 1;\n}\n\nhr {\n border: 0;\n @include divider(block-end);\n @include block-spacing($end: $baselinegrid-space-small - $grid-divider_size);\n}\n\nfigure {\n @include margin(0, inline);\n}\n\ndl,\nol,\nul {\n dd > &,\n li > & {\n @include block-spacing($end: 0);\n }\n}\n\na {\n color: $color-primary-normal;\n text-decoration: none;\n}\n\ndt {\n font-weight: bold;\n\n dd + & {\n @include block-spacing($baselinegrid-space-small, 0);\n }\n}\n\ndd {\n @include margin(0, inline-start);\n}\n\naddress {\n @include set-font-size-and-line-height(scale(-3));\n}\n\nsmall {\n @include rem(font-size, scale(-3));\n}\n\nsub {\n @include font-variant-position(sub);\n}\n\nsup {\n @include font-variant-position(super);\n}\n\nimg {\n @include max-block-size(100%);\n @include max-inline-size(100%);\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np {\n img {\n @include inline-image();\n }\n}\n\n:lang(ja) {\n @at-root {\n em#{&} {\n font-style: normal;\n text-emphasis-style: open sesame;\n text‑emphasis‑position: over right;\n }\n\n strong#{&} {\n font-style: normal;\n text-emphasis-style: filled sesame;\n text‑emphasis‑position: over right;\n }\n\n u#{&} {\n text-underline-position: right;\n }\n }\n}\n\n:lang(ko) {\n @at-root {\n em#{&} {\n font-style: normal;\n text-decoration: underline;\n text-underline-position: under right;\n }\n\n strong#{&} {\n font-style: normal;\n text-emphasis-style: filled dot;\n text‑emphasis‑position: over right;\n }\n }\n}\n\n:lang(zh) {\n @at-root {\n em#{&} {\n font-style: normal;\n text-emphasis-style: open dot;\n text‑emphasis‑position: under right;\n }\n\n strong#{&} {\n font-style: normal;\n text-emphasis-style: filled dot;\n text‑emphasis‑position: under right;\n }\n\n cite#{&} {\n font-style: normal;\n text-decoration: underline;\n text-underline-style: wavy;\n }\n }\n}\n\n:lang(zh-Hant) {\n @at-root {\n em#{&} {\n text‑emphasis‑position: over right;\n }\n\n strong#{&} {\n text‑emphasis‑position: over right;\n }\n }\n}\n","@import \"../mixins/logical-properties\";\n@import \"../variables/color\";\n@import \"../variables/grid\";\n\n@mixin divider($dimension) {\n\n @if index((inline, inline-start, inline-end, block, block-start, block-end), $dimension) {\n @include logical-property(border, $dimension, ($grid-divider_size solid $color-text-dividers,), $to-rem: false);\n } @else if index((top, bottom, left, right), $dimension) {\n @include _error(\"'#{$dimension}' is a physical dimension, use its logical equivilant\");\n } @else {\n @include _error(\"Unknown dimension '#{$dimension}'\");\n }\n\n}\n","@import \"types\";\n@import \"validation\";\n\n@mixin _when-left-to-right {\n html[dir=\"ltr\"] &:not([dir]),\n &[dir=\"ltr\"] {\n @content;\n }\n}\n\n@mixin _when-right-to-left {\n html[dir=\"rtl\"] &:not([dir]),\n &[dir=\"rtl\"] {\n @content;\n }\n}\n\n@mixin _when-logical {\n html[dir][dir] & {\n @content;\n }\n}\n\n@mixin _maybe-rem($to-rem, $properties, $values: ()) {\n @if ($to-rem == false) {\n @if type-of($properties) == \"map\" {\n @each $property in map-keys($properties) {\n @include _maybe-rem($to-rem, $property, map-get($properties, $property));\n }\n } @else {\n @each $property in $properties {\n #{$property}: $values;\n }\n }\n } @else {\n @include rem($properties, $values...);\n }\n}\n\n@function _maybe-rem($to-rem, $values) {\n @if ($to-rem == false) {\n @return $values;\n } @else {\n @return rem($values...);\n }\n}\n\n@function _property-name($parts, $dimension) {\n @if (length($parts) == 0 or $parts == \"\") {\n @return $dimension;\n }\n\n @if (length($parts) == 1) {\n @return \"#{$parts}-#{$dimension}\";\n }\n\n @return \"#{nth($parts, 1)}-#{$dimension}-#{nth($parts, 2)}\";\n}\n\n@mixin logical-property($property-name, $dimension, $arguments, $to-rem: true) {\n\n @if length($property-name) > 2 {\n @include _error(\"Expected at most two property name parts\");\n } @else if $dimension == inline {\n\n @if type-of($arguments) == \"list\" and length($arguments) > 1 {\n\n @include _expect_at_most($arguments, 2, \"More than two arguments supplied with 'inline' dimension\") {\n\n $firstArgument: nth($arguments, 1);\n $secondArgument: nth($arguments, 2);\n\n @if $firstArgument == $secondArgument {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, left)}: $firstArgument,\n #{_property-name($property-name, right)}: $firstArgument,\n ));\n #{_property-name($property-name, inline)}: _maybe-rem($to-rem, $firstArgument);\n\n } @else {\n\n @include _when-left-to-right() {\n @include _maybe-rem($to-rem, _property-name($property-name, left), $firstArgument);\n @include _maybe-rem($to-rem, _property-name($property-name, right), $secondArgument);\n }\n\n @include _when-right-to-left() {\n @include _maybe-rem($to-rem, _property-name($property-name, right), $firstArgument);\n @include _maybe-rem($to-rem, _property-name($property-name, left), $secondArgument);\n }\n\n @include _when-logical() {\n #{_property-name($property-name, inline-start)}: _maybe-rem($to-rem, $firstArgument);\n #{_property-name($property-name, inline-end)}: _maybe-rem($to-rem, $secondArgument);\n }\n\n }\n\n }\n\n } @else {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, left)}: $arguments,\n #{_property-name($property-name, right)}: $arguments,\n ));\n #{_property-name($property-name, inline)}: _maybe-rem($to-rem, $arguments);\n\n }\n\n } @else if $dimension == inline-start {\n\n @include _when-left-to-right() {\n @include _maybe-rem($to-rem, _property-name($property-name, left), $arguments);\n }\n\n @include _when-right-to-left() {\n @include _maybe-rem($to-rem, _property-name($property-name, right), $arguments);\n }\n\n @include _when_logical() {\n #{_property-name($property-name, inline-start)}: _maybe-rem($to-rem, $arguments);\n }\n\n } @else if $dimension == inline-end {\n\n @include _when-left-to-right() {\n @include _maybe-rem($to-rem, _property-name($property-name, right), $arguments);\n }\n\n @include _when-right-to-left() {\n @include _maybe-rem($to-rem, _property-name($property-name, left), $arguments);\n }\n\n @include _when_logical() {\n #{_property-name($property-name, inline-end)}: _maybe-rem($to-rem, $arguments);\n }\n\n } @else if $dimension == inline-size {\n\n @include _maybe-rem($to-rem, _property-name($property-name, width), $arguments);\n #{_property-name($property-name, inline-size)}: _maybe-rem($to-rem, $arguments);\n\n } @else if $dimension == block {\n\n @if type-of($arguments) == \"list\" and length($arguments) > 1 {\n\n @include _expect_at_most($arguments, 2, \"More than two arguments supplied with 'block' dimension\") {\n\n $firstArgument: nth($arguments, 1);\n $secondArgument: nth($arguments, 2);\n\n @if $firstArgument == $secondArgument {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, top)}: $firstArgument,\n #{_property-name($property-name, bottom)}: $firstArgument,\n ));\n #{_property-name($property-name, block)}: _maybe-rem($to-rem, $firstArgument);\n\n } @else {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, top)}: $firstArgument,\n #{_property-name($property-name, bottom)}: $secondArgument,\n ));\n #{_property-name($property-name, block-start)}: _maybe-rem($to-rem, $firstArgument);\n #{_property-name($property-name, block-end)}: _maybe-rem($to-rem, $secondArgument);\n\n }\n\n }\n\n } @else {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, top)}: $arguments,\n #{_property-name($property-name, bottom)}: $arguments,\n ));\n #{_property-name($property-name, block)}: _maybe-rem($to-rem, $arguments);\n\n }\n\n } @else if $dimension == block-start {\n\n @include _maybe-rem($to-rem, _property-name($property-name, top), $arguments);\n #{_property-name($property-name, block-start)}: _maybe-rem($to-rem, $arguments);\n\n } @else if $dimension == block-end {\n\n @include _maybe-rem($to-rem, _property-name($property-name, bottom), $arguments);\n #{_property-name($property-name, block-end)}: _maybe-rem($to-rem, $arguments);\n\n } @else if $dimension == block-size {\n\n @include _maybe-rem($to-rem, _property-name($property-name, height), $arguments);\n #{_property-name($property-name, block-size)}: _maybe-rem($to-rem, $arguments);\n\n } @else if index((top, bottom, left, right, width, height), $dimension) {\n @include _error(\"'#{$dimension}' is a physical dimension, use its logical equivilant\");\n } @else {\n @include _error(\"Unknown dimension '#{$dimension}'\");\n }\n\n}\n","@import \"../variables/font\";\n@import \"../vendor/sass-rem/rem\";\n\n$rem-baseline: $font-size;\n$rem-fallback: true;\n\n// Overridden to apply https://github.com/pierreburel/sass-rem/pull/12\n@mixin rem($properties, $values...) {\n\n @if type-of($properties) == \"map\" {\n\n @each $property in map-keys($properties) {\n @include rem($property, map-get($properties, $property));\n }\n\n } @else {\n\n $convert: false;\n @each $valueList in $values {\n @each $value in $valueList {\n @if type-of($value) == \"number\" and index((rem, px), unit($value)) {\n $convert: true;\n }\n }\n }\n\n @each $property in $properties {\n @if $convert == true {\n @if $rem-fallback or $rem-px-only {\n #{$property}: rem-convert(px, $values...);\n }\n @if not $rem-px-only {\n #{$property}: rem-convert(rem, $values...);\n }\n } @else if $rem-px-only {\n #{$property}: rem-convert(px, $values...);\n } @else {\n #{$property}: $values;\n }\n }\n\n }\n\n}\n","$font-letterspacing-label: 1px;\n$font-primary: \"Noto Serif\", serif;\n$font-secondary: \"Noto Sans\", Arial, Helvetica, sans-serif;\n$font-monospace: \"Courier 10 Pitch\", Courier, monospace;\n$font-size: 16px;\n","$rem-baseline: 16px !default;\n$rem-fallback: false !default;\n$rem-px-only: false !default;\n\n@function rem-separator($list, $separator: false) {\n @if $separator == \"comma\" or $separator == \"space\" {\n @return append($list, null, $separator);\n } \n \n @if function-exists(\"list-separator\") == true {\n @return list-separator($list);\n }\n\n // list-separator polyfill by Hugo Giraudel (https://sass-compatibility.github.io/#list_separator_function)\n $test-list: ();\n @each $item in $list {\n $test-list: append($test-list, $item, space);\n }\n\n @return if($test-list == $list, space, comma);\n}\n\n@mixin rem-baseline($zoom: 100%) {\n font-size: $zoom / 16px * $rem-baseline;\n}\n\n@function rem-convert($to, $values...) {\n $result: ();\n $separator: rem-separator($values);\n \n @each $value in $values {\n @if type-of($value) == \"number\" and unit($value) == \"rem\" and $to == \"px\" {\n $result: append($result, $value / 1rem * $rem-baseline, $separator);\n } @else if type-of($value) == \"number\" and unit($value) == \"px\" and $to == \"rem\" {\n $result: append($result, $value / $rem-baseline * 1rem, $separator);\n } @else if type-of($value) == \"list\" {\n $value-separator: rem-separator($value);\n $value: rem-convert($to, $value...);\n $value: rem-separator($value, $value-separator);\n $result: append($result, $value, $separator);\n } @else {\n $result: append($result, $value, $separator);\n }\n }\n\n @return if(length($result) == 1, nth($result, 1), $result);\n}\n\n@function rem($values...) {\n @if $rem-px-only {\n @return rem-convert(px, $values...);\n } @else {\n @return rem-convert(rem, $values...);\n }\n}\n\n@mixin rem($properties, $values...) {\n @if type-of($properties) == \"map\" {\n @each $property in map-keys($properties) {\n @include rem($property, map-get($properties, $property));\n }\n } @else {\n @each $property in $properties {\n @if $rem-fallback or $rem-px-only {\n #{$property}: rem-convert(px, $values...);\n }\n @if not $rem-px-only {\n #{$property}: rem-convert(rem, $values...);\n }\n }\n }\n}\n","@import \"../functions/validation\";\n\n@mixin _error($message) {\n _error: _error($message);\n}\n\n@mixin _expect_at_most($value, $maxLength, $message: \"Expected at most #{$maxLength} values\") {\n\n @if length($value) > $maxLength {\n @include _error($message);\n } @else {\n @content;\n }\n\n}\n\n@mixin _expect_single_value($value, $message: \"Expected a single value\") {\n\n @include _expect_at_most($value, 1, $message) {\n @content;\n }\n\n}\n","$_is-test: false !default;\n\n@function _error($message, $capture: $_is-test) {\n @if $capture {\n @return $message;\n }\n\n @error $message;\n}\n","$color-primary-normal: rgb(2, 136, 209);\n$color-primary-light: rgb(179, 229, 252);\n$color-primary-dark: rgb(2, 119, 189);\n$color-text-normal: rgb(33, 33, 33);\n$color-text-reverse: rgb(255, 255, 255);\n$color-text-secondary: rgb(136, 136, 136);\n$color-text-secondary__reverse: rgb(158, 158, 158);\n$color-text-placeholder: rgb(189, 189, 189);\n$color-text-dividers: rgb(224, 224, 224);\n$color-text-dividers__reverse: rgb(97, 97, 97);\n$color-text-ui_background: rgb(255, 255, 255);\n$color-text-ui_background_hue: rgb(245, 245, 245);\n$color-text-ui_code: rgb(247, 247, 247);\n$color-text-ui_background__reverse: rgb(33, 33, 33);\n$color-text-ui_background_hue__reverse: rgb(51, 51, 51);\n$color-background: rgb(255, 255, 255);\n$color-information: rgb(2, 136, 209);\n$color-success: rgb(98, 159, 67);\n$color-success_dark: rgb(86, 144, 55);\n$color-attention: rgb(207, 12, 78);\n$color-warning: rgb(230, 81, 0);\n","$grid-edge_space-medium: 7vw;\n$grid-edge_space-large: 14vw;\n$grid-min_width: 320px;\n$grid-max_width: 1114px;\n$grid-main_column_count: 12;\n$grid-column_gap: 1.6%;\n$grid-divider_size: 1px;\n","@import \"logical-properties\";\n@import \"media-query\";\n@import \"sizes\";\n@import \"types\";\n@import \"validation\";\n@import \"../variables/baselinegrid\";\n\n// Fallbacks for CSS logical properties contained within this mixin require the following treatment of HTML dir attributes:\n// - document level: always specified, via the HTML element\n// - block level: specified on every element within a block describing a direction switch.\n//\n// For example:\n// \n// ...\n//
\n// Doesn't need a dir attribute. Most cases will be like this.\n//
\n//\n//
\n//\n// This block changes the text direction. Every descendant element must have its own dir attribute....\n//\n//
... even if the direction doesn't change.
\n//\n//
But obviously also when it does.
\n//\n//
\n@mixin _spacing($sizes, $space-type, $dimension: \"\") {\n\n @if $dimension == \"\" {\n\n @include _expect_at_most($sizes, 4, \"More than four sizes supplied when no dimension\") {\n @include rem($space-type, $sizes);\n }\n\n } @else if $dimension == inline {\n\n @include _expect_at_most($sizes, 2, \"More than two sizes supplied with 'inline' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == inline-start {\n\n @include _expect_single_value($sizes, \"More than one size supplied with 'inline-start' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == inline-end {\n\n @include _expect_single_value($sizes, \"More than one size supplied with 'inline-end' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == block {\n\n @include _expect_at_most($sizes, 2, \"More than two sizes supplied with 'block' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == block-start {\n\n @include _expect_single_value($sizes, \"More than one size supplied with 'block-start' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == block-end {\n\n @include _expect_single_value($sizes, \"More than one size supplied with 'block-end' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if index((top, bottom, left, right), $dimension) {\n @include _error(\"'#{$dimension}' is a physical dimension, use its logical equivilant\");\n } @else {\n @include _error(\"Unknown dimension '#{$dimension}'\");\n }\n\n}\n\n@mixin padding($sizes, $dimension: \"\") {\n @include _spacing($sizes, padding, $dimension);\n}\n\n@mixin margin($sizes, $dimension: \"\") {\n @include _spacing($sizes, margin, $dimension);\n}\n\n@mixin nospace($dimension: \"\") {\n @include margin(0, $dimension);\n @include padding(0, $dimension);\n}\n\n@mixin block-spacing($start: 0, $end: $baselinegrid-space-small) {\n @include margin($start $end, block);\n}\n\n@function _calculate-spacing($block-size, $unit-size: $baselinegrid-space-small) {\n $remaining: $unit-size - $block-size;\n\n @if ($remaining > 0) {\n @return $remaining;\n }\n\n @return $unit-size;\n}\n\n@mixin h1-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-medium));\n}\n\n@mixin h2-spacing() {\n @include block-spacing($end: _calculate-spacing(($baselinegrid-space-small + $baselinegrid-space-smallish) / 2, $baselinegrid-space-medium));\n}\n\n@mixin h3-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-small, $baselinegrid-space-medium));\n}\n\n@mixin h4-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-small, $baselinegrid-space-medium));\n}\n\n@mixin h5-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-small, $baselinegrid-space-medium));\n}\n\n@mixin h6-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-small, $baselinegrid-space-medium));\n}\n\n@mixin list-style-none() {\n list-style: none;\n @include padding(0, inline-start);\n}\n","@import \"../variables/breakpoint\";\n@import \"../variables/font\";\n\n$mq-base-font-size: $font-size;\n\n$mq-breakpoints: (\n x-small: $breakpoint-site-x_small,\n small: $breakpoint-site-small,\n medium: $breakpoint-site-medium,\n wide: $breakpoint-site-wide,\n x-wide: $breakpoint-site-x_wide,\n);\n\n@import \"../vendor/sass-mq/_mq\";\n","$breakpoint-site-x_small: 320px;\n$breakpoint-site-small: 480px;\n$breakpoint-site-medium: 730px;\n$breakpoint-site-wide: 900px;\n$breakpoint-site-x_wide: 1200px;\n","@charset \"UTF-8\"; // Fixes an issue where Ruby locale is not set properly\n // See https://github.com/sass-mq/sass-mq/pull/10\n\n/// Base font size on the `` element\n/// @type Number (unit)\n$mq-base-font-size: 16px !default;\n\n/// Responsive mode\n///\n/// Set to `false` to enable support for browsers that do not support @media queries,\n/// (IE <= 8, Firefox <= 3, Opera <= 9)\n///\n/// You could create a stylesheet served exclusively to older browsers,\n/// where @media queries are rasterized\n///\n/// @example scss\n/// // old-ie.scss\n/// $mq-responsive: false;\n/// @import 'main'; // @media queries in this file will be rasterized up to $mq-static-breakpoint\n/// // larger breakpoints will be ignored\n///\n/// @type Boolean\n/// @link https://github.com/sass-mq/sass-mq#responsive-mode-off Disabled responsive mode documentation\n$mq-responsive: true !default;\n\n/// Breakpoint list\n///\n/// Name your breakpoints in a way that creates a ubiquitous language\n/// across team members. It will improve communication between\n/// stakeholders, designers, developers, and testers.\n///\n/// @type Map\n/// @link https://github.com/sass-mq/sass-mq#seeing-the-currently-active-breakpoint Full documentation and examples\n$mq-breakpoints: (\n mobile: 320px,\n tablet: 740px,\n desktop: 980px,\n wide: 1300px\n) !default;\n\n/// Static breakpoint (for fixed-width layouts)\n///\n/// Define the breakpoint from $mq-breakpoints that should\n/// be used as the target width for the fixed-width layout\n/// (i.e. when $mq-responsive is set to 'false') in a old-ie.scss\n///\n/// @example scss\n/// // tablet-only.scss\n/// //\n/// // Ignore all styles above tablet breakpoint,\n/// // and fix the styles (e.g. layout) at tablet width\n/// $mq-responsive: false;\n/// $mq-static-breakpoint: tablet;\n/// @import 'main'; // @media queries in this file will be rasterized up to tablet\n/// // larger breakpoints will be ignored\n///\n/// @type String\n/// @link https://github.com/sass-mq/sass-mq#adding-custom-breakpoints Full documentation and examples\n$mq-static-breakpoint: desktop !default;\n\n/// Show breakpoints in the top right corner\n///\n/// If you want to display the currently active breakpoint in the top\n/// right corner of your site during development, add the breakpoints\n/// to this list, ordered by width, e.g. (mobile, tablet, desktop).\n///\n/// @type map\n$mq-show-breakpoints: () !default;\n\n/// Customize the media type (e.g. `@media screen` or `@media print`)\n/// By default sass-mq uses an \"all\" media type (`@media all and …`)\n///\n/// @type String\n/// @link https://github.com/sass-mq/sass-mq#changing-media-type Full documentation and examples\n$mq-media-type: all !default;\n\n/// Convert pixels to ems\n///\n/// @param {Number} $px - value to convert\n/// @param {Number} $base-font-size ($mq-base-font-size) - `` font size\n///\n/// @example scss\n/// $font-size-in-ems: mq-px2em(16px);\n/// p { font-size: mq-px2em(16px); }\n///\n/// @requires $mq-base-font-size\n/// @returns {Number}\n@function mq-px2em($px, $base-font-size: $mq-base-font-size) {\n @if unitless($px) {\n @warn \"Assuming #{$px} to be in pixels, attempting to convert it into pixels.\";\n @return mq-px2em($px * 1px, $base-font-size);\n } @else if unit($px) == em {\n @return $px;\n }\n @return ($px / $base-font-size) * 1em;\n}\n\n/// Get a breakpoint's width\n///\n/// @param {String} $name - Name of the breakpoint. One of $mq-breakpoints\n///\n/// @example scss\n/// $tablet-width: mq-get-breakpoint-width(tablet);\n/// @media (min-width: mq-get-breakpoint-width(desktop)) {}\n///\n/// @requires {Variable} $mq-breakpoints\n///\n/// @returns {Number} Value in pixels\n@function mq-get-breakpoint-width($name, $breakpoints: $mq-breakpoints) {\n @if map-has-key($breakpoints, $name) {\n @return map-get($breakpoints, $name);\n } @else {\n @warn \"Breakpoint #{$name} wasn't found in $breakpoints.\";\n }\n}\n\n/// Media Query mixin\n///\n/// @param {String | Boolean} $from (false) - One of $mq-breakpoints\n/// @param {String | Boolean} $until (false) - One of $mq-breakpoints\n/// @param {String | Boolean} $and (false) - Additional media query parameters\n/// @param {String} $media-type ($mq-media-type) - Media type: screen, print…\n///\n/// @ignore Undocumented API, for advanced use only:\n/// @ignore @param {Map} $breakpoints ($mq-breakpoints)\n/// @ignore @param {String} $static-breakpoint ($mq-static-breakpoint)\n///\n/// @content styling rules, wrapped into a @media query when $responsive is true\n///\n/// @requires {Variable} $mq-media-type\n/// @requires {Variable} $mq-breakpoints\n/// @requires {Variable} $mq-static-breakpoint\n/// @requires {function} mq-px2em\n/// @requires {function} mq-get-breakpoint-width\n///\n/// @link https://github.com/sass-mq/sass-mq#responsive-mode-on-default Full documentation and examples\n///\n/// @example scss\n/// .element {\n/// @include mq($from: mobile) {\n/// color: red;\n/// }\n/// @include mq($until: tablet) {\n/// color: blue;\n/// }\n/// @include mq(mobile, tablet) {\n/// color: green;\n/// }\n/// @include mq($from: tablet, $and: '(orientation: landscape)') {\n/// color: teal;\n/// }\n/// @include mq(950px) {\n/// color: hotpink;\n/// }\n/// @include mq(tablet, $media-type: screen) {\n/// color: hotpink;\n/// }\n/// // Advanced use:\n/// $my-breakpoints: (L: 900px, XL: 1200px);\n/// @include mq(L, $breakpoints: $my-breakpoints, $static-breakpoint: L) {\n/// color: hotpink;\n/// }\n/// }\n@mixin mq(\n $from: false,\n $until: false,\n $and: false,\n $media-type: $mq-media-type,\n $breakpoints: $mq-breakpoints,\n $responsive: $mq-responsive,\n $static-breakpoint: $mq-static-breakpoint\n) {\n $min-width: 0;\n $max-width: 0;\n $media-query: '';\n\n // From: this breakpoint (inclusive)\n @if $from {\n @if type-of($from) == number {\n $min-width: mq-px2em($from);\n } @else {\n $min-width: mq-px2em(mq-get-breakpoint-width($from, $breakpoints));\n }\n }\n\n // Until: that breakpoint (exclusive)\n @if $until {\n @if type-of($until) == number {\n $max-width: mq-px2em($until);\n } @else {\n $max-width: mq-px2em(mq-get-breakpoint-width($until, $breakpoints)) - .01em;\n }\n }\n\n // Responsive support is disabled, rasterize the output outside @media blocks\n // The browser will rely on the cascade itself.\n @if $responsive == false {\n $static-breakpoint-width: mq-get-breakpoint-width($static-breakpoint, $breakpoints);\n $target-width: mq-px2em($static-breakpoint-width);\n\n // Output only rules that start at or span our target width\n @if (\n $and == false\n and $min-width <= $target-width\n and (\n $until == false or $max-width >= $target-width\n )\n and $media-type != 'print'\n ) {\n @content;\n }\n }\n\n // Responsive support is enabled, output rules inside @media queries\n @else {\n @if $min-width != 0 { $media-query: '#{$media-query} and (min-width: #{$min-width})'; }\n @if $max-width != 0 { $media-query: '#{$media-query} and (max-width: #{$max-width})'; }\n @if $and { $media-query: '#{$media-query} and #{$and}'; }\n\n // Remove unnecessary media query prefix 'all and '\n @if ($media-type == 'all' and $media-query != '') {\n $media-type: '';\n $media-query: str-slice(unquote($media-query), 6);\n }\n\n @media #{$media-type + $media-query} {\n @content;\n }\n }\n}\n\n/// Quick sort\n///\n/// @author Sam Richards\n/// @access private\n/// @param {List} $list - List to sort\n/// @returns {List} Sorted List\n@function _mq-quick-sort($list) {\n $less: ();\n $equal: ();\n $large: ();\n\n @if length($list) > 1 {\n $seed: nth($list, ceil(length($list) / 2));\n\n @each $item in $list {\n @if ($item == $seed) {\n $equal: append($equal, $item);\n } @else if ($item < $seed) {\n $less: append($less, $item);\n } @else if ($item > $seed) {\n $large: append($large, $item);\n }\n }\n\n @return join(join(_mq-quick-sort($less), $equal), _mq-quick-sort($large));\n }\n\n @return $list;\n}\n\n/// Sort a map by values (works with numbers only)\n///\n/// @access private\n/// @param {Map} $map - Map to sort\n/// @returns {Map} Map sorted by value\n@function _mq-map-sort-by-value($map) {\n $map-sorted: ();\n $map-keys: map-keys($map);\n $map-values: map-values($map);\n $map-values-sorted: _mq-quick-sort($map-values);\n\n // Reorder key/value pairs based on key values\n @each $value in $map-values-sorted {\n $index: index($map-values, $value);\n $key: nth($map-keys, $index);\n $map-sorted: map-merge($map-sorted, ($key: $value));\n\n // Unset the value in $map-values to prevent the loop\n // from finding the same index twice\n $map-values: set-nth($map-values, $index, 0);\n }\n\n @return $map-sorted;\n}\n\n/// Add a breakpoint\n///\n/// @param {String} $name - Name of the breakpoint\n/// @param {Number} $width - Width of the breakpoint\n///\n/// @requires {Variable} $mq-breakpoints\n///\n/// @example scss\n/// @include mq-add-breakpoint(tvscreen, 1920px);\n/// @include mq(tvscreen) {}\n@mixin mq-add-breakpoint($name, $width) {\n $new-breakpoint: ($name: $width);\n $mq-breakpoints: map-merge($mq-breakpoints, $new-breakpoint) !global;\n $mq-breakpoints: _mq-map-sort-by-value($mq-breakpoints) !global;\n}\n\n/// Show the active breakpoint in the top right corner of the viewport\n/// @link https://github.com/sass-mq/sass-mq#seeing-the-currently-active-breakpoint\n///\n/// @param {List} $show-breakpoints ($mq-show-breakpoints) - List of breakpoints to show in the top right corner\n/// @param {Map} $breakpoints ($mq-breakpoints) - Breakpoint names and sizes\n///\n/// @requires {Variable} $mq-breakpoints\n/// @requires {Variable} $mq-show-breakpoints\n///\n/// @example scss\n/// // Show breakpoints using global settings\n/// @include mq-show-breakpoints;\n///\n/// // Show breakpoints using custom settings\n/// @include mq-show-breakpoints((L, XL), (S: 300px, L: 800px, XL: 1200px));\n@mixin mq-show-breakpoints($show-breakpoints: $mq-show-breakpoints, $breakpoints: $mq-breakpoints) {\n body:before {\n background-color: #FCF8E3;\n border-bottom: 1px solid #FBEED5;\n border-left: 1px solid #FBEED5;\n color: #C09853;\n font: small-caption;\n padding: 3px 6px;\n pointer-events: none;\n position: fixed;\n right: 0;\n top: 0;\n z-index: 100;\n\n // Loop through the breakpoints that should be shown\n @each $show-breakpoint in $show-breakpoints {\n $width: mq-get-breakpoint-width($show-breakpoint, $breakpoints);\n @include mq($show-breakpoint, $breakpoints: $breakpoints) {\n content: \"#{$show-breakpoint} ≥ #{$width} (#{mq-px2em($width)})\";\n }\n }\n }\n}\n\n@if length($mq-show-breakpoints) > 0 {\n @include mq-show-breakpoints;\n}\n","@import \"logical-properties\";\n@import \"types\";\n@import \"validation\";\n\n@mixin block-size($size) {\n @include _expect_single_value($size) {\n @include logical-property(\"\", block-size, ($size));\n }\n}\n\n@mixin inline-size($size) {\n @include _expect_single_value($size) {\n @include logical-property(\"\", inline-size, ($size));\n }\n}\n\n@mixin _constrain-block-size($size, $extreme) {\n @include logical-property($extreme, block-size, ($size));\n}\n\n@mixin _constrain-inline-size($size, $extreme) {\n @include logical-property($extreme, inline-size, ($size));\n}\n\n@mixin max-block-size($size) {\n @include _expect_single_value($size) {\n @include _constrain-block-size($size, max);\n }\n}\n\n@mixin min-block-size($size) {\n @include _expect_single_value($size) {\n @include _constrain-block-size($size, min);\n }\n}\n\n@mixin max-inline-size($size) {\n @include _expect_single_value($size) {\n @include _constrain-inline-size($size, max);\n }\n}\n\n@mixin min-inline-size($size) {\n @include _expect_single_value($size) {\n @include _constrain-inline-size($size, min);\n }\n}\n\n@mixin truncate-with-ellipsis() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:lang(zh-Hant-HK) {\n text-overflow: \"⋯\";\n }\n}\n","$baselinegrid-space-extra_small: 12px;\n$baselinegrid-space-small: 24px;\n$baselinegrid-space-smallish: 36px;\n$baselinegrid-space-medium: 48px;\n$baselinegrid-space-large: 72px;\n$baselinegrid-space-extra_large: 120px;\n","@import \"../mixins/types\";\n@import \"../variables/baselinegrid\";\n@import \"../variables/color\";\n@import \"../variables/font\";\n@import \"spacing\";\n@import \"utilities\";\n@import \"scale\";\n\n@mixin set-font-size-and-line-height($font-size, $block-size: $baselinegrid-space-small) {\n @include rem(font-size, $font-size);\n line-height: $block-size / $font-size;\n}\n\n@mixin _heading-base-typography() {\n font-family: $font-secondary;\n font-weight: 600;\n}\n\n@mixin h1-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(7), $baselinegrid-space-medium);\n}\n\n@mixin h2-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(4), ($baselinegrid-space-small + $baselinegrid-space-smallish) / 2);\n}\n\n@mixin h3-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(3));\n}\n\n@mixin h4-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(2));\n}\n\n@mixin h5-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(1));\n}\n\n@mixin h6-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(0));\n}\n\n@mixin body-typography() {\n font-family: $font-primary;\n @include set-font-size-and-line-height(scale(0));\n font-weight: normal;\n}\n\n@mixin inline-image {\n @include margin(0.1em, block-end);\n @include max-block-size(1em);\n vertical-align: middle;\n}\n\n@mixin _base-font-variant-position($position) {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n @supports (font-variant-position: #{$position}) {\n font-size: inherit;\n font-variant-position: $position;\n position: static;\n }\n}\n\n@mixin font-variant-position($position) {\n @if $position == sub {\n @include _base_font-variant-position($position);\n bottom: -0.25em; // stylelint-disable-line csstools/use-logical\n } @else if $position == super {\n @include _base_font-variant-position($position);\n top: -0.5em; // stylelint-disable-line csstools/use-logical\n } @else {\n @include _error(\"Unknown position '#{$position}'\");\n }\n}\n\n@mixin _label-typography($color, $uppercase: true) {\n color: $color;\n font-family: $font-secondary;\n font-weight: normal;\n @include set-font-size-and-line-height(scale(-3));\n letter-spacing: $font-letterspacing-label;\n @if $uppercase {\n text-transform: uppercase;\n }\n}\n\n@mixin label-content-typography($color: $color-text-secondary, $uppercase: true) {\n @include _label-typography($color, $uppercase);\n}\n\n@mixin label-tag-typography() {\n @include _label-typography($color-primary-normal);\n}\n\n@mixin covert-link($hover-color: $color-primary-dark) {\n @include inherit-all($ensure: color text-decoration);\n cursor: pointer;\n\n &:hover {\n color: $hover-color;\n }\n}\n\n@mixin list-style-none() {\n @include padding(0, inline-start);\n // Overflow auto is so the bullet will be still read from a screen reader and will push the bullet off screen\n overflow: auto;\n}\n","@mixin inherit-all($ensure: ()) {\n @each $property in $ensure {\n #{$property}: inherit;\n }\n\n all: inherit;\n}\n","@import \"../variables/font\";\n@import \"../vendor/modularscale-sass/stylesheets/modularscale\";\n\n@function scale($value: 0) {\n @return round(ms-function($value, $font-size, $major-second));\n}\n","// Defaults and variables\n@import 'modularscale/vars';\n\n// Core functions\n@import 'modularscale/settings';\n@import 'modularscale/pow';\n@import 'modularscale/strip-units';\n@import 'modularscale/sort';\n@import 'modularscale/target';\n@import 'modularscale/function';\n@import 'modularscale/round-px';\n\n// Mixins\n@import 'modularscale/respond';\n\n// Syntax sugar\n@import 'modularscale/sugar';","// Ratios\n$double-octave : 4 ;\n$pi : 3.14159265359 ;\n$major-twelfth : 3 ;\n$major-eleventh : 2.666666667 ;\n$major-tenth : 2.5 ;\n$octave : 2 ;\n$major-seventh : 1.875 ;\n$minor-seventh : 1.777777778 ;\n$major-sixth : 1.666666667 ;\n$phi : 1.618034 ;\n$golden : $phi ;\n$minor-sixth : 1.6 ;\n$fifth : 1.5 ;\n$augmented-fourth : 1.41421 ;\n$fourth : 1.333333333 ;\n$major-third : 1.25 ;\n$minor-third : 1.2 ;\n$major-second : 1.125 ;\n$minor-second : 1.066666667 ;\n\n// Base config\n$ms-base : 1em !default;\n$ms-ratio : $fifth !default;\n$modularscale : () !default;","// Parse settings starting with defaults.\n// Settings should cascade down like you would expect in CSS.\n// More specific overrides previous settings.\n\n@function ms-settings($b: false, $r: false, $t: false, $m: $modularscale) {\n $base: $ms-base;\n $ratio: $ms-ratio;\n $thread: map-get($m, $t);\n\n // Override with user settings\n @if map-get($m, base) {\n $base: map-get($m, base);\n }\n @if map-get($m, ratio) {\n $ratio: map-get($m, ratio);\n }\n\n // Override with thread settings\n @if $thread {\n @if map-get($thread, base) {\n $base: map-get($thread, base);\n }\n @if map-get($thread, ratio) {\n $ratio: map-get($thread, ratio);\n }\n }\n\n // Override with inline settings\n @if $b {\n $base: $b;\n }\n @if $r {\n $ratio: $r;\n }\n\n @return $base $ratio;\n}","// Sass does not have native pow() support so this needs to be added.\n// Compass and other libs implement this more extensively.\n// In order to keep this simple, use those when they are avalible.\n// Issue for pow() support in Sass: https://github.com/sass/sass/issues/684\n\n@function ms-pow($b,$e) {\n\n // Return 1 if exponent is 0\n @if $e == 0 {\n @return 1;\n }\n\n // If pow() exists (compass or mathsass) use that.\n @if function-exists('pow') {\n @return pow($b,$e);\n }\n\n // This does not support non-integer exponents,\n // Check and return an error if a non-integer exponent is passed.\n @if (floor($e) != $e) {\n @error 'Non-integer values are not supported in modularscale by default. Try using mathsass in your project to add non-integer scale support. https://github.com/terkel/mathsass'\n }\n\n // Seed the return.\n $ms-return: $b;\n\n // Multiply or divide by the specified number of times.\n @if $e > 0 {\n @for $i from 1 to $e {\n $ms-return: $ms-return * $b;\n }\n }\n @if $e < 0 {\n @for $i from $e through 0 {\n $ms-return: $ms-return / $b;\n }\n }\n @return $ms-return;\n}","// Stripping units is not a best practice\n// This function should not be used elsewhere\n// It is used here because calc() doesn't do unit logic\n// AND target ratios use units as a hack to get a number.\n@function ms-unitless($val) {\n @return ($val / ($val - $val + 1));\n}","// Basic list sorting\n// Would like to replace with http://sassmeister.com/gist/30e4863bd03ce0e1617c\n// Unfortunately libsass has a bug with passing arguments into the min() funciton.\n\n@function ms-sort($l) {\n\n // loop until the list is confirmed to be sorted\n $sorted: false;\n @while $sorted == false {\n\n // Start with the assumption that the lists are sorted.\n $sorted: true;\n\n // Loop through the list, checking each value with the one next to it.\n // Swap the values if they need to be swapped.\n // Not super fast but simple and modular scale doesn't lean hard on sorting.\n @for $i from 2 through length($l) {\n $n1: nth($l,$i - 1);\n $n2: nth($l,$i);\n\n // If the first value is greater than the 2nd, swap them.\n @if $n1 > $n2 {\n $l: set-nth($l, $i, $n1);\n $l: set-nth($l, $i - 1, $n2);\n\n // The list isn't sorted and needs to be looped through again.\n $sorted: false;\n }\n }\n }\n\n // Return the sorted list.\n @return $l;\n}","// Convert number string to number\n@function ms-to-num($n) {\n $l: str-length($n);\n $r: 0;\n $m: str-index($n,'.');\n @if $m == null {\n $m: $l + 1;\n }\n // Loop through digits and convert to numbers\n @for $i from 1 through $l {\n $v: str-slice($n,$i,$i);\n @if $v == '1' { $v: 1; }\n @else if $v == '2' { $v: 2; }\n @else if $v == '3' { $v: 3; }\n @else if $v == '4' { $v: 4; }\n @else if $v == '5' { $v: 5; }\n @else if $v == '6' { $v: 6; }\n @else if $v == '7' { $v: 7; }\n @else if $v == '8' { $v: 8; }\n @else if $v == '9' { $v: 9; }\n @else if $v == '0' { $v: 0; }\n @else { $v: null; }\n @if $v != null {\n $m: $m - 1;\n $r: $r + ms-pow(10,$m - 1) * $v;\n } @else {\n $l: $l - 1;\n }\n }\n @return $r;\n}\n\n// Find a ratio based on a target value\n@function ms-target($t,$b) {\n // Convert to string\n $t: $t + '';\n // Remove base units to calulate ratio\n $b: ms-unitless(nth($b,1));\n // Find where 'at' is in the string\n $at: str-index($t,'at');\n\n // Slice the value and target out\n // and convert strings to numbers\n $v: ms-to-num(str-slice($t,0,$at - 1));\n $t: ms-to-num(str-slice($t,$at + 2));\n\n // Solve the modular scale function for the ratio.\n @return ms-pow(($v/$b),(1/$t));\n}","@function ms-function($v: 0, $base: false, $ratio: false, $thread: false, $settings: $modularscale) {\n\n // Parse settings\n $ms-settings: ms-settings($base,$ratio,$thread,$settings);\n $base: nth($ms-settings, 1);\n $ratio: nth($ms-settings, 2);\n\n // Render target values from settings.\n @if unit($ratio) != '' {\n $ratio: ms-target($ratio,$base)\n }\n\n // Fast calc if not multi stranded\n @if(length($base) == 1) {\n @return ms-pow($ratio, $v) * $base;\n }\n\n // Create new base array\n $ms-bases: nth($base,1);\n\n // Normalize base values\n @for $i from 2 through length($base) {\n // initial base value\n $ms-base: nth($base,$i);\n // If the base is bigger than the main base\n @if($ms-base > nth($base,1)) {\n // divide the value until it aligns with main base.\n @while($ms-base > nth($base,1)) {\n $ms-base: $ms-base / $ratio;\n }\n $ms-base: $ms-base * $ratio;\n }\n // If the base is smaller than the main base.\n @else if ($ms-base < nth($base,1)) {\n // pump up the value until it aligns with main base.\n @while $ms-base < nth($base,1) {\n $ms-base: $ms-base * $ratio;\n }\n }\n // Push into new array\n $ms-bases: append($ms-bases,$ms-base);\n }\n\n // Sort array from smallest to largest.\n $ms-bases: ms-sort($ms-bases);\n\n // Find step to use in calculation\n $vtep: floor($v / length($ms-bases));\n // Find base to use in calculation\n $ms-base: round(($v / length($ms-bases) - $vtep) * length($ms-bases)) + 1;\n\n @return ms-pow($ratio, $vtep) * nth($ms-bases,$ms-base);\n}","@function ms-round-px($r) {\n @if unit($r) == 'px' {\n @return round($r);\n }\n @warn \"ms-round-px is no longer used by modular scale and will be removed in the 3.1.0 release.\";\n @return $r;\n}","// Generate calc() function\n// based on Mike Riethmuller's Precise control over responsive typography\n// http://madebymike.com.au/writing/precise-control-responsive-typography/\n@function ms-fluid($val1: 1em, $val2: 1em, $break1: 0, $break2: 0) {\n $diff: ms-unitless($val2) - ms-unitless($val1);\n\n // v1 + (v2 - v1) * ( (100vw - b1) / b2 - b1 )\n @return calc( #{$val1} + #{ms-unitless($val2) - ms-unitless($val1)} * ( ( 100vw - #{$break1}) / #{ms-unitless($break2) - ms-unitless($break1)} ) );\n}\n\n// Main responsive mixin\n@mixin ms-respond($prop, $val, $map: $modularscale, $ms-important: false) {\n $base: $ms-base;\n $ratio: $ms-ratio;\n\n $first-write: true;\n $last-break: null;\n\n $important: '';\n\n @if $ms-important == true {\n $important: ' !important';\n }\n\n // loop through all settings with a breakpoint type value\n @each $v, $s in $map {\n @if type-of($v) == number {\n @if unit($v) != '' {\n\n // Write out the first value without a media query.\n @if $first-write {\n #{$prop}: unquote(\"#{ms-function($val, $thread: $v, $settings: $map)}#{$important}\");\n\n // Not the first write anymore, reset to false to move on.\n $first-write: false;\n $last-break: $v;\n }\n\n // Write intermediate breakpoints.\n @else {\n @media (min-width: $last-break) and (max-width: $v) {\n $val1: ms-function($val, $thread: $last-break, $settings: $map);\n $val2: ms-function($val, $thread: $v, $settings: $map);\n #{$prop}: unquote(\"#{ms-fluid($val1,$val2,$last-break,$v)}#{$important}\");\n }\n $last-break: $v;\n }\n }\n }\n }\n\n // Write the last breakpoint.\n @if $last-break {\n @media (min-width: $last-break) {\n #{$prop}: unquote(\"#{ms-function($val, $thread: $last-break, $settings: $map)}#{$important}\");\n }\n }\n}","// To attempt to avoid conflicts with other libraries\n// all funcitons are namespaced with `ms-`.\n// However, to increase usability, a shorthand function is included here.\n\n@function ms($v: 0, $base: false, $ratio: false, $thread: false, $settings: $modularscale) {\n @return ms-function($v, $base, $ratio, $thread, $settings);\n}","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","@import \"mixins/logical-properties\";\n@import \"mixins/media-query\";\n@import \"variables/grid\";\n\n:root {\n --GRID-COLUMN-GAP: #{$grid-column_gap};\n --GRID-EDGE-SPACE: #{$grid-edge_space-medium};\n --GRID-COLUMN-WIDTH: calc((100% - (var(--GRID-EDGE-SPACE) * 2) - (var(--GRID-COLUMN-GAP) * #{$grid-main_column_count - 1})) / #{$grid-main_column_count});\n\n @include mq($from: medium) {\n --GRID-EDGE-SPACE: #{$grid-edge_space-large};\n }\n\n @include mq($from: x-wide) {\n --GRID-COLUMN-GAP: #{($grid-max_width * $grid-column_gap) / 100%};\n --GRID-COLUMN-WIDTH: calc((#{$grid-max_width} - (var(--GRID-COLUMN-GAP) * #{$grid-main_column_count - 1})) / #{$grid-main_column_count});\n }\n\n @include logical-property(min, inline-size, $grid-min_width, $to-rem: false);\n}\n","@import \"../../mixins/spacing\";\n@import \"../../mixins/typography\";\n\n.content-meta {\n @include list-style-none();\n @include block-spacing();\n}\n\n.content-meta__item {\n display: inline-block;\n @include label-content-typography();\n\n &:after {\n content: \"\\a0\\2022\\a0\";\n }\n\n &:last-child:after {\n content: \"\";\n }\n}\n\n.content-meta__link {\n @include covert-link();\n}\n","@import \"../../mixins/spacing\";\n@import \"../../variables/baselinegrid\";\n\n.section__body {\n @include block-spacing($end: $baselinegrid-space-medium);\n}\n","@import \"../../mixins/sizes\";\n@import \"../../mixins/typography\";\n@import \"../../variables/baselinegrid\";\n\n.tag-list {\n @include block-spacing();\n}\n\n.tag-list__title {\n @include label-content-typography();\n @include block-spacing($end: 0);\n}\n\n.tag-list__list {\n @include list-style-none();\n @include label-tag-typography();\n}\n\n.tag-list__list--single-line {\n @include truncate-with-ellipsis();\n}\n\n.tag-list__item {\n display: inline-block;\n @include label-tag-typography();\n\n &:after {\n display: inline;\n content: \",\\a0\";\n }\n\n &:lang(ar):after {\n content: \"،\\a0\";\n }\n\n &:lang(ja):after {\n content: \"、\";\n }\n\n &:last-child:after {\n content: \"\";\n }\n}\n\n.tag-list__link {\n @include covert-link();\n}\n","@import \"../../functions/types\";\n@import \"../../mixins/scale\";\n@import \"../../mixins/decorations\";\n@import \"../../mixins/media-query\";\n@import \"../../mixins/spacing\";\n@import \"../../variables/baselinegrid\";\n@import \"../../variables/grid\";\n\n.content-header {\n text-align: center;\n @include padding($baselinegrid-space-medium, block-start);\n @include block-spacing($end: $baselinegrid-space-medium - $grid-divider_size);\n @include divider(block-end);\n}\n\n.content-header__title {\n @include block-spacing($end: $baselinegrid-space-small);\n\n &:last-child {\n @include block-spacing($end: $baselinegrid-space-medium);\n }\n}\n\n.content-header__title--xx-short {\n @include rem(font-size, scale(9));\n\n @include mq($from: small) {\n @include rem(font-size, scale(10));\n }\n}\n\n.content-header__title--x-short {\n @include rem(font-size, scale(8));\n\n @include mq($from: medium) {\n @include rem(font-size, scale(9));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(10));\n }\n}\n\n.content-header__title--short {\n @include rem(font-size, scale(6));\n\n @include mq($from: small) {\n @include rem(font-size, scale(7));\n }\n\n @include mq($from: medium) {\n @include rem(font-size, scale(8));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(9));\n }\n\n @include mq($from: x-wide) {\n @include rem(font-size, scale(10));\n }\n}\n\n.content-header__title--medium {\n @include rem(font-size, scale(4));\n\n @include mq($from: small) {\n @include rem(font-size, scale(6));\n }\n\n @include mq($from: medium) {\n @include rem(font-size, scale(7));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(8));\n }\n\n @include mq($from: x-wide) {\n @include rem(font-size, scale(10));\n }\n}\n\n.content-header__title--long {\n @include rem(font-size, scale(2));\n\n @include mq($from: small) {\n @include rem(font-size, scale(4));\n }\n\n @include mq($from: medium) {\n @include rem(font-size, scale(7));\n }\n\n @include mq($from: x-wide) {\n @include rem(font-size, scale(8));\n }\n\n}\n\n.content-header__title--x-long {\n @include rem(font-size, scale(2));\n\n @include mq($from: medium) {\n @include rem(font-size, scale(4));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(4));\n }\n\n @include mq($from: x-wide) {\n @include rem(font-size, scale(6));\n }\n}\n\n.content-header__title--xx-long {\n @include rem(font-size, scale(1));\n\n @include mq($from: small) {\n @include rem(font-size, scale(2));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(4));\n }\n}\n","@import \"../mixins/types\";\n@import \"../variables/font\";\n\n$rem-baseline: $font-size;\n$rem-fallback: true;\n","@import \"../../mixins/decorations\";\n@import \"../../mixins/media-query\";\n@import \"../../mixins/spacing\";\n@import \"../../variables/baselinegrid\";\n@import \"../../variables/grid\";\n\n.item-tags {\n @include padding($baselinegrid-space-medium - $grid-divider_size, block-start);\n @include block-spacing($end: $baselinegrid-space-medium);\n @include divider(block-start);\n text-align: center;\n\n @include mq($from: medium) {\n text-align: initial;\n }\n}\n","@import \"../../functions/grid\";\n@import \"../../mixins/grid\";\n@import \"../../mixins/media-query\";\n@import \"../../variables/grid\";\n\n.content-grid {\n --primary-column-width: #{get-overall-width($grid-main_column_count)};\n\n @include base-grid($grid-max_width);\n grid-template-areas:\n \". menu .\"\n \". primary .\";\n grid-template-columns: [full-start] 1fr [main-start] var(--primary-column-width) [main-end] 1fr [full-end];\n grid-column-gap: var(--GRID-COLUMN-GAP);\n\n @include mq($from: wide) {\n $primary-column-count: $grid-main_column_count - 2;\n $secondary-column-count: floor(($grid-main_column_count - $primary-column-count) / 2);\n $menu-column-count: $grid-main_column_count - $primary-column-count - $secondary-column-count;\n --primary-column-width: #{get-overall-width($primary-column-count)};\n --secondary-column-width: #{get-overall-width($secondary-column-count)};\n --menu-column-width: #{get-overall-width($menu-column-count)};\n grid-template-areas:\n \". . menu . .\"\n \". . primary . .\";\n grid-template-columns: [full-start] 1fr [main-start] var(--menu-column-width) var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end];\n }\n\n @include mq($from: x-wide) {\n $primary-column-count: floor($grid-main_column_count * 0.7);\n $secondary-column-count: floor(($grid-main_column_count - $primary-column-count) / 2);\n $menu-column-count: $grid-main_column_count - $primary-column-count - $secondary-column-count;\n --primary-column-width: #{get-overall-width($primary-column-count)};\n --secondary-column-width: #{get-overall-width($secondary-column-count)};\n --menu-column-width: #{get-overall-width($menu-column-count)};\n grid-template-areas: \". menu primary . .\";\n }\n}\n\n.content-grid--has-secondary {\n grid-template-areas:\n \". menu .\"\n \". primary .\"\n \". secondary .\";\n\n @include mq($from: wide) {\n $primary-column-count: floor($grid-main_column_count * 0.7);\n $secondary-column-count: $grid-main_column_count - $primary-column-count;\n --primary-column-width: #{get-overall-width($primary-column-count)};\n --secondary-column-width: #{get-overall-width($secondary-column-count)};\n grid-template-areas:\n \". menu menu .\"\n \". primary secondary .\";\n grid-template-columns: [full-start] 1fr [main-start] var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end];\n }\n\n @include mq($from: x-wide) {\n $primary-column-count: floor($grid-main_column_count * 0.6);\n $secondary-column-count: floor($grid-main_column_count * 0.25);\n $menu-column-count: $grid-main_column_count - $primary-column-count - $secondary-column-count;\n --primary-column-width: #{get-overall-width($primary-column-count)};\n --secondary-column-width: #{get-overall-width($secondary-column-count)};\n --menu-column-width: #{get-overall-width($menu-column-count)};\n grid-template-areas: \". menu primary secondary .\";\n grid-template-columns: [full-start] 1fr [main-start] var(--menu-column-width) var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end];\n }\n}\n\n.content-grid__item,\n.content-grid__item--main {\n grid-column: main;\n}\n\n.content-grid__item--full {\n grid-column: full;\n}\n\n.content-grid__item--primary {\n grid-column: primary;\n}\n\n.content-grid__item--secondary {\n grid-column: secondary;\n}\n\n.content-grid__item--menu {\n grid-column: menu;\n}\n","@function get-overall-width($columns) {\n @return calc((#{$columns} * var(--GRID-COLUMN-WIDTH)) + (#{$columns - 1} * var(--GRID-COLUMN-GAP)));\n}\n","@import \"spacing\";\n@import \"types\";\n@import \"../functions/grid\";\n@import \"../variables/grid\";\n\n@mixin base-grid($max-inline-size) {\n @include max-inline-size($max-inline-size);\n @include block-spacing($end: 0);\n @include margin(auto, inline);\n @include padding($grid-column_gap, inline);\n box-sizing: content-box;\n\n @supports (display: grid) and (--custom: property) {\n display: grid;\n @include max-inline-size(unset);\n @include margin(unset, inline);\n @include padding(unset, inline);\n box-sizing: border-box;\n }\n}\n","@import \"../../mixins/decorations\";\n@import \"../../mixins/grid\";\n@import \"../../variables/grid\";\n\n.page-grid {\n @include base-grid($grid-max_width);\n grid-template-areas:\n \"start\"\n \"main\"\n \"end\";\n}\n\n.page-grid__start {\n grid-row: start;\n @include divider(block-end);\n}\n\n.page-grid__main {\n grid-row: main;\n}\n\n.page-grid__end {\n grid-row: end;\n @include divider(block-start);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"all.css","sources":["base.scss","_fonts.scss","_normalize.scss","mixins/_decorations.scss","mixins/_logical-properties.scss","mixins/_types.scss","variables/_font.scss","vendor/sass-rem/_rem.scss","mixins/_validation.scss","functions/_validation.scss","variables/_color.scss","variables/_grid.scss","mixins/_spacing.scss","mixins/_media-query.scss","variables/_breakpoint.scss","vendor/sass-mq/_mq.scss","mixins/_sizes.scss","variables/_baselinegrid.scss","mixins/_typography.scss","mixins/_utilities.scss","mixins/_scale.scss","vendor/modularscale-sass/stylesheets/_modularscale.scss","vendor/modularscale-sass/stylesheets/modularscale/_vars.scss","vendor/modularscale-sass/stylesheets/modularscale/_settings.scss","vendor/modularscale-sass/stylesheets/modularscale/_pow.scss","vendor/modularscale-sass/stylesheets/modularscale/_strip-units.scss","vendor/modularscale-sass/stylesheets/modularscale/_sort.scss","vendor/modularscale-sass/stylesheets/modularscale/_target.scss","vendor/modularscale-sass/stylesheets/modularscale/_function.scss","vendor/modularscale-sass/stylesheets/modularscale/_round-px.scss","vendor/modularscale-sass/stylesheets/modularscale/_respond.scss","vendor/modularscale-sass/stylesheets/modularscale/_sugar.scss","vendor/normalize.css/normalize.css","_grid.scss","patterns/atoms/heading.scss","patterns/molecules/content-meta.scss","patterns/molecules/section.scss","patterns/molecules/tag-list.scss","patterns/organisms/content-header.scss","functions/_types.scss","patterns/organisms/item-tags.scss","patterns/templates/content-grid.scss","functions/_grid.scss","mixins/_grid.scss","patterns/templates/page-grid.scss"],"sourcesContent":["@import \"fonts\";\n@import \"normalize\";\n@import \"grid\";\n@import \"patterns/atoms/heading.scss\";\n@import \"patterns/molecules/content-meta.scss\";\n@import \"patterns/molecules/section.scss\";\n@import \"patterns/molecules/tag-list.scss\";\n@import \"patterns/organisms/content-header.scss\";\n@import \"patterns/organisms/item-tags.scss\";\n@import \"patterns/templates/content-grid.scss\";\n@import \"patterns/templates/page-grid.scss\";\n","@font-face {\n font-display: fallback;\n font-family: \"Noto Sans\";\n src: url(\"../../fonts/NotoSans-Regular-webfont-custom-2-subsetting.woff2\") format(\"woff2\");\n}\n\n@font-face {\n font-display: fallback;\n font-family: \"Noto Sans\";\n src: url(\"../../fonts/NotoSans-SemiBold-webfont-custom-2-subsetting.woff2\") format(\"woff2\");\n font-weight: 600;\n}\n\n@font-face {\n font-display: fallback;\n font-family: \"Noto Serif\";\n src: url(\"../../fonts/NotoSerif-Regular-webfont-custom-2-subsetting.woff2\") format(\"woff2\");\n}\n\n@font-face {\n font-display: fallback;\n font-family: \"Noto Serif\";\n src: url(\"../../fonts/NotoSerif-Bold-webfont-basic-latin-subsetting.woff2\") format(\"woff2\");\n font-weight: bold;\n}\n","@import \"mixins/decorations\";\n@import \"mixins/spacing\";\n@import \"mixins/typography\";\n@import \"variables/color\";\n@import \"variables/grid\";\n@import \"vendor/normalize.css/normalize\";\n\n*,\n*:before,\n*:after {\n box-sizing: border-box;\n}\n\nhtml {\n font-size: ($font-size / 16px) * 100%;\n}\n\nhtml,\nbody {\n @include min-block-size(100%);\n}\n\nbody {\n background-color: $color-background;\n color: $color-text-normal;\n text-rendering: optimizeLegibility;\n @include body-typography();\n}\n\nh1 {\n @include h1-typography();\n @include h1-spacing();\n}\n\nh2 {\n @include h2-typography();\n @include h2-spacing();\n}\n\nh3 {\n @include h3-typography();\n @include h3-spacing();\n}\n\nh4 {\n @include h4-typography();\n @include h4-spacing();\n}\n\nh5 {\n @include h5-typography();\n @include h5-spacing();\n}\n\nh6 {\n @include h6-typography();\n @include h6-spacing();\n}\n\naddress,\narticle,\naside,\nblockquote,\ncaption,\ndetails,\ndl,\nfieldset,\nfigcaption,\nfigure,\nfooter,\nform,\nheader,\nhr,\nmain,\nnav,\nol,\np,\npre,\nsection,\ntable,\nul {\n @include block-spacing();\n}\n\nb,\ncode,\nkbd,\nstrong {\n line-height: 1;\n}\n\nhr {\n border: 0;\n @include divider(block-end);\n @include block-spacing($end: $baselinegrid-space-small - $grid-divider_size);\n}\n\nfigure {\n @include margin(0, inline);\n}\n\ndl,\nol,\nul {\n dd > &,\n li > & {\n @include block-spacing($end: 0);\n }\n}\n\na {\n color: $color-primary-normal;\n text-decoration: none;\n}\n\ndt {\n font-weight: bold;\n\n dd + & {\n @include block-spacing($baselinegrid-space-small, 0);\n }\n}\n\ndd {\n @include margin(0, inline-start);\n}\n\naddress {\n @include set-font-size-and-line-height(scale(-3));\n}\n\nsmall {\n @include rem(font-size, scale(-3));\n}\n\nsub {\n @include font-variant-position(sub);\n}\n\nsup {\n @include font-variant-position(super);\n}\n\nimg {\n @include max-block-size(100%);\n @include max-inline-size(100%);\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np {\n img {\n @include inline-image();\n }\n}\n\n:lang(ja) {\n @at-root {\n em#{&} {\n font-style: normal;\n text-emphasis-style: open sesame;\n text‑emphasis‑position: over right;\n }\n\n strong#{&} {\n font-style: normal;\n text-emphasis-style: filled sesame;\n text‑emphasis‑position: over right;\n }\n\n u#{&} {\n text-underline-position: right;\n }\n }\n}\n\n:lang(ko) {\n @at-root {\n em#{&} {\n font-style: normal;\n text-decoration: underline;\n text-underline-position: under right;\n }\n\n strong#{&} {\n font-style: normal;\n text-emphasis-style: filled dot;\n text‑emphasis‑position: over right;\n }\n }\n}\n\n:lang(zh) {\n @at-root {\n em#{&} {\n font-style: normal;\n text-emphasis-style: open dot;\n text‑emphasis‑position: under right;\n }\n\n strong#{&} {\n font-style: normal;\n text-emphasis-style: filled dot;\n text‑emphasis‑position: under right;\n }\n\n cite#{&} {\n font-style: normal;\n text-decoration: underline;\n text-underline-style: wavy;\n }\n }\n}\n\n:lang(zh-Hant) {\n @at-root {\n em#{&} {\n text‑emphasis‑position: over right;\n }\n\n strong#{&} {\n text‑emphasis‑position: over right;\n }\n }\n}\n","@import \"../mixins/logical-properties\";\n@import \"../variables/color\";\n@import \"../variables/grid\";\n\n@mixin divider($dimension) {\n\n @if index((inline, inline-start, inline-end, block, block-start, block-end), $dimension) {\n @include logical-property(border, $dimension, ($grid-divider_size solid $color-text-dividers,), $to-rem: false);\n } @else if index((top, bottom, left, right), $dimension) {\n @include _error(\"'#{$dimension}' is a physical dimension, use its logical equivilant\");\n } @else {\n @include _error(\"Unknown dimension '#{$dimension}'\");\n }\n\n}\n","@import \"types\";\n@import \"validation\";\n\n@mixin _when-left-to-right {\n html[dir=\"ltr\"] &:not([dir]),\n &[dir=\"ltr\"] {\n @content;\n }\n}\n\n@mixin _when-right-to-left {\n html[dir=\"rtl\"] &:not([dir]),\n &[dir=\"rtl\"] {\n @content;\n }\n}\n\n@mixin _when-logical {\n html[dir][dir] & {\n @content;\n }\n}\n\n@mixin _maybe-rem($to-rem, $properties, $values: ()) {\n @if ($to-rem == false) {\n @if type-of($properties) == \"map\" {\n @each $property in map-keys($properties) {\n @include _maybe-rem($to-rem, $property, map-get($properties, $property));\n }\n } @else {\n @each $property in $properties {\n #{$property}: $values;\n }\n }\n } @else {\n @include rem($properties, $values...);\n }\n}\n\n@function _maybe-rem($to-rem, $values) {\n @if ($to-rem == false) {\n @return $values;\n } @else {\n @return rem($values...);\n }\n}\n\n@function _property-name($parts, $dimension) {\n @if (length($parts) == 0 or $parts == \"\") {\n @return $dimension;\n }\n\n @if (length($parts) == 1) {\n @return \"#{$parts}-#{$dimension}\";\n }\n\n @return \"#{nth($parts, 1)}-#{$dimension}-#{nth($parts, 2)}\";\n}\n\n@mixin logical-property($property-name, $dimension, $arguments, $to-rem: true) {\n\n @if length($property-name) > 2 {\n @include _error(\"Expected at most two property name parts\");\n } @else if $dimension == inline {\n\n @if type-of($arguments) == \"list\" and length($arguments) > 1 {\n\n @include _expect_at_most($arguments, 2, \"More than two arguments supplied with 'inline' dimension\") {\n\n $firstArgument: nth($arguments, 1);\n $secondArgument: nth($arguments, 2);\n\n @if $firstArgument == $secondArgument {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, left)}: $firstArgument,\n #{_property-name($property-name, right)}: $firstArgument,\n ));\n #{_property-name($property-name, inline)}: _maybe-rem($to-rem, $firstArgument);\n\n } @else {\n\n @include _when-left-to-right() {\n @include _maybe-rem($to-rem, _property-name($property-name, left), $firstArgument);\n @include _maybe-rem($to-rem, _property-name($property-name, right), $secondArgument);\n }\n\n @include _when-right-to-left() {\n @include _maybe-rem($to-rem, _property-name($property-name, right), $firstArgument);\n @include _maybe-rem($to-rem, _property-name($property-name, left), $secondArgument);\n }\n\n @include _when-logical() {\n #{_property-name($property-name, inline-start)}: _maybe-rem($to-rem, $firstArgument);\n #{_property-name($property-name, inline-end)}: _maybe-rem($to-rem, $secondArgument);\n }\n\n }\n\n }\n\n } @else {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, left)}: $arguments,\n #{_property-name($property-name, right)}: $arguments,\n ));\n #{_property-name($property-name, inline)}: _maybe-rem($to-rem, $arguments);\n\n }\n\n } @else if $dimension == inline-start {\n\n @include _when-left-to-right() {\n @include _maybe-rem($to-rem, _property-name($property-name, left), $arguments);\n }\n\n @include _when-right-to-left() {\n @include _maybe-rem($to-rem, _property-name($property-name, right), $arguments);\n }\n\n @include _when_logical() {\n #{_property-name($property-name, inline-start)}: _maybe-rem($to-rem, $arguments);\n }\n\n } @else if $dimension == inline-end {\n\n @include _when-left-to-right() {\n @include _maybe-rem($to-rem, _property-name($property-name, right), $arguments);\n }\n\n @include _when-right-to-left() {\n @include _maybe-rem($to-rem, _property-name($property-name, left), $arguments);\n }\n\n @include _when_logical() {\n #{_property-name($property-name, inline-end)}: _maybe-rem($to-rem, $arguments);\n }\n\n } @else if $dimension == inline-size {\n\n @include _maybe-rem($to-rem, _property-name($property-name, width), $arguments);\n #{_property-name($property-name, inline-size)}: _maybe-rem($to-rem, $arguments);\n\n } @else if $dimension == block {\n\n @if type-of($arguments) == \"list\" and length($arguments) > 1 {\n\n @include _expect_at_most($arguments, 2, \"More than two arguments supplied with 'block' dimension\") {\n\n $firstArgument: nth($arguments, 1);\n $secondArgument: nth($arguments, 2);\n\n @if $firstArgument == $secondArgument {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, top)}: $firstArgument,\n #{_property-name($property-name, bottom)}: $firstArgument,\n ));\n #{_property-name($property-name, block)}: _maybe-rem($to-rem, $firstArgument);\n\n } @else {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, top)}: $firstArgument,\n #{_property-name($property-name, bottom)}: $secondArgument,\n ));\n #{_property-name($property-name, block-start)}: _maybe-rem($to-rem, $firstArgument);\n #{_property-name($property-name, block-end)}: _maybe-rem($to-rem, $secondArgument);\n\n }\n\n }\n\n } @else {\n\n @include _maybe-rem($to-rem, (\n #{_property-name($property-name, top)}: $arguments,\n #{_property-name($property-name, bottom)}: $arguments,\n ));\n #{_property-name($property-name, block)}: _maybe-rem($to-rem, $arguments);\n\n }\n\n } @else if $dimension == block-start {\n\n @include _maybe-rem($to-rem, _property-name($property-name, top), $arguments);\n #{_property-name($property-name, block-start)}: _maybe-rem($to-rem, $arguments);\n\n } @else if $dimension == block-end {\n\n @include _maybe-rem($to-rem, _property-name($property-name, bottom), $arguments);\n #{_property-name($property-name, block-end)}: _maybe-rem($to-rem, $arguments);\n\n } @else if $dimension == block-size {\n\n @include _maybe-rem($to-rem, _property-name($property-name, height), $arguments);\n #{_property-name($property-name, block-size)}: _maybe-rem($to-rem, $arguments);\n\n } @else if index((top, bottom, left, right, width, height), $dimension) {\n @include _error(\"'#{$dimension}' is a physical dimension, use its logical equivilant\");\n } @else {\n @include _error(\"Unknown dimension '#{$dimension}'\");\n }\n\n}\n","@import \"../variables/font\";\n@import \"../vendor/sass-rem/rem\";\n\n$rem-baseline: $font-size;\n$rem-fallback: true;\n\n// Overridden to apply https://github.com/pierreburel/sass-rem/pull/12\n@mixin rem($properties, $values...) {\n\n @if type-of($properties) == \"map\" {\n\n @each $property in map-keys($properties) {\n @include rem($property, map-get($properties, $property));\n }\n\n } @else {\n\n $convert: false;\n @each $valueList in $values {\n @each $value in $valueList {\n @if type-of($value) == \"number\" and index((rem, px), unit($value)) {\n $convert: true;\n }\n }\n }\n\n @each $property in $properties {\n @if $convert == true {\n @if $rem-fallback or $rem-px-only {\n #{$property}: rem-convert(px, $values...);\n }\n @if not $rem-px-only {\n #{$property}: rem-convert(rem, $values...);\n }\n } @else if $rem-px-only {\n #{$property}: rem-convert(px, $values...);\n } @else {\n #{$property}: $values;\n }\n }\n\n }\n\n}\n","$font-letterspacing-label: 1px;\n$font-primary: \"Noto Serif\", serif;\n$font-secondary: \"Noto Sans\", Arial, Helvetica, sans-serif;\n$font-monospace: \"Courier 10 Pitch\", Courier, monospace;\n$font-size: 16px;\n","$rem-baseline: 16px !default;\n$rem-fallback: false !default;\n$rem-px-only: false !default;\n\n@function rem-separator($list, $separator: false) {\n @if $separator == \"comma\" or $separator == \"space\" {\n @return append($list, null, $separator);\n } \n \n @if function-exists(\"list-separator\") == true {\n @return list-separator($list);\n }\n\n // list-separator polyfill by Hugo Giraudel (https://sass-compatibility.github.io/#list_separator_function)\n $test-list: ();\n @each $item in $list {\n $test-list: append($test-list, $item, space);\n }\n\n @return if($test-list == $list, space, comma);\n}\n\n@mixin rem-baseline($zoom: 100%) {\n font-size: $zoom / 16px * $rem-baseline;\n}\n\n@function rem-convert($to, $values...) {\n $result: ();\n $separator: rem-separator($values);\n \n @each $value in $values {\n @if type-of($value) == \"number\" and unit($value) == \"rem\" and $to == \"px\" {\n $result: append($result, $value / 1rem * $rem-baseline, $separator);\n } @else if type-of($value) == \"number\" and unit($value) == \"px\" and $to == \"rem\" {\n $result: append($result, $value / $rem-baseline * 1rem, $separator);\n } @else if type-of($value) == \"list\" {\n $value-separator: rem-separator($value);\n $value: rem-convert($to, $value...);\n $value: rem-separator($value, $value-separator);\n $result: append($result, $value, $separator);\n } @else {\n $result: append($result, $value, $separator);\n }\n }\n\n @return if(length($result) == 1, nth($result, 1), $result);\n}\n\n@function rem($values...) {\n @if $rem-px-only {\n @return rem-convert(px, $values...);\n } @else {\n @return rem-convert(rem, $values...);\n }\n}\n\n@mixin rem($properties, $values...) {\n @if type-of($properties) == \"map\" {\n @each $property in map-keys($properties) {\n @include rem($property, map-get($properties, $property));\n }\n } @else {\n @each $property in $properties {\n @if $rem-fallback or $rem-px-only {\n #{$property}: rem-convert(px, $values...);\n }\n @if not $rem-px-only {\n #{$property}: rem-convert(rem, $values...);\n }\n }\n }\n}\n","@import \"../functions/validation\";\n\n@mixin _error($message) {\n _error: _error($message);\n}\n\n@mixin _expect_at_most($value, $maxLength, $message: \"Expected at most #{$maxLength} values\") {\n\n @if length($value) > $maxLength {\n @include _error($message);\n } @else {\n @content;\n }\n\n}\n\n@mixin _expect_single_value($value, $message: \"Expected a single value\") {\n\n @include _expect_at_most($value, 1, $message) {\n @content;\n }\n\n}\n","$_is-test: false !default;\n\n@function _error($message, $capture: $_is-test) {\n @if $capture {\n @return $message;\n }\n\n @error $message;\n}\n","$color-primary-normal: rgb(2, 136, 209);\n$color-primary-light: rgb(179, 229, 252);\n$color-primary-dark: rgb(2, 119, 189);\n$color-text-normal: rgb(33, 33, 33);\n$color-text-reverse: rgb(255, 255, 255);\n$color-text-secondary: rgb(136, 136, 136);\n$color-text-secondary__reverse: rgb(158, 158, 158);\n$color-text-placeholder: rgb(189, 189, 189);\n$color-text-dividers: rgb(224, 224, 224);\n$color-text-dividers__reverse: rgb(97, 97, 97);\n$color-text-ui_background: rgb(255, 255, 255);\n$color-text-ui_background_hue: rgb(245, 245, 245);\n$color-text-ui_code: rgb(247, 247, 247);\n$color-text-ui_background__reverse: rgb(33, 33, 33);\n$color-text-ui_background_hue__reverse: rgb(51, 51, 51);\n$color-background: rgb(255, 255, 255);\n$color-information: rgb(2, 136, 209);\n$color-success: rgb(98, 159, 67);\n$color-success_dark: rgb(86, 144, 55);\n$color-attention: rgb(207, 12, 78);\n$color-warning: rgb(230, 81, 0);\n","$grid-edge_space-medium: 7vw;\n$grid-edge_space-large: 14vw;\n$grid-min_width: 320px;\n$grid-max_width: 1114px;\n$grid-main_column_count: 12;\n$grid-column_gap: 1.6%;\n$grid-divider_size: 1px;\n","@import \"logical-properties\";\n@import \"media-query\";\n@import \"sizes\";\n@import \"types\";\n@import \"validation\";\n@import \"../variables/baselinegrid\";\n\n// Fallbacks for CSS logical properties contained within this mixin require the following treatment of HTML dir attributes:\n// - document level: always specified, via the HTML element\n// - block level: specified on every element within a block describing a direction switch.\n//\n// For example:\n// \n// ...\n//
\n// Doesn't need a dir attribute. Most cases will be like this.\n//
\n//\n//
\n//\n// This block changes the text direction. Every descendant element must have its own dir attribute....\n//\n//
... even if the direction doesn't change.
\n//\n//
But obviously also when it does.
\n//\n//
\n@mixin _spacing($sizes, $space-type, $dimension: \"\") {\n\n @if $dimension == \"\" {\n\n @include _expect_at_most($sizes, 4, \"More than four sizes supplied when no dimension\") {\n @include rem($space-type, $sizes);\n }\n\n } @else if $dimension == inline {\n\n @include _expect_at_most($sizes, 2, \"More than two sizes supplied with 'inline' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == inline-start {\n\n @include _expect_single_value($sizes, \"More than one size supplied with 'inline-start' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == inline-end {\n\n @include _expect_single_value($sizes, \"More than one size supplied with 'inline-end' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == block {\n\n @include _expect_at_most($sizes, 2, \"More than two sizes supplied with 'block' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == block-start {\n\n @include _expect_single_value($sizes, \"More than one size supplied with 'block-start' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if $dimension == block-end {\n\n @include _expect_single_value($sizes, \"More than one size supplied with 'block-end' dimension\") {\n @include logical-property($space-type, $dimension, $sizes);\n }\n\n } @else if index((top, bottom, left, right), $dimension) {\n @include _error(\"'#{$dimension}' is a physical dimension, use its logical equivilant\");\n } @else {\n @include _error(\"Unknown dimension '#{$dimension}'\");\n }\n\n}\n\n@mixin padding($sizes, $dimension: \"\") {\n @include _spacing($sizes, padding, $dimension);\n}\n\n@mixin margin($sizes, $dimension: \"\") {\n @include _spacing($sizes, margin, $dimension);\n}\n\n@mixin nospace($dimension: \"\") {\n @include margin(0, $dimension);\n @include padding(0, $dimension);\n}\n\n@mixin block-spacing($start: 0, $end: $baselinegrid-space-small) {\n @include margin($start $end, block);\n}\n\n@function _calculate-spacing($block-size, $unit-size: $baselinegrid-space-small) {\n $remaining: $unit-size - $block-size;\n\n @if ($remaining > 0) {\n @return $remaining;\n }\n\n @return $unit-size;\n}\n\n@mixin h1-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-medium));\n}\n\n@mixin h2-spacing() {\n @include block-spacing($end: _calculate-spacing(($baselinegrid-space-small + $baselinegrid-space-smallish) / 2, $baselinegrid-space-medium));\n}\n\n@mixin h3-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-small, $baselinegrid-space-medium));\n}\n\n@mixin h4-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-small, $baselinegrid-space-medium));\n}\n\n@mixin h5-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-small, $baselinegrid-space-medium));\n}\n\n@mixin h6-spacing() {\n @include block-spacing($end: _calculate-spacing($baselinegrid-space-small, $baselinegrid-space-medium));\n}\n\n@mixin list-style-none() {\n list-style: none;\n @include padding(0, inline-start);\n}\n","@import \"../variables/breakpoint\";\n@import \"../variables/font\";\n\n$mq-base-font-size: $font-size;\n\n$mq-breakpoints: (\n x-small: $breakpoint-site-x_small,\n small: $breakpoint-site-small,\n medium: $breakpoint-site-medium,\n wide: $breakpoint-site-wide,\n x-wide: $breakpoint-site-x_wide,\n);\n\n@import \"../vendor/sass-mq/_mq\";\n","$breakpoint-site-x_small: 320px;\n$breakpoint-site-small: 480px;\n$breakpoint-site-medium: 730px;\n$breakpoint-site-wide: 900px;\n$breakpoint-site-x_wide: 1200px;\n","@charset \"UTF-8\"; // Fixes an issue where Ruby locale is not set properly\n // See https://github.com/sass-mq/sass-mq/pull/10\n\n/// Base font size on the `` element\n/// @type Number (unit)\n$mq-base-font-size: 16px !default;\n\n/// Responsive mode\n///\n/// Set to `false` to enable support for browsers that do not support @media queries,\n/// (IE <= 8, Firefox <= 3, Opera <= 9)\n///\n/// You could create a stylesheet served exclusively to older browsers,\n/// where @media queries are rasterized\n///\n/// @example scss\n/// // old-ie.scss\n/// $mq-responsive: false;\n/// @import 'main'; // @media queries in this file will be rasterized up to $mq-static-breakpoint\n/// // larger breakpoints will be ignored\n///\n/// @type Boolean\n/// @link https://github.com/sass-mq/sass-mq#responsive-mode-off Disabled responsive mode documentation\n$mq-responsive: true !default;\n\n/// Breakpoint list\n///\n/// Name your breakpoints in a way that creates a ubiquitous language\n/// across team members. It will improve communication between\n/// stakeholders, designers, developers, and testers.\n///\n/// @type Map\n/// @link https://github.com/sass-mq/sass-mq#seeing-the-currently-active-breakpoint Full documentation and examples\n$mq-breakpoints: (\n mobile: 320px,\n tablet: 740px,\n desktop: 980px,\n wide: 1300px\n) !default;\n\n/// Static breakpoint (for fixed-width layouts)\n///\n/// Define the breakpoint from $mq-breakpoints that should\n/// be used as the target width for the fixed-width layout\n/// (i.e. when $mq-responsive is set to 'false') in a old-ie.scss\n///\n/// @example scss\n/// // tablet-only.scss\n/// //\n/// // Ignore all styles above tablet breakpoint,\n/// // and fix the styles (e.g. layout) at tablet width\n/// $mq-responsive: false;\n/// $mq-static-breakpoint: tablet;\n/// @import 'main'; // @media queries in this file will be rasterized up to tablet\n/// // larger breakpoints will be ignored\n///\n/// @type String\n/// @link https://github.com/sass-mq/sass-mq#adding-custom-breakpoints Full documentation and examples\n$mq-static-breakpoint: desktop !default;\n\n/// Show breakpoints in the top right corner\n///\n/// If you want to display the currently active breakpoint in the top\n/// right corner of your site during development, add the breakpoints\n/// to this list, ordered by width, e.g. (mobile, tablet, desktop).\n///\n/// @type map\n$mq-show-breakpoints: () !default;\n\n/// Customize the media type (e.g. `@media screen` or `@media print`)\n/// By default sass-mq uses an \"all\" media type (`@media all and …`)\n///\n/// @type String\n/// @link https://github.com/sass-mq/sass-mq#changing-media-type Full documentation and examples\n$mq-media-type: all !default;\n\n/// Convert pixels to ems\n///\n/// @param {Number} $px - value to convert\n/// @param {Number} $base-font-size ($mq-base-font-size) - `` font size\n///\n/// @example scss\n/// $font-size-in-ems: mq-px2em(16px);\n/// p { font-size: mq-px2em(16px); }\n///\n/// @requires $mq-base-font-size\n/// @returns {Number}\n@function mq-px2em($px, $base-font-size: $mq-base-font-size) {\n @if unitless($px) {\n @warn \"Assuming #{$px} to be in pixels, attempting to convert it into pixels.\";\n @return mq-px2em($px * 1px, $base-font-size);\n } @else if unit($px) == em {\n @return $px;\n }\n @return ($px / $base-font-size) * 1em;\n}\n\n/// Get a breakpoint's width\n///\n/// @param {String} $name - Name of the breakpoint. One of $mq-breakpoints\n///\n/// @example scss\n/// $tablet-width: mq-get-breakpoint-width(tablet);\n/// @media (min-width: mq-get-breakpoint-width(desktop)) {}\n///\n/// @requires {Variable} $mq-breakpoints\n///\n/// @returns {Number} Value in pixels\n@function mq-get-breakpoint-width($name, $breakpoints: $mq-breakpoints) {\n @if map-has-key($breakpoints, $name) {\n @return map-get($breakpoints, $name);\n } @else {\n @warn \"Breakpoint #{$name} wasn't found in $breakpoints.\";\n }\n}\n\n/// Media Query mixin\n///\n/// @param {String | Boolean} $from (false) - One of $mq-breakpoints\n/// @param {String | Boolean} $until (false) - One of $mq-breakpoints\n/// @param {String | Boolean} $and (false) - Additional media query parameters\n/// @param {String} $media-type ($mq-media-type) - Media type: screen, print…\n///\n/// @ignore Undocumented API, for advanced use only:\n/// @ignore @param {Map} $breakpoints ($mq-breakpoints)\n/// @ignore @param {String} $static-breakpoint ($mq-static-breakpoint)\n///\n/// @content styling rules, wrapped into a @media query when $responsive is true\n///\n/// @requires {Variable} $mq-media-type\n/// @requires {Variable} $mq-breakpoints\n/// @requires {Variable} $mq-static-breakpoint\n/// @requires {function} mq-px2em\n/// @requires {function} mq-get-breakpoint-width\n///\n/// @link https://github.com/sass-mq/sass-mq#responsive-mode-on-default Full documentation and examples\n///\n/// @example scss\n/// .element {\n/// @include mq($from: mobile) {\n/// color: red;\n/// }\n/// @include mq($until: tablet) {\n/// color: blue;\n/// }\n/// @include mq(mobile, tablet) {\n/// color: green;\n/// }\n/// @include mq($from: tablet, $and: '(orientation: landscape)') {\n/// color: teal;\n/// }\n/// @include mq(950px) {\n/// color: hotpink;\n/// }\n/// @include mq(tablet, $media-type: screen) {\n/// color: hotpink;\n/// }\n/// // Advanced use:\n/// $my-breakpoints: (L: 900px, XL: 1200px);\n/// @include mq(L, $breakpoints: $my-breakpoints, $static-breakpoint: L) {\n/// color: hotpink;\n/// }\n/// }\n@mixin mq(\n $from: false,\n $until: false,\n $and: false,\n $media-type: $mq-media-type,\n $breakpoints: $mq-breakpoints,\n $responsive: $mq-responsive,\n $static-breakpoint: $mq-static-breakpoint\n) {\n $min-width: 0;\n $max-width: 0;\n $media-query: '';\n\n // From: this breakpoint (inclusive)\n @if $from {\n @if type-of($from) == number {\n $min-width: mq-px2em($from);\n } @else {\n $min-width: mq-px2em(mq-get-breakpoint-width($from, $breakpoints));\n }\n }\n\n // Until: that breakpoint (exclusive)\n @if $until {\n @if type-of($until) == number {\n $max-width: mq-px2em($until);\n } @else {\n $max-width: mq-px2em(mq-get-breakpoint-width($until, $breakpoints)) - .01em;\n }\n }\n\n // Responsive support is disabled, rasterize the output outside @media blocks\n // The browser will rely on the cascade itself.\n @if $responsive == false {\n $static-breakpoint-width: mq-get-breakpoint-width($static-breakpoint, $breakpoints);\n $target-width: mq-px2em($static-breakpoint-width);\n\n // Output only rules that start at or span our target width\n @if (\n $and == false\n and $min-width <= $target-width\n and (\n $until == false or $max-width >= $target-width\n )\n and $media-type != 'print'\n ) {\n @content;\n }\n }\n\n // Responsive support is enabled, output rules inside @media queries\n @else {\n @if $min-width != 0 { $media-query: '#{$media-query} and (min-width: #{$min-width})'; }\n @if $max-width != 0 { $media-query: '#{$media-query} and (max-width: #{$max-width})'; }\n @if $and { $media-query: '#{$media-query} and #{$and}'; }\n\n // Remove unnecessary media query prefix 'all and '\n @if ($media-type == 'all' and $media-query != '') {\n $media-type: '';\n $media-query: str-slice(unquote($media-query), 6);\n }\n\n @media #{$media-type + $media-query} {\n @content;\n }\n }\n}\n\n/// Quick sort\n///\n/// @author Sam Richards\n/// @access private\n/// @param {List} $list - List to sort\n/// @returns {List} Sorted List\n@function _mq-quick-sort($list) {\n $less: ();\n $equal: ();\n $large: ();\n\n @if length($list) > 1 {\n $seed: nth($list, ceil(length($list) / 2));\n\n @each $item in $list {\n @if ($item == $seed) {\n $equal: append($equal, $item);\n } @else if ($item < $seed) {\n $less: append($less, $item);\n } @else if ($item > $seed) {\n $large: append($large, $item);\n }\n }\n\n @return join(join(_mq-quick-sort($less), $equal), _mq-quick-sort($large));\n }\n\n @return $list;\n}\n\n/// Sort a map by values (works with numbers only)\n///\n/// @access private\n/// @param {Map} $map - Map to sort\n/// @returns {Map} Map sorted by value\n@function _mq-map-sort-by-value($map) {\n $map-sorted: ();\n $map-keys: map-keys($map);\n $map-values: map-values($map);\n $map-values-sorted: _mq-quick-sort($map-values);\n\n // Reorder key/value pairs based on key values\n @each $value in $map-values-sorted {\n $index: index($map-values, $value);\n $key: nth($map-keys, $index);\n $map-sorted: map-merge($map-sorted, ($key: $value));\n\n // Unset the value in $map-values to prevent the loop\n // from finding the same index twice\n $map-values: set-nth($map-values, $index, 0);\n }\n\n @return $map-sorted;\n}\n\n/// Add a breakpoint\n///\n/// @param {String} $name - Name of the breakpoint\n/// @param {Number} $width - Width of the breakpoint\n///\n/// @requires {Variable} $mq-breakpoints\n///\n/// @example scss\n/// @include mq-add-breakpoint(tvscreen, 1920px);\n/// @include mq(tvscreen) {}\n@mixin mq-add-breakpoint($name, $width) {\n $new-breakpoint: ($name: $width);\n $mq-breakpoints: map-merge($mq-breakpoints, $new-breakpoint) !global;\n $mq-breakpoints: _mq-map-sort-by-value($mq-breakpoints) !global;\n}\n\n/// Show the active breakpoint in the top right corner of the viewport\n/// @link https://github.com/sass-mq/sass-mq#seeing-the-currently-active-breakpoint\n///\n/// @param {List} $show-breakpoints ($mq-show-breakpoints) - List of breakpoints to show in the top right corner\n/// @param {Map} $breakpoints ($mq-breakpoints) - Breakpoint names and sizes\n///\n/// @requires {Variable} $mq-breakpoints\n/// @requires {Variable} $mq-show-breakpoints\n///\n/// @example scss\n/// // Show breakpoints using global settings\n/// @include mq-show-breakpoints;\n///\n/// // Show breakpoints using custom settings\n/// @include mq-show-breakpoints((L, XL), (S: 300px, L: 800px, XL: 1200px));\n@mixin mq-show-breakpoints($show-breakpoints: $mq-show-breakpoints, $breakpoints: $mq-breakpoints) {\n body:before {\n background-color: #FCF8E3;\n border-bottom: 1px solid #FBEED5;\n border-left: 1px solid #FBEED5;\n color: #C09853;\n font: small-caption;\n padding: 3px 6px;\n pointer-events: none;\n position: fixed;\n right: 0;\n top: 0;\n z-index: 100;\n\n // Loop through the breakpoints that should be shown\n @each $show-breakpoint in $show-breakpoints {\n $width: mq-get-breakpoint-width($show-breakpoint, $breakpoints);\n @include mq($show-breakpoint, $breakpoints: $breakpoints) {\n content: \"#{$show-breakpoint} ≥ #{$width} (#{mq-px2em($width)})\";\n }\n }\n }\n}\n\n@if length($mq-show-breakpoints) > 0 {\n @include mq-show-breakpoints;\n}\n","@import \"logical-properties\";\n@import \"types\";\n@import \"validation\";\n\n@mixin block-size($size) {\n @include _expect_single_value($size) {\n @include logical-property(\"\", block-size, ($size));\n }\n}\n\n@mixin inline-size($size) {\n @include _expect_single_value($size) {\n @include logical-property(\"\", inline-size, ($size));\n }\n}\n\n@mixin _constrain-block-size($size, $extreme) {\n @include logical-property($extreme, block-size, ($size));\n}\n\n@mixin _constrain-inline-size($size, $extreme) {\n @include logical-property($extreme, inline-size, ($size));\n}\n\n@mixin max-block-size($size) {\n @include _expect_single_value($size) {\n @include _constrain-block-size($size, max);\n }\n}\n\n@mixin min-block-size($size) {\n @include _expect_single_value($size) {\n @include _constrain-block-size($size, min);\n }\n}\n\n@mixin max-inline-size($size) {\n @include _expect_single_value($size) {\n @include _constrain-inline-size($size, max);\n }\n}\n\n@mixin min-inline-size($size) {\n @include _expect_single_value($size) {\n @include _constrain-inline-size($size, min);\n }\n}\n\n@mixin truncate-with-ellipsis() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n &:lang(zh-Hant-HK) {\n text-overflow: \"⋯\";\n }\n}\n","$baselinegrid-space-extra_small: 12px;\n$baselinegrid-space-small: 24px;\n$baselinegrid-space-smallish: 36px;\n$baselinegrid-space-medium: 48px;\n$baselinegrid-space-large: 72px;\n$baselinegrid-space-extra_large: 120px;\n","@import \"../mixins/types\";\n@import \"../variables/baselinegrid\";\n@import \"../variables/color\";\n@import \"../variables/font\";\n@import \"spacing\";\n@import \"utilities\";\n@import \"scale\";\n\n@mixin set-font-size-and-line-height($font-size, $block-size: $baselinegrid-space-small) {\n @include rem(font-size, $font-size);\n line-height: $block-size / $font-size;\n}\n\n@mixin _heading-base-typography() {\n font-family: $font-secondary;\n font-weight: 600;\n}\n\n@mixin h1-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(7), $baselinegrid-space-medium);\n}\n\n@mixin h2-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(4), ($baselinegrid-space-small + $baselinegrid-space-smallish) / 2);\n}\n\n@mixin h3-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(3));\n}\n\n@mixin h4-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(2));\n}\n\n@mixin h5-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(1));\n}\n\n@mixin h6-typography() {\n @include _heading-base-typography();\n @include set-font-size-and-line-height(scale(0));\n}\n\n@mixin body-typography() {\n font-family: $font-primary;\n @include set-font-size-and-line-height(scale(0));\n font-weight: normal;\n}\n\n@mixin inline-image {\n @include margin(0.1em, block-end);\n @include max-block-size(1em);\n vertical-align: middle;\n}\n\n@mixin _base-font-variant-position($position) {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n @supports (font-variant-position: #{$position}) {\n font-size: inherit;\n font-variant-position: $position;\n position: static;\n }\n}\n\n@mixin font-variant-position($position) {\n @if $position == sub {\n @include _base_font-variant-position($position);\n bottom: -0.25em; // stylelint-disable-line csstools/use-logical\n } @else if $position == super {\n @include _base_font-variant-position($position);\n top: -0.5em; // stylelint-disable-line csstools/use-logical\n } @else {\n @include _error(\"Unknown position '#{$position}'\");\n }\n}\n\n@mixin _label-typography($color, $uppercase: true) {\n color: $color;\n font-family: $font-secondary;\n font-weight: normal;\n @include set-font-size-and-line-height(scale(-3));\n letter-spacing: $font-letterspacing-label;\n @if $uppercase {\n text-transform: uppercase;\n }\n}\n\n@mixin label-content-typography($color: $color-text-secondary, $uppercase: true) {\n @include _label-typography($color, $uppercase);\n}\n\n@mixin label-tag-typography() {\n @include _label-typography($color-primary-normal);\n}\n\n@mixin covert-link($hover-color: $color-primary-dark) {\n @include inherit-all($ensure: color text-decoration);\n cursor: pointer;\n\n &:hover {\n color: $hover-color;\n }\n}\n\n@mixin list-style-none() {\n @include padding(0, inline-start);\n // Overflow auto is so the bullet will be still read from a screen reader and will push the bullet off screen\n overflow: auto;\n}\n","@mixin inherit-all($ensure: ()) {\n @each $property in $ensure {\n #{$property}: inherit;\n }\n\n all: inherit;\n}\n","@import \"../variables/font\";\n@import \"../vendor/modularscale-sass/stylesheets/modularscale\";\n\n@function scale($value: 0) {\n @return round(ms-function($value, $font-size, $major-second));\n}\n","// Defaults and variables\n@import 'modularscale/vars';\n\n// Core functions\n@import 'modularscale/settings';\n@import 'modularscale/pow';\n@import 'modularscale/strip-units';\n@import 'modularscale/sort';\n@import 'modularscale/target';\n@import 'modularscale/function';\n@import 'modularscale/round-px';\n\n// Mixins\n@import 'modularscale/respond';\n\n// Syntax sugar\n@import 'modularscale/sugar';","// Ratios\n$double-octave : 4 ;\n$pi : 3.14159265359 ;\n$major-twelfth : 3 ;\n$major-eleventh : 2.666666667 ;\n$major-tenth : 2.5 ;\n$octave : 2 ;\n$major-seventh : 1.875 ;\n$minor-seventh : 1.777777778 ;\n$major-sixth : 1.666666667 ;\n$phi : 1.618034 ;\n$golden : $phi ;\n$minor-sixth : 1.6 ;\n$fifth : 1.5 ;\n$augmented-fourth : 1.41421 ;\n$fourth : 1.333333333 ;\n$major-third : 1.25 ;\n$minor-third : 1.2 ;\n$major-second : 1.125 ;\n$minor-second : 1.066666667 ;\n\n// Base config\n$ms-base : 1em !default;\n$ms-ratio : $fifth !default;\n$modularscale : () !default;","// Parse settings starting with defaults.\n// Settings should cascade down like you would expect in CSS.\n// More specific overrides previous settings.\n\n@function ms-settings($b: false, $r: false, $t: false, $m: $modularscale) {\n $base: $ms-base;\n $ratio: $ms-ratio;\n $thread: map-get($m, $t);\n\n // Override with user settings\n @if map-get($m, base) {\n $base: map-get($m, base);\n }\n @if map-get($m, ratio) {\n $ratio: map-get($m, ratio);\n }\n\n // Override with thread settings\n @if $thread {\n @if map-get($thread, base) {\n $base: map-get($thread, base);\n }\n @if map-get($thread, ratio) {\n $ratio: map-get($thread, ratio);\n }\n }\n\n // Override with inline settings\n @if $b {\n $base: $b;\n }\n @if $r {\n $ratio: $r;\n }\n\n @return $base $ratio;\n}","// Sass does not have native pow() support so this needs to be added.\n// Compass and other libs implement this more extensively.\n// In order to keep this simple, use those when they are avalible.\n// Issue for pow() support in Sass: https://github.com/sass/sass/issues/684\n\n@function ms-pow($b,$e) {\n\n // Return 1 if exponent is 0\n @if $e == 0 {\n @return 1;\n }\n\n // If pow() exists (compass or mathsass) use that.\n @if function-exists('pow') {\n @return pow($b,$e);\n }\n\n // This does not support non-integer exponents,\n // Check and return an error if a non-integer exponent is passed.\n @if (floor($e) != $e) {\n @error 'Non-integer values are not supported in modularscale by default. Try using mathsass in your project to add non-integer scale support. https://github.com/terkel/mathsass'\n }\n\n // Seed the return.\n $ms-return: $b;\n\n // Multiply or divide by the specified number of times.\n @if $e > 0 {\n @for $i from 1 to $e {\n $ms-return: $ms-return * $b;\n }\n }\n @if $e < 0 {\n @for $i from $e through 0 {\n $ms-return: $ms-return / $b;\n }\n }\n @return $ms-return;\n}","// Stripping units is not a best practice\n// This function should not be used elsewhere\n// It is used here because calc() doesn't do unit logic\n// AND target ratios use units as a hack to get a number.\n@function ms-unitless($val) {\n @return ($val / ($val - $val + 1));\n}","// Basic list sorting\n// Would like to replace with http://sassmeister.com/gist/30e4863bd03ce0e1617c\n// Unfortunately libsass has a bug with passing arguments into the min() funciton.\n\n@function ms-sort($l) {\n\n // loop until the list is confirmed to be sorted\n $sorted: false;\n @while $sorted == false {\n\n // Start with the assumption that the lists are sorted.\n $sorted: true;\n\n // Loop through the list, checking each value with the one next to it.\n // Swap the values if they need to be swapped.\n // Not super fast but simple and modular scale doesn't lean hard on sorting.\n @for $i from 2 through length($l) {\n $n1: nth($l,$i - 1);\n $n2: nth($l,$i);\n\n // If the first value is greater than the 2nd, swap them.\n @if $n1 > $n2 {\n $l: set-nth($l, $i, $n1);\n $l: set-nth($l, $i - 1, $n2);\n\n // The list isn't sorted and needs to be looped through again.\n $sorted: false;\n }\n }\n }\n\n // Return the sorted list.\n @return $l;\n}","// Convert number string to number\n@function ms-to-num($n) {\n $l: str-length($n);\n $r: 0;\n $m: str-index($n,'.');\n @if $m == null {\n $m: $l + 1;\n }\n // Loop through digits and convert to numbers\n @for $i from 1 through $l {\n $v: str-slice($n,$i,$i);\n @if $v == '1' { $v: 1; }\n @else if $v == '2' { $v: 2; }\n @else if $v == '3' { $v: 3; }\n @else if $v == '4' { $v: 4; }\n @else if $v == '5' { $v: 5; }\n @else if $v == '6' { $v: 6; }\n @else if $v == '7' { $v: 7; }\n @else if $v == '8' { $v: 8; }\n @else if $v == '9' { $v: 9; }\n @else if $v == '0' { $v: 0; }\n @else { $v: null; }\n @if $v != null {\n $m: $m - 1;\n $r: $r + ms-pow(10,$m - 1) * $v;\n } @else {\n $l: $l - 1;\n }\n }\n @return $r;\n}\n\n// Find a ratio based on a target value\n@function ms-target($t,$b) {\n // Convert to string\n $t: $t + '';\n // Remove base units to calulate ratio\n $b: ms-unitless(nth($b,1));\n // Find where 'at' is in the string\n $at: str-index($t,'at');\n\n // Slice the value and target out\n // and convert strings to numbers\n $v: ms-to-num(str-slice($t,0,$at - 1));\n $t: ms-to-num(str-slice($t,$at + 2));\n\n // Solve the modular scale function for the ratio.\n @return ms-pow(($v/$b),(1/$t));\n}","@function ms-function($v: 0, $base: false, $ratio: false, $thread: false, $settings: $modularscale) {\n\n // Parse settings\n $ms-settings: ms-settings($base,$ratio,$thread,$settings);\n $base: nth($ms-settings, 1);\n $ratio: nth($ms-settings, 2);\n\n // Render target values from settings.\n @if unit($ratio) != '' {\n $ratio: ms-target($ratio,$base)\n }\n\n // Fast calc if not multi stranded\n @if(length($base) == 1) {\n @return ms-pow($ratio, $v) * $base;\n }\n\n // Create new base array\n $ms-bases: nth($base,1);\n\n // Normalize base values\n @for $i from 2 through length($base) {\n // initial base value\n $ms-base: nth($base,$i);\n // If the base is bigger than the main base\n @if($ms-base > nth($base,1)) {\n // divide the value until it aligns with main base.\n @while($ms-base > nth($base,1)) {\n $ms-base: $ms-base / $ratio;\n }\n $ms-base: $ms-base * $ratio;\n }\n // If the base is smaller than the main base.\n @else if ($ms-base < nth($base,1)) {\n // pump up the value until it aligns with main base.\n @while $ms-base < nth($base,1) {\n $ms-base: $ms-base * $ratio;\n }\n }\n // Push into new array\n $ms-bases: append($ms-bases,$ms-base);\n }\n\n // Sort array from smallest to largest.\n $ms-bases: ms-sort($ms-bases);\n\n // Find step to use in calculation\n $vtep: floor($v / length($ms-bases));\n // Find base to use in calculation\n $ms-base: round(($v / length($ms-bases) - $vtep) * length($ms-bases)) + 1;\n\n @return ms-pow($ratio, $vtep) * nth($ms-bases,$ms-base);\n}","@function ms-round-px($r) {\n @if unit($r) == 'px' {\n @return round($r);\n }\n @warn \"ms-round-px is no longer used by modular scale and will be removed in the 3.1.0 release.\";\n @return $r;\n}","// Generate calc() function\n// based on Mike Riethmuller's Precise control over responsive typography\n// http://madebymike.com.au/writing/precise-control-responsive-typography/\n@function ms-fluid($val1: 1em, $val2: 1em, $break1: 0, $break2: 0) {\n $diff: ms-unitless($val2) - ms-unitless($val1);\n\n // v1 + (v2 - v1) * ( (100vw - b1) / b2 - b1 )\n @return calc( #{$val1} + #{ms-unitless($val2) - ms-unitless($val1)} * ( ( 100vw - #{$break1}) / #{ms-unitless($break2) - ms-unitless($break1)} ) );\n}\n\n// Main responsive mixin\n@mixin ms-respond($prop, $val, $map: $modularscale, $ms-important: false) {\n $base: $ms-base;\n $ratio: $ms-ratio;\n\n $first-write: true;\n $last-break: null;\n\n $important: '';\n\n @if $ms-important == true {\n $important: ' !important';\n }\n\n // loop through all settings with a breakpoint type value\n @each $v, $s in $map {\n @if type-of($v) == number {\n @if unit($v) != '' {\n\n // Write out the first value without a media query.\n @if $first-write {\n #{$prop}: unquote(\"#{ms-function($val, $thread: $v, $settings: $map)}#{$important}\");\n\n // Not the first write anymore, reset to false to move on.\n $first-write: false;\n $last-break: $v;\n }\n\n // Write intermediate breakpoints.\n @else {\n @media (min-width: $last-break) and (max-width: $v) {\n $val1: ms-function($val, $thread: $last-break, $settings: $map);\n $val2: ms-function($val, $thread: $v, $settings: $map);\n #{$prop}: unquote(\"#{ms-fluid($val1,$val2,$last-break,$v)}#{$important}\");\n }\n $last-break: $v;\n }\n }\n }\n }\n\n // Write the last breakpoint.\n @if $last-break {\n @media (min-width: $last-break) {\n #{$prop}: unquote(\"#{ms-function($val, $thread: $last-break, $settings: $map)}#{$important}\");\n }\n }\n}","// To attempt to avoid conflicts with other libraries\n// all funcitons are namespaced with `ms-`.\n// However, to increase usability, a shorthand function is included here.\n\n@function ms($v: 0, $base: false, $ratio: false, $thread: false, $settings: $modularscale) {\n @return ms-function($v, $base, $ratio, $thread, $settings);\n}","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","@import \"mixins/logical-properties\";\n@import \"mixins/media-query\";\n@import \"variables/grid\";\n\n:root {\n --GRID-COLUMN-GAP: #{$grid-column_gap};\n --GRID-EDGE-SPACE: #{$grid-edge_space-medium};\n --GRID-COLUMN-WIDTH: calc((100% - (var(--GRID-EDGE-SPACE) * 2) - (var(--GRID-COLUMN-GAP) * #{$grid-main_column_count - 1})) / #{$grid-main_column_count});\n\n @include mq($from: medium) {\n --GRID-EDGE-SPACE: #{$grid-edge_space-large};\n }\n\n @include mq($from: x-wide) {\n --GRID-COLUMN-GAP: #{($grid-max_width * $grid-column_gap) / 100%};\n --GRID-COLUMN-WIDTH: calc((#{$grid-max_width} - (var(--GRID-COLUMN-GAP) * #{$grid-main_column_count - 1})) / #{$grid-main_column_count});\n }\n\n @include logical-property(min, inline-size, $grid-min_width, $to-rem: false);\n}\n","@import \"../../mixins/typography\";\n\n.heading__link {\n @include covert-link();\n}\n","@import \"../../mixins/spacing\";\n@import \"../../mixins/typography\";\n\n.content-meta {\n @include list-style-none();\n @include block-spacing();\n}\n\n.content-meta__item {\n display: inline-block;\n @include label-content-typography();\n\n &:after {\n content: \"\\a0\\2022\\a0\";\n }\n\n &:last-child:after {\n content: \"\";\n }\n}\n\n.content-meta__link {\n @include covert-link();\n}\n","@import \"../../mixins/spacing\";\n@import \"../../variables/baselinegrid\";\n\n.section__body {\n @include block-spacing($end: $baselinegrid-space-medium);\n}\n","@import \"../../mixins/sizes\";\n@import \"../../mixins/typography\";\n@import \"../../variables/baselinegrid\";\n\n.tag-list {\n @include block-spacing();\n}\n\n.tag-list__title {\n @include label-content-typography();\n @include block-spacing($end: 0);\n}\n\n.tag-list__list {\n @include list-style-none();\n @include label-tag-typography();\n}\n\n.tag-list__list--single-line {\n @include truncate-with-ellipsis();\n}\n\n.tag-list__item {\n display: inline-block;\n @include label-tag-typography();\n\n &:after {\n display: inline;\n content: \",\\a0\";\n }\n\n &:lang(ar):after {\n content: \"،\\a0\";\n }\n\n &:lang(ja):after {\n content: \"、\";\n }\n\n &:last-child:after {\n content: \"\";\n }\n}\n\n.tag-list__link {\n @include covert-link();\n}\n","@import \"../../functions/types\";\n@import \"../../mixins/scale\";\n@import \"../../mixins/decorations\";\n@import \"../../mixins/media-query\";\n@import \"../../mixins/spacing\";\n@import \"../../variables/baselinegrid\";\n@import \"../../variables/grid\";\n\n.content-header {\n text-align: center;\n @include padding($baselinegrid-space-medium, block-start);\n @include block-spacing($end: $baselinegrid-space-medium - $grid-divider_size);\n @include divider(block-end);\n}\n\n.content-header__title {\n @include block-spacing($end: $baselinegrid-space-small);\n\n &:last-child {\n @include block-spacing($end: $baselinegrid-space-medium);\n }\n}\n\n.content-header__title--xx-short {\n @include rem(font-size, scale(9));\n\n @include mq($from: small) {\n @include rem(font-size, scale(10));\n }\n}\n\n.content-header__title--x-short {\n @include rem(font-size, scale(8));\n\n @include mq($from: medium) {\n @include rem(font-size, scale(9));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(10));\n }\n}\n\n.content-header__title--short {\n @include rem(font-size, scale(6));\n\n @include mq($from: small) {\n @include rem(font-size, scale(7));\n }\n\n @include mq($from: medium) {\n @include rem(font-size, scale(8));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(9));\n }\n\n @include mq($from: x-wide) {\n @include rem(font-size, scale(10));\n }\n}\n\n.content-header__title--medium {\n @include rem(font-size, scale(4));\n\n @include mq($from: small) {\n @include rem(font-size, scale(6));\n }\n\n @include mq($from: medium) {\n @include rem(font-size, scale(7));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(8));\n }\n\n @include mq($from: x-wide) {\n @include rem(font-size, scale(10));\n }\n}\n\n.content-header__title--long {\n @include rem(font-size, scale(2));\n\n @include mq($from: small) {\n @include rem(font-size, scale(4));\n }\n\n @include mq($from: medium) {\n @include rem(font-size, scale(7));\n }\n\n @include mq($from: x-wide) {\n @include rem(font-size, scale(8));\n }\n\n}\n\n.content-header__title--x-long {\n @include rem(font-size, scale(2));\n\n @include mq($from: medium) {\n @include rem(font-size, scale(4));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(4));\n }\n\n @include mq($from: x-wide) {\n @include rem(font-size, scale(6));\n }\n}\n\n.content-header__title--xx-long {\n @include rem(font-size, scale(1));\n\n @include mq($from: small) {\n @include rem(font-size, scale(2));\n }\n\n @include mq($from: wide) {\n @include rem(font-size, scale(4));\n }\n}\n","@import \"../mixins/types\";\n@import \"../variables/font\";\n\n$rem-baseline: $font-size;\n$rem-fallback: true;\n","@import \"../../mixins/decorations\";\n@import \"../../mixins/media-query\";\n@import \"../../mixins/spacing\";\n@import \"../../variables/baselinegrid\";\n@import \"../../variables/grid\";\n\n.item-tags {\n @include padding($baselinegrid-space-medium - $grid-divider_size, block-start);\n @include block-spacing($end: $baselinegrid-space-medium);\n @include divider(block-start);\n text-align: center;\n\n @include mq($from: medium) {\n text-align: initial;\n }\n}\n","@import \"../../functions/grid\";\n@import \"../../mixins/grid\";\n@import \"../../mixins/media-query\";\n@import \"../../variables/grid\";\n\n.content-grid {\n --primary-column-width: #{get-overall-width($grid-main_column_count)};\n\n @include base-grid($grid-max_width);\n grid-template-areas:\n \". menu .\"\n \". primary .\";\n grid-template-columns: [full-start] 1fr [main-start] var(--primary-column-width) [main-end] 1fr [full-end];\n grid-column-gap: var(--GRID-COLUMN-GAP);\n\n @include mq($from: wide) {\n $primary-column-count: $grid-main_column_count - 2;\n $secondary-column-count: floor(($grid-main_column_count - $primary-column-count) / 2);\n $menu-column-count: $grid-main_column_count - $primary-column-count - $secondary-column-count;\n --primary-column-width: #{get-overall-width($primary-column-count)};\n --secondary-column-width: #{get-overall-width($secondary-column-count)};\n --menu-column-width: #{get-overall-width($menu-column-count)};\n grid-template-areas:\n \". . menu . .\"\n \". . primary . .\";\n grid-template-columns: [full-start] 1fr [main-start] var(--menu-column-width) var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end];\n }\n\n @include mq($from: x-wide) {\n $primary-column-count: floor($grid-main_column_count * 0.7);\n $secondary-column-count: floor(($grid-main_column_count - $primary-column-count) / 2);\n $menu-column-count: $grid-main_column_count - $primary-column-count - $secondary-column-count;\n --primary-column-width: #{get-overall-width($primary-column-count)};\n --secondary-column-width: #{get-overall-width($secondary-column-count)};\n --menu-column-width: #{get-overall-width($menu-column-count)};\n grid-template-areas: \". menu primary . .\";\n }\n}\n\n.content-grid--has-secondary {\n grid-template-areas:\n \". menu .\"\n \". primary .\"\n \". secondary .\";\n\n @include mq($from: wide) {\n $primary-column-count: floor($grid-main_column_count * 0.7);\n $secondary-column-count: $grid-main_column_count - $primary-column-count;\n --primary-column-width: #{get-overall-width($primary-column-count)};\n --secondary-column-width: #{get-overall-width($secondary-column-count)};\n grid-template-areas:\n \". menu menu .\"\n \". primary secondary .\";\n grid-template-columns: [full-start] 1fr [main-start] var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end];\n }\n\n @include mq($from: x-wide) {\n $primary-column-count: floor($grid-main_column_count * 0.6);\n $secondary-column-count: floor($grid-main_column_count * 0.25);\n $menu-column-count: $grid-main_column_count - $primary-column-count - $secondary-column-count;\n --primary-column-width: #{get-overall-width($primary-column-count)};\n --secondary-column-width: #{get-overall-width($secondary-column-count)};\n --menu-column-width: #{get-overall-width($menu-column-count)};\n grid-template-areas: \". menu primary secondary .\";\n grid-template-columns: [full-start] 1fr [main-start] var(--menu-column-width) var(--primary-column-width) var(--secondary-column-width) [main-end] 1fr [full-end];\n }\n}\n\n.content-grid__item,\n.content-grid__item--main {\n grid-column: main;\n}\n\n.content-grid__item--full {\n grid-column: full;\n}\n\n.content-grid__item--primary {\n grid-column: primary;\n}\n\n.content-grid__item--secondary {\n grid-column: secondary;\n}\n\n.content-grid__item--menu {\n grid-column: menu;\n}\n","@function get-overall-width($columns) {\n @return calc((#{$columns} * var(--GRID-COLUMN-WIDTH)) + (#{$columns - 1} * var(--GRID-COLUMN-GAP)));\n}\n","@import \"spacing\";\n@import \"types\";\n@import \"../functions/grid\";\n@import \"../variables/grid\";\n\n@mixin base-grid($max-inline-size) {\n @include max-inline-size($max-inline-size);\n @include block-spacing($end: 0);\n @include margin(auto, inline);\n @include padding($grid-column_gap, inline);\n box-sizing: content-box;\n\n @supports (display: grid) and (--custom: property) {\n display: grid;\n @include max-inline-size(unset);\n @include margin(unset, inline);\n @include padding(unset, inline);\n box-sizing: border-box;\n }\n}\n","@import \"../../mixins/decorations\";\n@import \"../../mixins/grid\";\n@import \"../../variables/grid\";\n\n.page-grid {\n @include base-grid($grid-max_width);\n grid-template-areas:\n \"start\"\n \"main\"\n \"end\";\n}\n\n.page-grid__start {\n grid-row: start;\n @include divider(block-end);\n}\n\n.page-grid__main {\n grid-row: main;\n}\n\n.page-grid__end {\n grid-row: end;\n @include divider(block-start);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/vendor-extra/LiberoPatternsBundle/src/Resources/views/heading.html.twig b/vendor-extra/LiberoPatternsBundle/src/Resources/views/heading.html.twig index e71a095..3aa1f8f 100644 --- a/vendor-extra/LiberoPatternsBundle/src/Resources/views/heading.html.twig +++ b/vendor-extra/LiberoPatternsBundle/src/Resources/views/heading.html.twig @@ -1,5 +1,21 @@ +{%- set attributes = attributes|default({})|merge({class: attributes.class|default([])|merge(['heading']) }) -%} + - {%- include '@LiberoPatterns/text.html.twig' with {nodes: text} only -%} + {%- if text.text is not defined -%} + {%- set text = {text: text} -%} + {%- endif -%} + + {%- with text only -%} + {%- block text -%} + + {%- if attributes.href is defined -%} + {%- set attributes = attributes|default({})|merge({class: attributes.class|default([])|merge(['heading__link']) }) -%} + {%- endif -%} + + {%- include '@LiberoPatterns/link.html.twig' -%} + + {%- endblock -%} + {%- endwith -%} diff --git a/vendor-extra/LiberoPatternsBundle/src/Resources/views/teaser-list.html.twig b/vendor-extra/LiberoPatternsBundle/src/Resources/views/teaser-list.html.twig new file mode 100644 index 0000000..1ff4b56 --- /dev/null +++ b/vendor-extra/LiberoPatternsBundle/src/Resources/views/teaser-list.html.twig @@ -0,0 +1,78 @@ +{%- set attributes = attributes|default({})|merge({class: attributes.class|default([])|merge(['teaser-list']) }) -%} + +{%- if title.text is defined -%} + {%- set title_id = title.attributes.id|default('heading' ~ random()) -%} + {%- set attributes = attributes|merge({'aria-labelledby': title_id}) -%} + {%- set title = title|merge({_id: title_id}) -%} +{%- endif -%} + +
+ + {%- with title|default({}) only -%} + {%- block title -%} + + {% if text is defined %} + + {%- set attributes = attributes|default({})|merge({id: _id, class: attributes.class|default([])|merge(['teaser-list__title']) }) -%} + {%- include '@LiberoPatterns/heading.html.twig' with {level: level|default(2)} -%} + + {% endif %} + + {%- endblock title -%} + {%- endwith -%} + + {%- with list only -%} + {%- block list -%} + + {%- if items|default([])|length -%} + + {%- set attributes = attributes|default({})|merge({class: attributes.class|default([])|merge(['teaser-list__list']) }) -%} + +
    + + {%- for item in items -%} + + {%- with item only -%} + {%- block item -%} + + {%- set attributes = attributes|default({})|merge({class: attributes.class|default([])|merge(['teaser-list__item']) }) -%} + +
  1. + + {%- with content only -%} + {%- block content -%} + + {%- include '@LiberoPatterns/teaser.html.twig' -%} + + {%- endblock content -%} + {%- endwith -%} + +
  2. + + {%- endblock item -%} + {%- endwith -%} + + {%- endfor -%} + +
+ + {%- else -%} + + {%- if empty is not iterable -%} + {%- set empty = [{template: '@LiberoPatterns/paragraph.html.twig', arguments: {text: empty}}] -%} + {%- endif -%} + + {%- with {empty: empty} only -%} + {%- block empty -%} + + {%- include '@LiberoPatterns/text.html.twig' with {nodes: empty} only -%} + + {%- endblock empty -%} + {%- endwith -%} + + {%- endif -%} + + {%- endblock list -%} + {%- endwith -%} + +
diff --git a/vendor-extra/LiberoPatternsBundle/src/Resources/views/teaser.html.twig b/vendor-extra/LiberoPatternsBundle/src/Resources/views/teaser.html.twig new file mode 100644 index 0000000..8a74d02 --- /dev/null +++ b/vendor-extra/LiberoPatternsBundle/src/Resources/views/teaser.html.twig @@ -0,0 +1,27 @@ +{%- set attributes = attributes|default({})|merge({class: attributes.class|default([])|merge(['teaser']) }) -%} + +
+ + {%- with {attributes: {class: []}} -%} + {%- block header -%} + + {%- set attributes = attributes|merge({class: attributes.class|merge(['teaser__header']) }) -%} +
+ + {%- with heading|merge({text: {attributes: {href: href}, text: heading.text} }) only -%} + {%- block heading -%} + + {%- set attributes = attributes|default({})|merge({class: attributes.class|default([])|merge(['teaser__heading']) }) -%} + {%- set level = level|default(3) -%} + + {%- include '@LiberoPatterns/heading.html.twig' -%} + + {%- endblock heading -%} + {%- endwith -%} + +
+ + {%- endblock header -%} + {%- endwith -%} + +
diff --git a/vendor-extra/ViewsBundle/src/Views/LazyView.php b/vendor-extra/ViewsBundle/src/Views/LazyView.php new file mode 100644 index 0000000..81d9f47 --- /dev/null +++ b/vendor-extra/ViewsBundle/src/Views/LazyView.php @@ -0,0 +1,39 @@ +callback = $callback; + $this->context = $context; + } + + public function getIterator() + { + return $this->resolve(); + } + + private function resolve() : TemplateView + { + if (isset($this->callback)) { + $this->view = call_user_func($this->callback); + $this->callback = null; + } + + return $this->view; + } +} diff --git a/vendor-extra/ViewsBundle/tests/Views/LazyViewTest.php b/vendor-extra/ViewsBundle/tests/Views/LazyViewTest.php new file mode 100644 index 0000000..d2c149d --- /dev/null +++ b/vendor-extra/ViewsBundle/tests/Views/LazyViewTest.php @@ -0,0 +1,128 @@ +assertInstanceOf(View::class, $view); + } + + /** + * @test + */ + public function it_has_context() : void + { + $view = new LazyView( + function () : TemplateView { + throw new LogicException(); + }, + ['foo' => 'bar'] + ); + + $this->assertTrue($view->hasContext('foo')); + $this->assertFalse($view->hasContext('bar')); + + $this->assertSame('bar', $view->getContext('foo')); + $this->assertNull($view->getContext('bar')); + $this->assertEquals(['foo' => 'bar'], $view->getContext()); + } + + /** + * @test + */ + public function it_is_array_accessible() : void + { + $view = new LazyView( + function () : TemplateView { + return new TemplateView('template', ['foo' => 'bar', 'baz' => ['qux']]); + } + ); + + $this->assertInstanceOf(ArrayAccess::class, $view); + + $this->assertArrayHasKey('template', $view); + $this->assertSame('template', $view['template']); + $this->assertArrayHasKey('arguments', $view); + $this->assertSame(['foo' => 'bar', 'baz' => ['qux']], $view['arguments']); + $this->assertArrayNotHasKey('quux', $view); + $this->assertNull($view['quux']); + } + + /** + * @test + * @dataProvider immutableProvider + */ + public function it_is_immutable(callable $action) : void + { + $view = new LazyView( + function () : TemplateView { + throw new LogicException(); + } + ); + + $this->expectException(BadMethodCallException::class); + + $action($view); + } + + public function immutableProvider() : iterable + { + yield 'set' => [ + function (LazyView $view) : void { + $view['foo'] = 'bar'; + }, + ]; + yield 'unset' => [ + function (LazyView $view) : void { + unset($view['foo']); + }, + ]; + } + + /** + * @test + */ + public function it_is_traversable() : void + { + $view = new LazyView( + function () : TemplateView { + return new TemplateView('template', ['foo' => 'bar', 'baz' => ['qux']]); + } + ); + + $this->assertInstanceOf(Traversable::class, $view); + + $expected = [ + 'template' => 'template', + 'arguments' => [ + 'foo' => 'bar', + 'baz' => ['qux'], + ], + ]; + + $this->assertSame($expected, iterator_to_array($view)); + } +}