Rewild Your Web
web browser dweb
at main 275 lines 5.3 kB view raw
1/* SPDX-License-Identifier: AGPL-3.0-or-later */ 2 3:root { 4 --sidebar-width: 2em; 5 --keyboard-height: 220px; 6 7 /* Z-index layers */ 8 --z-base: 1; 9 --z-base-active: 10; 10 --z-local-ui: 100; 11 --z-panel: 500; 12 --z-dialog: 1000; 13 --z-gesture: 5000; 14 --z-chrome: 6000; 15 --z-sheet: 7000; 16 --z-modal: 8000; 17 18 /* Keyboard offset - set to keyboard height when keyboard is open */ 19 --keyboard-offset: 0px; 20} 21 22body.keyboard-open { 23 --keyboard-offset: var(--keyboard-height); 24} 25 26* { 27 box-sizing: border-box; 28} 29 30html { 31 padding: 0; 32 margin: 0; 33 height: 100%; 34 width: 100%; 35 font-family: var(--font-family-base); 36} 37 38body { 39 padding: 0; 40 margin: 0; 41 height: 100%; 42 width: 100%; 43 overflow: hidden; 44 display: flex; 45 flex-direction: column; 46 color: var(--color-text-menu); 47} 48 49#header { 50 height: var(--size-header-height); 51 padding: var(--spacing-xs) var(--spacing-sm); 52 width: fit-content; 53 background: var(--bg-header); 54 font-weight: var(--font-weight-bold); 55 border-radius: var(--radius-sm) var(--radius-sm) 0 0; 56 cursor: default; 57 display: flex; 58 align-items: center; 59 gap: var(--spacing-xs); 60 /* switch back (permanently?) to a regular OS provided window frame */ 61 display: none; 62} 63 64#header img { 65 width: var(--size-icon); 66} 67 68#header .close { 69 cursor: pointer; 70} 71 72#header .resize { 73 cursor: nw-resize; 74} 75 76main { 77 display: flex; 78 background: var(--bg-main); 79 height: 100%; 80} 81 82#sidebar { 83 display: flex; 84 flex-direction: column; 85 padding: var(--spacing-xs); 86 gap: var(--spacing-xs); 87 width: var(--sidebar-width); 88} 89 90#views-icons { 91 flex: 1; 92 display: flex; 93 flex-direction: column; 94 gap: var(--spacing-xs); 95 overflow-y: auto; 96 overflow-x: hidden; 97} 98 99.view-icon { 100 width: 1.5em; 101 height: 1.5em; 102 border-radius: var(--radius-sm); 103 cursor: pointer; 104 display: flex; 105 align-items: center; 106 justify-content: center; 107 background: var(--bg-webview); 108 border: 2px solid transparent; 109 transition: border-color var(--transition-fast), opacity var(--transition-fast); 110 opacity: var(--opacity-muted); 111} 112 113.view-icon:hover { 114 opacity: 1; 115} 116 117.view-icon.active { 118 border-color: var(--color-focus-ring); 119 opacity: 1; 120} 121 122.view-icon-img { 123 width: 1em; 124 height: 1em; 125 object-fit: contain; 126} 127 128.view-icon-img[src=""] { 129 display: none; 130} 131 132.sidebar-preview { 133 position: fixed; 134 z-index: var(--z-dialog); 135 background: var(--bg-menu); 136 border-radius: var(--radius-md); 137 box-shadow: 0 4px 16px var(--color-shadow-menu); 138 padding: var(--spacing-sm); 139 width: 200px; 140 opacity: 0; 141 visibility: hidden; 142 transform: translateX(-8px); 143 transition: opacity var(--transition-fast), transform var(--transition-fast), visibility var(--transition-fast); 144 pointer-events: none; 145} 146 147.sidebar-preview.visible { 148 opacity: 1; 149 visibility: visible; 150 transform: translateX(0); 151} 152 153.sidebar-preview-title { 154 font-size: var(--font-size-sm); 155 font-weight: var(--font-weight-bold); 156 margin-bottom: var(--spacing-xs); 157 white-space: nowrap; 158 overflow: hidden; 159 text-overflow: ellipsis; 160} 161 162.sidebar-preview-screenshot { 163 width: 100%; 164 height: auto; 165 border-radius: var(--radius-sm); 166 display: block; 167} 168 169lucide-icon { 170 font-size: var(--size-icon-sm); 171 cursor: pointer; 172 font-weight: var(--font-weight-bold); 173} 174 175#root { 176 flex: 1; 177 display: flex; 178 overflow-x: auto; 179 overflow-y: hidden; 180 scroll-behavior: smooth; 181 scroll-snap-type: x mandatory; 182 position: relative; /* For overview overlay positioning */ 183} 184 185#footer { 186 display: none; /* Hidden by default, shown when keyboard is active */ 187 height: var(--keyboard-height); 188 padding: 0; 189 background: var(--bg-footer); 190} 191 192#footer.visible { 193 display: block; 194} 195 196#keyboard-frame { 197 width: 100%; 198 height: 100%; 199 border: none; 200} 201 202/* Each panel is a full-viewport-width container that holds a split tree */ 203.panel { 204 position: relative; /* For absolutely positioned resize handles */ 205 display: grid; 206 gap: var(--spacing-sm); 207 width: calc(100vw - var(--sidebar-width)); 208 height: 100%; 209 scroll-snap-align: start; 210 padding: var(--spacing-sm); 211 /* Grid template is set dynamically by LayoutManager */ 212} 213 214/* Disable pointer events on webviews during resize */ 215body.resizing web-view { 216 pointer-events: none; 217} 218 219/* Resize handles between split views */ 220.resize-handle { 221 z-index: var(--z-local-ui); 222 background: transparent; 223 transition: background var(--transition-fast); 224} 225 226.resize-handle:hover { 227 background: var(--color-resize-handle-hover); 228} 229 230.resize-handle-horizontal { 231 cursor: col-resize; 232} 233 234.resize-handle-vertical { 235 cursor: row-resize; 236} 237 238#notifications-icon-container { 239 position: relative; 240 display: flex; 241 align-items: center; 242 justify-content: center; 243 cursor: pointer; 244 padding: var(--spacing-xs) 0; 245} 246 247#notifications-icon { 248 opacity: var(--opacity-muted); 249 transition: opacity var(--transition-fast); 250} 251 252#notifications-icon-container:hover #notifications-icon { 253 opacity: 1; 254} 255 256#notifications-badge { 257 position: absolute; 258 top: 0; 259 right: -0.1em; 260 min-width: 1em; 261 height: 1em; 262 border-radius: 0.5em; 263 background: var(--color-danger); 264 color: var(--color-text-on-header); 265 font-size: var(--font-size-xs); 266 font-weight: var(--font-weight-bold); 267 display: flex; 268 align-items: center; 269 justify-content: center; 270 padding: 0 var(--spacing-xs); 271} 272 273#notifications-badge.hidden { 274 display: none; 275}