From 242e3904f1a9d30bb3d94ad7ec4deb507dfd7527 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 16 Aug 2018 12:25:33 -0700 Subject: [PATCH 001/219] WIP: Add `feat/dialog` branch to `.travis.yml` --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 99eef2f130e..9eb30b45880 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ branches: # This prevents excessive resource usage and CI slowness. only: - master + - feat/dialog before_install: # Source the scripts to export their env vars. See https://superuser.com/a/176788/62792 From be82ea13b1a65bfd3433b1d0b78ad13fb3c39290 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 17 Aug 2018 03:18:25 -0700 Subject: [PATCH 002/219] WIP: First draft of CSS --- demos/dialog.html | 50 ++----- demos/theme/index.html | 6 +- packages/mdc-dialog/README.md | 24 ++-- packages/mdc-dialog/_mixins.scss | 59 ++++++++ packages/mdc-dialog/_variables.scss | 28 ++++ packages/mdc-dialog/constants.js | 8 +- packages/mdc-dialog/index.js | 2 +- packages/mdc-dialog/mdc-dialog.scss | 115 ++++++++++----- .../spec/mdc-dialog/classes/baseline.html | 101 ++++++++++++++ .../spec/mdc-dialog/classes/overflow.html | 117 ++++++++++++++++ .../spec/mdc-dialog/classes/scrolled.html | 120 ++++++++++++++++ test/screenshot/spec/mdc-dialog/fixture.js | 17 +++ test/screenshot/spec/mdc-dialog/fixture.scss | 25 ++++ .../spec/mdc-dialog/mixins/ink-color.html | 132 ++++++++++++++++++ test/unit/mdc-dialog/mdc-dialog.test.js | 16 +-- 15 files changed, 716 insertions(+), 104 deletions(-) create mode 100644 packages/mdc-dialog/_mixins.scss create mode 100644 packages/mdc-dialog/_variables.scss create mode 100644 test/screenshot/spec/mdc-dialog/classes/baseline.html create mode 100644 test/screenshot/spec/mdc-dialog/classes/overflow.html create mode 100644 test/screenshot/spec/mdc-dialog/classes/scrolled.html create mode 100644 test/screenshot/spec/mdc-dialog/fixture.js create mode 100644 test/screenshot/spec/mdc-dialog/fixture.scss create mode 100644 test/screenshot/spec/mdc-dialog/mixins/ink-color.html diff --git a/demos/dialog.html b/demos/dialog.html index 44ecf149f73..eea7311e89f 100644 --- a/demos/dialog.html +++ b/demos/dialog.html @@ -67,7 +67,7 @@ @@ -91,7 +91,7 @@

aria-describedby="mdc-dialog-default-description">
-

+

Use Google's location service?

@@ -99,34 +99,11 @@

Let Google help apps determine location. This means sending anonymous location data to Google, even when no apps are running.
- - + +

-
- - -
@@ -207,11 +184,6 @@

dialogScrollable.lastFocusedTarget = evt.target; dialogScrollable.show(); }); - var dialogColoredButton = new mdc.dialog.MDCDialog(document.querySelector('#mdc-dialog-colored-footer-buttons')); - document.querySelector('#colored-footer-button-dialog-activation').addEventListener('click', function (evt) { - dialogColoredButton.lastFocusedTarget = evt.target; - dialogColoredButton.show(); - }); mdc.dialog.MDCDialog.attachTo(document.querySelector('.mdc-dialog')); var demoWrapper = document.querySelector('.demo-body'); diff --git a/demos/theme/index.html b/demos/theme/index.html index fac8b63093e..d834e64e492 100644 --- a/demos/theme/index.html +++ b/demos/theme/index.html @@ -428,7 +428,7 @@

- - + +
diff --git a/packages/mdc-dialog/README.md b/packages/mdc-dialog/README.md index 809259f4188..89826581418 100644 --- a/packages/mdc-dialog/README.md +++ b/packages/mdc-dialog/README.md @@ -51,7 +51,7 @@ Dialogs inform users about a specific task and may contain critical information aria-describedby="my-mdc-dialog-description">
-

+

Use Google's location service?

@@ -59,11 +59,11 @@ Dialogs inform users about a specific task and may contain critical information Let Google help apps determine location. This means sending anonymous location data to Google, even when no apps are running.
- - + +
-
+
``` @@ -86,7 +86,7 @@ a `mdc-dialog__body--scrollable` modifier to allow scrolling in the dialog. aria-describedby="mdc-dialog-with-list-description">
-

+

Choose a Ringtone

@@ -106,11 +106,11 @@ a `mdc-dialog__body--scrollable` modifier to allow scrolling in the dialog.
- - + +
-
+
``` @@ -125,8 +125,8 @@ Dialog actions use system colors by default, but you can use a contrasting color @@ -228,11 +228,11 @@ Closes the dialog #### MDCDialog:accept -Broadcast when a user actions on the `.mdc-dialog__footer__button--accept` element. +Broadcast when a user actions on the `.mdc-dialog__button--accept` element. #### MDCDialog:cancel -Broadcast when a user actions on the `.mdc-dialog__footer__button--cancel` element. +Broadcast when a user actions on the `.mdc-dialog__button--cancel` element. ### Using the Foundation Class diff --git a/packages/mdc-dialog/_mixins.scss b/packages/mdc-dialog/_mixins.scss new file mode 100644 index 00000000000..120bbac4aeb --- /dev/null +++ b/packages/mdc-dialog/_mixins.scss @@ -0,0 +1,59 @@ +// +// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +@import "@material/theme/mixins"; +@import "@material/theme/variables"; +@import "./variables"; + +// TODO(acdvorak): Create mixins for all redline values. +// TODO(acdvorak): Create screenshot test page with `body { font-size: 200$; }` for all components to test a11y + +@mixin mdc-dialog-corner-radius($radius: $mdc-dialog-corner-radius) { + border-radius: $radius; +} + +@mixin mdc-dialog-title-color($color: $mdc-dialog-title-color, $opacity: $mdc-dialog-title-opacity) { + color: rgba(mdc-theme-prop-value($color), $opacity); +} + +@mixin mdc-dialog-body-color($color: $mdc-dialog-body-color, $opacity: $mdc-dialog-body-opacity) { + color: rgba(mdc-theme-prop-value($color), $opacity); +} + +@mixin mdc-dialog-scroll-divider-color($color: $mdc-dialog-scroll-divider-color, $opacity: $mdc-dialog-scroll-divider-opacity) { + border-color: rgba(mdc-theme-prop-value($color), $opacity); +} + +@mixin mdc-dialog-multiline-ellipsis($max-lines: 2) { + overflow: hidden; + + // Firefox, Edge <= 16, IE 11 + @supports not (-webkit-line-clamp: $max-lines) { + display: flex; + flex-direction: column; + max-height: (1.5em * $max-lines); + } + + // Chrome, Safari, Edge 17+ + @supports (-webkit-line-clamp: $max-lines) { + // stylelint-disable-next-line value-no-vendor-prefix + display: -webkit-box; + + /* autoprefixer: ignore next */ + -webkit-box-orient: vertical; + -webkit-line-clamp: $max-lines; + } +} diff --git a/packages/mdc-dialog/_variables.scss b/packages/mdc-dialog/_variables.scss new file mode 100644 index 00000000000..c449d8190c9 --- /dev/null +++ b/packages/mdc-dialog/_variables.scss @@ -0,0 +1,28 @@ +// +// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// TODO(acdvorak): Find the right value +$mdc-dialog-desktop-breakpoint: 1024px; + +$mdc-dialog-corner-radius: 4px; +$mdc-dialog-title-color: on-surface; +$mdc-dialog-title-opacity: .87; +$mdc-dialog-body-color: on-surface; +$mdc-dialog-body-opacity: .6; + +// TODO(acdvorak): Get actual value from Design (it's not in the spec) +$mdc-dialog-scroll-divider-color: #e5e5e5; +$mdc-dialog-scroll-divider-opacity: 1; diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index 3153dfabb6e..cfc92eada0b 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -18,16 +18,16 @@ const cssClasses = { ROOT: 'mdc-dialog', OPEN: 'mdc-dialog--open', ANIMATING: 'mdc-dialog--animating', - BACKDROP: 'mdc-dialog__backdrop', + BACKDROP: 'mdc-dialog__scrim', SCROLL_LOCK: 'mdc-dialog-scroll-lock', - ACCEPT_BTN: 'mdc-dialog__footer__button--accept', - CANCEL_BTN: 'mdc-dialog__footer__button--cancel', + ACCEPT_BTN: 'mdc-dialog__button--accept', + CANCEL_BTN: 'mdc-dialog__button--cancel', }; const strings = { OPEN_DIALOG_SELECTOR: '.mdc-dialog--open', DIALOG_SURFACE_SELECTOR: '.mdc-dialog__surface', - ACCEPT_SELECTOR: '.mdc-dialog__footer__button--accept', + ACCEPT_SELECTOR: '.mdc-dialog__button--accept', ACCEPT_EVENT: 'MDCDialog:accept', CANCEL_EVENT: 'MDCDialog:cancel', }; diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 8623d2e16b4..76eda309e80 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -44,7 +44,7 @@ export class MDCDialog extends MDCComponent { this.focusTrap_ = util.createFocusTrapInstance(this.dialogSurface_, this.acceptButton_); this.footerBtnRipples_ = []; - const footerBtns = this.root_.querySelectorAll('.mdc-dialog__footer__button'); + const footerBtns = this.root_.querySelectorAll('.mdc-dialog__button'); for (let i = 0, footerBtn; footerBtn = footerBtns[i]; i++) { this.footerBtnRipples_.push(new MDCRipple(footerBtn)); } diff --git a/packages/mdc-dialog/mdc-dialog.scss b/packages/mdc-dialog/mdc-dialog.scss index 3181beb091a..8fcc06456e3 100644 --- a/packages/mdc-dialog/mdc-dialog.scss +++ b/packages/mdc-dialog/mdc-dialog.scss @@ -20,6 +20,8 @@ @import "@material/rtl/mixins"; @import "@material/typography/mixins"; @import "@material/typography/variables"; +@import "./mixins"; +@import "./variables"; // postcss-bem-linter: define dialog @@ -36,7 +38,7 @@ z-index: 5; } -.mdc-dialog__backdrop { +.mdc-dialog__scrim { @include mdc-theme-prop(background-color, text-primary-on-light); position: fixed; @@ -51,27 +53,49 @@ } .mdc-dialog__surface { + @include mdc-dialog-corner-radius($mdc-dialog-corner-radius); @include mdc-elevation(24); @include mdc-theme-prop(background-color, background); display: inline-flex; flex-direction: column; - width: calc(100% - 30px); - min-width: 640px; - max-width: 865px; + max-width: calc(100% - 32px); + max-height: calc(100% - 32px); transform: translateY(150px) scale(.8); - border-radius: 2px; opacity: 0; + @media (max-width: ($mdc-dialog-desktop-breakpoint - 1)) { + min-width: 280px; + } + + @media (min-width: $mdc-dialog-desktop-breakpoint) { + min-width: 560px; + } + @include mdc-rtl(".mdc-dialog") { text-align: right; } } .mdc-dialog__header { + @include mdc-dialog-scroll-divider-color; + position: relative; + display: flex; + flex-shrink: 0; align-items: center; - padding: 24px 24px 0; + margin: 0; + padding: 16px 24px 15px; + + // TODO(acdvorak): Un-nest these selectors + .mdc-dialog--scrollable & { + border-bottom-width: 1px; + border-bottom-style: solid; + + // TODO(acdvorak): Ask Design about this + // TODO(acdvorak): Hide this when the user can't scroll any more + box-shadow: 0 24px 24px 0 rgba(white, 1); + } @include mdc-rtl(".mdc-dialog") { text-align: right; @@ -82,7 +106,9 @@ padding: 0; } -.mdc-dialog__header__title { +.mdc-dialog__title { + @include mdc-dialog-title-color; + @include mdc-dialog-multiline-ellipsis; @include mdc-typography(headline6); flex: 1; @@ -90,61 +116,76 @@ } .mdc-dialog__body { - @include mdc-theme-prop(color, text-secondary-on-light); + @include mdc-dialog-body-color; @include mdc-typography(body1); - margin-top: 20px; - padding: 0 24px 24px; -} + overflow: auto; + + // TODO(acdvorak): Un-nest these selectors + .mdc-dialog--scrollable & { + // Must be scroll, not auto. + // https://css-tricks.com/snippets/css/momentum-scrolling-on-ios-overflow-elements/ + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + } -.mdc-dialog__body--scrollable { - max-height: 195px; - border-top: 1px solid rgba(0, 0, 0, .1); - border-bottom: 1px solid rgba(0, 0, 0, .1); - overflow-x: auto; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; + // stylelint-disable-next-line order/properties-order + margin: 0; + padding: 10px 24px 21px; + + // TODO(acdvorak): Is there a better way? + > :first-child { + margin-top: 0; + } + + // TODO(acdvorak): Is there a better way? + > :last-child { + margin-bottom: 0; + } } .mdc-dialog__footer { + @include mdc-dialog-scroll-divider-color; + display: flex; + position: relative; + flex-shrink: 0; flex-wrap: wrap; align-items: center; justify-content: flex-end; + margin: 0; padding: 8px; -} -.mdc-dialog__footer__button { - @include mdc-rtl-reflexive-box(margin, right, 8px); + // TODO(acdvorak): Un-nest these selectors + .mdc-dialog--scrollable & { + border-top-width: 1px; + border-top-style: solid; - &:last-child { - @include mdc-rtl-reflexive-box(margin, right, 0); + // TODO(acdvorak): Ask Design about this + // TODO(acdvorak): Hide this when the user can't scroll any more + box-shadow: 0 -24px 24px 0 rgba(white, 1); } } -.mdc-dialog__action:not(:disabled) { - @include mdc-theme-prop(color, secondary); -} +// TODO(acdvorak): Figure out how to apply 12px margin between stacked buttons +.mdc-dialog__button { + @include mdc-rtl-reflexive-box(margin, left, 8px); -// TODO: Replace with breakpoint variable -@media (max-width: 640px) { - .mdc-dialog { - min-width: 280px; + &:first-child { + @include mdc-rtl-reflexive-box(margin, left, 0); } - .mdc-dialog__surface { - min-width: 280px; - } + text-align: right; - .mdc-dialog__body { - line-height: 24px; + @include mdc-rtl { + text-align: left; } } .mdc-dialog--animating { visibility: visible; - .mdc-dialog__backdrop { + .mdc-dialog__scrim { transition: mdc-animation-enter(opacity, 120ms); } @@ -156,7 +197,7 @@ .mdc-dialog--open { visibility: visible; - .mdc-dialog__backdrop { + .mdc-dialog__scrim { opacity: .3; } diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline.html b/test/screenshot/spec/mdc-dialog/classes/baseline.html new file mode 100644 index 00000000000..8a49da721bc --- /dev/null +++ b/test/screenshot/spec/mdc-dialog/classes/baseline.html @@ -0,0 +1,101 @@ + + + + + + + Baseline Dialog - MDC Web Screenshot Test + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + diff --git a/test/screenshot/spec/mdc-dialog/classes/overflow.html b/test/screenshot/spec/mdc-dialog/classes/overflow.html new file mode 100644 index 00000000000..b12b9d14f58 --- /dev/null +++ b/test/screenshot/spec/mdc-dialog/classes/overflow.html @@ -0,0 +1,117 @@ + + + + + + Overflow Dialog - MDC Web Screenshot Test + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + diff --git a/test/screenshot/spec/mdc-dialog/classes/scrolled.html b/test/screenshot/spec/mdc-dialog/classes/scrolled.html new file mode 100644 index 00000000000..306240efdd7 --- /dev/null +++ b/test/screenshot/spec/mdc-dialog/classes/scrolled.html @@ -0,0 +1,120 @@ + + + + + + Scrolled Dialog - MDC Web Screenshot Test + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + diff --git a/test/screenshot/spec/mdc-dialog/fixture.js b/test/screenshot/spec/mdc-dialog/fixture.js new file mode 100644 index 00000000000..3a6ff06da01 --- /dev/null +++ b/test/screenshot/spec/mdc-dialog/fixture.js @@ -0,0 +1,17 @@ +/* + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + diff --git a/test/screenshot/spec/mdc-dialog/fixture.scss b/test/screenshot/spec/mdc-dialog/fixture.scss new file mode 100644 index 00000000000..aea217f22cd --- /dev/null +++ b/test/screenshot/spec/mdc-dialog/fixture.scss @@ -0,0 +1,25 @@ +// +// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +@import "../../../../packages/mdc-dialog/mixins"; +@import "../../../../packages/mdc-theme/color-palette"; + +$custom-dialog-color: $material-color-orange-900; + +.test-dialog--static { + position: static; + margin-top: 64px; +} diff --git a/test/screenshot/spec/mdc-dialog/mixins/ink-color.html b/test/screenshot/spec/mdc-dialog/mixins/ink-color.html new file mode 100644 index 00000000000..71ac837fdf5 --- /dev/null +++ b/test/screenshot/spec/mdc-dialog/mixins/ink-color.html @@ -0,0 +1,132 @@ + + + + + + ink-color Drawer Mixin - MDC Web Screenshot Test + + + + + + + + + +
+ + +
+
+
+
+ Permanent Drawer - ink-color Mixin +
+
+
+ +
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit,
+ sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
+ enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+ aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
+ voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
+ occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
+ anim id est laborum. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit,
+ sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
+ enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+ aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
+ voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
+ occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
+ anim id est laborum. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit,
+ sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
+ enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+ aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
+ voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
+ occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
+ anim id est laborum. +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit,
+ sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
+ enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+ aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
+ voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
+ occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
+ anim id est laborum. +

+
+
+
+ + + + + + + + diff --git a/test/unit/mdc-dialog/mdc-dialog.test.js b/test/unit/mdc-dialog/mdc-dialog.test.js index 9ab7c6e651b..9c469a683bd 100644 --- a/test/unit/mdc-dialog/mdc-dialog.test.js +++ b/test/unit/mdc-dialog/mdc-dialog.test.js @@ -34,7 +34,7 @@ function getFixture() { aria-describedby="my-dialog-description">
-

+

Use Google's location service?

@@ -43,12 +43,12 @@ function getFixture() {
+ class="mdc-button mdc-dialog__button mdc-dialog__button--cancel">DECLINE + class="mdc-button mdc-dialog__button mdc-dialog__button--accept">ACCEPT
-
+
`; } @@ -58,8 +58,8 @@ function setupTest() { const openDialog = fixture.querySelector('.open-dialog'); const root = fixture.querySelector('.mdc-dialog'); const component = new MDCDialog(root); - const acceptButton = fixture.querySelector('.mdc-dialog__footer__button--accept'); - const cancelButton = fixture.querySelector('.mdc-dialog__footer__button--cancel'); + const acceptButton = fixture.querySelector('.mdc-dialog__button--accept'); + const cancelButton = fixture.querySelector('.mdc-dialog__button--cancel'); return {openDialog, root, acceptButton, cancelButton, component}; } @@ -247,7 +247,7 @@ test('adapter#trapFocusOnSurface calls activate() on a properly configured focus td.when( util.createFocusTrapInstance( hasClassMatcher('mdc-dialog__surface'), - hasClassMatcher('mdc-dialog__footer__button--accept') + hasClassMatcher('mdc-dialog__button--accept') ) ).thenReturn(fakeFocusTrapInstance); @@ -269,7 +269,7 @@ test('adapter#untrapFocusOnSurface calls deactivate() on a properly configured f td.when( util.createFocusTrapInstance( hasClassMatcher('mdc-dialog__surface'), - hasClassMatcher('mdc-dialog__footer__button--accept') + hasClassMatcher('mdc-dialog__button--accept') ) ).thenReturn(fakeFocusTrapInstance); From f163f65c6ec0c67fad7eb4c0700bbbd30ad3bacd Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 17 Aug 2018 11:38:30 -0700 Subject: [PATCH 003/219] WIP: Fix title overflow in IE 11 --- packages/mdc-dialog/_mixins.scss | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/mdc-dialog/_mixins.scss b/packages/mdc-dialog/_mixins.scss index 120bbac4aeb..fc23a1f360b 100644 --- a/packages/mdc-dialog/_mixins.scss +++ b/packages/mdc-dialog/_mixins.scss @@ -41,11 +41,9 @@ overflow: hidden; // Firefox, Edge <= 16, IE 11 - @supports not (-webkit-line-clamp: $max-lines) { - display: flex; - flex-direction: column; - max-height: (1.5em * $max-lines); - } + display: flex; + flex-direction: column; + max-height: (1.5em * $max-lines); // Chrome, Safari, Edge 17+ @supports (-webkit-line-clamp: $max-lines) { From 066ac9707e32c0e6bbeb61a9839ea6d51f76d6b4 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 17 Aug 2018 11:39:32 -0700 Subject: [PATCH 004/219] WIP: Refactor Sass mixins for better readability --- packages/mdc-dialog/_mixins.scss | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/mdc-dialog/_mixins.scss b/packages/mdc-dialog/_mixins.scss index fc23a1f360b..ba16763837a 100644 --- a/packages/mdc-dialog/_mixins.scss +++ b/packages/mdc-dialog/_mixins.scss @@ -21,6 +21,10 @@ // TODO(acdvorak): Create mixins for all redline values. // TODO(acdvorak): Create screenshot test page with `body { font-size: 200$; }` for all components to test a11y +// +// Public +// + @mixin mdc-dialog-corner-radius($radius: $mdc-dialog-corner-radius) { border-radius: $radius; } @@ -38,14 +42,25 @@ } @mixin mdc-dialog-multiline-ellipsis($max-lines: 2) { + @include mdc-dialog-multiline-ellipsis-fallback_($max-lines); + @include mdc-dialog-multiline-ellipsis-webkit_($max-lines); + + // All browsers overflow: hidden; +} - // Firefox, Edge <= 16, IE 11 +// +// Private +// + +// Firefox, Edge <= 16, IE 11 +@mixin mdc-dialog-multiline-ellipsis-fallback_($max-lines) { display: flex; - flex-direction: column; max-height: (1.5em * $max-lines); +} - // Chrome, Safari, Edge 17+ +// Chrome, Safari, Edge 17+ +@mixin mdc-dialog-multiline-ellipsis-webkit_($max-lines) { @supports (-webkit-line-clamp: $max-lines) { // stylelint-disable-next-line value-no-vendor-prefix display: -webkit-box; From 2debb1991118540f9f57ab394d716d68ce025730 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 22 Aug 2018 21:34:50 -0700 Subject: [PATCH 005/219] WIP: Move `mdc-dialog--open` class from HTML to JS --- test/screenshot/spec/mdc-dialog/classes/baseline.html | 6 +++--- test/screenshot/spec/mdc-dialog/classes/overflow.html | 2 +- test/screenshot/spec/mdc-dialog/classes/scrolled.html | 2 +- test/screenshot/spec/mdc-dialog/fixture.js | 8 +++++++- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline.html b/test/screenshot/spec/mdc-dialog/classes/baseline.html index 8a49da721bc..82e0c5a4177 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline.html @@ -32,7 +32,7 @@
- - - diff --git a/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html b/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html index ec2503cc48d..aec55b4cf82 100644 --- a/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html +++ b/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html @@ -94,13 +94,13 @@

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

- - -
diff --git a/test/screenshot/spec/mdc-dialog/classes/overflow.html b/test/screenshot/spec/mdc-dialog/classes/overflow.html index 3e16bf09a03..349bb245d89 100644 --- a/test/screenshot/spec/mdc-dialog/classes/overflow.html +++ b/test/screenshot/spec/mdc-dialog/classes/overflow.html @@ -94,13 +94,13 @@

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

- - -
diff --git a/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html b/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html index 466cfd76cd8..a3b70424fdf 100644 --- a/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html +++ b/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html @@ -97,10 +97,10 @@

Shields at 60% and falling, captain.

Fusce efficitur mi eget quam scelerisque convallis. Quisque suscipit lacus nisl, sed tincidunt est congue eget. Etiam at cursus enim. Cras convallis maximus finibus. Proin elementum mi vel lobortis iaculis. Duis bibendum feugiat orci ac posuere. Duis vehicula, magna in efficitur pulvinar, nisl lacus elementum quam, nec volutpat tortor est vel libero. Vivamus eu bibendum diam, ac ultricies dui. Nullam nec mauris erat. Nam imperdiet massa vel metus ultricies semper.

- -
diff --git a/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html b/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html index dc5a07e085f..a86bacf533b 100644 --- a/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html +++ b/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html @@ -97,10 +97,10 @@

Shields at 60% and falling, captain.

Fusce efficitur mi eget quam scelerisque convallis. Quisque suscipit lacus nisl, sed tincidunt est congue eget. Etiam at cursus enim. Cras convallis maximus finibus. Proin elementum mi vel lobortis iaculis. Duis bibendum feugiat orci ac posuere. Duis vehicula, magna in efficitur pulvinar, nisl lacus elementum quam, nec volutpat tortor est vel libero. Vivamus eu bibendum diam, ac ultricies dui. Nullam nec mauris erat. Nam imperdiet massa vel metus ultricies semper.

- -
diff --git a/test/screenshot/spec/mdc-dialog/fixture.js b/test/screenshot/spec/mdc-dialog/fixture.js index 2b72ea2d43f..4648f92ddca 100644 --- a/test/screenshot/spec/mdc-dialog/fixture.js +++ b/test/screenshot/spec/mdc-dialog/fixture.js @@ -14,10 +14,20 @@ * limitations under the License. */ +import {cssClasses, strings, numbers} from '../../../../packages/mdc-dialog/constants'; + window.mdc.testFixture.fontsLoaded.then(() => { [].forEach.call(document.querySelectorAll('.mdc-dialog'), /** @param {!HTMLElement} dialogEl */ (dialogEl) => { /** @type {!MDCDialog} */ const dialog = new mdc.dialog.MDCDialog(dialogEl); + const eventNames = [ + strings.YES_EVENT, strings.NO_EVENT, strings.CANCEL_EVENT, + strings.OPEN_START_EVENT, strings.OPEN_END_EVENT, + strings.CLOSE_START_EVENT, strings.CLOSE_END_EVENT, + ]; + eventNames.forEach((eventName) => { + dialog.listen(eventName, (evt) => console.log(eventName, evt)); + }); dialog.show(); if (dialogEl.classList.contains('test-dialog--scroll-to-bottom')) { diff --git a/test/unit/helpers/setup.js b/test/unit/helpers/setup.js index f3bd7d50a42..8f0e722c7a9 100644 --- a/test/unit/helpers/setup.js +++ b/test/unit/helpers/setup.js @@ -23,8 +23,15 @@ import td from 'testdouble'; -// Returns a foundation configured to use a mock object with the same api as a default adapter, -// as well as that adapter itself. +/** + * Returns a foundation configured to use a mock object with the same api as a default adapter, + * as well as that adapter itself. + * The trailing `.` in the `@param` type below is intentional: It indicates a reference to the class itself instead of + * an instance of the class. + * See https://youtrack.jetbrains.com/issue/WEB-10214#focus=streamItem-27-1305930-0-0 + * @param {!MDCFoundation.} FoundationClass + * @return {{mockAdapter: !Object, foundation: !MDCFoundation}} + */ export function setupFoundationTest(FoundationClass) { const mockAdapter = td.object(FoundationClass.defaultAdapter); const foundation = new FoundationClass(mockAdapter); diff --git a/test/unit/mdc-dialog/foundation.test.js b/test/unit/mdc-dialog/foundation.test.js index d9b87769e02..bc3f714b2e8 100644 --- a/test/unit/mdc-dialog/foundation.test.js +++ b/test/unit/mdc-dialog/foundation.test.js @@ -48,15 +48,22 @@ test('exports numbers', () => { test('default adapter returns a complete adapter implementation', () => { verifyDefaultAdapter(MDCDialogFoundation, [ 'addClass', 'removeClass', 'addBodyClass', 'removeBodyClass', - 'eventTargetHasClass', 'registerInteractionHandler', 'deregisterInteractionHandler', + 'eventTargetHasClass', 'eventTargetMatchesSelector', + 'registerInteractionHandler', 'deregisterInteractionHandler', 'registerSurfaceInteractionHandler', 'deregisterSurfaceInteractionHandler', 'registerDocumentKeydownHandler', 'deregisterDocumentKeydownHandler', - 'notifyAccept', 'notifyCancel', 'trapFocusOnSurface', 'untrapFocusOnSurface', 'isDialog', + 'notifyYes', 'notifyNo', 'notifyCancel', 'notifyOpenStart', 'notifyOpenEnd', 'notifyCloseStart', 'notifyCloseEnd', + 'trapFocusOnSurface', 'untrapFocusOnSurface', 'isDialog', ]); }); +/** + * @return {{mockAdapter: !Object, foundation: !MDCDialogFoundation}} + */ function setupTest() { - return setupFoundationTest(MDCDialogFoundation); + return /** @type {{mockAdapter: !Object, foundation: !MDCDialogFoundation}} */ ( + setupFoundationTest(MDCDialogFoundation) + ); } test('#destroy closes the dialog to perform any necessary cleanup', () => { @@ -175,18 +182,46 @@ test('#close deactivates focus trapping on the dialog surface', () => { td.verify(mockAdapter.untrapFocusOnSurface()); }); -test('#accept closes the dialog', () => { +test('#yes closes the dialog', () => { const {foundation} = setupTest(); - foundation.accept(); + foundation.yes(); assert.isFalse(foundation.isOpen()); }); -test('#accept calls accept when shouldNotify is set to true', () => { +test('#yes calls notifyYes when shouldNotify is set to true', () => { + const {foundation, mockAdapter} = setupTest(); + + foundation.yes(true); + td.verify(mockAdapter.notifyYes(), {times: 1}); +}); + +test('#yes does not call notifyYes when shouldNotify is falsy', () => { + const {foundation, mockAdapter} = setupTest(); + + foundation.yes(); + td.verify(mockAdapter.notifyYes(), {times: 0}); +}); + +test('#no closes the dialog', () => { + const {foundation} = setupTest(); + + foundation.no(); + assert.isFalse(foundation.isOpen()); +}); + +test('#no calls notifyNo when shouldNotify is set to true', () => { + const {foundation, mockAdapter} = setupTest(); + + foundation.no(true); + td.verify(mockAdapter.notifyNo(), {times: 1}); +}); + +test('#no does not call notifyNo when shouldNotify is falsy', () => { const {foundation, mockAdapter} = setupTest(); - foundation.accept(true); - td.verify(mockAdapter.notifyAccept()); + foundation.no(); + td.verify(mockAdapter.notifyNo(), {times: 0}); }); test('#cancel closes the dialog', () => { @@ -200,10 +235,32 @@ test('#cancel calls notifyCancel when shouldNotify is set to true', () => { const {foundation, mockAdapter} = setupTest(); foundation.cancel(true); - td.verify(mockAdapter.notifyCancel()); + td.verify(mockAdapter.notifyCancel(), {times: 1}); +}); + +test('#cancel does not call notifyCancel when shouldNotify is falsy', () => { + const {foundation, mockAdapter} = setupTest(); + + foundation.cancel(); + td.verify(mockAdapter.notifyCancel(), {times: 0}); +}); + +test('on dialog surface click closes and notifies if event target is the "yes" button', () => { + const {foundation, mockAdapter} = setupTest(); + const handlers = captureHandlers(mockAdapter, 'registerSurfaceInteractionHandler'); + const evt = { + stopPropagation: () => {}, + target: {}, + }; + + td.when(mockAdapter.eventTargetMatchesSelector(evt.target, strings.YES_BTN_SELECTOR)).thenReturn(true); + foundation.open(); + handlers.click(evt); + td.verify(mockAdapter.removeClass(cssClasses.OPEN)); + td.verify(mockAdapter.notifyYes()); }); -test('on dialog surface click closes and notifies acceptance if event target is the accept button', () => { +test('on dialog surface click closes and notifies if event target is the "no" button', () => { const {foundation, mockAdapter} = setupTest(); const handlers = captureHandlers(mockAdapter, 'registerSurfaceInteractionHandler'); const evt = { @@ -211,14 +268,14 @@ test('on dialog surface click closes and notifies acceptance if event target is target: {}, }; - td.when(mockAdapter.eventTargetHasClass(evt.target, cssClasses.ACCEPT_BTN)).thenReturn(true); + td.when(mockAdapter.eventTargetMatchesSelector(evt.target, strings.NO_BTN_SELECTOR)).thenReturn(true); foundation.open(); handlers.click(evt); td.verify(mockAdapter.removeClass(cssClasses.OPEN)); - td.verify(mockAdapter.notifyAccept()); + td.verify(mockAdapter.notifyNo()); }); -test('on dialog surface click closes and notifies cancellation if event target is the cancel button', () => { +test('on dialog surface click closes and notifies cancellation if event target is the "cancel" button', () => { const {foundation, mockAdapter} = setupTest(); const handlers = captureHandlers(mockAdapter, 'registerSurfaceInteractionHandler'); const evt = { @@ -226,7 +283,7 @@ test('on dialog surface click closes and notifies cancellation if event target i target: {}, }; - td.when(mockAdapter.eventTargetHasClass(evt.target, cssClasses.CANCEL_BTN)).thenReturn(true); + td.when(mockAdapter.eventTargetMatchesSelector(evt.target, strings.CANCEL_BTN_SELECTOR)).thenReturn(true); foundation.open(); handlers.click(evt); td.verify(mockAdapter.removeClass(cssClasses.OPEN)); @@ -234,7 +291,7 @@ test('on dialog surface click closes and notifies cancellation if event target i }); test('on dialog surface click does not close or notify if the event target is not the ' + - 'accept or cancel button', () => { + '"yes", "no", or "cancel" button', () => { const {foundation, mockAdapter} = setupTest(); const handlers = captureHandlers(mockAdapter, 'registerSurfaceInteractionHandler'); const evt = { @@ -247,7 +304,8 @@ test('on dialog surface click does not close or notify if the event target is no handlers.click(evt); td.verify(mockAdapter.removeClass(cssClasses.OPEN), {times: 0}); td.verify(mockAdapter.notifyCancel(), {times: 0}); - td.verify(mockAdapter.notifyAccept(), {times: 0}); + td.verify(mockAdapter.notifyYes(), {times: 0}); + td.verify(mockAdapter.notifyNo(), {times: 0}); }); test('on click closes the dialog and notifies cancellation if event target is the backdrop', () => { diff --git a/test/unit/mdc-dialog/mdc-dialog.test.js b/test/unit/mdc-dialog/mdc-dialog.test.js index 90f4b69ed5d..453b82e2ae8 100644 --- a/test/unit/mdc-dialog/mdc-dialog.test.js +++ b/test/unit/mdc-dialog/mdc-dialog.test.js @@ -27,6 +27,7 @@ import domEvents from 'dom-events'; import td from 'testdouble'; import {createMockRaf} from '../helpers/raf'; import {strings} from '../../../packages/mdc-dialog/constants'; +import {matches} from '../../../packages/mdc-base/ponyfill'; import {MDCDialog, util} from '../../../packages/mdc-dialog'; import {supportsCssVariables} from '../../../packages/mdc-ripple/util'; @@ -50,9 +51,11 @@ function getFixture() {
+ class="mdc-button mdc-dialog__button" data-mdc-dialog-action="cancel">Cancel + class="mdc-button mdc-dialog__button" data-mdc-dialog-action="no">No +
@@ -65,15 +68,20 @@ function setupTest() { const openDialog = fixture.querySelector('.open-dialog'); const root = fixture.querySelector('.mdc-dialog'); const component = new MDCDialog(root); - const acceptButton = fixture.querySelector('.mdc-dialog__button--accept'); - const cancelButton = fixture.querySelector('.mdc-dialog__button--cancel'); - return {openDialog, root, acceptButton, cancelButton, component}; + const yesButton = fixture.querySelector('[data-mdc-dialog-action="yes"]'); + const noButton = fixture.querySelector('[data-mdc-dialog-action="no"]'); + const cancelButton = fixture.querySelector('[data-mdc-dialog-action="cancel"]'); + return {openDialog, root, yesButton, noButton, cancelButton, component}; } function hasClassMatcher(className) { return td.matchers.argThat((el) => el.classList && el.classList.contains(className)); } +function hasSelectorMatcher(selector) { + return td.matchers.argThat((el) => matches(el, selector)); +} + suite('MDCDialog'); test('attachTo returns a component instance', () => { @@ -83,23 +91,25 @@ test('attachTo returns a component instance', () => { if (supportsCssVariables(window)) { test('#initialize attaches ripple elements to all footer buttons', () => { const raf = createMockRaf(); - const {acceptButton, cancelButton} = setupTest(); + const {yesButton,noButton, cancelButton} = setupTest(); raf.flush(); - assert.isTrue(acceptButton.classList.contains('mdc-ripple-upgraded')); + assert.isTrue(yesButton.classList.contains('mdc-ripple-upgraded')); + assert.isTrue(noButton.classList.contains('mdc-ripple-upgraded')); assert.isTrue(cancelButton.classList.contains('mdc-ripple-upgraded')); raf.restore(); }); test('#destroy cleans up all ripples on footer buttons', () => { const raf = createMockRaf(); - const {component, acceptButton, cancelButton} = setupTest(); + const {component, yesButton, noButton, cancelButton} = setupTest(); raf.flush(); component.destroy(); raf.flush(); - assert.isFalse(acceptButton.classList.contains('mdc-ripple-upgraded')); + assert.isFalse(yesButton.classList.contains('mdc-ripple-upgraded')); + assert.isFalse(noButton.classList.contains('mdc-ripple-upgraded')); assert.isFalse(cancelButton.classList.contains('mdc-ripple-upgraded')); raf.restore(); }); @@ -221,13 +231,33 @@ test('adapter#eventTargetHasClass returns whether or not the className is in the assert.isFalse(adapter.eventTargetHasClass(target, 'non-existent-class')); }); -test(`adapter#notifyAccept emits ${strings.ACCEPT_EVENT}`, () => { +test('adapter#eventTargetMatchesSelector returns whether or not the className is in the target\'s classList', () => { + const {component} = setupTest(); + const target = bel`
`; + const {adapter_: adapter} = component.getDefaultFoundation(); + + assert.isTrue(adapter.eventTargetMatchesSelector(target, '[data-existent-attr]')); + assert.isFalse(adapter.eventTargetMatchesSelector(target, '[data-non-existent-attr]')); +}); + +test(`adapter#notifyYes emits ${strings.YES_EVENT}`, () => { + const {component} = setupTest(); + + const handler = td.func('yesHandler'); + + component.listen(strings.YES_EVENT, handler); + component.getDefaultFoundation().adapter_.notifyYes(); + + td.verify(handler(td.matchers.anything())); +}); + +test(`adapter#notifyNo emits ${strings.NO_EVENT}`, () => { const {component} = setupTest(); - const handler = td.func('acceptHandler'); + const handler = td.func('noHandler'); - component.listen(strings.ACCEPT_EVENT, handler); - component.getDefaultFoundation().adapter_.notifyAccept(); + component.listen(strings.NO_EVENT, handler); + component.getDefaultFoundation().adapter_.notifyNo(); td.verify(handler(td.matchers.anything())); }); @@ -254,7 +284,7 @@ test('adapter#trapFocusOnSurface calls activate() on a properly configured focus td.when( util.createFocusTrapInstance( hasClassMatcher('mdc-dialog__container'), - hasClassMatcher('mdc-dialog__button--accept') + hasSelectorMatcher('[data-mdc-dialog-action="yes"]') ) ).thenReturn(fakeFocusTrapInstance); @@ -276,7 +306,7 @@ test('adapter#untrapFocusOnSurface calls deactivate() on a properly configured f td.when( util.createFocusTrapInstance( hasClassMatcher('mdc-dialog__container'), - hasClassMatcher('mdc-dialog__button--accept') + hasSelectorMatcher('[data-mdc-dialog-action="yes"]') ) ).thenReturn(fakeFocusTrapInstance); diff --git a/test/unit/mdc-dialog/util.test.js b/test/unit/mdc-dialog/util.test.js index 0a1c59f7dd5..1b3c369b4d0 100644 --- a/test/unit/mdc-dialog/util.test.js +++ b/test/unit/mdc-dialog/util.test.js @@ -31,14 +31,14 @@ suite('MDCDialog - util'); test('#createFocusTrapInstance creates a properly configured focus trap instance', () => { const surface = bel`
`; - const acceptBtn = bel``; + const yesBtn = bel``; const focusTrapFactory = td.func('focusTrapFactory'); const properlyConfiguredFocusTrapInstance = {}; td.when(focusTrapFactory(surface, { - initialFocus: acceptBtn, + initialFocus: yesBtn, clickOutsideDeactivates: true, })).thenReturn(properlyConfiguredFocusTrapInstance); - const instance = util.createFocusTrapInstance(surface, acceptBtn, focusTrapFactory); + const instance = util.createFocusTrapInstance(surface, yesBtn, focusTrapFactory); assert.equal(instance, properlyConfiguredFocusTrapInstance); }); From 36e88961643779d944b006c6d2061109b19431ed Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 16:39:56 -0700 Subject: [PATCH 020/219] WIP: Auto-focus first focusable element in dialog instead of "Yes" button --- packages/mdc-dialog/index.js | 6 +--- packages/mdc-dialog/util.js | 63 +++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 1abd94c0537..b2358985a8f 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -40,17 +40,13 @@ export class MDCDialog extends MDCComponent { return this.foundation_.isOpen(); } - get notifyYesButton_() { - return this.root_.querySelector(MDCDialogFoundation.strings.YES_BTN_SELECTOR); - } - get dialogSurface_() { return this.root_.querySelector(MDCDialogFoundation.strings.DIALOG_SURFACE_SELECTOR); } initialize() { this.featureDetector_ = new MDCFeatureDetector(); - this.focusTrap_ = util.createFocusTrapInstance(this.dialogSurface_, this.notifyYesButton_); + this.focusTrap_ = util.createFocusTrapInstance(this.dialogSurface_); this.footerBtnRipples_ = []; const footerBtns = this.root_.querySelectorAll('.mdc-dialog__button'); diff --git a/packages/mdc-dialog/util.js b/packages/mdc-dialog/util.js index 7f19e5f6571..ec8293a67cb 100644 --- a/packages/mdc-dialog/util.js +++ b/packages/mdc-dialog/util.js @@ -22,10 +22,71 @@ */ import createFocusTrap from 'focus-trap'; +import {matches} from '@material/base/ponyfill'; +/** + * @param {!HTMLElement} surfaceEl + * @param {?HTMLElement=} initialFocusEl + * @param {function(!HTMLElement, !FocusTrapCreateOptions): !focusTrap} focusTrapFactory + * @return {!focusTrap} + */ export function createFocusTrapInstance(surfaceEl, initialFocusEl, focusTrapFactory = createFocusTrap) { return focusTrapFactory(surfaceEl, { - initialFocus: initialFocusEl, + initialFocus: initialFocusEl || getFirstFocusableElement(surfaceEl), clickOutsideDeactivates: true, }); } + +/** + * TODO(acdvorak): Add unit test for this? + * @param {!HTMLElement} surfaceEl + * @return {!HTMLElement|undefined} + */ +function getFirstFocusableElement(surfaceEl) { + const includeSelectors = [ + 'input', + 'textarea', + 'button', + 'a', + '[tabIndex]', + ]; + + const excludeSelectors = [ + '[tabIndex="-1"]', + '[type="radio"]', + '[type="checkbox"]', + '[type="hidden"]', + ]; + + const isExcluded = (el) => { + const style = getComputedStyle(el); + if (style.display === 'none' || style.visibility === 'hidden' || parseFloat(style.opacity) < 0.01) { + return true; + } + + const rect = el.getBoundingClientRect(); + if (!rect.width || !rect.height) { + return true; + } + + if (excludeSelectors.some((excludeSelector) => matches(el, excludeSelector))) { + return true; + } + + return false; + }; + + const includedEls = [].slice.call(surfaceEl.querySelectorAll(includeSelectors.join(', '))); + const focusableEls = includedEls.filter(/** @type {!HTMLElement} */ (el) => { + while (el) { + if (isExcluded(el)) { + return false; + } + el = el.parentElement; + } + return true; + }); + + return focusableEls[0]; +} + From fe5c18e0ff8752f1a2ff86855e7006bd75cf26ba Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 16:59:36 -0700 Subject: [PATCH 021/219] WIP: Add `[autofocus]` CSS selector in focus trap --- packages/mdc-dialog/util.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mdc-dialog/util.js b/packages/mdc-dialog/util.js index ec8293a67cb..59eccdae444 100644 --- a/packages/mdc-dialog/util.js +++ b/packages/mdc-dialog/util.js @@ -48,6 +48,7 @@ function getFirstFocusableElement(surfaceEl) { 'textarea', 'button', 'a', + '[autofocus]', '[tabIndex]', ]; From 04854f1a43212fc6872846d9cbfdbe78a39d0f86 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 17:52:34 -0700 Subject: [PATCH 022/219] WIP: Fix IE 11 bug detection on `overflow-accessible-font-size.html` --- packages/mdc-base/feature-detector.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/mdc-base/feature-detector.js b/packages/mdc-base/feature-detector.js index cce879cc771..3ce3a16338d 100644 --- a/packages/mdc-base/feature-detector.js +++ b/packages/mdc-base/feature-detector.js @@ -71,10 +71,14 @@ class MDCFeatureDetector { ignoresOverflowAutoOnChildFlexItemsThatExceedMaxHeight_() { const tempEl = document.createElement('div'); + // The 1px border is necessary to force IE to calculate box sizing correctly. tempEl.innerHTML = ` -
-
-
+
+
Foo
+
1
2
3
@@ -85,15 +89,14 @@ class MDCFeatureDetector { 8
9
-
+
Bar
`; - // TODO(acdvorak): Use `position: fixed` (or similar) to prevent jank on page load, if necessary. document.body.appendChild(tempEl); - const contentEl = tempEl.querySelector('article'); - const isScrollable = contentEl.scrollHeight > contentEl.offsetHeight; + const flexItemEl = tempEl.querySelector('article'); + const isScrollable = flexItemEl.scrollHeight > flexItemEl.offsetHeight; document.body.removeChild(tempEl); From a62f7431d8d1426438dfeb34e0aba27179d0a61e Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 18:24:40 -0700 Subject: [PATCH 023/219] WIP: Prioritize `autofocus` elements --- packages/mdc-dialog/util.js | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/mdc-dialog/util.js b/packages/mdc-dialog/util.js index 59eccdae444..2ef3538483f 100644 --- a/packages/mdc-dialog/util.js +++ b/packages/mdc-dialog/util.js @@ -30,7 +30,7 @@ import {matches} from '@material/base/ponyfill'; * @param {function(!HTMLElement, !FocusTrapCreateOptions): !focusTrap} focusTrapFactory * @return {!focusTrap} */ -export function createFocusTrapInstance(surfaceEl, initialFocusEl, focusTrapFactory = createFocusTrap) { +export function createFocusTrapInstance(surfaceEl, initialFocusEl = null, focusTrapFactory = createFocusTrap) { return focusTrapFactory(surfaceEl, { initialFocus: initialFocusEl || getFirstFocusableElement(surfaceEl), clickOutsideDeactivates: true, @@ -39,24 +39,30 @@ export function createFocusTrapInstance(surfaceEl, initialFocusEl, focusTrapFact /** * TODO(acdvorak): Add unit test for this? + * See https://allyjs.io/data-tables/focusable.html * @param {!HTMLElement} surfaceEl * @return {!HTMLElement|undefined} */ function getFirstFocusableElement(surfaceEl) { const includeSelectors = [ + 'a', + 'button', 'input', + 'select', + 'summary', 'textarea', - 'button', - 'a', - '[autofocus]', + 'audio[controls]', + 'video[controls]', + '[contenteditable]', '[tabIndex]', ]; const excludeSelectors = [ + 'input[type="radio"]', + 'input[type="checkbox"]', + 'input[type="hidden"]', + '[disabled]', '[tabIndex="-1"]', - '[type="radio"]', - '[type="checkbox"]', - '[type="hidden"]', ]; const isExcluded = (el) => { @@ -77,8 +83,10 @@ function getFirstFocusableElement(surfaceEl) { return false; }; + /** @type {!Array} */ const includedEls = [].slice.call(surfaceEl.querySelectorAll(includeSelectors.join(', '))); - const focusableEls = includedEls.filter(/** @type {!HTMLElement} */ (el) => { + + const focusableEls = includedEls.filter((el) => { while (el) { if (isExcluded(el)) { return false; @@ -88,6 +96,10 @@ function getFirstFocusableElement(surfaceEl) { return true; }); - return focusableEls[0]; + const autoFocusEls = focusableEls.filter((el) => { + return el.autofocus; + }); + + return autoFocusEls[0] || focusableEls[0]; } From 9a89f1e6517f8dbbf614e047db4a4dc0831f2756 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 18:29:11 -0700 Subject: [PATCH 024/219] WIP: Fix IE bug --- test/screenshot/golden.json | 47 +++++++++++----------- test/screenshot/spec/mdc-dialog/fixture.js | 15 +++++-- test/unit/mdc-dialog/mdc-dialog.test.js | 2 +- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index cf359d351a5..cec0d64cd29 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -200,19 +200,19 @@ "spec/mdc-dialog/classes/baseline-alert.html": { "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-alert.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-alert.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-alert.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-alert.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/10_09_21_890/spec/mdc-dialog/classes/baseline-alert.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/baseline-confirmation.html": { "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-confirmation.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-confirmation.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/10_09_21_890/spec/mdc-dialog/classes/baseline-confirmation.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-confirmation.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/10_09_21_890/spec/mdc-dialog/classes/baseline-confirmation.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/baseline-simple.html": { @@ -227,36 +227,37 @@ "spec/mdc-dialog/classes/overflow-accessible-font-size.html": { "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_firefox_61.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_37_22_498/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/overflow.html": { "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/10_09_21_890/spec/mdc-dialog/classes/overflow.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/scrollable-bottom.html": { "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-bottom.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-bottom.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-bottom.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/10_09_21_890/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_51_53_788/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/scrollable-top.html": { "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-top.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-top.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-top.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-top.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/10_09_21_890/spec/mdc-dialog/classes/scrollable-top.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_ie_11.png" } }, "spec/mdc-drawer/classes/permanent.html": { diff --git a/test/screenshot/spec/mdc-dialog/fixture.js b/test/screenshot/spec/mdc-dialog/fixture.js index 4648f92ddca..5fa3d167a58 100644 --- a/test/screenshot/spec/mdc-dialog/fixture.js +++ b/test/screenshot/spec/mdc-dialog/fixture.js @@ -14,27 +14,36 @@ * limitations under the License. */ -import {cssClasses, strings, numbers} from '../../../../packages/mdc-dialog/constants'; +import {strings} from '../../../../packages/mdc-dialog/constants'; window.mdc.testFixture.fontsLoaded.then(() => { [].forEach.call(document.querySelectorAll('.mdc-dialog'), /** @param {!HTMLElement} dialogEl */ (dialogEl) => { /** @type {!MDCDialog} */ const dialog = new mdc.dialog.MDCDialog(dialogEl); + const eventNames = [ strings.YES_EVENT, strings.NO_EVENT, strings.CANCEL_EVENT, strings.OPEN_START_EVENT, strings.OPEN_END_EVENT, strings.CLOSE_START_EVENT, strings.CLOSE_END_EVENT, ]; + eventNames.forEach((eventName) => { dialog.listen(eventName, (evt) => console.log(eventName, evt)); }); - dialog.show(); if (dialogEl.classList.contains('test-dialog--scroll-to-bottom')) { const bodyEl = dialogEl.querySelector('.mdc-dialog__content'); if (bodyEl) { - bodyEl.scrollTop = bodyEl.scrollHeight; + const setContentScrollPosition = () => { + bodyEl.scrollTop = bodyEl.scrollHeight; + if (bodyEl.scrollTop === 0) { + requestAnimationFrame(setContentScrollPosition); + } + }; + setContentScrollPosition(); } } + + dialog.show(); }); }); diff --git a/test/unit/mdc-dialog/mdc-dialog.test.js b/test/unit/mdc-dialog/mdc-dialog.test.js index 453b82e2ae8..df32e8f622b 100644 --- a/test/unit/mdc-dialog/mdc-dialog.test.js +++ b/test/unit/mdc-dialog/mdc-dialog.test.js @@ -91,7 +91,7 @@ test('attachTo returns a component instance', () => { if (supportsCssVariables(window)) { test('#initialize attaches ripple elements to all footer buttons', () => { const raf = createMockRaf(); - const {yesButton,noButton, cancelButton} = setupTest(); + const {yesButton, noButton, cancelButton} = setupTest(); raf.flush(); assert.isTrue(yesButton.classList.contains('mdc-ripple-upgraded')); From 2afd100b90971a5bf3bd9f1c0aa41039159a2152 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 18:49:48 -0700 Subject: [PATCH 025/219] WIP: Fix unit test failures --- test/unit/mdc-dialog/mdc-dialog.test.js | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/test/unit/mdc-dialog/mdc-dialog.test.js b/test/unit/mdc-dialog/mdc-dialog.test.js index df32e8f622b..7175ad3a56c 100644 --- a/test/unit/mdc-dialog/mdc-dialog.test.js +++ b/test/unit/mdc-dialog/mdc-dialog.test.js @@ -78,10 +78,6 @@ function hasClassMatcher(className) { return td.matchers.argThat((el) => el.classList && el.classList.contains(className)); } -function hasSelectorMatcher(selector) { - return td.matchers.argThat((el) => matches(el, selector)); -} - suite('MDCDialog'); test('attachTo returns a component instance', () => { @@ -281,12 +277,8 @@ test('adapter#trapFocusOnSurface calls activate() on a properly configured focus activate: () => {}, deactivate: () => {}, }); - td.when( - util.createFocusTrapInstance( - hasClassMatcher('mdc-dialog__container'), - hasSelectorMatcher('[data-mdc-dialog-action="yes"]') - ) - ).thenReturn(fakeFocusTrapInstance); + + td.when(util.createFocusTrapInstance(hasClassMatcher('mdc-dialog__container'))).thenReturn(fakeFocusTrapInstance); const {component} = setupTest(); component.getDefaultFoundation().adapter_.trapFocusOnSurface(); @@ -303,12 +295,8 @@ test('adapter#untrapFocusOnSurface calls deactivate() on a properly configured f activate: () => {}, deactivate: () => {}, }); - td.when( - util.createFocusTrapInstance( - hasClassMatcher('mdc-dialog__container'), - hasSelectorMatcher('[data-mdc-dialog-action="yes"]') - ) - ).thenReturn(fakeFocusTrapInstance); + + td.when(util.createFocusTrapInstance(hasClassMatcher('mdc-dialog__container'))).thenReturn(fakeFocusTrapInstance); const {component} = setupTest(); component.getDefaultFoundation().adapter_.untrapFocusOnSurface(); From 688867f9560528a6c05ee6a4911a83f2b6a3760d Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 19:02:54 -0700 Subject: [PATCH 026/219] WIP: Fix linter error --- test/unit/mdc-dialog/mdc-dialog.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit/mdc-dialog/mdc-dialog.test.js b/test/unit/mdc-dialog/mdc-dialog.test.js index 7175ad3a56c..afab4d613a2 100644 --- a/test/unit/mdc-dialog/mdc-dialog.test.js +++ b/test/unit/mdc-dialog/mdc-dialog.test.js @@ -27,7 +27,6 @@ import domEvents from 'dom-events'; import td from 'testdouble'; import {createMockRaf} from '../helpers/raf'; import {strings} from '../../../packages/mdc-dialog/constants'; -import {matches} from '../../../packages/mdc-base/ponyfill'; import {MDCDialog, util} from '../../../packages/mdc-dialog'; import {supportsCssVariables} from '../../../packages/mdc-ripple/util'; From c7c327a88844641750e09c27c3bfde19a4c18e95 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 19:20:03 -0700 Subject: [PATCH 027/219] WIP: Fix failing Closure rewrite test --- packages/mdc-base/ponyfill.js | 4 ++- ...ewrite-decl-statements-for-closure-test.js | 29 ++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/mdc-base/ponyfill.js b/packages/mdc-base/ponyfill.js index 70b9e1e6ef6..607478340f2 100644 --- a/packages/mdc-base/ponyfill.js +++ b/packages/mdc-base/ponyfill.js @@ -30,7 +30,7 @@ * @param {string} selector * @return {boolean} */ -export function matches(elem, selector) { +function matches(elem, selector) { const nativeMatches = elem.matches || elem.webkitMatchesSelector || elem.mozMatchesSelector @@ -38,3 +38,5 @@ export function matches(elem, selector) { || elem.oMatchesSelector; return nativeMatches.call(elem, selector); } + +export {matches}; diff --git a/scripts/rewrite-decl-statements-for-closure-test.js b/scripts/rewrite-decl-statements-for-closure-test.js index 90d009577df..30488140681 100644 --- a/scripts/rewrite-decl-statements-for-closure-test.js +++ b/scripts/rewrite-decl-statements-for-closure-test.js @@ -218,8 +218,35 @@ function transform(srcFile, rootDir) { } // Specify goog.module after the @license comment and append newline at the end of the file. - // First, get the first occurence of a multiline comment terminator with 0 or more preceding whitespace characters. + // First, get the first occurrence of a multiline comment terminator with 0 or more preceding whitespace characters. const result = /\s*\*\//.exec(outputCode); + + if (!result) { + const data = JSON.stringify({ + srcFile, + pathbasedPackageName, + packageStr, + outputCode, + }, null, 2); + + const message = ` +Missing multiline comment terminator! + +Note that the following syntax is not supported: + + export function foo() { ... } + +use this instead: + + function foo() { ... } + export {foo}; + +${data} +`.trim(); + + throw new Error(message); + } + // Then, get the index of that first matching character set plus the length of the matching characters, plus one // extra character for more space. We now have the position at which we need to inject the "goog.module(...)" // declaration and can assemble the module-declared code. Yay! From e2205a66f359172ec27c1e90b93b91ac5372ea49 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 19:26:34 -0700 Subject: [PATCH 028/219] WIP: Fix flaky Edge / IE 11 screenshot tests --- .../spec/mdc-dialog/classes/baseline-confirmation.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html b/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html index b6dbff3d8f6..c0b97035495 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html @@ -45,7 +45,11 @@

-
    + +
    • From 06d0492c9540532ba8c51c39640d527c6d65aa7f Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 19:48:35 -0700 Subject: [PATCH 029/219] WIP: Update flaky Edge screenshot --- test/screenshot/golden.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index cec0d64cd29..d27659eec5b 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -246,7 +246,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-bottom.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/24/02_30_18_982/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_51_53_788/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" } From 5239abc38459f891e0ce4a0dd0f96297d1687328 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 19:59:13 -0700 Subject: [PATCH 030/219] WIP: Update comment --- packages/mdc-base/ponyfill.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/mdc-base/ponyfill.js b/packages/mdc-base/ponyfill.js index 607478340f2..89856eeb170 100644 --- a/packages/mdc-base/ponyfill.js +++ b/packages/mdc-base/ponyfill.js @@ -21,8 +21,9 @@ * THE SOFTWARE. */ -/* - * DOM ponyfills +/** + * @fileoverview A "ponyfill" is a polyfill that doesn't modify the global prototype chain. + * This makes ponyfills safer than traditional polyfills, especially for libraries like MDC. */ /** From fc67f0c501c0b41f6773767f73dfdb8a4972e098 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 23 Aug 2018 20:02:44 -0700 Subject: [PATCH 031/219] WIP: Update copyright notices from Apache 2 to MIT --- .../mdc-dialog/classes/baseline-alert.html | 26 ++++++++++------- .../classes/baseline-confirmation.html | 26 ++++++++++------- .../mdc-dialog/classes/baseline-simple.html | 26 ++++++++++------- .../overflow-accessible-font-size.html | 26 ++++++++++------- .../spec/mdc-dialog/classes/overflow.html | 26 ++++++++++------- .../mdc-dialog/classes/scrollable-bottom.html | 26 ++++++++++------- .../mdc-dialog/classes/scrollable-top.html | 26 ++++++++++------- test/screenshot/spec/mdc-dialog/fixture.js | 29 ++++++++++++------- 8 files changed, 130 insertions(+), 81 deletions(-) diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html b/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html index 0b376bca26d..4b36a2fd5ec 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html @@ -1,18 +1,24 @@ diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html b/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html index c0b97035495..2ec0ab86a3f 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html @@ -1,18 +1,24 @@ diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html b/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html index 0fde29eda3b..7ae2e2268e8 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html @@ -1,18 +1,24 @@ diff --git a/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html b/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html index aec55b4cf82..2294814da01 100644 --- a/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html +++ b/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html @@ -1,18 +1,24 @@ diff --git a/test/screenshot/spec/mdc-dialog/classes/overflow.html b/test/screenshot/spec/mdc-dialog/classes/overflow.html index 349bb245d89..d353978b06d 100644 --- a/test/screenshot/spec/mdc-dialog/classes/overflow.html +++ b/test/screenshot/spec/mdc-dialog/classes/overflow.html @@ -1,18 +1,24 @@ diff --git a/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html b/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html index a3b70424fdf..e84a0514185 100644 --- a/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html +++ b/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html @@ -1,18 +1,24 @@ diff --git a/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html b/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html index a86bacf533b..e6fd0da01e6 100644 --- a/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html +++ b/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html @@ -1,18 +1,24 @@ diff --git a/test/screenshot/spec/mdc-dialog/fixture.js b/test/screenshot/spec/mdc-dialog/fixture.js index 5fa3d167a58..fa947ad0a85 100644 --- a/test/screenshot/spec/mdc-dialog/fixture.js +++ b/test/screenshot/spec/mdc-dialog/fixture.js @@ -1,17 +1,24 @@ -/* - * Copyright 2018 Google Inc. All Rights Reserved. +/** + * @license + * Copyright 2018 Google Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * https://www.apache.org/licenses/LICENSE-2.0 + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. */ import {strings} from '../../../../packages/mdc-dialog/constants'; From 13b72af32c3485b486c3e88124a33a58d0b14492 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 24 Aug 2018 09:24:27 -0700 Subject: [PATCH 032/219] WIP: Update flaky Edge screenshots --- test/screenshot/golden.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index d27659eec5b..3d32904f7de 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -228,7 +228,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/24/16_06_55_231/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_37_22_498/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_ie_11.png" } @@ -237,7 +237,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/24/16_06_55_231/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_ie_11.png" } From 9c492437cbabfc2757444b27c7435ca75177df83 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 24 Aug 2018 11:59:10 -0700 Subject: [PATCH 033/219] WIP: Retry flaky screenshots up to 6 times in Edge and IE 11 --- test/screenshot/diffing.json | 1 + 1 file changed, 1 insertion(+) diff --git a/test/screenshot/diffing.json b/test/screenshot/diffing.json index 2d46c819175..1d1bf775485 100644 --- a/test/screenshot/diffing.json +++ b/test/screenshot/diffing.json @@ -34,6 +34,7 @@ "desktop_windows_ie@11" ], "url_regex_patterns": [ + "mdc-dialog", "mdc-textfield", "mdc-typography" ], From 912c50aafa07ae08a1868c223e453b1a0b03106a Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 24 Aug 2018 17:41:35 -0700 Subject: [PATCH 034/219] WIP: Fix Edge flakiness by using monospace font instead of Roboto --- test/screenshot/diffing.json | 1 - test/screenshot/golden.json | 12 ++++++------ test/screenshot/spec/fixture.scss | 15 +++++++++++++++ .../spec/mdc-dialog/classes/baseline-alert.html | 2 +- .../mdc-dialog/classes/baseline-confirmation.html | 2 +- .../spec/mdc-dialog/classes/baseline-simple.html | 2 +- .../classes/overflow-accessible-font-size.html | 2 +- .../spec/mdc-dialog/classes/overflow.html | 2 +- .../mdc-dialog/classes/scrollable-bottom.html | 2 +- .../spec/mdc-dialog/classes/scrollable-top.html | 2 +- 10 files changed, 28 insertions(+), 14 deletions(-) diff --git a/test/screenshot/diffing.json b/test/screenshot/diffing.json index 1d1bf775485..2d46c819175 100644 --- a/test/screenshot/diffing.json +++ b/test/screenshot/diffing.json @@ -34,7 +34,6 @@ "desktop_windows_ie@11" ], "url_regex_patterns": [ - "mdc-dialog", "mdc-textfield", "mdc-typography" ], diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index 3d32904f7de..3cf8b7511e9 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -201,7 +201,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-alert.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/25/00_14_42_896/spec/mdc-dialog/classes/baseline-alert.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_ie_11.png" } @@ -210,7 +210,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-confirmation.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/25/00_14_42_896/spec/mdc-dialog/classes/baseline-confirmation.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_ie_11.png" } @@ -228,7 +228,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/24/16_06_55_231/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/25/00_14_42_896/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_37_22_498/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_ie_11.png" } @@ -237,7 +237,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/24/16_06_55_231/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/25/00_14_42_896/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_ie_11.png" } @@ -246,7 +246,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-bottom.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/24/02_30_18_982/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/25/00_14_42_896/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_51_53_788/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" } @@ -255,7 +255,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-top.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/25/00_14_42_896/spec/mdc-dialog/classes/scrollable-top.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_ie_11.png" } diff --git a/test/screenshot/spec/fixture.scss b/test/screenshot/spec/fixture.scss index 684d92002fc..7adf4efb6bb 100644 --- a/test/screenshot/spec/fixture.scss +++ b/test/screenshot/spec/fixture.scss @@ -38,6 +38,21 @@ $test-layout-cell-grid-color: #dddddd; font-size: 200%; } +// MS Edge only +@supports (-ms-ime-align: auto) { + .test-container--edge-fonts { + .mdc-button, + .mdc-floating-label, + .mdc-text-field-helper-text, + .mdc-text-field__input { + // Monospace font is still somewhat flaky, but not nearly as bad as Roboto. + // The nuclear option would be to set `color: transparent !important`, which would prevent 100% of Edge flakes + // at the expense of not being able to test button font colors in Edge. + font-family: monospace !important; + } + } +} + .test-viewport { position: relative; box-sizing: border-box; diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html b/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html index 4b36a2fd5ec..677c2897be5 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html @@ -34,7 +34,7 @@ - +
      - +
      - +
      - +
      - +
      - +
      - +
      Date: Fri, 24 Aug 2018 19:26:08 -0700 Subject: [PATCH 035/219] WIP: Delete unnecessary `package-lock.json` files --- packages/mdc-drawer/package-lock.json | 110 ----------------------- packages/mdc-elevation/package-lock.json | 11 --- 2 files changed, 121 deletions(-) delete mode 100644 packages/mdc-drawer/package-lock.json delete mode 100644 packages/mdc-elevation/package-lock.json diff --git a/packages/mdc-drawer/package-lock.json b/packages/mdc-drawer/package-lock.json deleted file mode 100644 index 998db69b7a4..00000000000 --- a/packages/mdc-drawer/package-lock.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "name": "@material/drawer", - "version": "0.39.0-0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@material/animation": { - "version": "0.34.0" - }, - "@material/base": { - "version": "0.35.0" - }, - "@material/elevation": { - "version": "0.38.0", - "requires": { - "@material/animation": "^0.34.0", - "@material/theme": "^0.38.0" - }, - "dependencies": { - "@material/animation": { - "version": "0.34.0", - "bundled": true - }, - "@material/theme": { - "version": "0.38.0", - "bundled": true - } - } - }, - "@material/list": { - "version": "0.39.0-0", - "requires": { - "@material/base": "^0.35.0", - "@material/ripple": "^0.38.1", - "@material/rtl": "^0.36.0", - "@material/theme": "^0.38.0", - "@material/typography": "^0.39.0-0" - }, - "dependencies": { - "@material/base": { - "version": "0.35.0", - "bundled": true - }, - "@material/ripple": { - "version": "0.38.1", - "bundled": true, - "requires": { - "@material/animation": "^0.34.0", - "@material/base": "^0.35.0", - "@material/theme": "^0.38.0" - }, - "dependencies": { - "@material/animation": { - "version": "0.34.0", - "bundled": true - }, - "@material/base": { - "version": "0.35.0", - "bundled": true - }, - "@material/theme": { - "version": "0.38.0", - "bundled": true - } - } - }, - "@material/rtl": { - "version": "0.36.0", - "bundled": true - }, - "@material/theme": { - "version": "0.38.0", - "bundled": true - }, - "@material/typography": { - "version": "0.39.0-0", - "bundled": true - } - } - }, - "@material/rtl": { - "version": "0.36.0" - }, - "@material/theme": { - "version": "0.38.0" - }, - "@material/typography": { - "version": "0.39.0-0" - }, - "focus-trap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-3.0.0.tgz", - "integrity": "sha512-jTFblf0tLWbleGjj2JZsAKbgtZTdL1uC48L8FcmSDl4c2vDoU4NycN1kgV5vJhuq1mxNFkw7uWZ1JAGlINWvyw==", - "requires": { - "tabbable": "^3.1.0", - "xtend": "^4.0.1" - } - }, - "tabbable": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-3.1.0.tgz", - "integrity": "sha512-W+w8dbSbQiuhMQhJbgtSn7ksg1Z+Z0UQq0WpDuYUrXjqie2bkMTfXRhdKtyQ8lRbppDWFoQf+S3T+OBGxoEPUA==" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - } - } -} diff --git a/packages/mdc-elevation/package-lock.json b/packages/mdc-elevation/package-lock.json deleted file mode 100644 index 89903b4dece..00000000000 --- a/packages/mdc-elevation/package-lock.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@material/theme": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-0.4.0.tgz", - "integrity": "sha1-Cu8aAnm2XBWZBYT7i47KCVxzRkE=" - } - } -} From 3c731496a78ea7c48822fca8927a87a2536b229e Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 24 Aug 2018 20:16:02 -0700 Subject: [PATCH 036/219] WIP: Add debugging info to failing unit test --- test/unit/mdc-ripple/mdc-ripple.test.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/unit/mdc-ripple/mdc-ripple.test.js b/test/unit/mdc-ripple/mdc-ripple.test.js index dd86a410460..73b05e3e9d2 100644 --- a/test/unit/mdc-ripple/mdc-ripple.test.js +++ b/test/unit/mdc-ripple/mdc-ripple.test.js @@ -48,6 +48,12 @@ test('attachTo makes ripple unbounded when given as an option', () => { test('attachTo does not override unbounded data attr when omitted', () => { const root = bel`
      `; const component = MDCRipple.attachTo(root); + if (!component.root_.dataset.mdcRippleIsUnbounded) { + const json = JSON.stringify(component.root_.dataset, null, 2); + const html = component.root_.outerHTML; + const message = `Error: dataset.mdcRippleIsUnbounded is not set!\n\n${json}\n\n${html}`; + throw new Error(message); + } assert.isOk(component.unbounded); }); From 9ecd5a8110f965e7d16c15a7ccd71f7cde9e3533 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 24 Aug 2018 20:20:41 -0700 Subject: [PATCH 037/219] WIP: Debug --- test/unit/mdc-ripple/mdc-ripple.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/mdc-ripple/mdc-ripple.test.js b/test/unit/mdc-ripple/mdc-ripple.test.js index 73b05e3e9d2..7dca71d185c 100644 --- a/test/unit/mdc-ripple/mdc-ripple.test.js +++ b/test/unit/mdc-ripple/mdc-ripple.test.js @@ -48,10 +48,10 @@ test('attachTo makes ripple unbounded when given as an option', () => { test('attachTo does not override unbounded data attr when omitted', () => { const root = bel`
      `; const component = MDCRipple.attachTo(root); - if (!component.root_.dataset.mdcRippleIsUnbounded) { + if (!component.unbounded) { const json = JSON.stringify(component.root_.dataset, null, 2); const html = component.root_.outerHTML; - const message = `Error: dataset.mdcRippleIsUnbounded is not set!\n\n${json}\n\n${html}`; + const message = `Error: component.unbounded is falsy!\n\n${json}\n\n${html}`; throw new Error(message); } assert.isOk(component.unbounded); From d73bb85d6cafc0e372b3232d86c6bb4cf8be9bbf Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 24 Aug 2018 21:38:23 -0700 Subject: [PATCH 038/219] WIP: Update `karma.conf.js` from iOS 10 to iOS 11 --- karma.conf.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/karma.conf.js b/karma.conf.js index 512e8d14e6b..d4e64934c76 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -128,7 +128,7 @@ const SAUCE_LAUNCHERS = { 'sl-ios-safari-latest': { base: 'SauceLabs', deviceName: 'iPhone Simulator', - platformVersion: '10.0', + platformVersion: '11.0', platformName: 'iOS', browserName: 'Safari', }, From cfc3527ae42c965615f74d558f8b2aa1528c01e9 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 24 Aug 2018 22:13:56 -0700 Subject: [PATCH 039/219] WIP: Debugging --- packages/mdc-ripple/index.js | 8 ++++++++ test/unit/mdc-ripple/mdc-ripple.test.js | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/mdc-ripple/index.js b/packages/mdc-ripple/index.js index a12ad0889f4..31241577a8a 100644 --- a/packages/mdc-ripple/index.js +++ b/packages/mdc-ripple/index.js @@ -130,7 +130,15 @@ class MDCRipple extends MDCComponent { /** @override */ initialSyncWithDOM() { + const isMobile = navigator.userAgent.indexOf('Mobile/') > -1; + const isSafari = navigator.userAgent.indexOf('Safari/') > -1; this.unbounded = 'mdcRippleIsUnbounded' in this.root_.dataset; + if (this.root_.id === 'foo' && isMobile && isSafari && !this.unbounded) { + const json = JSON.stringify(this.root_.dataset, null, 2); + const html = this.root_.outerHTML; + const message = `Error: this.unbounded is falsy!\n\n${json}\n\n${html}`; + throw new Error(message); + } } } diff --git a/test/unit/mdc-ripple/mdc-ripple.test.js b/test/unit/mdc-ripple/mdc-ripple.test.js index 7dca71d185c..9aad111c88d 100644 --- a/test/unit/mdc-ripple/mdc-ripple.test.js +++ b/test/unit/mdc-ripple/mdc-ripple.test.js @@ -46,7 +46,7 @@ test('attachTo makes ripple unbounded when given as an option', () => { }); test('attachTo does not override unbounded data attr when omitted', () => { - const root = bel`
      `; + const root = bel`
      `; const component = MDCRipple.attachTo(root); if (!component.unbounded) { const json = JSON.stringify(component.root_.dataset, null, 2); From c687b6b1532e525e015014a9b503194e79c1f858 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Mon, 27 Aug 2018 13:11:51 -0700 Subject: [PATCH 040/219] WIP: Refactor `feature-detection.js` from a class to a module and add unit tests --- packages/mdc-base/feature-detection.js | 121 +++++++++++++++++++ packages/mdc-base/feature-detector.js | 107 ---------------- packages/mdc-base/index.js | 3 +- packages/mdc-base/ponyfill.js | 2 +- packages/mdc-dialog/index.js | 8 +- test/unit/mdc-base/feature-detection.test.js | 64 ++++++++++ test/unit/mdc-base/ponyfill.test.js | 39 ++++++ 7 files changed, 230 insertions(+), 114 deletions(-) create mode 100644 packages/mdc-base/feature-detection.js delete mode 100644 packages/mdc-base/feature-detector.js create mode 100644 test/unit/mdc-base/feature-detection.test.js create mode 100644 test/unit/mdc-base/ponyfill.test.js diff --git a/packages/mdc-base/feature-detection.js b/packages/mdc-base/feature-detection.js new file mode 100644 index 00000000000..760da4ea1f6 --- /dev/null +++ b/packages/mdc-base/feature-detection.js @@ -0,0 +1,121 @@ +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** @type {boolean|undefined} */ +let hasFlexItemMaxHeightBug_; + +/** + * IE 11 flexbox bug. `overflow: auto` is ignored on child flex items when their height exceeds the `max-height` of + * their parent flex container. The child ends up overflowing the parent instead of respecting `max-height`. + * + * Example: https://user-images.githubusercontent.com/409245/44505719-c27ae680-a657-11e8-9a10-509f7131036d.png + * + * I have yet to find any combination of CSS properties that can convince IE 💩 to render the child correctly. + * Resizing the browser window seems to "fix" the glitch, however, so JS might be a viable "plan B". + * + * The most effective workaround I've found is to force IE to recalculate the child's height. + * To do that, you can toggle one of the following CSS property values on the child element: + * - `height: auto` to "" (empty string). + * - `flex-basis: auto` to "" (empty string). + * - `max-height: none` to "" (empty string). + * + * NOTE: The second value MUST be set inside a `requestAnimationFrame()` or it will not work. E.g.: + * + * ```js + * childFlexItem.style.flexBasis = 'auto'; + * requestAnimationFrame(() => { + * childFlexItem.style.flexBasis = ''; + * }); + * ``` + * + * For whatever reason, IE seems to render correctly after that. + * + * See https://github.com/philipwalton/flexbugs/issues/216 for more information. + * + * @return {boolean} + */ +function hasFlexItemMaxHeightBug() { + if (typeof hasFlexItemMaxHeightBug_ === 'undefined') { + hasFlexItemMaxHeightBug_ = ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_(); + } + return hasFlexItemMaxHeightBug_; +} + +/** + * @param {!HTMLElement} element + */ +function fixFlexItemMaxHeightBug(element) { + if (!hasFlexItemMaxHeightBug()) { + return; + } + + const oldValue = element.style.flexBasis; + element.style.flexBasis = oldValue === 'auto' ? '' : 'auto'; + requestAnimationFrame(() => { + element.style.flexBasis = oldValue; + }); +} + +/** + * @return {boolean} + * @private + */ +function ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_() { + const tempEl = document.createElement('div'); + + // The 1px borders are necessary to force IE to calculate box sizing correctly. + tempEl.innerHTML = ` +
      +
      Header
      +
      + 1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +
      +
      Footer
      +
      +`; + + document.body.appendChild(tempEl); + + const flexItemEl = tempEl.querySelector('article'); + const isScrollable = flexItemEl.scrollHeight > flexItemEl.offsetHeight; + + document.body.removeChild(tempEl); + + return !isScrollable; +} + +export { + hasFlexItemMaxHeightBug, + fixFlexItemMaxHeightBug, +}; diff --git a/packages/mdc-base/feature-detector.js b/packages/mdc-base/feature-detector.js deleted file mode 100644 index 3ce3a16338d..00000000000 --- a/packages/mdc-base/feature-detector.js +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2018 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -class MDCFeatureDetector { - constructor() { - /** - * IE 11 flexbox bug. `overflow: auto` is ignored on child flex items when their height exceeds the `max-height` of - * their parent flex container. The child ends up overflowing the parent instead of respecting `max-height`. - * - * Example: https://user-images.githubusercontent.com/409245/44505719-c27ae680-a657-11e8-9a10-509f7131036d.png - * - * I have yet to find any combination of CSS properties that can convince IE 💩 to render the child correctly. - * Resizing the browser window seems to "fix" the glitch, however, so JS might be a viable "plan B". - * - * The most effective workaround I've found is to force IE to recalculate the child's height. - * To do that, you can toggle one of the following CSS property values on the child element: - * - `height: auto` to "" (empty string). - * - `flex-basis: auto` to "" (empty string). - * - `max-height: none` to "" (empty string). - * - * NOTE: The second value MUST be set inside a `requestAnimationFrame()` or it will not work. E.g.: - * - * ```js - * childFlexItem.style.flexBasis = 'auto'; - * requestAnimationFrame(() => { - * childFlexItem.style.flexBasis = ''; - * }); - * ``` - * - * For whatever reason, IE seems to render correctly after that. - * - * See https://github.com/philipwalton/flexbugs/issues/216 for more information. - * - * @type {boolean} - */ - this.hasFlexItemMaxHeightBug = this.ignoresOverflowAutoOnChildFlexItemsThatExceedMaxHeight_(); - } - - /** - * @param {!HTMLElement} element - */ - fixFlexItemMaxHeightBug(element) { - if (!this.hasFlexItemMaxHeightBug) { - return; - } - - const oldValue = element.style.flexBasis; - element.style.flexBasis = oldValue === 'auto' ? '' : 'auto'; - requestAnimationFrame(() => { - element.style.flexBasis = oldValue; - }); - } - - /** - * @return {boolean} - * @private - */ - ignoresOverflowAutoOnChildFlexItemsThatExceedMaxHeight_() { - const tempEl = document.createElement('div'); - - // The 1px border is necessary to force IE to calculate box sizing correctly. - tempEl.innerHTML = ` -
      -
      Foo
      -
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      -
      -
      Bar
      -
      -`; - - document.body.appendChild(tempEl); - - const flexItemEl = tempEl.querySelector('article'); - const isScrollable = flexItemEl.scrollHeight > flexItemEl.offsetHeight; - - document.body.removeChild(tempEl); - - return !isScrollable; - } -} - -export default MDCFeatureDetector; diff --git a/packages/mdc-base/index.js b/packages/mdc-base/index.js index 546b5c61916..1fc2335d276 100644 --- a/packages/mdc-base/index.js +++ b/packages/mdc-base/index.js @@ -22,7 +22,6 @@ */ import MDCComponent from './component'; -import MDCFeatureDetector from './feature-detector'; import MDCFoundation from './foundation'; -export {MDCComponent, MDCFeatureDetector, MDCFoundation}; +export {MDCComponent, MDCFoundation}; diff --git a/packages/mdc-base/ponyfill.js b/packages/mdc-base/ponyfill.js index 89856eeb170..5e102dcf2d0 100644 --- a/packages/mdc-base/ponyfill.js +++ b/packages/mdc-base/ponyfill.js @@ -1,6 +1,6 @@ /** * @license - * Copyright 2017 Google Inc. + * Copyright 2018 Google Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index b2358985a8f..7e986fd1317 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -21,9 +21,10 @@ * THE SOFTWARE. */ -import {MDCComponent, MDCFeatureDetector} from '@material/base/index'; +import {MDCComponent} from '@material/base/index'; import {MDCRipple} from '@material/ripple/index'; import {matches} from '@material/base/ponyfill'; +import {hasFlexItemMaxHeightBug, fixFlexItemMaxHeightBug} from '@material/base/feature-detection'; import MDCDialogFoundation from './foundation'; import * as util from './util'; @@ -45,7 +46,6 @@ export class MDCDialog extends MDCComponent { } initialize() { - this.featureDetector_ = new MDCFeatureDetector(); this.focusTrap_ = util.createFocusTrapInstance(this.dialogSurface_); this.footerBtnRipples_ = []; @@ -88,7 +88,7 @@ export class MDCDialog extends MDCComponent { * @private */ detectScrollableContent_(bypassRAF = false) { - if (this.featureDetector_.hasFlexItemMaxHeightBug && !bypassRAF) { + if (hasFlexItemMaxHeightBug() && !bypassRAF) { // RAF causes a bit of jank, but it's necessary to force IE to render correctly. requestAnimationFrame(() => { this.fixContentOverflow_(); @@ -109,7 +109,7 @@ export class MDCDialog extends MDCComponent { fixContentOverflow_() { const bodyEl = this.root_.querySelector('.mdc-dialog__content'); if (bodyEl) { - this.featureDetector_.fixFlexItemMaxHeightBug(bodyEl); + fixFlexItemMaxHeightBug(bodyEl); } } diff --git a/test/unit/mdc-base/feature-detection.test.js b/test/unit/mdc-base/feature-detection.test.js new file mode 100644 index 00000000000..d657de1e7de --- /dev/null +++ b/test/unit/mdc-base/feature-detection.test.js @@ -0,0 +1,64 @@ +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +import {assert} from 'chai'; +import bel from 'bel'; + +import {fixFlexItemMaxHeightBug} from '../../../packages/mdc-base/feature-detection'; + +suite('MDCBase - feature-detection'); + +test('#fixFlexItemMaxHeightBug recalculates overflow and enables scrolling', function(done) { + // The 1px borders are necessary to force IE to calculate box sizing correctly. + const fixture = bel` +
      +
      Header
      +
      + 1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +
      +
      Footer
      +
      +`; + + document.body.appendChild(fixture); + + const flexItemEl = fixture.querySelector('article'); + fixFlexItemMaxHeightBug(flexItemEl); + + requestAnimationFrame(() => { + assert.isAbove(flexItemEl.scrollHeight, flexItemEl.offsetHeight); + document.body.removeChild(fixture); + done(); + }); +}); diff --git a/test/unit/mdc-base/ponyfill.test.js b/test/unit/mdc-base/ponyfill.test.js new file mode 100644 index 00000000000..86609049d82 --- /dev/null +++ b/test/unit/mdc-base/ponyfill.test.js @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +import {assert} from 'chai'; +import bel from 'bel'; + +import {matches} from '../../../packages/mdc-base/ponyfill'; + +suite('MDCBase - ponyfill'); + +test('#matches returns true when the selector matches the element', () => { + const element = bel`
      `; + assert.isTrue(matches(element, '.foo')); +}); + +test('#matches returns false when the selector does not match the element', () => { + const element = bel`
      `; + assert.isFalse(matches(element, '.bar')); +}); From 0b310f7b2da093bc971e7c34d7cd97c646a59d71 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Mon, 27 Aug 2018 13:16:06 -0700 Subject: [PATCH 041/219] chore(base): Add ponyfills and feature detection --- packages/mdc-base/feature-detection.js | 121 +++++++++++++++++++ packages/mdc-base/ponyfill.js | 43 +++++++ test/unit/mdc-base/feature-detection.test.js | 64 ++++++++++ test/unit/mdc-base/ponyfill.test.js | 39 ++++++ 4 files changed, 267 insertions(+) create mode 100644 packages/mdc-base/feature-detection.js create mode 100644 packages/mdc-base/ponyfill.js create mode 100644 test/unit/mdc-base/feature-detection.test.js create mode 100644 test/unit/mdc-base/ponyfill.test.js diff --git a/packages/mdc-base/feature-detection.js b/packages/mdc-base/feature-detection.js new file mode 100644 index 00000000000..760da4ea1f6 --- /dev/null +++ b/packages/mdc-base/feature-detection.js @@ -0,0 +1,121 @@ +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** @type {boolean|undefined} */ +let hasFlexItemMaxHeightBug_; + +/** + * IE 11 flexbox bug. `overflow: auto` is ignored on child flex items when their height exceeds the `max-height` of + * their parent flex container. The child ends up overflowing the parent instead of respecting `max-height`. + * + * Example: https://user-images.githubusercontent.com/409245/44505719-c27ae680-a657-11e8-9a10-509f7131036d.png + * + * I have yet to find any combination of CSS properties that can convince IE 💩 to render the child correctly. + * Resizing the browser window seems to "fix" the glitch, however, so JS might be a viable "plan B". + * + * The most effective workaround I've found is to force IE to recalculate the child's height. + * To do that, you can toggle one of the following CSS property values on the child element: + * - `height: auto` to "" (empty string). + * - `flex-basis: auto` to "" (empty string). + * - `max-height: none` to "" (empty string). + * + * NOTE: The second value MUST be set inside a `requestAnimationFrame()` or it will not work. E.g.: + * + * ```js + * childFlexItem.style.flexBasis = 'auto'; + * requestAnimationFrame(() => { + * childFlexItem.style.flexBasis = ''; + * }); + * ``` + * + * For whatever reason, IE seems to render correctly after that. + * + * See https://github.com/philipwalton/flexbugs/issues/216 for more information. + * + * @return {boolean} + */ +function hasFlexItemMaxHeightBug() { + if (typeof hasFlexItemMaxHeightBug_ === 'undefined') { + hasFlexItemMaxHeightBug_ = ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_(); + } + return hasFlexItemMaxHeightBug_; +} + +/** + * @param {!HTMLElement} element + */ +function fixFlexItemMaxHeightBug(element) { + if (!hasFlexItemMaxHeightBug()) { + return; + } + + const oldValue = element.style.flexBasis; + element.style.flexBasis = oldValue === 'auto' ? '' : 'auto'; + requestAnimationFrame(() => { + element.style.flexBasis = oldValue; + }); +} + +/** + * @return {boolean} + * @private + */ +function ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_() { + const tempEl = document.createElement('div'); + + // The 1px borders are necessary to force IE to calculate box sizing correctly. + tempEl.innerHTML = ` +
      +
      Header
      +
      + 1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +
      +
      Footer
      +
      +`; + + document.body.appendChild(tempEl); + + const flexItemEl = tempEl.querySelector('article'); + const isScrollable = flexItemEl.scrollHeight > flexItemEl.offsetHeight; + + document.body.removeChild(tempEl); + + return !isScrollable; +} + +export { + hasFlexItemMaxHeightBug, + fixFlexItemMaxHeightBug, +}; diff --git a/packages/mdc-base/ponyfill.js b/packages/mdc-base/ponyfill.js new file mode 100644 index 00000000000..5e102dcf2d0 --- /dev/null +++ b/packages/mdc-base/ponyfill.js @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @fileoverview A "ponyfill" is a polyfill that doesn't modify the global prototype chain. + * This makes ponyfills safer than traditional polyfills, especially for libraries like MDC. + */ + +/** + * @param {!Element} elem + * @param {string} selector + * @return {boolean} + */ +function matches(elem, selector) { + const nativeMatches = elem.matches + || elem.webkitMatchesSelector + || elem.mozMatchesSelector + || elem.msMatchesSelector + || elem.oMatchesSelector; + return nativeMatches.call(elem, selector); +} + +export {matches}; diff --git a/test/unit/mdc-base/feature-detection.test.js b/test/unit/mdc-base/feature-detection.test.js new file mode 100644 index 00000000000..d657de1e7de --- /dev/null +++ b/test/unit/mdc-base/feature-detection.test.js @@ -0,0 +1,64 @@ +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +import {assert} from 'chai'; +import bel from 'bel'; + +import {fixFlexItemMaxHeightBug} from '../../../packages/mdc-base/feature-detection'; + +suite('MDCBase - feature-detection'); + +test('#fixFlexItemMaxHeightBug recalculates overflow and enables scrolling', function(done) { + // The 1px borders are necessary to force IE to calculate box sizing correctly. + const fixture = bel` +
      +
      Header
      +
      + 1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +
      +
      Footer
      +
      +`; + + document.body.appendChild(fixture); + + const flexItemEl = fixture.querySelector('article'); + fixFlexItemMaxHeightBug(flexItemEl); + + requestAnimationFrame(() => { + assert.isAbove(flexItemEl.scrollHeight, flexItemEl.offsetHeight); + document.body.removeChild(fixture); + done(); + }); +}); diff --git a/test/unit/mdc-base/ponyfill.test.js b/test/unit/mdc-base/ponyfill.test.js new file mode 100644 index 00000000000..86609049d82 --- /dev/null +++ b/test/unit/mdc-base/ponyfill.test.js @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +import {assert} from 'chai'; +import bel from 'bel'; + +import {matches} from '../../../packages/mdc-base/ponyfill'; + +suite('MDCBase - ponyfill'); + +test('#matches returns true when the selector matches the element', () => { + const element = bel`
      `; + assert.isTrue(matches(element, '.foo')); +}); + +test('#matches returns false when the selector does not match the element', () => { + const element = bel`
      `; + assert.isFalse(matches(element, '.bar')); +}); From 80546dc4b713d0d05f81246e790604e3bfb18b8b Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Mon, 27 Aug 2018 22:23:15 -0700 Subject: [PATCH 042/219] WIP: Make unit tests pass --- packages/mdc-base/feature-detection.js | 121 ---------------- packages/mdc-base/support.js | 135 ++++++++++++++++++ test/unit/mdc-base/ponyfill.test.js | 8 ++ ...ture-detection.test.js => support.test.js} | 53 +++++-- 4 files changed, 188 insertions(+), 129 deletions(-) delete mode 100644 packages/mdc-base/feature-detection.js create mode 100644 packages/mdc-base/support.js rename test/unit/mdc-base/{feature-detection.test.js => support.test.js} (56%) diff --git a/packages/mdc-base/feature-detection.js b/packages/mdc-base/feature-detection.js deleted file mode 100644 index 760da4ea1f6..00000000000 --- a/packages/mdc-base/feature-detection.js +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @license - * Copyright 2018 Google Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/** @type {boolean|undefined} */ -let hasFlexItemMaxHeightBug_; - -/** - * IE 11 flexbox bug. `overflow: auto` is ignored on child flex items when their height exceeds the `max-height` of - * their parent flex container. The child ends up overflowing the parent instead of respecting `max-height`. - * - * Example: https://user-images.githubusercontent.com/409245/44505719-c27ae680-a657-11e8-9a10-509f7131036d.png - * - * I have yet to find any combination of CSS properties that can convince IE 💩 to render the child correctly. - * Resizing the browser window seems to "fix" the glitch, however, so JS might be a viable "plan B". - * - * The most effective workaround I've found is to force IE to recalculate the child's height. - * To do that, you can toggle one of the following CSS property values on the child element: - * - `height: auto` to "" (empty string). - * - `flex-basis: auto` to "" (empty string). - * - `max-height: none` to "" (empty string). - * - * NOTE: The second value MUST be set inside a `requestAnimationFrame()` or it will not work. E.g.: - * - * ```js - * childFlexItem.style.flexBasis = 'auto'; - * requestAnimationFrame(() => { - * childFlexItem.style.flexBasis = ''; - * }); - * ``` - * - * For whatever reason, IE seems to render correctly after that. - * - * See https://github.com/philipwalton/flexbugs/issues/216 for more information. - * - * @return {boolean} - */ -function hasFlexItemMaxHeightBug() { - if (typeof hasFlexItemMaxHeightBug_ === 'undefined') { - hasFlexItemMaxHeightBug_ = ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_(); - } - return hasFlexItemMaxHeightBug_; -} - -/** - * @param {!HTMLElement} element - */ -function fixFlexItemMaxHeightBug(element) { - if (!hasFlexItemMaxHeightBug()) { - return; - } - - const oldValue = element.style.flexBasis; - element.style.flexBasis = oldValue === 'auto' ? '' : 'auto'; - requestAnimationFrame(() => { - element.style.flexBasis = oldValue; - }); -} - -/** - * @return {boolean} - * @private - */ -function ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_() { - const tempEl = document.createElement('div'); - - // The 1px borders are necessary to force IE to calculate box sizing correctly. - tempEl.innerHTML = ` -
      -
      Header
      -
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      -
      -
      Footer
      -
      -`; - - document.body.appendChild(tempEl); - - const flexItemEl = tempEl.querySelector('article'); - const isScrollable = flexItemEl.scrollHeight > flexItemEl.offsetHeight; - - document.body.removeChild(tempEl); - - return !isScrollable; -} - -export { - hasFlexItemMaxHeightBug, - fixFlexItemMaxHeightBug, -}; diff --git a/packages/mdc-base/support.js b/packages/mdc-base/support.js new file mode 100644 index 00000000000..8b2018a0d07 --- /dev/null +++ b/packages/mdc-base/support.js @@ -0,0 +1,135 @@ +/** + * @license + * Copyright 2018 Google Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +class MDCSupport { + constructor() { + /** + * @type {boolean|undefined} + * @private + */ + this.hasFlexItemMaxHeightBug_; + } + + /** + * IE 11 flexbox bug. `overflow: auto` is ignored on child flex items when their height exceeds the `max-height` of + * their parent flex container. The child ends up overflowing the parent instead of respecting `max-height`. + * + * Example: https://user-images.githubusercontent.com/409245/44505719-c27ae680-a657-11e8-9a10-509f7131036d.png + * + * I have yet to find any combination of CSS properties that can convince IE 💩 to render the child correctly. + * Resizing the browser window seems to "fix" the glitch, however, so JS might be a viable "plan B". + * + * The most effective workaround I've found is to force IE to recalculate the child's height. + * To do that, you can toggle one of the following CSS property values on the child element: + * - `height: auto` to "" (empty string). + * - `flex-basis: auto` to "" (empty string). + * - `max-height: none` to "" (empty string). + * + * NOTE: The second value MUST be set inside a `requestAnimationFrame()` or it will not work. E.g.: + * + * ```js + * childFlexItem.style.flexBasis = 'auto'; + * requestAnimationFrame(() => { + * childFlexItem.style.flexBasis = ''; + * }); + * ``` + * + * For whatever reason, IE seems to render correctly after that. + * + * See https://github.com/philipwalton/flexbugs/issues/216 for more information. + * + * @return {boolean} + */ + get hasFlexItemMaxHeightBug() { + if (typeof this.hasFlexItemMaxHeightBug_ === 'undefined') { + this.hasFlexItemMaxHeightBug_ = this.detectFlexItemMaxHeightBug_(); + } + return this.hasFlexItemMaxHeightBug_; + } + + /** + * {@see hasFlexItemMaxHeightBug} for more information. + * @param {!HTMLElement} element + */ + fixFlexItemMaxHeightBug(element) { + if (!this.hasFlexItemMaxHeightBug) { + return; + } + const oldValue = element.style.flexBasis; + element.style.flexBasis = oldValue === 'auto' ? '' : 'auto'; + requestAnimationFrame(() => { + element.style.flexBasis = oldValue; + }); + } + + /** + * {@see hasFlexItemMaxHeightBug} for more information. + * @return {boolean} + * @private + */ + detectFlexItemMaxHeightBug_() { + /** @type {!HTMLElement} */ + const tempEl = document.createElement('div'); + + // The 1px borders are necessary to force IE to calculate box sizing correctly. + tempEl.innerHTML = ` +
      +
      Header
      +
      + 1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +
      +
      Footer
      +
      +`; + + document.body.appendChild(tempEl); + + const flexItemEl = tempEl.querySelector('article'); + const isScrollable = this.isScrollable(flexItemEl); + + document.body.removeChild(tempEl); + + return !isScrollable; + } + + /** + * @param {!HTMLElement} element + * @return {boolean} + */ + isScrollable(element) { + return element.scrollHeight > element.offsetHeight; + } +} + +export {MDCSupport}; diff --git a/test/unit/mdc-base/ponyfill.test.js b/test/unit/mdc-base/ponyfill.test.js index 86609049d82..c1eae5db2ed 100644 --- a/test/unit/mdc-base/ponyfill.test.js +++ b/test/unit/mdc-base/ponyfill.test.js @@ -37,3 +37,11 @@ test('#matches returns false when the selector does not match the element', () = const element = bel`
      `; assert.isFalse(matches(element, '.bar')); }); + +test('#matches supports vendor prefixes', () => { + assert.isTrue(matches({matches: () => true}, '')); + assert.isTrue(matches({webkitMatchesSelector: () => true}, '')); + assert.isTrue(matches({mozMatchesSelector: () => true}, '')); + assert.isTrue(matches({msMatchesSelector: () => true}, '')); + assert.isTrue(matches({oMatchesSelector: () => true}, '')); +}); diff --git a/test/unit/mdc-base/feature-detection.test.js b/test/unit/mdc-base/support.test.js similarity index 56% rename from test/unit/mdc-base/feature-detection.test.js rename to test/unit/mdc-base/support.test.js index d657de1e7de..ae1284b7326 100644 --- a/test/unit/mdc-base/feature-detection.test.js +++ b/test/unit/mdc-base/support.test.js @@ -23,14 +23,21 @@ import {assert} from 'chai'; import bel from 'bel'; +import td from 'testdouble'; -import {fixFlexItemMaxHeightBug} from '../../../packages/mdc-base/feature-detection'; +import {MDCSupport} from '../../../packages/mdc-base/support'; -suite('MDCBase - feature-detection'); +suite('MDCBase - support'); -test('#fixFlexItemMaxHeightBug recalculates overflow and enables scrolling', function(done) { +function setupTest() { + const support = new MDCSupport(); + return {support}; +} + +/** @return {!HTMLElement} */ +function createFlexItemMaxHeightBugFixture() { // The 1px borders are necessary to force IE to calculate box sizing correctly. - const fixture = bel` + const element = bel`
      @@ -50,15 +57,45 @@ test('#fixFlexItemMaxHeightBug recalculates overflow and enables scrolling', fun
      Footer
      `; + document.body.appendChild(element); + return element; +} + +/** @param {!HTMLElement} element */ +function destroyFlexItemMaxHeightBugFixture(element) { + document.body.removeChild(element); +} + +test('#hasFlexItemMaxHeightBug returns false when flex item is scrollable.', function() { + const {support} = setupTest(); + + support.isScrollable = td.func('isScrollable'); + td.when(support.isScrollable(td.matchers.anything())).thenReturn(true); + + assert.isFalse(support.hasFlexItemMaxHeightBug); +}); + +test('#hasFlexItemMaxHeightBug returns true when flex item is not scrollable.', function() { + const {support} = setupTest(); + + support.isScrollable = td.func('isScrollable'); + td.when(support.isScrollable(td.matchers.anything())).thenReturn(false); + + assert.isTrue(support.hasFlexItemMaxHeightBug); +}); + +test('#fixFlexItemMaxHeightBug makes child flex item scrollable', function(done) { + const {support} = setupTest(); - document.body.appendChild(fixture); + const flexContainerEl = createFlexItemMaxHeightBugFixture(); + const flexItemEl = flexContainerEl.querySelector('article'); - const flexItemEl = fixture.querySelector('article'); - fixFlexItemMaxHeightBug(flexItemEl); + support.fixFlexItemMaxHeightBug(flexItemEl); requestAnimationFrame(() => { + // If the fix worked, the height of the scrollable area should be greater than the element's bounding box height. assert.isAbove(flexItemEl.scrollHeight, flexItemEl.offsetHeight); - document.body.removeChild(fixture); + destroyFlexItemMaxHeightBugFixture(flexContainerEl); done(); }); }); From ac395de0e1bf706b640777fa568de05c2c45a43a Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Mon, 27 Aug 2018 22:24:38 -0700 Subject: [PATCH 043/219] WIP: Fix failing unit tests --- packages/mdc-dialog/constants.js | 2 +- packages/mdc-dialog/index.js | 40 ++++++++++++++++++++----- test/unit/mdc-dialog/mdc-dialog.test.js | 38 +++++++++++++++-------- 3 files changed, 59 insertions(+), 21 deletions(-) diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index 3380bca4473..148456abc2f 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -31,7 +31,7 @@ const cssClasses = { const strings = { OPEN_DIALOG_SELECTOR: '.mdc-dialog--open', - DIALOG_SURFACE_SELECTOR: '.mdc-dialog__container', + DIALOG_CONTAINER_SELECTOR: '.mdc-dialog__container', YES_BTN_SELECTOR: '[data-mdc-dialog-action="yes"]', NO_BTN_SELECTOR: '[data-mdc-dialog-action="no"]', diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 7e986fd1317..c7655bdb8e1 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -24,7 +24,7 @@ import {MDCComponent} from '@material/base/index'; import {MDCRipple} from '@material/ripple/index'; import {matches} from '@material/base/ponyfill'; -import {hasFlexItemMaxHeightBug, fixFlexItemMaxHeightBug} from '@material/base/feature-detection'; +import {MDCSupport} from '@material/base/support'; import MDCDialogFoundation from './foundation'; import * as util from './util'; @@ -33,6 +33,28 @@ export {MDCDialogFoundation}; export {util}; export class MDCDialog extends MDCComponent { + constructor(...args) { + super(...args); + + /** + * @type {!MDCSupport} + * @private + */ + this.support_; + + /** + * @type {!focusTrap} + * @private + */ + this.focusTrap_; + + /** + * @type {!Array} + * @private + */ + this.footerBtnRipples_; + } + static attachTo(root) { return new MDCDialog(root); } @@ -42,11 +64,15 @@ export class MDCDialog extends MDCComponent { } get dialogSurface_() { - return this.root_.querySelector(MDCDialogFoundation.strings.DIALOG_SURFACE_SELECTOR); + return this.root_.querySelector(MDCDialogFoundation.strings.DIALOG_CONTAINER_SELECTOR); } - initialize() { - this.focusTrap_ = util.createFocusTrapInstance(this.dialogSurface_); + initialize({ + supportFactory = () => new MDCSupport(), + focusTrapFactory = undefined, + } = {}) { + this.support_ = supportFactory(); + this.focusTrap_ = util.createFocusTrapInstance(this.dialogSurface_, undefined, focusTrapFactory); this.footerBtnRipples_ = []; const footerBtns = this.root_.querySelectorAll('.mdc-dialog__button'); @@ -88,7 +114,7 @@ export class MDCDialog extends MDCComponent { * @private */ detectScrollableContent_(bypassRAF = false) { - if (hasFlexItemMaxHeightBug() && !bypassRAF) { + if (this.support_.hasFlexItemMaxHeightBug && !bypassRAF) { // RAF causes a bit of jank, but it's necessary to force IE to render correctly. requestAnimationFrame(() => { this.fixContentOverflow_(); @@ -108,8 +134,8 @@ export class MDCDialog extends MDCComponent { /** @private */ fixContentOverflow_() { const bodyEl = this.root_.querySelector('.mdc-dialog__content'); - if (bodyEl) { - fixFlexItemMaxHeightBug(bodyEl); + if (this.support_.hasFlexItemMaxHeightBug && bodyEl) { + this.support_.fixFlexItemMaxHeightBug(bodyEl); } } diff --git a/test/unit/mdc-dialog/mdc-dialog.test.js b/test/unit/mdc-dialog/mdc-dialog.test.js index afab4d613a2..6c48785197f 100644 --- a/test/unit/mdc-dialog/mdc-dialog.test.js +++ b/test/unit/mdc-dialog/mdc-dialog.test.js @@ -34,11 +34,12 @@ function getFixture() { return bel`
      - +
      `; } @@ -178,7 +179,7 @@ test('adapter#deregisterInteractionHandler removes an event listener from the ro test('adapter#registerSurfaceInteractionHandler adds an event listener to the root element', () => { const {root, component} = setupTest(); - const dialog = root.querySelector(strings.DIALOG_SURFACE_SELECTOR); + const dialog = root.querySelector(strings.DIALOG_CONTAINER_SELECTOR); const handler = td.func('eventHandler'); component.getDefaultFoundation().adapter_.registerSurfaceInteractionHandler('click', handler); @@ -189,7 +190,7 @@ test('adapter#registerSurfaceInteractionHandler adds an event listener to the ro test('adapter#deregisterSurfaceInteractionHandler removes an event listener from the root element', () => { const {root, component} = setupTest(); - const dialog = root.querySelector(strings.DIALOG_SURFACE_SELECTOR); + const dialog = root.querySelector(strings.DIALOG_CONTAINER_SELECTOR); const handler = td.func('eventHandler'); dialog.addEventListener('click', handler); @@ -273,14 +274,20 @@ test('adapter#trapFocusOnSurface calls activate() on a properly configured focus util.createFocusTrapInstance = td.func('util.createFocusTrapInstance'); const fakeFocusTrapInstance = td.object({ - activate: () => {}, - deactivate: () => {}, + activate: td.func('focusTrap#activate'), + deactivate: td.func('focusTrap#deactivate'), }); - td.when(util.createFocusTrapInstance(hasClassMatcher('mdc-dialog__container'))).thenReturn(fakeFocusTrapInstance); + td.when(util.createFocusTrapInstance( + hasClassMatcher('mdc-dialog__container'), + td.matchers.anything(), + td.matchers.anything() + )) + .thenReturn(fakeFocusTrapInstance); const {component} = setupTest(); component.getDefaultFoundation().adapter_.trapFocusOnSurface(); + util.createFocusTrapInstance = createFocusTrapInstance; td.verify(fakeFocusTrapInstance.activate()); @@ -295,7 +302,12 @@ test('adapter#untrapFocusOnSurface calls deactivate() on a properly configured f deactivate: () => {}, }); - td.when(util.createFocusTrapInstance(hasClassMatcher('mdc-dialog__container'))).thenReturn(fakeFocusTrapInstance); + td.when(util.createFocusTrapInstance( + hasClassMatcher('mdc-dialog__container'), + td.matchers.anything(), + td.matchers.anything() + )) + .thenReturn(fakeFocusTrapInstance); const {component} = setupTest(); component.getDefaultFoundation().adapter_.untrapFocusOnSurface(); @@ -306,7 +318,7 @@ test('adapter#untrapFocusOnSurface calls deactivate() on a properly configured f test('adapter#isDialog returns true for the dialog surface element', () => { const {root, component} = setupTest(); - const dialog = root.querySelector(strings.DIALOG_SURFACE_SELECTOR); + const dialog = root.querySelector(strings.DIALOG_CONTAINER_SELECTOR); assert.isOk(component.getDefaultFoundation().adapter_.isDialog(dialog)); }); From 25e407ef2bcb65670373a615308d643cbd601172 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Mon, 27 Aug 2018 23:07:45 -0700 Subject: [PATCH 044/219] WIP: Increase unit test coverage to 100% --- test/unit/mdc-base/support.test.js | 79 ++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/test/unit/mdc-base/support.test.js b/test/unit/mdc-base/support.test.js index ae1284b7326..7344219eb9f 100644 --- a/test/unit/mdc-base/support.test.js +++ b/test/unit/mdc-base/support.test.js @@ -25,6 +25,7 @@ import {assert} from 'chai'; import bel from 'bel'; import td from 'testdouble'; +import {createMockRaf} from '../helpers/raf'; import {MDCSupport} from '../../../packages/mdc-base/support'; suite('MDCBase - support'); @@ -81,15 +82,53 @@ test('#hasFlexItemMaxHeightBug returns true when flex item is not scrollable.', support.isScrollable = td.func('isScrollable'); td.when(support.isScrollable(td.matchers.anything())).thenReturn(false); + // Call the getter twice to make code coverage happy + assert.isTrue(support.hasFlexItemMaxHeightBug); assert.isTrue(support.hasFlexItemMaxHeightBug); }); +test('#isScrollable compares height properties', function() { + const {support} = setupTest(); + + assert.isTrue(support.isScrollable({scrollHeight: 2, offsetHeight: 1}), 'scrollHeight > offsetHeight'); + assert.isFalse(support.isScrollable({scrollHeight: 1, offsetHeight: 1}), 'scrollHeight === offsetHeight'); + assert.isFalse(support.isScrollable({scrollHeight: 1, offsetHeight: 2}), 'scrollHeight < offsetHeight'); +}); + +test('#fixFlexItemMaxHeightBug does nothing when bug is not present', function(done) { + const {support} = setupTest(); + + const flexContainerEl = createFlexItemMaxHeightBugFixture(); + const flexItemEl = flexContainerEl.querySelector('article'); + + const mockRaf = createMockRaf(); + + Object.defineProperty(support, 'hasFlexItemMaxHeightBug', { + get: () => false, + }); + + support.fixFlexItemMaxHeightBug(flexItemEl); + + mockRaf.flush(); + mockRaf.restore(); + + requestAnimationFrame(() => { + assert.equal(mockRaf.pendingFrames.length, 0); + destroyFlexItemMaxHeightBugFixture(flexContainerEl); + done(); + }); +}); + test('#fixFlexItemMaxHeightBug makes child flex item scrollable', function(done) { const {support} = setupTest(); const flexContainerEl = createFlexItemMaxHeightBugFixture(); const flexItemEl = flexContainerEl.querySelector('article'); + Object.defineProperty(support, 'hasFlexItemMaxHeightBug', { + get: () => true, + }); + support.fixFlexItemMaxHeightBug(flexItemEl); requestAnimationFrame(() => { @@ -99,3 +138,43 @@ test('#fixFlexItemMaxHeightBug makes child flex item scrollable', function(done) done(); }); }); + +test('#fixFlexItemMaxHeightBug restores flex-basis to its original value of ""', function(done) { + const {support} = setupTest(); + + const flexContainerEl = createFlexItemMaxHeightBugFixture(); + const flexItemEl = flexContainerEl.querySelector('article'); + flexItemEl.style.flexBasis = ''; + + Object.defineProperty(support, 'hasFlexItemMaxHeightBug', { + get: () => true, + }); + + support.fixFlexItemMaxHeightBug(flexItemEl); + + requestAnimationFrame(() => { + assert.equal(flexItemEl.style.flexBasis, ''); + destroyFlexItemMaxHeightBugFixture(flexContainerEl); + done(); + }); +}); + +test('#fixFlexItemMaxHeightBug restores flex-basis to its original value of "auto"', function(done) { + const {support} = setupTest(); + + const flexContainerEl = createFlexItemMaxHeightBugFixture(); + const flexItemEl = flexContainerEl.querySelector('article'); + flexItemEl.style.flexBasis = 'auto'; + + Object.defineProperty(support, 'hasFlexItemMaxHeightBug', { + get: () => true, + }); + + support.fixFlexItemMaxHeightBug(flexItemEl); + + requestAnimationFrame(() => { + assert.equal(flexItemEl.style.flexBasis, 'auto'); + destroyFlexItemMaxHeightBugFixture(flexContainerEl); + done(); + }); +}); From 332233397f4459d2feba2b96e73f499ba3e7c396 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 00:01:37 -0700 Subject: [PATCH 045/219] WIP: Delete old files --- packages/mdc-base/feature-detection.js | 121 ------------------- test/unit/mdc-base/feature-detection.test.js | 64 ---------- 2 files changed, 185 deletions(-) delete mode 100644 packages/mdc-base/feature-detection.js delete mode 100644 test/unit/mdc-base/feature-detection.test.js diff --git a/packages/mdc-base/feature-detection.js b/packages/mdc-base/feature-detection.js deleted file mode 100644 index 760da4ea1f6..00000000000 --- a/packages/mdc-base/feature-detection.js +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @license - * Copyright 2018 Google Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/** @type {boolean|undefined} */ -let hasFlexItemMaxHeightBug_; - -/** - * IE 11 flexbox bug. `overflow: auto` is ignored on child flex items when their height exceeds the `max-height` of - * their parent flex container. The child ends up overflowing the parent instead of respecting `max-height`. - * - * Example: https://user-images.githubusercontent.com/409245/44505719-c27ae680-a657-11e8-9a10-509f7131036d.png - * - * I have yet to find any combination of CSS properties that can convince IE 💩 to render the child correctly. - * Resizing the browser window seems to "fix" the glitch, however, so JS might be a viable "plan B". - * - * The most effective workaround I've found is to force IE to recalculate the child's height. - * To do that, you can toggle one of the following CSS property values on the child element: - * - `height: auto` to "" (empty string). - * - `flex-basis: auto` to "" (empty string). - * - `max-height: none` to "" (empty string). - * - * NOTE: The second value MUST be set inside a `requestAnimationFrame()` or it will not work. E.g.: - * - * ```js - * childFlexItem.style.flexBasis = 'auto'; - * requestAnimationFrame(() => { - * childFlexItem.style.flexBasis = ''; - * }); - * ``` - * - * For whatever reason, IE seems to render correctly after that. - * - * See https://github.com/philipwalton/flexbugs/issues/216 for more information. - * - * @return {boolean} - */ -function hasFlexItemMaxHeightBug() { - if (typeof hasFlexItemMaxHeightBug_ === 'undefined') { - hasFlexItemMaxHeightBug_ = ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_(); - } - return hasFlexItemMaxHeightBug_; -} - -/** - * @param {!HTMLElement} element - */ -function fixFlexItemMaxHeightBug(element) { - if (!hasFlexItemMaxHeightBug()) { - return; - } - - const oldValue = element.style.flexBasis; - element.style.flexBasis = oldValue === 'auto' ? '' : 'auto'; - requestAnimationFrame(() => { - element.style.flexBasis = oldValue; - }); -} - -/** - * @return {boolean} - * @private - */ -function ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_() { - const tempEl = document.createElement('div'); - - // The 1px borders are necessary to force IE to calculate box sizing correctly. - tempEl.innerHTML = ` -
      -
      Header
      -
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      -
      -
      Footer
      -
      -`; - - document.body.appendChild(tempEl); - - const flexItemEl = tempEl.querySelector('article'); - const isScrollable = flexItemEl.scrollHeight > flexItemEl.offsetHeight; - - document.body.removeChild(tempEl); - - return !isScrollable; -} - -export { - hasFlexItemMaxHeightBug, - fixFlexItemMaxHeightBug, -}; diff --git a/test/unit/mdc-base/feature-detection.test.js b/test/unit/mdc-base/feature-detection.test.js deleted file mode 100644 index d657de1e7de..00000000000 --- a/test/unit/mdc-base/feature-detection.test.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @license - * Copyright 2018 Google Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -import {assert} from 'chai'; -import bel from 'bel'; - -import {fixFlexItemMaxHeightBug} from '../../../packages/mdc-base/feature-detection'; - -suite('MDCBase - feature-detection'); - -test('#fixFlexItemMaxHeightBug recalculates overflow and enables scrolling', function(done) { - // The 1px borders are necessary to force IE to calculate box sizing correctly. - const fixture = bel` -
      -
      Header
      -
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      -
      -
      Footer
      -
      -`; - - document.body.appendChild(fixture); - - const flexItemEl = fixture.querySelector('article'); - fixFlexItemMaxHeightBug(flexItemEl); - - requestAnimationFrame(() => { - assert.isAbove(flexItemEl.scrollHeight, flexItemEl.offsetHeight); - document.body.removeChild(fixture); - done(); - }); -}); From f3ccc23e5fd42dd59c345fd1d9f1275a127ad902 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 00:02:03 -0700 Subject: [PATCH 046/219] WIP: Rename events --- packages/mdc-dialog/constants.js | 8 ++++---- packages/mdc-dialog/foundation.js | 16 ++++++++-------- packages/mdc-dialog/index.js | 8 ++++---- packages/mdc-dialog/util.js | 5 +---- test/screenshot/spec/mdc-dialog/fixture.js | 4 ++-- test/unit/mdc-dialog/foundation.test.js | 2 +- 6 files changed, 20 insertions(+), 23 deletions(-) diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index 148456abc2f..2f441006edb 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -41,10 +41,10 @@ const strings = { NO_EVENT: 'MDCDialog:no', CANCEL_EVENT: 'MDCDialog:cancel', - OPEN_START_EVENT: 'MDCDialog:openStart', - OPEN_END_EVENT: 'MDCDialog:openEnd', - CLOSE_START_EVENT: 'MDCDialog:closeStart', - CLOSE_END_EVENT: 'MDCDialog:closeEnd', + OPENING_EVENT: 'MDCDialog:opening', + OPENED_EVENT: 'MDCDialog:opened', + CLOSING_EVENT: 'MDCDialog:closing', + CLOSED_EVENT: 'MDCDialog:closed', }; const numbers = { diff --git a/packages/mdc-dialog/foundation.js b/packages/mdc-dialog/foundation.js index 4fe55be8840..df002e91423 100644 --- a/packages/mdc-dialog/foundation.js +++ b/packages/mdc-dialog/foundation.js @@ -54,10 +54,10 @@ export default class MDCDialogFoundation extends MDCFoundation { notifyYes: () => {}, notifyNo: () => {}, notifyCancel: () => {}, - notifyOpenStart: () => {}, - notifyOpenEnd: () => {}, - notifyCloseStart: () => {}, - notifyCloseEnd: () => {}, + notifyOpening: () => {}, + notifyOpened: () => {}, + notifyClosing: () => {}, + notifyClosed: () => {}, trapFocusOnSurface: () => {}, untrapFocusOnSurface: () => {}, isDialog: (/* el: Element */) => /* boolean */ false, @@ -100,12 +100,12 @@ export default class MDCDialogFoundation extends MDCFoundation { this.adapter_.registerInteractionHandler('click', this.componentClickHandler_); this.adapter_.addClass(MDCDialogFoundation.cssClasses.ANIMATING); this.adapter_.addClass(MDCDialogFoundation.cssClasses.OPEN); - this.adapter_.notifyOpenStart(); // TODO(acdvorak): Add a unit test for this + this.adapter_.notifyOpening(); // TODO(acdvorak): Add a unit test for this clearTimeout(this.timerId_); this.timerId_ = setTimeout(() => { this.handleAnimationTimerEnd_(); - this.adapter_.notifyOpenEnd(); // TODO(acdvorak): Add a unit test for this + this.adapter_.notifyOpened(); // TODO(acdvorak): Add a unit test for this }, MDCDialogFoundation.numbers.DIALOG_ANIMATION_TIME_MS); } @@ -118,12 +118,12 @@ export default class MDCDialogFoundation extends MDCFoundation { this.adapter_.untrapFocusOnSurface(); this.adapter_.addClass(MDCDialogFoundation.cssClasses.ANIMATING); this.adapter_.removeClass(MDCDialogFoundation.cssClasses.OPEN); - this.adapter_.notifyCloseStart(); // TODO(acdvorak): Add a unit test for this + this.adapter_.notifyClosing(); // TODO(acdvorak): Add a unit test for this clearTimeout(this.timerId_); this.timerId_ = setTimeout(() => { this.handleAnimationTimerEnd_(); - this.adapter_.notifyCloseEnd(); // TODO(acdvorak): Add a unit test for this + this.adapter_.notifyClosed(); // TODO(acdvorak): Add a unit test for this }, MDCDialogFoundation.numbers.DIALOG_ANIMATION_TIME_MS); } diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index c7655bdb8e1..19601e9acb2 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -160,10 +160,10 @@ export class MDCDialog extends MDCComponent { notifyYes: () => this.emit(MDCDialogFoundation.strings.YES_EVENT), notifyNo: () => this.emit(MDCDialogFoundation.strings.NO_EVENT), notifyCancel: () => this.emit(MDCDialogFoundation.strings.CANCEL_EVENT), - notifyOpenStart: () => this.emit(MDCDialogFoundation.strings.OPEN_START_EVENT), - notifyOpenEnd: () => this.emit(MDCDialogFoundation.strings.OPEN_END_EVENT), - notifyCloseStart: () => this.emit(MDCDialogFoundation.strings.CLOSE_START_EVENT), - notifyCloseEnd: () => this.emit(MDCDialogFoundation.strings.CLOSE_END_EVENT), + notifyOpening: () => this.emit(MDCDialogFoundation.strings.OPENING_EVENT), + notifyOpened: () => this.emit(MDCDialogFoundation.strings.OPENED_EVENT), + notifyClosing: () => this.emit(MDCDialogFoundation.strings.CLOSING_EVENT), + notifyClosed: () => this.emit(MDCDialogFoundation.strings.CLOSED_EVENT), trapFocusOnSurface: () => this.focusTrap_.activate(), untrapFocusOnSurface: () => this.focusTrap_.deactivate(), isDialog: (el) => el === this.dialogSurface_, diff --git a/packages/mdc-dialog/util.js b/packages/mdc-dialog/util.js index 2ef3538483f..8a66ea24f87 100644 --- a/packages/mdc-dialog/util.js +++ b/packages/mdc-dialog/util.js @@ -96,10 +96,7 @@ function getFirstFocusableElement(surfaceEl) { return true; }); - const autoFocusEls = focusableEls.filter((el) => { - return el.autofocus; - }); - + const autoFocusEls = focusableEls.filter((el) => el.autofocus); return autoFocusEls[0] || focusableEls[0]; } diff --git a/test/screenshot/spec/mdc-dialog/fixture.js b/test/screenshot/spec/mdc-dialog/fixture.js index fa947ad0a85..9a1e6fa441d 100644 --- a/test/screenshot/spec/mdc-dialog/fixture.js +++ b/test/screenshot/spec/mdc-dialog/fixture.js @@ -30,8 +30,8 @@ window.mdc.testFixture.fontsLoaded.then(() => { const eventNames = [ strings.YES_EVENT, strings.NO_EVENT, strings.CANCEL_EVENT, - strings.OPEN_START_EVENT, strings.OPEN_END_EVENT, - strings.CLOSE_START_EVENT, strings.CLOSE_END_EVENT, + strings.OPENING_EVENT, strings.OPENED_EVENT, + strings.CLOSING_EVENT, strings.CLOSED_EVENT, ]; eventNames.forEach((eventName) => { diff --git a/test/unit/mdc-dialog/foundation.test.js b/test/unit/mdc-dialog/foundation.test.js index bc3f714b2e8..ac1e778323b 100644 --- a/test/unit/mdc-dialog/foundation.test.js +++ b/test/unit/mdc-dialog/foundation.test.js @@ -52,7 +52,7 @@ test('default adapter returns a complete adapter implementation', () => { 'registerInteractionHandler', 'deregisterInteractionHandler', 'registerSurfaceInteractionHandler', 'deregisterSurfaceInteractionHandler', 'registerDocumentKeydownHandler', 'deregisterDocumentKeydownHandler', - 'notifyYes', 'notifyNo', 'notifyCancel', 'notifyOpenStart', 'notifyOpenEnd', 'notifyCloseStart', 'notifyCloseEnd', + 'notifyYes', 'notifyNo', 'notifyCancel', 'notifyOpening', 'notifyOpened', 'notifyClosing', 'notifyClosed', 'trapFocusOnSurface', 'untrapFocusOnSurface', 'isDialog', ]); }); From c869450100c24e9e1e7ecc8a8f066199fb0650c2 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 01:10:09 -0700 Subject: [PATCH 047/219] WIP: Refactor code into foundation/adapter pattern --- packages/mdc-base/support.js | 1 + packages/mdc-dialog/constants.js | 9 +- packages/mdc-dialog/foundation.js | 132 ++++++++++++++++++++---- packages/mdc-dialog/index.js | 88 ++++------------ test/unit/mdc-dialog/foundation.test.js | 4 +- test/unit/mdc-dialog/mdc-dialog.test.js | 18 +--- 6 files changed, 144 insertions(+), 108 deletions(-) diff --git a/packages/mdc-base/support.js b/packages/mdc-base/support.js index 8b2018a0d07..457e9fd7d4c 100644 --- a/packages/mdc-base/support.js +++ b/packages/mdc-base/support.js @@ -73,6 +73,7 @@ class MDCSupport { */ fixFlexItemMaxHeightBug(element) { if (!this.hasFlexItemMaxHeightBug) { + console.log('skipping fixFlexItemMaxHeightBug() because hasFlexItemMaxHeightBug is false'); return; } const oldValue = element.style.flexBasis; diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index 2f441006edb..7e18b262386 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -25,13 +25,18 @@ const cssClasses = { ROOT: 'mdc-dialog', OPEN: 'mdc-dialog--open', ANIMATING: 'mdc-dialog--animating', - BACKDROP: 'mdc-dialog__scrim', + STACKED: 'mdc-dialog--stacked', + SCROLLABLE: 'mdc-dialog--scrollable', + SCRIM: 'mdc-dialog__scrim', + CONTENT: 'mdc-dialog__content', SCROLL_LOCK: 'mdc-dialog-scroll-lock', }; const strings = { OPEN_DIALOG_SELECTOR: '.mdc-dialog--open', - DIALOG_CONTAINER_SELECTOR: '.mdc-dialog__container', + CONTAINER_SELECTOR: '.mdc-dialog__container', + CONTENT_SELECTOR: '.mdc-dialog__content', + ACTION_BUTTON_SELECTOR: '.mdc-dialog__button', YES_BTN_SELECTOR: '[data-mdc-dialog-action="yes"]', NO_BTN_SELECTOR: '[data-mdc-dialog-action="no"]', diff --git a/packages/mdc-dialog/foundation.js b/packages/mdc-dialog/foundation.js index df002e91423..a38c2d0b321 100644 --- a/packages/mdc-dialog/foundation.js +++ b/packages/mdc-dialog/foundation.js @@ -23,6 +23,7 @@ import {MDCFoundation} from '@material/base/index'; import {cssClasses, strings, numbers} from './constants'; +import {MDCSupport} from '@material/base/support'; export default class MDCDialogFoundation extends MDCFoundation { static get cssClasses() { @@ -43,14 +44,15 @@ export default class MDCDialogFoundation extends MDCFoundation { removeClass: (/* className: string */) => {}, addBodyClass: (/* className: string */) => {}, removeBodyClass: (/* className: string */) => {}, - eventTargetHasClass: (/* target: EventTarget, className: string */) => /* boolean */ false, - eventTargetMatchesSelector: (/* target: EventTarget, selector: string */) => /* boolean */ false, - registerInteractionHandler: (/* evt: string, handler: EventListener */) => {}, - deregisterInteractionHandler: (/* evt: string, handler: EventListener */) => {}, - registerSurfaceInteractionHandler: (/* evt: string, handler: EventListener */) => {}, - deregisterSurfaceInteractionHandler: (/* evt: string, handler: EventListener */) => {}, - registerDocumentKeydownHandler: (/* handler: EventListener */) => {}, - deregisterDocumentKeydownHandler: (/* handler: EventListener */) => {}, + eventTargetHasClass: (/* target: !EventTarget, className: string */) => /* boolean */ false, + eventTargetMatchesSelector: (/* target: !EventTarget, selector: string */) => /* boolean */ false, + registerInteractionHandler: (/* evt: string, handler: !EventListener */) => {}, + deregisterInteractionHandler: (/* evt: string, handler: !EventListener */) => {}, + registerSurfaceInteractionHandler: (/* evt: string, handler: !EventListener */) => {}, + deregisterSurfaceInteractionHandler: (/* evt: string, handler: !EventListener */) => {}, + registerDocumentKeydownHandler: (/* handler: !EventListener */) => {}, + deregisterDocumentKeydownHandler: (/* handler: !EventListener */) => {}, + getActionButtonElements: () => [], notifyYes: () => {}, notifyNo: () => {}, notifyCancel: () => {}, @@ -60,19 +62,36 @@ export default class MDCDialogFoundation extends MDCFoundation { notifyClosed: () => {}, trapFocusOnSurface: () => {}, untrapFocusOnSurface: () => {}, - isDialog: (/* el: Element */) => /* boolean */ false, + isDialog: (/* el: !Element */) => /* boolean */ false, }); } constructor(adapter) { super(Object.assign(MDCDialogFoundation.defaultAdapter, adapter)); + + /** + * @type {!MDCSupport} + * @private + */ + this.support_; + + /** + * @type {boolean} + * @private + */ this.isOpen_ = false; + this.componentClickHandler_ = (evt) => { - if (this.adapter_.eventTargetHasClass(evt.target, cssClasses.BACKDROP)) { + // TODO(acdvorak): Make this client-configurable. Maybe use a data-* attribute? + // 1) data-mdc-dialog-action="cancel" (should already work!) + // 2) data-mdc-dialog-scrim-closes="false" + if (this.adapter_.eventTargetHasClass(evt.target, cssClasses.SCRIM)) { this.cancel(true); } }; + this.dialogClickHandler_ = (evt) => this.handleDialogClick_(evt); + this.documentKeydownHandler_ = (evt) => { if (evt.key && evt.key === 'Escape' || evt.keyCode === 27) { this.cancel(true); @@ -82,49 +101,56 @@ export default class MDCDialogFoundation extends MDCFoundation { this.timerId_ = 0; }; + init({supportFactory = () => new MDCSupport()} = {}) { + this.support_ = supportFactory(); + } + destroy() { // Ensure that dialog is cleaned up when destroyed if (this.isOpen_) { this.close(); } // Final cleanup of animating class in case the timer has not completed. - this.adapter_.removeClass(MDCDialogFoundation.cssClasses.ANIMATING); + this.adapter_.removeClass(cssClasses.ANIMATING); clearTimeout(this.timerId_); } open() { + this.adapter_.notifyOpening(); this.isOpen_ = true; this.disableScroll_(); this.adapter_.registerDocumentKeydownHandler(this.documentKeydownHandler_); this.adapter_.registerSurfaceInteractionHandler('click', this.dialogClickHandler_); this.adapter_.registerInteractionHandler('click', this.componentClickHandler_); - this.adapter_.addClass(MDCDialogFoundation.cssClasses.ANIMATING); - this.adapter_.addClass(MDCDialogFoundation.cssClasses.OPEN); - this.adapter_.notifyOpening(); // TODO(acdvorak): Add a unit test for this + this.adapter_.addClass(cssClasses.ANIMATING); + this.adapter_.addClass(cssClasses.OPEN); + + this.detectStackedButtons_(); + this.detectScrollableContent_(); clearTimeout(this.timerId_); this.timerId_ = setTimeout(() => { this.handleAnimationTimerEnd_(); - this.adapter_.notifyOpened(); // TODO(acdvorak): Add a unit test for this - }, MDCDialogFoundation.numbers.DIALOG_ANIMATION_TIME_MS); + this.adapter_.notifyOpened(); + }, numbers.DIALOG_ANIMATION_TIME_MS); } close() { + this.adapter_.notifyClosing(); this.isOpen_ = false; this.enableScroll_(); this.adapter_.deregisterSurfaceInteractionHandler('click', this.dialogClickHandler_); this.adapter_.deregisterDocumentKeydownHandler(this.documentKeydownHandler_); this.adapter_.deregisterInteractionHandler('click', this.componentClickHandler_); this.adapter_.untrapFocusOnSurface(); - this.adapter_.addClass(MDCDialogFoundation.cssClasses.ANIMATING); - this.adapter_.removeClass(MDCDialogFoundation.cssClasses.OPEN); - this.adapter_.notifyClosing(); // TODO(acdvorak): Add a unit test for this + this.adapter_.addClass(cssClasses.ANIMATING); + this.adapter_.removeClass(cssClasses.OPEN); clearTimeout(this.timerId_); this.timerId_ = setTimeout(() => { this.handleAnimationTimerEnd_(); - this.adapter_.notifyClosed(); // TODO(acdvorak): Add a unit test for this - }, MDCDialogFoundation.numbers.DIALOG_ANIMATION_TIME_MS); + this.adapter_.notifyClosed(); + }, numbers.DIALOG_ANIMATION_TIME_MS); } isOpen() { @@ -155,6 +181,65 @@ export default class MDCDialogFoundation extends MDCFoundation { this.close(); } + /** @private */ + detectStackedButtons_() { + const isStacked = this.isStacked_(); + if (isStacked) { + this.adapter_.addClass(cssClasses.STACKED); + } else { + this.adapter_.removeClass(cssClasses.STACKED); + } + } + + /** + * @return {boolean} + * @private + */ + isStacked_() { + /** @type {!Array} */ + const buttonEls = [].slice.call(this.adapter_.getActionButtonElements()); + const offsetTopSet = new Set(); + buttonEls.forEach((buttonEl) => { + offsetTopSet.add(buttonEl.offsetTop); + }); + return offsetTopSet.size > 1; + } + + /** @private */ + detectScrollableContent_() { + this.detectScrollableContentImpl_(); + + if (this.support_.hasFlexItemMaxHeightBug) { + // Necessary to force IE 11 to calculate overflow correctly. + requestAnimationFrame(() => { + this.fixContentOverflow_(); + this.detectScrollableContentImpl_(); + }); + } + } + + /** @private */ + detectScrollableContentImpl_() { + const contentEl = this.adapter_.getContentElement(); + if (contentEl && this.support_.isScrollable(contentEl)) { + this.adapter_.addClass(cssClasses.SCROLLABLE); + } else { + this.adapter_.removeClass(cssClasses.SCROLLABLE); + } + } + + /** @private */ + fixContentOverflow_() { + const contentEl = this.adapter_.getContentElement(); + if (contentEl && this.support_.hasFlexItemMaxHeightBug) { + this.support_.fixFlexItemMaxHeightBug(contentEl); + } + } + + /** + * @param {!Event} evt + * @private + */ handleDialogClick_(evt) { const {target} = evt; if (this.adapter_.eventTargetMatchesSelector(target, strings.YES_BTN_SELECTOR)) { @@ -166,17 +251,20 @@ export default class MDCDialogFoundation extends MDCFoundation { } } + /** @private */ handleAnimationTimerEnd_() { - this.adapter_.removeClass(MDCDialogFoundation.cssClasses.ANIMATING); + this.adapter_.removeClass(cssClasses.ANIMATING); if (this.isOpen_) { this.adapter_.trapFocusOnSurface(); } }; + /** @private */ disableScroll_() { this.adapter_.addBodyClass(cssClasses.SCROLL_LOCK); } + /** @private */ enableScroll_() { this.adapter_.removeBodyClass(cssClasses.SCROLL_LOCK); } diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 19601e9acb2..027f9fd7aaa 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -24,7 +24,6 @@ import {MDCComponent} from '@material/base/index'; import {MDCRipple} from '@material/ripple/index'; import {matches} from '@material/base/ponyfill'; -import {MDCSupport} from '@material/base/support'; import MDCDialogFoundation from './foundation'; import * as util from './util'; @@ -36,12 +35,6 @@ export class MDCDialog extends MDCComponent { constructor(...args) { super(...args); - /** - * @type {!MDCSupport} - * @private - */ - this.support_; - /** * @type {!focusTrap} * @private @@ -63,20 +56,24 @@ export class MDCDialog extends MDCComponent { return this.foundation_.isOpen(); } - get dialogSurface_() { - return this.root_.querySelector(MDCDialogFoundation.strings.DIALOG_CONTAINER_SELECTOR); + get containerElement_() { + return this.root_.querySelector(MDCDialogFoundation.strings.CONTAINER_SELECTOR); + } + + get contentElement_() { + return this.root_.querySelector(MDCDialogFoundation.strings.CONTENT_SELECTOR); + } + + get actionButtonElements_() { + return this.root_.querySelectorAll(MDCDialogFoundation.strings.ACTION_BUTTON_SELECTOR); } - initialize({ - supportFactory = () => new MDCSupport(), - focusTrapFactory = undefined, - } = {}) { - this.support_ = supportFactory(); - this.focusTrap_ = util.createFocusTrapInstance(this.dialogSurface_, undefined, focusTrapFactory); + initialize() { + this.focusTrap_ = util.createFocusTrapInstance(this.containerElement_); this.footerBtnRipples_ = []; - const footerBtns = this.root_.querySelectorAll('.mdc-dialog__button'); - for (let i = 0, footerBtn; footerBtn = footerBtns[i]; i++) { + const actionButtonEls = this.actionButtonElements_; + for (let i = 0, footerBtn; footerBtn = actionButtonEls[i]; i++) { this.footerBtnRipples_.push(new MDCRipple(footerBtn)); } } @@ -88,55 +85,6 @@ export class MDCDialog extends MDCComponent { show() { this.foundation_.open(); - - // TODO(acdvorak): Refactor - this.detectStackedButtons_(); - this.detectScrollableContent_(); - } - - /** @private */ - detectStackedButtons_() { - /** @type {!Array} */ - const buttonEls = [].slice.call(this.root_.querySelectorAll('.mdc-dialog__button')); - const offsetTopSet = new Set(); - buttonEls.forEach((buttonEl) => offsetTopSet.add(buttonEl.offsetTop)); - - const isStacked = offsetTopSet.size > 1; - if (isStacked) { - this.root_.classList.add('mdc-dialog--stacked'); - } else { - this.root_.classList.remove('mdc-dialog--stacked'); - } - } - - /** - * @param {boolean=} bypassRAF - * @private - */ - detectScrollableContent_(bypassRAF = false) { - if (this.support_.hasFlexItemMaxHeightBug && !bypassRAF) { - // RAF causes a bit of jank, but it's necessary to force IE to render correctly. - requestAnimationFrame(() => { - this.fixContentOverflow_(); - this.detectScrollableContent_(true); - }); - return; - } - - const bodyEl = this.root_.querySelector('.mdc-dialog__content'); - if (bodyEl && bodyEl.scrollHeight > bodyEl.offsetHeight) { - this.root_.classList.add('mdc-dialog--scrollable'); - } else { - this.root_.classList.remove('mdc-dialog--scrollable'); - } - } - - /** @private */ - fixContentOverflow_() { - const bodyEl = this.root_.querySelector('.mdc-dialog__content'); - if (this.support_.hasFlexItemMaxHeightBug && bodyEl) { - this.support_.fixFlexItemMaxHeightBug(bodyEl); - } } close() { @@ -153,10 +101,12 @@ export class MDCDialog extends MDCComponent { eventTargetMatchesSelector: (target, selector) => matches(target, selector), registerInteractionHandler: (evt, handler) => this.root_.addEventListener(evt, handler), deregisterInteractionHandler: (evt, handler) => this.root_.removeEventListener(evt, handler), - registerSurfaceInteractionHandler: (evt, handler) => this.dialogSurface_.addEventListener(evt, handler), - deregisterSurfaceInteractionHandler: (evt, handler) => this.dialogSurface_.removeEventListener(evt, handler), + registerSurfaceInteractionHandler: (evt, handler) => this.containerElement_.addEventListener(evt, handler), + deregisterSurfaceInteractionHandler: (evt, handler) => this.containerElement_.removeEventListener(evt, handler), registerDocumentKeydownHandler: (handler) => document.addEventListener('keydown', handler), deregisterDocumentKeydownHandler: (handler) => document.removeEventListener('keydown', handler), + getContentElement: () => this.contentElement_, + getActionButtonElements: () => this.actionButtonElements_, notifyYes: () => this.emit(MDCDialogFoundation.strings.YES_EVENT), notifyNo: () => this.emit(MDCDialogFoundation.strings.NO_EVENT), notifyCancel: () => this.emit(MDCDialogFoundation.strings.CANCEL_EVENT), @@ -166,7 +116,7 @@ export class MDCDialog extends MDCComponent { notifyClosed: () => this.emit(MDCDialogFoundation.strings.CLOSED_EVENT), trapFocusOnSurface: () => this.focusTrap_.activate(), untrapFocusOnSurface: () => this.focusTrap_.deactivate(), - isDialog: (el) => el === this.dialogSurface_, + isDialog: (el) => el === this.containerElement_, }); } } diff --git a/test/unit/mdc-dialog/foundation.test.js b/test/unit/mdc-dialog/foundation.test.js index ac1e778323b..4a5853c242d 100644 --- a/test/unit/mdc-dialog/foundation.test.js +++ b/test/unit/mdc-dialog/foundation.test.js @@ -316,7 +316,7 @@ test('on click closes the dialog and notifies cancellation if event target is th target: {}, }; - td.when(mockAdapter.eventTargetHasClass(evt.target, cssClasses.BACKDROP)).thenReturn(true); + td.when(mockAdapter.eventTargetHasClass(evt.target, cssClasses.SCRIM)).thenReturn(true); foundation.open(); handlers.click(evt); @@ -333,7 +333,7 @@ test('on click does not close or notify cancellation if event target is the surf target: {}, }; - td.when(mockAdapter.eventTargetHasClass(evt.target, cssClasses.BACKDROP)).thenReturn(false); + td.when(mockAdapter.eventTargetHasClass(evt.target, cssClasses.SCRIM)).thenReturn(false); foundation.open(); handlers.click(evt); diff --git a/test/unit/mdc-dialog/mdc-dialog.test.js b/test/unit/mdc-dialog/mdc-dialog.test.js index 6c48785197f..8713e5b231b 100644 --- a/test/unit/mdc-dialog/mdc-dialog.test.js +++ b/test/unit/mdc-dialog/mdc-dialog.test.js @@ -179,7 +179,7 @@ test('adapter#deregisterInteractionHandler removes an event listener from the ro test('adapter#registerSurfaceInteractionHandler adds an event listener to the root element', () => { const {root, component} = setupTest(); - const dialog = root.querySelector(strings.DIALOG_CONTAINER_SELECTOR); + const dialog = root.querySelector(strings.CONTAINER_SELECTOR); const handler = td.func('eventHandler'); component.getDefaultFoundation().adapter_.registerSurfaceInteractionHandler('click', handler); @@ -190,7 +190,7 @@ test('adapter#registerSurfaceInteractionHandler adds an event listener to the ro test('adapter#deregisterSurfaceInteractionHandler removes an event listener from the root element', () => { const {root, component} = setupTest(); - const dialog = root.querySelector(strings.DIALOG_CONTAINER_SELECTOR); + const dialog = root.querySelector(strings.CONTAINER_SELECTOR); const handler = td.func('eventHandler'); dialog.addEventListener('click', handler); @@ -278,11 +278,7 @@ test('adapter#trapFocusOnSurface calls activate() on a properly configured focus deactivate: td.func('focusTrap#deactivate'), }); - td.when(util.createFocusTrapInstance( - hasClassMatcher('mdc-dialog__container'), - td.matchers.anything(), - td.matchers.anything() - )) + td.when(util.createFocusTrapInstance(hasClassMatcher('mdc-dialog__container'))) .thenReturn(fakeFocusTrapInstance); const {component} = setupTest(); @@ -302,11 +298,7 @@ test('adapter#untrapFocusOnSurface calls deactivate() on a properly configured f deactivate: () => {}, }); - td.when(util.createFocusTrapInstance( - hasClassMatcher('mdc-dialog__container'), - td.matchers.anything(), - td.matchers.anything() - )) + td.when(util.createFocusTrapInstance(hasClassMatcher('mdc-dialog__container'))) .thenReturn(fakeFocusTrapInstance); const {component} = setupTest(); @@ -318,7 +310,7 @@ test('adapter#untrapFocusOnSurface calls deactivate() on a properly configured f test('adapter#isDialog returns true for the dialog surface element', () => { const {root, component} = setupTest(); - const dialog = root.querySelector(strings.DIALOG_CONTAINER_SELECTOR); + const dialog = root.querySelector(strings.CONTAINER_SELECTOR); assert.isOk(component.getDefaultFoundation().adapter_.isDialog(dialog)); }); From 35ae31b6d4ae0067d59a5b043b525df90e4e08f0 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 01:47:22 -0700 Subject: [PATCH 048/219] WIP: Fix failing unit tests --- packages/mdc-base/support.js | 1 - packages/mdc-dialog/foundation.js | 7 ++++--- packages/mdc-dialog/index.js | 18 +++++++++--------- test/unit/mdc-dialog/foundation.test.js | 12 +++++++++++- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/packages/mdc-base/support.js b/packages/mdc-base/support.js index 457e9fd7d4c..8b2018a0d07 100644 --- a/packages/mdc-base/support.js +++ b/packages/mdc-base/support.js @@ -73,7 +73,6 @@ class MDCSupport { */ fixFlexItemMaxHeightBug(element) { if (!this.hasFlexItemMaxHeightBug) { - console.log('skipping fixFlexItemMaxHeightBug() because hasFlexItemMaxHeightBug is false'); return; } const oldValue = element.style.flexBasis; diff --git a/packages/mdc-dialog/foundation.js b/packages/mdc-dialog/foundation.js index a38c2d0b321..3fa66c75a1d 100644 --- a/packages/mdc-dialog/foundation.js +++ b/packages/mdc-dialog/foundation.js @@ -52,7 +52,8 @@ export default class MDCDialogFoundation extends MDCFoundation { deregisterSurfaceInteractionHandler: (/* evt: string, handler: !EventListener */) => {}, registerDocumentKeydownHandler: (/* handler: !EventListener */) => {}, deregisterDocumentKeydownHandler: (/* handler: !EventListener */) => {}, - getActionButtonElements: () => [], + getContentElement: () => document.createElement('div'), + getButtonElements: () => [], notifyYes: () => {}, notifyNo: () => {}, notifyCancel: () => {}, @@ -197,7 +198,7 @@ export default class MDCDialogFoundation extends MDCFoundation { */ isStacked_() { /** @type {!Array} */ - const buttonEls = [].slice.call(this.adapter_.getActionButtonElements()); + const buttonEls = [].slice.call(this.adapter_.getButtonElements()); const offsetTopSet = new Set(); buttonEls.forEach((buttonEl) => { offsetTopSet.add(buttonEl.offsetTop); @@ -257,7 +258,7 @@ export default class MDCDialogFoundation extends MDCFoundation { if (this.isOpen_) { this.adapter_.trapFocusOnSurface(); } - }; + } /** @private */ disableScroll_() { diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 027f9fd7aaa..08869ad550a 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -45,7 +45,7 @@ export class MDCDialog extends MDCComponent { * @type {!Array} * @private */ - this.footerBtnRipples_; + this.buttonRipples_; } static attachTo(root) { @@ -64,22 +64,22 @@ export class MDCDialog extends MDCComponent { return this.root_.querySelector(MDCDialogFoundation.strings.CONTENT_SELECTOR); } - get actionButtonElements_() { - return this.root_.querySelectorAll(MDCDialogFoundation.strings.ACTION_BUTTON_SELECTOR); + get buttonElements_() { + return [].slice.call(this.root_.querySelectorAll(MDCDialogFoundation.strings.ACTION_BUTTON_SELECTOR)); } initialize() { this.focusTrap_ = util.createFocusTrapInstance(this.containerElement_); - this.footerBtnRipples_ = []; + this.buttonRipples_ = []; - const actionButtonEls = this.actionButtonElements_; - for (let i = 0, footerBtn; footerBtn = actionButtonEls[i]; i++) { - this.footerBtnRipples_.push(new MDCRipple(footerBtn)); + const buttonEls = this.buttonElements_; + for (let i = 0, buttonEl; buttonEl = buttonEls[i]; i++) { + this.buttonRipples_.push(new MDCRipple(buttonEl)); } } destroy() { - this.footerBtnRipples_.forEach((ripple) => ripple.destroy()); + this.buttonRipples_.forEach((ripple) => ripple.destroy()); super.destroy(); } @@ -106,7 +106,7 @@ export class MDCDialog extends MDCComponent { registerDocumentKeydownHandler: (handler) => document.addEventListener('keydown', handler), deregisterDocumentKeydownHandler: (handler) => document.removeEventListener('keydown', handler), getContentElement: () => this.contentElement_, - getActionButtonElements: () => this.actionButtonElements_, + getButtonElements: () => this.buttonElements_, notifyYes: () => this.emit(MDCDialogFoundation.strings.YES_EVENT), notifyNo: () => this.emit(MDCDialogFoundation.strings.NO_EVENT), notifyCancel: () => this.emit(MDCDialogFoundation.strings.CANCEL_EVENT), diff --git a/test/unit/mdc-dialog/foundation.test.js b/test/unit/mdc-dialog/foundation.test.js index 4a5853c242d..81c83e52baf 100644 --- a/test/unit/mdc-dialog/foundation.test.js +++ b/test/unit/mdc-dialog/foundation.test.js @@ -52,6 +52,7 @@ test('default adapter returns a complete adapter implementation', () => { 'registerInteractionHandler', 'deregisterInteractionHandler', 'registerSurfaceInteractionHandler', 'deregisterSurfaceInteractionHandler', 'registerDocumentKeydownHandler', 'deregisterDocumentKeydownHandler', + 'getContentElement', 'getButtonElements', 'notifyYes', 'notifyNo', 'notifyCancel', 'notifyOpening', 'notifyOpened', 'notifyClosing', 'notifyClosed', 'trapFocusOnSurface', 'untrapFocusOnSurface', 'isDialog', ]); @@ -61,9 +62,18 @@ test('default adapter returns a complete adapter implementation', () => { * @return {{mockAdapter: !Object, foundation: !MDCDialogFoundation}} */ function setupTest() { - return /** @type {{mockAdapter: !Object, foundation: !MDCDialogFoundation}} */ ( + const ret = /** @type {{mockAdapter: !Object, foundation: !MDCDialogFoundation}} */ ( setupFoundationTest(MDCDialogFoundation) ); + + const {foundation, mockAdapter} = ret; + + td.when(mockAdapter.getContentElement()).thenReturn(document.createElement('div')); + td.when(mockAdapter.getButtonElements()).thenReturn([]); + + foundation.init(); + + return ret; } test('#destroy closes the dialog to perform any necessary cleanup', () => { From 13094104a6ea2f64d999d5e848f1451844f7b431 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 01:55:43 -0700 Subject: [PATCH 049/219] WIP: Fix failing unit test in IE 11 --- packages/mdc-base/support.js | 10 +--------- test/unit/mdc-base/support.test.js | 10 +--------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/packages/mdc-base/support.js b/packages/mdc-base/support.js index 8b2018a0d07..a568286b975 100644 --- a/packages/mdc-base/support.js +++ b/packages/mdc-base/support.js @@ -99,15 +99,7 @@ class MDCSupport {
      Header
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      +
      Content
      Footer
      diff --git a/test/unit/mdc-base/support.test.js b/test/unit/mdc-base/support.test.js index 7344219eb9f..def248b359f 100644 --- a/test/unit/mdc-base/support.test.js +++ b/test/unit/mdc-base/support.test.js @@ -45,15 +45,7 @@ function createFlexItemMaxHeightBugFixture() {
      Header
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      +
      Content
      Footer
      From d5a1c080c6880df810fc71189a93c66169617aeb Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 02:01:58 -0700 Subject: [PATCH 050/219] WIP: Fix failing unit test in IE 11 v2 --- test/unit/mdc-base/support.test.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/test/unit/mdc-base/support.test.js b/test/unit/mdc-base/support.test.js index def248b359f..3c12a935da4 100644 --- a/test/unit/mdc-base/support.test.js +++ b/test/unit/mdc-base/support.test.js @@ -123,12 +123,15 @@ test('#fixFlexItemMaxHeightBug makes child flex item scrollable', function(done) support.fixFlexItemMaxHeightBug(flexItemEl); - requestAnimationFrame(() => { - // If the fix worked, the height of the scrollable area should be greater than the element's bounding box height. - assert.isAbove(flexItemEl.scrollHeight, flexItemEl.offsetHeight); - destroyFlexItemMaxHeightBugFixture(flexContainerEl); - done(); - }); + // Timeout for IE 11 + setTimeout(() => { + requestAnimationFrame(() => { + // If the fix worked, the height of the scrollable area should be greater than the element's bounding box height. + assert.isAbove(flexItemEl.scrollHeight, flexItemEl.offsetHeight); + destroyFlexItemMaxHeightBugFixture(flexContainerEl); + done(); + }); + }, 500); }); test('#fixFlexItemMaxHeightBug restores flex-basis to its original value of ""', function(done) { From 34ffed29da3bf32ebc73d41abcd6efac2ddf56e3 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 02:14:31 -0700 Subject: [PATCH 051/219] WIP: Debug failing test in IE 11 --- test/unit/mdc-base/support.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/unit/mdc-base/support.test.js b/test/unit/mdc-base/support.test.js index 3c12a935da4..7b924f834e4 100644 --- a/test/unit/mdc-base/support.test.js +++ b/test/unit/mdc-base/support.test.js @@ -40,7 +40,6 @@ function createFlexItemMaxHeightBugFixture() { // The 1px borders are necessary to force IE to calculate box sizing correctly. const element = bel`
      Header
      Header
      Date: Tue, 28 Aug 2018 11:29:21 -0700 Subject: [PATCH 053/219] WIP: Revert debugging changes to mdc-ripple --- packages/mdc-ripple/index.js | 8 -------- test/unit/mdc-ripple/mdc-ripple.test.js | 8 +------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/packages/mdc-ripple/index.js b/packages/mdc-ripple/index.js index 31241577a8a..a12ad0889f4 100644 --- a/packages/mdc-ripple/index.js +++ b/packages/mdc-ripple/index.js @@ -130,15 +130,7 @@ class MDCRipple extends MDCComponent { /** @override */ initialSyncWithDOM() { - const isMobile = navigator.userAgent.indexOf('Mobile/') > -1; - const isSafari = navigator.userAgent.indexOf('Safari/') > -1; this.unbounded = 'mdcRippleIsUnbounded' in this.root_.dataset; - if (this.root_.id === 'foo' && isMobile && isSafari && !this.unbounded) { - const json = JSON.stringify(this.root_.dataset, null, 2); - const html = this.root_.outerHTML; - const message = `Error: this.unbounded is falsy!\n\n${json}\n\n${html}`; - throw new Error(message); - } } } diff --git a/test/unit/mdc-ripple/mdc-ripple.test.js b/test/unit/mdc-ripple/mdc-ripple.test.js index 9aad111c88d..dd86a410460 100644 --- a/test/unit/mdc-ripple/mdc-ripple.test.js +++ b/test/unit/mdc-ripple/mdc-ripple.test.js @@ -46,14 +46,8 @@ test('attachTo makes ripple unbounded when given as an option', () => { }); test('attachTo does not override unbounded data attr when omitted', () => { - const root = bel`
      `; + const root = bel`
      `; const component = MDCRipple.attachTo(root); - if (!component.unbounded) { - const json = JSON.stringify(component.root_.dataset, null, 2); - const html = component.root_.outerHTML; - const message = `Error: component.unbounded is falsy!\n\n${json}\n\n${html}`; - throw new Error(message); - } assert.isOk(component.unbounded); }); From 66f58a2b80a1005cc685ae218cebd8eec1d4b495 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 11:30:59 -0700 Subject: [PATCH 054/219] WIP: Revert changes to mdc-drawer's package-lock.json --- packages/mdc-drawer/package-lock.json | 110 ++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 packages/mdc-drawer/package-lock.json diff --git a/packages/mdc-drawer/package-lock.json b/packages/mdc-drawer/package-lock.json new file mode 100644 index 00000000000..998db69b7a4 --- /dev/null +++ b/packages/mdc-drawer/package-lock.json @@ -0,0 +1,110 @@ +{ + "name": "@material/drawer", + "version": "0.39.0-0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@material/animation": { + "version": "0.34.0" + }, + "@material/base": { + "version": "0.35.0" + }, + "@material/elevation": { + "version": "0.38.0", + "requires": { + "@material/animation": "^0.34.0", + "@material/theme": "^0.38.0" + }, + "dependencies": { + "@material/animation": { + "version": "0.34.0", + "bundled": true + }, + "@material/theme": { + "version": "0.38.0", + "bundled": true + } + } + }, + "@material/list": { + "version": "0.39.0-0", + "requires": { + "@material/base": "^0.35.0", + "@material/ripple": "^0.38.1", + "@material/rtl": "^0.36.0", + "@material/theme": "^0.38.0", + "@material/typography": "^0.39.0-0" + }, + "dependencies": { + "@material/base": { + "version": "0.35.0", + "bundled": true + }, + "@material/ripple": { + "version": "0.38.1", + "bundled": true, + "requires": { + "@material/animation": "^0.34.0", + "@material/base": "^0.35.0", + "@material/theme": "^0.38.0" + }, + "dependencies": { + "@material/animation": { + "version": "0.34.0", + "bundled": true + }, + "@material/base": { + "version": "0.35.0", + "bundled": true + }, + "@material/theme": { + "version": "0.38.0", + "bundled": true + } + } + }, + "@material/rtl": { + "version": "0.36.0", + "bundled": true + }, + "@material/theme": { + "version": "0.38.0", + "bundled": true + }, + "@material/typography": { + "version": "0.39.0-0", + "bundled": true + } + } + }, + "@material/rtl": { + "version": "0.36.0" + }, + "@material/theme": { + "version": "0.38.0" + }, + "@material/typography": { + "version": "0.39.0-0" + }, + "focus-trap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-3.0.0.tgz", + "integrity": "sha512-jTFblf0tLWbleGjj2JZsAKbgtZTdL1uC48L8FcmSDl4c2vDoU4NycN1kgV5vJhuq1mxNFkw7uWZ1JAGlINWvyw==", + "requires": { + "tabbable": "^3.1.0", + "xtend": "^4.0.1" + } + }, + "tabbable": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-3.1.0.tgz", + "integrity": "sha512-W+w8dbSbQiuhMQhJbgtSn7ksg1Z+Z0UQq0WpDuYUrXjqie2bkMTfXRhdKtyQ8lRbppDWFoQf+S3T+OBGxoEPUA==" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} From 238f905031fed11960546a8418439a3adcc49bf2 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 11:31:57 -0700 Subject: [PATCH 055/219] WIP: Revert changes to `packages/mdc-base/index.js` --- packages/mdc-base/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mdc-base/index.js b/packages/mdc-base/index.js index 1fc2335d276..dad0a6e4c63 100644 --- a/packages/mdc-base/index.js +++ b/packages/mdc-base/index.js @@ -21,7 +21,7 @@ * THE SOFTWARE. */ -import MDCComponent from './component'; import MDCFoundation from './foundation'; +import MDCComponent from './component'; -export {MDCComponent, MDCFoundation}; +export {MDCFoundation, MDCComponent}; From b0fbf2ed6b3cb21313a2c7292ddfa89464c65cc9 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 13:35:47 -0700 Subject: [PATCH 056/219] WIP: Revert changes to unrelated files (created separate PRs for them) --- packages/mdc-rtl/_mixins.scss | 61 ++++++++---------- ...ewrite-decl-statements-for-closure-test.js | 29 +-------- test/screenshot/favicon.ico | Bin 5430 -> 0 bytes 3 files changed, 27 insertions(+), 63 deletions(-) delete mode 100644 test/screenshot/favicon.ico diff --git a/packages/mdc-rtl/_mixins.scss b/packages/mdc-rtl/_mixins.scss index 72e9e385978..e1737cd8e4a 100644 --- a/packages/mdc-rtl/_mixins.scss +++ b/packages/mdc-rtl/_mixins.scss @@ -23,7 +23,6 @@ // Creates a rule that will be applied when an MDC Web component is within the context of an RTL layout. // // Usage Example: -// // ```scss // .mdc-foo { // position: absolute; @@ -94,7 +93,6 @@ // @include mdc-rtl-reflexive-box(margin, left, 8px); // } // ``` -// // is equivalent to: // // ```scss @@ -107,7 +105,6 @@ // } // } // ``` -// // whereas: // // ```scss @@ -115,7 +112,6 @@ // @include mdc-rtl-reflexive-box(margin, right, 8px); // } // ``` -// // is equivalent to: // // ```scss @@ -159,7 +155,6 @@ // @include mdc-rtl-reflexive-property(margin, auto, 12px); // } // ``` -// // is equivalent to: // // ```scss @@ -192,22 +187,20 @@ // position: absolute; // } // ``` -// // is equivalent to: // // ```scss -// .mdc-foo { -// position: absolute; -// left: 0; -// right: initial; -// -// @include mdc-rtl { -// right: 0; -// left: initial; -// } -// } +// .mdc-foo { +// position: absolute; +// left: 0; +// right: initial; +// +// @include mdc-rtl { +// right: 0; +// left: initial; +// } +// } // ``` -// // An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`. @mixin mdc-rtl-reflexive-position($position-property, $value, $root-selector: null) { @if (index((right, left), $position-property) == null) { @@ -232,24 +225,22 @@ // .mdc-foo { // @include mdc-rtl-reflexive(left, 2px, right, 5px); // position: absolute; -// } -// ``` -// -// is equivalent to: -// -// ```scss -// .mdc-foo { -// position: absolute; -// left: 2px; -// right: 5px; -// -// @include mdc-rtl { -// right: 2px; -// left: 5px; -// } -// } -// ``` -// +// } +// ``` +// is equivalent to: +// +// ```scss +// .mdc-foo { +// position: absolute; +// left: 2px; +// right: 5px; +// +// @include mdc-rtl { +// right: 2px; +// left: 5px; +// } +// } +// ``` // An optional fifth $root-selector argument may also be given, which is passed to `mdc-rtl`. @mixin mdc-rtl-reflexive( $left-property, diff --git a/scripts/rewrite-decl-statements-for-closure-test.js b/scripts/rewrite-decl-statements-for-closure-test.js index 13a0ae8652a..a8a2ae98146 100644 --- a/scripts/rewrite-decl-statements-for-closure-test.js +++ b/scripts/rewrite-decl-statements-for-closure-test.js @@ -218,35 +218,8 @@ function transform(srcFile, rootDir) { } // Specify goog.module after the @license comment and append newline at the end of the file. - // First, get the first occurrence of a multiline comment terminator with 0 or more preceding whitespace characters. + // First, get the first occurence of a multiline comment terminator with 0 or more preceding whitespace characters. const result = /\s*\*\//.exec(outputCode); - - if (!result) { - const data = JSON.stringify({ - srcFile, - pathbasedPackageName, - packageStr, - outputCode, - }, null, 2); - - const message = ` -Missing multiline comment terminator! - -Note that the following syntax is not supported: - - export function foo() { ... } - -use this instead: - - function foo() { ... } - export {foo}; - -${data} -`.trim(); - - throw new Error(message); - } - // Then, get the index of that first matching character set plus the length of the matching characters, plus one // extra character for more space. We now have the position at which we need to inject the "goog.module(...)" // declaration and can assemble the module-declared code. Yay! diff --git a/test/screenshot/favicon.ico b/test/screenshot/favicon.ico deleted file mode 100644 index 70743dcee34b25dc208a07828105b10303ceb8b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmdUyziSjh7>36~VhAFKm5AgH3$YdnhlmDi3ke~AK(MfsROvi|bx0v%5yVo&;wmeV z!@^251S^qnNJwEJ$0>SBaDCpp{leX{KW=78ARj!;?#%ao@9ggE+@5nMT*XzZj<)XZ zopkP!bFN+=oR;T-A{89{B24(7b?8u{Kn%8U}}BQ8fRt%m-3fd_+16u#SoJOM>p&`FT z*nrId*3dLSdqGItN2F(4w082wx6t1TF-Nmo(p&TD!(#}EyzBBA)4mZBJ|20wW&L-U ze8~EpSc59fiI@g;p0Dp+cI?E1BAY_NDsotU(dG* z-$A@by=*I%vQ81^dv3d9cvC zWOc1CtF=7e_fNmqPh+3Iv~S=BD2~EkK3Wg@X4Exk4zEGq7)Rxg)nE>~5Bd$!JlgO% zKGu0rgx>$rx)(Tk20y{-SxZ-LSf20m*L$FSXenlu_6t}&Yw5}j%k%ZWOVuuzKC8_& zAJHE-|K$C*=a6g<>-vl8PC9PS&G-IKTE8f-tiS177->K9#q^=qZ~7g)Hv=$zS%0e& z+8$T`UG914HJeVq9Zw)6RuHA_`&N6Bc8eOxZnA4ITR25Yr4=)kxNrmpqC8 DhxYhj From 1256ef96f223f737f8386a77ef956ba505c0ecf9 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 14:39:32 -0700 Subject: [PATCH 057/219] WIP: Update flaky Edge screenshots --- test/screenshot/golden.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index ce41a73e589..f7074dcd917 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -225,19 +225,19 @@ } }, "spec/mdc-dialog/classes/overflow-accessible-font-size.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/28/20_39_49_854/spec/mdc-dialog/classes/overflow-accessible-font-size.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/25/00_14_42_896/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/28/20_39_49_854/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_37_22_498/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/overflow.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/overflow.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/28/20_39_49_854/spec/mdc-dialog/classes/overflow.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/25/00_14_42_896/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/28/20_39_49_854/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_ie_11.png" } From 0db7981d4ff82637ce37aa745a466429ecc3af92 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 17:55:47 -0700 Subject: [PATCH 058/219] WIP: Update flaky Edge screenshot --- test/screenshot/golden.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index f7074dcd917..acd542168aa 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -246,7 +246,7 @@ "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-bottom.html", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/25/00_14_42_896/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/29/00_39_43_668/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_firefox_61.png", "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_51_53_788/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" } From 3f600ceba6b46e037814360bed6776ffab5179f1 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Tue, 28 Aug 2018 19:18:44 -0700 Subject: [PATCH 059/219] WIP: Tweak knobs to reduce flakiness in `diffing.json` --- test/screenshot/diffing.json | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/test/screenshot/diffing.json b/test/screenshot/diffing.json index 2d46c819175..1c296d64c7e 100644 --- a/test/screenshot/diffing.json +++ b/test/screenshot/diffing.json @@ -7,41 +7,53 @@ "flaky_test_config": { "global_config": { - "max_retries": 2, - "retry_delay_ms": 500, + "max_retries": 0, + "retry_delay_ms": 0, "min_changed_pixel_count": 15, - "max_changed_pixel_fraction_to_retry": 0.10, + "max_changed_pixel_fraction_to_retry": 0.05, "font_face_observer_timeout_ms": 3000, "fonts_loaded_reflow_delay_ms": 50 }, "config_overrides": [ { - "description": "IE and Edge flake more frequently than other browsers, especially with font rendering", + "description": "IE and Edge flake more frequently than other browsers, especially with font rendering on - Dismissible Drawer -
      -
      - +
      +
      +
      +
      + + Dismissible Drawer +
      +
      +
      -
      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      +
      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +
      diff --git a/test/screenshot/spec/mdc-drawer/classes/modal.html b/test/screenshot/spec/mdc-drawer/classes/modal.html index 5c90c6ddeab..c2301af560f 100644 --- a/test/screenshot/spec/mdc-drawer/classes/modal.html +++ b/test/screenshot/spec/mdc-drawer/classes/modal.html @@ -33,103 +33,105 @@ - +
      +
      +
      +
      +
      + + Modal Drawer +
      +
      +
      -
      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      +
      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +
      diff --git a/test/screenshot/spec/mdc-drawer/classes/permanent.html b/test/screenshot/spec/mdc-drawer/classes/permanent.html index e23ec0752bb..30803cd6c0e 100644 --- a/test/screenshot/spec/mdc-drawer/classes/permanent.html +++ b/test/screenshot/spec/mdc-drawer/classes/permanent.html @@ -32,103 +32,105 @@ - - -
      -
      -
      -
      - Permanent Drawer -
      -
      -
      +
      +
      +
      +
      + Permanent Drawer +
      +
      +
      -
      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      +
      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +
      diff --git a/test/screenshot/spec/mdc-drawer/mixins/fill-color-accessible.html b/test/screenshot/spec/mdc-drawer/mixins/fill-color-accessible.html index 05fd7de8edb..ddd93a7a9a0 100644 --- a/test/screenshot/spec/mdc-drawer/mixins/fill-color-accessible.html +++ b/test/screenshot/spec/mdc-drawer/mixins/fill-color-accessible.html @@ -32,103 +32,105 @@ - - -
      -
      -
      -
      - Permanent Drawer -
      -
      -
      +
      +
      +
      +
      + Permanent Drawer +
      +
      +
      -
      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      +
      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +
      diff --git a/test/screenshot/spec/mdc-drawer/mixins/fill-color.html b/test/screenshot/spec/mdc-drawer/mixins/fill-color.html index e6c026b1074..2b56bd2d86c 100644 --- a/test/screenshot/spec/mdc-drawer/mixins/fill-color.html +++ b/test/screenshot/spec/mdc-drawer/mixins/fill-color.html @@ -32,103 +32,105 @@ - - -
      -
      -
      -
      - Permanent Drawer -
      -
      -
      +
      +
      +
      +
      + Permanent Drawer +
      +
      +
      -
      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      -

      - Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      - sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      - enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      - aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      - voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      - occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      - anim id est laborum. -

      +
      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +

      + Lorem ipsum dolor sit amet, consectetur adipiscing elit,
      + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
      + enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
      + aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
      + voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
      + occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
      + anim id est laborum. +

      +
      From 44c65c2dd2496a354054c6da46c8e597945524eb Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 02:17:41 -0700 Subject: [PATCH 074/219] WIP: Update golden.json --- test/screenshot/golden.json | 70 ++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index cb62d8e5b72..32dda84b35d 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -198,66 +198,66 @@ } }, "spec/mdc-dialog/classes/baseline-alert.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-alert.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-alert.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/02_45_51_936/spec/mdc-dialog/classes/baseline-alert.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-alert.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-alert.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-alert.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-alert.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-alert.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/baseline-confirmation.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-confirmation.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-confirmation.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/02_45_51_936/spec/mdc-dialog/classes/baseline-confirmation.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/baseline-confirmation.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-confirmation.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-confirmation.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-confirmation.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-confirmation.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/baseline-simple.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-simple.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-simple.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-simple.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/02_45_51_936/spec/mdc-dialog/classes/baseline-simple.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/baseline-simple.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/10_09_21_890/spec/mdc-dialog/classes/baseline-simple.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-simple.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-simple.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-simple.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/baseline-simple.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/overflow-accessible-font-size.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/28/20_39_49_854/spec/mdc-dialog/classes/overflow-accessible-font-size.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow-accessible-font-size.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/02_45_51_936/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_37_22_498/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/overflow.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/travis/2018/08/28/20_39_49_854/spec/mdc-dialog/classes/overflow.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/02_45_51_936/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/overflow.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/overflow.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/scrollable-bottom.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-bottom.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-bottom.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/02_45_51_936/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-bottom.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/24/00_51_53_788/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-bottom.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-bottom.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/scrollable-top.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/08_18_54_462/spec/mdc-dialog/classes/scrollable-top.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-top.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/02_45_51_936/spec/mdc-dialog/classes/scrollable-top.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/23/23_59_54_225/spec/mdc-dialog/classes/scrollable-top.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-top.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-top.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-top.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/08_35_10_346/spec/mdc-dialog/classes/scrollable-top.html.windows_ie_11.png" } }, "spec/mdc-drawer/classes/dismissible.html": { From 17da54755a01c2d4b3a7a78b1745c162f0c26a41 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 02:18:05 -0700 Subject: [PATCH 075/219] WIP: Always update golden HTML file URL --- test/screenshot/infra/lib/golden-file.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/screenshot/infra/lib/golden-file.js b/test/screenshot/infra/lib/golden-file.js index 4c14bd163b2..7dfe244a9d3 100644 --- a/test/screenshot/infra/lib/golden-file.js +++ b/test/screenshot/infra/lib/golden-file.js @@ -94,6 +94,7 @@ class GoldenFile { }; } + this.suiteJson_[htmlFilePath].public_url = htmlFileUrl; this.suiteJson_[htmlFilePath].screenshots[userAgentAlias] = screenshotImageUrl; } From 087f7eaae2252d7625bbe300a1916d482bc72224 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 08:37:47 -0700 Subject: [PATCH 076/219] WIP: Update golden.json --- test/screenshot/golden.json | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index 46c38135f20..2f406bb84de 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -261,48 +261,48 @@ } }, "spec/mdc-drawer/classes/dismissible.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/dismissible.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html?utm_source=golden_json", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/dismissible.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/dismissible.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/dismissible.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/dismissible.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html.windows_ie_11.png" } }, "spec/mdc-drawer/classes/modal.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/modal.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html?utm_source=golden_json", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/modal.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/modal.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/modal.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/modal.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html.windows_ie_11.png" } }, "spec/mdc-drawer/classes/permanent.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/permanent.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html?utm_source=golden_json", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/permanent.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/permanent.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/permanent.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/classes/permanent.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html.windows_ie_11.png" } }, "spec/mdc-drawer/mixins/fill-color-accessible.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color-accessible.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html?utm_source=golden_json", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_ie_11.png" } }, "spec/mdc-drawer/mixins/fill-color.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color.html", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html?utm_source=golden_json", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/09_01_33_315/spec/mdc-drawer/mixins/fill-color.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html.windows_ie_11.png" } }, "spec/mdc-elevation/classes/baseline-large.html": { From 53cc437f8ccfb112d56fe7962151145ea3fbe0d8 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 08:39:10 -0700 Subject: [PATCH 077/219] WIP: Uncomment Travis jobs --- .travis.yml | 66 ++++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8fa510c51d7..af44f468176 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,11 +27,11 @@ install: matrix: include: -# - node_js: 8 -# env: -# - TEST_SUITE=lint -# script: -# - if has_testable_files; then npm run lint; else log_untestable_files; fi + - node_js: 8 + env: + - TEST_SUITE=lint + script: + - if has_testable_files; then npm run lint; else log_untestable_files; fi - node_js: 8 env: @@ -43,31 +43,31 @@ matrix: after_success: - codecov -# - node_js: 8 -# env: -# - TEST_SUITE=closure -# - CLOSURE=1 -# script: -# - if has_testable_files; then npm run test:closure; else log_untestable_files; fi -# -# - node_js: 8 -# env: -# - TEST_SUITE=site-generator -# script: -# - if has_testable_files; then npm run test:site; else log_untestable_files; fi -# -# - node_js: 8 -# env: -# - TEST_SUITE=screenshot -# git: -# depth: 200 -# before_install: # Override global settings -# # Source the scripts to export their env vars. See https://superuser.com/a/176788/62792 -# - source scripts/travis-env-vars.sh -# - source test/screenshot/infra/commands/travis.sh -# install: # Override global settings -# - npm install -# # Noisy output, but useful for debugging npm package dependency version issues: -# #- npm ls -# script: -# - npm run screenshot:test + - node_js: 8 + env: + - TEST_SUITE=closure + - CLOSURE=1 + script: + - if has_testable_files; then npm run test:closure; else log_untestable_files; fi + + - node_js: 8 + env: + - TEST_SUITE=site-generator + script: + - if has_testable_files; then npm run test:site; else log_untestable_files; fi + + - node_js: 8 + env: + - TEST_SUITE=screenshot + git: + depth: 200 + before_install: # Override global settings + # Source the scripts to export their env vars. See https://superuser.com/a/176788/62792 + - source scripts/travis-env-vars.sh + - source test/screenshot/infra/commands/travis.sh + install: # Override global settings + - npm install + # Noisy output, but useful for debugging npm package dependency version issues: + #- npm ls + script: + - npm run screenshot:test From b0755d9007c952636b1d9c9a4e72fcc6c12e1ff5 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 09:53:32 -0700 Subject: [PATCH 078/219] WIP: Fix broken tests? --- packages/mdc-dialog/foundation.js | 4 ++-- test/unit/helpers/foundation.js | 39 +++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/packages/mdc-dialog/foundation.js b/packages/mdc-dialog/foundation.js index e74d65ae6fa..2e3a503030f 100644 --- a/packages/mdc-dialog/foundation.js +++ b/packages/mdc-dialog/foundation.js @@ -43,8 +43,8 @@ export default class MDCDialogFoundation extends MDCFoundation { return new MDCDialogAdapter(); } - constructor(adapter) { - super(Object.assign(MDCDialogFoundation.defaultAdapter, adapter)); + constructor(adapter = MDCDialogFoundation.defaultAdapter()) { + super(adapter); /** * @type {boolean} diff --git a/test/unit/helpers/foundation.js b/test/unit/helpers/foundation.js index 23468685ce1..28300a64dfa 100644 --- a/test/unit/helpers/foundation.js +++ b/test/unit/helpers/foundation.js @@ -31,9 +31,11 @@ import td from 'testdouble'; // Every foundation test suite include this verification. export function verifyDefaultAdapter(FoundationClass, expectedMethods) { const {defaultAdapter} = FoundationClass; - const actualMethods = Object.keys(defaultAdapter).filter((k) => typeof defaultAdapter[k] === 'function'); + const plainObject = toPlainObject(defaultAdapter); + const adapterKeys = Object.keys(plainObject); + const actualMethods = adapterKeys.filter((key) => typeof defaultAdapter[key] === 'function'); - assert.equal(actualMethods.length, Object.keys(defaultAdapter).length, 'Every adapter key must be a function'); + assert.equal(actualMethods.length, adapterKeys.length, 'Every adapter key must be a function'); // Test for equality without requiring that the array be in a specific order const actualArray = actualMethods.slice().sort(); @@ -44,6 +46,39 @@ export function verifyDefaultAdapter(FoundationClass, expectedMethods) { actualMethods.forEach((m) => assert.doesNotThrow(defaultAdapter[m])); } +function toPlainObject(adapterInstance) { + function hasMethod(obj, name) { + const desc = Object.getOwnPropertyDescriptor(obj, name); + return !!desc && typeof desc.value === 'function'; + } + + function getInstanceMethodNames(obj, stop = Object.prototype) { + const array = []; + let proto = Object.getPrototypeOf(obj); + while (proto && proto !== stop) { + Object.getOwnPropertyNames(proto) + .forEach((name) => { + if (name !== 'constructor') { + if (hasMethod(proto, name)) { + array.push(name); + } + } + }); + proto = Object.getPrototypeOf(proto); + } + return array; + } + + const adapterMethods = {}; + Object.getOwnPropertyNames(adapterInstance).forEach((name) => { + adapterMethods[name] = adapterInstance[name]; + }); + getInstanceMethodNames(adapterInstance).forEach((name) => { + adapterMethods[name] = adapterInstance[name]; + }); + return adapterMethods; +} + /** * @param {!Array} actualArray * @param {!Array} expectedArray From e31c0bda499f6166272a6c19c08b629ef0cf56ae Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 10:18:54 -0700 Subject: [PATCH 079/219] WIP: Remove unused `isDialog()` adapter method --- packages/mdc-dialog/README.md | 2 +- packages/mdc-dialog/adapter.js | 6 ------ packages/mdc-dialog/index.js | 1 - test/unit/mdc-dialog/foundation.test.js | 7 ++----- test/unit/mdc-dialog/mdc-dialog.test.js | 11 ----------- 5 files changed, 3 insertions(+), 24 deletions(-) diff --git a/packages/mdc-dialog/README.md b/packages/mdc-dialog/README.md index dcb46a0e2ee..7643a4c235e 100644 --- a/packages/mdc-dialog/README.md +++ b/packages/mdc-dialog/README.md @@ -271,8 +271,8 @@ do so. We provide instructions on how to add ripples to buttons within the [mdc- | `registerTransitionEndHandler: (handler: EventListener) => void` | Registers an event handler to be called when a transitionend event is triggered on the dialog container sub-element element. | | `deregisterTransitionEndHandler: (handler: EventListener) => void` | Deregisters an event handler from a transitionend event listener. This will only be called with handlers that have previously been passed to registerTransitionEndHandler calls. | | `notifyYes() => {}` | Broadcasts an event denoting that the user has accepted the dialog. | +| `notifyNo() => {}` | Broadcasts an event denoting that the user has rejected the dialog. | | `notifyCancel() => {}` | Broadcasts an event denoting that the user has cancelled the dialog. | -| `isDialog(el: Element) => boolean` | Returns boolean indicating whether the provided element is the dialog surface element. | | `trapFocusOnSurface() => {}` | Sets up the DOM which the dialog is contained in such that focusability is restricted to the elements on the dialog surface (see [Handling Focus Trapping](#handling-focus-trapping) below for more details). | | `untrapFocusOnSurface() => {}` | Removes any affects of focus trapping on the dialog surface from the DOM (see [Handling Focus Trapping](#handling-focus-trapping) below for more details). | diff --git a/packages/mdc-dialog/adapter.js b/packages/mdc-dialog/adapter.js index 7d9931f123e..9c79ba3cfb0 100644 --- a/packages/mdc-dialog/adapter.js +++ b/packages/mdc-dialog/adapter.js @@ -40,12 +40,6 @@ * @record */ class MDCDialogAdapter { - /** - * @param {!HTMLElement} el - * @return {boolean} - */ - isDialog(el) {} - /** * @param {!HTMLElement} el * @return {boolean} diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 53f96e47f7e..016d3ae678f 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -117,7 +117,6 @@ export class MDCDialog extends MDCComponent { notifyClosed: () => this.emit(MDCDialogFoundation.strings.CLOSED_EVENT), trapFocusOnSurface: () => this.focusTrap_.activate(), untrapFocusOnSurface: () => this.focusTrap_.deactivate(), - isDialog: (el) => el === this.containerElement_, }); } } diff --git a/test/unit/mdc-dialog/foundation.test.js b/test/unit/mdc-dialog/foundation.test.js index f797a5727cc..b740f7bc644 100644 --- a/test/unit/mdc-dialog/foundation.test.js +++ b/test/unit/mdc-dialog/foundation.test.js @@ -54,7 +54,7 @@ test('default adapter returns a complete adapter implementation', () => { 'registerDocumentKeydownHandler', 'deregisterDocumentKeydownHandler', 'isScrollable', 'getContentElement', 'getButtonElements', 'notifyYes', 'notifyNo', 'notifyCancel', 'notifyOpening', 'notifyOpened', 'notifyClosing', 'notifyClosed', - 'trapFocusOnSurface', 'untrapFocusOnSurface', 'isDialog', + 'trapFocusOnSurface', 'untrapFocusOnSurface', ]); }); @@ -163,9 +163,7 @@ test('#open adds scroll lock class to the body', () => { test('#close removes the scroll lock class from the body', () => { const {foundation, mockAdapter} = setupTest(); - td.when(mockAdapter.isDialog(td.matchers.isA(Object))).thenReturn(true); foundation.open(); - td.when(mockAdapter.isDialog(td.matchers.isA(Object))).thenReturn(true); foundation.close(); td.verify(mockAdapter.removeBodyClass(cssClasses.SCROLL_LOCK)); @@ -175,7 +173,6 @@ test('#open activates focus trapping on the dialog surface', () => { const {foundation, mockAdapter} = setupTest(); const clock = lolex.install(); - td.when(mockAdapter.isDialog(td.matchers.isA(Object))).thenReturn(true); foundation.open(); clock.tick(numbers.DIALOG_ANIMATION_TIME_MS); @@ -415,6 +412,6 @@ test('on document keydown does nothing when key other than escape is pressed', ( test('should clean up transition handlers after dialog close', () => { const {foundation, mockAdapter} = setupTest(); - td.when(mockAdapter.isDialog(td.matchers.isA(Object))).thenReturn(true); foundation.close(); + // TODO(acdvorak): Write this test }); diff --git a/test/unit/mdc-dialog/mdc-dialog.test.js b/test/unit/mdc-dialog/mdc-dialog.test.js index 8713e5b231b..e19dc7b229d 100644 --- a/test/unit/mdc-dialog/mdc-dialog.test.js +++ b/test/unit/mdc-dialog/mdc-dialog.test.js @@ -307,14 +307,3 @@ test('adapter#untrapFocusOnSurface calls deactivate() on a properly configured f td.verify(fakeFocusTrapInstance.deactivate()); }); - -test('adapter#isDialog returns true for the dialog surface element', () => { - const {root, component} = setupTest(); - const dialog = root.querySelector(strings.CONTAINER_SELECTOR); - assert.isOk(component.getDefaultFoundation().adapter_.isDialog(dialog)); -}); - -test('adapter#isDialog returns false for a non-dialog surface element', () => { - const {root, component} = setupTest(); - assert.isNotOk(component.getDefaultFoundation().adapter_.isDialog(root)); -}); From ea64e8ed1ee750f264e4a399dddcd3a4dadbbf4f Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 10:28:58 -0700 Subject: [PATCH 080/219] WIP: Delete old dialog demos --- demos/dialog.html | 212 ----------------------------------------- demos/dialog.scss | 28 ------ demos/index.html | 7 -- demos/theme/index.html | 25 ----- 4 files changed, 272 deletions(-) delete mode 100644 demos/dialog.html delete mode 100644 demos/dialog.scss diff --git a/demos/dialog.html b/demos/dialog.html deleted file mode 100644 index 02411daa720..00000000000 --- a/demos/dialog.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - Dialog - Material Components Catalog - - - - - - - - - - -
      -
      -
      - - Dialog -
      -
      -
      -
      -
      -
      - -
      - -
      - - - -
      -
      - - - -
      -
      - -
      - - - -
      -
      -
      - -
      -
      -
      - - - - - diff --git a/demos/dialog.scss b/demos/dialog.scss deleted file mode 100644 index 674bc47cc0e..00000000000 --- a/demos/dialog.scss +++ /dev/null @@ -1,28 +0,0 @@ -// -// Copyright 2017 Google Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions:// -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software.// -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -@import "./common"; -@import "../packages/mdc-button/mdc-button"; -@import "../packages/mdc-checkbox/mdc-checkbox"; -@import "../packages/mdc-dialog/mdc-dialog"; -@import "../packages/mdc-form-field/mdc-form-field"; -@import "../packages/mdc-list/mdc-list"; diff --git a/demos/index.html b/demos/index.html index 31da84245f9..901d83b72b3 100644 --- a/demos/index.html +++ b/demos/index.html @@ -72,13 +72,6 @@ Chips for actions, selection, and input - - - - Dialog - Implements a modal dialog window - - diff --git a/demos/theme/index.html b/demos/theme/index.html index e620631db42..f1027967f14 100644 --- a/demos/theme/index.html +++ b/demos/theme/index.html @@ -437,31 +437,6 @@

-
- -

- Dialog - # -

- - -
-

From 26bc2225f3e3fb4a3affa3a4a0312cf3d3a5fe3e Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 10:37:31 -0700 Subject: [PATCH 081/219] WIP: Revert botched merge --- .../spec/mdc-drawer/classes/modal.html | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/test/screenshot/spec/mdc-drawer/classes/modal.html b/test/screenshot/spec/mdc-drawer/classes/modal.html index 7a99f774f6a..d38194d21cd 100644 --- a/test/screenshot/spec/mdc-drawer/classes/modal.html +++ b/test/screenshot/spec/mdc-drawer/classes/modal.html @@ -65,7 +65,6 @@ Drafts -<<<<<<< HEAD
Labels
@@ -93,36 +92,7 @@
Labels
-======= -
-
Labels
- - - Family - - - - Friends - - - - Work - - -
- - - Settings - - - - Help & feedback - - - - ->>>>>>> feat/dialog
From 9b44e4be8b9abd9932f20c9d06416fceddef2edd Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 10:39:39 -0700 Subject: [PATCH 082/219] WIP: Remove unnecessary ponyfills --- demos/ponyfill.js | 4 +--- packages/mdc-base/ponyfill.js | 4 +--- test/unit/mdc-base/ponyfill.test.js | 2 -- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/demos/ponyfill.js b/demos/ponyfill.js index 0d938cd90d9..6b61c0d6e40 100644 --- a/demos/ponyfill.js +++ b/demos/ponyfill.js @@ -59,9 +59,7 @@ export function objectEntries(obj) { export function matches(elem, selector) { const nativeMatches = elem.matches || elem.webkitMatchesSelector - || elem.mozMatchesSelector - || elem.msMatchesSelector - || elem.oMatchesSelector; + || elem.msMatchesSelector; return nativeMatches.call(elem, selector); } diff --git a/packages/mdc-base/ponyfill.js b/packages/mdc-base/ponyfill.js index 5e102dcf2d0..fce2fd201d1 100644 --- a/packages/mdc-base/ponyfill.js +++ b/packages/mdc-base/ponyfill.js @@ -34,9 +34,7 @@ function matches(elem, selector) { const nativeMatches = elem.matches || elem.webkitMatchesSelector - || elem.mozMatchesSelector - || elem.msMatchesSelector - || elem.oMatchesSelector; + || elem.msMatchesSelector; return nativeMatches.call(elem, selector); } diff --git a/test/unit/mdc-base/ponyfill.test.js b/test/unit/mdc-base/ponyfill.test.js index c1eae5db2ed..7214057630e 100644 --- a/test/unit/mdc-base/ponyfill.test.js +++ b/test/unit/mdc-base/ponyfill.test.js @@ -41,7 +41,5 @@ test('#matches returns false when the selector does not match the element', () = test('#matches supports vendor prefixes', () => { assert.isTrue(matches({matches: () => true}, '')); assert.isTrue(matches({webkitMatchesSelector: () => true}, '')); - assert.isTrue(matches({mozMatchesSelector: () => true}, '')); assert.isTrue(matches({msMatchesSelector: () => true}, '')); - assert.isTrue(matches({oMatchesSelector: () => true}, '')); }); From c7fb329e6ca37124f26e8606da340567e556c2c9 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 10:51:04 -0700 Subject: [PATCH 083/219] WIP: Revert accidental changes to `mdc-drawer` screenshots --- test/screenshot/golden.json | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index 2f406bb84de..de5ff5516bb 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -261,48 +261,48 @@ } }, "spec/mdc-drawer/classes/dismissible.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html?utm_source=golden_json", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/dismissible.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/dismissible.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/dismissible.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/dismissible.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/dismissible.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/dismissible.html.windows_ie_11.png" } }, "spec/mdc-drawer/classes/modal.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html?utm_source=golden_json", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/modal.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/modal.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/modal.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/modal.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/modal.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/modal.html.windows_ie_11.png" } }, "spec/mdc-drawer/classes/permanent.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html?utm_source=golden_json", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/permanent.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/classes/permanent.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/permanent.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/permanent.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/permanent.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/classes/permanent.html.windows_ie_11.png" } }, "spec/mdc-drawer/mixins/fill-color-accessible.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html?utm_source=golden_json", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color-accessible.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color-accessible.html.windows_ie_11.png" } }, "spec/mdc-drawer/mixins/fill-color.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html?utm_source=golden_json", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color.html", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/15_17_38_297/spec/mdc-drawer/mixins/fill-color.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/29/10_31_51_582/spec/mdc-drawer/mixins/fill-color.html.windows_ie_11.png" } }, "spec/mdc-elevation/classes/baseline-large.html": { From 7c4bfb2a5fe1130b1892a1624c5e7cf4e6a35be1 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 10:51:52 -0700 Subject: [PATCH 084/219] WIP: Fix linter error --- test/unit/mdc-dialog/foundation.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/mdc-dialog/foundation.test.js b/test/unit/mdc-dialog/foundation.test.js index b740f7bc644..79cb8cd91be 100644 --- a/test/unit/mdc-dialog/foundation.test.js +++ b/test/unit/mdc-dialog/foundation.test.js @@ -411,7 +411,7 @@ test('on document keydown does nothing when key other than escape is pressed', ( }); test('should clean up transition handlers after dialog close', () => { - const {foundation, mockAdapter} = setupTest(); + const {foundation} = setupTest(); foundation.close(); // TODO(acdvorak): Write this test }); From 97f2a2adfb33c2074609f48d528b2ef8011fee62 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Wed, 29 Aug 2018 11:07:28 -0700 Subject: [PATCH 085/219] WIP: Add "Open" button to test pages --- test/screenshot/spec/fixture.scss | 6 ++++++ .../screenshot/spec/mdc-dialog/classes/baseline-alert.html | 7 +++++-- .../spec/mdc-dialog/classes/baseline-confirmation.html | 7 +++++-- .../spec/mdc-dialog/classes/baseline-simple.html | 7 +++++-- .../mdc-dialog/classes/overflow-accessible-font-size.html | 7 +++++-- test/screenshot/spec/mdc-dialog/classes/overflow.html | 7 +++++-- .../spec/mdc-dialog/classes/scrollable-bottom.html | 7 +++++-- .../screenshot/spec/mdc-dialog/classes/scrollable-top.html | 7 +++++-- test/screenshot/spec/mdc-dialog/fixture.js | 5 +++++ 9 files changed, 46 insertions(+), 14 deletions(-) diff --git a/test/screenshot/spec/fixture.scss b/test/screenshot/spec/fixture.scss index d3a3c009848..dee78cdd5c4 100644 --- a/test/screenshot/spec/fixture.scss +++ b/test/screenshot/spec/fixture.scss @@ -101,6 +101,12 @@ $test-layout-cell-grid-color: #dddddd; content: "ERROR: Content overflows mobile viewport!"; } +.test-viewport--center { + display: flex; + align-items: center; + justify-content: center; +} + .test-layout { display: flex; flex-wrap: wrap; diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html b/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html index a06d801e7e3..f882f928466 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html @@ -35,13 +35,16 @@ -
+
+ +

- - - -
+
+
+ Alert +
+
+ + +
+
diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html b/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html index 53cfd806dc5..3a7d085bcbc 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html @@ -48,56 +48,58 @@ id="test-dialog">
-

- Confirmation -

-
+
+

+ Confirmation +

+
- -
    -
  • - -
    - -
    -
    -
    + +
      +
    • + +
      + +
      +
      +
      +
      -
    - - -
  • -
  • - -
    - -
    -
    -
    + + +
  • +
  • + +
    + +
    +
    +
    +
    -
- - - - + + + + -
-
- - -
+

+
+ + +
+ diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html b/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html index de2913f04c9..528e15adce0 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html @@ -48,28 +48,30 @@ id="test-dialog">
-

- Simple -

-
+
+

+ Simple +

+
- -
    -
  • - network_wifi Wi-Fi -
  • -
  • - bluetooth Bluetooth -
  • -
  • - data_usage Data usage -
  • -
+ +
    +
  • + network_wifi Wi-Fi +
  • +
  • + bluetooth Bluetooth +
  • +
  • + data_usage Data usage +
  • +
-
+
+
diff --git a/test/screenshot/spec/mdc-dialog/classes/manual-window-resize.html b/test/screenshot/spec/mdc-dialog/classes/manual-window-resize.html index e238aa127fd..437b690d5e8 100644 --- a/test/screenshot/spec/mdc-dialog/classes/manual-window-resize.html +++ b/test/screenshot/spec/mdc-dialog/classes/manual-window-resize.html @@ -48,25 +48,27 @@ id="test-dialog">
-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. -

-
-

Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

-

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

-

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed

-
-
- - - -
+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. +

+
+

Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

+

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

+

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed

+
+
+ + + +
+
diff --git a/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html b/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html index b16c93c0728..417cd22a0fb 100644 --- a/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html +++ b/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html @@ -48,71 +48,73 @@ id="test-dialog">
-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. -

-
-

Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

-

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

-

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed est. Morbi pulvinar odio sed neque pharetra, nec feugiat arcu ullamcorper. Nam orci nisl, dapibus nec arcu ac, molestie cursus massa. Quisque vestibulum et ligula sed lacinia. Quisque tincidunt est id aliquet suscipit. Nulla facilisi

-

Nulla pretium arcu volutpat aliquet aliquet. Vivamus at ultricies massa. Mauris imperdiet orci vitae quam viverra, eget condimentum ex finibus. Nulla vestibulum velit tellus, ac malesuada dolor interdum eu. Etiam tincidunt massa non ornare venenatis. Quisque tincidunt tempor vehicula. Mauris ac neque consequat, ornare mi a, congue dui. Ut eu lorem semper augue posuere sodales et ut tortor. Suspendisse nec commodo nulla. Morbi accumsan mollis dui, posuere iaculis diam rutrum vel. Curabitur eu eros eget sem convallis porttitor

-

Nullam convallis eros ut fringilla semper. Suspendisse euismod elit vel libero elementum blandit non in augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus, metus quis finibus faucibus, mi mauris condimentum mauris, vitae ullamcorper risus nibh vel est. Sed euismod fringilla purus, vestibulum sodales sem egestas congue. Aliquam quis faucibus turpis. Mauris faucibus sapien at sem maximus accumsan

-

Nam ac commodo massa, vel congue nulla. Maecenas sed nisl dui. Morbi tincidunt lacinia volutpat. Nullam ut turpis eget augue tincidunt rutrum nec interdum odio. Donec convallis sapien velit, sit amet fringilla risus luctus a. In ut nibh fermentum, hendrerit nisi ut, rutrum arcu. Integer eu urna lacus. Cras gravida venenatis purus nec congue. Integer consectetur leo et nisl tincidunt malesuada. In id faucibus libero, vitae scelerisque nulla

-

Curabitur non sapien mauris. Etiam pharetra risus non luctus malesuada. Ut sagittis nunc nibh. Vestibulum vestibulum sapien justo, eu tristique augue pretium at. Proin odio turpis, porttitor eget tincidunt ac, convallis quis metus. Praesent dignissim nulla at vestibulum sollicitudin. Vivamus finibus aliquet facilisis. Vivamus ultrices augue et velit tempus malesuada. Sed convallis odio in quam feugiat malesuada. Ut quis justo lorem. Nullam bibendum ante sem, vel efficitur magna interdum quis. Curabitur quis suscipit lacus. Nam vitae velit pellentesque, varius erat lacinia, blandit lorem. Integer sed maximus nibh, eget ullamcorper velit. Morbi pellentesque dui massa, nec pellentesque lectus rhoncus a

-

Morbi id enim quis magna sagittis vulputate. Maecenas ultricies arcu sit amet arcu suscipit consectetur. Nam ligula massa, volutpat quis lectus a, tempus posuere nisl. Donec quis ullamcorper tortor. Nunc vitae est vitae turpis imperdiet consectetur. In auctor orci finibus urna lobortis, et iaculis leo lobortis. Maecenas nisi metus, euismod ut venenatis vestibulum, tempor sed velit. Donec dolor tellus, pharetra eget lorem a, vehicula rutrum odio. Cras ultricies sit amet lacus porta gravida. In quis est at elit condimentum laoreet

-

Praesent venenatis at mi a molestie. Nulla pellentesque pharetra dolor, a gravida mauris laoreet in. Nam luctus iaculis dolor, sed cursus justo bibendum non. Cras eget vestibulum tellus. In velit sapien, tempor et vestibulum et, sodales non ligula. Maecenas risus orci, bibendum quis lacus id, interdum mattis purus. Vivamus ex ligula, maximus eget rhoncus ut, aliquam at erat. Aliquam id leo fringilla, finibus est eget, cursus urna. Suspendisse potenti. Sed sagittis, ex non malesuada blandit, diam sem pharetra mi, in pellentesque dolor libero sit amet lacus. Aenean suscipit blandit consequat. Curabitur fermentum ac nibh condimentum mollis. Proin ac mi non eros tincidunt interdum quis vitae enim. Suspendisse suscipit id nibh sit amet elementum. Integer sagittis turpis erat, in varius elit interdum eu

-

Fusce eu varius justo. Proin in lorem luctus, bibendum dui sed, pulvinar mi. Phasellus sed erat mauris. Curabitur quam magna, porttitor sodales pellentesque blandit, eleifend at dolor. Quisque porta ac arcu vitae interdum. Nulla tempor facilisis diam, ac efficitur magna sodales non. Fusce nisi mi, fermentum nec diam id, cursus malesuada nulla. In ultricies sodales mi sollicitudin fermentum. Pellentesque et convallis nunc. Praesent arcu nunc, viverra ac congue in, laoreet sed ex. Suspendisse a neque dapibus, posuere sapien in, malesuada dui. Praesent aliquam venenatis ante, at posuere ligula molestie in. Pellentesque bibendum urna ac felis mattis, aliquet dignissim tellus porttitor. Praesent vitae mauris vehicula, lacinia augue a, sagittis diam

-

Quisque placerat lacus et quam pulvinar gravida. Integer rhoncus ante in nunc facilisis, et lobortis odio vehicula. Duis interdum nulla ligula, ac molestie nibh congue sed. Donec ac tincidunt ante. Etiam quis tortor blandit, feugiat enim eu, posuere orci. Donec sem eros, ullamcorper a leo nec, maximus ullamcorper ipsum. Pellentesque volutpat, felis ut rhoncus euismod, purus turpis hendrerit ipsum, at venenatis nisi erat id tellus. Nullam nisi enim, tincidunt eget tortor et, consequat commodo nibh. Phasellus porttitor neque at nisi tincidunt, eget ultricies felis maximus. Nullam ex lorem, accumsan ut rutrum et, cursus sit amet neque

-

Nullam pharetra ipsum quis risus condimentum, at pretium libero commodo. Sed porta ante sed iaculis pellentesque. Praesent nec pretium ligula. Etiam porttitor fringilla justo sed vestibulum. Ut elementum tortor dolor, quis pretium leo porta at. In tempor diam ac lorem suscipit, non interdum purus tristique. Morbi vitae pharetra risus

-

Fusce volutpat semper nisl, a efficitur nisl tempor in. Proin non eros mollis, eleifend risus ac, bibendum tortor. Mauris porta odio vel ultricies ullamcorper. Phasellus volutpat velit lorem, nec lobortis nisi blandit ac. Nunc ligula massa, iaculis vitae molestie eu, fermentum ac libero. Morbi ut ipsum eget nisl consequat imperdiet. Etiam eu erat sed nisl viverra egestas. Phasellus rhoncus neque lacus, ac rutrum urna mattis sed. Donec quis lectus odio

-

Aenean congue ipsum a eros gravida aliquet. Aliquam condimentum ex sit amet eros venenatis, vitae tempor ligula fringilla. Suspendisse tempus diam id enim consequat auctor. Morbi ac arcu sit amet turpis imperdiet ornare. Aliquam molestie at ipsum at venenatis. Nulla rutrum purus tincidunt libero viverra hendrerit. Suspendisse vestibulum sapien sodales, ornare diam vel, ornare magna. Morbi non mi in erat feugiat imperdiet nec at diam. Aliquam fringilla pellentesque aliquam. Suspendisse non mi vestibulum mi lacinia cursus. Integer pellentesque rutrum libero quis gravida. Nulla facilisis, purus ut dapibus pretium, leo ipsum efficitur enim, vulputate elementum lectus felis ac ante

-

Aliquam eu placerat dolor. Mauris rhoncus porta euismod. Sed quis mauris feugiat, tempor mauris eget, eleifend elit. Nulla interdum fringilla vehicula. Phasellus varius auctor urna eget tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas luctus consequat magna, sit amet facilisis lorem maximus dapibus. Sed venenatis tortor quis nisl dignissim feugiat id eget neque. Suspendisse posuere molestie elit, et blandit justo placerat eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit

-

Nullam pretium diam eu arcu tincidunt sollicitudin. Mauris finibus urna a maximus tristique. Donec quis lacus mauris. Donec consequat interdum diam, nec posuere eros. Pellentesque ultricies ligula sit amet aliquam mollis. Fusce justo mi, ultricies nec est vel, commodo consequat felis. Phasellus nec felis a est malesuada malesuada quis vitae enim. Cras hendrerit libero felis, at mattis eros ultricies vestibulum

-

Nulla nec blandit sapien. Fusce et tellus eu diam fermentum egestas blandit in erat. Etiam dictum nibh ac elit pulvinar congue. Nunc feugiat odio sodales orci ornare, et volutpat sem sollicitudin. Fusce id risus et lacus fringilla luctus. Praesent porttitor rhoncus lectus. Pellentesque vitae egestas dolor, vitae maximus felis

-

In mauris enim, vehicula in lectus non, feugiat varius est. Nam elementum ipsum erat, quis tristique neque tincidunt at. Integer sed porta urna. Vivamus eu lacinia metus. Quisque id posuere odio. Vivamus mattis sem nec leo hendrerit, ut sollicitudin sem faucibus. Quisque id justo velit

-

Integer molestie, ex ac vulputate ultricies, ante dui mollis urna, sit amet commodo urna felis a mauris. Sed augue ex, commodo non rhoncus eget, posuere ornare nunc. Cras sed quam lorem. Nam id dapibus turpis. Cras eget venenatis urna, sollicitudin faucibus ex. Maecenas diam lacus, ultricies vel neque gravida, pulvinar euismod lacus. In facilisis nulla turpis, eget interdum nulla lacinia eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce interdum tempor lectus non posuere. Integer finibus a lacus in auctor. Quisque tellus tortor, interdum tincidunt hendrerit vitae, maximus in nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus vehicula magna non risus sagittis, sed elementum diam finibus

-

Etiam justo erat, blandit a mauris eget, placerat porttitor diam. Phasellus consequat et lectus sit amet cursus. Vivamus purus ipsum, lobortis quis faucibus vitae, consectetur id orci. In mattis consectetur faucibus. Etiam rutrum venenatis massa sed molestie. Duis enim nibh, mattis ut malesuada venenatis, sollicitudin sit amet metus. Nunc luctus rutrum mi, in tempor urna viverra nec. Fusce feugiat risus ac dapibus tincidunt. Integer vel elit libero. Ut at nunc eget nulla vestibulum congue ut quis ipsum. Aliquam elementum commodo erat et auctor. Nulla condimentum sit amet diam eget consequat. Vivamus molestie laoreet risus vitae egestas. Phasellus sed pretium orci, sit amet porta lorem

-

Vestibulum eu lacinia est. Suspendisse eu iaculis odio, in tincidunt mauris. Mauris ultrices, ligula vulputate egestas imperdiet, tortor neque pulvinar lorem, vel volutpat enim leo nec dolor. Duis eleifend commodo feugiat. Nam consectetur ac erat vitae luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam hendrerit fringilla mattis. Sed mauris orci, bibendum at gravida sed, consectetur eget massa

-

Morbi fringilla tortor nisl, non rhoncus nisi varius tincidunt. Praesent scelerisque, orci vel tempor viverra, enim elit porttitor dolor, vitae condimentum elit eros vitae neque. Maecenas viverra neque at enim tempor, sit amet ullamcorper risus interdum. Praesent quis efficitur elit. Integer posuere, est ac porttitor scelerisque, orci elit lobortis velit, tincidunt pharetra mi magna et dui. Nullam scelerisque sem nec sapien imperdiet aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus

-

Sed vehicula dolor pulvinar consequat pretium. Mauris varius ut nibh sed consequat. Nunc congue libero non molestie euismod. Ut ac sagittis diam, a cursus elit. Quisque semper ac tellus non suscipit. Etiam lacus lectus, commodo et enim quis, lacinia tincidunt metus. Donec cursus felis et malesuada sodales. Donec tempor ligula in est vulputate faucibus

-

Aliquam erat volutpat. Mauris sed fringilla lacus. Nulla eu eros ac nisi pharetra molestie. Sed condimentum magna aliquam est fermentum, pretium ornare diam pellentesque. Duis nec odio sapien. Mauris eget risus ligula. Sed nec nunc consequat, venenatis dolor et, mollis risus. Nulla facilisi. Vestibulum id felis velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit

-

Fusce dictum nisl et lacus pharetra, at tincidunt mauris interdum. Maecenas ac odio in arcu ullamcorper pulvinar eu eget tortor. Duis laoreet libero sit amet massa ornare, sit amet pellentesque justo viverra. Morbi nec justo metus. Integer porttitor nunc a dolor cursus, et congue libero lobortis. Fusce imperdiet posuere nisi, et mattis arcu vestibulum ut. Etiam non dui et felis egestas ullamcorper quis eget nisi. Vestibulum vitae lorem a diam lacinia dictum. Aliquam sagittis velit est, vitae vehicula felis vestibulum vulputate. Etiam gravida urna id ligula scelerisque fringilla. Praesent orci mauris, congue eu lectus et, imperdiet convallis felis. Pellentesque sollicitudin felis nec porttitor sollicitudin. Phasellus at convallis urna. Morbi auctor ipsum eget risus convallis tempus. Cras porta ipsum interdum, rutrum ipsum nec, porta magna

-

Duis pharetra ligula ac libero vulputate, vel gravida orci venenatis. Fusce fermentum nisl nec maximus posuere. Morbi ac porta diam. Curabitur laoreet maximus maximus. Curabitur porttitor turpis sit amet elementum eleifend. Aliquam erat volutpat. Vestibulum dictum ipsum est, non mollis mauris porttitor id. Morbi condimentum, ante sit amet venenatis gravida, justo magna commodo diam, at faucibus enim nibh ut risus. Curabitur cursus imperdiet mattis. Nullam convallis augue in lorem consequat aliquet. Suspendisse blandit ut velit eu fringilla. Vestibulum vel lacinia eros. Suspendisse sit amet venenatis metus

-

Aenean vel suscipit tortor. Aenean iaculis magna in viverra rhoncus. Integer ornare vitae lacus vitae sagittis. Fusce ac ligula vitae tortor sollicitudin auctor. Quisque urna elit, tincidunt quis leo eget, porta tempus arcu. Cras porttitor tempus enim, non suscipit nisi. Suspendisse porta metus eget sapien blandit, quis commodo odio ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque ullamcorper convallis nulla iaculis imperdiet. Curabitur et urna ut massa interdum viverra sit amet eget mauris. Vestibulum sed sem ac est iaculis mattis et non eros. Aenean quis sem feugiat, pretium mi ac, consequat urna. Mauris lacinia rutrum mauris, ut ullamcorper nisi imperdiet vel. Sed ac dignissim lacus. Vestibulum ex neque, interdum quis massa id, posuere vestibulum odio. Cras ut diam sed augue aliquet auctor

-

Aliquam mauris augue, tristique sed varius dignissim, euismod et nibh. Nullam faucibus, nisi a tincidunt venenatis, nibh neque faucibus tortor, eu convallis magna nisi et tortor. Cras molestie sapien ipsum, quis hendrerit ipsum vulputate eu. Fusce dui risus, mattis at aliquam a, condimentum malesuada sem. Fusce urna dolor, consectetur interdum ultricies in, dignissim a mi. Praesent sit amet nulla iaculis, maximus dolor in, pulvinar dui. Fusce placerat efficitur augue id consectetur. Integer pulvinar dictum molestie. Suspendisse potenti. Suspendisse aliquam lectus ut varius luctus. Sed placerat tempor nunc et tincidunt. Proin euismod eros eu ex tincidunt, a euismod felis euismod

-

Suspendisse euismod metus ut nisi porta, in fermentum nisl fermentum. Donec luctus sagittis sem sed posuere. Donec at commodo dui, sed pharetra urna. Morbi laoreet ligula et semper pellentesque. Donec commodo dictum ipsum, pretium cursus est eleifend ac. Etiam a orci at tellus commodo bibendum et ac diam. Aenean consectetur, felis eu pretium pulvinar, nisl metus iaculis nisl, tempor lacinia magna mauris nec metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam nec nibh eget dolor cursus tincidunt

-

Integer vestibulum dolor quis neque maximus, ac gravida ligula varius. Proin vulputate ante eget ligula lacinia laoreet. Vivamus tempus sagittis auctor. Fusce imperdiet a odio ac euismod. Vestibulum lacus tellus, consectetur quis eros ut, interdum eleifend neque. Praesent ex sem, aliquam eget vulputate vehicula, dapibus in massa. Duis a efficitur enim

-

Ut ipsum tortor, pellentesque nec mollis pulvinar, condimentum nec nisi. Quisque pretium, quam sed finibus consequat, ex justo dignissim enim, vel mattis felis lorem vel diam. Duis cursus, velit at iaculis dictum, ipsum odio pretium risus, venenatis ultricies elit odio quis eros. Mauris odio libero, eleifend in mi nec, efficitur malesuada magna. Praesent auctor pellentesque sem semper dignissim. Etiam ut urna lacus. In quis gravida felis

-

Sed lacinia non urna ac condimentum. Integer feugiat vehicula lacus, quis aliquet turpis. Cras vel nisl sit amet lorem bibendum egestas. Phasellus in elementum lectus, sed egestas dolor. Vestibulum et velit volutpat, vulputate sapien sed, ullamcorper felis. Nam eu viverra augue. Aenean egestas, massa et ullamcorper imperdiet, ante purus condimentum erat, nec viverra lectus massa non dolor. Sed nibh tellus, convallis sed ligula eget, convallis pulvinar felis. Vivamus euismod id eros eget vestibulum. Morbi mattis est vitae consectetur pellentesque. Praesent suscipit in turpis ut feugiat. Sed facilisis consequat urna nec faucibus. Mauris sodales tortor nibh, id tempor urna cursus ut

-

Etiam et orci quis nibh varius placerat. Maecenas convallis metus magna, et auctor ligula mattis et. Curabitur id sapien vitae neque ullamcorper ultricies. Etiam nisl felis, cursus quis nisl sit amet, euismod hendrerit nisl. Vivamus vestibulum aliquam risus, nec euismod libero viverra vitae. In sit amet cursus arcu. Sed ullamcorper id urna vel rhoncus. Nunc auctor porttitor nibh, eu accumsan lectus gravida eget. Nullam posuere arcu in ex volutpat auctor efficitur vel neque. Curabitur id ante suscipit, dictum eros feugiat, iaculis dui. Fusce hendrerit mauris ac libero malesuada efficitur. Morbi a ultrices nulla, vitae rutrum lorem. Maecenas vel ligula tempus, sagittis dui eget, congue est. Phasellus sit amet laoreet ex

-

Nulla facilisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales diam a pharetra hendrerit. Nulla rutrum vehicula eros vel ultrices. Aliquam imperdiet sagittis leo, nec ullamcorper orci tempor in. Aliquam luctus ut nulla at eleifend. Duis sapien lorem, consequat a nisl semper, rhoncus aliquet sapien. Sed in velit posuere, tincidunt ex vitae, congue turpis. Nam sollicitudin dolor elit, non finibus arcu porta et. Sed efficitur metus justo, et faucibus justo viverra eu. Etiam porttitor convallis turpis, non gravida nulla tempus quis. Nulla lobortis venenatis purus, sed porttitor dolor fringilla et. Morbi porta lectus non erat sollicitudin rhoncus. Proin pretium placerat vehicula. Morbi et nibh elementum dolor egestas efficitur

-

Cras ornare eros ac elit cursus, eget ornare nulla ullamcorper. Sed arcu urna, sagittis luctus lacus eu, mattis eleifend massa. Sed condimentum lorem sit amet luctus elementum. Morbi et quam in nunc elementum hendrerit rutrum fringilla lorem. Phasellus rhoncus diam tellus, nec porta arcu eleifend ac. Etiam justo massa, egestas sit amet magna vel, maximus faucibus dui. Ut imperdiet mollis nisi, ac lobortis nibh pharetra at. Cras bibendum, arcu ut sollicitudin imperdiet, nulla mi venenatis enim, a blandit orci nisi vitae nibh

-

Donec congue, sem a accumsan ultricies, lacus metus lacinia dui, eget hendrerit felis eros id nulla. Donec varius mi vel blandit ultrices. Duis in lorem orci. Duis rutrum nisl eu varius faucibus. Sed quis vestibulum purus. Donec facilisis magna turpis. Nam quis nulla luctus, sagittis ligula eu, venenatis eros. Nulla facilisi. Sed non mauris dictum, commodo diam in, mollis est. In nec urna vehicula, sagittis justo posuere, condimentum metus. Aliquam commodo nulla quis volutpat porttitor. Quisque vel massa vulputate, tincidunt diam sit amet, commodo justo

-

Mauris iaculis dui eu dolor euismod pretium. Nulla facilisi. Duis nisl elit, commodo vitae diam in, dapibus ultricies sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque ultrices congue magna, mollis ultrices tellus suscipit sed. Phasellus ultrices sem ex. Vestibulum ut turpis quis eros interdum viverra. Nunc ullamcorper imperdiet tellus, nec consequat velit viverra eu. Nulla facilisi. Nulla quis lobortis lacus, et ultricies lectus. Quisque volutpat venenatis massa, id fermentum metus. Duis efficitur nisl eu posuere mattis. Integer nec ipsum quis turpis pretium luctus

-

Nulla vitae neque auctor, consequat massa quis, molestie felis. Fusce pellentesque semper aliquam. Ut semper, dolor quis accumsan dictum, lacus urna bibendum diam, quis faucibus orci risus quis ipsum. Nullam venenatis metus ac diam rutrum, non tincidunt lacus gravida. Maecenas ac pellentesque justo. Praesent in auctor urna, ac vestibulum leo. Cras ut volutpat lacus, eu porta metus

-

Integer egestas hendrerit libero eget euismod. Maecenas eleifend erat sit amet ipsum finibus, sit amet finibus est tincidunt. Etiam auctor dui ac urna mollis auctor. Cras vehicula enim non cursus tristique. Ut sed enim viverra, malesuada dui in, tempus tortor. Suspendisse potenti. Integer vestibulum blandit cursus

-

Integer ultrices eros quis rutrum molestie. Ut euismod pulvinar eros. Vivamus facilisis laoreet pellentesque. Quisque molestie nec dolor ut scelerisque. Curabitur finibus ante nisi, ac porttitor mauris mattis eget. Proin cursus lobortis mi non vehicula. Etiam purus ex, porta vel ante eu, vestibulum aliquet augue. Phasellus tempor blandit lectus ac finibus. Sed interdum tellus felis, rhoncus vehicula elit scelerisque vel. Nullam aliquam nisi at tortor pulvinar, a commodo est volutpat. Vestibulum sed iaculis mauris. Cras iaculis molestie orci sed posuere. Vestibulum ac vestibulum sem

-

Vivamus vitae enim et neque venenatis tempus. Curabitur ultricies mi fermentum, pulvinar diam et, tempor eros. Phasellus ornare hendrerit velit quis sollicitudin. Suspendisse ac justo eu orci porttitor varius. In tempus felis eu sagittis suscipit. Nam eu nibh quis leo lacinia commodo sit amet sed nisi. Suspendisse ligula ligula, feugiat sit amet sem sed, rhoncus euismod massa. Etiam non lorem in mauris suscipit faucibus eget nec nisl. Pellentesque placerat dui ut nisi dignissim, ac viverra elit ultricies

-

In at nibh a arcu commodo dignissim. Sed quis sapien congue, suscipit urna quis, posuere enim. Nunc cursus tellus a nisl elementum efficitur. Vestibulum non est vulputate, facilisis ante scelerisque, tristique massa. Pellentesque ante sem, tincidunt at leo sed, faucibus laoreet mi. Morbi nec bibendum sapien. Cras a odio pulvinar, tincidunt tellus sit amet, cursus ligula

-

Nunc sed consequat enim. Duis suscipit nunc quis velit tincidunt, in suscipit erat accumsan. Mauris tristique ornare nisl, ut egestas ante. Donec ac semper ipsum. Nulla eget dolor lacinia mi dapibus laoreet. Vivamus sed bibendum diam. Praesent tempor massa id dui imperdiet cursus. Sed luctus risus nec dapibus tristique. Aliquam accumsan nisi vitae commodo accumsan. Duis commodo nibh sed erat tincidunt, in pretium nibh suscipit. Suspendisse at interdum arcu, at posuere lacus. Vestibulum accumsan iaculis porta. Nam justo odio, euismod ac leo non, viverra auctor sapien

-

Vivamus eget velit ut nunc ultricies porttitor. Fusce vestibulum bibendum laoreet. Praesent tristique arcu in nibh lobortis, eget vestibulum lacus ultricies. In et venenatis augue. Donec quis accumsan ipsum, sit amet euismod lacus. Suspendisse ultricies mattis dolor. Morbi viverra, quam sit amet ornare luctus, nunc quam blandit nisl, et mattis ipsum urna id nulla. Etiam semper risus nec felis lobortis, volutpat accumsan erat interdum. Nulla molestie vel erat a congue. In feugiat vestibulum purus ut commodo. Praesent sagittis turpis ut lacus suscipit ultrices. Suspendisse sed aliquam urna, vestibulum venenatis magna. Aliquam iaculis sed leo vel consectetur. Nunc quis pretium ex. Sed malesuada est ex, et efficitur est feugiat ultricies. Nullam vulputate tortor id rutrum aliquet

-

Integer et magna mi. Integer a quam purus. Nunc blandit ut est id pellentesque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam ligula massa, vel dignissim nulla feugiat a. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam pulvinar feugiat sagittis. Mauris sodales, nisl consequat ullamcorper malesuada, lectus nunc aliquet ipsum, at sollicitudin tellus arcu nec ex. Aenean commodo felis et diam mollis porttitor. Nulla at est et turpis dignissim cursus vel vel arcu. Duis consequat urna ac nisl suscipit, ut rhoncus lectus pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean risus mauris, faucibus quis arcu luctus, hendrerit vestibulum nunc

-

Sed dignissim condimentum massa, et vulputate elit imperdiet ac. Vivamus elementum risus luctus, aliquam elit dignissim, euismod mauris. Nam id tempus ex. Quisque lacinia tincidunt nisl, at bibendum diam congue sed. Donec ex massa, lacinia ut feugiat non, cursus sit amet velit. Maecenas quis suscipit justo. Vestibulum ex magna, scelerisque eget placerat a, consectetur id ante. Pellentesque commodo, purus ut pharetra tincidunt, felis mi fringilla urna, a ultricies lacus nisl ac arcu. Duis molestie vestibulum est, sit amet egestas ipsum sagittis ac. Donec tempor urna sem, pharetra tincidunt ligula faucibus in. Ut eu fringilla ante. Nulla mauris tortor, mattis a ligula bibendum, pharetra euismod neque. Proin sit amet imperdiet nulla. Nam gravida eros in ex gravida vehicula. Nulla a augue nec mauris efficitur bibendum. Aliquam fringilla finibus lectus, sed euismod turpis ullamcorper in

-

Suspendisse rutrum dolor convallis diam vestibulum, vel iaculis leo pulvinar. Quisque consequat orci et ipsum maximus vehicula. Phasellus dignissim ac ante a dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In bibendum ipsum et nibh porttitor, et commodo lacus eleifend. Ut vel semper libero, ac porttitor est. Donec lacus turpis, vestibulum quis congue at, rhoncus feugiat dui

-

Maecenas commodo lectus magna, ac auctor dolor ultrices id. Donec varius mattis pretium. Suspendisse potenti. Nam tempus nisi odio, at pretium risus finibus eu. Vivamus fermentum mi sit amet odio hendrerit, quis condimentum arcu tristique. Praesent id faucibus tortor, eget suscipit sem. Aliquam vestibulum est vel felis semper iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique tincidunt arcu in faucibus. Mauris feugiat in nibh eleifend scelerisque. Proin et turpis ut nibh tincidunt ornare eu vitae lorem. Nunc et suscipit massa, ac dignissim erat. Aliquam imperdiet vestibulum dignissim. Integer scelerisque felis ante, id vehicula velit pharetra et. Suspendisse condimentum eget ante vel egestas. Morbi pellentesque ante et nunc gravida cursus

-

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

-
-
- - - -
+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. +

+
+

Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

+

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

+

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed est. Morbi pulvinar odio sed neque pharetra, nec feugiat arcu ullamcorper. Nam orci nisl, dapibus nec arcu ac, molestie cursus massa. Quisque vestibulum et ligula sed lacinia. Quisque tincidunt est id aliquet suscipit. Nulla facilisi

+

Nulla pretium arcu volutpat aliquet aliquet. Vivamus at ultricies massa. Mauris imperdiet orci vitae quam viverra, eget condimentum ex finibus. Nulla vestibulum velit tellus, ac malesuada dolor interdum eu. Etiam tincidunt massa non ornare venenatis. Quisque tincidunt tempor vehicula. Mauris ac neque consequat, ornare mi a, congue dui. Ut eu lorem semper augue posuere sodales et ut tortor. Suspendisse nec commodo nulla. Morbi accumsan mollis dui, posuere iaculis diam rutrum vel. Curabitur eu eros eget sem convallis porttitor

+

Nullam convallis eros ut fringilla semper. Suspendisse euismod elit vel libero elementum blandit non in augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus, metus quis finibus faucibus, mi mauris condimentum mauris, vitae ullamcorper risus nibh vel est. Sed euismod fringilla purus, vestibulum sodales sem egestas congue. Aliquam quis faucibus turpis. Mauris faucibus sapien at sem maximus accumsan

+

Nam ac commodo massa, vel congue nulla. Maecenas sed nisl dui. Morbi tincidunt lacinia volutpat. Nullam ut turpis eget augue tincidunt rutrum nec interdum odio. Donec convallis sapien velit, sit amet fringilla risus luctus a. In ut nibh fermentum, hendrerit nisi ut, rutrum arcu. Integer eu urna lacus. Cras gravida venenatis purus nec congue. Integer consectetur leo et nisl tincidunt malesuada. In id faucibus libero, vitae scelerisque nulla

+

Curabitur non sapien mauris. Etiam pharetra risus non luctus malesuada. Ut sagittis nunc nibh. Vestibulum vestibulum sapien justo, eu tristique augue pretium at. Proin odio turpis, porttitor eget tincidunt ac, convallis quis metus. Praesent dignissim nulla at vestibulum sollicitudin. Vivamus finibus aliquet facilisis. Vivamus ultrices augue et velit tempus malesuada. Sed convallis odio in quam feugiat malesuada. Ut quis justo lorem. Nullam bibendum ante sem, vel efficitur magna interdum quis. Curabitur quis suscipit lacus. Nam vitae velit pellentesque, varius erat lacinia, blandit lorem. Integer sed maximus nibh, eget ullamcorper velit. Morbi pellentesque dui massa, nec pellentesque lectus rhoncus a

+

Morbi id enim quis magna sagittis vulputate. Maecenas ultricies arcu sit amet arcu suscipit consectetur. Nam ligula massa, volutpat quis lectus a, tempus posuere nisl. Donec quis ullamcorper tortor. Nunc vitae est vitae turpis imperdiet consectetur. In auctor orci finibus urna lobortis, et iaculis leo lobortis. Maecenas nisi metus, euismod ut venenatis vestibulum, tempor sed velit. Donec dolor tellus, pharetra eget lorem a, vehicula rutrum odio. Cras ultricies sit amet lacus porta gravida. In quis est at elit condimentum laoreet

+

Praesent venenatis at mi a molestie. Nulla pellentesque pharetra dolor, a gravida mauris laoreet in. Nam luctus iaculis dolor, sed cursus justo bibendum non. Cras eget vestibulum tellus. In velit sapien, tempor et vestibulum et, sodales non ligula. Maecenas risus orci, bibendum quis lacus id, interdum mattis purus. Vivamus ex ligula, maximus eget rhoncus ut, aliquam at erat. Aliquam id leo fringilla, finibus est eget, cursus urna. Suspendisse potenti. Sed sagittis, ex non malesuada blandit, diam sem pharetra mi, in pellentesque dolor libero sit amet lacus. Aenean suscipit blandit consequat. Curabitur fermentum ac nibh condimentum mollis. Proin ac mi non eros tincidunt interdum quis vitae enim. Suspendisse suscipit id nibh sit amet elementum. Integer sagittis turpis erat, in varius elit interdum eu

+

Fusce eu varius justo. Proin in lorem luctus, bibendum dui sed, pulvinar mi. Phasellus sed erat mauris. Curabitur quam magna, porttitor sodales pellentesque blandit, eleifend at dolor. Quisque porta ac arcu vitae interdum. Nulla tempor facilisis diam, ac efficitur magna sodales non. Fusce nisi mi, fermentum nec diam id, cursus malesuada nulla. In ultricies sodales mi sollicitudin fermentum. Pellentesque et convallis nunc. Praesent arcu nunc, viverra ac congue in, laoreet sed ex. Suspendisse a neque dapibus, posuere sapien in, malesuada dui. Praesent aliquam venenatis ante, at posuere ligula molestie in. Pellentesque bibendum urna ac felis mattis, aliquet dignissim tellus porttitor. Praesent vitae mauris vehicula, lacinia augue a, sagittis diam

+

Quisque placerat lacus et quam pulvinar gravida. Integer rhoncus ante in nunc facilisis, et lobortis odio vehicula. Duis interdum nulla ligula, ac molestie nibh congue sed. Donec ac tincidunt ante. Etiam quis tortor blandit, feugiat enim eu, posuere orci. Donec sem eros, ullamcorper a leo nec, maximus ullamcorper ipsum. Pellentesque volutpat, felis ut rhoncus euismod, purus turpis hendrerit ipsum, at venenatis nisi erat id tellus. Nullam nisi enim, tincidunt eget tortor et, consequat commodo nibh. Phasellus porttitor neque at nisi tincidunt, eget ultricies felis maximus. Nullam ex lorem, accumsan ut rutrum et, cursus sit amet neque

+

Nullam pharetra ipsum quis risus condimentum, at pretium libero commodo. Sed porta ante sed iaculis pellentesque. Praesent nec pretium ligula. Etiam porttitor fringilla justo sed vestibulum. Ut elementum tortor dolor, quis pretium leo porta at. In tempor diam ac lorem suscipit, non interdum purus tristique. Morbi vitae pharetra risus

+

Fusce volutpat semper nisl, a efficitur nisl tempor in. Proin non eros mollis, eleifend risus ac, bibendum tortor. Mauris porta odio vel ultricies ullamcorper. Phasellus volutpat velit lorem, nec lobortis nisi blandit ac. Nunc ligula massa, iaculis vitae molestie eu, fermentum ac libero. Morbi ut ipsum eget nisl consequat imperdiet. Etiam eu erat sed nisl viverra egestas. Phasellus rhoncus neque lacus, ac rutrum urna mattis sed. Donec quis lectus odio

+

Aenean congue ipsum a eros gravida aliquet. Aliquam condimentum ex sit amet eros venenatis, vitae tempor ligula fringilla. Suspendisse tempus diam id enim consequat auctor. Morbi ac arcu sit amet turpis imperdiet ornare. Aliquam molestie at ipsum at venenatis. Nulla rutrum purus tincidunt libero viverra hendrerit. Suspendisse vestibulum sapien sodales, ornare diam vel, ornare magna. Morbi non mi in erat feugiat imperdiet nec at diam. Aliquam fringilla pellentesque aliquam. Suspendisse non mi vestibulum mi lacinia cursus. Integer pellentesque rutrum libero quis gravida. Nulla facilisis, purus ut dapibus pretium, leo ipsum efficitur enim, vulputate elementum lectus felis ac ante

+

Aliquam eu placerat dolor. Mauris rhoncus porta euismod. Sed quis mauris feugiat, tempor mauris eget, eleifend elit. Nulla interdum fringilla vehicula. Phasellus varius auctor urna eget tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas luctus consequat magna, sit amet facilisis lorem maximus dapibus. Sed venenatis tortor quis nisl dignissim feugiat id eget neque. Suspendisse posuere molestie elit, et blandit justo placerat eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit

+

Nullam pretium diam eu arcu tincidunt sollicitudin. Mauris finibus urna a maximus tristique. Donec quis lacus mauris. Donec consequat interdum diam, nec posuere eros. Pellentesque ultricies ligula sit amet aliquam mollis. Fusce justo mi, ultricies nec est vel, commodo consequat felis. Phasellus nec felis a est malesuada malesuada quis vitae enim. Cras hendrerit libero felis, at mattis eros ultricies vestibulum

+

Nulla nec blandit sapien. Fusce et tellus eu diam fermentum egestas blandit in erat. Etiam dictum nibh ac elit pulvinar congue. Nunc feugiat odio sodales orci ornare, et volutpat sem sollicitudin. Fusce id risus et lacus fringilla luctus. Praesent porttitor rhoncus lectus. Pellentesque vitae egestas dolor, vitae maximus felis

+

In mauris enim, vehicula in lectus non, feugiat varius est. Nam elementum ipsum erat, quis tristique neque tincidunt at. Integer sed porta urna. Vivamus eu lacinia metus. Quisque id posuere odio. Vivamus mattis sem nec leo hendrerit, ut sollicitudin sem faucibus. Quisque id justo velit

+

Integer molestie, ex ac vulputate ultricies, ante dui mollis urna, sit amet commodo urna felis a mauris. Sed augue ex, commodo non rhoncus eget, posuere ornare nunc. Cras sed quam lorem. Nam id dapibus turpis. Cras eget venenatis urna, sollicitudin faucibus ex. Maecenas diam lacus, ultricies vel neque gravida, pulvinar euismod lacus. In facilisis nulla turpis, eget interdum nulla lacinia eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce interdum tempor lectus non posuere. Integer finibus a lacus in auctor. Quisque tellus tortor, interdum tincidunt hendrerit vitae, maximus in nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus vehicula magna non risus sagittis, sed elementum diam finibus

+

Etiam justo erat, blandit a mauris eget, placerat porttitor diam. Phasellus consequat et lectus sit amet cursus. Vivamus purus ipsum, lobortis quis faucibus vitae, consectetur id orci. In mattis consectetur faucibus. Etiam rutrum venenatis massa sed molestie. Duis enim nibh, mattis ut malesuada venenatis, sollicitudin sit amet metus. Nunc luctus rutrum mi, in tempor urna viverra nec. Fusce feugiat risus ac dapibus tincidunt. Integer vel elit libero. Ut at nunc eget nulla vestibulum congue ut quis ipsum. Aliquam elementum commodo erat et auctor. Nulla condimentum sit amet diam eget consequat. Vivamus molestie laoreet risus vitae egestas. Phasellus sed pretium orci, sit amet porta lorem

+

Vestibulum eu lacinia est. Suspendisse eu iaculis odio, in tincidunt mauris. Mauris ultrices, ligula vulputate egestas imperdiet, tortor neque pulvinar lorem, vel volutpat enim leo nec dolor. Duis eleifend commodo feugiat. Nam consectetur ac erat vitae luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam hendrerit fringilla mattis. Sed mauris orci, bibendum at gravida sed, consectetur eget massa

+

Morbi fringilla tortor nisl, non rhoncus nisi varius tincidunt. Praesent scelerisque, orci vel tempor viverra, enim elit porttitor dolor, vitae condimentum elit eros vitae neque. Maecenas viverra neque at enim tempor, sit amet ullamcorper risus interdum. Praesent quis efficitur elit. Integer posuere, est ac porttitor scelerisque, orci elit lobortis velit, tincidunt pharetra mi magna et dui. Nullam scelerisque sem nec sapien imperdiet aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus

+

Sed vehicula dolor pulvinar consequat pretium. Mauris varius ut nibh sed consequat. Nunc congue libero non molestie euismod. Ut ac sagittis diam, a cursus elit. Quisque semper ac tellus non suscipit. Etiam lacus lectus, commodo et enim quis, lacinia tincidunt metus. Donec cursus felis et malesuada sodales. Donec tempor ligula in est vulputate faucibus

+

Aliquam erat volutpat. Mauris sed fringilla lacus. Nulla eu eros ac nisi pharetra molestie. Sed condimentum magna aliquam est fermentum, pretium ornare diam pellentesque. Duis nec odio sapien. Mauris eget risus ligula. Sed nec nunc consequat, venenatis dolor et, mollis risus. Nulla facilisi. Vestibulum id felis velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit

+

Fusce dictum nisl et lacus pharetra, at tincidunt mauris interdum. Maecenas ac odio in arcu ullamcorper pulvinar eu eget tortor. Duis laoreet libero sit amet massa ornare, sit amet pellentesque justo viverra. Morbi nec justo metus. Integer porttitor nunc a dolor cursus, et congue libero lobortis. Fusce imperdiet posuere nisi, et mattis arcu vestibulum ut. Etiam non dui et felis egestas ullamcorper quis eget nisi. Vestibulum vitae lorem a diam lacinia dictum. Aliquam sagittis velit est, vitae vehicula felis vestibulum vulputate. Etiam gravida urna id ligula scelerisque fringilla. Praesent orci mauris, congue eu lectus et, imperdiet convallis felis. Pellentesque sollicitudin felis nec porttitor sollicitudin. Phasellus at convallis urna. Morbi auctor ipsum eget risus convallis tempus. Cras porta ipsum interdum, rutrum ipsum nec, porta magna

+

Duis pharetra ligula ac libero vulputate, vel gravida orci venenatis. Fusce fermentum nisl nec maximus posuere. Morbi ac porta diam. Curabitur laoreet maximus maximus. Curabitur porttitor turpis sit amet elementum eleifend. Aliquam erat volutpat. Vestibulum dictum ipsum est, non mollis mauris porttitor id. Morbi condimentum, ante sit amet venenatis gravida, justo magna commodo diam, at faucibus enim nibh ut risus. Curabitur cursus imperdiet mattis. Nullam convallis augue in lorem consequat aliquet. Suspendisse blandit ut velit eu fringilla. Vestibulum vel lacinia eros. Suspendisse sit amet venenatis metus

+

Aenean vel suscipit tortor. Aenean iaculis magna in viverra rhoncus. Integer ornare vitae lacus vitae sagittis. Fusce ac ligula vitae tortor sollicitudin auctor. Quisque urna elit, tincidunt quis leo eget, porta tempus arcu. Cras porttitor tempus enim, non suscipit nisi. Suspendisse porta metus eget sapien blandit, quis commodo odio ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque ullamcorper convallis nulla iaculis imperdiet. Curabitur et urna ut massa interdum viverra sit amet eget mauris. Vestibulum sed sem ac est iaculis mattis et non eros. Aenean quis sem feugiat, pretium mi ac, consequat urna. Mauris lacinia rutrum mauris, ut ullamcorper nisi imperdiet vel. Sed ac dignissim lacus. Vestibulum ex neque, interdum quis massa id, posuere vestibulum odio. Cras ut diam sed augue aliquet auctor

+

Aliquam mauris augue, tristique sed varius dignissim, euismod et nibh. Nullam faucibus, nisi a tincidunt venenatis, nibh neque faucibus tortor, eu convallis magna nisi et tortor. Cras molestie sapien ipsum, quis hendrerit ipsum vulputate eu. Fusce dui risus, mattis at aliquam a, condimentum malesuada sem. Fusce urna dolor, consectetur interdum ultricies in, dignissim a mi. Praesent sit amet nulla iaculis, maximus dolor in, pulvinar dui. Fusce placerat efficitur augue id consectetur. Integer pulvinar dictum molestie. Suspendisse potenti. Suspendisse aliquam lectus ut varius luctus. Sed placerat tempor nunc et tincidunt. Proin euismod eros eu ex tincidunt, a euismod felis euismod

+

Suspendisse euismod metus ut nisi porta, in fermentum nisl fermentum. Donec luctus sagittis sem sed posuere. Donec at commodo dui, sed pharetra urna. Morbi laoreet ligula et semper pellentesque. Donec commodo dictum ipsum, pretium cursus est eleifend ac. Etiam a orci at tellus commodo bibendum et ac diam. Aenean consectetur, felis eu pretium pulvinar, nisl metus iaculis nisl, tempor lacinia magna mauris nec metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam nec nibh eget dolor cursus tincidunt

+

Integer vestibulum dolor quis neque maximus, ac gravida ligula varius. Proin vulputate ante eget ligula lacinia laoreet. Vivamus tempus sagittis auctor. Fusce imperdiet a odio ac euismod. Vestibulum lacus tellus, consectetur quis eros ut, interdum eleifend neque. Praesent ex sem, aliquam eget vulputate vehicula, dapibus in massa. Duis a efficitur enim

+

Ut ipsum tortor, pellentesque nec mollis pulvinar, condimentum nec nisi. Quisque pretium, quam sed finibus consequat, ex justo dignissim enim, vel mattis felis lorem vel diam. Duis cursus, velit at iaculis dictum, ipsum odio pretium risus, venenatis ultricies elit odio quis eros. Mauris odio libero, eleifend in mi nec, efficitur malesuada magna. Praesent auctor pellentesque sem semper dignissim. Etiam ut urna lacus. In quis gravida felis

+

Sed lacinia non urna ac condimentum. Integer feugiat vehicula lacus, quis aliquet turpis. Cras vel nisl sit amet lorem bibendum egestas. Phasellus in elementum lectus, sed egestas dolor. Vestibulum et velit volutpat, vulputate sapien sed, ullamcorper felis. Nam eu viverra augue. Aenean egestas, massa et ullamcorper imperdiet, ante purus condimentum erat, nec viverra lectus massa non dolor. Sed nibh tellus, convallis sed ligula eget, convallis pulvinar felis. Vivamus euismod id eros eget vestibulum. Morbi mattis est vitae consectetur pellentesque. Praesent suscipit in turpis ut feugiat. Sed facilisis consequat urna nec faucibus. Mauris sodales tortor nibh, id tempor urna cursus ut

+

Etiam et orci quis nibh varius placerat. Maecenas convallis metus magna, et auctor ligula mattis et. Curabitur id sapien vitae neque ullamcorper ultricies. Etiam nisl felis, cursus quis nisl sit amet, euismod hendrerit nisl. Vivamus vestibulum aliquam risus, nec euismod libero viverra vitae. In sit amet cursus arcu. Sed ullamcorper id urna vel rhoncus. Nunc auctor porttitor nibh, eu accumsan lectus gravida eget. Nullam posuere arcu in ex volutpat auctor efficitur vel neque. Curabitur id ante suscipit, dictum eros feugiat, iaculis dui. Fusce hendrerit mauris ac libero malesuada efficitur. Morbi a ultrices nulla, vitae rutrum lorem. Maecenas vel ligula tempus, sagittis dui eget, congue est. Phasellus sit amet laoreet ex

+

Nulla facilisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales diam a pharetra hendrerit. Nulla rutrum vehicula eros vel ultrices. Aliquam imperdiet sagittis leo, nec ullamcorper orci tempor in. Aliquam luctus ut nulla at eleifend. Duis sapien lorem, consequat a nisl semper, rhoncus aliquet sapien. Sed in velit posuere, tincidunt ex vitae, congue turpis. Nam sollicitudin dolor elit, non finibus arcu porta et. Sed efficitur metus justo, et faucibus justo viverra eu. Etiam porttitor convallis turpis, non gravida nulla tempus quis. Nulla lobortis venenatis purus, sed porttitor dolor fringilla et. Morbi porta lectus non erat sollicitudin rhoncus. Proin pretium placerat vehicula. Morbi et nibh elementum dolor egestas efficitur

+

Cras ornare eros ac elit cursus, eget ornare nulla ullamcorper. Sed arcu urna, sagittis luctus lacus eu, mattis eleifend massa. Sed condimentum lorem sit amet luctus elementum. Morbi et quam in nunc elementum hendrerit rutrum fringilla lorem. Phasellus rhoncus diam tellus, nec porta arcu eleifend ac. Etiam justo massa, egestas sit amet magna vel, maximus faucibus dui. Ut imperdiet mollis nisi, ac lobortis nibh pharetra at. Cras bibendum, arcu ut sollicitudin imperdiet, nulla mi venenatis enim, a blandit orci nisi vitae nibh

+

Donec congue, sem a accumsan ultricies, lacus metus lacinia dui, eget hendrerit felis eros id nulla. Donec varius mi vel blandit ultrices. Duis in lorem orci. Duis rutrum nisl eu varius faucibus. Sed quis vestibulum purus. Donec facilisis magna turpis. Nam quis nulla luctus, sagittis ligula eu, venenatis eros. Nulla facilisi. Sed non mauris dictum, commodo diam in, mollis est. In nec urna vehicula, sagittis justo posuere, condimentum metus. Aliquam commodo nulla quis volutpat porttitor. Quisque vel massa vulputate, tincidunt diam sit amet, commodo justo

+

Mauris iaculis dui eu dolor euismod pretium. Nulla facilisi. Duis nisl elit, commodo vitae diam in, dapibus ultricies sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque ultrices congue magna, mollis ultrices tellus suscipit sed. Phasellus ultrices sem ex. Vestibulum ut turpis quis eros interdum viverra. Nunc ullamcorper imperdiet tellus, nec consequat velit viverra eu. Nulla facilisi. Nulla quis lobortis lacus, et ultricies lectus. Quisque volutpat venenatis massa, id fermentum metus. Duis efficitur nisl eu posuere mattis. Integer nec ipsum quis turpis pretium luctus

+

Nulla vitae neque auctor, consequat massa quis, molestie felis. Fusce pellentesque semper aliquam. Ut semper, dolor quis accumsan dictum, lacus urna bibendum diam, quis faucibus orci risus quis ipsum. Nullam venenatis metus ac diam rutrum, non tincidunt lacus gravida. Maecenas ac pellentesque justo. Praesent in auctor urna, ac vestibulum leo. Cras ut volutpat lacus, eu porta metus

+

Integer egestas hendrerit libero eget euismod. Maecenas eleifend erat sit amet ipsum finibus, sit amet finibus est tincidunt. Etiam auctor dui ac urna mollis auctor. Cras vehicula enim non cursus tristique. Ut sed enim viverra, malesuada dui in, tempus tortor. Suspendisse potenti. Integer vestibulum blandit cursus

+

Integer ultrices eros quis rutrum molestie. Ut euismod pulvinar eros. Vivamus facilisis laoreet pellentesque. Quisque molestie nec dolor ut scelerisque. Curabitur finibus ante nisi, ac porttitor mauris mattis eget. Proin cursus lobortis mi non vehicula. Etiam purus ex, porta vel ante eu, vestibulum aliquet augue. Phasellus tempor blandit lectus ac finibus. Sed interdum tellus felis, rhoncus vehicula elit scelerisque vel. Nullam aliquam nisi at tortor pulvinar, a commodo est volutpat. Vestibulum sed iaculis mauris. Cras iaculis molestie orci sed posuere. Vestibulum ac vestibulum sem

+

Vivamus vitae enim et neque venenatis tempus. Curabitur ultricies mi fermentum, pulvinar diam et, tempor eros. Phasellus ornare hendrerit velit quis sollicitudin. Suspendisse ac justo eu orci porttitor varius. In tempus felis eu sagittis suscipit. Nam eu nibh quis leo lacinia commodo sit amet sed nisi. Suspendisse ligula ligula, feugiat sit amet sem sed, rhoncus euismod massa. Etiam non lorem in mauris suscipit faucibus eget nec nisl. Pellentesque placerat dui ut nisi dignissim, ac viverra elit ultricies

+

In at nibh a arcu commodo dignissim. Sed quis sapien congue, suscipit urna quis, posuere enim. Nunc cursus tellus a nisl elementum efficitur. Vestibulum non est vulputate, facilisis ante scelerisque, tristique massa. Pellentesque ante sem, tincidunt at leo sed, faucibus laoreet mi. Morbi nec bibendum sapien. Cras a odio pulvinar, tincidunt tellus sit amet, cursus ligula

+

Nunc sed consequat enim. Duis suscipit nunc quis velit tincidunt, in suscipit erat accumsan. Mauris tristique ornare nisl, ut egestas ante. Donec ac semper ipsum. Nulla eget dolor lacinia mi dapibus laoreet. Vivamus sed bibendum diam. Praesent tempor massa id dui imperdiet cursus. Sed luctus risus nec dapibus tristique. Aliquam accumsan nisi vitae commodo accumsan. Duis commodo nibh sed erat tincidunt, in pretium nibh suscipit. Suspendisse at interdum arcu, at posuere lacus. Vestibulum accumsan iaculis porta. Nam justo odio, euismod ac leo non, viverra auctor sapien

+

Vivamus eget velit ut nunc ultricies porttitor. Fusce vestibulum bibendum laoreet. Praesent tristique arcu in nibh lobortis, eget vestibulum lacus ultricies. In et venenatis augue. Donec quis accumsan ipsum, sit amet euismod lacus. Suspendisse ultricies mattis dolor. Morbi viverra, quam sit amet ornare luctus, nunc quam blandit nisl, et mattis ipsum urna id nulla. Etiam semper risus nec felis lobortis, volutpat accumsan erat interdum. Nulla molestie vel erat a congue. In feugiat vestibulum purus ut commodo. Praesent sagittis turpis ut lacus suscipit ultrices. Suspendisse sed aliquam urna, vestibulum venenatis magna. Aliquam iaculis sed leo vel consectetur. Nunc quis pretium ex. Sed malesuada est ex, et efficitur est feugiat ultricies. Nullam vulputate tortor id rutrum aliquet

+

Integer et magna mi. Integer a quam purus. Nunc blandit ut est id pellentesque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam ligula massa, vel dignissim nulla feugiat a. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam pulvinar feugiat sagittis. Mauris sodales, nisl consequat ullamcorper malesuada, lectus nunc aliquet ipsum, at sollicitudin tellus arcu nec ex. Aenean commodo felis et diam mollis porttitor. Nulla at est et turpis dignissim cursus vel vel arcu. Duis consequat urna ac nisl suscipit, ut rhoncus lectus pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean risus mauris, faucibus quis arcu luctus, hendrerit vestibulum nunc

+

Sed dignissim condimentum massa, et vulputate elit imperdiet ac. Vivamus elementum risus luctus, aliquam elit dignissim, euismod mauris. Nam id tempus ex. Quisque lacinia tincidunt nisl, at bibendum diam congue sed. Donec ex massa, lacinia ut feugiat non, cursus sit amet velit. Maecenas quis suscipit justo. Vestibulum ex magna, scelerisque eget placerat a, consectetur id ante. Pellentesque commodo, purus ut pharetra tincidunt, felis mi fringilla urna, a ultricies lacus nisl ac arcu. Duis molestie vestibulum est, sit amet egestas ipsum sagittis ac. Donec tempor urna sem, pharetra tincidunt ligula faucibus in. Ut eu fringilla ante. Nulla mauris tortor, mattis a ligula bibendum, pharetra euismod neque. Proin sit amet imperdiet nulla. Nam gravida eros in ex gravida vehicula. Nulla a augue nec mauris efficitur bibendum. Aliquam fringilla finibus lectus, sed euismod turpis ullamcorper in

+

Suspendisse rutrum dolor convallis diam vestibulum, vel iaculis leo pulvinar. Quisque consequat orci et ipsum maximus vehicula. Phasellus dignissim ac ante a dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In bibendum ipsum et nibh porttitor, et commodo lacus eleifend. Ut vel semper libero, ac porttitor est. Donec lacus turpis, vestibulum quis congue at, rhoncus feugiat dui

+

Maecenas commodo lectus magna, ac auctor dolor ultrices id. Donec varius mattis pretium. Suspendisse potenti. Nam tempus nisi odio, at pretium risus finibus eu. Vivamus fermentum mi sit amet odio hendrerit, quis condimentum arcu tristique. Praesent id faucibus tortor, eget suscipit sem. Aliquam vestibulum est vel felis semper iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique tincidunt arcu in faucibus. Mauris feugiat in nibh eleifend scelerisque. Proin et turpis ut nibh tincidunt ornare eu vitae lorem. Nunc et suscipit massa, ac dignissim erat. Aliquam imperdiet vestibulum dignissim. Integer scelerisque felis ante, id vehicula velit pharetra et. Suspendisse condimentum eget ante vel egestas. Morbi pellentesque ante et nunc gravida cursus

+

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

+
+
+ + + +
+
diff --git a/test/screenshot/spec/mdc-dialog/classes/overflow.html b/test/screenshot/spec/mdc-dialog/classes/overflow.html index 2eb3a623712..09315bad466 100644 --- a/test/screenshot/spec/mdc-dialog/classes/overflow.html +++ b/test/screenshot/spec/mdc-dialog/classes/overflow.html @@ -48,71 +48,73 @@ id="test-dialog">
-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. -

-
-

Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

-

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

-

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed est. Morbi pulvinar odio sed neque pharetra, nec feugiat arcu ullamcorper. Nam orci nisl, dapibus nec arcu ac, molestie cursus massa. Quisque vestibulum et ligula sed lacinia. Quisque tincidunt est id aliquet suscipit. Nulla facilisi

-

Nulla pretium arcu volutpat aliquet aliquet. Vivamus at ultricies massa. Mauris imperdiet orci vitae quam viverra, eget condimentum ex finibus. Nulla vestibulum velit tellus, ac malesuada dolor interdum eu. Etiam tincidunt massa non ornare venenatis. Quisque tincidunt tempor vehicula. Mauris ac neque consequat, ornare mi a, congue dui. Ut eu lorem semper augue posuere sodales et ut tortor. Suspendisse nec commodo nulla. Morbi accumsan mollis dui, posuere iaculis diam rutrum vel. Curabitur eu eros eget sem convallis porttitor

-

Nullam convallis eros ut fringilla semper. Suspendisse euismod elit vel libero elementum blandit non in augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus, metus quis finibus faucibus, mi mauris condimentum mauris, vitae ullamcorper risus nibh vel est. Sed euismod fringilla purus, vestibulum sodales sem egestas congue. Aliquam quis faucibus turpis. Mauris faucibus sapien at sem maximus accumsan

-

Nam ac commodo massa, vel congue nulla. Maecenas sed nisl dui. Morbi tincidunt lacinia volutpat. Nullam ut turpis eget augue tincidunt rutrum nec interdum odio. Donec convallis sapien velit, sit amet fringilla risus luctus a. In ut nibh fermentum, hendrerit nisi ut, rutrum arcu. Integer eu urna lacus. Cras gravida venenatis purus nec congue. Integer consectetur leo et nisl tincidunt malesuada. In id faucibus libero, vitae scelerisque nulla

-

Curabitur non sapien mauris. Etiam pharetra risus non luctus malesuada. Ut sagittis nunc nibh. Vestibulum vestibulum sapien justo, eu tristique augue pretium at. Proin odio turpis, porttitor eget tincidunt ac, convallis quis metus. Praesent dignissim nulla at vestibulum sollicitudin. Vivamus finibus aliquet facilisis. Vivamus ultrices augue et velit tempus malesuada. Sed convallis odio in quam feugiat malesuada. Ut quis justo lorem. Nullam bibendum ante sem, vel efficitur magna interdum quis. Curabitur quis suscipit lacus. Nam vitae velit pellentesque, varius erat lacinia, blandit lorem. Integer sed maximus nibh, eget ullamcorper velit. Morbi pellentesque dui massa, nec pellentesque lectus rhoncus a

-

Morbi id enim quis magna sagittis vulputate. Maecenas ultricies arcu sit amet arcu suscipit consectetur. Nam ligula massa, volutpat quis lectus a, tempus posuere nisl. Donec quis ullamcorper tortor. Nunc vitae est vitae turpis imperdiet consectetur. In auctor orci finibus urna lobortis, et iaculis leo lobortis. Maecenas nisi metus, euismod ut venenatis vestibulum, tempor sed velit. Donec dolor tellus, pharetra eget lorem a, vehicula rutrum odio. Cras ultricies sit amet lacus porta gravida. In quis est at elit condimentum laoreet

-

Praesent venenatis at mi a molestie. Nulla pellentesque pharetra dolor, a gravida mauris laoreet in. Nam luctus iaculis dolor, sed cursus justo bibendum non. Cras eget vestibulum tellus. In velit sapien, tempor et vestibulum et, sodales non ligula. Maecenas risus orci, bibendum quis lacus id, interdum mattis purus. Vivamus ex ligula, maximus eget rhoncus ut, aliquam at erat. Aliquam id leo fringilla, finibus est eget, cursus urna. Suspendisse potenti. Sed sagittis, ex non malesuada blandit, diam sem pharetra mi, in pellentesque dolor libero sit amet lacus. Aenean suscipit blandit consequat. Curabitur fermentum ac nibh condimentum mollis. Proin ac mi non eros tincidunt interdum quis vitae enim. Suspendisse suscipit id nibh sit amet elementum. Integer sagittis turpis erat, in varius elit interdum eu

-

Fusce eu varius justo. Proin in lorem luctus, bibendum dui sed, pulvinar mi. Phasellus sed erat mauris. Curabitur quam magna, porttitor sodales pellentesque blandit, eleifend at dolor. Quisque porta ac arcu vitae interdum. Nulla tempor facilisis diam, ac efficitur magna sodales non. Fusce nisi mi, fermentum nec diam id, cursus malesuada nulla. In ultricies sodales mi sollicitudin fermentum. Pellentesque et convallis nunc. Praesent arcu nunc, viverra ac congue in, laoreet sed ex. Suspendisse a neque dapibus, posuere sapien in, malesuada dui. Praesent aliquam venenatis ante, at posuere ligula molestie in. Pellentesque bibendum urna ac felis mattis, aliquet dignissim tellus porttitor. Praesent vitae mauris vehicula, lacinia augue a, sagittis diam

-

Quisque placerat lacus et quam pulvinar gravida. Integer rhoncus ante in nunc facilisis, et lobortis odio vehicula. Duis interdum nulla ligula, ac molestie nibh congue sed. Donec ac tincidunt ante. Etiam quis tortor blandit, feugiat enim eu, posuere orci. Donec sem eros, ullamcorper a leo nec, maximus ullamcorper ipsum. Pellentesque volutpat, felis ut rhoncus euismod, purus turpis hendrerit ipsum, at venenatis nisi erat id tellus. Nullam nisi enim, tincidunt eget tortor et, consequat commodo nibh. Phasellus porttitor neque at nisi tincidunt, eget ultricies felis maximus. Nullam ex lorem, accumsan ut rutrum et, cursus sit amet neque

-

Nullam pharetra ipsum quis risus condimentum, at pretium libero commodo. Sed porta ante sed iaculis pellentesque. Praesent nec pretium ligula. Etiam porttitor fringilla justo sed vestibulum. Ut elementum tortor dolor, quis pretium leo porta at. In tempor diam ac lorem suscipit, non interdum purus tristique. Morbi vitae pharetra risus

-

Fusce volutpat semper nisl, a efficitur nisl tempor in. Proin non eros mollis, eleifend risus ac, bibendum tortor. Mauris porta odio vel ultricies ullamcorper. Phasellus volutpat velit lorem, nec lobortis nisi blandit ac. Nunc ligula massa, iaculis vitae molestie eu, fermentum ac libero. Morbi ut ipsum eget nisl consequat imperdiet. Etiam eu erat sed nisl viverra egestas. Phasellus rhoncus neque lacus, ac rutrum urna mattis sed. Donec quis lectus odio

-

Aenean congue ipsum a eros gravida aliquet. Aliquam condimentum ex sit amet eros venenatis, vitae tempor ligula fringilla. Suspendisse tempus diam id enim consequat auctor. Morbi ac arcu sit amet turpis imperdiet ornare. Aliquam molestie at ipsum at venenatis. Nulla rutrum purus tincidunt libero viverra hendrerit. Suspendisse vestibulum sapien sodales, ornare diam vel, ornare magna. Morbi non mi in erat feugiat imperdiet nec at diam. Aliquam fringilla pellentesque aliquam. Suspendisse non mi vestibulum mi lacinia cursus. Integer pellentesque rutrum libero quis gravida. Nulla facilisis, purus ut dapibus pretium, leo ipsum efficitur enim, vulputate elementum lectus felis ac ante

-

Aliquam eu placerat dolor. Mauris rhoncus porta euismod. Sed quis mauris feugiat, tempor mauris eget, eleifend elit. Nulla interdum fringilla vehicula. Phasellus varius auctor urna eget tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas luctus consequat magna, sit amet facilisis lorem maximus dapibus. Sed venenatis tortor quis nisl dignissim feugiat id eget neque. Suspendisse posuere molestie elit, et blandit justo placerat eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit

-

Nullam pretium diam eu arcu tincidunt sollicitudin. Mauris finibus urna a maximus tristique. Donec quis lacus mauris. Donec consequat interdum diam, nec posuere eros. Pellentesque ultricies ligula sit amet aliquam mollis. Fusce justo mi, ultricies nec est vel, commodo consequat felis. Phasellus nec felis a est malesuada malesuada quis vitae enim. Cras hendrerit libero felis, at mattis eros ultricies vestibulum

-

Nulla nec blandit sapien. Fusce et tellus eu diam fermentum egestas blandit in erat. Etiam dictum nibh ac elit pulvinar congue. Nunc feugiat odio sodales orci ornare, et volutpat sem sollicitudin. Fusce id risus et lacus fringilla luctus. Praesent porttitor rhoncus lectus. Pellentesque vitae egestas dolor, vitae maximus felis

-

In mauris enim, vehicula in lectus non, feugiat varius est. Nam elementum ipsum erat, quis tristique neque tincidunt at. Integer sed porta urna. Vivamus eu lacinia metus. Quisque id posuere odio. Vivamus mattis sem nec leo hendrerit, ut sollicitudin sem faucibus. Quisque id justo velit

-

Integer molestie, ex ac vulputate ultricies, ante dui mollis urna, sit amet commodo urna felis a mauris. Sed augue ex, commodo non rhoncus eget, posuere ornare nunc. Cras sed quam lorem. Nam id dapibus turpis. Cras eget venenatis urna, sollicitudin faucibus ex. Maecenas diam lacus, ultricies vel neque gravida, pulvinar euismod lacus. In facilisis nulla turpis, eget interdum nulla lacinia eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce interdum tempor lectus non posuere. Integer finibus a lacus in auctor. Quisque tellus tortor, interdum tincidunt hendrerit vitae, maximus in nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus vehicula magna non risus sagittis, sed elementum diam finibus

-

Etiam justo erat, blandit a mauris eget, placerat porttitor diam. Phasellus consequat et lectus sit amet cursus. Vivamus purus ipsum, lobortis quis faucibus vitae, consectetur id orci. In mattis consectetur faucibus. Etiam rutrum venenatis massa sed molestie. Duis enim nibh, mattis ut malesuada venenatis, sollicitudin sit amet metus. Nunc luctus rutrum mi, in tempor urna viverra nec. Fusce feugiat risus ac dapibus tincidunt. Integer vel elit libero. Ut at nunc eget nulla vestibulum congue ut quis ipsum. Aliquam elementum commodo erat et auctor. Nulla condimentum sit amet diam eget consequat. Vivamus molestie laoreet risus vitae egestas. Phasellus sed pretium orci, sit amet porta lorem

-

Vestibulum eu lacinia est. Suspendisse eu iaculis odio, in tincidunt mauris. Mauris ultrices, ligula vulputate egestas imperdiet, tortor neque pulvinar lorem, vel volutpat enim leo nec dolor. Duis eleifend commodo feugiat. Nam consectetur ac erat vitae luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam hendrerit fringilla mattis. Sed mauris orci, bibendum at gravida sed, consectetur eget massa

-

Morbi fringilla tortor nisl, non rhoncus nisi varius tincidunt. Praesent scelerisque, orci vel tempor viverra, enim elit porttitor dolor, vitae condimentum elit eros vitae neque. Maecenas viverra neque at enim tempor, sit amet ullamcorper risus interdum. Praesent quis efficitur elit. Integer posuere, est ac porttitor scelerisque, orci elit lobortis velit, tincidunt pharetra mi magna et dui. Nullam scelerisque sem nec sapien imperdiet aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus

-

Sed vehicula dolor pulvinar consequat pretium. Mauris varius ut nibh sed consequat. Nunc congue libero non molestie euismod. Ut ac sagittis diam, a cursus elit. Quisque semper ac tellus non suscipit. Etiam lacus lectus, commodo et enim quis, lacinia tincidunt metus. Donec cursus felis et malesuada sodales. Donec tempor ligula in est vulputate faucibus

-

Aliquam erat volutpat. Mauris sed fringilla lacus. Nulla eu eros ac nisi pharetra molestie. Sed condimentum magna aliquam est fermentum, pretium ornare diam pellentesque. Duis nec odio sapien. Mauris eget risus ligula. Sed nec nunc consequat, venenatis dolor et, mollis risus. Nulla facilisi. Vestibulum id felis velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit

-

Fusce dictum nisl et lacus pharetra, at tincidunt mauris interdum. Maecenas ac odio in arcu ullamcorper pulvinar eu eget tortor. Duis laoreet libero sit amet massa ornare, sit amet pellentesque justo viverra. Morbi nec justo metus. Integer porttitor nunc a dolor cursus, et congue libero lobortis. Fusce imperdiet posuere nisi, et mattis arcu vestibulum ut. Etiam non dui et felis egestas ullamcorper quis eget nisi. Vestibulum vitae lorem a diam lacinia dictum. Aliquam sagittis velit est, vitae vehicula felis vestibulum vulputate. Etiam gravida urna id ligula scelerisque fringilla. Praesent orci mauris, congue eu lectus et, imperdiet convallis felis. Pellentesque sollicitudin felis nec porttitor sollicitudin. Phasellus at convallis urna. Morbi auctor ipsum eget risus convallis tempus. Cras porta ipsum interdum, rutrum ipsum nec, porta magna

-

Duis pharetra ligula ac libero vulputate, vel gravida orci venenatis. Fusce fermentum nisl nec maximus posuere. Morbi ac porta diam. Curabitur laoreet maximus maximus. Curabitur porttitor turpis sit amet elementum eleifend. Aliquam erat volutpat. Vestibulum dictum ipsum est, non mollis mauris porttitor id. Morbi condimentum, ante sit amet venenatis gravida, justo magna commodo diam, at faucibus enim nibh ut risus. Curabitur cursus imperdiet mattis. Nullam convallis augue in lorem consequat aliquet. Suspendisse blandit ut velit eu fringilla. Vestibulum vel lacinia eros. Suspendisse sit amet venenatis metus

-

Aenean vel suscipit tortor. Aenean iaculis magna in viverra rhoncus. Integer ornare vitae lacus vitae sagittis. Fusce ac ligula vitae tortor sollicitudin auctor. Quisque urna elit, tincidunt quis leo eget, porta tempus arcu. Cras porttitor tempus enim, non suscipit nisi. Suspendisse porta metus eget sapien blandit, quis commodo odio ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque ullamcorper convallis nulla iaculis imperdiet. Curabitur et urna ut massa interdum viverra sit amet eget mauris. Vestibulum sed sem ac est iaculis mattis et non eros. Aenean quis sem feugiat, pretium mi ac, consequat urna. Mauris lacinia rutrum mauris, ut ullamcorper nisi imperdiet vel. Sed ac dignissim lacus. Vestibulum ex neque, interdum quis massa id, posuere vestibulum odio. Cras ut diam sed augue aliquet auctor

-

Aliquam mauris augue, tristique sed varius dignissim, euismod et nibh. Nullam faucibus, nisi a tincidunt venenatis, nibh neque faucibus tortor, eu convallis magna nisi et tortor. Cras molestie sapien ipsum, quis hendrerit ipsum vulputate eu. Fusce dui risus, mattis at aliquam a, condimentum malesuada sem. Fusce urna dolor, consectetur interdum ultricies in, dignissim a mi. Praesent sit amet nulla iaculis, maximus dolor in, pulvinar dui. Fusce placerat efficitur augue id consectetur. Integer pulvinar dictum molestie. Suspendisse potenti. Suspendisse aliquam lectus ut varius luctus. Sed placerat tempor nunc et tincidunt. Proin euismod eros eu ex tincidunt, a euismod felis euismod

-

Suspendisse euismod metus ut nisi porta, in fermentum nisl fermentum. Donec luctus sagittis sem sed posuere. Donec at commodo dui, sed pharetra urna. Morbi laoreet ligula et semper pellentesque. Donec commodo dictum ipsum, pretium cursus est eleifend ac. Etiam a orci at tellus commodo bibendum et ac diam. Aenean consectetur, felis eu pretium pulvinar, nisl metus iaculis nisl, tempor lacinia magna mauris nec metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam nec nibh eget dolor cursus tincidunt

-

Integer vestibulum dolor quis neque maximus, ac gravida ligula varius. Proin vulputate ante eget ligula lacinia laoreet. Vivamus tempus sagittis auctor. Fusce imperdiet a odio ac euismod. Vestibulum lacus tellus, consectetur quis eros ut, interdum eleifend neque. Praesent ex sem, aliquam eget vulputate vehicula, dapibus in massa. Duis a efficitur enim

-

Ut ipsum tortor, pellentesque nec mollis pulvinar, condimentum nec nisi. Quisque pretium, quam sed finibus consequat, ex justo dignissim enim, vel mattis felis lorem vel diam. Duis cursus, velit at iaculis dictum, ipsum odio pretium risus, venenatis ultricies elit odio quis eros. Mauris odio libero, eleifend in mi nec, efficitur malesuada magna. Praesent auctor pellentesque sem semper dignissim. Etiam ut urna lacus. In quis gravida felis

-

Sed lacinia non urna ac condimentum. Integer feugiat vehicula lacus, quis aliquet turpis. Cras vel nisl sit amet lorem bibendum egestas. Phasellus in elementum lectus, sed egestas dolor. Vestibulum et velit volutpat, vulputate sapien sed, ullamcorper felis. Nam eu viverra augue. Aenean egestas, massa et ullamcorper imperdiet, ante purus condimentum erat, nec viverra lectus massa non dolor. Sed nibh tellus, convallis sed ligula eget, convallis pulvinar felis. Vivamus euismod id eros eget vestibulum. Morbi mattis est vitae consectetur pellentesque. Praesent suscipit in turpis ut feugiat. Sed facilisis consequat urna nec faucibus. Mauris sodales tortor nibh, id tempor urna cursus ut

-

Etiam et orci quis nibh varius placerat. Maecenas convallis metus magna, et auctor ligula mattis et. Curabitur id sapien vitae neque ullamcorper ultricies. Etiam nisl felis, cursus quis nisl sit amet, euismod hendrerit nisl. Vivamus vestibulum aliquam risus, nec euismod libero viverra vitae. In sit amet cursus arcu. Sed ullamcorper id urna vel rhoncus. Nunc auctor porttitor nibh, eu accumsan lectus gravida eget. Nullam posuere arcu in ex volutpat auctor efficitur vel neque. Curabitur id ante suscipit, dictum eros feugiat, iaculis dui. Fusce hendrerit mauris ac libero malesuada efficitur. Morbi a ultrices nulla, vitae rutrum lorem. Maecenas vel ligula tempus, sagittis dui eget, congue est. Phasellus sit amet laoreet ex

-

Nulla facilisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales diam a pharetra hendrerit. Nulla rutrum vehicula eros vel ultrices. Aliquam imperdiet sagittis leo, nec ullamcorper orci tempor in. Aliquam luctus ut nulla at eleifend. Duis sapien lorem, consequat a nisl semper, rhoncus aliquet sapien. Sed in velit posuere, tincidunt ex vitae, congue turpis. Nam sollicitudin dolor elit, non finibus arcu porta et. Sed efficitur metus justo, et faucibus justo viverra eu. Etiam porttitor convallis turpis, non gravida nulla tempus quis. Nulla lobortis venenatis purus, sed porttitor dolor fringilla et. Morbi porta lectus non erat sollicitudin rhoncus. Proin pretium placerat vehicula. Morbi et nibh elementum dolor egestas efficitur

-

Cras ornare eros ac elit cursus, eget ornare nulla ullamcorper. Sed arcu urna, sagittis luctus lacus eu, mattis eleifend massa. Sed condimentum lorem sit amet luctus elementum. Morbi et quam in nunc elementum hendrerit rutrum fringilla lorem. Phasellus rhoncus diam tellus, nec porta arcu eleifend ac. Etiam justo massa, egestas sit amet magna vel, maximus faucibus dui. Ut imperdiet mollis nisi, ac lobortis nibh pharetra at. Cras bibendum, arcu ut sollicitudin imperdiet, nulla mi venenatis enim, a blandit orci nisi vitae nibh

-

Donec congue, sem a accumsan ultricies, lacus metus lacinia dui, eget hendrerit felis eros id nulla. Donec varius mi vel blandit ultrices. Duis in lorem orci. Duis rutrum nisl eu varius faucibus. Sed quis vestibulum purus. Donec facilisis magna turpis. Nam quis nulla luctus, sagittis ligula eu, venenatis eros. Nulla facilisi. Sed non mauris dictum, commodo diam in, mollis est. In nec urna vehicula, sagittis justo posuere, condimentum metus. Aliquam commodo nulla quis volutpat porttitor. Quisque vel massa vulputate, tincidunt diam sit amet, commodo justo

-

Mauris iaculis dui eu dolor euismod pretium. Nulla facilisi. Duis nisl elit, commodo vitae diam in, dapibus ultricies sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque ultrices congue magna, mollis ultrices tellus suscipit sed. Phasellus ultrices sem ex. Vestibulum ut turpis quis eros interdum viverra. Nunc ullamcorper imperdiet tellus, nec consequat velit viverra eu. Nulla facilisi. Nulla quis lobortis lacus, et ultricies lectus. Quisque volutpat venenatis massa, id fermentum metus. Duis efficitur nisl eu posuere mattis. Integer nec ipsum quis turpis pretium luctus

-

Nulla vitae neque auctor, consequat massa quis, molestie felis. Fusce pellentesque semper aliquam. Ut semper, dolor quis accumsan dictum, lacus urna bibendum diam, quis faucibus orci risus quis ipsum. Nullam venenatis metus ac diam rutrum, non tincidunt lacus gravida. Maecenas ac pellentesque justo. Praesent in auctor urna, ac vestibulum leo. Cras ut volutpat lacus, eu porta metus

-

Integer egestas hendrerit libero eget euismod. Maecenas eleifend erat sit amet ipsum finibus, sit amet finibus est tincidunt. Etiam auctor dui ac urna mollis auctor. Cras vehicula enim non cursus tristique. Ut sed enim viverra, malesuada dui in, tempus tortor. Suspendisse potenti. Integer vestibulum blandit cursus

-

Integer ultrices eros quis rutrum molestie. Ut euismod pulvinar eros. Vivamus facilisis laoreet pellentesque. Quisque molestie nec dolor ut scelerisque. Curabitur finibus ante nisi, ac porttitor mauris mattis eget. Proin cursus lobortis mi non vehicula. Etiam purus ex, porta vel ante eu, vestibulum aliquet augue. Phasellus tempor blandit lectus ac finibus. Sed interdum tellus felis, rhoncus vehicula elit scelerisque vel. Nullam aliquam nisi at tortor pulvinar, a commodo est volutpat. Vestibulum sed iaculis mauris. Cras iaculis molestie orci sed posuere. Vestibulum ac vestibulum sem

-

Vivamus vitae enim et neque venenatis tempus. Curabitur ultricies mi fermentum, pulvinar diam et, tempor eros. Phasellus ornare hendrerit velit quis sollicitudin. Suspendisse ac justo eu orci porttitor varius. In tempus felis eu sagittis suscipit. Nam eu nibh quis leo lacinia commodo sit amet sed nisi. Suspendisse ligula ligula, feugiat sit amet sem sed, rhoncus euismod massa. Etiam non lorem in mauris suscipit faucibus eget nec nisl. Pellentesque placerat dui ut nisi dignissim, ac viverra elit ultricies

-

In at nibh a arcu commodo dignissim. Sed quis sapien congue, suscipit urna quis, posuere enim. Nunc cursus tellus a nisl elementum efficitur. Vestibulum non est vulputate, facilisis ante scelerisque, tristique massa. Pellentesque ante sem, tincidunt at leo sed, faucibus laoreet mi. Morbi nec bibendum sapien. Cras a odio pulvinar, tincidunt tellus sit amet, cursus ligula

-

Nunc sed consequat enim. Duis suscipit nunc quis velit tincidunt, in suscipit erat accumsan. Mauris tristique ornare nisl, ut egestas ante. Donec ac semper ipsum. Nulla eget dolor lacinia mi dapibus laoreet. Vivamus sed bibendum diam. Praesent tempor massa id dui imperdiet cursus. Sed luctus risus nec dapibus tristique. Aliquam accumsan nisi vitae commodo accumsan. Duis commodo nibh sed erat tincidunt, in pretium nibh suscipit. Suspendisse at interdum arcu, at posuere lacus. Vestibulum accumsan iaculis porta. Nam justo odio, euismod ac leo non, viverra auctor sapien

-

Vivamus eget velit ut nunc ultricies porttitor. Fusce vestibulum bibendum laoreet. Praesent tristique arcu in nibh lobortis, eget vestibulum lacus ultricies. In et venenatis augue. Donec quis accumsan ipsum, sit amet euismod lacus. Suspendisse ultricies mattis dolor. Morbi viverra, quam sit amet ornare luctus, nunc quam blandit nisl, et mattis ipsum urna id nulla. Etiam semper risus nec felis lobortis, volutpat accumsan erat interdum. Nulla molestie vel erat a congue. In feugiat vestibulum purus ut commodo. Praesent sagittis turpis ut lacus suscipit ultrices. Suspendisse sed aliquam urna, vestibulum venenatis magna. Aliquam iaculis sed leo vel consectetur. Nunc quis pretium ex. Sed malesuada est ex, et efficitur est feugiat ultricies. Nullam vulputate tortor id rutrum aliquet

-

Integer et magna mi. Integer a quam purus. Nunc blandit ut est id pellentesque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam ligula massa, vel dignissim nulla feugiat a. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam pulvinar feugiat sagittis. Mauris sodales, nisl consequat ullamcorper malesuada, lectus nunc aliquet ipsum, at sollicitudin tellus arcu nec ex. Aenean commodo felis et diam mollis porttitor. Nulla at est et turpis dignissim cursus vel vel arcu. Duis consequat urna ac nisl suscipit, ut rhoncus lectus pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean risus mauris, faucibus quis arcu luctus, hendrerit vestibulum nunc

-

Sed dignissim condimentum massa, et vulputate elit imperdiet ac. Vivamus elementum risus luctus, aliquam elit dignissim, euismod mauris. Nam id tempus ex. Quisque lacinia tincidunt nisl, at bibendum diam congue sed. Donec ex massa, lacinia ut feugiat non, cursus sit amet velit. Maecenas quis suscipit justo. Vestibulum ex magna, scelerisque eget placerat a, consectetur id ante. Pellentesque commodo, purus ut pharetra tincidunt, felis mi fringilla urna, a ultricies lacus nisl ac arcu. Duis molestie vestibulum est, sit amet egestas ipsum sagittis ac. Donec tempor urna sem, pharetra tincidunt ligula faucibus in. Ut eu fringilla ante. Nulla mauris tortor, mattis a ligula bibendum, pharetra euismod neque. Proin sit amet imperdiet nulla. Nam gravida eros in ex gravida vehicula. Nulla a augue nec mauris efficitur bibendum. Aliquam fringilla finibus lectus, sed euismod turpis ullamcorper in

-

Suspendisse rutrum dolor convallis diam vestibulum, vel iaculis leo pulvinar. Quisque consequat orci et ipsum maximus vehicula. Phasellus dignissim ac ante a dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In bibendum ipsum et nibh porttitor, et commodo lacus eleifend. Ut vel semper libero, ac porttitor est. Donec lacus turpis, vestibulum quis congue at, rhoncus feugiat dui

-

Maecenas commodo lectus magna, ac auctor dolor ultrices id. Donec varius mattis pretium. Suspendisse potenti. Nam tempus nisi odio, at pretium risus finibus eu. Vivamus fermentum mi sit amet odio hendrerit, quis condimentum arcu tristique. Praesent id faucibus tortor, eget suscipit sem. Aliquam vestibulum est vel felis semper iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique tincidunt arcu in faucibus. Mauris feugiat in nibh eleifend scelerisque. Proin et turpis ut nibh tincidunt ornare eu vitae lorem. Nunc et suscipit massa, ac dignissim erat. Aliquam imperdiet vestibulum dignissim. Integer scelerisque felis ante, id vehicula velit pharetra et. Suspendisse condimentum eget ante vel egestas. Morbi pellentesque ante et nunc gravida cursus

-

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

-
-
- - - -
+
+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. +

+
+

Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

+

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

+

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed est. Morbi pulvinar odio sed neque pharetra, nec feugiat arcu ullamcorper. Nam orci nisl, dapibus nec arcu ac, molestie cursus massa. Quisque vestibulum et ligula sed lacinia. Quisque tincidunt est id aliquet suscipit. Nulla facilisi

+

Nulla pretium arcu volutpat aliquet aliquet. Vivamus at ultricies massa. Mauris imperdiet orci vitae quam viverra, eget condimentum ex finibus. Nulla vestibulum velit tellus, ac malesuada dolor interdum eu. Etiam tincidunt massa non ornare venenatis. Quisque tincidunt tempor vehicula. Mauris ac neque consequat, ornare mi a, congue dui. Ut eu lorem semper augue posuere sodales et ut tortor. Suspendisse nec commodo nulla. Morbi accumsan mollis dui, posuere iaculis diam rutrum vel. Curabitur eu eros eget sem convallis porttitor

+

Nullam convallis eros ut fringilla semper. Suspendisse euismod elit vel libero elementum blandit non in augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus, metus quis finibus faucibus, mi mauris condimentum mauris, vitae ullamcorper risus nibh vel est. Sed euismod fringilla purus, vestibulum sodales sem egestas congue. Aliquam quis faucibus turpis. Mauris faucibus sapien at sem maximus accumsan

+

Nam ac commodo massa, vel congue nulla. Maecenas sed nisl dui. Morbi tincidunt lacinia volutpat. Nullam ut turpis eget augue tincidunt rutrum nec interdum odio. Donec convallis sapien velit, sit amet fringilla risus luctus a. In ut nibh fermentum, hendrerit nisi ut, rutrum arcu. Integer eu urna lacus. Cras gravida venenatis purus nec congue. Integer consectetur leo et nisl tincidunt malesuada. In id faucibus libero, vitae scelerisque nulla

+

Curabitur non sapien mauris. Etiam pharetra risus non luctus malesuada. Ut sagittis nunc nibh. Vestibulum vestibulum sapien justo, eu tristique augue pretium at. Proin odio turpis, porttitor eget tincidunt ac, convallis quis metus. Praesent dignissim nulla at vestibulum sollicitudin. Vivamus finibus aliquet facilisis. Vivamus ultrices augue et velit tempus malesuada. Sed convallis odio in quam feugiat malesuada. Ut quis justo lorem. Nullam bibendum ante sem, vel efficitur magna interdum quis. Curabitur quis suscipit lacus. Nam vitae velit pellentesque, varius erat lacinia, blandit lorem. Integer sed maximus nibh, eget ullamcorper velit. Morbi pellentesque dui massa, nec pellentesque lectus rhoncus a

+

Morbi id enim quis magna sagittis vulputate. Maecenas ultricies arcu sit amet arcu suscipit consectetur. Nam ligula massa, volutpat quis lectus a, tempus posuere nisl. Donec quis ullamcorper tortor. Nunc vitae est vitae turpis imperdiet consectetur. In auctor orci finibus urna lobortis, et iaculis leo lobortis. Maecenas nisi metus, euismod ut venenatis vestibulum, tempor sed velit. Donec dolor tellus, pharetra eget lorem a, vehicula rutrum odio. Cras ultricies sit amet lacus porta gravida. In quis est at elit condimentum laoreet

+

Praesent venenatis at mi a molestie. Nulla pellentesque pharetra dolor, a gravida mauris laoreet in. Nam luctus iaculis dolor, sed cursus justo bibendum non. Cras eget vestibulum tellus. In velit sapien, tempor et vestibulum et, sodales non ligula. Maecenas risus orci, bibendum quis lacus id, interdum mattis purus. Vivamus ex ligula, maximus eget rhoncus ut, aliquam at erat. Aliquam id leo fringilla, finibus est eget, cursus urna. Suspendisse potenti. Sed sagittis, ex non malesuada blandit, diam sem pharetra mi, in pellentesque dolor libero sit amet lacus. Aenean suscipit blandit consequat. Curabitur fermentum ac nibh condimentum mollis. Proin ac mi non eros tincidunt interdum quis vitae enim. Suspendisse suscipit id nibh sit amet elementum. Integer sagittis turpis erat, in varius elit interdum eu

+

Fusce eu varius justo. Proin in lorem luctus, bibendum dui sed, pulvinar mi. Phasellus sed erat mauris. Curabitur quam magna, porttitor sodales pellentesque blandit, eleifend at dolor. Quisque porta ac arcu vitae interdum. Nulla tempor facilisis diam, ac efficitur magna sodales non. Fusce nisi mi, fermentum nec diam id, cursus malesuada nulla. In ultricies sodales mi sollicitudin fermentum. Pellentesque et convallis nunc. Praesent arcu nunc, viverra ac congue in, laoreet sed ex. Suspendisse a neque dapibus, posuere sapien in, malesuada dui. Praesent aliquam venenatis ante, at posuere ligula molestie in. Pellentesque bibendum urna ac felis mattis, aliquet dignissim tellus porttitor. Praesent vitae mauris vehicula, lacinia augue a, sagittis diam

+

Quisque placerat lacus et quam pulvinar gravida. Integer rhoncus ante in nunc facilisis, et lobortis odio vehicula. Duis interdum nulla ligula, ac molestie nibh congue sed. Donec ac tincidunt ante. Etiam quis tortor blandit, feugiat enim eu, posuere orci. Donec sem eros, ullamcorper a leo nec, maximus ullamcorper ipsum. Pellentesque volutpat, felis ut rhoncus euismod, purus turpis hendrerit ipsum, at venenatis nisi erat id tellus. Nullam nisi enim, tincidunt eget tortor et, consequat commodo nibh. Phasellus porttitor neque at nisi tincidunt, eget ultricies felis maximus. Nullam ex lorem, accumsan ut rutrum et, cursus sit amet neque

+

Nullam pharetra ipsum quis risus condimentum, at pretium libero commodo. Sed porta ante sed iaculis pellentesque. Praesent nec pretium ligula. Etiam porttitor fringilla justo sed vestibulum. Ut elementum tortor dolor, quis pretium leo porta at. In tempor diam ac lorem suscipit, non interdum purus tristique. Morbi vitae pharetra risus

+

Fusce volutpat semper nisl, a efficitur nisl tempor in. Proin non eros mollis, eleifend risus ac, bibendum tortor. Mauris porta odio vel ultricies ullamcorper. Phasellus volutpat velit lorem, nec lobortis nisi blandit ac. Nunc ligula massa, iaculis vitae molestie eu, fermentum ac libero. Morbi ut ipsum eget nisl consequat imperdiet. Etiam eu erat sed nisl viverra egestas. Phasellus rhoncus neque lacus, ac rutrum urna mattis sed. Donec quis lectus odio

+

Aenean congue ipsum a eros gravida aliquet. Aliquam condimentum ex sit amet eros venenatis, vitae tempor ligula fringilla. Suspendisse tempus diam id enim consequat auctor. Morbi ac arcu sit amet turpis imperdiet ornare. Aliquam molestie at ipsum at venenatis. Nulla rutrum purus tincidunt libero viverra hendrerit. Suspendisse vestibulum sapien sodales, ornare diam vel, ornare magna. Morbi non mi in erat feugiat imperdiet nec at diam. Aliquam fringilla pellentesque aliquam. Suspendisse non mi vestibulum mi lacinia cursus. Integer pellentesque rutrum libero quis gravida. Nulla facilisis, purus ut dapibus pretium, leo ipsum efficitur enim, vulputate elementum lectus felis ac ante

+

Aliquam eu placerat dolor. Mauris rhoncus porta euismod. Sed quis mauris feugiat, tempor mauris eget, eleifend elit. Nulla interdum fringilla vehicula. Phasellus varius auctor urna eget tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas luctus consequat magna, sit amet facilisis lorem maximus dapibus. Sed venenatis tortor quis nisl dignissim feugiat id eget neque. Suspendisse posuere molestie elit, et blandit justo placerat eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit

+

Nullam pretium diam eu arcu tincidunt sollicitudin. Mauris finibus urna a maximus tristique. Donec quis lacus mauris. Donec consequat interdum diam, nec posuere eros. Pellentesque ultricies ligula sit amet aliquam mollis. Fusce justo mi, ultricies nec est vel, commodo consequat felis. Phasellus nec felis a est malesuada malesuada quis vitae enim. Cras hendrerit libero felis, at mattis eros ultricies vestibulum

+

Nulla nec blandit sapien. Fusce et tellus eu diam fermentum egestas blandit in erat. Etiam dictum nibh ac elit pulvinar congue. Nunc feugiat odio sodales orci ornare, et volutpat sem sollicitudin. Fusce id risus et lacus fringilla luctus. Praesent porttitor rhoncus lectus. Pellentesque vitae egestas dolor, vitae maximus felis

+

In mauris enim, vehicula in lectus non, feugiat varius est. Nam elementum ipsum erat, quis tristique neque tincidunt at. Integer sed porta urna. Vivamus eu lacinia metus. Quisque id posuere odio. Vivamus mattis sem nec leo hendrerit, ut sollicitudin sem faucibus. Quisque id justo velit

+

Integer molestie, ex ac vulputate ultricies, ante dui mollis urna, sit amet commodo urna felis a mauris. Sed augue ex, commodo non rhoncus eget, posuere ornare nunc. Cras sed quam lorem. Nam id dapibus turpis. Cras eget venenatis urna, sollicitudin faucibus ex. Maecenas diam lacus, ultricies vel neque gravida, pulvinar euismod lacus. In facilisis nulla turpis, eget interdum nulla lacinia eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce interdum tempor lectus non posuere. Integer finibus a lacus in auctor. Quisque tellus tortor, interdum tincidunt hendrerit vitae, maximus in nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus vehicula magna non risus sagittis, sed elementum diam finibus

+

Etiam justo erat, blandit a mauris eget, placerat porttitor diam. Phasellus consequat et lectus sit amet cursus. Vivamus purus ipsum, lobortis quis faucibus vitae, consectetur id orci. In mattis consectetur faucibus. Etiam rutrum venenatis massa sed molestie. Duis enim nibh, mattis ut malesuada venenatis, sollicitudin sit amet metus. Nunc luctus rutrum mi, in tempor urna viverra nec. Fusce feugiat risus ac dapibus tincidunt. Integer vel elit libero. Ut at nunc eget nulla vestibulum congue ut quis ipsum. Aliquam elementum commodo erat et auctor. Nulla condimentum sit amet diam eget consequat. Vivamus molestie laoreet risus vitae egestas. Phasellus sed pretium orci, sit amet porta lorem

+

Vestibulum eu lacinia est. Suspendisse eu iaculis odio, in tincidunt mauris. Mauris ultrices, ligula vulputate egestas imperdiet, tortor neque pulvinar lorem, vel volutpat enim leo nec dolor. Duis eleifend commodo feugiat. Nam consectetur ac erat vitae luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam hendrerit fringilla mattis. Sed mauris orci, bibendum at gravida sed, consectetur eget massa

+

Morbi fringilla tortor nisl, non rhoncus nisi varius tincidunt. Praesent scelerisque, orci vel tempor viverra, enim elit porttitor dolor, vitae condimentum elit eros vitae neque. Maecenas viverra neque at enim tempor, sit amet ullamcorper risus interdum. Praesent quis efficitur elit. Integer posuere, est ac porttitor scelerisque, orci elit lobortis velit, tincidunt pharetra mi magna et dui. Nullam scelerisque sem nec sapien imperdiet aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus

+

Sed vehicula dolor pulvinar consequat pretium. Mauris varius ut nibh sed consequat. Nunc congue libero non molestie euismod. Ut ac sagittis diam, a cursus elit. Quisque semper ac tellus non suscipit. Etiam lacus lectus, commodo et enim quis, lacinia tincidunt metus. Donec cursus felis et malesuada sodales. Donec tempor ligula in est vulputate faucibus

+

Aliquam erat volutpat. Mauris sed fringilla lacus. Nulla eu eros ac nisi pharetra molestie. Sed condimentum magna aliquam est fermentum, pretium ornare diam pellentesque. Duis nec odio sapien. Mauris eget risus ligula. Sed nec nunc consequat, venenatis dolor et, mollis risus. Nulla facilisi. Vestibulum id felis velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit

+

Fusce dictum nisl et lacus pharetra, at tincidunt mauris interdum. Maecenas ac odio in arcu ullamcorper pulvinar eu eget tortor. Duis laoreet libero sit amet massa ornare, sit amet pellentesque justo viverra. Morbi nec justo metus. Integer porttitor nunc a dolor cursus, et congue libero lobortis. Fusce imperdiet posuere nisi, et mattis arcu vestibulum ut. Etiam non dui et felis egestas ullamcorper quis eget nisi. Vestibulum vitae lorem a diam lacinia dictum. Aliquam sagittis velit est, vitae vehicula felis vestibulum vulputate. Etiam gravida urna id ligula scelerisque fringilla. Praesent orci mauris, congue eu lectus et, imperdiet convallis felis. Pellentesque sollicitudin felis nec porttitor sollicitudin. Phasellus at convallis urna. Morbi auctor ipsum eget risus convallis tempus. Cras porta ipsum interdum, rutrum ipsum nec, porta magna

+

Duis pharetra ligula ac libero vulputate, vel gravida orci venenatis. Fusce fermentum nisl nec maximus posuere. Morbi ac porta diam. Curabitur laoreet maximus maximus. Curabitur porttitor turpis sit amet elementum eleifend. Aliquam erat volutpat. Vestibulum dictum ipsum est, non mollis mauris porttitor id. Morbi condimentum, ante sit amet venenatis gravida, justo magna commodo diam, at faucibus enim nibh ut risus. Curabitur cursus imperdiet mattis. Nullam convallis augue in lorem consequat aliquet. Suspendisse blandit ut velit eu fringilla. Vestibulum vel lacinia eros. Suspendisse sit amet venenatis metus

+

Aenean vel suscipit tortor. Aenean iaculis magna in viverra rhoncus. Integer ornare vitae lacus vitae sagittis. Fusce ac ligula vitae tortor sollicitudin auctor. Quisque urna elit, tincidunt quis leo eget, porta tempus arcu. Cras porttitor tempus enim, non suscipit nisi. Suspendisse porta metus eget sapien blandit, quis commodo odio ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque ullamcorper convallis nulla iaculis imperdiet. Curabitur et urna ut massa interdum viverra sit amet eget mauris. Vestibulum sed sem ac est iaculis mattis et non eros. Aenean quis sem feugiat, pretium mi ac, consequat urna. Mauris lacinia rutrum mauris, ut ullamcorper nisi imperdiet vel. Sed ac dignissim lacus. Vestibulum ex neque, interdum quis massa id, posuere vestibulum odio. Cras ut diam sed augue aliquet auctor

+

Aliquam mauris augue, tristique sed varius dignissim, euismod et nibh. Nullam faucibus, nisi a tincidunt venenatis, nibh neque faucibus tortor, eu convallis magna nisi et tortor. Cras molestie sapien ipsum, quis hendrerit ipsum vulputate eu. Fusce dui risus, mattis at aliquam a, condimentum malesuada sem. Fusce urna dolor, consectetur interdum ultricies in, dignissim a mi. Praesent sit amet nulla iaculis, maximus dolor in, pulvinar dui. Fusce placerat efficitur augue id consectetur. Integer pulvinar dictum molestie. Suspendisse potenti. Suspendisse aliquam lectus ut varius luctus. Sed placerat tempor nunc et tincidunt. Proin euismod eros eu ex tincidunt, a euismod felis euismod

+

Suspendisse euismod metus ut nisi porta, in fermentum nisl fermentum. Donec luctus sagittis sem sed posuere. Donec at commodo dui, sed pharetra urna. Morbi laoreet ligula et semper pellentesque. Donec commodo dictum ipsum, pretium cursus est eleifend ac. Etiam a orci at tellus commodo bibendum et ac diam. Aenean consectetur, felis eu pretium pulvinar, nisl metus iaculis nisl, tempor lacinia magna mauris nec metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam nec nibh eget dolor cursus tincidunt

+

Integer vestibulum dolor quis neque maximus, ac gravida ligula varius. Proin vulputate ante eget ligula lacinia laoreet. Vivamus tempus sagittis auctor. Fusce imperdiet a odio ac euismod. Vestibulum lacus tellus, consectetur quis eros ut, interdum eleifend neque. Praesent ex sem, aliquam eget vulputate vehicula, dapibus in massa. Duis a efficitur enim

+

Ut ipsum tortor, pellentesque nec mollis pulvinar, condimentum nec nisi. Quisque pretium, quam sed finibus consequat, ex justo dignissim enim, vel mattis felis lorem vel diam. Duis cursus, velit at iaculis dictum, ipsum odio pretium risus, venenatis ultricies elit odio quis eros. Mauris odio libero, eleifend in mi nec, efficitur malesuada magna. Praesent auctor pellentesque sem semper dignissim. Etiam ut urna lacus. In quis gravida felis

+

Sed lacinia non urna ac condimentum. Integer feugiat vehicula lacus, quis aliquet turpis. Cras vel nisl sit amet lorem bibendum egestas. Phasellus in elementum lectus, sed egestas dolor. Vestibulum et velit volutpat, vulputate sapien sed, ullamcorper felis. Nam eu viverra augue. Aenean egestas, massa et ullamcorper imperdiet, ante purus condimentum erat, nec viverra lectus massa non dolor. Sed nibh tellus, convallis sed ligula eget, convallis pulvinar felis. Vivamus euismod id eros eget vestibulum. Morbi mattis est vitae consectetur pellentesque. Praesent suscipit in turpis ut feugiat. Sed facilisis consequat urna nec faucibus. Mauris sodales tortor nibh, id tempor urna cursus ut

+

Etiam et orci quis nibh varius placerat. Maecenas convallis metus magna, et auctor ligula mattis et. Curabitur id sapien vitae neque ullamcorper ultricies. Etiam nisl felis, cursus quis nisl sit amet, euismod hendrerit nisl. Vivamus vestibulum aliquam risus, nec euismod libero viverra vitae. In sit amet cursus arcu. Sed ullamcorper id urna vel rhoncus. Nunc auctor porttitor nibh, eu accumsan lectus gravida eget. Nullam posuere arcu in ex volutpat auctor efficitur vel neque. Curabitur id ante suscipit, dictum eros feugiat, iaculis dui. Fusce hendrerit mauris ac libero malesuada efficitur. Morbi a ultrices nulla, vitae rutrum lorem. Maecenas vel ligula tempus, sagittis dui eget, congue est. Phasellus sit amet laoreet ex

+

Nulla facilisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales diam a pharetra hendrerit. Nulla rutrum vehicula eros vel ultrices. Aliquam imperdiet sagittis leo, nec ullamcorper orci tempor in. Aliquam luctus ut nulla at eleifend. Duis sapien lorem, consequat a nisl semper, rhoncus aliquet sapien. Sed in velit posuere, tincidunt ex vitae, congue turpis. Nam sollicitudin dolor elit, non finibus arcu porta et. Sed efficitur metus justo, et faucibus justo viverra eu. Etiam porttitor convallis turpis, non gravida nulla tempus quis. Nulla lobortis venenatis purus, sed porttitor dolor fringilla et. Morbi porta lectus non erat sollicitudin rhoncus. Proin pretium placerat vehicula. Morbi et nibh elementum dolor egestas efficitur

+

Cras ornare eros ac elit cursus, eget ornare nulla ullamcorper. Sed arcu urna, sagittis luctus lacus eu, mattis eleifend massa. Sed condimentum lorem sit amet luctus elementum. Morbi et quam in nunc elementum hendrerit rutrum fringilla lorem. Phasellus rhoncus diam tellus, nec porta arcu eleifend ac. Etiam justo massa, egestas sit amet magna vel, maximus faucibus dui. Ut imperdiet mollis nisi, ac lobortis nibh pharetra at. Cras bibendum, arcu ut sollicitudin imperdiet, nulla mi venenatis enim, a blandit orci nisi vitae nibh

+

Donec congue, sem a accumsan ultricies, lacus metus lacinia dui, eget hendrerit felis eros id nulla. Donec varius mi vel blandit ultrices. Duis in lorem orci. Duis rutrum nisl eu varius faucibus. Sed quis vestibulum purus. Donec facilisis magna turpis. Nam quis nulla luctus, sagittis ligula eu, venenatis eros. Nulla facilisi. Sed non mauris dictum, commodo diam in, mollis est. In nec urna vehicula, sagittis justo posuere, condimentum metus. Aliquam commodo nulla quis volutpat porttitor. Quisque vel massa vulputate, tincidunt diam sit amet, commodo justo

+

Mauris iaculis dui eu dolor euismod pretium. Nulla facilisi. Duis nisl elit, commodo vitae diam in, dapibus ultricies sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque ultrices congue magna, mollis ultrices tellus suscipit sed. Phasellus ultrices sem ex. Vestibulum ut turpis quis eros interdum viverra. Nunc ullamcorper imperdiet tellus, nec consequat velit viverra eu. Nulla facilisi. Nulla quis lobortis lacus, et ultricies lectus. Quisque volutpat venenatis massa, id fermentum metus. Duis efficitur nisl eu posuere mattis. Integer nec ipsum quis turpis pretium luctus

+

Nulla vitae neque auctor, consequat massa quis, molestie felis. Fusce pellentesque semper aliquam. Ut semper, dolor quis accumsan dictum, lacus urna bibendum diam, quis faucibus orci risus quis ipsum. Nullam venenatis metus ac diam rutrum, non tincidunt lacus gravida. Maecenas ac pellentesque justo. Praesent in auctor urna, ac vestibulum leo. Cras ut volutpat lacus, eu porta metus

+

Integer egestas hendrerit libero eget euismod. Maecenas eleifend erat sit amet ipsum finibus, sit amet finibus est tincidunt. Etiam auctor dui ac urna mollis auctor. Cras vehicula enim non cursus tristique. Ut sed enim viverra, malesuada dui in, tempus tortor. Suspendisse potenti. Integer vestibulum blandit cursus

+

Integer ultrices eros quis rutrum molestie. Ut euismod pulvinar eros. Vivamus facilisis laoreet pellentesque. Quisque molestie nec dolor ut scelerisque. Curabitur finibus ante nisi, ac porttitor mauris mattis eget. Proin cursus lobortis mi non vehicula. Etiam purus ex, porta vel ante eu, vestibulum aliquet augue. Phasellus tempor blandit lectus ac finibus. Sed interdum tellus felis, rhoncus vehicula elit scelerisque vel. Nullam aliquam nisi at tortor pulvinar, a commodo est volutpat. Vestibulum sed iaculis mauris. Cras iaculis molestie orci sed posuere. Vestibulum ac vestibulum sem

+

Vivamus vitae enim et neque venenatis tempus. Curabitur ultricies mi fermentum, pulvinar diam et, tempor eros. Phasellus ornare hendrerit velit quis sollicitudin. Suspendisse ac justo eu orci porttitor varius. In tempus felis eu sagittis suscipit. Nam eu nibh quis leo lacinia commodo sit amet sed nisi. Suspendisse ligula ligula, feugiat sit amet sem sed, rhoncus euismod massa. Etiam non lorem in mauris suscipit faucibus eget nec nisl. Pellentesque placerat dui ut nisi dignissim, ac viverra elit ultricies

+

In at nibh a arcu commodo dignissim. Sed quis sapien congue, suscipit urna quis, posuere enim. Nunc cursus tellus a nisl elementum efficitur. Vestibulum non est vulputate, facilisis ante scelerisque, tristique massa. Pellentesque ante sem, tincidunt at leo sed, faucibus laoreet mi. Morbi nec bibendum sapien. Cras a odio pulvinar, tincidunt tellus sit amet, cursus ligula

+

Nunc sed consequat enim. Duis suscipit nunc quis velit tincidunt, in suscipit erat accumsan. Mauris tristique ornare nisl, ut egestas ante. Donec ac semper ipsum. Nulla eget dolor lacinia mi dapibus laoreet. Vivamus sed bibendum diam. Praesent tempor massa id dui imperdiet cursus. Sed luctus risus nec dapibus tristique. Aliquam accumsan nisi vitae commodo accumsan. Duis commodo nibh sed erat tincidunt, in pretium nibh suscipit. Suspendisse at interdum arcu, at posuere lacus. Vestibulum accumsan iaculis porta. Nam justo odio, euismod ac leo non, viverra auctor sapien

+

Vivamus eget velit ut nunc ultricies porttitor. Fusce vestibulum bibendum laoreet. Praesent tristique arcu in nibh lobortis, eget vestibulum lacus ultricies. In et venenatis augue. Donec quis accumsan ipsum, sit amet euismod lacus. Suspendisse ultricies mattis dolor. Morbi viverra, quam sit amet ornare luctus, nunc quam blandit nisl, et mattis ipsum urna id nulla. Etiam semper risus nec felis lobortis, volutpat accumsan erat interdum. Nulla molestie vel erat a congue. In feugiat vestibulum purus ut commodo. Praesent sagittis turpis ut lacus suscipit ultrices. Suspendisse sed aliquam urna, vestibulum venenatis magna. Aliquam iaculis sed leo vel consectetur. Nunc quis pretium ex. Sed malesuada est ex, et efficitur est feugiat ultricies. Nullam vulputate tortor id rutrum aliquet

+

Integer et magna mi. Integer a quam purus. Nunc blandit ut est id pellentesque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam ligula massa, vel dignissim nulla feugiat a. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam pulvinar feugiat sagittis. Mauris sodales, nisl consequat ullamcorper malesuada, lectus nunc aliquet ipsum, at sollicitudin tellus arcu nec ex. Aenean commodo felis et diam mollis porttitor. Nulla at est et turpis dignissim cursus vel vel arcu. Duis consequat urna ac nisl suscipit, ut rhoncus lectus pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean risus mauris, faucibus quis arcu luctus, hendrerit vestibulum nunc

+

Sed dignissim condimentum massa, et vulputate elit imperdiet ac. Vivamus elementum risus luctus, aliquam elit dignissim, euismod mauris. Nam id tempus ex. Quisque lacinia tincidunt nisl, at bibendum diam congue sed. Donec ex massa, lacinia ut feugiat non, cursus sit amet velit. Maecenas quis suscipit justo. Vestibulum ex magna, scelerisque eget placerat a, consectetur id ante. Pellentesque commodo, purus ut pharetra tincidunt, felis mi fringilla urna, a ultricies lacus nisl ac arcu. Duis molestie vestibulum est, sit amet egestas ipsum sagittis ac. Donec tempor urna sem, pharetra tincidunt ligula faucibus in. Ut eu fringilla ante. Nulla mauris tortor, mattis a ligula bibendum, pharetra euismod neque. Proin sit amet imperdiet nulla. Nam gravida eros in ex gravida vehicula. Nulla a augue nec mauris efficitur bibendum. Aliquam fringilla finibus lectus, sed euismod turpis ullamcorper in

+

Suspendisse rutrum dolor convallis diam vestibulum, vel iaculis leo pulvinar. Quisque consequat orci et ipsum maximus vehicula. Phasellus dignissim ac ante a dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In bibendum ipsum et nibh porttitor, et commodo lacus eleifend. Ut vel semper libero, ac porttitor est. Donec lacus turpis, vestibulum quis congue at, rhoncus feugiat dui

+

Maecenas commodo lectus magna, ac auctor dolor ultrices id. Donec varius mattis pretium. Suspendisse potenti. Nam tempus nisi odio, at pretium risus finibus eu. Vivamus fermentum mi sit amet odio hendrerit, quis condimentum arcu tristique. Praesent id faucibus tortor, eget suscipit sem. Aliquam vestibulum est vel felis semper iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique tincidunt arcu in faucibus. Mauris feugiat in nibh eleifend scelerisque. Proin et turpis ut nibh tincidunt ornare eu vitae lorem. Nunc et suscipit massa, ac dignissim erat. Aliquam imperdiet vestibulum dignissim. Integer scelerisque felis ante, id vehicula velit pharetra et. Suspendisse condimentum eget ante vel egestas. Morbi pellentesque ante et nunc gravida cursus

+

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

+
+
+ + + +
+
diff --git a/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html b/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html index a4331b9f986..2449890824a 100644 --- a/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html +++ b/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html @@ -48,70 +48,72 @@ id="test-dialog">
-

- Fire photon torpedoes? -

-
-

Shields at 60% and falling, captain.

-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

-

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

-

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed est. Morbi pulvinar odio sed neque pharetra, nec feugiat arcu ullamcorper. Nam orci nisl, dapibus nec arcu ac, molestie cursus massa. Quisque vestibulum et ligula sed lacinia. Quisque tincidunt est id aliquet suscipit. Nulla facilisi

-

Nulla pretium arcu volutpat aliquet aliquet. Vivamus at ultricies massa. Mauris imperdiet orci vitae quam viverra, eget condimentum ex finibus. Nulla vestibulum velit tellus, ac malesuada dolor interdum eu. Etiam tincidunt massa non ornare venenatis. Quisque tincidunt tempor vehicula. Mauris ac neque consequat, ornare mi a, congue dui. Ut eu lorem semper augue posuere sodales et ut tortor. Suspendisse nec commodo nulla. Morbi accumsan mollis dui, posuere iaculis diam rutrum vel. Curabitur eu eros eget sem convallis porttitor

-

Nullam convallis eros ut fringilla semper. Suspendisse euismod elit vel libero elementum blandit non in augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus, metus quis finibus faucibus, mi mauris condimentum mauris, vitae ullamcorper risus nibh vel est. Sed euismod fringilla purus, vestibulum sodales sem egestas congue. Aliquam quis faucibus turpis. Mauris faucibus sapien at sem maximus accumsan

-

Nam ac commodo massa, vel congue nulla. Maecenas sed nisl dui. Morbi tincidunt lacinia volutpat. Nullam ut turpis eget augue tincidunt rutrum nec interdum odio. Donec convallis sapien velit, sit amet fringilla risus luctus a. In ut nibh fermentum, hendrerit nisi ut, rutrum arcu. Integer eu urna lacus. Cras gravida venenatis purus nec congue. Integer consectetur leo et nisl tincidunt malesuada. In id faucibus libero, vitae scelerisque nulla

-

Curabitur non sapien mauris. Etiam pharetra risus non luctus malesuada. Ut sagittis nunc nibh. Vestibulum vestibulum sapien justo, eu tristique augue pretium at. Proin odio turpis, porttitor eget tincidunt ac, convallis quis metus. Praesent dignissim nulla at vestibulum sollicitudin. Vivamus finibus aliquet facilisis. Vivamus ultrices augue et velit tempus malesuada. Sed convallis odio in quam feugiat malesuada. Ut quis justo lorem. Nullam bibendum ante sem, vel efficitur magna interdum quis. Curabitur quis suscipit lacus. Nam vitae velit pellentesque, varius erat lacinia, blandit lorem. Integer sed maximus nibh, eget ullamcorper velit. Morbi pellentesque dui massa, nec pellentesque lectus rhoncus a

-

Morbi id enim quis magna sagittis vulputate. Maecenas ultricies arcu sit amet arcu suscipit consectetur. Nam ligula massa, volutpat quis lectus a, tempus posuere nisl. Donec quis ullamcorper tortor. Nunc vitae est vitae turpis imperdiet consectetur. In auctor orci finibus urna lobortis, et iaculis leo lobortis. Maecenas nisi metus, euismod ut venenatis vestibulum, tempor sed velit. Donec dolor tellus, pharetra eget lorem a, vehicula rutrum odio. Cras ultricies sit amet lacus porta gravida. In quis est at elit condimentum laoreet

-

Praesent venenatis at mi a molestie. Nulla pellentesque pharetra dolor, a gravida mauris laoreet in. Nam luctus iaculis dolor, sed cursus justo bibendum non. Cras eget vestibulum tellus. In velit sapien, tempor et vestibulum et, sodales non ligula. Maecenas risus orci, bibendum quis lacus id, interdum mattis purus. Vivamus ex ligula, maximus eget rhoncus ut, aliquam at erat. Aliquam id leo fringilla, finibus est eget, cursus urna. Suspendisse potenti. Sed sagittis, ex non malesuada blandit, diam sem pharetra mi, in pellentesque dolor libero sit amet lacus. Aenean suscipit blandit consequat. Curabitur fermentum ac nibh condimentum mollis. Proin ac mi non eros tincidunt interdum quis vitae enim. Suspendisse suscipit id nibh sit amet elementum. Integer sagittis turpis erat, in varius elit interdum eu

-

Fusce eu varius justo. Proin in lorem luctus, bibendum dui sed, pulvinar mi. Phasellus sed erat mauris. Curabitur quam magna, porttitor sodales pellentesque blandit, eleifend at dolor. Quisque porta ac arcu vitae interdum. Nulla tempor facilisis diam, ac efficitur magna sodales non. Fusce nisi mi, fermentum nec diam id, cursus malesuada nulla. In ultricies sodales mi sollicitudin fermentum. Pellentesque et convallis nunc. Praesent arcu nunc, viverra ac congue in, laoreet sed ex. Suspendisse a neque dapibus, posuere sapien in, malesuada dui. Praesent aliquam venenatis ante, at posuere ligula molestie in. Pellentesque bibendum urna ac felis mattis, aliquet dignissim tellus porttitor. Praesent vitae mauris vehicula, lacinia augue a, sagittis diam

-

Quisque placerat lacus et quam pulvinar gravida. Integer rhoncus ante in nunc facilisis, et lobortis odio vehicula. Duis interdum nulla ligula, ac molestie nibh congue sed. Donec ac tincidunt ante. Etiam quis tortor blandit, feugiat enim eu, posuere orci. Donec sem eros, ullamcorper a leo nec, maximus ullamcorper ipsum. Pellentesque volutpat, felis ut rhoncus euismod, purus turpis hendrerit ipsum, at venenatis nisi erat id tellus. Nullam nisi enim, tincidunt eget tortor et, consequat commodo nibh. Phasellus porttitor neque at nisi tincidunt, eget ultricies felis maximus. Nullam ex lorem, accumsan ut rutrum et, cursus sit amet neque

-

Nullam pharetra ipsum quis risus condimentum, at pretium libero commodo. Sed porta ante sed iaculis pellentesque. Praesent nec pretium ligula. Etiam porttitor fringilla justo sed vestibulum. Ut elementum tortor dolor, quis pretium leo porta at. In tempor diam ac lorem suscipit, non interdum purus tristique. Morbi vitae pharetra risus

-

Fusce volutpat semper nisl, a efficitur nisl tempor in. Proin non eros mollis, eleifend risus ac, bibendum tortor. Mauris porta odio vel ultricies ullamcorper. Phasellus volutpat velit lorem, nec lobortis nisi blandit ac. Nunc ligula massa, iaculis vitae molestie eu, fermentum ac libero. Morbi ut ipsum eget nisl consequat imperdiet. Etiam eu erat sed nisl viverra egestas. Phasellus rhoncus neque lacus, ac rutrum urna mattis sed. Donec quis lectus odio

-

Aenean congue ipsum a eros gravida aliquet. Aliquam condimentum ex sit amet eros venenatis, vitae tempor ligula fringilla. Suspendisse tempus diam id enim consequat auctor. Morbi ac arcu sit amet turpis imperdiet ornare. Aliquam molestie at ipsum at venenatis. Nulla rutrum purus tincidunt libero viverra hendrerit. Suspendisse vestibulum sapien sodales, ornare diam vel, ornare magna. Morbi non mi in erat feugiat imperdiet nec at diam. Aliquam fringilla pellentesque aliquam. Suspendisse non mi vestibulum mi lacinia cursus. Integer pellentesque rutrum libero quis gravida. Nulla facilisis, purus ut dapibus pretium, leo ipsum efficitur enim, vulputate elementum lectus felis ac ante

-

Aliquam eu placerat dolor. Mauris rhoncus porta euismod. Sed quis mauris feugiat, tempor mauris eget, eleifend elit. Nulla interdum fringilla vehicula. Phasellus varius auctor urna eget tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas luctus consequat magna, sit amet facilisis lorem maximus dapibus. Sed venenatis tortor quis nisl dignissim feugiat id eget neque. Suspendisse posuere molestie elit, et blandit justo placerat eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit

-

Nullam pretium diam eu arcu tincidunt sollicitudin. Mauris finibus urna a maximus tristique. Donec quis lacus mauris. Donec consequat interdum diam, nec posuere eros. Pellentesque ultricies ligula sit amet aliquam mollis. Fusce justo mi, ultricies nec est vel, commodo consequat felis. Phasellus nec felis a est malesuada malesuada quis vitae enim. Cras hendrerit libero felis, at mattis eros ultricies vestibulum

-

Nulla nec blandit sapien. Fusce et tellus eu diam fermentum egestas blandit in erat. Etiam dictum nibh ac elit pulvinar congue. Nunc feugiat odio sodales orci ornare, et volutpat sem sollicitudin. Fusce id risus et lacus fringilla luctus. Praesent porttitor rhoncus lectus. Pellentesque vitae egestas dolor, vitae maximus felis

-

In mauris enim, vehicula in lectus non, feugiat varius est. Nam elementum ipsum erat, quis tristique neque tincidunt at. Integer sed porta urna. Vivamus eu lacinia metus. Quisque id posuere odio. Vivamus mattis sem nec leo hendrerit, ut sollicitudin sem faucibus. Quisque id justo velit

-

Integer molestie, ex ac vulputate ultricies, ante dui mollis urna, sit amet commodo urna felis a mauris. Sed augue ex, commodo non rhoncus eget, posuere ornare nunc. Cras sed quam lorem. Nam id dapibus turpis. Cras eget venenatis urna, sollicitudin faucibus ex. Maecenas diam lacus, ultricies vel neque gravida, pulvinar euismod lacus. In facilisis nulla turpis, eget interdum nulla lacinia eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce interdum tempor lectus non posuere. Integer finibus a lacus in auctor. Quisque tellus tortor, interdum tincidunt hendrerit vitae, maximus in nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus vehicula magna non risus sagittis, sed elementum diam finibus

-

Etiam justo erat, blandit a mauris eget, placerat porttitor diam. Phasellus consequat et lectus sit amet cursus. Vivamus purus ipsum, lobortis quis faucibus vitae, consectetur id orci. In mattis consectetur faucibus. Etiam rutrum venenatis massa sed molestie. Duis enim nibh, mattis ut malesuada venenatis, sollicitudin sit amet metus. Nunc luctus rutrum mi, in tempor urna viverra nec. Fusce feugiat risus ac dapibus tincidunt. Integer vel elit libero. Ut at nunc eget nulla vestibulum congue ut quis ipsum. Aliquam elementum commodo erat et auctor. Nulla condimentum sit amet diam eget consequat. Vivamus molestie laoreet risus vitae egestas. Phasellus sed pretium orci, sit amet porta lorem

-

Vestibulum eu lacinia est. Suspendisse eu iaculis odio, in tincidunt mauris. Mauris ultrices, ligula vulputate egestas imperdiet, tortor neque pulvinar lorem, vel volutpat enim leo nec dolor. Duis eleifend commodo feugiat. Nam consectetur ac erat vitae luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam hendrerit fringilla mattis. Sed mauris orci, bibendum at gravida sed, consectetur eget massa

-

Morbi fringilla tortor nisl, non rhoncus nisi varius tincidunt. Praesent scelerisque, orci vel tempor viverra, enim elit porttitor dolor, vitae condimentum elit eros vitae neque. Maecenas viverra neque at enim tempor, sit amet ullamcorper risus interdum. Praesent quis efficitur elit. Integer posuere, est ac porttitor scelerisque, orci elit lobortis velit, tincidunt pharetra mi magna et dui. Nullam scelerisque sem nec sapien imperdiet aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus

-

Sed vehicula dolor pulvinar consequat pretium. Mauris varius ut nibh sed consequat. Nunc congue libero non molestie euismod. Ut ac sagittis diam, a cursus elit. Quisque semper ac tellus non suscipit. Etiam lacus lectus, commodo et enim quis, lacinia tincidunt metus. Donec cursus felis et malesuada sodales. Donec tempor ligula in est vulputate faucibus

-

Aliquam erat volutpat. Mauris sed fringilla lacus. Nulla eu eros ac nisi pharetra molestie. Sed condimentum magna aliquam est fermentum, pretium ornare diam pellentesque. Duis nec odio sapien. Mauris eget risus ligula. Sed nec nunc consequat, venenatis dolor et, mollis risus. Nulla facilisi. Vestibulum id felis velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit

-

Fusce dictum nisl et lacus pharetra, at tincidunt mauris interdum. Maecenas ac odio in arcu ullamcorper pulvinar eu eget tortor. Duis laoreet libero sit amet massa ornare, sit amet pellentesque justo viverra. Morbi nec justo metus. Integer porttitor nunc a dolor cursus, et congue libero lobortis. Fusce imperdiet posuere nisi, et mattis arcu vestibulum ut. Etiam non dui et felis egestas ullamcorper quis eget nisi. Vestibulum vitae lorem a diam lacinia dictum. Aliquam sagittis velit est, vitae vehicula felis vestibulum vulputate. Etiam gravida urna id ligula scelerisque fringilla. Praesent orci mauris, congue eu lectus et, imperdiet convallis felis. Pellentesque sollicitudin felis nec porttitor sollicitudin. Phasellus at convallis urna. Morbi auctor ipsum eget risus convallis tempus. Cras porta ipsum interdum, rutrum ipsum nec, porta magna

-

Duis pharetra ligula ac libero vulputate, vel gravida orci venenatis. Fusce fermentum nisl nec maximus posuere. Morbi ac porta diam. Curabitur laoreet maximus maximus. Curabitur porttitor turpis sit amet elementum eleifend. Aliquam erat volutpat. Vestibulum dictum ipsum est, non mollis mauris porttitor id. Morbi condimentum, ante sit amet venenatis gravida, justo magna commodo diam, at faucibus enim nibh ut risus. Curabitur cursus imperdiet mattis. Nullam convallis augue in lorem consequat aliquet. Suspendisse blandit ut velit eu fringilla. Vestibulum vel lacinia eros. Suspendisse sit amet venenatis metus

-

Aenean vel suscipit tortor. Aenean iaculis magna in viverra rhoncus. Integer ornare vitae lacus vitae sagittis. Fusce ac ligula vitae tortor sollicitudin auctor. Quisque urna elit, tincidunt quis leo eget, porta tempus arcu. Cras porttitor tempus enim, non suscipit nisi. Suspendisse porta metus eget sapien blandit, quis commodo odio ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque ullamcorper convallis nulla iaculis imperdiet. Curabitur et urna ut massa interdum viverra sit amet eget mauris. Vestibulum sed sem ac est iaculis mattis et non eros. Aenean quis sem feugiat, pretium mi ac, consequat urna. Mauris lacinia rutrum mauris, ut ullamcorper nisi imperdiet vel. Sed ac dignissim lacus. Vestibulum ex neque, interdum quis massa id, posuere vestibulum odio. Cras ut diam sed augue aliquet auctor

-

Aliquam mauris augue, tristique sed varius dignissim, euismod et nibh. Nullam faucibus, nisi a tincidunt venenatis, nibh neque faucibus tortor, eu convallis magna nisi et tortor. Cras molestie sapien ipsum, quis hendrerit ipsum vulputate eu. Fusce dui risus, mattis at aliquam a, condimentum malesuada sem. Fusce urna dolor, consectetur interdum ultricies in, dignissim a mi. Praesent sit amet nulla iaculis, maximus dolor in, pulvinar dui. Fusce placerat efficitur augue id consectetur. Integer pulvinar dictum molestie. Suspendisse potenti. Suspendisse aliquam lectus ut varius luctus. Sed placerat tempor nunc et tincidunt. Proin euismod eros eu ex tincidunt, a euismod felis euismod

-

Suspendisse euismod metus ut nisi porta, in fermentum nisl fermentum. Donec luctus sagittis sem sed posuere. Donec at commodo dui, sed pharetra urna. Morbi laoreet ligula et semper pellentesque. Donec commodo dictum ipsum, pretium cursus est eleifend ac. Etiam a orci at tellus commodo bibendum et ac diam. Aenean consectetur, felis eu pretium pulvinar, nisl metus iaculis nisl, tempor lacinia magna mauris nec metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam nec nibh eget dolor cursus tincidunt

-

Integer vestibulum dolor quis neque maximus, ac gravida ligula varius. Proin vulputate ante eget ligula lacinia laoreet. Vivamus tempus sagittis auctor. Fusce imperdiet a odio ac euismod. Vestibulum lacus tellus, consectetur quis eros ut, interdum eleifend neque. Praesent ex sem, aliquam eget vulputate vehicula, dapibus in massa. Duis a efficitur enim

-

Ut ipsum tortor, pellentesque nec mollis pulvinar, condimentum nec nisi. Quisque pretium, quam sed finibus consequat, ex justo dignissim enim, vel mattis felis lorem vel diam. Duis cursus, velit at iaculis dictum, ipsum odio pretium risus, venenatis ultricies elit odio quis eros. Mauris odio libero, eleifend in mi nec, efficitur malesuada magna. Praesent auctor pellentesque sem semper dignissim. Etiam ut urna lacus. In quis gravida felis

-

Sed lacinia non urna ac condimentum. Integer feugiat vehicula lacus, quis aliquet turpis. Cras vel nisl sit amet lorem bibendum egestas. Phasellus in elementum lectus, sed egestas dolor. Vestibulum et velit volutpat, vulputate sapien sed, ullamcorper felis. Nam eu viverra augue. Aenean egestas, massa et ullamcorper imperdiet, ante purus condimentum erat, nec viverra lectus massa non dolor. Sed nibh tellus, convallis sed ligula eget, convallis pulvinar felis. Vivamus euismod id eros eget vestibulum. Morbi mattis est vitae consectetur pellentesque. Praesent suscipit in turpis ut feugiat. Sed facilisis consequat urna nec faucibus. Mauris sodales tortor nibh, id tempor urna cursus ut

-

Etiam et orci quis nibh varius placerat. Maecenas convallis metus magna, et auctor ligula mattis et. Curabitur id sapien vitae neque ullamcorper ultricies. Etiam nisl felis, cursus quis nisl sit amet, euismod hendrerit nisl. Vivamus vestibulum aliquam risus, nec euismod libero viverra vitae. In sit amet cursus arcu. Sed ullamcorper id urna vel rhoncus. Nunc auctor porttitor nibh, eu accumsan lectus gravida eget. Nullam posuere arcu in ex volutpat auctor efficitur vel neque. Curabitur id ante suscipit, dictum eros feugiat, iaculis dui. Fusce hendrerit mauris ac libero malesuada efficitur. Morbi a ultrices nulla, vitae rutrum lorem. Maecenas vel ligula tempus, sagittis dui eget, congue est. Phasellus sit amet laoreet ex

-

Nulla facilisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales diam a pharetra hendrerit. Nulla rutrum vehicula eros vel ultrices. Aliquam imperdiet sagittis leo, nec ullamcorper orci tempor in. Aliquam luctus ut nulla at eleifend. Duis sapien lorem, consequat a nisl semper, rhoncus aliquet sapien. Sed in velit posuere, tincidunt ex vitae, congue turpis. Nam sollicitudin dolor elit, non finibus arcu porta et. Sed efficitur metus justo, et faucibus justo viverra eu. Etiam porttitor convallis turpis, non gravida nulla tempus quis. Nulla lobortis venenatis purus, sed porttitor dolor fringilla et. Morbi porta lectus non erat sollicitudin rhoncus. Proin pretium placerat vehicula. Morbi et nibh elementum dolor egestas efficitur

-

Cras ornare eros ac elit cursus, eget ornare nulla ullamcorper. Sed arcu urna, sagittis luctus lacus eu, mattis eleifend massa. Sed condimentum lorem sit amet luctus elementum. Morbi et quam in nunc elementum hendrerit rutrum fringilla lorem. Phasellus rhoncus diam tellus, nec porta arcu eleifend ac. Etiam justo massa, egestas sit amet magna vel, maximus faucibus dui. Ut imperdiet mollis nisi, ac lobortis nibh pharetra at. Cras bibendum, arcu ut sollicitudin imperdiet, nulla mi venenatis enim, a blandit orci nisi vitae nibh

-

Donec congue, sem a accumsan ultricies, lacus metus lacinia dui, eget hendrerit felis eros id nulla. Donec varius mi vel blandit ultrices. Duis in lorem orci. Duis rutrum nisl eu varius faucibus. Sed quis vestibulum purus. Donec facilisis magna turpis. Nam quis nulla luctus, sagittis ligula eu, venenatis eros. Nulla facilisi. Sed non mauris dictum, commodo diam in, mollis est. In nec urna vehicula, sagittis justo posuere, condimentum metus. Aliquam commodo nulla quis volutpat porttitor. Quisque vel massa vulputate, tincidunt diam sit amet, commodo justo

-

Mauris iaculis dui eu dolor euismod pretium. Nulla facilisi. Duis nisl elit, commodo vitae diam in, dapibus ultricies sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque ultrices congue magna, mollis ultrices tellus suscipit sed. Phasellus ultrices sem ex. Vestibulum ut turpis quis eros interdum viverra. Nunc ullamcorper imperdiet tellus, nec consequat velit viverra eu. Nulla facilisi. Nulla quis lobortis lacus, et ultricies lectus. Quisque volutpat venenatis massa, id fermentum metus. Duis efficitur nisl eu posuere mattis. Integer nec ipsum quis turpis pretium luctus

-

Nulla vitae neque auctor, consequat massa quis, molestie felis. Fusce pellentesque semper aliquam. Ut semper, dolor quis accumsan dictum, lacus urna bibendum diam, quis faucibus orci risus quis ipsum. Nullam venenatis metus ac diam rutrum, non tincidunt lacus gravida. Maecenas ac pellentesque justo. Praesent in auctor urna, ac vestibulum leo. Cras ut volutpat lacus, eu porta metus

-

Integer egestas hendrerit libero eget euismod. Maecenas eleifend erat sit amet ipsum finibus, sit amet finibus est tincidunt. Etiam auctor dui ac urna mollis auctor. Cras vehicula enim non cursus tristique. Ut sed enim viverra, malesuada dui in, tempus tortor. Suspendisse potenti. Integer vestibulum blandit cursus

-

Integer ultrices eros quis rutrum molestie. Ut euismod pulvinar eros. Vivamus facilisis laoreet pellentesque. Quisque molestie nec dolor ut scelerisque. Curabitur finibus ante nisi, ac porttitor mauris mattis eget. Proin cursus lobortis mi non vehicula. Etiam purus ex, porta vel ante eu, vestibulum aliquet augue. Phasellus tempor blandit lectus ac finibus. Sed interdum tellus felis, rhoncus vehicula elit scelerisque vel. Nullam aliquam nisi at tortor pulvinar, a commodo est volutpat. Vestibulum sed iaculis mauris. Cras iaculis molestie orci sed posuere. Vestibulum ac vestibulum sem

-

Vivamus vitae enim et neque venenatis tempus. Curabitur ultricies mi fermentum, pulvinar diam et, tempor eros. Phasellus ornare hendrerit velit quis sollicitudin. Suspendisse ac justo eu orci porttitor varius. In tempus felis eu sagittis suscipit. Nam eu nibh quis leo lacinia commodo sit amet sed nisi. Suspendisse ligula ligula, feugiat sit amet sem sed, rhoncus euismod massa. Etiam non lorem in mauris suscipit faucibus eget nec nisl. Pellentesque placerat dui ut nisi dignissim, ac viverra elit ultricies

-

In at nibh a arcu commodo dignissim. Sed quis sapien congue, suscipit urna quis, posuere enim. Nunc cursus tellus a nisl elementum efficitur. Vestibulum non est vulputate, facilisis ante scelerisque, tristique massa. Pellentesque ante sem, tincidunt at leo sed, faucibus laoreet mi. Morbi nec bibendum sapien. Cras a odio pulvinar, tincidunt tellus sit amet, cursus ligula

-

Nunc sed consequat enim. Duis suscipit nunc quis velit tincidunt, in suscipit erat accumsan. Mauris tristique ornare nisl, ut egestas ante. Donec ac semper ipsum. Nulla eget dolor lacinia mi dapibus laoreet. Vivamus sed bibendum diam. Praesent tempor massa id dui imperdiet cursus. Sed luctus risus nec dapibus tristique. Aliquam accumsan nisi vitae commodo accumsan. Duis commodo nibh sed erat tincidunt, in pretium nibh suscipit. Suspendisse at interdum arcu, at posuere lacus. Vestibulum accumsan iaculis porta. Nam justo odio, euismod ac leo non, viverra auctor sapien

-

Vivamus eget velit ut nunc ultricies porttitor. Fusce vestibulum bibendum laoreet. Praesent tristique arcu in nibh lobortis, eget vestibulum lacus ultricies. In et venenatis augue. Donec quis accumsan ipsum, sit amet euismod lacus. Suspendisse ultricies mattis dolor. Morbi viverra, quam sit amet ornare luctus, nunc quam blandit nisl, et mattis ipsum urna id nulla. Etiam semper risus nec felis lobortis, volutpat accumsan erat interdum. Nulla molestie vel erat a congue. In feugiat vestibulum purus ut commodo. Praesent sagittis turpis ut lacus suscipit ultrices. Suspendisse sed aliquam urna, vestibulum venenatis magna. Aliquam iaculis sed leo vel consectetur. Nunc quis pretium ex. Sed malesuada est ex, et efficitur est feugiat ultricies. Nullam vulputate tortor id rutrum aliquet

-

Integer et magna mi. Integer a quam purus. Nunc blandit ut est id pellentesque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam ligula massa, vel dignissim nulla feugiat a. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam pulvinar feugiat sagittis. Mauris sodales, nisl consequat ullamcorper malesuada, lectus nunc aliquet ipsum, at sollicitudin tellus arcu nec ex. Aenean commodo felis et diam mollis porttitor. Nulla at est et turpis dignissim cursus vel vel arcu. Duis consequat urna ac nisl suscipit, ut rhoncus lectus pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean risus mauris, faucibus quis arcu luctus, hendrerit vestibulum nunc

-

Sed dignissim condimentum massa, et vulputate elit imperdiet ac. Vivamus elementum risus luctus, aliquam elit dignissim, euismod mauris. Nam id tempus ex. Quisque lacinia tincidunt nisl, at bibendum diam congue sed. Donec ex massa, lacinia ut feugiat non, cursus sit amet velit. Maecenas quis suscipit justo. Vestibulum ex magna, scelerisque eget placerat a, consectetur id ante. Pellentesque commodo, purus ut pharetra tincidunt, felis mi fringilla urna, a ultricies lacus nisl ac arcu. Duis molestie vestibulum est, sit amet egestas ipsum sagittis ac. Donec tempor urna sem, pharetra tincidunt ligula faucibus in. Ut eu fringilla ante. Nulla mauris tortor, mattis a ligula bibendum, pharetra euismod neque. Proin sit amet imperdiet nulla. Nam gravida eros in ex gravida vehicula. Nulla a augue nec mauris efficitur bibendum. Aliquam fringilla finibus lectus, sed euismod turpis ullamcorper in

-

Suspendisse rutrum dolor convallis diam vestibulum, vel iaculis leo pulvinar. Quisque consequat orci et ipsum maximus vehicula. Phasellus dignissim ac ante a dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In bibendum ipsum et nibh porttitor, et commodo lacus eleifend. Ut vel semper libero, ac porttitor est. Donec lacus turpis, vestibulum quis congue at, rhoncus feugiat dui

-

Maecenas commodo lectus magna, ac auctor dolor ultrices id. Donec varius mattis pretium. Suspendisse potenti. Nam tempus nisi odio, at pretium risus finibus eu. Vivamus fermentum mi sit amet odio hendrerit, quis condimentum arcu tristique. Praesent id faucibus tortor, eget suscipit sem. Aliquam vestibulum est vel felis semper iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique tincidunt arcu in faucibus. Mauris feugiat in nibh eleifend scelerisque. Proin et turpis ut nibh tincidunt ornare eu vitae lorem. Nunc et suscipit massa, ac dignissim erat. Aliquam imperdiet vestibulum dignissim. Integer scelerisque felis ante, id vehicula velit pharetra et. Suspendisse condimentum eget ante vel egestas. Morbi pellentesque ante et nunc gravida cursus

-

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

-

Fusce efficitur mi eget quam scelerisque convallis. Quisque suscipit lacus nisl, sed tincidunt est congue eget. Etiam at cursus enim. Cras convallis maximus finibus. Proin elementum mi vel lobortis iaculis. Duis bibendum feugiat orci ac posuere. Duis vehicula, magna in efficitur pulvinar, nisl lacus elementum quam, nec volutpat tortor est vel libero. Vivamus eu bibendum diam, ac ultricies dui. Nullam nec mauris erat. Nam imperdiet massa vel metus ultricies semper.

-
-
- - -
+
+

+ Fire photon torpedoes? +

+
+

Shields at 60% and falling, captain.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

+

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

+

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed est. Morbi pulvinar odio sed neque pharetra, nec feugiat arcu ullamcorper. Nam orci nisl, dapibus nec arcu ac, molestie cursus massa. Quisque vestibulum et ligula sed lacinia. Quisque tincidunt est id aliquet suscipit. Nulla facilisi

+

Nulla pretium arcu volutpat aliquet aliquet. Vivamus at ultricies massa. Mauris imperdiet orci vitae quam viverra, eget condimentum ex finibus. Nulla vestibulum velit tellus, ac malesuada dolor interdum eu. Etiam tincidunt massa non ornare venenatis. Quisque tincidunt tempor vehicula. Mauris ac neque consequat, ornare mi a, congue dui. Ut eu lorem semper augue posuere sodales et ut tortor. Suspendisse nec commodo nulla. Morbi accumsan mollis dui, posuere iaculis diam rutrum vel. Curabitur eu eros eget sem convallis porttitor

+

Nullam convallis eros ut fringilla semper. Suspendisse euismod elit vel libero elementum blandit non in augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus, metus quis finibus faucibus, mi mauris condimentum mauris, vitae ullamcorper risus nibh vel est. Sed euismod fringilla purus, vestibulum sodales sem egestas congue. Aliquam quis faucibus turpis. Mauris faucibus sapien at sem maximus accumsan

+

Nam ac commodo massa, vel congue nulla. Maecenas sed nisl dui. Morbi tincidunt lacinia volutpat. Nullam ut turpis eget augue tincidunt rutrum nec interdum odio. Donec convallis sapien velit, sit amet fringilla risus luctus a. In ut nibh fermentum, hendrerit nisi ut, rutrum arcu. Integer eu urna lacus. Cras gravida venenatis purus nec congue. Integer consectetur leo et nisl tincidunt malesuada. In id faucibus libero, vitae scelerisque nulla

+

Curabitur non sapien mauris. Etiam pharetra risus non luctus malesuada. Ut sagittis nunc nibh. Vestibulum vestibulum sapien justo, eu tristique augue pretium at. Proin odio turpis, porttitor eget tincidunt ac, convallis quis metus. Praesent dignissim nulla at vestibulum sollicitudin. Vivamus finibus aliquet facilisis. Vivamus ultrices augue et velit tempus malesuada. Sed convallis odio in quam feugiat malesuada. Ut quis justo lorem. Nullam bibendum ante sem, vel efficitur magna interdum quis. Curabitur quis suscipit lacus. Nam vitae velit pellentesque, varius erat lacinia, blandit lorem. Integer sed maximus nibh, eget ullamcorper velit. Morbi pellentesque dui massa, nec pellentesque lectus rhoncus a

+

Morbi id enim quis magna sagittis vulputate. Maecenas ultricies arcu sit amet arcu suscipit consectetur. Nam ligula massa, volutpat quis lectus a, tempus posuere nisl. Donec quis ullamcorper tortor. Nunc vitae est vitae turpis imperdiet consectetur. In auctor orci finibus urna lobortis, et iaculis leo lobortis. Maecenas nisi metus, euismod ut venenatis vestibulum, tempor sed velit. Donec dolor tellus, pharetra eget lorem a, vehicula rutrum odio. Cras ultricies sit amet lacus porta gravida. In quis est at elit condimentum laoreet

+

Praesent venenatis at mi a molestie. Nulla pellentesque pharetra dolor, a gravida mauris laoreet in. Nam luctus iaculis dolor, sed cursus justo bibendum non. Cras eget vestibulum tellus. In velit sapien, tempor et vestibulum et, sodales non ligula. Maecenas risus orci, bibendum quis lacus id, interdum mattis purus. Vivamus ex ligula, maximus eget rhoncus ut, aliquam at erat. Aliquam id leo fringilla, finibus est eget, cursus urna. Suspendisse potenti. Sed sagittis, ex non malesuada blandit, diam sem pharetra mi, in pellentesque dolor libero sit amet lacus. Aenean suscipit blandit consequat. Curabitur fermentum ac nibh condimentum mollis. Proin ac mi non eros tincidunt interdum quis vitae enim. Suspendisse suscipit id nibh sit amet elementum. Integer sagittis turpis erat, in varius elit interdum eu

+

Fusce eu varius justo. Proin in lorem luctus, bibendum dui sed, pulvinar mi. Phasellus sed erat mauris. Curabitur quam magna, porttitor sodales pellentesque blandit, eleifend at dolor. Quisque porta ac arcu vitae interdum. Nulla tempor facilisis diam, ac efficitur magna sodales non. Fusce nisi mi, fermentum nec diam id, cursus malesuada nulla. In ultricies sodales mi sollicitudin fermentum. Pellentesque et convallis nunc. Praesent arcu nunc, viverra ac congue in, laoreet sed ex. Suspendisse a neque dapibus, posuere sapien in, malesuada dui. Praesent aliquam venenatis ante, at posuere ligula molestie in. Pellentesque bibendum urna ac felis mattis, aliquet dignissim tellus porttitor. Praesent vitae mauris vehicula, lacinia augue a, sagittis diam

+

Quisque placerat lacus et quam pulvinar gravida. Integer rhoncus ante in nunc facilisis, et lobortis odio vehicula. Duis interdum nulla ligula, ac molestie nibh congue sed. Donec ac tincidunt ante. Etiam quis tortor blandit, feugiat enim eu, posuere orci. Donec sem eros, ullamcorper a leo nec, maximus ullamcorper ipsum. Pellentesque volutpat, felis ut rhoncus euismod, purus turpis hendrerit ipsum, at venenatis nisi erat id tellus. Nullam nisi enim, tincidunt eget tortor et, consequat commodo nibh. Phasellus porttitor neque at nisi tincidunt, eget ultricies felis maximus. Nullam ex lorem, accumsan ut rutrum et, cursus sit amet neque

+

Nullam pharetra ipsum quis risus condimentum, at pretium libero commodo. Sed porta ante sed iaculis pellentesque. Praesent nec pretium ligula. Etiam porttitor fringilla justo sed vestibulum. Ut elementum tortor dolor, quis pretium leo porta at. In tempor diam ac lorem suscipit, non interdum purus tristique. Morbi vitae pharetra risus

+

Fusce volutpat semper nisl, a efficitur nisl tempor in. Proin non eros mollis, eleifend risus ac, bibendum tortor. Mauris porta odio vel ultricies ullamcorper. Phasellus volutpat velit lorem, nec lobortis nisi blandit ac. Nunc ligula massa, iaculis vitae molestie eu, fermentum ac libero. Morbi ut ipsum eget nisl consequat imperdiet. Etiam eu erat sed nisl viverra egestas. Phasellus rhoncus neque lacus, ac rutrum urna mattis sed. Donec quis lectus odio

+

Aenean congue ipsum a eros gravida aliquet. Aliquam condimentum ex sit amet eros venenatis, vitae tempor ligula fringilla. Suspendisse tempus diam id enim consequat auctor. Morbi ac arcu sit amet turpis imperdiet ornare. Aliquam molestie at ipsum at venenatis. Nulla rutrum purus tincidunt libero viverra hendrerit. Suspendisse vestibulum sapien sodales, ornare diam vel, ornare magna. Morbi non mi in erat feugiat imperdiet nec at diam. Aliquam fringilla pellentesque aliquam. Suspendisse non mi vestibulum mi lacinia cursus. Integer pellentesque rutrum libero quis gravida. Nulla facilisis, purus ut dapibus pretium, leo ipsum efficitur enim, vulputate elementum lectus felis ac ante

+

Aliquam eu placerat dolor. Mauris rhoncus porta euismod. Sed quis mauris feugiat, tempor mauris eget, eleifend elit. Nulla interdum fringilla vehicula. Phasellus varius auctor urna eget tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas luctus consequat magna, sit amet facilisis lorem maximus dapibus. Sed venenatis tortor quis nisl dignissim feugiat id eget neque. Suspendisse posuere molestie elit, et blandit justo placerat eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit

+

Nullam pretium diam eu arcu tincidunt sollicitudin. Mauris finibus urna a maximus tristique. Donec quis lacus mauris. Donec consequat interdum diam, nec posuere eros. Pellentesque ultricies ligula sit amet aliquam mollis. Fusce justo mi, ultricies nec est vel, commodo consequat felis. Phasellus nec felis a est malesuada malesuada quis vitae enim. Cras hendrerit libero felis, at mattis eros ultricies vestibulum

+

Nulla nec blandit sapien. Fusce et tellus eu diam fermentum egestas blandit in erat. Etiam dictum nibh ac elit pulvinar congue. Nunc feugiat odio sodales orci ornare, et volutpat sem sollicitudin. Fusce id risus et lacus fringilla luctus. Praesent porttitor rhoncus lectus. Pellentesque vitae egestas dolor, vitae maximus felis

+

In mauris enim, vehicula in lectus non, feugiat varius est. Nam elementum ipsum erat, quis tristique neque tincidunt at. Integer sed porta urna. Vivamus eu lacinia metus. Quisque id posuere odio. Vivamus mattis sem nec leo hendrerit, ut sollicitudin sem faucibus. Quisque id justo velit

+

Integer molestie, ex ac vulputate ultricies, ante dui mollis urna, sit amet commodo urna felis a mauris. Sed augue ex, commodo non rhoncus eget, posuere ornare nunc. Cras sed quam lorem. Nam id dapibus turpis. Cras eget venenatis urna, sollicitudin faucibus ex. Maecenas diam lacus, ultricies vel neque gravida, pulvinar euismod lacus. In facilisis nulla turpis, eget interdum nulla lacinia eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce interdum tempor lectus non posuere. Integer finibus a lacus in auctor. Quisque tellus tortor, interdum tincidunt hendrerit vitae, maximus in nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus vehicula magna non risus sagittis, sed elementum diam finibus

+

Etiam justo erat, blandit a mauris eget, placerat porttitor diam. Phasellus consequat et lectus sit amet cursus. Vivamus purus ipsum, lobortis quis faucibus vitae, consectetur id orci. In mattis consectetur faucibus. Etiam rutrum venenatis massa sed molestie. Duis enim nibh, mattis ut malesuada venenatis, sollicitudin sit amet metus. Nunc luctus rutrum mi, in tempor urna viverra nec. Fusce feugiat risus ac dapibus tincidunt. Integer vel elit libero. Ut at nunc eget nulla vestibulum congue ut quis ipsum. Aliquam elementum commodo erat et auctor. Nulla condimentum sit amet diam eget consequat. Vivamus molestie laoreet risus vitae egestas. Phasellus sed pretium orci, sit amet porta lorem

+

Vestibulum eu lacinia est. Suspendisse eu iaculis odio, in tincidunt mauris. Mauris ultrices, ligula vulputate egestas imperdiet, tortor neque pulvinar lorem, vel volutpat enim leo nec dolor. Duis eleifend commodo feugiat. Nam consectetur ac erat vitae luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam hendrerit fringilla mattis. Sed mauris orci, bibendum at gravida sed, consectetur eget massa

+

Morbi fringilla tortor nisl, non rhoncus nisi varius tincidunt. Praesent scelerisque, orci vel tempor viverra, enim elit porttitor dolor, vitae condimentum elit eros vitae neque. Maecenas viverra neque at enim tempor, sit amet ullamcorper risus interdum. Praesent quis efficitur elit. Integer posuere, est ac porttitor scelerisque, orci elit lobortis velit, tincidunt pharetra mi magna et dui. Nullam scelerisque sem nec sapien imperdiet aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus

+

Sed vehicula dolor pulvinar consequat pretium. Mauris varius ut nibh sed consequat. Nunc congue libero non molestie euismod. Ut ac sagittis diam, a cursus elit. Quisque semper ac tellus non suscipit. Etiam lacus lectus, commodo et enim quis, lacinia tincidunt metus. Donec cursus felis et malesuada sodales. Donec tempor ligula in est vulputate faucibus

+

Aliquam erat volutpat. Mauris sed fringilla lacus. Nulla eu eros ac nisi pharetra molestie. Sed condimentum magna aliquam est fermentum, pretium ornare diam pellentesque. Duis nec odio sapien. Mauris eget risus ligula. Sed nec nunc consequat, venenatis dolor et, mollis risus. Nulla facilisi. Vestibulum id felis velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit

+

Fusce dictum nisl et lacus pharetra, at tincidunt mauris interdum. Maecenas ac odio in arcu ullamcorper pulvinar eu eget tortor. Duis laoreet libero sit amet massa ornare, sit amet pellentesque justo viverra. Morbi nec justo metus. Integer porttitor nunc a dolor cursus, et congue libero lobortis. Fusce imperdiet posuere nisi, et mattis arcu vestibulum ut. Etiam non dui et felis egestas ullamcorper quis eget nisi. Vestibulum vitae lorem a diam lacinia dictum. Aliquam sagittis velit est, vitae vehicula felis vestibulum vulputate. Etiam gravida urna id ligula scelerisque fringilla. Praesent orci mauris, congue eu lectus et, imperdiet convallis felis. Pellentesque sollicitudin felis nec porttitor sollicitudin. Phasellus at convallis urna. Morbi auctor ipsum eget risus convallis tempus. Cras porta ipsum interdum, rutrum ipsum nec, porta magna

+

Duis pharetra ligula ac libero vulputate, vel gravida orci venenatis. Fusce fermentum nisl nec maximus posuere. Morbi ac porta diam. Curabitur laoreet maximus maximus. Curabitur porttitor turpis sit amet elementum eleifend. Aliquam erat volutpat. Vestibulum dictum ipsum est, non mollis mauris porttitor id. Morbi condimentum, ante sit amet venenatis gravida, justo magna commodo diam, at faucibus enim nibh ut risus. Curabitur cursus imperdiet mattis. Nullam convallis augue in lorem consequat aliquet. Suspendisse blandit ut velit eu fringilla. Vestibulum vel lacinia eros. Suspendisse sit amet venenatis metus

+

Aenean vel suscipit tortor. Aenean iaculis magna in viverra rhoncus. Integer ornare vitae lacus vitae sagittis. Fusce ac ligula vitae tortor sollicitudin auctor. Quisque urna elit, tincidunt quis leo eget, porta tempus arcu. Cras porttitor tempus enim, non suscipit nisi. Suspendisse porta metus eget sapien blandit, quis commodo odio ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque ullamcorper convallis nulla iaculis imperdiet. Curabitur et urna ut massa interdum viverra sit amet eget mauris. Vestibulum sed sem ac est iaculis mattis et non eros. Aenean quis sem feugiat, pretium mi ac, consequat urna. Mauris lacinia rutrum mauris, ut ullamcorper nisi imperdiet vel. Sed ac dignissim lacus. Vestibulum ex neque, interdum quis massa id, posuere vestibulum odio. Cras ut diam sed augue aliquet auctor

+

Aliquam mauris augue, tristique sed varius dignissim, euismod et nibh. Nullam faucibus, nisi a tincidunt venenatis, nibh neque faucibus tortor, eu convallis magna nisi et tortor. Cras molestie sapien ipsum, quis hendrerit ipsum vulputate eu. Fusce dui risus, mattis at aliquam a, condimentum malesuada sem. Fusce urna dolor, consectetur interdum ultricies in, dignissim a mi. Praesent sit amet nulla iaculis, maximus dolor in, pulvinar dui. Fusce placerat efficitur augue id consectetur. Integer pulvinar dictum molestie. Suspendisse potenti. Suspendisse aliquam lectus ut varius luctus. Sed placerat tempor nunc et tincidunt. Proin euismod eros eu ex tincidunt, a euismod felis euismod

+

Suspendisse euismod metus ut nisi porta, in fermentum nisl fermentum. Donec luctus sagittis sem sed posuere. Donec at commodo dui, sed pharetra urna. Morbi laoreet ligula et semper pellentesque. Donec commodo dictum ipsum, pretium cursus est eleifend ac. Etiam a orci at tellus commodo bibendum et ac diam. Aenean consectetur, felis eu pretium pulvinar, nisl metus iaculis nisl, tempor lacinia magna mauris nec metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam nec nibh eget dolor cursus tincidunt

+

Integer vestibulum dolor quis neque maximus, ac gravida ligula varius. Proin vulputate ante eget ligula lacinia laoreet. Vivamus tempus sagittis auctor. Fusce imperdiet a odio ac euismod. Vestibulum lacus tellus, consectetur quis eros ut, interdum eleifend neque. Praesent ex sem, aliquam eget vulputate vehicula, dapibus in massa. Duis a efficitur enim

+

Ut ipsum tortor, pellentesque nec mollis pulvinar, condimentum nec nisi. Quisque pretium, quam sed finibus consequat, ex justo dignissim enim, vel mattis felis lorem vel diam. Duis cursus, velit at iaculis dictum, ipsum odio pretium risus, venenatis ultricies elit odio quis eros. Mauris odio libero, eleifend in mi nec, efficitur malesuada magna. Praesent auctor pellentesque sem semper dignissim. Etiam ut urna lacus. In quis gravida felis

+

Sed lacinia non urna ac condimentum. Integer feugiat vehicula lacus, quis aliquet turpis. Cras vel nisl sit amet lorem bibendum egestas. Phasellus in elementum lectus, sed egestas dolor. Vestibulum et velit volutpat, vulputate sapien sed, ullamcorper felis. Nam eu viverra augue. Aenean egestas, massa et ullamcorper imperdiet, ante purus condimentum erat, nec viverra lectus massa non dolor. Sed nibh tellus, convallis sed ligula eget, convallis pulvinar felis. Vivamus euismod id eros eget vestibulum. Morbi mattis est vitae consectetur pellentesque. Praesent suscipit in turpis ut feugiat. Sed facilisis consequat urna nec faucibus. Mauris sodales tortor nibh, id tempor urna cursus ut

+

Etiam et orci quis nibh varius placerat. Maecenas convallis metus magna, et auctor ligula mattis et. Curabitur id sapien vitae neque ullamcorper ultricies. Etiam nisl felis, cursus quis nisl sit amet, euismod hendrerit nisl. Vivamus vestibulum aliquam risus, nec euismod libero viverra vitae. In sit amet cursus arcu. Sed ullamcorper id urna vel rhoncus. Nunc auctor porttitor nibh, eu accumsan lectus gravida eget. Nullam posuere arcu in ex volutpat auctor efficitur vel neque. Curabitur id ante suscipit, dictum eros feugiat, iaculis dui. Fusce hendrerit mauris ac libero malesuada efficitur. Morbi a ultrices nulla, vitae rutrum lorem. Maecenas vel ligula tempus, sagittis dui eget, congue est. Phasellus sit amet laoreet ex

+

Nulla facilisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales diam a pharetra hendrerit. Nulla rutrum vehicula eros vel ultrices. Aliquam imperdiet sagittis leo, nec ullamcorper orci tempor in. Aliquam luctus ut nulla at eleifend. Duis sapien lorem, consequat a nisl semper, rhoncus aliquet sapien. Sed in velit posuere, tincidunt ex vitae, congue turpis. Nam sollicitudin dolor elit, non finibus arcu porta et. Sed efficitur metus justo, et faucibus justo viverra eu. Etiam porttitor convallis turpis, non gravida nulla tempus quis. Nulla lobortis venenatis purus, sed porttitor dolor fringilla et. Morbi porta lectus non erat sollicitudin rhoncus. Proin pretium placerat vehicula. Morbi et nibh elementum dolor egestas efficitur

+

Cras ornare eros ac elit cursus, eget ornare nulla ullamcorper. Sed arcu urna, sagittis luctus lacus eu, mattis eleifend massa. Sed condimentum lorem sit amet luctus elementum. Morbi et quam in nunc elementum hendrerit rutrum fringilla lorem. Phasellus rhoncus diam tellus, nec porta arcu eleifend ac. Etiam justo massa, egestas sit amet magna vel, maximus faucibus dui. Ut imperdiet mollis nisi, ac lobortis nibh pharetra at. Cras bibendum, arcu ut sollicitudin imperdiet, nulla mi venenatis enim, a blandit orci nisi vitae nibh

+

Donec congue, sem a accumsan ultricies, lacus metus lacinia dui, eget hendrerit felis eros id nulla. Donec varius mi vel blandit ultrices. Duis in lorem orci. Duis rutrum nisl eu varius faucibus. Sed quis vestibulum purus. Donec facilisis magna turpis. Nam quis nulla luctus, sagittis ligula eu, venenatis eros. Nulla facilisi. Sed non mauris dictum, commodo diam in, mollis est. In nec urna vehicula, sagittis justo posuere, condimentum metus. Aliquam commodo nulla quis volutpat porttitor. Quisque vel massa vulputate, tincidunt diam sit amet, commodo justo

+

Mauris iaculis dui eu dolor euismod pretium. Nulla facilisi. Duis nisl elit, commodo vitae diam in, dapibus ultricies sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque ultrices congue magna, mollis ultrices tellus suscipit sed. Phasellus ultrices sem ex. Vestibulum ut turpis quis eros interdum viverra. Nunc ullamcorper imperdiet tellus, nec consequat velit viverra eu. Nulla facilisi. Nulla quis lobortis lacus, et ultricies lectus. Quisque volutpat venenatis massa, id fermentum metus. Duis efficitur nisl eu posuere mattis. Integer nec ipsum quis turpis pretium luctus

+

Nulla vitae neque auctor, consequat massa quis, molestie felis. Fusce pellentesque semper aliquam. Ut semper, dolor quis accumsan dictum, lacus urna bibendum diam, quis faucibus orci risus quis ipsum. Nullam venenatis metus ac diam rutrum, non tincidunt lacus gravida. Maecenas ac pellentesque justo. Praesent in auctor urna, ac vestibulum leo. Cras ut volutpat lacus, eu porta metus

+

Integer egestas hendrerit libero eget euismod. Maecenas eleifend erat sit amet ipsum finibus, sit amet finibus est tincidunt. Etiam auctor dui ac urna mollis auctor. Cras vehicula enim non cursus tristique. Ut sed enim viverra, malesuada dui in, tempus tortor. Suspendisse potenti. Integer vestibulum blandit cursus

+

Integer ultrices eros quis rutrum molestie. Ut euismod pulvinar eros. Vivamus facilisis laoreet pellentesque. Quisque molestie nec dolor ut scelerisque. Curabitur finibus ante nisi, ac porttitor mauris mattis eget. Proin cursus lobortis mi non vehicula. Etiam purus ex, porta vel ante eu, vestibulum aliquet augue. Phasellus tempor blandit lectus ac finibus. Sed interdum tellus felis, rhoncus vehicula elit scelerisque vel. Nullam aliquam nisi at tortor pulvinar, a commodo est volutpat. Vestibulum sed iaculis mauris. Cras iaculis molestie orci sed posuere. Vestibulum ac vestibulum sem

+

Vivamus vitae enim et neque venenatis tempus. Curabitur ultricies mi fermentum, pulvinar diam et, tempor eros. Phasellus ornare hendrerit velit quis sollicitudin. Suspendisse ac justo eu orci porttitor varius. In tempus felis eu sagittis suscipit. Nam eu nibh quis leo lacinia commodo sit amet sed nisi. Suspendisse ligula ligula, feugiat sit amet sem sed, rhoncus euismod massa. Etiam non lorem in mauris suscipit faucibus eget nec nisl. Pellentesque placerat dui ut nisi dignissim, ac viverra elit ultricies

+

In at nibh a arcu commodo dignissim. Sed quis sapien congue, suscipit urna quis, posuere enim. Nunc cursus tellus a nisl elementum efficitur. Vestibulum non est vulputate, facilisis ante scelerisque, tristique massa. Pellentesque ante sem, tincidunt at leo sed, faucibus laoreet mi. Morbi nec bibendum sapien. Cras a odio pulvinar, tincidunt tellus sit amet, cursus ligula

+

Nunc sed consequat enim. Duis suscipit nunc quis velit tincidunt, in suscipit erat accumsan. Mauris tristique ornare nisl, ut egestas ante. Donec ac semper ipsum. Nulla eget dolor lacinia mi dapibus laoreet. Vivamus sed bibendum diam. Praesent tempor massa id dui imperdiet cursus. Sed luctus risus nec dapibus tristique. Aliquam accumsan nisi vitae commodo accumsan. Duis commodo nibh sed erat tincidunt, in pretium nibh suscipit. Suspendisse at interdum arcu, at posuere lacus. Vestibulum accumsan iaculis porta. Nam justo odio, euismod ac leo non, viverra auctor sapien

+

Vivamus eget velit ut nunc ultricies porttitor. Fusce vestibulum bibendum laoreet. Praesent tristique arcu in nibh lobortis, eget vestibulum lacus ultricies. In et venenatis augue. Donec quis accumsan ipsum, sit amet euismod lacus. Suspendisse ultricies mattis dolor. Morbi viverra, quam sit amet ornare luctus, nunc quam blandit nisl, et mattis ipsum urna id nulla. Etiam semper risus nec felis lobortis, volutpat accumsan erat interdum. Nulla molestie vel erat a congue. In feugiat vestibulum purus ut commodo. Praesent sagittis turpis ut lacus suscipit ultrices. Suspendisse sed aliquam urna, vestibulum venenatis magna. Aliquam iaculis sed leo vel consectetur. Nunc quis pretium ex. Sed malesuada est ex, et efficitur est feugiat ultricies. Nullam vulputate tortor id rutrum aliquet

+

Integer et magna mi. Integer a quam purus. Nunc blandit ut est id pellentesque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam ligula massa, vel dignissim nulla feugiat a. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam pulvinar feugiat sagittis. Mauris sodales, nisl consequat ullamcorper malesuada, lectus nunc aliquet ipsum, at sollicitudin tellus arcu nec ex. Aenean commodo felis et diam mollis porttitor. Nulla at est et turpis dignissim cursus vel vel arcu. Duis consequat urna ac nisl suscipit, ut rhoncus lectus pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean risus mauris, faucibus quis arcu luctus, hendrerit vestibulum nunc

+

Sed dignissim condimentum massa, et vulputate elit imperdiet ac. Vivamus elementum risus luctus, aliquam elit dignissim, euismod mauris. Nam id tempus ex. Quisque lacinia tincidunt nisl, at bibendum diam congue sed. Donec ex massa, lacinia ut feugiat non, cursus sit amet velit. Maecenas quis suscipit justo. Vestibulum ex magna, scelerisque eget placerat a, consectetur id ante. Pellentesque commodo, purus ut pharetra tincidunt, felis mi fringilla urna, a ultricies lacus nisl ac arcu. Duis molestie vestibulum est, sit amet egestas ipsum sagittis ac. Donec tempor urna sem, pharetra tincidunt ligula faucibus in. Ut eu fringilla ante. Nulla mauris tortor, mattis a ligula bibendum, pharetra euismod neque. Proin sit amet imperdiet nulla. Nam gravida eros in ex gravida vehicula. Nulla a augue nec mauris efficitur bibendum. Aliquam fringilla finibus lectus, sed euismod turpis ullamcorper in

+

Suspendisse rutrum dolor convallis diam vestibulum, vel iaculis leo pulvinar. Quisque consequat orci et ipsum maximus vehicula. Phasellus dignissim ac ante a dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In bibendum ipsum et nibh porttitor, et commodo lacus eleifend. Ut vel semper libero, ac porttitor est. Donec lacus turpis, vestibulum quis congue at, rhoncus feugiat dui

+

Maecenas commodo lectus magna, ac auctor dolor ultrices id. Donec varius mattis pretium. Suspendisse potenti. Nam tempus nisi odio, at pretium risus finibus eu. Vivamus fermentum mi sit amet odio hendrerit, quis condimentum arcu tristique. Praesent id faucibus tortor, eget suscipit sem. Aliquam vestibulum est vel felis semper iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique tincidunt arcu in faucibus. Mauris feugiat in nibh eleifend scelerisque. Proin et turpis ut nibh tincidunt ornare eu vitae lorem. Nunc et suscipit massa, ac dignissim erat. Aliquam imperdiet vestibulum dignissim. Integer scelerisque felis ante, id vehicula velit pharetra et. Suspendisse condimentum eget ante vel egestas. Morbi pellentesque ante et nunc gravida cursus

+

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

+

Fusce efficitur mi eget quam scelerisque convallis. Quisque suscipit lacus nisl, sed tincidunt est congue eget. Etiam at cursus enim. Cras convallis maximus finibus. Proin elementum mi vel lobortis iaculis. Duis bibendum feugiat orci ac posuere. Duis vehicula, magna in efficitur pulvinar, nisl lacus elementum quam, nec volutpat tortor est vel libero. Vivamus eu bibendum diam, ac ultricies dui. Nullam nec mauris erat. Nam imperdiet massa vel metus ultricies semper.

+
+
+ + +
+
diff --git a/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html b/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html index 0d9c2ab2a94..9ea9f46026c 100644 --- a/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html +++ b/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html @@ -48,70 +48,72 @@ id="test-dialog">
-

- Fire photon torpedoes? -

-
-

Shields at 60% and falling, captain.

-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

-

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

-

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed est. Morbi pulvinar odio sed neque pharetra, nec feugiat arcu ullamcorper. Nam orci nisl, dapibus nec arcu ac, molestie cursus massa. Quisque vestibulum et ligula sed lacinia. Quisque tincidunt est id aliquet suscipit. Nulla facilisi

-

Nulla pretium arcu volutpat aliquet aliquet. Vivamus at ultricies massa. Mauris imperdiet orci vitae quam viverra, eget condimentum ex finibus. Nulla vestibulum velit tellus, ac malesuada dolor interdum eu. Etiam tincidunt massa non ornare venenatis. Quisque tincidunt tempor vehicula. Mauris ac neque consequat, ornare mi a, congue dui. Ut eu lorem semper augue posuere sodales et ut tortor. Suspendisse nec commodo nulla. Morbi accumsan mollis dui, posuere iaculis diam rutrum vel. Curabitur eu eros eget sem convallis porttitor

-

Nullam convallis eros ut fringilla semper. Suspendisse euismod elit vel libero elementum blandit non in augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus, metus quis finibus faucibus, mi mauris condimentum mauris, vitae ullamcorper risus nibh vel est. Sed euismod fringilla purus, vestibulum sodales sem egestas congue. Aliquam quis faucibus turpis. Mauris faucibus sapien at sem maximus accumsan

-

Nam ac commodo massa, vel congue nulla. Maecenas sed nisl dui. Morbi tincidunt lacinia volutpat. Nullam ut turpis eget augue tincidunt rutrum nec interdum odio. Donec convallis sapien velit, sit amet fringilla risus luctus a. In ut nibh fermentum, hendrerit nisi ut, rutrum arcu. Integer eu urna lacus. Cras gravida venenatis purus nec congue. Integer consectetur leo et nisl tincidunt malesuada. In id faucibus libero, vitae scelerisque nulla

-

Curabitur non sapien mauris. Etiam pharetra risus non luctus malesuada. Ut sagittis nunc nibh. Vestibulum vestibulum sapien justo, eu tristique augue pretium at. Proin odio turpis, porttitor eget tincidunt ac, convallis quis metus. Praesent dignissim nulla at vestibulum sollicitudin. Vivamus finibus aliquet facilisis. Vivamus ultrices augue et velit tempus malesuada. Sed convallis odio in quam feugiat malesuada. Ut quis justo lorem. Nullam bibendum ante sem, vel efficitur magna interdum quis. Curabitur quis suscipit lacus. Nam vitae velit pellentesque, varius erat lacinia, blandit lorem. Integer sed maximus nibh, eget ullamcorper velit. Morbi pellentesque dui massa, nec pellentesque lectus rhoncus a

-

Morbi id enim quis magna sagittis vulputate. Maecenas ultricies arcu sit amet arcu suscipit consectetur. Nam ligula massa, volutpat quis lectus a, tempus posuere nisl. Donec quis ullamcorper tortor. Nunc vitae est vitae turpis imperdiet consectetur. In auctor orci finibus urna lobortis, et iaculis leo lobortis. Maecenas nisi metus, euismod ut venenatis vestibulum, tempor sed velit. Donec dolor tellus, pharetra eget lorem a, vehicula rutrum odio. Cras ultricies sit amet lacus porta gravida. In quis est at elit condimentum laoreet

-

Praesent venenatis at mi a molestie. Nulla pellentesque pharetra dolor, a gravida mauris laoreet in. Nam luctus iaculis dolor, sed cursus justo bibendum non. Cras eget vestibulum tellus. In velit sapien, tempor et vestibulum et, sodales non ligula. Maecenas risus orci, bibendum quis lacus id, interdum mattis purus. Vivamus ex ligula, maximus eget rhoncus ut, aliquam at erat. Aliquam id leo fringilla, finibus est eget, cursus urna. Suspendisse potenti. Sed sagittis, ex non malesuada blandit, diam sem pharetra mi, in pellentesque dolor libero sit amet lacus. Aenean suscipit blandit consequat. Curabitur fermentum ac nibh condimentum mollis. Proin ac mi non eros tincidunt interdum quis vitae enim. Suspendisse suscipit id nibh sit amet elementum. Integer sagittis turpis erat, in varius elit interdum eu

-

Fusce eu varius justo. Proin in lorem luctus, bibendum dui sed, pulvinar mi. Phasellus sed erat mauris. Curabitur quam magna, porttitor sodales pellentesque blandit, eleifend at dolor. Quisque porta ac arcu vitae interdum. Nulla tempor facilisis diam, ac efficitur magna sodales non. Fusce nisi mi, fermentum nec diam id, cursus malesuada nulla. In ultricies sodales mi sollicitudin fermentum. Pellentesque et convallis nunc. Praesent arcu nunc, viverra ac congue in, laoreet sed ex. Suspendisse a neque dapibus, posuere sapien in, malesuada dui. Praesent aliquam venenatis ante, at posuere ligula molestie in. Pellentesque bibendum urna ac felis mattis, aliquet dignissim tellus porttitor. Praesent vitae mauris vehicula, lacinia augue a, sagittis diam

-

Quisque placerat lacus et quam pulvinar gravida. Integer rhoncus ante in nunc facilisis, et lobortis odio vehicula. Duis interdum nulla ligula, ac molestie nibh congue sed. Donec ac tincidunt ante. Etiam quis tortor blandit, feugiat enim eu, posuere orci. Donec sem eros, ullamcorper a leo nec, maximus ullamcorper ipsum. Pellentesque volutpat, felis ut rhoncus euismod, purus turpis hendrerit ipsum, at venenatis nisi erat id tellus. Nullam nisi enim, tincidunt eget tortor et, consequat commodo nibh. Phasellus porttitor neque at nisi tincidunt, eget ultricies felis maximus. Nullam ex lorem, accumsan ut rutrum et, cursus sit amet neque

-

Nullam pharetra ipsum quis risus condimentum, at pretium libero commodo. Sed porta ante sed iaculis pellentesque. Praesent nec pretium ligula. Etiam porttitor fringilla justo sed vestibulum. Ut elementum tortor dolor, quis pretium leo porta at. In tempor diam ac lorem suscipit, non interdum purus tristique. Morbi vitae pharetra risus

-

Fusce volutpat semper nisl, a efficitur nisl tempor in. Proin non eros mollis, eleifend risus ac, bibendum tortor. Mauris porta odio vel ultricies ullamcorper. Phasellus volutpat velit lorem, nec lobortis nisi blandit ac. Nunc ligula massa, iaculis vitae molestie eu, fermentum ac libero. Morbi ut ipsum eget nisl consequat imperdiet. Etiam eu erat sed nisl viverra egestas. Phasellus rhoncus neque lacus, ac rutrum urna mattis sed. Donec quis lectus odio

-

Aenean congue ipsum a eros gravida aliquet. Aliquam condimentum ex sit amet eros venenatis, vitae tempor ligula fringilla. Suspendisse tempus diam id enim consequat auctor. Morbi ac arcu sit amet turpis imperdiet ornare. Aliquam molestie at ipsum at venenatis. Nulla rutrum purus tincidunt libero viverra hendrerit. Suspendisse vestibulum sapien sodales, ornare diam vel, ornare magna. Morbi non mi in erat feugiat imperdiet nec at diam. Aliquam fringilla pellentesque aliquam. Suspendisse non mi vestibulum mi lacinia cursus. Integer pellentesque rutrum libero quis gravida. Nulla facilisis, purus ut dapibus pretium, leo ipsum efficitur enim, vulputate elementum lectus felis ac ante

-

Aliquam eu placerat dolor. Mauris rhoncus porta euismod. Sed quis mauris feugiat, tempor mauris eget, eleifend elit. Nulla interdum fringilla vehicula. Phasellus varius auctor urna eget tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas luctus consequat magna, sit amet facilisis lorem maximus dapibus. Sed venenatis tortor quis nisl dignissim feugiat id eget neque. Suspendisse posuere molestie elit, et blandit justo placerat eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit

-

Nullam pretium diam eu arcu tincidunt sollicitudin. Mauris finibus urna a maximus tristique. Donec quis lacus mauris. Donec consequat interdum diam, nec posuere eros. Pellentesque ultricies ligula sit amet aliquam mollis. Fusce justo mi, ultricies nec est vel, commodo consequat felis. Phasellus nec felis a est malesuada malesuada quis vitae enim. Cras hendrerit libero felis, at mattis eros ultricies vestibulum

-

Nulla nec blandit sapien. Fusce et tellus eu diam fermentum egestas blandit in erat. Etiam dictum nibh ac elit pulvinar congue. Nunc feugiat odio sodales orci ornare, et volutpat sem sollicitudin. Fusce id risus et lacus fringilla luctus. Praesent porttitor rhoncus lectus. Pellentesque vitae egestas dolor, vitae maximus felis

-

In mauris enim, vehicula in lectus non, feugiat varius est. Nam elementum ipsum erat, quis tristique neque tincidunt at. Integer sed porta urna. Vivamus eu lacinia metus. Quisque id posuere odio. Vivamus mattis sem nec leo hendrerit, ut sollicitudin sem faucibus. Quisque id justo velit

-

Integer molestie, ex ac vulputate ultricies, ante dui mollis urna, sit amet commodo urna felis a mauris. Sed augue ex, commodo non rhoncus eget, posuere ornare nunc. Cras sed quam lorem. Nam id dapibus turpis. Cras eget venenatis urna, sollicitudin faucibus ex. Maecenas diam lacus, ultricies vel neque gravida, pulvinar euismod lacus. In facilisis nulla turpis, eget interdum nulla lacinia eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce interdum tempor lectus non posuere. Integer finibus a lacus in auctor. Quisque tellus tortor, interdum tincidunt hendrerit vitae, maximus in nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus vehicula magna non risus sagittis, sed elementum diam finibus

-

Etiam justo erat, blandit a mauris eget, placerat porttitor diam. Phasellus consequat et lectus sit amet cursus. Vivamus purus ipsum, lobortis quis faucibus vitae, consectetur id orci. In mattis consectetur faucibus. Etiam rutrum venenatis massa sed molestie. Duis enim nibh, mattis ut malesuada venenatis, sollicitudin sit amet metus. Nunc luctus rutrum mi, in tempor urna viverra nec. Fusce feugiat risus ac dapibus tincidunt. Integer vel elit libero. Ut at nunc eget nulla vestibulum congue ut quis ipsum. Aliquam elementum commodo erat et auctor. Nulla condimentum sit amet diam eget consequat. Vivamus molestie laoreet risus vitae egestas. Phasellus sed pretium orci, sit amet porta lorem

-

Vestibulum eu lacinia est. Suspendisse eu iaculis odio, in tincidunt mauris. Mauris ultrices, ligula vulputate egestas imperdiet, tortor neque pulvinar lorem, vel volutpat enim leo nec dolor. Duis eleifend commodo feugiat. Nam consectetur ac erat vitae luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam hendrerit fringilla mattis. Sed mauris orci, bibendum at gravida sed, consectetur eget massa

-

Morbi fringilla tortor nisl, non rhoncus nisi varius tincidunt. Praesent scelerisque, orci vel tempor viverra, enim elit porttitor dolor, vitae condimentum elit eros vitae neque. Maecenas viverra neque at enim tempor, sit amet ullamcorper risus interdum. Praesent quis efficitur elit. Integer posuere, est ac porttitor scelerisque, orci elit lobortis velit, tincidunt pharetra mi magna et dui. Nullam scelerisque sem nec sapien imperdiet aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus

-

Sed vehicula dolor pulvinar consequat pretium. Mauris varius ut nibh sed consequat. Nunc congue libero non molestie euismod. Ut ac sagittis diam, a cursus elit. Quisque semper ac tellus non suscipit. Etiam lacus lectus, commodo et enim quis, lacinia tincidunt metus. Donec cursus felis et malesuada sodales. Donec tempor ligula in est vulputate faucibus

-

Aliquam erat volutpat. Mauris sed fringilla lacus. Nulla eu eros ac nisi pharetra molestie. Sed condimentum magna aliquam est fermentum, pretium ornare diam pellentesque. Duis nec odio sapien. Mauris eget risus ligula. Sed nec nunc consequat, venenatis dolor et, mollis risus. Nulla facilisi. Vestibulum id felis velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit

-

Fusce dictum nisl et lacus pharetra, at tincidunt mauris interdum. Maecenas ac odio in arcu ullamcorper pulvinar eu eget tortor. Duis laoreet libero sit amet massa ornare, sit amet pellentesque justo viverra. Morbi nec justo metus. Integer porttitor nunc a dolor cursus, et congue libero lobortis. Fusce imperdiet posuere nisi, et mattis arcu vestibulum ut. Etiam non dui et felis egestas ullamcorper quis eget nisi. Vestibulum vitae lorem a diam lacinia dictum. Aliquam sagittis velit est, vitae vehicula felis vestibulum vulputate. Etiam gravida urna id ligula scelerisque fringilla. Praesent orci mauris, congue eu lectus et, imperdiet convallis felis. Pellentesque sollicitudin felis nec porttitor sollicitudin. Phasellus at convallis urna. Morbi auctor ipsum eget risus convallis tempus. Cras porta ipsum interdum, rutrum ipsum nec, porta magna

-

Duis pharetra ligula ac libero vulputate, vel gravida orci venenatis. Fusce fermentum nisl nec maximus posuere. Morbi ac porta diam. Curabitur laoreet maximus maximus. Curabitur porttitor turpis sit amet elementum eleifend. Aliquam erat volutpat. Vestibulum dictum ipsum est, non mollis mauris porttitor id. Morbi condimentum, ante sit amet venenatis gravida, justo magna commodo diam, at faucibus enim nibh ut risus. Curabitur cursus imperdiet mattis. Nullam convallis augue in lorem consequat aliquet. Suspendisse blandit ut velit eu fringilla. Vestibulum vel lacinia eros. Suspendisse sit amet venenatis metus

-

Aenean vel suscipit tortor. Aenean iaculis magna in viverra rhoncus. Integer ornare vitae lacus vitae sagittis. Fusce ac ligula vitae tortor sollicitudin auctor. Quisque urna elit, tincidunt quis leo eget, porta tempus arcu. Cras porttitor tempus enim, non suscipit nisi. Suspendisse porta metus eget sapien blandit, quis commodo odio ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque ullamcorper convallis nulla iaculis imperdiet. Curabitur et urna ut massa interdum viverra sit amet eget mauris. Vestibulum sed sem ac est iaculis mattis et non eros. Aenean quis sem feugiat, pretium mi ac, consequat urna. Mauris lacinia rutrum mauris, ut ullamcorper nisi imperdiet vel. Sed ac dignissim lacus. Vestibulum ex neque, interdum quis massa id, posuere vestibulum odio. Cras ut diam sed augue aliquet auctor

-

Aliquam mauris augue, tristique sed varius dignissim, euismod et nibh. Nullam faucibus, nisi a tincidunt venenatis, nibh neque faucibus tortor, eu convallis magna nisi et tortor. Cras molestie sapien ipsum, quis hendrerit ipsum vulputate eu. Fusce dui risus, mattis at aliquam a, condimentum malesuada sem. Fusce urna dolor, consectetur interdum ultricies in, dignissim a mi. Praesent sit amet nulla iaculis, maximus dolor in, pulvinar dui. Fusce placerat efficitur augue id consectetur. Integer pulvinar dictum molestie. Suspendisse potenti. Suspendisse aliquam lectus ut varius luctus. Sed placerat tempor nunc et tincidunt. Proin euismod eros eu ex tincidunt, a euismod felis euismod

-

Suspendisse euismod metus ut nisi porta, in fermentum nisl fermentum. Donec luctus sagittis sem sed posuere. Donec at commodo dui, sed pharetra urna. Morbi laoreet ligula et semper pellentesque. Donec commodo dictum ipsum, pretium cursus est eleifend ac. Etiam a orci at tellus commodo bibendum et ac diam. Aenean consectetur, felis eu pretium pulvinar, nisl metus iaculis nisl, tempor lacinia magna mauris nec metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam nec nibh eget dolor cursus tincidunt

-

Integer vestibulum dolor quis neque maximus, ac gravida ligula varius. Proin vulputate ante eget ligula lacinia laoreet. Vivamus tempus sagittis auctor. Fusce imperdiet a odio ac euismod. Vestibulum lacus tellus, consectetur quis eros ut, interdum eleifend neque. Praesent ex sem, aliquam eget vulputate vehicula, dapibus in massa. Duis a efficitur enim

-

Ut ipsum tortor, pellentesque nec mollis pulvinar, condimentum nec nisi. Quisque pretium, quam sed finibus consequat, ex justo dignissim enim, vel mattis felis lorem vel diam. Duis cursus, velit at iaculis dictum, ipsum odio pretium risus, venenatis ultricies elit odio quis eros. Mauris odio libero, eleifend in mi nec, efficitur malesuada magna. Praesent auctor pellentesque sem semper dignissim. Etiam ut urna lacus. In quis gravida felis

-

Sed lacinia non urna ac condimentum. Integer feugiat vehicula lacus, quis aliquet turpis. Cras vel nisl sit amet lorem bibendum egestas. Phasellus in elementum lectus, sed egestas dolor. Vestibulum et velit volutpat, vulputate sapien sed, ullamcorper felis. Nam eu viverra augue. Aenean egestas, massa et ullamcorper imperdiet, ante purus condimentum erat, nec viverra lectus massa non dolor. Sed nibh tellus, convallis sed ligula eget, convallis pulvinar felis. Vivamus euismod id eros eget vestibulum. Morbi mattis est vitae consectetur pellentesque. Praesent suscipit in turpis ut feugiat. Sed facilisis consequat urna nec faucibus. Mauris sodales tortor nibh, id tempor urna cursus ut

-

Etiam et orci quis nibh varius placerat. Maecenas convallis metus magna, et auctor ligula mattis et. Curabitur id sapien vitae neque ullamcorper ultricies. Etiam nisl felis, cursus quis nisl sit amet, euismod hendrerit nisl. Vivamus vestibulum aliquam risus, nec euismod libero viverra vitae. In sit amet cursus arcu. Sed ullamcorper id urna vel rhoncus. Nunc auctor porttitor nibh, eu accumsan lectus gravida eget. Nullam posuere arcu in ex volutpat auctor efficitur vel neque. Curabitur id ante suscipit, dictum eros feugiat, iaculis dui. Fusce hendrerit mauris ac libero malesuada efficitur. Morbi a ultrices nulla, vitae rutrum lorem. Maecenas vel ligula tempus, sagittis dui eget, congue est. Phasellus sit amet laoreet ex

-

Nulla facilisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales diam a pharetra hendrerit. Nulla rutrum vehicula eros vel ultrices. Aliquam imperdiet sagittis leo, nec ullamcorper orci tempor in. Aliquam luctus ut nulla at eleifend. Duis sapien lorem, consequat a nisl semper, rhoncus aliquet sapien. Sed in velit posuere, tincidunt ex vitae, congue turpis. Nam sollicitudin dolor elit, non finibus arcu porta et. Sed efficitur metus justo, et faucibus justo viverra eu. Etiam porttitor convallis turpis, non gravida nulla tempus quis. Nulla lobortis venenatis purus, sed porttitor dolor fringilla et. Morbi porta lectus non erat sollicitudin rhoncus. Proin pretium placerat vehicula. Morbi et nibh elementum dolor egestas efficitur

-

Cras ornare eros ac elit cursus, eget ornare nulla ullamcorper. Sed arcu urna, sagittis luctus lacus eu, mattis eleifend massa. Sed condimentum lorem sit amet luctus elementum. Morbi et quam in nunc elementum hendrerit rutrum fringilla lorem. Phasellus rhoncus diam tellus, nec porta arcu eleifend ac. Etiam justo massa, egestas sit amet magna vel, maximus faucibus dui. Ut imperdiet mollis nisi, ac lobortis nibh pharetra at. Cras bibendum, arcu ut sollicitudin imperdiet, nulla mi venenatis enim, a blandit orci nisi vitae nibh

-

Donec congue, sem a accumsan ultricies, lacus metus lacinia dui, eget hendrerit felis eros id nulla. Donec varius mi vel blandit ultrices. Duis in lorem orci. Duis rutrum nisl eu varius faucibus. Sed quis vestibulum purus. Donec facilisis magna turpis. Nam quis nulla luctus, sagittis ligula eu, venenatis eros. Nulla facilisi. Sed non mauris dictum, commodo diam in, mollis est. In nec urna vehicula, sagittis justo posuere, condimentum metus. Aliquam commodo nulla quis volutpat porttitor. Quisque vel massa vulputate, tincidunt diam sit amet, commodo justo

-

Mauris iaculis dui eu dolor euismod pretium. Nulla facilisi. Duis nisl elit, commodo vitae diam in, dapibus ultricies sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque ultrices congue magna, mollis ultrices tellus suscipit sed. Phasellus ultrices sem ex. Vestibulum ut turpis quis eros interdum viverra. Nunc ullamcorper imperdiet tellus, nec consequat velit viverra eu. Nulla facilisi. Nulla quis lobortis lacus, et ultricies lectus. Quisque volutpat venenatis massa, id fermentum metus. Duis efficitur nisl eu posuere mattis. Integer nec ipsum quis turpis pretium luctus

-

Nulla vitae neque auctor, consequat massa quis, molestie felis. Fusce pellentesque semper aliquam. Ut semper, dolor quis accumsan dictum, lacus urna bibendum diam, quis faucibus orci risus quis ipsum. Nullam venenatis metus ac diam rutrum, non tincidunt lacus gravida. Maecenas ac pellentesque justo. Praesent in auctor urna, ac vestibulum leo. Cras ut volutpat lacus, eu porta metus

-

Integer egestas hendrerit libero eget euismod. Maecenas eleifend erat sit amet ipsum finibus, sit amet finibus est tincidunt. Etiam auctor dui ac urna mollis auctor. Cras vehicula enim non cursus tristique. Ut sed enim viverra, malesuada dui in, tempus tortor. Suspendisse potenti. Integer vestibulum blandit cursus

-

Integer ultrices eros quis rutrum molestie. Ut euismod pulvinar eros. Vivamus facilisis laoreet pellentesque. Quisque molestie nec dolor ut scelerisque. Curabitur finibus ante nisi, ac porttitor mauris mattis eget. Proin cursus lobortis mi non vehicula. Etiam purus ex, porta vel ante eu, vestibulum aliquet augue. Phasellus tempor blandit lectus ac finibus. Sed interdum tellus felis, rhoncus vehicula elit scelerisque vel. Nullam aliquam nisi at tortor pulvinar, a commodo est volutpat. Vestibulum sed iaculis mauris. Cras iaculis molestie orci sed posuere. Vestibulum ac vestibulum sem

-

Vivamus vitae enim et neque venenatis tempus. Curabitur ultricies mi fermentum, pulvinar diam et, tempor eros. Phasellus ornare hendrerit velit quis sollicitudin. Suspendisse ac justo eu orci porttitor varius. In tempus felis eu sagittis suscipit. Nam eu nibh quis leo lacinia commodo sit amet sed nisi. Suspendisse ligula ligula, feugiat sit amet sem sed, rhoncus euismod massa. Etiam non lorem in mauris suscipit faucibus eget nec nisl. Pellentesque placerat dui ut nisi dignissim, ac viverra elit ultricies

-

In at nibh a arcu commodo dignissim. Sed quis sapien congue, suscipit urna quis, posuere enim. Nunc cursus tellus a nisl elementum efficitur. Vestibulum non est vulputate, facilisis ante scelerisque, tristique massa. Pellentesque ante sem, tincidunt at leo sed, faucibus laoreet mi. Morbi nec bibendum sapien. Cras a odio pulvinar, tincidunt tellus sit amet, cursus ligula

-

Nunc sed consequat enim. Duis suscipit nunc quis velit tincidunt, in suscipit erat accumsan. Mauris tristique ornare nisl, ut egestas ante. Donec ac semper ipsum. Nulla eget dolor lacinia mi dapibus laoreet. Vivamus sed bibendum diam. Praesent tempor massa id dui imperdiet cursus. Sed luctus risus nec dapibus tristique. Aliquam accumsan nisi vitae commodo accumsan. Duis commodo nibh sed erat tincidunt, in pretium nibh suscipit. Suspendisse at interdum arcu, at posuere lacus. Vestibulum accumsan iaculis porta. Nam justo odio, euismod ac leo non, viverra auctor sapien

-

Vivamus eget velit ut nunc ultricies porttitor. Fusce vestibulum bibendum laoreet. Praesent tristique arcu in nibh lobortis, eget vestibulum lacus ultricies. In et venenatis augue. Donec quis accumsan ipsum, sit amet euismod lacus. Suspendisse ultricies mattis dolor. Morbi viverra, quam sit amet ornare luctus, nunc quam blandit nisl, et mattis ipsum urna id nulla. Etiam semper risus nec felis lobortis, volutpat accumsan erat interdum. Nulla molestie vel erat a congue. In feugiat vestibulum purus ut commodo. Praesent sagittis turpis ut lacus suscipit ultrices. Suspendisse sed aliquam urna, vestibulum venenatis magna. Aliquam iaculis sed leo vel consectetur. Nunc quis pretium ex. Sed malesuada est ex, et efficitur est feugiat ultricies. Nullam vulputate tortor id rutrum aliquet

-

Integer et magna mi. Integer a quam purus. Nunc blandit ut est id pellentesque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam ligula massa, vel dignissim nulla feugiat a. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam pulvinar feugiat sagittis. Mauris sodales, nisl consequat ullamcorper malesuada, lectus nunc aliquet ipsum, at sollicitudin tellus arcu nec ex. Aenean commodo felis et diam mollis porttitor. Nulla at est et turpis dignissim cursus vel vel arcu. Duis consequat urna ac nisl suscipit, ut rhoncus lectus pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean risus mauris, faucibus quis arcu luctus, hendrerit vestibulum nunc

-

Sed dignissim condimentum massa, et vulputate elit imperdiet ac. Vivamus elementum risus luctus, aliquam elit dignissim, euismod mauris. Nam id tempus ex. Quisque lacinia tincidunt nisl, at bibendum diam congue sed. Donec ex massa, lacinia ut feugiat non, cursus sit amet velit. Maecenas quis suscipit justo. Vestibulum ex magna, scelerisque eget placerat a, consectetur id ante. Pellentesque commodo, purus ut pharetra tincidunt, felis mi fringilla urna, a ultricies lacus nisl ac arcu. Duis molestie vestibulum est, sit amet egestas ipsum sagittis ac. Donec tempor urna sem, pharetra tincidunt ligula faucibus in. Ut eu fringilla ante. Nulla mauris tortor, mattis a ligula bibendum, pharetra euismod neque. Proin sit amet imperdiet nulla. Nam gravida eros in ex gravida vehicula. Nulla a augue nec mauris efficitur bibendum. Aliquam fringilla finibus lectus, sed euismod turpis ullamcorper in

-

Suspendisse rutrum dolor convallis diam vestibulum, vel iaculis leo pulvinar. Quisque consequat orci et ipsum maximus vehicula. Phasellus dignissim ac ante a dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In bibendum ipsum et nibh porttitor, et commodo lacus eleifend. Ut vel semper libero, ac porttitor est. Donec lacus turpis, vestibulum quis congue at, rhoncus feugiat dui

-

Maecenas commodo lectus magna, ac auctor dolor ultrices id. Donec varius mattis pretium. Suspendisse potenti. Nam tempus nisi odio, at pretium risus finibus eu. Vivamus fermentum mi sit amet odio hendrerit, quis condimentum arcu tristique. Praesent id faucibus tortor, eget suscipit sem. Aliquam vestibulum est vel felis semper iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique tincidunt arcu in faucibus. Mauris feugiat in nibh eleifend scelerisque. Proin et turpis ut nibh tincidunt ornare eu vitae lorem. Nunc et suscipit massa, ac dignissim erat. Aliquam imperdiet vestibulum dignissim. Integer scelerisque felis ante, id vehicula velit pharetra et. Suspendisse condimentum eget ante vel egestas. Morbi pellentesque ante et nunc gravida cursus

-

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

-

Fusce efficitur mi eget quam scelerisque convallis. Quisque suscipit lacus nisl, sed tincidunt est congue eget. Etiam at cursus enim. Cras convallis maximus finibus. Proin elementum mi vel lobortis iaculis. Duis bibendum feugiat orci ac posuere. Duis vehicula, magna in efficitur pulvinar, nisl lacus elementum quam, nec volutpat tortor est vel libero. Vivamus eu bibendum diam, ac ultricies dui. Nullam nec mauris erat. Nam imperdiet massa vel metus ultricies semper.

-
-
- - -
+
+

+ Fire photon torpedoes? +

+
+

Shields at 60% and falling, captain.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec. Aliquam a elit sit amet quam sagittis pretium eu non leo. Sed vel sem ac diam scelerisque consectetur. Integer lacinia vitae turpis sed vehicula. Nullam eu purus eros. Donec rutrum, justo vel viverra faucibus, lectus purus fringilla ex, sed pharetra mi leo nec mi. Aenean feugiat justo lacus, eget tristique odio ullamcorper in. Vivamus dignissim bibendum tempor. Phasellus felis turpis, sodales quis quam vehicula, ullamcorper suscipit nisi. Vestibulum pharetra tellus sed magna sagittis lacinia

+

Mauris malesuada, nisi a ullamcorper auctor, nisi augue dignissim diam, sed commodo lacus erat quis nisl. Aenean molestie laoreet rhoncus. Proin elementum eu felis et elementum. Quisque diam metus, mattis ac nunc non, molestie suscipit sapien. Cras tempor neque a tincidunt ornare. Etiam sed ex at odio placerat faucibus. Vestibulum facilisis nunc non ultrices condimentum. Integer consequat hendrerit mi et aliquam. Cras imperdiet tortor vestibulum auctor egestas

+

Nullam efficitur libero quis faucibus iaculis. Nulla non ex id ante sodales interdum. Vestibulum sit amet ultrices felis, in consequat neque. Aenean vel dui quis erat pretium malesuada id eget sem. Sed feugiat, velit vitae cursus suscipit, leo risus lobortis velit, id imperdiet purus nulla non elit. Nunc commodo facilisis mattis. Duis tincidunt enim ut sapien lobortis, eu condimentum nulla euismod. Proin mauris nisl, tempor eu pretium nec, suscipit sed est. Morbi pulvinar odio sed neque pharetra, nec feugiat arcu ullamcorper. Nam orci nisl, dapibus nec arcu ac, molestie cursus massa. Quisque vestibulum et ligula sed lacinia. Quisque tincidunt est id aliquet suscipit. Nulla facilisi

+

Nulla pretium arcu volutpat aliquet aliquet. Vivamus at ultricies massa. Mauris imperdiet orci vitae quam viverra, eget condimentum ex finibus. Nulla vestibulum velit tellus, ac malesuada dolor interdum eu. Etiam tincidunt massa non ornare venenatis. Quisque tincidunt tempor vehicula. Mauris ac neque consequat, ornare mi a, congue dui. Ut eu lorem semper augue posuere sodales et ut tortor. Suspendisse nec commodo nulla. Morbi accumsan mollis dui, posuere iaculis diam rutrum vel. Curabitur eu eros eget sem convallis porttitor

+

Nullam convallis eros ut fringilla semper. Suspendisse euismod elit vel libero elementum blandit non in augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut dapibus, metus quis finibus faucibus, mi mauris condimentum mauris, vitae ullamcorper risus nibh vel est. Sed euismod fringilla purus, vestibulum sodales sem egestas congue. Aliquam quis faucibus turpis. Mauris faucibus sapien at sem maximus accumsan

+

Nam ac commodo massa, vel congue nulla. Maecenas sed nisl dui. Morbi tincidunt lacinia volutpat. Nullam ut turpis eget augue tincidunt rutrum nec interdum odio. Donec convallis sapien velit, sit amet fringilla risus luctus a. In ut nibh fermentum, hendrerit nisi ut, rutrum arcu. Integer eu urna lacus. Cras gravida venenatis purus nec congue. Integer consectetur leo et nisl tincidunt malesuada. In id faucibus libero, vitae scelerisque nulla

+

Curabitur non sapien mauris. Etiam pharetra risus non luctus malesuada. Ut sagittis nunc nibh. Vestibulum vestibulum sapien justo, eu tristique augue pretium at. Proin odio turpis, porttitor eget tincidunt ac, convallis quis metus. Praesent dignissim nulla at vestibulum sollicitudin. Vivamus finibus aliquet facilisis. Vivamus ultrices augue et velit tempus malesuada. Sed convallis odio in quam feugiat malesuada. Ut quis justo lorem. Nullam bibendum ante sem, vel efficitur magna interdum quis. Curabitur quis suscipit lacus. Nam vitae velit pellentesque, varius erat lacinia, blandit lorem. Integer sed maximus nibh, eget ullamcorper velit. Morbi pellentesque dui massa, nec pellentesque lectus rhoncus a

+

Morbi id enim quis magna sagittis vulputate. Maecenas ultricies arcu sit amet arcu suscipit consectetur. Nam ligula massa, volutpat quis lectus a, tempus posuere nisl. Donec quis ullamcorper tortor. Nunc vitae est vitae turpis imperdiet consectetur. In auctor orci finibus urna lobortis, et iaculis leo lobortis. Maecenas nisi metus, euismod ut venenatis vestibulum, tempor sed velit. Donec dolor tellus, pharetra eget lorem a, vehicula rutrum odio. Cras ultricies sit amet lacus porta gravida. In quis est at elit condimentum laoreet

+

Praesent venenatis at mi a molestie. Nulla pellentesque pharetra dolor, a gravida mauris laoreet in. Nam luctus iaculis dolor, sed cursus justo bibendum non. Cras eget vestibulum tellus. In velit sapien, tempor et vestibulum et, sodales non ligula. Maecenas risus orci, bibendum quis lacus id, interdum mattis purus. Vivamus ex ligula, maximus eget rhoncus ut, aliquam at erat. Aliquam id leo fringilla, finibus est eget, cursus urna. Suspendisse potenti. Sed sagittis, ex non malesuada blandit, diam sem pharetra mi, in pellentesque dolor libero sit amet lacus. Aenean suscipit blandit consequat. Curabitur fermentum ac nibh condimentum mollis. Proin ac mi non eros tincidunt interdum quis vitae enim. Suspendisse suscipit id nibh sit amet elementum. Integer sagittis turpis erat, in varius elit interdum eu

+

Fusce eu varius justo. Proin in lorem luctus, bibendum dui sed, pulvinar mi. Phasellus sed erat mauris. Curabitur quam magna, porttitor sodales pellentesque blandit, eleifend at dolor. Quisque porta ac arcu vitae interdum. Nulla tempor facilisis diam, ac efficitur magna sodales non. Fusce nisi mi, fermentum nec diam id, cursus malesuada nulla. In ultricies sodales mi sollicitudin fermentum. Pellentesque et convallis nunc. Praesent arcu nunc, viverra ac congue in, laoreet sed ex. Suspendisse a neque dapibus, posuere sapien in, malesuada dui. Praesent aliquam venenatis ante, at posuere ligula molestie in. Pellentesque bibendum urna ac felis mattis, aliquet dignissim tellus porttitor. Praesent vitae mauris vehicula, lacinia augue a, sagittis diam

+

Quisque placerat lacus et quam pulvinar gravida. Integer rhoncus ante in nunc facilisis, et lobortis odio vehicula. Duis interdum nulla ligula, ac molestie nibh congue sed. Donec ac tincidunt ante. Etiam quis tortor blandit, feugiat enim eu, posuere orci. Donec sem eros, ullamcorper a leo nec, maximus ullamcorper ipsum. Pellentesque volutpat, felis ut rhoncus euismod, purus turpis hendrerit ipsum, at venenatis nisi erat id tellus. Nullam nisi enim, tincidunt eget tortor et, consequat commodo nibh. Phasellus porttitor neque at nisi tincidunt, eget ultricies felis maximus. Nullam ex lorem, accumsan ut rutrum et, cursus sit amet neque

+

Nullam pharetra ipsum quis risus condimentum, at pretium libero commodo. Sed porta ante sed iaculis pellentesque. Praesent nec pretium ligula. Etiam porttitor fringilla justo sed vestibulum. Ut elementum tortor dolor, quis pretium leo porta at. In tempor diam ac lorem suscipit, non interdum purus tristique. Morbi vitae pharetra risus

+

Fusce volutpat semper nisl, a efficitur nisl tempor in. Proin non eros mollis, eleifend risus ac, bibendum tortor. Mauris porta odio vel ultricies ullamcorper. Phasellus volutpat velit lorem, nec lobortis nisi blandit ac. Nunc ligula massa, iaculis vitae molestie eu, fermentum ac libero. Morbi ut ipsum eget nisl consequat imperdiet. Etiam eu erat sed nisl viverra egestas. Phasellus rhoncus neque lacus, ac rutrum urna mattis sed. Donec quis lectus odio

+

Aenean congue ipsum a eros gravida aliquet. Aliquam condimentum ex sit amet eros venenatis, vitae tempor ligula fringilla. Suspendisse tempus diam id enim consequat auctor. Morbi ac arcu sit amet turpis imperdiet ornare. Aliquam molestie at ipsum at venenatis. Nulla rutrum purus tincidunt libero viverra hendrerit. Suspendisse vestibulum sapien sodales, ornare diam vel, ornare magna. Morbi non mi in erat feugiat imperdiet nec at diam. Aliquam fringilla pellentesque aliquam. Suspendisse non mi vestibulum mi lacinia cursus. Integer pellentesque rutrum libero quis gravida. Nulla facilisis, purus ut dapibus pretium, leo ipsum efficitur enim, vulputate elementum lectus felis ac ante

+

Aliquam eu placerat dolor. Mauris rhoncus porta euismod. Sed quis mauris feugiat, tempor mauris eget, eleifend elit. Nulla interdum fringilla vehicula. Phasellus varius auctor urna eget tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas luctus consequat magna, sit amet facilisis lorem maximus dapibus. Sed venenatis tortor quis nisl dignissim feugiat id eget neque. Suspendisse posuere molestie elit, et blandit justo placerat eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit

+

Nullam pretium diam eu arcu tincidunt sollicitudin. Mauris finibus urna a maximus tristique. Donec quis lacus mauris. Donec consequat interdum diam, nec posuere eros. Pellentesque ultricies ligula sit amet aliquam mollis. Fusce justo mi, ultricies nec est vel, commodo consequat felis. Phasellus nec felis a est malesuada malesuada quis vitae enim. Cras hendrerit libero felis, at mattis eros ultricies vestibulum

+

Nulla nec blandit sapien. Fusce et tellus eu diam fermentum egestas blandit in erat. Etiam dictum nibh ac elit pulvinar congue. Nunc feugiat odio sodales orci ornare, et volutpat sem sollicitudin. Fusce id risus et lacus fringilla luctus. Praesent porttitor rhoncus lectus. Pellentesque vitae egestas dolor, vitae maximus felis

+

In mauris enim, vehicula in lectus non, feugiat varius est. Nam elementum ipsum erat, quis tristique neque tincidunt at. Integer sed porta urna. Vivamus eu lacinia metus. Quisque id posuere odio. Vivamus mattis sem nec leo hendrerit, ut sollicitudin sem faucibus. Quisque id justo velit

+

Integer molestie, ex ac vulputate ultricies, ante dui mollis urna, sit amet commodo urna felis a mauris. Sed augue ex, commodo non rhoncus eget, posuere ornare nunc. Cras sed quam lorem. Nam id dapibus turpis. Cras eget venenatis urna, sollicitudin faucibus ex. Maecenas diam lacus, ultricies vel neque gravida, pulvinar euismod lacus. In facilisis nulla turpis, eget interdum nulla lacinia eu. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce interdum tempor lectus non posuere. Integer finibus a lacus in auctor. Quisque tellus tortor, interdum tincidunt hendrerit vitae, maximus in nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus vehicula magna non risus sagittis, sed elementum diam finibus

+

Etiam justo erat, blandit a mauris eget, placerat porttitor diam. Phasellus consequat et lectus sit amet cursus. Vivamus purus ipsum, lobortis quis faucibus vitae, consectetur id orci. In mattis consectetur faucibus. Etiam rutrum venenatis massa sed molestie. Duis enim nibh, mattis ut malesuada venenatis, sollicitudin sit amet metus. Nunc luctus rutrum mi, in tempor urna viverra nec. Fusce feugiat risus ac dapibus tincidunt. Integer vel elit libero. Ut at nunc eget nulla vestibulum congue ut quis ipsum. Aliquam elementum commodo erat et auctor. Nulla condimentum sit amet diam eget consequat. Vivamus molestie laoreet risus vitae egestas. Phasellus sed pretium orci, sit amet porta lorem

+

Vestibulum eu lacinia est. Suspendisse eu iaculis odio, in tincidunt mauris. Mauris ultrices, ligula vulputate egestas imperdiet, tortor neque pulvinar lorem, vel volutpat enim leo nec dolor. Duis eleifend commodo feugiat. Nam consectetur ac erat vitae luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam hendrerit fringilla mattis. Sed mauris orci, bibendum at gravida sed, consectetur eget massa

+

Morbi fringilla tortor nisl, non rhoncus nisi varius tincidunt. Praesent scelerisque, orci vel tempor viverra, enim elit porttitor dolor, vitae condimentum elit eros vitae neque. Maecenas viverra neque at enim tempor, sit amet ullamcorper risus interdum. Praesent quis efficitur elit. Integer posuere, est ac porttitor scelerisque, orci elit lobortis velit, tincidunt pharetra mi magna et dui. Nullam scelerisque sem nec sapien imperdiet aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus

+

Sed vehicula dolor pulvinar consequat pretium. Mauris varius ut nibh sed consequat. Nunc congue libero non molestie euismod. Ut ac sagittis diam, a cursus elit. Quisque semper ac tellus non suscipit. Etiam lacus lectus, commodo et enim quis, lacinia tincidunt metus. Donec cursus felis et malesuada sodales. Donec tempor ligula in est vulputate faucibus

+

Aliquam erat volutpat. Mauris sed fringilla lacus. Nulla eu eros ac nisi pharetra molestie. Sed condimentum magna aliquam est fermentum, pretium ornare diam pellentesque. Duis nec odio sapien. Mauris eget risus ligula. Sed nec nunc consequat, venenatis dolor et, mollis risus. Nulla facilisi. Vestibulum id felis velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit

+

Fusce dictum nisl et lacus pharetra, at tincidunt mauris interdum. Maecenas ac odio in arcu ullamcorper pulvinar eu eget tortor. Duis laoreet libero sit amet massa ornare, sit amet pellentesque justo viverra. Morbi nec justo metus. Integer porttitor nunc a dolor cursus, et congue libero lobortis. Fusce imperdiet posuere nisi, et mattis arcu vestibulum ut. Etiam non dui et felis egestas ullamcorper quis eget nisi. Vestibulum vitae lorem a diam lacinia dictum. Aliquam sagittis velit est, vitae vehicula felis vestibulum vulputate. Etiam gravida urna id ligula scelerisque fringilla. Praesent orci mauris, congue eu lectus et, imperdiet convallis felis. Pellentesque sollicitudin felis nec porttitor sollicitudin. Phasellus at convallis urna. Morbi auctor ipsum eget risus convallis tempus. Cras porta ipsum interdum, rutrum ipsum nec, porta magna

+

Duis pharetra ligula ac libero vulputate, vel gravida orci venenatis. Fusce fermentum nisl nec maximus posuere. Morbi ac porta diam. Curabitur laoreet maximus maximus. Curabitur porttitor turpis sit amet elementum eleifend. Aliquam erat volutpat. Vestibulum dictum ipsum est, non mollis mauris porttitor id. Morbi condimentum, ante sit amet venenatis gravida, justo magna commodo diam, at faucibus enim nibh ut risus. Curabitur cursus imperdiet mattis. Nullam convallis augue in lorem consequat aliquet. Suspendisse blandit ut velit eu fringilla. Vestibulum vel lacinia eros. Suspendisse sit amet venenatis metus

+

Aenean vel suscipit tortor. Aenean iaculis magna in viverra rhoncus. Integer ornare vitae lacus vitae sagittis. Fusce ac ligula vitae tortor sollicitudin auctor. Quisque urna elit, tincidunt quis leo eget, porta tempus arcu. Cras porttitor tempus enim, non suscipit nisi. Suspendisse porta metus eget sapien blandit, quis commodo odio ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque ullamcorper convallis nulla iaculis imperdiet. Curabitur et urna ut massa interdum viverra sit amet eget mauris. Vestibulum sed sem ac est iaculis mattis et non eros. Aenean quis sem feugiat, pretium mi ac, consequat urna. Mauris lacinia rutrum mauris, ut ullamcorper nisi imperdiet vel. Sed ac dignissim lacus. Vestibulum ex neque, interdum quis massa id, posuere vestibulum odio. Cras ut diam sed augue aliquet auctor

+

Aliquam mauris augue, tristique sed varius dignissim, euismod et nibh. Nullam faucibus, nisi a tincidunt venenatis, nibh neque faucibus tortor, eu convallis magna nisi et tortor. Cras molestie sapien ipsum, quis hendrerit ipsum vulputate eu. Fusce dui risus, mattis at aliquam a, condimentum malesuada sem. Fusce urna dolor, consectetur interdum ultricies in, dignissim a mi. Praesent sit amet nulla iaculis, maximus dolor in, pulvinar dui. Fusce placerat efficitur augue id consectetur. Integer pulvinar dictum molestie. Suspendisse potenti. Suspendisse aliquam lectus ut varius luctus. Sed placerat tempor nunc et tincidunt. Proin euismod eros eu ex tincidunt, a euismod felis euismod

+

Suspendisse euismod metus ut nisi porta, in fermentum nisl fermentum. Donec luctus sagittis sem sed posuere. Donec at commodo dui, sed pharetra urna. Morbi laoreet ligula et semper pellentesque. Donec commodo dictum ipsum, pretium cursus est eleifend ac. Etiam a orci at tellus commodo bibendum et ac diam. Aenean consectetur, felis eu pretium pulvinar, nisl metus iaculis nisl, tempor lacinia magna mauris nec metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam nec nibh eget dolor cursus tincidunt

+

Integer vestibulum dolor quis neque maximus, ac gravida ligula varius. Proin vulputate ante eget ligula lacinia laoreet. Vivamus tempus sagittis auctor. Fusce imperdiet a odio ac euismod. Vestibulum lacus tellus, consectetur quis eros ut, interdum eleifend neque. Praesent ex sem, aliquam eget vulputate vehicula, dapibus in massa. Duis a efficitur enim

+

Ut ipsum tortor, pellentesque nec mollis pulvinar, condimentum nec nisi. Quisque pretium, quam sed finibus consequat, ex justo dignissim enim, vel mattis felis lorem vel diam. Duis cursus, velit at iaculis dictum, ipsum odio pretium risus, venenatis ultricies elit odio quis eros. Mauris odio libero, eleifend in mi nec, efficitur malesuada magna. Praesent auctor pellentesque sem semper dignissim. Etiam ut urna lacus. In quis gravida felis

+

Sed lacinia non urna ac condimentum. Integer feugiat vehicula lacus, quis aliquet turpis. Cras vel nisl sit amet lorem bibendum egestas. Phasellus in elementum lectus, sed egestas dolor. Vestibulum et velit volutpat, vulputate sapien sed, ullamcorper felis. Nam eu viverra augue. Aenean egestas, massa et ullamcorper imperdiet, ante purus condimentum erat, nec viverra lectus massa non dolor. Sed nibh tellus, convallis sed ligula eget, convallis pulvinar felis. Vivamus euismod id eros eget vestibulum. Morbi mattis est vitae consectetur pellentesque. Praesent suscipit in turpis ut feugiat. Sed facilisis consequat urna nec faucibus. Mauris sodales tortor nibh, id tempor urna cursus ut

+

Etiam et orci quis nibh varius placerat. Maecenas convallis metus magna, et auctor ligula mattis et. Curabitur id sapien vitae neque ullamcorper ultricies. Etiam nisl felis, cursus quis nisl sit amet, euismod hendrerit nisl. Vivamus vestibulum aliquam risus, nec euismod libero viverra vitae. In sit amet cursus arcu. Sed ullamcorper id urna vel rhoncus. Nunc auctor porttitor nibh, eu accumsan lectus gravida eget. Nullam posuere arcu in ex volutpat auctor efficitur vel neque. Curabitur id ante suscipit, dictum eros feugiat, iaculis dui. Fusce hendrerit mauris ac libero malesuada efficitur. Morbi a ultrices nulla, vitae rutrum lorem. Maecenas vel ligula tempus, sagittis dui eget, congue est. Phasellus sit amet laoreet ex

+

Nulla facilisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales diam a pharetra hendrerit. Nulla rutrum vehicula eros vel ultrices. Aliquam imperdiet sagittis leo, nec ullamcorper orci tempor in. Aliquam luctus ut nulla at eleifend. Duis sapien lorem, consequat a nisl semper, rhoncus aliquet sapien. Sed in velit posuere, tincidunt ex vitae, congue turpis. Nam sollicitudin dolor elit, non finibus arcu porta et. Sed efficitur metus justo, et faucibus justo viverra eu. Etiam porttitor convallis turpis, non gravida nulla tempus quis. Nulla lobortis venenatis purus, sed porttitor dolor fringilla et. Morbi porta lectus non erat sollicitudin rhoncus. Proin pretium placerat vehicula. Morbi et nibh elementum dolor egestas efficitur

+

Cras ornare eros ac elit cursus, eget ornare nulla ullamcorper. Sed arcu urna, sagittis luctus lacus eu, mattis eleifend massa. Sed condimentum lorem sit amet luctus elementum. Morbi et quam in nunc elementum hendrerit rutrum fringilla lorem. Phasellus rhoncus diam tellus, nec porta arcu eleifend ac. Etiam justo massa, egestas sit amet magna vel, maximus faucibus dui. Ut imperdiet mollis nisi, ac lobortis nibh pharetra at. Cras bibendum, arcu ut sollicitudin imperdiet, nulla mi venenatis enim, a blandit orci nisi vitae nibh

+

Donec congue, sem a accumsan ultricies, lacus metus lacinia dui, eget hendrerit felis eros id nulla. Donec varius mi vel blandit ultrices. Duis in lorem orci. Duis rutrum nisl eu varius faucibus. Sed quis vestibulum purus. Donec facilisis magna turpis. Nam quis nulla luctus, sagittis ligula eu, venenatis eros. Nulla facilisi. Sed non mauris dictum, commodo diam in, mollis est. In nec urna vehicula, sagittis justo posuere, condimentum metus. Aliquam commodo nulla quis volutpat porttitor. Quisque vel massa vulputate, tincidunt diam sit amet, commodo justo

+

Mauris iaculis dui eu dolor euismod pretium. Nulla facilisi. Duis nisl elit, commodo vitae diam in, dapibus ultricies sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque ultrices congue magna, mollis ultrices tellus suscipit sed. Phasellus ultrices sem ex. Vestibulum ut turpis quis eros interdum viverra. Nunc ullamcorper imperdiet tellus, nec consequat velit viverra eu. Nulla facilisi. Nulla quis lobortis lacus, et ultricies lectus. Quisque volutpat venenatis massa, id fermentum metus. Duis efficitur nisl eu posuere mattis. Integer nec ipsum quis turpis pretium luctus

+

Nulla vitae neque auctor, consequat massa quis, molestie felis. Fusce pellentesque semper aliquam. Ut semper, dolor quis accumsan dictum, lacus urna bibendum diam, quis faucibus orci risus quis ipsum. Nullam venenatis metus ac diam rutrum, non tincidunt lacus gravida. Maecenas ac pellentesque justo. Praesent in auctor urna, ac vestibulum leo. Cras ut volutpat lacus, eu porta metus

+

Integer egestas hendrerit libero eget euismod. Maecenas eleifend erat sit amet ipsum finibus, sit amet finibus est tincidunt. Etiam auctor dui ac urna mollis auctor. Cras vehicula enim non cursus tristique. Ut sed enim viverra, malesuada dui in, tempus tortor. Suspendisse potenti. Integer vestibulum blandit cursus

+

Integer ultrices eros quis rutrum molestie. Ut euismod pulvinar eros. Vivamus facilisis laoreet pellentesque. Quisque molestie nec dolor ut scelerisque. Curabitur finibus ante nisi, ac porttitor mauris mattis eget. Proin cursus lobortis mi non vehicula. Etiam purus ex, porta vel ante eu, vestibulum aliquet augue. Phasellus tempor blandit lectus ac finibus. Sed interdum tellus felis, rhoncus vehicula elit scelerisque vel. Nullam aliquam nisi at tortor pulvinar, a commodo est volutpat. Vestibulum sed iaculis mauris. Cras iaculis molestie orci sed posuere. Vestibulum ac vestibulum sem

+

Vivamus vitae enim et neque venenatis tempus. Curabitur ultricies mi fermentum, pulvinar diam et, tempor eros. Phasellus ornare hendrerit velit quis sollicitudin. Suspendisse ac justo eu orci porttitor varius. In tempus felis eu sagittis suscipit. Nam eu nibh quis leo lacinia commodo sit amet sed nisi. Suspendisse ligula ligula, feugiat sit amet sem sed, rhoncus euismod massa. Etiam non lorem in mauris suscipit faucibus eget nec nisl. Pellentesque placerat dui ut nisi dignissim, ac viverra elit ultricies

+

In at nibh a arcu commodo dignissim. Sed quis sapien congue, suscipit urna quis, posuere enim. Nunc cursus tellus a nisl elementum efficitur. Vestibulum non est vulputate, facilisis ante scelerisque, tristique massa. Pellentesque ante sem, tincidunt at leo sed, faucibus laoreet mi. Morbi nec bibendum sapien. Cras a odio pulvinar, tincidunt tellus sit amet, cursus ligula

+

Nunc sed consequat enim. Duis suscipit nunc quis velit tincidunt, in suscipit erat accumsan. Mauris tristique ornare nisl, ut egestas ante. Donec ac semper ipsum. Nulla eget dolor lacinia mi dapibus laoreet. Vivamus sed bibendum diam. Praesent tempor massa id dui imperdiet cursus. Sed luctus risus nec dapibus tristique. Aliquam accumsan nisi vitae commodo accumsan. Duis commodo nibh sed erat tincidunt, in pretium nibh suscipit. Suspendisse at interdum arcu, at posuere lacus. Vestibulum accumsan iaculis porta. Nam justo odio, euismod ac leo non, viverra auctor sapien

+

Vivamus eget velit ut nunc ultricies porttitor. Fusce vestibulum bibendum laoreet. Praesent tristique arcu in nibh lobortis, eget vestibulum lacus ultricies. In et venenatis augue. Donec quis accumsan ipsum, sit amet euismod lacus. Suspendisse ultricies mattis dolor. Morbi viverra, quam sit amet ornare luctus, nunc quam blandit nisl, et mattis ipsum urna id nulla. Etiam semper risus nec felis lobortis, volutpat accumsan erat interdum. Nulla molestie vel erat a congue. In feugiat vestibulum purus ut commodo. Praesent sagittis turpis ut lacus suscipit ultrices. Suspendisse sed aliquam urna, vestibulum venenatis magna. Aliquam iaculis sed leo vel consectetur. Nunc quis pretium ex. Sed malesuada est ex, et efficitur est feugiat ultricies. Nullam vulputate tortor id rutrum aliquet

+

Integer et magna mi. Integer a quam purus. Nunc blandit ut est id pellentesque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquam ligula massa, vel dignissim nulla feugiat a. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam pulvinar feugiat sagittis. Mauris sodales, nisl consequat ullamcorper malesuada, lectus nunc aliquet ipsum, at sollicitudin tellus arcu nec ex. Aenean commodo felis et diam mollis porttitor. Nulla at est et turpis dignissim cursus vel vel arcu. Duis consequat urna ac nisl suscipit, ut rhoncus lectus pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean risus mauris, faucibus quis arcu luctus, hendrerit vestibulum nunc

+

Sed dignissim condimentum massa, et vulputate elit imperdiet ac. Vivamus elementum risus luctus, aliquam elit dignissim, euismod mauris. Nam id tempus ex. Quisque lacinia tincidunt nisl, at bibendum diam congue sed. Donec ex massa, lacinia ut feugiat non, cursus sit amet velit. Maecenas quis suscipit justo. Vestibulum ex magna, scelerisque eget placerat a, consectetur id ante. Pellentesque commodo, purus ut pharetra tincidunt, felis mi fringilla urna, a ultricies lacus nisl ac arcu. Duis molestie vestibulum est, sit amet egestas ipsum sagittis ac. Donec tempor urna sem, pharetra tincidunt ligula faucibus in. Ut eu fringilla ante. Nulla mauris tortor, mattis a ligula bibendum, pharetra euismod neque. Proin sit amet imperdiet nulla. Nam gravida eros in ex gravida vehicula. Nulla a augue nec mauris efficitur bibendum. Aliquam fringilla finibus lectus, sed euismod turpis ullamcorper in

+

Suspendisse rutrum dolor convallis diam vestibulum, vel iaculis leo pulvinar. Quisque consequat orci et ipsum maximus vehicula. Phasellus dignissim ac ante a dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In bibendum ipsum et nibh porttitor, et commodo lacus eleifend. Ut vel semper libero, ac porttitor est. Donec lacus turpis, vestibulum quis congue at, rhoncus feugiat dui

+

Maecenas commodo lectus magna, ac auctor dolor ultrices id. Donec varius mattis pretium. Suspendisse potenti. Nam tempus nisi odio, at pretium risus finibus eu. Vivamus fermentum mi sit amet odio hendrerit, quis condimentum arcu tristique. Praesent id faucibus tortor, eget suscipit sem. Aliquam vestibulum est vel felis semper iaculis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique tincidunt arcu in faucibus. Mauris feugiat in nibh eleifend scelerisque. Proin et turpis ut nibh tincidunt ornare eu vitae lorem. Nunc et suscipit massa, ac dignissim erat. Aliquam imperdiet vestibulum dignissim. Integer scelerisque felis ante, id vehicula velit pharetra et. Suspendisse condimentum eget ante vel egestas. Morbi pellentesque ante et nunc gravida cursus

+

Ut sollicitudin nisl sit amet metus euismod, quis rhoncus neque congue. Phasellus elementum augue sed lacus pellentesque bibendum. Maecenas vel neque at turpis pharetra tristique eu id quam. Aenean fringilla fermentum ultricies. Maecenas consequat semper arcu non vehicula. Fusce in lobortis mauris, id mattis enim. Nam pharetra finibus pellentesque. Cras nec dictum elit. Sed quis interdum lorem. Aenean ut sodales leo. Donec sit amet nisl commodo, ultricies augue vel, lobortis augue. Praesent at turpis venenatis, consectetur ligula vitae, rhoncus erat. Fusce elementum venenatis pulvinar. Proin volutpat libero in ipsum ultrices, id dapibus turpis eleifend. Quisque rutrum sed velit vel consectetur

+

Fusce efficitur mi eget quam scelerisque convallis. Quisque suscipit lacus nisl, sed tincidunt est congue eget. Etiam at cursus enim. Cras convallis maximus finibus. Proin elementum mi vel lobortis iaculis. Duis bibendum feugiat orci ac posuere. Duis vehicula, magna in efficitur pulvinar, nisl lacus elementum quam, nec volutpat tortor est vel libero. Vivamus eu bibendum diam, ac ultricies dui. Nullam nec mauris erat. Nam imperdiet massa vel metus ultricies semper.

+
+
+ + +
+
From 533b15ac1a1ce867698745621199a10aab9253a2 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 20:09:10 -0700 Subject: [PATCH 090/219] WIP: Delete unused code and rename CSS class --- packages/mdc-dialog/constants.js | 1 - packages/mdc-dialog/mdc-dialog.scss | 20 +++++-------------- .../mdc-dialog/classes/baseline-alert.html | 2 +- .../classes/baseline-confirmation.html | 2 +- .../mdc-dialog/classes/baseline-simple.html | 2 +- .../classes/manual-window-resize.html | 2 +- .../overflow-accessible-font-size.html | 2 +- .../spec/mdc-dialog/classes/overflow.html | 2 +- .../mdc-dialog/classes/scrollable-bottom.html | 2 +- .../mdc-dialog/classes/scrollable-top.html | 2 +- 10 files changed, 13 insertions(+), 24 deletions(-) diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index 0e9cd85b9b0..444d308e5d2 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -27,7 +27,6 @@ const cssClasses = { ANIMATING: 'mdc-dialog--animating', STACKED: 'mdc-dialog--stacked', SCROLLABLE: 'mdc-dialog--scrollable', - FIX_IE_OVERFLOW: 'mdc-dialog--fix-ie-overflow', SCRIM: 'mdc-dialog__scrim', CONTENT: 'mdc-dialog__content', BUTTON: 'mdc-dialog__button', diff --git a/packages/mdc-dialog/mdc-dialog.scss b/packages/mdc-dialog/mdc-dialog.scss index b82a3ac4cf4..e423ed491e8 100644 --- a/packages/mdc-dialog/mdc-dialog.scss +++ b/packages/mdc-dialog/mdc-dialog.scss @@ -63,11 +63,11 @@ z-index: -1; } -// This wrapper element is needed to make max-height work with flexbox in IE 11. +// This wrapper element is needed to make max-height work IE 11. // See https://github.com/philipwalton/flexbugs/issues/216 .mdc-dialog__container { display: flex; - flex-direction: row; + flex-direction: row; // IE 11 box-sizing: border-box; max-height: $mdc-dialog-viewport-size-expr; @@ -85,17 +85,15 @@ opacity: 0; } -// TODO(acdvorak): Come up with a better class name. -// https://github.com/philipwalton/flexbugs/issues/216 -.mdc-dialog__container-inner { +.mdc-dialog__surface { @include mdc-dialog-corner-radius($mdc-dialog-corner-radius); @include mdc-elevation(24); @include mdc-theme-prop(background-color, background); display: flex; flex-direction: column; - flex-grow: 0; - flex-shrink: 0; + flex-grow: 0; // IE 11 + flex-shrink: 0; // IE 11 box-sizing: border-box; min-width: $mdc-dialog-min-width; max-width: 100%; // IE 11 @@ -138,14 +136,6 @@ padding: 10px 24px 21px; overflow: auto; - .mdc-dialog--fix-ie-overflow & { - // Fix flexbox overflow bug in IE 11. - // Causes a split second of jank in IE, but it's the least-crappy workaround I could find. - // See https://github.com/philipwalton/flexbugs/issues/216 - flex-basis: auto; - //border-bottom-width: 1px; - } - .mdc-dialog--scrollable & { // Must be 'scroll', not 'auto'. // https://css-tricks.com/snippets/css/momentum-scrolling-on-ios-overflow-elements/ diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html b/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html index 2b9d5a5a8a4..d96b9f4214b 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-alert.html @@ -47,7 +47,7 @@ id="test-dialog">
-
+
Alert
diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html b/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html index 3a7d085bcbc..352e645b4ef 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-confirmation.html @@ -48,7 +48,7 @@ id="test-dialog">
-
+

Confirmation

diff --git a/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html b/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html index 528e15adce0..c93d7aaec50 100644 --- a/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html +++ b/test/screenshot/spec/mdc-dialog/classes/baseline-simple.html @@ -48,7 +48,7 @@ id="test-dialog">
-
+

Simple

diff --git a/test/screenshot/spec/mdc-dialog/classes/manual-window-resize.html b/test/screenshot/spec/mdc-dialog/classes/manual-window-resize.html index 437b690d5e8..797c12e850d 100644 --- a/test/screenshot/spec/mdc-dialog/classes/manual-window-resize.html +++ b/test/screenshot/spec/mdc-dialog/classes/manual-window-resize.html @@ -48,7 +48,7 @@ id="test-dialog">
-
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec.

diff --git a/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html b/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html index 417cd22a0fb..2b7b53605ba 100644 --- a/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html +++ b/test/screenshot/spec/mdc-dialog/classes/overflow-accessible-font-size.html @@ -48,7 +48,7 @@ id="test-dialog">
-
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec.

diff --git a/test/screenshot/spec/mdc-dialog/classes/overflow.html b/test/screenshot/spec/mdc-dialog/classes/overflow.html index 09315bad466..734f7a4f082 100644 --- a/test/screenshot/spec/mdc-dialog/classes/overflow.html +++ b/test/screenshot/spec/mdc-dialog/classes/overflow.html @@ -48,7 +48,7 @@ id="test-dialog">
-
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vitae consectetur tortor, sed condimentum arcu. Mauris sagittis tempor sem, nec tempus libero imperdiet nec.

diff --git a/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html b/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html index 2449890824a..333a5caea15 100644 --- a/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html +++ b/test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html @@ -48,7 +48,7 @@ id="test-dialog">
-
+

Fire photon torpedoes?

diff --git a/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html b/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html index 9ea9f46026c..270dd4074af 100644 --- a/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html +++ b/test/screenshot/spec/mdc-dialog/classes/scrollable-top.html @@ -48,7 +48,7 @@ id="test-dialog">
-
+

Fire photon torpedoes?

From ffe745e23b8460d90fa9facb0db8a1b0666e2c0f Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 21:11:53 -0700 Subject: [PATCH 091/219] WIP: JK... we do still need a little bit of JS to fix IE (but not as much as before) --- packages/mdc-dialog/constants.js | 1 + packages/mdc-dialog/foundation.js | 17 ++++++++++++++++- packages/mdc-dialog/index.js | 12 ++++++++++++ test/screenshot/golden.json | 4 ++-- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index 444d308e5d2..9464005da1e 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -36,6 +36,7 @@ const cssClasses = { const strings = { OPEN_DIALOG_SELECTOR: '.mdc-dialog--open', CONTAINER_SELECTOR: '.mdc-dialog__container', + SURFACE_SELECTOR: '.mdc-dialog__surface', CONTENT_SELECTOR: '.mdc-dialog__content', YES_EVENT: 'MDCDialog:yes', diff --git a/packages/mdc-dialog/foundation.js b/packages/mdc-dialog/foundation.js index c667f4ad5fa..c733c4983a5 100644 --- a/packages/mdc-dialog/foundation.js +++ b/packages/mdc-dialog/foundation.js @@ -93,6 +93,7 @@ export default class MDCDialogFoundation extends MDCFoundation { clearTimeout(this.timerId_); this.timerId_ = setTimeout(() => { this.handleAnimationTimerEnd_(); + this.layoutIE_(); this.adapter_.notifyOpened(); }, numbers.DIALOG_ANIMATION_TIME_MS); } @@ -128,6 +129,20 @@ export default class MDCDialogFoundation extends MDCFoundation { }); } + // TODO(acdvorak): Only run this in IE. + layoutIE_() { + const fixOverflowIE = () => { + this.adapter_.fixOverflowIE(); + setTimeout(() => { + this.layout(); + }); + }; + + for (let i = 0; i < 5; i++) { + setTimeout(() => fixOverflowIE(), i * 100); + } + } + /** @private */ detectStackedButtons_() { // Remove the class first to let us measure the buttons' natural positions. @@ -160,7 +175,7 @@ export default class MDCDialogFoundation extends MDCFoundation { /** @private */ handleWindowResize_() { - requestAnimationFrame(() => this.layout()); + this.layout(); } /** @private */ diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 4933ae992b6..3edc1a73f35 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -63,6 +63,10 @@ export class MDCDialog extends MDCComponent { return this.root_.querySelector(strings.CONTAINER_SELECTOR); } + get surface_() { + return this.root_.querySelector(strings.SURFACE_SELECTOR); + } + get content_() { return this.root_.querySelector(strings.CONTENT_SELECTOR); } @@ -95,6 +99,13 @@ export class MDCDialog extends MDCComponent { } getDefaultFoundation() { + const toggleStyle = (el, prop, firstValue, secondValue) => { + if (el) { + const oldValue = el.style[prop]; + el.style[prop] = el.style[prop] === firstValue ? secondValue : firstValue; + el.style[prop] = oldValue; + } + }; return new MDCDialogFoundation({ addClass: (className) => this.root_.classList.add(className), removeClass: (className) => this.root_.classList.remove(className), @@ -110,6 +121,7 @@ export class MDCDialog extends MDCComponent { deregisterWindowResizeHandler: (handler) => window.removeEventListener('resize', handler), trapFocusOnSurface: () => this.focusTrap_.activate(), untrapFocusOnSurface: () => this.focusTrap_.deactivate(), + fixOverflowIE: () => toggleStyle(this.surface_, 'flex-basis', 'auto', ''), isContentScrollable: () => Boolean(this.content_) && this.content_.scrollHeight > this.content_.offsetHeight, areButtonsStacked: () => this.buttons_.reduce((set, el) => set.add(el.offsetTop) || set, new Set()).size > 1, getAction: (element) => element.getAttribute(strings.ACTION_ATTRIBUTE), diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index 6bdd9edb8a7..3474922cc38 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -252,12 +252,12 @@ } }, "spec/mdc-dialog/classes/scrollable-bottom.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-bottom.html?utm_source=golden_json", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/03_40_02_251/spec/mdc-dialog/classes/scrollable-bottom.html?utm_source=golden_json", "screenshots": { "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-bottom.html.windows_chrome_68.png", "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-bottom.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/03_40_02_251/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/scrollable-top.html": { From 090e3ae604402da3e124f11137ee2513ad96cfbf Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 21:31:40 -0700 Subject: [PATCH 092/219] WIP: Refactor stuff out into `util.js` --- packages/mdc-dialog/adapter.js | 5 ++++ packages/mdc-dialog/foundation.js | 11 +------ packages/mdc-dialog/index.js | 13 ++------- packages/mdc-dialog/util.js | 48 +++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 20 deletions(-) diff --git a/packages/mdc-dialog/adapter.js b/packages/mdc-dialog/adapter.js index dda473567f1..9eef7aef9e6 100644 --- a/packages/mdc-dialog/adapter.js +++ b/packages/mdc-dialog/adapter.js @@ -101,6 +101,11 @@ class MDCDialogAdapter { trapFocusOnSurface() {} untrapFocusOnSurface() {} + /** + * @param {function(): undefined} callback + */ + fixOverflowIE(callback) {} + /** @return {boolean} */ isContentScrollable() {} diff --git a/packages/mdc-dialog/foundation.js b/packages/mdc-dialog/foundation.js index c733c4983a5..43dd356cdbc 100644 --- a/packages/mdc-dialog/foundation.js +++ b/packages/mdc-dialog/foundation.js @@ -131,16 +131,7 @@ export default class MDCDialogFoundation extends MDCFoundation { // TODO(acdvorak): Only run this in IE. layoutIE_() { - const fixOverflowIE = () => { - this.adapter_.fixOverflowIE(); - setTimeout(() => { - this.layout(); - }); - }; - - for (let i = 0; i < 5; i++) { - setTimeout(() => fixOverflowIE(), i * 100); - } + this.adapter_.fixOverflowIE(() => this.layout()); } /** @private */ diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 3edc1a73f35..74bfd317c89 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -99,13 +99,6 @@ export class MDCDialog extends MDCComponent { } getDefaultFoundation() { - const toggleStyle = (el, prop, firstValue, secondValue) => { - if (el) { - const oldValue = el.style[prop]; - el.style[prop] = el.style[prop] === firstValue ? secondValue : firstValue; - el.style[prop] = oldValue; - } - }; return new MDCDialogFoundation({ addClass: (className) => this.root_.classList.add(className), removeClass: (className) => this.root_.classList.remove(className), @@ -121,9 +114,9 @@ export class MDCDialog extends MDCComponent { deregisterWindowResizeHandler: (handler) => window.removeEventListener('resize', handler), trapFocusOnSurface: () => this.focusTrap_.activate(), untrapFocusOnSurface: () => this.focusTrap_.deactivate(), - fixOverflowIE: () => toggleStyle(this.surface_, 'flex-basis', 'auto', ''), - isContentScrollable: () => Boolean(this.content_) && this.content_.scrollHeight > this.content_.offsetHeight, - areButtonsStacked: () => this.buttons_.reduce((set, el) => set.add(el.offsetTop) || set, new Set()).size > 1, + fixOverflowIE: (callback) => util.fixOverflowIE(this.surface_, callback), + isContentScrollable: () => util.isScrollable(this.content_), + areButtonsStacked: () => util.areTopsAligned(this.buttons_), getAction: (element) => element.getAttribute(strings.ACTION_ATTRIBUTE), notifyOpening: () => this.emit(strings.OPENING_EVENT), notifyOpened: () => this.emit(strings.OPENED_EVENT), diff --git a/packages/mdc-dialog/util.js b/packages/mdc-dialog/util.js index 851e5a5a284..5b14c12fa28 100644 --- a/packages/mdc-dialog/util.js +++ b/packages/mdc-dialog/util.js @@ -35,3 +35,51 @@ export function createFocusTrapInstance(surfaceEl, initialFocusEl = null, focusT clickOutsideDeactivates: true, }); } + +/** + * @param {!HTMLElement} flexItemEl + * @param {function(): undefined} callback + */ +export function fixOverflowIE(flexItemEl, callback) { + if (!flexItemEl) { + return; + } + + const toggleStyle = (el, prop, firstValue, secondValue) => { + const oldValue = el.style[prop]; + el.style[prop] = el.style[prop] === firstValue ? secondValue : firstValue; + el.style[prop] = oldValue; + }; + + const tick = () => { + toggleStyle(flexItemEl, 'flex-basis', 'auto', ''); + setTimeout(() => { + callback(); + }); + }; + + for (let i = 0; i < 5; i++) { + setTimeout(() => tick(), i * 100); + } +} + +/** + * @param {!HTMLElement} el + * @return {boolean} + */ +export function isScrollable(el) { + if (!el) { + return false; + } + return el.scrollHeight > el.offsetHeight; +} + +/** + * @param {!Array|!NodeList} els + * @return {boolean} + */ +export function areTopsAligned(els) { + const tops = new Set(); + [].forEach.call(els, (el) => tops.add(el.offsetTop)); + return tops.size > 1; +} From 5da4389bf52692041b07a330c19aa4cd35730e54 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 21:39:12 -0700 Subject: [PATCH 093/219] WIP: Refactor --- packages/mdc-dialog/constants.js | 3 +-- packages/mdc-dialog/index.js | 26 +++++-------------------- test/unit/mdc-dialog/foundation.test.js | 6 +++--- 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index 9464005da1e..a9785b25af5 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -28,8 +28,6 @@ const cssClasses = { STACKED: 'mdc-dialog--stacked', SCROLLABLE: 'mdc-dialog--scrollable', SCRIM: 'mdc-dialog__scrim', - CONTENT: 'mdc-dialog__content', - BUTTON: 'mdc-dialog__button', SCROLL_LOCK: 'mdc-dialog-scroll-lock', }; @@ -38,6 +36,7 @@ const strings = { CONTAINER_SELECTOR: '.mdc-dialog__container', SURFACE_SELECTOR: '.mdc-dialog__surface', CONTENT_SELECTOR: '.mdc-dialog__content', + BUTTON_SELECTOR: '.mdc-dialog__button', YES_EVENT: 'MDCDialog:yes', NO_EVENT: 'MDCDialog:no', diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 74bfd317c89..dff3c119242 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -59,27 +59,11 @@ export class MDCDialog extends MDCComponent { return this.foundation_.isOpen(); } - get container_() { - return this.root_.querySelector(strings.CONTAINER_SELECTOR); - } - - get surface_() { - return this.root_.querySelector(strings.SURFACE_SELECTOR); - } - - get content_() { - return this.root_.querySelector(strings.CONTENT_SELECTOR); - } - - get buttons_() { - return [].slice.call(this.root_.getElementsByClassName(cssClasses.BUTTON)); - } - initialize() { - this.focusTrap_ = util.createFocusTrapInstance(this.container_); + this.focusTrap_ = util.createFocusTrapInstance(this.root_.querySelector(strings.CONTAINER_SELECTOR)); this.buttonRipples_ = []; - const buttonEls = this.buttons_; + const buttonEls = this.root_.querySelector(strings.BUTTON_SELECTOR); for (let i = 0, buttonEl; buttonEl = buttonEls[i]; i++) { this.buttonRipples_.push(new MDCRipple(buttonEl)); } @@ -114,9 +98,9 @@ export class MDCDialog extends MDCComponent { deregisterWindowResizeHandler: (handler) => window.removeEventListener('resize', handler), trapFocusOnSurface: () => this.focusTrap_.activate(), untrapFocusOnSurface: () => this.focusTrap_.deactivate(), - fixOverflowIE: (callback) => util.fixOverflowIE(this.surface_, callback), - isContentScrollable: () => util.isScrollable(this.content_), - areButtonsStacked: () => util.areTopsAligned(this.buttons_), + fixOverflowIE: (callback) => util.fixOverflowIE(this.root_.querySelector(strings.SURFACE_SELECTOR), callback), + isContentScrollable: () => util.isScrollable(this.root_.querySelector(strings.CONTENT_SELECTOR)), + areButtonsStacked: () => util.areTopsAligned(this.root_.querySelector(strings.BUTTON_SELECTOR)), getAction: (element) => element.getAttribute(strings.ACTION_ATTRIBUTE), notifyOpening: () => this.emit(strings.OPENING_EVENT), notifyOpened: () => this.emit(strings.OPENED_EVENT), diff --git a/test/unit/mdc-dialog/foundation.test.js b/test/unit/mdc-dialog/foundation.test.js index 33dc3542e1d..39aee5b540d 100644 --- a/test/unit/mdc-dialog/foundation.test.js +++ b/test/unit/mdc-dialog/foundation.test.js @@ -50,10 +50,10 @@ test('default adapter returns a complete adapter implementation', () => { 'addClass', 'removeClass', 'addBodyClass', 'removeBodyClass', 'eventTargetHasClass', 'eventTargetMatchesSelector', 'registerInteractionHandler', 'deregisterInteractionHandler', - 'registerContainerInteractionHandler', 'deregisterContainerInteractionHandler', + 'registerWindowResizeHandler', 'deregisterWindowResizeHandler', 'registerDocumentKeydownHandler', 'deregisterDocumentKeydownHandler', - 'isScrollable', 'getContentElement', 'getButtonElements', - 'notifyYes', 'notifyNo', 'notifyCancel', 'notifyOpening', 'notifyOpened', 'notifyClosing', 'notifyClosed', + 'fixOverflowIE', 'isContentScrollable', 'areButtonsStacked', 'getAction', + 'notifyOpening', 'notifyOpened', 'notifyClosing', 'notifyClosed', 'trapFocusOnSurface', 'untrapFocusOnSurface', ]); }); From f238ca7746b041b2c5b9eea1cca5cba323ee19c3 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 21:50:19 -0700 Subject: [PATCH 094/219] Revert "WIP: Refactor" This reverts commit 5da4389bf52692041b07a330c19aa4cd35730e54. --- packages/mdc-dialog/constants.js | 3 ++- packages/mdc-dialog/index.js | 26 ++++++++++++++++++++----- test/unit/mdc-dialog/foundation.test.js | 6 +++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index a9785b25af5..9464005da1e 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -28,6 +28,8 @@ const cssClasses = { STACKED: 'mdc-dialog--stacked', SCROLLABLE: 'mdc-dialog--scrollable', SCRIM: 'mdc-dialog__scrim', + CONTENT: 'mdc-dialog__content', + BUTTON: 'mdc-dialog__button', SCROLL_LOCK: 'mdc-dialog-scroll-lock', }; @@ -36,7 +38,6 @@ const strings = { CONTAINER_SELECTOR: '.mdc-dialog__container', SURFACE_SELECTOR: '.mdc-dialog__surface', CONTENT_SELECTOR: '.mdc-dialog__content', - BUTTON_SELECTOR: '.mdc-dialog__button', YES_EVENT: 'MDCDialog:yes', NO_EVENT: 'MDCDialog:no', diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index dff3c119242..74bfd317c89 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -59,11 +59,27 @@ export class MDCDialog extends MDCComponent { return this.foundation_.isOpen(); } + get container_() { + return this.root_.querySelector(strings.CONTAINER_SELECTOR); + } + + get surface_() { + return this.root_.querySelector(strings.SURFACE_SELECTOR); + } + + get content_() { + return this.root_.querySelector(strings.CONTENT_SELECTOR); + } + + get buttons_() { + return [].slice.call(this.root_.getElementsByClassName(cssClasses.BUTTON)); + } + initialize() { - this.focusTrap_ = util.createFocusTrapInstance(this.root_.querySelector(strings.CONTAINER_SELECTOR)); + this.focusTrap_ = util.createFocusTrapInstance(this.container_); this.buttonRipples_ = []; - const buttonEls = this.root_.querySelector(strings.BUTTON_SELECTOR); + const buttonEls = this.buttons_; for (let i = 0, buttonEl; buttonEl = buttonEls[i]; i++) { this.buttonRipples_.push(new MDCRipple(buttonEl)); } @@ -98,9 +114,9 @@ export class MDCDialog extends MDCComponent { deregisterWindowResizeHandler: (handler) => window.removeEventListener('resize', handler), trapFocusOnSurface: () => this.focusTrap_.activate(), untrapFocusOnSurface: () => this.focusTrap_.deactivate(), - fixOverflowIE: (callback) => util.fixOverflowIE(this.root_.querySelector(strings.SURFACE_SELECTOR), callback), - isContentScrollable: () => util.isScrollable(this.root_.querySelector(strings.CONTENT_SELECTOR)), - areButtonsStacked: () => util.areTopsAligned(this.root_.querySelector(strings.BUTTON_SELECTOR)), + fixOverflowIE: (callback) => util.fixOverflowIE(this.surface_, callback), + isContentScrollable: () => util.isScrollable(this.content_), + areButtonsStacked: () => util.areTopsAligned(this.buttons_), getAction: (element) => element.getAttribute(strings.ACTION_ATTRIBUTE), notifyOpening: () => this.emit(strings.OPENING_EVENT), notifyOpened: () => this.emit(strings.OPENED_EVENT), diff --git a/test/unit/mdc-dialog/foundation.test.js b/test/unit/mdc-dialog/foundation.test.js index 39aee5b540d..33dc3542e1d 100644 --- a/test/unit/mdc-dialog/foundation.test.js +++ b/test/unit/mdc-dialog/foundation.test.js @@ -50,10 +50,10 @@ test('default adapter returns a complete adapter implementation', () => { 'addClass', 'removeClass', 'addBodyClass', 'removeBodyClass', 'eventTargetHasClass', 'eventTargetMatchesSelector', 'registerInteractionHandler', 'deregisterInteractionHandler', - 'registerWindowResizeHandler', 'deregisterWindowResizeHandler', + 'registerContainerInteractionHandler', 'deregisterContainerInteractionHandler', 'registerDocumentKeydownHandler', 'deregisterDocumentKeydownHandler', - 'fixOverflowIE', 'isContentScrollable', 'areButtonsStacked', 'getAction', - 'notifyOpening', 'notifyOpened', 'notifyClosing', 'notifyClosed', + 'isScrollable', 'getContentElement', 'getButtonElements', + 'notifyYes', 'notifyNo', 'notifyCancel', 'notifyOpening', 'notifyOpened', 'notifyClosing', 'notifyClosed', 'trapFocusOnSurface', 'untrapFocusOnSurface', ]); }); From d2efdfe219aea4f59acd9cdbb9ad18e057b6c6a3 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 21:59:05 -0700 Subject: [PATCH 095/219] WIP: Remove unused CSS classes --- packages/mdc-dialog/constants.js | 5 +---- packages/mdc-dialog/index.js | 6 ++---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index 9464005da1e..8e1066eb13d 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -22,14 +22,10 @@ */ const cssClasses = { - ROOT: 'mdc-dialog', OPEN: 'mdc-dialog--open', ANIMATING: 'mdc-dialog--animating', STACKED: 'mdc-dialog--stacked', SCROLLABLE: 'mdc-dialog--scrollable', - SCRIM: 'mdc-dialog__scrim', - CONTENT: 'mdc-dialog__content', - BUTTON: 'mdc-dialog__button', SCROLL_LOCK: 'mdc-dialog-scroll-lock', }; @@ -38,6 +34,7 @@ const strings = { CONTAINER_SELECTOR: '.mdc-dialog__container', SURFACE_SELECTOR: '.mdc-dialog__surface', CONTENT_SELECTOR: '.mdc-dialog__content', + BUTTON_SELECTOR: '.mdc-dialog__button', YES_EVENT: 'MDCDialog:yes', NO_EVENT: 'MDCDialog:no', diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 74bfd317c89..b0645559bb9 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -31,7 +31,6 @@ import * as util from './util'; export {MDCDialogFoundation}; export {util}; -const cssClasses = MDCDialogFoundation.cssClasses; const strings = MDCDialogFoundation.strings; export class MDCDialog extends MDCComponent { @@ -72,15 +71,14 @@ export class MDCDialog extends MDCComponent { } get buttons_() { - return [].slice.call(this.root_.getElementsByClassName(cssClasses.BUTTON)); + return [].slice.call(this.root_.querySelectorAll(strings.BUTTON_SELECTOR)); } initialize() { this.focusTrap_ = util.createFocusTrapInstance(this.container_); this.buttonRipples_ = []; - const buttonEls = this.buttons_; - for (let i = 0, buttonEl; buttonEl = buttonEls[i]; i++) { + for (let i = 0, buttonEl; buttonEl = this.buttons_[i]; i++) { this.buttonRipples_.push(new MDCRipple(buttonEl)); } } From 8519abad6185110e4f88cb699ea1310cecc5c8d4 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 23:22:58 -0700 Subject: [PATCH 096/219] WIP: Add feature detection. Only run fix in IE 11. --- packages/mdc-dialog/constants.js | 6 +-- packages/mdc-dialog/index.js | 2 +- packages/mdc-dialog/util.js | 86 +++++++++++++++++++++++++++++--- 3 files changed, 83 insertions(+), 11 deletions(-) diff --git a/packages/mdc-dialog/constants.js b/packages/mdc-dialog/constants.js index 8e1066eb13d..850ce071c58 100644 --- a/packages/mdc-dialog/constants.js +++ b/packages/mdc-dialog/constants.js @@ -36,10 +36,6 @@ const strings = { CONTENT_SELECTOR: '.mdc-dialog__content', BUTTON_SELECTOR: '.mdc-dialog__button', - YES_EVENT: 'MDCDialog:yes', - NO_EVENT: 'MDCDialog:no', - CANCEL_EVENT: 'MDCDialog:cancel', - OPENING_EVENT: 'MDCDialog:opening', OPENED_EVENT: 'MDCDialog:opened', CLOSING_EVENT: 'MDCDialog:closing', @@ -50,6 +46,8 @@ const strings = { const numbers = { DIALOG_ANIMATION_TIME_MS: 120, + IE_FLEX_OVERFLOW_BUG_ITERATIONS: 5, + IE_FLEX_OVERFLOW_BUG_INTERVAL_MS: 100, }; export {cssClasses, strings, numbers}; diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index b0645559bb9..56c83a3962a 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -112,7 +112,7 @@ export class MDCDialog extends MDCComponent { deregisterWindowResizeHandler: (handler) => window.removeEventListener('resize', handler), trapFocusOnSurface: () => this.focusTrap_.activate(), untrapFocusOnSurface: () => this.focusTrap_.deactivate(), - fixOverflowIE: (callback) => util.fixOverflowIE(this.surface_, callback), + fixOverflowIE: (callback) => util.fixFlexItemMaxHeightBug(this.surface_, callback), isContentScrollable: () => util.isScrollable(this.content_), areButtonsStacked: () => util.areTopsAligned(this.buttons_), getAction: (element) => element.getAttribute(strings.ACTION_ATTRIBUTE), diff --git a/packages/mdc-dialog/util.js b/packages/mdc-dialog/util.js index 5b14c12fa28..cd2d439c6f6 100644 --- a/packages/mdc-dialog/util.js +++ b/packages/mdc-dialog/util.js @@ -22,6 +22,10 @@ */ import createFocusTrap from 'focus-trap'; +import {numbers} from './constants'; + +/** @type {boolean|undefined} */ +let hasFlexItemMaxHeightBug_; /** * @param {!HTMLElement} surfaceEl @@ -36,30 +40,69 @@ export function createFocusTrapInstance(surfaceEl, initialFocusEl = null, focusT }); } +/** + * IE 11 flexbox bug. `overflow: auto` is ignored on child flex items when their height exceeds the `max-height` of + * their parent flex container. The child ends up overflowing the parent instead of respecting `max-height`. + * + * Example: https://user-images.githubusercontent.com/409245/44505719-c27ae680-a657-11e8-9a10-509f7131036d.png + * + * I have yet to find any combination of CSS properties that can convince IE 💩 to render the child correctly. + * Resizing the browser window seems to "fix" the glitch, however, so JS might be a viable "plan B". + * + * The most effective workaround I've found is to force IE to recalculate the child's height. + * To do that, you can toggle one of the following CSS property values on the child element: + * - `height: auto` to "" (empty string). + * - `flex-basis: auto` to "" (empty string). + * - `max-height: none` to "" (empty string). + * + * NOTE: Depending on IE's temperament, you might need to set the second value inside a `setTimeout()`. E.g.: + * + * ```js + * childFlexItem.style.flexBasis = 'auto'; + * setTimeout(() => { + * childFlexItem.style.flexBasis = ''; + * }); + * ``` + * + * For whatever reason, IE seems to render correctly after that. + * Oh, except sometimes you need to do it more than once. + * Running it 5 times, with 100ms in between each invocation, usually seems to do the trick. + * + * See https://github.com/philipwalton/flexbugs/issues/216 for more information. + * + * @return {boolean} + */ +function hasFlexItemMaxHeightBug() { + if (typeof hasFlexItemMaxHeightBug_ === 'undefined') { + hasFlexItemMaxHeightBug_ = ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_(); + } + return hasFlexItemMaxHeightBug_; +} + /** * @param {!HTMLElement} flexItemEl * @param {function(): undefined} callback */ -export function fixOverflowIE(flexItemEl, callback) { - if (!flexItemEl) { +export function fixFlexItemMaxHeightBug(flexItemEl, callback) { + if (!flexItemEl || !hasFlexItemMaxHeightBug()) { return; } - const toggleStyle = (el, prop, firstValue, secondValue) => { + const setAndRevert = (el, prop, firstValue, secondValue) => { const oldValue = el.style[prop]; el.style[prop] = el.style[prop] === firstValue ? secondValue : firstValue; el.style[prop] = oldValue; }; const tick = () => { - toggleStyle(flexItemEl, 'flex-basis', 'auto', ''); + setAndRevert(flexItemEl, 'flex-basis', 'auto', ''); setTimeout(() => { callback(); }); }; - for (let i = 0; i < 5; i++) { - setTimeout(() => tick(), i * 100); + for (let i = 0; i < numbers.IE_FLEX_OVERFLOW_BUG_ITERATIONS; i++) { + setTimeout(() => tick(), i * numbers.IE_FLEX_OVERFLOW_BUG_INTERVAL_MS); } } @@ -83,3 +126,34 @@ export function areTopsAligned(els) { [].forEach.call(els, (el) => tops.add(el.offsetTop)); return tops.size > 1; } + +/** + * @return {boolean} + * @private + */ +function ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_() { + const tempEl = document.createElement('div'); + + // The 1px borders are necessary to force IE to calculate box sizing correctly. + tempEl.innerHTML = ` +
+
Header
+
+
+
+
Footer
+
+`; + + document.body.appendChild(tempEl); + + const flexItemEl = tempEl.querySelector('article'); + const isScrollable = flexItemEl.scrollHeight > flexItemEl.offsetHeight; + + document.body.removeChild(tempEl); + + return !isScrollable; +} From 35dcf2ecda038a9eedfbcdf6481a3a70c203dc4c Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 23:31:31 -0700 Subject: [PATCH 097/219] WIP: Improve testability --- packages/mdc-dialog/index.js | 4 ++-- packages/mdc-dialog/util.js | 12 +++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/mdc-dialog/index.js b/packages/mdc-dialog/index.js index 56c83a3962a..09910cab455 100644 --- a/packages/mdc-dialog/index.js +++ b/packages/mdc-dialog/index.js @@ -112,8 +112,8 @@ export class MDCDialog extends MDCComponent { deregisterWindowResizeHandler: (handler) => window.removeEventListener('resize', handler), trapFocusOnSurface: () => this.focusTrap_.activate(), untrapFocusOnSurface: () => this.focusTrap_.deactivate(), - fixOverflowIE: (callback) => util.fixFlexItemMaxHeightBug(this.surface_, callback), - isContentScrollable: () => util.isScrollable(this.content_), + fixOverflowIE: (callback) => Boolean(this.surface_) && util.fixFlexItemMaxHeightBug(this.surface_, callback), + isContentScrollable: () => Boolean(this.content_) && util.isScrollable(this.content_), areButtonsStacked: () => util.areTopsAligned(this.buttons_), getAction: (element) => element.getAttribute(strings.ACTION_ATTRIBUTE), notifyOpening: () => this.emit(strings.OPENING_EVENT), diff --git a/packages/mdc-dialog/util.js b/packages/mdc-dialog/util.js index cd2d439c6f6..acab0d2d292 100644 --- a/packages/mdc-dialog/util.js +++ b/packages/mdc-dialog/util.js @@ -72,7 +72,7 @@ export function createFocusTrapInstance(surfaceEl, initialFocusEl = null, focusT * * @return {boolean} */ -function hasFlexItemMaxHeightBug() { +export function hasFlexItemMaxHeightBug() { if (typeof hasFlexItemMaxHeightBug_ === 'undefined') { hasFlexItemMaxHeightBug_ = ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_(); } @@ -84,7 +84,7 @@ function hasFlexItemMaxHeightBug() { * @param {function(): undefined} callback */ export function fixFlexItemMaxHeightBug(flexItemEl, callback) { - if (!flexItemEl || !hasFlexItemMaxHeightBug()) { + if (!hasFlexItemMaxHeightBug()) { return; } @@ -111,9 +111,6 @@ export function fixFlexItemMaxHeightBug(flexItemEl, callback) { * @return {boolean} */ export function isScrollable(el) { - if (!el) { - return false; - } return el.scrollHeight > el.offsetHeight; } @@ -150,10 +147,11 @@ function ignoresOverflowAutoOnFlexItemsThatExceedMaxHeight_() { document.body.appendChild(tempEl); + /** @type {!HTMLElement} */ const flexItemEl = tempEl.querySelector('article'); - const isScrollable = flexItemEl.scrollHeight > flexItemEl.offsetHeight; + const canScroll = isScrollable(flexItemEl); document.body.removeChild(tempEl); - return !isScrollable; + return !canScroll; } From 2b874728f7cbc05f87dfed3b2e6518e8759e2292 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 23:56:54 -0700 Subject: [PATCH 098/219] WIP: Don't disable focus trap when clicking on the scrim --- packages/mdc-dialog/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mdc-dialog/util.js b/packages/mdc-dialog/util.js index acab0d2d292..1a2c4eff6b5 100644 --- a/packages/mdc-dialog/util.js +++ b/packages/mdc-dialog/util.js @@ -36,7 +36,7 @@ let hasFlexItemMaxHeightBug_; export function createFocusTrapInstance(surfaceEl, initialFocusEl = null, focusTrapFactory = createFocusTrap) { return focusTrapFactory(surfaceEl, { initialFocus: initialFocusEl, - clickOutsideDeactivates: true, + clickOutsideDeactivates: false, }); } From 24bb7e7dda8ebb2de4ec287a599f30d63e5596bc Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Thu, 30 Aug 2018 23:57:18 -0700 Subject: [PATCH 099/219] WIP: Reorder methods in file --- packages/mdc-dialog/util.js | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/mdc-dialog/util.js b/packages/mdc-dialog/util.js index 1a2c4eff6b5..9e93d039cb7 100644 --- a/packages/mdc-dialog/util.js +++ b/packages/mdc-dialog/util.js @@ -40,6 +40,24 @@ export function createFocusTrapInstance(surfaceEl, initialFocusEl = null, focusT }); } +/** + * @param {!HTMLElement} el + * @return {boolean} + */ +export function isScrollable(el) { + return el.scrollHeight > el.offsetHeight; +} + +/** + * @param {!Array|!NodeList} els + * @return {boolean} + */ +export function areTopsAligned(els) { + const tops = new Set(); + [].forEach.call(els, (el) => tops.add(el.offsetTop)); + return tops.size > 1; +} + /** * IE 11 flexbox bug. `overflow: auto` is ignored on child flex items when their height exceeds the `max-height` of * their parent flex container. The child ends up overflowing the parent instead of respecting `max-height`. @@ -106,24 +124,6 @@ export function fixFlexItemMaxHeightBug(flexItemEl, callback) { } } -/** - * @param {!HTMLElement} el - * @return {boolean} - */ -export function isScrollable(el) { - return el.scrollHeight > el.offsetHeight; -} - -/** - * @param {!Array|!NodeList} els - * @return {boolean} - */ -export function areTopsAligned(els) { - const tops = new Set(); - [].forEach.call(els, (el) => tops.add(el.offsetTop)); - return tops.size > 1; -} - /** * @return {boolean} * @private From 73e5ab15c3e9e398bff2bac45b59c3fc69b2b6f6 Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 31 Aug 2018 00:32:01 -0700 Subject: [PATCH 100/219] WIP: Add mixins for min-width, max-width, and max-height --- packages/mdc-dialog/_mixins.scss | 46 +++++++++++++++++++++++++++++ packages/mdc-dialog/_variables.scss | 1 - packages/mdc-dialog/mdc-dialog.scss | 17 +++-------- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/packages/mdc-dialog/_mixins.scss b/packages/mdc-dialog/_mixins.scss index 5396c697101..55ddf7c4784 100644 --- a/packages/mdc-dialog/_mixins.scss +++ b/packages/mdc-dialog/_mixins.scss @@ -39,3 +39,49 @@ @mixin mdc-dialog-scroll-divider-color($color: $mdc-dialog-scroll-divider-color, $opacity: $mdc-dialog-scroll-divider-opacity) { border-color: rgba(mdc-theme-prop-value($color), $opacity); } + +@mixin mdc-dialog-min-width($min-width: $mdc-dialog-min-width) { + .mdc-dialog__surface { + min-width: $min-width; + } +} + +@mixin mdc-dialog-max-width($max-width-scalar: $mdc-dialog-max-width) { + .mdc-dialog__container { + @if $max-width-scalar { + $max-width-breakpoint: $max-width-scalar + ($mdc-dialog-viewport-margin * 2); + + // Fit snugly within the viewport at smaller screen sizes. + @media (max-width: ($max-width-breakpoint - 1)) { + max-width: $mdc-dialog-viewport-size-expr; + } + + // Once the screen gets big enough, apply a fixed maximum width. + @media (min-width: $max-width-breakpoint) { + max-width: $max-width-scalar; + } + } @else { + max-width: $mdc-dialog-viewport-size-expr; + } + } +} + +@mixin mdc-dialog-max-height($max-height-scalar: null) { + .mdc-dialog__container { + @if $max-height-scalar { + $max-height-breakpoint: $max-height-scalar + ($mdc-dialog-viewport-margin * 2); + + // Fit snugly within the viewport at smaller screen sizes. + @media (max-height: ($max-height-breakpoint - 1)) { + max-height: $mdc-dialog-viewport-size-expr; + } + + // Once the screen gets big enough, apply a fixed maximum height. + @media (min-height: $max-height-breakpoint) { + max-height: $max-height-scalar; + } + } @else { + max-height: $mdc-dialog-viewport-size-expr; + } + } +} diff --git a/packages/mdc-dialog/_variables.scss b/packages/mdc-dialog/_variables.scss index f1e7feead91..10cdf2266fd 100644 --- a/packages/mdc-dialog/_variables.scss +++ b/packages/mdc-dialog/_variables.scss @@ -18,7 +18,6 @@ $mdc-dialog-min-width: 280px; $mdc-dialog-max-width: 560px; $mdc-dialog-viewport-margin: 16px; $mdc-dialog-viewport-size-expr: calc(100% - #{$mdc-dialog-viewport-margin * 2}); -$mdc-dialog-width-breakpoint: $mdc-dialog-max-width + ($mdc-dialog-viewport-margin * 2); $mdc-dialog-corner-radius: 4px; $mdc-dialog-title-ink-color: on-surface; diff --git a/packages/mdc-dialog/mdc-dialog.scss b/packages/mdc-dialog/mdc-dialog.scss index e423ed491e8..eae51bb2fc2 100644 --- a/packages/mdc-dialog/mdc-dialog.scss +++ b/packages/mdc-dialog/mdc-dialog.scss @@ -32,6 +32,10 @@ // postcss-bem-linter: define dialog .mdc-dialog { + @include mdc-dialog-min-width; + @include mdc-dialog-max-width; + @include mdc-dialog-max-height; + // Use `display: none` instead of `visibility: hidden` to work around a `-webkit-line-clamp` bug. // https://stackoverflow.com/a/44193578/467582 display: none; @@ -69,18 +73,6 @@ display: flex; flex-direction: row; // IE 11 box-sizing: border-box; - max-height: $mdc-dialog-viewport-size-expr; - - // Fit snugly within the viewport at smaller screen sizes. - @media (max-width: ($mdc-dialog-width-breakpoint - 1)) { - max-width: $mdc-dialog-viewport-size-expr; - } - - // Once the screen gets big enough, apply a fixed maximum width. - @media (min-width: $mdc-dialog-width-breakpoint) { - max-width: $mdc-dialog-max-width; - } - transform: translateY(150px) scale(.8); opacity: 0; } @@ -95,7 +87,6 @@ flex-grow: 0; // IE 11 flex-shrink: 0; // IE 11 box-sizing: border-box; - min-width: $mdc-dialog-min-width; max-width: 100%; // IE 11 max-height: 100%; // IE 11 From 2a9c3be4e4096f991cfd54b46606e8b99030ac7c Mon Sep 17 00:00:00 2001 From: Andy Dvorak Date: Fri, 31 Aug 2018 12:27:56 -0700 Subject: [PATCH 101/219] WIP: English instead of Latin. Rename/retitle pages. Better scroll-bottom. Count of Monte Cristo instead of Lorem Ipsum. --- test/screenshot/golden.json | 53 ++- test/screenshot/infra/commands/index.js | 2 + .../mdc-dialog/classes/baseline-alert.html | 2 +- .../classes/baseline-confirmation.html | 2 +- .../mdc-dialog/classes/baseline-simple.html | 2 +- .../classes/manual-window-resize.html | 26 +- .../overflow-accessible-font-size.html | 276 +++++++++++++--- .../mdc-dialog/classes/overflow-bottom.html | 303 ++++++++++++++++++ .../spec/mdc-dialog/classes/overflow-top.html | 303 ++++++++++++++++++ .../spec/mdc-dialog/classes/overflow.html | 131 -------- .../mdc-dialog/classes/scrollable-bottom.html | 130 -------- .../mdc-dialog/classes/scrollable-top.html | 130 -------- test/screenshot/spec/mdc-dialog/fixture.js | 18 +- 13 files changed, 888 insertions(+), 490 deletions(-) create mode 100644 test/screenshot/spec/mdc-dialog/classes/overflow-bottom.html create mode 100644 test/screenshot/spec/mdc-dialog/classes/overflow-top.html delete mode 100644 test/screenshot/spec/mdc-dialog/classes/overflow.html delete mode 100644 test/screenshot/spec/mdc-dialog/classes/scrollable-bottom.html delete mode 100644 test/screenshot/spec/mdc-dialog/classes/scrollable-top.html diff --git a/test/screenshot/golden.json b/test/screenshot/golden.json index 3474922cc38..6d69a5ae9a7 100644 --- a/test/screenshot/golden.json +++ b/test/screenshot/golden.json @@ -225,48 +225,39 @@ } }, "spec/mdc-dialog/classes/manual-window-resize.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/manual-window-resize.html?utm_source=golden_json", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_51_57_095/spec/mdc-dialog/classes/manual-window-resize.html?utm_source=golden_json", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/manual-window-resize.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/manual-window-resize.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/manual-window-resize.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/manual-window-resize.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_51_57_095/spec/mdc-dialog/classes/manual-window-resize.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_51_57_095/spec/mdc-dialog/classes/manual-window-resize.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_51_57_095/spec/mdc-dialog/classes/manual-window-resize.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_51_57_095/spec/mdc-dialog/classes/manual-window-resize.html.windows_ie_11.png" } }, "spec/mdc-dialog/classes/overflow-accessible-font-size.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow-accessible-font-size.html?utm_source=golden_json", + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html?utm_source=golden_json", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-accessible-font-size.html.windows_ie_11.png" } }, - "spec/mdc-dialog/classes/overflow.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow.html?utm_source=golden_json", + "spec/mdc-dialog/classes/overflow-bottom.html": { + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-bottom.html?utm_source=golden_json", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/overflow.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-bottom.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-bottom.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-bottom.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-bottom.html.windows_ie_11.png" } }, - "spec/mdc-dialog/classes/scrollable-bottom.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/03_40_02_251/spec/mdc-dialog/classes/scrollable-bottom.html?utm_source=golden_json", + "spec/mdc-dialog/classes/overflow-top.html": { + "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-top.html?utm_source=golden_json", "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-bottom.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-bottom.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-bottom.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/03_40_02_251/spec/mdc-dialog/classes/scrollable-bottom.html.windows_ie_11.png" - } - }, - "spec/mdc-dialog/classes/scrollable-top.html": { - "public_url": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-top.html?utm_source=golden_json", - "screenshots": { - "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-top.html.windows_chrome_68.png", - "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-top.html.windows_edge_17.png", - "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-top.html.windows_firefox_61.png", - "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/00_40_09_397/spec/mdc-dialog/classes/scrollable-top.html.windows_ie_11.png" + "desktop_windows_chrome@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-top.html.windows_chrome_68.png", + "desktop_windows_edge@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-top.html.windows_edge_17.png", + "desktop_windows_firefox@latest": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-top.html.windows_firefox_61.png", + "desktop_windows_ie@11": "https://storage.googleapis.com/mdc-web-screenshot-tests/advorak/2018/08/31/18_38_52_462/spec/mdc-dialog/classes/overflow-top.html.windows_ie_11.png" } }, "spec/mdc-drawer/classes/dismissible.html": { diff --git a/test/screenshot/infra/commands/index.js b/test/screenshot/infra/commands/index.js index c8a13adefad..52f10953c60 100644 --- a/test/screenshot/infra/commands/index.js +++ b/test/screenshot/infra/commands/index.js @@ -93,7 +93,9 @@ class IndexCommand { + ${parentDirName} +