VulpesOS/assets/webapps/system.gaiamobile.org/style/window.css
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

681 lines
16 KiB
CSS

.appWindow[transition-state="closed"]:not(.fadeout):not(.homescreen):not(.attentionWindow):not(.lockScreenInputWindow) {
opacity: 0;
transform: translateX(0);
}
#screen.utility-tray #windows > .appWindow {
pointer-events: none;
}
.appWindow:not(.homescreen):not(.searchWindow):not(.lockScreenInputWindow):not(.globalOverlayWindow) {
background-color: black;
}
.appWindow.popupWindow {
background-color: white;
}
.appWindow.popupWindow.alwaysLowered {
display: none;
}
.appWindow:not(.homescreen):not(.searchWindow).render {
background-image: none !important;
background-color: transparent;
}
/* Utility tray needs to be actionable on the attention screen */
.appWindow.attentionWindow,
.appWindow.attentionWindow .chrome .controls {
pointer-events: none;
}
/* Attention Screen needs to be clickable */
.appWindow.attentionWindow .render,
.appWindow.attentionWindow.toaster-mode {
pointer-events: auto;
}
.appWindow:not(.homescreen):not(.searchWindow):not(.globalOverlayWindow).light {
background-color: #fff;
}
/* mozbrowser iframe layout */
.appWindow iframe {
border: none;
}
.appWindow .throbber.loading {
height: 0.3rem;
background-image: url('../shared/progress.gif');
background-size: auto 0.3rem;
}
.appWindow:not(.homescreen):not(.searchWindow):not(.globalOverlayWindow).render > div.browser-container {
background-color: #fff;
}
.appWindow:not(.homescreen):not(.searchWindow):not(.globalOverlayWindow).light.render > div.browser-container {
background-color: #f2f2f2;
}
.appWindow:not(.homescreen):not(.searchWindow):not(.globalOverlayWindow).render > div.browser-container > iframe {
background-color: #fff;
}
.appWindow.enlarge {
animation: openApp var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.transition-closing.perpendicular {
animation-duration: 0.1s;
}
.appWindow.from-cardview {
animation: openAppFromCardView 300ms forwards cubic-bezier(.35,.9,.6,1);
}
@keyframes openAppFromNewCard {
0% { transform: scale(0.5) translateY(200%); }
20% { transform: scale(0.5) translateY(200%); }
65% { transform: scale(0.5) translateY(0); }
100% { transform: scale(1) translateY(0); }
}
.appWindow.from-new-card {
animation: openAppFromNewCard 1200ms forwards ease-in-out;
}
/* Opacity increases start up time then we don't use it anymore for opening */
@keyframes openApp {
0% { transform: scale(0.2);}
100% { transform: scale(1.0);}
}
.appWindow.zoom-in {
transform: scale(1);
animation: zoom-in var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
@keyframes zoom-in {
0% { transform: scale(1); }
100% { transform: scale(2); }
}
@keyframes openAppFromCardView {
0% { transform: scale(0.5); }
100% { transform: scale(1.0); }
}
/* Invoking app moves out */
html[dir="ltr"] .appWindow.invoking {
animation: invokingApp_ltr var(--transition-duration) forwards linear;
}
html[dir="rtl"] .appWindow.invoking {
animation: invokingApp_rtl var(--transition-duration) forwards linear;
}
@keyframes invokingApp_ltr {
0% { transform: translateX(0) }
100% { transform: translateX(calc(-100% - 20px)); }
}
@keyframes invokingApp_rtl {
0% { transform: translateX(0) }
100% { transform: translateX(calc(100% + 20px)); }
}
/* Invoked app moves in */
html[dir="ltr"] .appWindow.invoked {
animation: invokedApp_ltr var(--transition-duration) forwards linear;
}
html[dir="rtl"] .appWindow.invoked {
animation: invokedApp_rtl var(--transition-duration) forwards linear;
}
@keyframes invokedApp_ltr {
0% { transform: translateX(calc(100% + 20px)); }
100% { transform: translateX(0); }
}
@keyframes invokedApp_rtl {
0% { transform: translateX(calc(-100% - 20px)); }
100% { transform: translateX(0); }
}
.appWindow.fade-in {
animation: fadeInApp var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.fade-out {
animation: fadeOutApp var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
/* Invoking secure app moves out */
@keyframes fadeInApp {
0% {
transform: scale(2.0);
opacity: 0.0;
}
100% {
transform: scale(1.0);
opacity: 1.0;
}
}
/* Invoked secure app moves in */
@keyframes fadeOutApp {
0% {
transform: scale(1.0);
opacity: 1.0;
}
100% {
transform: scale(2);
opacity: 0.0;
}
}
#windows.slow-transition .appWindow.transition-closing,
#windows.slow-transition .appWindow.transition-opening {
animation-duration: 2s;
}
.appWindow.reduce {
animation: closeApp var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.transition-opening.perpendicular {
animation-duration: 0.1s;
opacity: 0;
}
/* The scale transformation used to be 5. In order to benefit from async
* transform the frame width/height needs to be < 4096.
* The size of one side of the frame is equal to
* devicePixelRatio * frame.[width|height] * scale, and as a result we need
* to pick a value that fits well for pixel ratio between 1 and 2.6.
*/
.appWindow.zoom-out {
transform: scale(2);
animation: zoom-out var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
@keyframes zoom-out {
0% { transform: scale(2);}
100% { transform: scale(1);}
}
.appWindow.to-cardview {
animation: closeAppTowardsCardView 300ms forwards cubic-bezier(.35,.9,.6,1);
}
@keyframes closeApp {
0% { transform: scale(1.0); opacity: 1;}
100% { transform: scale(0.01); opacity: 0;}
}
@keyframes closeAppTowardsCardView {
0% { transform: scale(1.0); }
100% { transform: scale(0.5); }
}
.appWindow.home-from-cardview {
animation: home-from-cardview 0.3s forwards cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.home-to-cardview {
animation: home-to-cardview 0.3s forwards cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
@keyframes home-from-cardview {
0% { opacity: 0; }
100% { opacity: 1; }
}
@keyframes home-to-cardview {
0% { opacity: 1; }
100% { opacity: 0; }
}
.appWindow.back {
transition: transform 0.25s cubic-bezier(0.7, 0.0, 1.0, 1.0), visibility 0.25s cubic-bezier(0.7, 0.0, 1.0, 1.0);
transform: scale(0.86);
}
.appWindow.restored {
transform: translateX(0);
transition: transform 0.25s cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow iframe {
visibility: visible;
}
.appWindow[transition-state="closed"]:not(.toaster-mode) > div.browser-container > iframe {
visibility: hidden;
}
.appWindow > .fade-overlay {
background-color: black;
visibility: hidden;
opacity: 0.8;
}
.appWindow.homescreen.fadeout .fade-overlay.hidden {
visibility: hidden;
}
.appWindow.fadeout .fade-overlay {
visibility: visible;
}
.appWindow.homescreen.fadeout .fade-overlay {
opacity: 1;
}
.appWindow > .touch-blocker {
visibility: hidden;
background: transparent;
pointer-events: all;
}
.appWindow.inactive > .touch-blocker,
.appWindow.overlay > .touch-blocker,
.appWindow.transition-closing > .touch-blocker,
.appWindow.transition-opening > .touch-blocker {
/* The animation takes .3 seconds so users cannot touch the app while the
* closing animation is performing */
visibility: visible;
}
.appWindow > .modal-dialog,
.appWindow > .authentication-dialog,
.authentication-dialog > .authentication-dialog-http {
visibility: hidden;
}
.appWindow.searchWindow {
overflow: visible;
}
.appWindow > .modal-dialog.visible,
.appWindow > .authentication-dialog.visible,
.authentication-dialog > .authentication-dialog-http.visible {
visibility: visible;
}
.appWindow > .modal-dialog > form {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
padding: 0;
margin: 0;
visibility: hidden;
}
.appWindow > .modal-dialog input {
border-radius: 0.2rem;
height: 4rem;
font-size: 2rem;
width: 100%;
color: white;
background: none;
box-sizing: border-box;
margin-bottom: 1.5rem; /* not overlap by menu while keyboard pop */
}
.appWindow > .modal-dialog > form.visible {
visibility: visible;
}
/****************** Screenshot Overlay ******************/
.appWindow .screenshot-overlay {
pointer-events: none;
position: absolute;
top: 0;
width: 100%;
height: 100%;
visibility: hidden;
/* We need this to resize hi-res screenshot */
background-size: cover;
}
.appWindow .screenshot-overlay.visible {
visibility: visible;
}
/* Bug 1071235: Workaround for bug 1076783 */
.browser-container:-moz-full-screen-ancestor > .screenshot-overlay {
visibility: hidden;
}
.appWindow.collapsible .screenshot-overlay {
margin-top: var(--rocketbar-urlbar-height);
}
.appWindow > .identification-overlay {
pointer-events: none;
background: rgba(255, 255, 255, 0.8);
visibility: hidden;
opacity: 0;
transition: opacity 0.2s ease-in, visibility 0.2s;
}
.appWindow.private > .identification-overlay {
background: rgba(57, 46, 84, 0.9);
}
.appWindow.suspended > .identification-overlay,
.appWindow:not(.active):not(.in-task-manager).overlay > .identification-overlay {
transition: none;
visibility: visible;
opacity: 1;
}
#screen.cards-view .appWindow.in-task-manager.overlay.no-screenshot > .identification-overlay {
visibility: visible;
opacity: 1;
transition: opacity 0.2s ease-in, visibility 0.2s;
}
.appWindow.overlay.no-screenshot.from-cardview.overlay > .identification-overlay {
visibility: hidden;
opacity: 0;
transition: opacity 0.2s ease-in, visibility 0.2s;
}
/* we don't want to show the overlay at all during the opening
transition (from the homescreen and from the cardview) */
#screen .appWindow.in-task-manager:not(.no-screenshot).overlay > .identification-overlay,
.appWindow.enlarge.overlay > .identification-overlay,
.appWindow:not(.no-screenshot).from-cardview.overlay > .identification-overlay {
opacity: 0 !important;
transition: none !important;
}
.identification-overlay > div {
position: absolute;
top: calc(50% - 4.65rem);
offset-inline-start: 1.5rem;
width: calc(100% - 3rem);
height: 9.3rem;
}
.identification-overlay > div .icon {
position: absolute;
top: 0;
offset-inline-start: calc(50% - 3rem);
width: 6rem;
height: 6rem;
background: no-repeat center / contain;
}
.identification-overlay > div .title {
display: block;
position: absolute;
top: 7.5rem;
left: 0;
width: 100%;
padding: 0;
color: #4d4d4d;
text-align: center;
font-size: 1.6rem;
font-style: italic;
line-height: 1.8rem;
font-weight: 400;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.private .identification-overlay > div .title {
color: #e7e7e7;
}
/* inline components */
.appWindow > .appWindow {
z-index: 65536;
}
.appWindow > .touch-blocker {
z-index: 1026;
}
.appWindow > .fade-overlay {
z-index: 1025;
}
.appWindow > .identification-overlay {
z-index: 1024;
}
.appWindow > .browser-container .screenshot-overlay {
z-index: 10;
}
.appWindow > .chrome {
z-index: 5;
}
.appWindow > .authentication-dialog {
z-index: 100;
}
.appWindow.slideleft {
animation: slideLeft var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.slideright {
animation: slideRight var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.slide-from-bottom {
animation: slideFromDown var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.slide-to-bottom {
animation: slideToDown var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.slide-from-top {
animation: slideFromUp var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
#windows.slow-transition .appWindow.slide-from-top {
animation: slideFromUp 2s forwards cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.slide-to-top {
animation: slideToUp var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.in-from-left {
animation: inFromLeft var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
.appWindow.out-to-right {
animation: outToRight var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
@keyframes slideLeft {
0% { transform: translateX(100%); }
100% { transform: translateX(0); }
}
.appWindow > .contextmenu {
z-index: 11;
}
@keyframes inFromLeft {
0% {
transform: translateX(-20%);
opacity: 0.25;
}
100% {
transform: translateX(0);
opacity: 1.0;
}
}
@keyframes outToRight {
0% { transform: translateX(0); }
100% { transform: translateX(100%); }
}
.appWindow.slidedown {
animation: slideDown var(--transition-duration) forwards
cubic-bezier(0.7, 0.0, 1.0, 1.0);
}
@keyframes slideFromDown {
0% { transform: translateY(calc(100%)); }
100% { transform: translateY(0); }
}
@keyframes slideToDown {
0% { transform: translateY(0); }
100% { transform: translateY(calc(100%)); }
}
@keyframes inFromLeft {
0% {
transform: translateX(-20%);
opacity: 0.25;
}
100% {
transform: translateX(0);
opacity: 1.0;
}
}
@keyframes outToRight {
0% { transform: translateX(0); }
100% { transform: translateX(100%); }
}
@keyframes slideFromUp {
0% { transform: translateY(calc(-100%)); }
100% { transform: translateY(0); }
}
@keyframes slideToUp {
0% { transform: translateY(0); }
100% { transform: translateY(calc(-100%)); }
}
/*
When a mozbrowser iframe requests fullscreen with SHB enabled,
Gecko will make that element fixed and take up the entire viewport.
However, due to bug 879443 the transform property will make fixed
relative to this ancestor rather than the viewport, so we unset
the transform for this case.
See: https://bugzilla.mozilla.org/show_bug.cgi?id=1212960
*/
#screen:-moz-full-screen-ancestor > #windows > .appWindow:not(.homescreen):not(.lockScreenWindow):not(.attentionWindow):not(.lockScreenInputWindow).active {
transform: unset;
}
/* Edges */
#windows > .appWindow:not(.homescreen):not(.lockScreenWindow):not(.attentionWindow):not(.lockScreenInputWindow) {
/* not in the viewport */
transform: translateY(-100%);
opacity: 1;
}
/* making the appWindows moz-elementable for the cardview */
#screen #windows > .appWindow:not(.homescreen):not(.lockScreenWindow):not(.attentionWindow):not(.lockScreenInputWindow).in-task-manager {
position: fixed;
transform: none;
}
.appWindow.attentionWindow.hidden {
display: none;
}
#screen #windows > .appWindow.will-become-inactive {
opacity: 0;
}
#screen #windows > .appWindow.active:not(.will-become-inactive):not(.back),
#screen #windows > .appWindow.will-become-active,
#screen #windows > .appWindow.inside-edges {
opacity: 1;
transform: translateX(0);
}
#screen #windows > .appWindow.outside-edges-left {
opacity: 1;
transform: translateX(calc(-100% - 2rem));
}
#screen #windows > .appWindow.outside-edges-right {
opacity: 1;
transform: translateX(calc(100% + 2rem));
}
#screen #windows > .appWindow.will-become-active,
#screen #windows > .appWindow.inside-edges,
#screen #windows > .appWindow.outside-edges-left,
#screen #windows > .appWindow.outside-edges-right {
will-change: transform;
}
@media (orientation: landscape) {
#screen.software-button-enabled:not(.fullscreen-layout-app) #windows > .appWindow.outside-edges-right {
/* BiDi note: the software home button should not be mirrored in RTL. */
transform: translateX(calc(100% + var(--software-home-button-height)));
}
}
#windows .appWindow.active iframe {
transition-property: transform;
transition-duration: var(--transition-duration);
}
#screen.locked #windows .appWindow.active iframe {
transition-property: none;
}
.appWindow.attentionWindow[transition-state="closed"] > div.browser-container {
pointer-events: none;
}
/* Hide chrome UI of windows */
.appWindow.attentionWindow > .chrome > .controls > .urlbar > .title {
display: none;
}
/* Hide chrome UI of lockScreenInputWindow since we don't need */
.appWindow.lockScreenInputWindow > .titlebar,
.appWindow.lockScreenInputWindow > .chrome {
display: none;
}
.appWindow.lockScreenInputWindow {
background: none;
pointer-events: none;
}