| /* |
| * Copyright 2014 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 |
| * |
| * 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. |
| */ |
| |
| /** |
| * @fileoverview Stylesheet injected into mobile pages to render a progress |
| * bar, inject a header bar with a logo, and navigational menus. See also |
| * layout.css, which transforms desktop pages to a mobile-friendly format. |
| * |
| * @author jud@google.com (Jud Porter) |
| * jmarantz@google.com (Joshua Marantz) |
| * huibao@google.com (Huibao Lin) |
| */ |
| |
| /* Note: Most of the elements here are specified in "em" units, meaning they are |
| * relative to the font-size. The font-size of the header bar is then set to |
| * offset the zoom level of the page so that the header bar and nav panel are |
| * always the same size. |
| */ |
| |
| |
| body { |
| padding: 0 !important; |
| } |
| |
| /* Used only in frame mode. */ |
| body.mob-iframe { |
| /* Only show scroll bars from the iframe, not the rest of the page. */ |
| overflow: hidden; |
| margin: 0; |
| } |
| |
| .psmob-noscroll { |
| overflow: hidden; |
| } |
| |
| #psmob-iframe-container { |
| height: 100vh; |
| display: -webkit-box; |
| display: -ms-flexbox; |
| display: -webkit-flex; |
| display: flex; |
| -webkit-flex-direction: column; |
| -ms-flex-direction: column; |
| flex-direction: column; |
| |
| /* This, along with the settings on #psmob-iframe below, ensure that the |
| * iframe contents do not expand past the viewport size. |
| * http://stackoverflow.com/questions/23083462/how-to-get-an-iframe-to-be-responsive-in-ios-safari |
| */ |
| -webkit-overflow-scrolling: touch; |
| } |
| |
| #psmob-iframe { |
| border-width: 0; |
| overflow: hidden; |
| -webkit-box-flex: 1; |
| -webkit-flex: 1; |
| -ms-flex: 1; |
| flex: 1; |
| /* This, along with setting scrolling="no" on the iframe, ensure the iframe |
| * contents do not expand the iframe on ios. |
| * http://stackoverflow.com/questions/23083462/how-to-get-an-iframe-to-be-responsive-in-ios-safari |
| */ |
| width: 1px; |
| min-width: 100%; |
| } |
| |
| #psmob-header-bar { |
| position: absolute !important; |
| top: 0; |
| left: 0; |
| z-index: 999999; |
| |
| padding: 0; |
| |
| width: 100%; |
| height: 57em; |
| |
| -webkit-transform-origin: 0 0; |
| transform-origin: 0 0; |
| |
| border-bottom: thin solid; |
| |
| box-shadow: 0 5em 6em -1em rgba(0, 0, 0, 0.4); |
| |
| display: -webkit-box; |
| display: -ms-flexbox; |
| display: -webkit-flex; |
| display: flex; |
| |
| opacity: 1; |
| /* Use a 200ms fade in when redrawing the bar after scrolling. */ |
| -webkit-transition: opacity 0.2s; |
| -moz-transition: opacity 0.2s; |
| -o-transition: opacity 0.2s; |
| transition: opacity 0.2s; |
| } |
| |
| #psmob-header-bar.ios-webview { |
| position: fixed !important; |
| } |
| |
| #psmob-header-bar, #psmob-nav-panel { |
| box-sizing: border-box !important; |
| } |
| |
| #psmob-header-bar *, #psmob-nav-panel * { |
| box-sizing: inherit !important; |
| } |
| |
| #psmob-header-bar.psmob-labeled { |
| -webkit-box-pack: center; |
| -webkit-justify-content: space-around; |
| justify-content: space-around; |
| } |
| |
| /* Note, don't add visibility: none; here because then |
| * goog.style.getTransformedSize won't calculate the size correctly. |
| */ |
| #psmob-header-bar.psmob-hide { |
| display: none; |
| opacity: 0; |
| /* Make the bar disappear immediately when scrolling. */ |
| -webkit-transition: opacity 0s; |
| -moz-transition: opacity 0s; |
| -o-transition: opacity 0s; |
| transition: opacity 0s; |
| } |
| |
| /* TODO(jud): Do we still have button elements in the header bar? */ |
| #psmob-header-bar button { |
| margin: 0; |
| padding: 0; |
| top: 0; |
| bottom: 0; |
| |
| background-image: none; |
| background-color: transparent; |
| |
| border: none; |
| |
| padding: 0; |
| |
| -webkit-transition: background-color 0.2s ease-out; |
| -moz-transition: background-color 0.2s ease-out; |
| -o-transition: background-color 0.2s ease-out; |
| transition: background-color 0.2s ease-out; |
| } |
| |
| #psmob-header-bar button:hover { |
| background-color: rgba(255, 255, 255, 0.1); |
| } |
| |
| #psmob-header-bar button:focus { |
| background-color: rgba(255, 255, 255, 0.2); |
| outline: 0; |
| } |
| |
| #psmob-header-bar button:active { |
| background-color: rgba(255, 255, 255, 0.4); |
| } |
| |
| .psmob-button { |
| display: -webkit-box; |
| display: -moz-box; |
| display: -webkit-flex; |
| display: flex; |
| |
| text-decoration: none; |
| |
| height: 48em; |
| margin: 4em 0; |
| } |
| |
| #psmob-header-bar:not(.psmob-labeled) .psmob-button { |
| border: solid 1em; |
| border-radius: 9em; |
| margin: 4em 2em; |
| } |
| |
| |
| .psmob-button-icon { |
| height: 48em; |
| width: 48em; |
| } |
| |
| /* We don't show the logo or menu button in labeled mode. */ |
| #psmob-header-bar.psmob-labeled #psmob-menu-button, |
| #psmob-header-bar.psmob-labeled #psmob-logo-span { |
| display: none; |
| } |
| |
| .psmob-button-icon { |
| display: inline-block; |
| background-repeat: no-repeat; |
| background-size: 60%; |
| background-position: center; |
| } |
| |
| .psmob-button-text { |
| /* Only display button text in labeled mode or when there is only 1 button. */ |
| display: none; |
| |
| font-size: 20em !important; |
| |
| height: 1.8em; /* 36/20 */ |
| width: auto; |
| font-family: arial, sans-serif; |
| font-weight: bold; |
| line-height: 1.8em; /* 36/20 */ |
| margin: 0; |
| padding: 0.3em 0; /* 6/20 */ |
| white-space: nowrap; |
| } |
| |
| #psmob-header-bar:not(.psmob-labeled) .psmob-button-text { |
| height: 2em; /* 40/20 */ |
| line-height: 2em; /* 40/20 */ |
| margin-right: .4em; /* 5/20 */ |
| } |
| |
| #psmob-header-bar.psmob-show-button-text .psmob-button-text { |
| display: block; |
| } |
| |
| /* Use a smaller font size on smaller devices, otherwise the text will overflow |
| * the div it is in. This specifically happens on iphone 4 and 5. |
| */ |
| @media (max-device-width: 360px) { |
| .psmob-button-text { |
| font-size: 16em !important; |
| height: 2.25em; /* 36/16 */ |
| line-height: 2.25em; /* 36/16 */ |
| padding: 0.375em 0; /* 6/16 */ |
| } |
| |
| #psmob-header-bar:not(.psmob-labeled) .psmob-button-text { |
| height: 2.5em; /* 40/16 */ |
| line-height: 2.5em; /* 40/16 */ |
| margin-right: 0.3125em; /* 5/16 */ |
| } |
| } |
| |
| |
| #psmob-logo-span { |
| height: 100%; |
| width: auto; |
| padding: 0; |
| /* The element must be display:block for old browsers using -webkit-box-flex |
| * to cause the element to grow */ |
| /* display: block; */ |
| /* Disable the logo at the moment to see if it improves appearances. */ |
| display: none; |
| -webkit-box-flex: 1; |
| width: 70%; /* For old browsers, otherwise collapses. */ |
| -webkit-flex: 1; |
| -ms-flex: 1; |
| flex: 1; |
| } |
| |
| #psmob-header-bar.psmob-theme-config #psmob-logo-span { |
| display: block; |
| } |
| |
| #psmob-logo-image { |
| height: 100%; |
| width: auto; |
| padding-top: 10em; |
| padding-bottom: 10em; |
| |
| /* Center the image in the logo span. */ |
| display: block; |
| margin: 0 auto; |
| |
| max-width: 100% !important; |
| } |
| |
| #psmob-header-bar:not(.psmob-labeled) #psmob-dialer-button { |
| margin-left: auto !important; |
| } |
| |
| #psmob-nav-panel { |
| position: absolute !important; |
| |
| /* Panel is hidden by default. */ |
| display: none; |
| visibility: hidden; |
| |
| -webkit-transform-origin: 0 0; |
| transform-origin: 0 0; |
| |
| top: 0; |
| bottom: 0; |
| left: 0; |
| right: 0; |
| /* The width specified here must match mob.NavPanel.WIDTH_ in nav_panel.js. */ |
| width: 350em !important; |
| |
| /* Wordpress sets a z-index of 99999 for its admin header bar, so set a larger |
| * value so our nav bar ends up on top of it. */ |
| z-index: 999999; |
| |
| font-family: arial, sans-serif; |
| |
| /* We don't set margin-top here because that gets set dynamically by the JS to |
| * compensate for zoom level. */ |
| margin-left: 0 !important; |
| margin-right: 0 !important; |
| margin-bottom: 0 !important; |
| padding: 0 !important; |
| |
| box-shadow: 5px 0 6px -1px rgba(0, 0, 0, 0.4); |
| |
| overflow-y: auto; |
| |
| /* Add a 0.3s delay to the visibility change so that the sliding animation |
| * finishes before hiding the panel. */ |
| -webkit-transition: visibility 0s linear 0.3s, left 0.3s ease-out; |
| -o-transition: visibility 0s linear 0.3s, left 0.3s ease-out; |
| -moz-transition: visibility 0s linear 0.3s, left 0.3s ease-out; |
| transition: visibility 0s linear 0.3s, left 0.3s ease-out; |
| |
| /* Use momentum-based scrolling on iOS. Otherwise the nav panel scrolls too |
| * quickly. */ |
| -webkit-overflow-scrolling: touch; |
| } |
| |
| #psmob-nav-panel.psmob-open { |
| -webkit-transform: translate(0,0); |
| transform: translate(0,0); |
| /* When sliding the tray out, don't use a transition-delay (set above) so that |
| * the panel is visible when the animation starts. */ |
| transition-delay: 0s; |
| |
| /* Panel is hidden by default. */ |
| visibility: visible; |
| display: block; |
| } |
| |
| #psmob-nav-panel ul { |
| width: 100%; |
| padding: 0; |
| margin: 0; |
| |
| list-style-type: none; |
| display: none; |
| } |
| |
| #psmob-nav-panel > ul { |
| font-size: 22em !important; |
| } |
| |
| /* TODO(jud): Consider using class labels instead of deeply nested rules. */ |
| #psmob-nav-panel ul li { |
| border-bottom-style: solid; |
| border-width: 1px; |
| border-color: white; |
| |
| background: none; |
| |
| text-align: left; |
| |
| position: relative; |
| |
| |
| padding-right: 0; |
| padding-top: 0; |
| padding-bottom: 0; |
| line-height: 60em !important; |
| text-decoration: none; |
| |
| -o-transition: background-color 0.2s ease-out; |
| -moz-transition: background-color 0.2s ease-out; |
| -webkit-transition: background-color 0.2s ease-out; |
| transition: background-color 0.2s ease-out; |
| } |
| |
| #psmob-nav-panel ul li a, |
| #psmob-nav-panel ul li div { |
| min-height: 2.7273em; /* 60/22 */ |
| display: block; |
| padding-right: 0; |
| padding-top: 0; |
| padding-bottom: 0; |
| line-height: 2.7273em !important; /* 60/22 */ |
| text-decoration: none; |
| |
| -webkit-transition: background-color 0.2s ease-out; |
| -moz-transition: background-color 0.2s ease-out; |
| -o-transition: background-color 0.2s ease-out; |
| transition: background-color 0.2s ease-out; |
| } |
| |
| #psmob-nav-panel ul li div { |
| position: relative; |
| } |
| |
| #psmob-nav-panel ul.psmob-open { |
| display: block; |
| } |
| |
| #psmob-nav-panel ul li a:hover { |
| background-color: rgba(255, 255, 255, 0.2); |
| } |
| |
| #psmob-nav-panel ul li a:focus { |
| background-color: rgba(255, 255, 255, 0.3); |
| outline: 0; |
| } |
| |
| #psmob-nav-panel ul li a:active { |
| background-color: rgba(255, 255, 255, 0.4); |
| } |
| |
| .psmob-menu-expand-icon { |
| display: inline-block; |
| vertical-align: middle; |
| width: 0.9091em; /* 20/22 */ |
| height: 0.9091em; /* 20/22 */ |
| -ms-transform: rotate(270deg); |
| -webkit-transform: rotate(270deg); |
| transform: rotate(270deg); |
| } |
| |
| .psmob-menu-expand-icon.psmob-open { |
| -ms-transform: rotate(0deg); |
| -webkit-transform: rotate(0deg); |
| transform: rotate(0deg); |
| } |
| |
| /* TODO(jud): This is probably slow to match, so consider using a class. */ |
| #psmob-nav-panel img:not(.psmob-menu-expand-icon) { |
| display: inline-block; |
| vertical-align: middle; |
| } |
| |
| #psmob-spacer { |
| width: 100%; |
| opacity: 0; |
| } |
| |
| /* Commmon patterns applied to a broad range of elements */ |
| .psmob-single-column { |
| border-left: 0 !important; |
| border-right: 0 !important; |
| margin-left: 0 !important; |
| margin-right: 0 !important; |
| padding-left: 0 !important; |
| padding-right: 0 !important; |
| } |
| |
| /* Progess Bar elements */ |
| .psProgressScrim { |
| z-index: 100000 !important; |
| position: fixed; |
| top: 0 !important; |
| margin: 0 !important; |
| padding-top: 100em !important; |
| background: white; |
| border: 0; |
| width: 100%; |
| height: 100%; |
| } |
| |
| .psProgressBar { |
| margin-top: 56px !important; |
| margin-left: 20% !important; |
| height: 20px; /* Can be anything */ |
| width: 60%; |
| margin: 0; |
| background: #555; |
| -moz-border-radius: 25px; |
| -webkit-border-radius: 25px; |
| border-radius: 25px; |
| padding: 10px; |
| -webkit-box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3); |
| -moz-box-shadow : inset 0 -1px 1px rgba(255,255,255,0.3); |
| box-shadow : inset 0 -1px 1px rgba(255,255,255,0.3); |
| |
| /* |
| * Simplified Meyer Reset |
| * http://meyerweb.com/eric/tools/css/reset/ |
| */ |
| border: 0; |
| font-size: 100%; |
| font: inherit; |
| vertical-align: baseline; |
| display: block; |
| line-height: 1; |
| list-style: none; |
| quotes: none; |
| content: ''; |
| content: none; |
| border-collapse: collapse; |
| border-spacing: 0; |
| } |
| |
| .psProgressSpan { |
| display: block; |
| height: 100%; |
| position: relative; |
| width: 0%; |
| |
| -webkit-border-top-right-radius: 8px; |
| -webkit-border-bottom-right-radius: 8px; |
| -moz-border-radius-topright: 8px; |
| -moz-border-radius-bottomright: 8px; |
| border-top-right-radius: 8px; |
| border-bottom-right-radius: 8px; |
| -webkit-border-top-left-radius: 20px; |
| -webkit-border-bottom-left-radius: 20px; |
| -moz-border-radius-topleft: 20px; |
| -moz-border-radius-bottomleft: 20px; |
| border-top-left-radius: 20px; |
| border-bottom-left-radius: 20px; |
| background-color: rgb(43,194,83); |
| background-image: -webkit-gradient( |
| linear, |
| left bottom, |
| left top, |
| color-stop(0, rgb(43,194,83)), |
| color-stop(1, rgb(84,240,84)) |
| ); |
| background-image: -moz-linear-gradient( |
| center bottom, |
| rgb(43,194,83) 37%, |
| rgb(84,240,84) 69% |
| ); |
| -webkit-box-shadow: |
| inset 0 2px 9px rgba(255,255,255,0.3), |
| inset 0 -2px 6px rgba(0,0,0,0.4); |
| -moz-box-shadow: |
| inset 0 2px 9px rgba(255,255,255,0.3), |
| inset 0 -2px 6px rgba(0,0,0,0.4); |
| box-shadow: |
| inset 0 2px 9px rgba(255,255,255,0.3), |
| inset 0 -2px 6px rgba(0,0,0,0.4); |
| position: relative; |
| overflow: hidden; |
| } |
| |
| .psProgressLog { |
| margin-top: 30px !important; |
| margin-left: 10% !important; |
| background: white; |
| /* Invisible by default; in debug mode we override. */ |
| color: white; |
| font-family: sans-serif !important; |
| font-size: 12px; |
| overflow-y: auto; |
| height: 300px; |
| width: 80%; |
| } |
| |
| /* Setup the click detector div so that it is positioned over the entire |
| * viewport, but underneath menu bar and header. */ |
| #psmob-click-detector-div { |
| width: 100%; |
| position: fixed; |
| top: 0; |
| bottom: 0; |
| opacity: 0; |
| /* Click events are not sent to hidden visibility elements. */ |
| visibility: hidden; |
| /* Set z-index so that it ends up above the rest of the elements on the page |
| * but below the nav panel and header bar. */ |
| z-index: 999998; |
| } |
| |
| #psmob-click-detector-div.psmob-open { |
| visibility: visible; |
| } |
| |
| /* |
| * The logo chooser sizing is based on a font-size of 12px, and manually |
| * tweaked sizes for logos and colors based on that. This is scaled in JS |
| * (mob.Nav.prototype.chooserDisplayPopup_) via a CSS transform to |
| * match the window size at the time it's instantiated. |
| * |
| * TODO(jmarantz): The CSS delivered to clients should not include the |
| * psmob-logo-chooser-* classes unless ?PageSpeedMobConfig=on is specified. |
| */ |
| .psmob-logo-chooser-choice { |
| margin-bottom: 10px; |
| border-width: 1px; |
| padding: 2px 2px 2px 2px; |
| overflow: hidden; |
| } |
| |
| .psmob-logo-chooser-color { |
| height: 56px; /* width is determined by table header. */ |
| border-color: black; |
| border-width: 1px; |
| border-style: solid; |
| } |
| |
| .psmob-logo-chooser-swap { |
| width: 30px; |
| height: 30px; |
| } |
| |
| .psmob-logo-chooser-column-header { |
| font-family: sans-serif; |
| font-size: 12px; |
| font-weight: bold; |
| border-color: black; |
| border-width: 1px; |
| border-style: solid; |
| } |
| |
| .psmob-logo-chooser-table { |
| z-index: 999999; |
| position: absolute; |
| left: 0; |
| top: 0; |
| background-color: white; |
| border-style: solid; |
| border-width: 4px; |
| |
| opacity: 1; |
| /* Use a 200ms fade in when redrawing the table after scrolling. */ |
| -webkit-transition: opacity 0.2s; |
| -moz-transition: opacity 0.2s; |
| -o-transition: opacity 0.2s; |
| transition: opacity 0.2s; |
| } |
| |
| .psmob-logo-chooser-image { |
| max-width: 200px; |
| max-height: 56px; |
| width: auto !important; |
| height: auto !important; |
| } |
| |
| .psmob-logo-chooser-config-fragment { |
| width: 350px; |
| border-style: solid; |
| border-width: 4px; |
| border-color: black; |
| background-color: darkgreen; |
| color: white; |
| font-family: monospace; |
| font-size: 18px; |
| position: absolute; |
| left: 0; |
| top: 0; |
| z-index: 999999 !important; |
| } |