@import '../../../../variables'; @import '~angular-material-css-vars/public-util'; @import './task.component.mixins'; // TASK BOX STYLES // --------------- // NOTE: needs to come first to be overwritten by :host.isCurrent // NOTE: needs to be very light, because we're on a lighter background for the dark theme :host-context(.isDarkTheme) { color: $dark-theme-text-color-most-intense; } :host { display: block; position: relative; color: $light-theme-text-color; &.isSelected { //z-index: $z-is-selected-host; //position: sticky; //top: 16px; } &.isCurrent { z-index: $z-is-current-host; position: sticky; top: $s; } &:focus { z-index: $z-focus-host; outline: none; } } .inner-wrapper { position: relative; padding: $task-inner-padding-top-bottom 0; margin-bottom: 0; :host.isAdditionalInfoOpen > & { margin-top: $s*2; margin-bottom: $s*2; box-shadow: $whiteframe-shadow-1dp; border-top-width: 1px; } } .box { position: absolute; left: 0; right: 0; bottom: 0; top: 0; transition: $transition-standard; transition-property: transform, box-shadow; border: 1px solid $light-theme-extra-border-color; border-top-width: 0; :host.gu-mirror & { box-shadow: $whiteframe-shadow-8dp !important; } @include lightTheme { background: #fff; } @include darkTheme { border-color: $dark-theme-extra-border-color; } @include isHostFocus('.inner-wrapper') { border-radius: $card-border-radius; @include mq(xs) { // NOTE: somehow ng build messes up, if we don't include it like that border-color: $task-c-focus; border-width: 1px; border-style: dashed !important; } } &.isSelected.isSelected { //border-top-width: 1px; transition-property: all; @include lightTheme() { background: $light-theme-bg-darker; border-color: $light-theme-extra-border-color; } @include darkTheme() { background: #222222; border-color: #222222 !important; } @include mq(xs) { transform-origin: left; right: -34px; left: -8px; border-top-left-radius: $card-border-radius; border-bottom-left-radius: $card-border-radius; } } :host.isCurrent.isCurrent.isCurrent.isCurrent.isCurrent & { border-color: $task-c-current !important; border-width: 2px !important; border-bottom-color: $task-c-current !important; border-top-color: $task-c-current !important; border-left-color: $task-c-current !important; border-right-color: $task-c-current !important; } @include isCurrent { box-shadow: $task-active-shadow; border-radius: 12px !important; bottom: -2px; top: -2px; @include mq(xs) { transform: scale($task-current-task-zoom); } } :host:first-child > .inner-wrapper > & { border-top-left-radius: $card-border-radius; border-top-right-radius: $card-border-radius; } :host:last-child > .inner-wrapper > & { border-bottom-left-radius: $card-border-radius; border-bottom-right-radius: $card-border-radius; } // NOTE: there are also styles in the task list component, because of host not being usable // with the adjacent child selector :host:first-child > .inner-wrapper > &, :host.isAdditionalInfoOpen > .inner-wrapper > & { border-top-width: 1px; } // because the shadow gets to intense otherwise :host.isAdditionalInfoOpen > .inner-wrapper > & { border-bottom-width: 0; } :host-context(.isLightTheme):last-child > .inner-wrapper > & { @include mq(xs, max) { border-bottom-color: $light-theme-extra-border-color; } } :host-context(.isDarkTheme):last-child > .inner-wrapper > & { @include mq(xs, max) { border-bottom-color: rgb(55, 55, 55); } } } .sub-tasks { margin: $s 0 $s $s*3; position: relative; @include smallMainContainer { margin: $s 0 $s $s*3; position: relative; } @include mq(xs) { //margin: $s $s*2 $s $s*3; margin: $s 0 $s $s*5; } } .first-line { position: relative; display: flex; align-items: stretch; flex-wrap: nowrap; user-select: none; justify-content: space-between; min-height: $task-first-line-min-height; touch-action: pan-y; @include mq(xs, max) { flex-wrap: wrap; justify-content: flex-end; } //@include smallMainContainer{ // flex-wrap: wrap; // justify-content: flex-end; //} } .title-and-left-btns-wrapper { display: flex; flex-wrap: nowrap; align-items: center; justify-content: center; min-height: 36px; flex-grow: 1; flex-basis: 70%; @include mq(xs, max) { //margin-bottom: 5px; //flex-shrink: 0; flex-basis: 50%; } @include isDoneForFirstLine { opacity: $task-is-done-dim-opacity; } } // CONTROLS // -------- .all-controls-wrapper { display: flex; flex-flow: row; position: relative; margin-left: $s; margin-right: $s; align-items: stretch; @include verySmallMainContainer { flex-direction: column-reverse; align-items: flex-end; justify-content: center; } } .controls { display: flex; flex-direction: row; align-items: stretch; text-align: right; margin-right: 2px; position: relative; button { margin-top: auto; margin-bottom: auto; } @include mq(xs, max) { white-space: normal; margin-left: 5px; } @include smallMainContainer { white-space: normal; margin-left: 5px; } @include verySmallMainContainer { min-height: 40px; } } .hover-controls { transform-origin: right center; position: absolute; right: 100%; top: 0; bottom: 0; z-index: $z-hover-controls; display: none; @include mq(xs, max) { :host-context(.isTouchDevice) & { display: none !important; } } button { margin-top: auto; margin-bottom: auto; } .first-line:hover & { display: flex; background: #fff; @include darkTheme() { background: $dark-theme-card-bg; } :host-context(.isLightTheme).isSelected & { background: $light-theme-bg-darker; } :host-context(.isDarkTheme).isSelected & { background: #222; } } // extra hitarea &:after { position: absolute; top: -$s*1.5; right: 0; left: -$s*1.5; bottom: -$s*1.5; content: ''; } &:before { content: ''; border-left: 1px solid; width: 1px; height: 90%; position: absolute; left: 0; top: 5%; opacity: 0.5; } } // OTHER UI ELEMENTS // ----------------- // TASK TITLE .task-title { @include taskTitle; :host.isSelected & { font-weight: bold; } } @mixin timeWrapperMinimalStyles() { &:after { content: ''; border-top: 1px solid; opacity: 0.1; position: absolute; left: 0; right: 0; top: 50%; } .time { font-size: 13px; flex-direction: column; } .separator { display: none; } } // TIME .time-wrapper { position: relative; display: flex; flex-direction: row; align-items: center; justify-content: stretch; margin-right: $s; z-index: $z-time-wrapper; &.isEditable { cursor: pointer; &:hover { .time { transition: $transition-standard; opacity: 1 !important; } } } @include noTouchDevice { &.hasNoTimeSpentOrEstimate { display: none; } } .time { font-style: italic; display: flex; flex-direction: column; align-items: center; justify-content: center; opacity: 0.8; font-weight: 300; @include mq(xs) { opacity: 0.5; flex-direction: row; } } .time-val, .separator { display: block; white-space: nowrap; } .separator { padding: 0 $s/2; } @include smallMainContainer { @include timeWrapperMinimalStyles; } @include mq(component, max) { @at-root .time-wrapper { @include timeWrapperMinimalStyles; @include isDoneForFirstLine { opacity: $task-is-done-dim-opacity +0.1; } } } @include verySmallMainContainer { flex-direction: row; &:after { display: none; } .time { flex-direction: row; } .separator { display: block; } } } .additional-info { display: block; // required as sort of a clearfix (fixes padding issue) overflow: hidden; } .drag-over-msg { pointer-events: none; position: absolute; top: 0; right: 0; left: 0; bottom: 0; opacity: 1; justify-content: center; align-items: center; font-weight: bold; display: flex; z-index: $z-drag-over-msg; } .check-done { opacity: 0.5; position: absolute; left: 50%; top: 50%; display: block; z-index: $z-check-done; transform: translate(-50%, -50%); transition: $transition-standard; border-radius: 50%; &:hover { opacity: 1 !important; } mat-icon { $task-size: 40px; font-size: $task-size; height: $task-size; width: $task-size; line-height: $task-size; &.undo { display: none; } } &:hover { mat-icon { animation: $transition-duration-m success-btn-ani linear; } .check { display: none; } .undo { display: block; } } } // SWIPE BLOCKS .block-left, .block-right { position: absolute; top: -1* $task-inner-padding-top-bottom; bottom: -1* $task-inner-padding-top-bottom; width: 33%; min-width: 100px; z-index: $z-swipe-block; transition: $transition-standard; transform: scaleX(0); &.isActive { background-color: $c-accent; } mat-icon { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) scaleX(1); } } .block-left { pointer-events: none; color: #fff; left: 0; transform-origin: left center; box-shadow: $shadow-card-shadow; } .block-right { pointer-events: none; color: #fff; right: 0; transform-origin: right center; box-shadow: $shadow-card-shadow; } progress-bar { z-index: $z-progress-bar; } // BUTTON STYLES AND DRAG HANDLE // ----------------------------- .toggle-sub-tasks-btn, .first-line .ico-btn { $task-button-spacer: 1px; margin: 0 $task-button-spacer; padding: 0; z-index: $z-btn; @extend %standardTaskOpacityChange; &:hover { z-index: $z-btn-hover; } &:focus { outline: none; } } .first-line .menu-trigger { @include mq(xs) { opacity: 0; } } .first-line:hover .menu-trigger { @include standardTaskOpacityChange; } .delete-btn { mat-icon.delete-icon { color: $c-warn !important; } } .drag-handle { min-width: 24px; margin: 0 4px 0 9px; position: relative; z-index: $z-drag-handle; cursor: grab; @extend %standardTaskOpacityChange; // fixes drag and drop on mobile touch-action: none; @include mq(xs) { opacity: 0; .first-line:hover & { opacity: 1; } } &:active { cursor: grabbing; } // hit area &:after { content: ''; position: absolute; top: -$s*0.25; bottom: -$s*0.25; left: -$s*0.25; right: -$s*0.25; @include mq(xs) { top: -$s*2; bottom: -$s*2; left: -$s*2; right: -$s*0.5; } } } .ico-btn { color: inherit; &.mat-accent { color: $c-accent; } } .toggle-sub-tasks-btn, .first-line .ico-btn { $task-button-spacer: 1px; margin: auto $task-button-spacer; padding: 0; z-index: $z-btn; @extend %standardTaskOpacityChange; &:hover { z-index: $z-btn-hover; } &:focus { outline: none; } } .toggle-sub-tasks-btn.toggle-sub-tasks-btn { position: absolute !important; transform: translateY(-50%); left: -24px; top: 50%; z-index: $z-toggle-sub-task-btn !important; min-width: 0; min-height: 0; width: 32px; height: 32px; margin-top: -1px !important; transform-origin: left top; transition-property: all; :host-context(.isNoTouchDevice) & { opacity: 0; } :host:hover & { opacity: 1; } mat-icon { transition: $transition-standard; margin-top: -8px; opacity: $task-icon-default-opacity; &.isHideDoneTasks { transform: rotate(-45deg); } } } .attachment-btn, .show-additional-info-btn { mat-icon { transition: transform $transition-standard; backface-visibility: hidden; } &.isActive mat-icon { transform: rotate(45deg); } } .start-task-btn { :host-context(.isHidePlayBtn) & { display: none !important; } } // ANIMATIONS ETC // -------------- @keyframes success-btn-ani { 0% { transform: scale(0.5) rotate(-180deg); } 50% { transform: scale(1) rotate(-90deg); } 100% { transform: scale(1) rotate(0deg); } } .isPreventPointerEventsWhilePanning { * { user-select: none !important; pointer-events: none !important; transition: none !important; } } $min-badge-size: $s*2.25; .mini-badge { line-height: $min-badge-size; width: $min-badge-size; height: $min-badge-size; font-size: 12px; position: absolute; right: 0; bottom: 0; border-radius: 50%; text-align: center; } .play-icon-indicator { position: absolute; top: 50%; transform: translateY(-50%); color: $c-accent; height: 20px; margin-top: 1px; width: 20px; font-size: 20px; line-height: 20px; left: 24px; @include mq(xs) { margin-top: 0; left: 10px; } .first-line:hover & { display: none; } }