.o_tooltip_parent { position: relative!important; // Tooltips are placed in the element with z-index 1070 because this // is the only way to position them above everything else. However, for // scrolling performance, the tooltip is placed in its ideal location (see // Tip._get_ideal_location). When in this location, the tooltip were // sometimes overlapping unwanted elements (e.g. chat windows). // // Changing the opacity of the tooltip parents forces the creation of a // stacking context; the home menu tooltips are thus now considered to be // root-level z-index auto (or the default home menu one) and should so // act like their parent (e.g. the home menu is below the chat windows so // the inner tooltips will be too). The tips will be above all elements of // the home menu as they still have a high z-index, but relative to the // home menu (this is especially useful in the website where most tooltips // are placed in the body and need to be placed above elements with z-index // like the navbar). opacity: 0.999; } .o_tooltip { $o-tip-color: $o-brand-odoo; $o-tip-size: 24px; $o-tip-border-width: 2px; $o-tip-arrow-length: 10px; $o-tip-arrow-width: 20px; $o-tip-arrow-integration: 2px; $o-tip-duration-in: 300ms; $o-tip-size-duration-in: floor($o-tip-duration-in * 3 / 4); $o-tip-size-delay-in: floor($o-tip-duration-in / 4); $o-tip-border-radius-duration-in: floor($o-tip-duration-in / 2); $o-tip-border-radius-delay-in: floor($o-tip-duration-in * 0); $o-tip-bg-color-duration-in: floor($o-tip-duration-in * 1); $o-tip-bg-color-delay-in: floor($o-tip-duration-in * 0); $o-tip-arrow-duration-in: floor($o-tip-duration-in / 2); $o-tip-arrow-delay-in: floor($o-tip-duration-in * 0); $o-tip-white-arrow-duration-in: floor($o-tip-duration-in * 1); $o-tip-white-arrow-delay-in: floor($o-tip-duration-in * 0); $o-tip-duration-out: 200ms; $o-tip-size-duration-out: floor($o-tip-duration-out * 2 / 3); $o-tip-size-delay-out: floor($o-tip-duration-out * 0); $o-tip-border-radius-duration-out: floor($o-tip-duration-out * 2 / 3); $o-tip-border-radius-delay-out: floor($o-tip-duration-out / 3); $o-tip-arrow-duration-out: floor($o-tip-duration-out / 2); $o-tip-arrow-delay-out: floor($o-tip-duration-out / 2); box-sizing: content-box; /*rtl:begin:ignore*/ @include o-position-absolute($top: 50%, $left: 50%); /*rtl:end:ignore*/ opacity: 0; width: $o-tip-size; height: $o-tip-size; border: $o-tip-border-width solid $o-tip-color; border-radius: 50%; padding: 0; // ! Cannot be changed ! Javascript rely on this. z-index: $zindex-tooltip; // See comment on 'o_tooltip_parent' class background-color: $o-tip-color; box-shadow: 0 2px 2px 1px rgba(150, 150, 150, 0.3); transition: width $o-tip-size-duration-out ease $o-tip-size-delay-out, height $o-tip-size-duration-out ease $o-tip-size-delay-out, margin $o-tip-size-duration-out ease $o-tip-size-delay-out, border-radius $o-tip-border-radius-duration-out ease $o-tip-border-radius-delay-out; &.o_animated { animation: move-bottom-top 500ms ease-in 0ms infinite alternate; &.right, &.left { animation-name: move-left-right; } } &::before { content: ""; border: 0 solid rgba(0, 0, 0, 0); transition: all $o-tip-arrow-duration-out ease $o-tip-arrow-delay-out; } &.right::before { @include o-position-absolute($left: -$o-tip-arrow-length+$o-tip-arrow-integration, $top: ($o-tip-size - $o-tip-arrow-width) / 2); border-width: $o-tip-arrow-width/2 $o-tip-arrow-length $o-tip-arrow-width/2 0; border-right-color: $o-tip-color; } &.top::before { /*rtl:begin:ignore*/ @include o-position-absolute($bottom: -$o-tip-arrow-length+$o-tip-arrow-integration, $left: ($o-tip-size - $o-tip-arrow-width) / 2); /*rtl:end:ignore*/ border-width: $o-tip-arrow-length $o-tip-arrow-width/2 0 $o-tip-arrow-width/2; border-top-color: $o-tip-color; } &.left::before { @include o-position-absolute($right: -$o-tip-arrow-length+$o-tip-arrow-integration, $top: ($o-tip-size - $o-tip-arrow-width) / 2); border-width: $o-tip-arrow-width/2 0 $o-tip-arrow-width/2 $o-tip-arrow-length; border-left-color: $o-tip-color; } &.bottom::before { /*rtl:begin:ignore*/ @include o-position-absolute($top: -$o-tip-arrow-length+$o-tip-arrow-integration, $left: ($o-tip-size - $o-tip-arrow-width) / 2); /*rtl:end:ignore*/ border-width: 0 $o-tip-arrow-width/2 $o-tip-arrow-length $o-tip-arrow-width/2; border-bottom-color: $o-tip-color; } &::after { content: ""; @include o-position-absolute(-$o-tip-border-width, -$o-tip-border-width, -$o-tip-border-width, -$o-tip-border-width); border-color: $o-tip-color; border-radius: 50%; transition: margin $o-tip-size-duration-out ease $o-tip-size-delay-out, border-radius $o-tip-duration-out linear 0s; background: radial-gradient(lighten($o-tip-color, 7%), $o-tip-color); } > .o_tooltip_overlay { display: none; @include o-position-absolute(0, 0, 0, 0); margin: -$o-tip-border-width; z-index: -1; } > .o_tooltip_content { overflow: hidden; padding: floor($o-tip-size/4) floor($o-tip-size/2); visibility: hidden; transition: visibility 0s ease 0s; color: black; // Force style so that it does not depend on where the tooltip is attached line-height: $line-height-base; font-size: $font-size-base; font-family: $font-family-sans-serif; font-weight: normal; .o_skip_tour { display: inline-block; margin-top: 4px; cursor: pointer; color: gray; &:hover { color: darken(gray, 20%); } } > p:last-child { margin-bottom: 0; } } &.active { border-radius: 0; background-color: white; transition: width $o-tip-size-duration-in ease $o-tip-size-delay-in, height $o-tip-size-duration-in ease $o-tip-size-delay-in, margin $o-tip-size-duration-in ease $o-tip-size-delay-in, border-radius $o-tip-border-radius-duration-in ease $o-tip-border-radius-delay-in, background-color $o-tip-bg-color-duration-in ease $o-tip-bg-color-delay-in; &::before { transition: all $o-tip-arrow-duration-in ease $o-tip-arrow-delay-in; } &::after { border: 0 solid rgba(0, 0, 0, 0); border-radius: 0; } > .o_tooltip_overlay { display: block; } > .o_tooltip_content { direction: ltr; visibility: visible; transition: visibility 0s ease $o-tip-duration-in; } &.right { &::before { left: -$o-tip-arrow-length; border-right-color: $o-tip-color; } &::after { @include o-position-absolute($left: -$o-tip-arrow-length+$o-tip-border-width*2, $top: ($o-tip-size - $o-tip-arrow-width) / 2); border-width: $o-tip-arrow-width/2 $o-tip-arrow-length $o-tip-arrow-width/2 0; border-right-color: white; transition: border-right-color $o-tip-white-arrow-duration-in ease $o-tip-white-arrow-delay-in; } } &.top { &::before { bottom: -$o-tip-arrow-length; border-top-color: $o-tip-color; } &::after { /*rtl:begin:ignore*/ @include o-position-absolute($bottom: -$o-tip-arrow-length+$o-tip-border-width*2, $left: ($o-tip-size - $o-tip-arrow-width) / 2); /*rtl:end:ignore*/ border-width: $o-tip-arrow-length $o-tip-arrow-width/2 0 $o-tip-arrow-width/2; border-top-color: white; transition: border-top-color $o-tip-white-arrow-duration-in ease $o-tip-white-arrow-delay-in; } } &.left { &::before { right: -$o-tip-arrow-length; border-left-color: $o-tip-color; } &::after { @include o-position-absolute($right: -$o-tip-arrow-length+$o-tip-border-width*2, $top: ($o-tip-size - $o-tip-arrow-width) / 2); border-width: $o-tip-arrow-width/2 0 $o-tip-arrow-width/2 $o-tip-arrow-length; border-left-color: white; transition: border-left-color $o-tip-white-arrow-duration-in ease $o-tip-white-arrow-delay-in; } } &.bottom { &::before { top: -$o-tip-arrow-length; border-bottom-color: $o-tip-color; } &::after { /*rtl:begin:ignore*/ @include o-position-absolute($top: -$o-tip-arrow-length+$o-tip-border-width*2, $left: ($o-tip-size - $o-tip-arrow-width) / 2); /*rtl:end:ignore*/ border-width: 0 $o-tip-arrow-width/2 $o-tip-arrow-length $o-tip-arrow-width/2; border-bottom-color: white; transition: border-bottom-color $o-tip-white-arrow-duration-in ease $o-tip-white-arrow-delay-in; } } } &.inverse { &.left, &.right { &::before, &.active::after { top: auto; bottom: ($o-tip-size - $o-tip-arrow-width) / 2; } } &.top, &.bottom { &::before, &.active::after { left: auto#{"/*rtl:ignore*/"}; right: ($o-tip-size - $o-tip-arrow-width) / 2#{"/*rtl:ignore*/"}; } } } } @media print { .o_tooltip { display: none; } }