|
| 1 | +/** |
| 2 | + * @license |
| 3 | + * Copyright (c) 2018 - 2025 Vaadin Ltd. |
| 4 | + * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/ |
| 5 | + */ |
| 6 | +import '@vaadin/component-base/src/style-props.js'; |
| 7 | +import { css } from 'lit'; |
| 8 | + |
| 9 | +export const appLayoutStyles = css` |
| 10 | + @layer base { |
| 11 | + :host { |
| 12 | + display: block; |
| 13 | + box-sizing: border-box; |
| 14 | + height: 100%; |
| 15 | + --vaadin-app-layout-transition-duration: 0s; |
| 16 | + transition: padding var(--vaadin-app-layout-transition-duration); |
| 17 | + --_vaadin-app-layout-drawer-width: var(--vaadin-app-layout-drawer-width, auto); |
| 18 | + --vaadin-app-layout-touch-optimized: false; |
| 19 | + --vaadin-app-layout-navbar-offset-top: var(--_vaadin-app-layout-navbar-offset-size); |
| 20 | + --vaadin-app-layout-navbar-offset-bottom: var(--_vaadin-app-layout-navbar-offset-size-bottom); |
| 21 | + padding-block: var(--vaadin-app-layout-navbar-offset-top) var(--vaadin-app-layout-navbar-offset-bottom); |
| 22 | + padding-inline-start: var(--vaadin-app-layout-navbar-offset-left); |
| 23 | + } |
| 24 | +
|
| 25 | + :host([hidden]), |
| 26 | + [hidden] { |
| 27 | + display: none !important; |
| 28 | + } |
| 29 | +
|
| 30 | + @media (prefers-reduced-motion: no-preference) { |
| 31 | + :host(:not([no-anim])) { |
| 32 | + --vaadin-app-layout-transition-duration: 200ms; |
| 33 | + } |
| 34 | + } |
| 35 | +
|
| 36 | + :host([drawer-opened]) { |
| 37 | + --vaadin-app-layout-drawer-offset-left: var(--_vaadin-app-layout-drawer-offset-size); |
| 38 | + } |
| 39 | +
|
| 40 | + :host([overlay]) { |
| 41 | + --vaadin-app-layout-drawer-offset-left: 0; |
| 42 | + --vaadin-app-layout-navbar-offset-left: 0; |
| 43 | + } |
| 44 | +
|
| 45 | + :host(:not([no-scroll])) [content] { |
| 46 | + overflow: auto; |
| 47 | + } |
| 48 | +
|
| 49 | + [content] { |
| 50 | + height: 100%; |
| 51 | + } |
| 52 | +
|
| 53 | + @media (pointer: coarse) and (max-width: 800px) and (min-height: 500px) { |
| 54 | + :host { |
| 55 | + --vaadin-app-layout-touch-optimized: true; |
| 56 | + } |
| 57 | + } |
| 58 | +
|
| 59 | + [part='navbar'] { |
| 60 | + position: fixed; |
| 61 | + display: flex; |
| 62 | + align-items: center; |
| 63 | + top: 0; |
| 64 | + inset-inline: 0; |
| 65 | + transition: inset-inline-start var(--vaadin-app-layout-transition-duration); |
| 66 | + padding-top: max(var(--vaadin-app-layout-navbar-padding-top, var(--_vaadin-padding)), var(--safe-area-inset-top)); |
| 67 | + padding-bottom: var(--vaadin-app-layout-navbar-padding-bottom, var(--_vaadin-padding)); |
| 68 | + padding-inline-start: max( |
| 69 | + var(--vaadin-app-layout-navbar-padding-inline-start, var(--_vaadin-padding)), |
| 70 | + var(--safe-area-inset-left) |
| 71 | + ); |
| 72 | + /* stylelint-disable-next-line declaration-block-no-redundant-longhand-properties */ |
| 73 | + padding-inline-end: max( |
| 74 | + var(--vaadin-app-layout-navbar-padding-inline-end, var(--_vaadin-padding)), |
| 75 | + var(--safe-area-inset-right) |
| 76 | + ); |
| 77 | + z-index: 1; |
| 78 | + gap: var(--vaadin-app-layout-navbar-gap, var(--_vaadin-gap-container-inline)); |
| 79 | + background: var(--vaadin-app-layout-navbar-background, var(--_vaadin-background-container)); |
| 80 | + } |
| 81 | +
|
| 82 | + :host([primary-section='drawer'][drawer-opened]:not([overlay])) [part='navbar'] { |
| 83 | + inset-inline-start: var(--vaadin-app-layout-drawer-offset-left, 0); |
| 84 | + } |
| 85 | +
|
| 86 | + :host([primary-section='drawer']) [part='drawer'] { |
| 87 | + top: 0; |
| 88 | + } |
| 89 | +
|
| 90 | + [part='navbar'][bottom] { |
| 91 | + top: auto; |
| 92 | + bottom: 0; |
| 93 | + padding-top: var(--vaadin-app-layout-navbar-padding-top, var(--_vaadin-padding)); |
| 94 | + padding-bottom: max( |
| 95 | + var(--vaadin-app-layout-navbar-padding-bottom, var(--_vaadin-padding)), |
| 96 | + var(--safe-area-inset-bottom) |
| 97 | + ); |
| 98 | + } |
| 99 | +
|
| 100 | + [part='drawer'] { |
| 101 | + overflow: auto; |
| 102 | + overscroll-behavior: contain; |
| 103 | + position: fixed; |
| 104 | + top: var(--vaadin-app-layout-navbar-offset-top, 0); |
| 105 | + bottom: var(--vaadin-app-layout-navbar-offset-bottom, var(--vaadin-viewport-offset-bottom, 0)); |
| 106 | + inset-inline: var(--vaadin-app-layout-navbar-offset-left, 0) auto; |
| 107 | + transition: |
| 108 | + transform var(--vaadin-app-layout-transition-duration), |
| 109 | + visibility var(--vaadin-app-layout-transition-duration); |
| 110 | + transform: translateX(-100%); |
| 111 | + max-width: 90%; |
| 112 | + width: var(--_vaadin-app-layout-drawer-width); |
| 113 | + box-sizing: border-box; |
| 114 | + padding: var(--safe-area-inset-top) 0 var(--safe-area-inset-bottom) var(--safe-area-inset-left); |
| 115 | + outline: none; |
| 116 | + /* The drawer should be inaccessible by the tabbing navigation when it is closed. */ |
| 117 | + visibility: hidden; |
| 118 | + display: flex; |
| 119 | + flex-direction: column; |
| 120 | + background: var(--vaadin-app-layout-drawer-background, var(--_vaadin-background)); |
| 121 | + } |
| 122 | +
|
| 123 | + :host([drawer-opened]) [part='drawer'] { |
| 124 | + /* The drawer should be accessible by the tabbing navigation when it is opened. */ |
| 125 | + visibility: visible; |
| 126 | + transform: translateX(0%); |
| 127 | + touch-action: manipulation; |
| 128 | + } |
| 129 | +
|
| 130 | + [part='backdrop'] { |
| 131 | + background: var(--vaadin-overlay-backdrop-background, rgba(0, 0, 0, 0.5)); |
| 132 | + } |
| 133 | +
|
| 134 | + :host(:not([drawer-opened])) [part='backdrop'] { |
| 135 | + opacity: 0 !important; |
| 136 | + } |
| 137 | +
|
| 138 | + :host([overlay]) [part='backdrop'] { |
| 139 | + position: fixed; |
| 140 | + inset: 0; |
| 141 | + pointer-events: none; |
| 142 | + transition: opacity var(--vaadin-app-layout-transition-duration); |
| 143 | + -webkit-tap-highlight-color: transparent; |
| 144 | + } |
| 145 | +
|
| 146 | + :host([overlay]) [part='drawer'] { |
| 147 | + top: 0; |
| 148 | + bottom: 0; |
| 149 | + box-shadow: var(--vaadin-overlay-box-shadow, 0 8px 24px -4px hsl(0 0 0 / 0.3)); |
| 150 | + } |
| 151 | +
|
| 152 | + :host([overlay]) [part='drawer'], |
| 153 | + :host([overlay]) [part='backdrop'] { |
| 154 | + z-index: 2; |
| 155 | + } |
| 156 | +
|
| 157 | + :host([drawer-opened][overlay]) [part='backdrop'] { |
| 158 | + pointer-events: auto; |
| 159 | + touch-action: manipulation; |
| 160 | + } |
| 161 | +
|
| 162 | + :host([dir='rtl']) [part='drawer'] { |
| 163 | + transform: translateX(100%); |
| 164 | + } |
| 165 | +
|
| 166 | + :host([dir='rtl'][drawer-opened]) [part='drawer'] { |
| 167 | + transform: translateX(0%); |
| 168 | + } |
| 169 | +
|
| 170 | + :host([drawer-opened]:not([overlay])) { |
| 171 | + padding-inline-start: var(--vaadin-app-layout-drawer-offset-left); |
| 172 | + } |
| 173 | +
|
| 174 | + @media (max-width: 800px), (max-height: 600px) { |
| 175 | + :host { |
| 176 | + --vaadin-app-layout-drawer-overlay: true; |
| 177 | + --_vaadin-app-layout-drawer-width: var(--vaadin-app-layout-drawer-width, 20em); |
| 178 | + } |
| 179 | + } |
| 180 | +
|
| 181 | + /* If a vaadin-scroller is used in the drawer, allow it to take all remaining space and contain scrolling */ |
| 182 | + [part='drawer'] ::slotted(vaadin-scroller) { |
| 183 | + flex: 1; |
| 184 | + overscroll-behavior: contain; |
| 185 | + } |
| 186 | +
|
| 187 | + @media (forced-colors: active) { |
| 188 | + :host([overlay]) [part='drawer'] { |
| 189 | + border: 3px solid; |
| 190 | + } |
| 191 | + } |
| 192 | + } |
| 193 | +`; |
0 commit comments