.icon[data-app-state="loading"]:after { content: ""; background: no-repeat top center url('images/app_install_spinner.png'); background-size: contain; height: 8.4rem; position: absolute; top: 0; left: 0; width: 100%; /** Keyframe must be defined outside of the web component. See bug 1018269 */ animation: rotate 2.25s linear infinite; } .icon[data-app-state="loading"] { /** We must align this value with the value of [data-app-state]:after height the background size here is overridden at the element level elsewhere which causes the spinner to be aligned too low. */ background-size: 8.4rem !important; background-image: url('images/app_installing.png') !important; } .icon[data-app-state="unrecoverable"] { background-image: url('images/app_install_unrecoverable.png') !important; } .icon[data-app-state="error"] { background-image: url('images/app_install_failed.png') !important; } .icon[data-app-state="paused"] { background-image: url('images/app_install_canceled.png') !important; } .icon { position: absolute; transform-origin: 0 0; display: inline-block; text-align: center; background: no-repeat top center; z-index: 3; outline: 0; } .icon.launching { opacity: .65; } /* XXX: Override the .remove element */ .edit-mode .collection.hovered .remove { background: url(images/add.png) no-repeat; background-size: 2rem; } .icon p { pointer-events: none; height: 3.2rem; width: 100%; margin: 0; padding: 0; } .icon .title { display: inline-block; margin-top: 0.1rem; /* We need this rule in order not to hide the drop shadow */ padding: 0 0.2rem 1rem; text-shadow: 0.1rem 0.1rem 0.3rem rgba(0, 0, 0, 0.3), 0.2rem 0.4rem 1rem rgba(0, 0, 0, 0.4); font-size: 1.4rem; color: #fff; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; width: calc(100% - 0.4rem); box-sizing: border-box; vertical-align: top; transition: opacity var(--transition-duration); } /* We allow more space for text in the search app by hooking into the text-rows attribute on gaia-grid. */ [text-rows="3"] .icon .title { height: 5.8rem; } [cols="4"] .icon .title { /* Font size is the same independent on grid configuration */ font-size: calc(1.2rem * 1.333); margin-top: 0.5rem; line-height: 1.94rem; } .edit-mode .icon.collapsed { pointer-events: none; } .icon.collapsed .title { opacity: 0; } .icon.hidden { pointer-events: none; opacity: 0; } .divider { position: absolute; width: 100%; padding-top: 2.3rem; border-left: 0.6rem solid transparent; border-right: 0.6rem solid transparent; box-sizing: border-box; z-index: 2; } [cols="4"] .divider { padding-top: 1.6rem; } .divider span.spacer { position: absolute; bottom: 0; display: block; background: linear-gradient(to bottom, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0.5)); margin: 0 25%; width: 50%; height: 0.2rem; transition: opacity var(--transition-duration); } .dragging .icon.active:not(.hidden) { z-index: 6; opacity: 0.65; } .dragging .divider:not(.group), .icon:not(.active), .dropped { transition: transform var(--transition-duration), opacity var(--transition-duration); } .icon.active { will-change: transform; } .edit-mode .icon .remove { display: block; position: absolute; top: 0.1rem; left: 0.5rem; width: 2.6rem; height: 2.6rem; background: url(images/remove.png) no-repeat; background-size: 2rem; /* Ensure that remove is on top of the icon and has some extra padding so it is easy to click. */ z-index: 200; padding: 0.5rem; } .icon .remove, .icon.collapsed .remove, .edit-mode .icon.active .remove { display: none; } .edit-mode .icon.editable .title { background-color: rgba(132, 132, 132, 0.7); border-radius: 2rem; margin-top: .4rem; padding: 0 1rem; width: auto; max-width: 100%; } /* Disable events for placeholders, so we don't trigger touch events in edit mode. We only do this in edit-mode, otherwise we might trigger entering edit mode instead of the context menu. */ .edit-mode .placeholder { pointer-events: none; } #confirm-message { z-index: 100; } .dragging .group.active { z-index: 5; } .divider.group { border: none; padding: 0; } .group > span { display: block; position: absolute; width: 100%; transition: background-color var(--transition-duration), opacity var(--transition-duration); } .group:not(.active):not(.newly-created) > span { transition: background-color var(--transition-duration), opacity var(--transition-duration), transform var(--transition-duration); } .group.active > span { will-change: transform; } .group .header { height: 4rem; z-index: 4; } .group .header span, .group .header button { position: absolute; height: 4rem; top: 0; background-position: center top; background-repeat: no-repeat; background-size: 100% 2rem; transition: transform 0.25s, opacity 0.25s; } .group .header .gripper { left: calc(50% - 4.2rem); width: 8.4rem; background-image: url('images/move_gripper.png'); opacity: 0; transform: translate(0, -100%); pointer-events: none; } .edit-mode .group:not(.collapsed) .header .gripper { opacity: 1; transform: translate(0, 0); pointer-events: auto; } .group .header .toggle { width: 5.34rem; right: 0; border: none; margin: 0; padding: 0; background-color: transparent; background-image: url('images/collapse_arrow.png'); transform-origin: 50% 1.6rem; pointer-events: auto; } .group .header .toggle.toggling { opacity: 0.5; transition: transform 0.25s; } .group.collapsed .header .toggle { transform: translateY(2rem) rotateZ(180deg); } .group.active .header .toggle { opacity: 0.5; } .group .background { background-color: rgba(255, 255, 255, 0.15); opacity: 0; pointer-events: none; height: 0.1rem; transform-origin: 0 0; } .group.odd:not(.newly-created) .background, .edit-mode .group:not(.newly-created) .background { opacity: 1; } .group.active .background { background-color: rgba(51, 51, 51, 0.9); } .group.hovering .background, .group.drop-target .background { background-color: rgba(27, 185, 225, 0.5); } .group .shadow { background-color: rgba(255, 255, 255, 0.15); opacity: 0; pointer-events: none; } .edit-mode .group.active .shadow { background-color: transparent; box-shadow: 0 0.9rem 1.2rem rgba(0, 0, 0, 0.63); opacity: 1; } .group .separator { margin: 0; height: 0.8rem; pointer-events: none; } .group .separator > span { display: block; width: 100%; height: 100%; transition: transform 0.25s, opacity 0.25s; opacity: 0; } .group.odd .separator { opacity: 1; } .group.odd .separator > span { background-color: rgba(255, 255, 255, 0.15); opacity: 1; } .edit-mode .group .separator, .edit-mode .group .separator > span { opacity: 0; } /* For preventing entering edit mode when long-pressing on a placeholder */ .edit-mode .group .background, .edit-mode .group .shadow, .group.collapsed .header, .group.collapsed .background, .group.collapsed .shadow { pointer-events: none; } .edit-mode .group.collapsed .background { pointer-events: auto; } .dragging .group:not(.active) .separator { opacity: 1; } .dragging .group:not(.active):not(.invalid-drop) .separator > span { background-color: #0095dd; transform: scaleY(0.325); opacity: 0.4; } .dragging .group.hovered:not(.active) .separator > span { transform: scaleY(1); opacity: 1; } /* A hint element for dragging items to the top of the group */ .edit-mode::after { content: ' '; display: block; width: 100%; height: 0.8rem; z-index: 2; opacity: 0; background-color: #0095dd; position: relative; top: -0.8rem; transition: opacity 0.25s; } .edit-mode.hover-over-top::after { opacity: 1; } /* Shift container downwards when hovering over the top to reveal the group * creation hint. */ .edit-mode { transition: transform 0.25s; } .edit-mode.hover-over-top { transform: translateY(0.8rem); } /* RTL View */ :-moz-dir(rtl) .group .header .toggle { left: 0; right: unset; }