| @use "config" as *; |
| @use "functions" as *; |
| @use "mixins/border-radius" as *; |
| @use "mixins/reset-text" as *; |
| @use "mixins/tokens" as *; |
| @use "mixins/transition" as *; |
| |
| $tooltip-tokens: () !default; |
| |
| // scss-docs-start tooltip-tokens |
| // stylelint-disable-next-line scss/dollar-variable-default |
| $tooltip-tokens: defaults( |
| ( |
| --tooltip-zindex: var(--z-tooltip), |
| --tooltip-max-width: 200px, |
| --tooltip-padding-x: var(--spacer-3), |
| --tooltip-padding-y: calc(var(--spacer) * .375), |
| --tooltip-font-size: var(--font-size-sm), |
| --tooltip-color: var(--bg-body), |
| --tooltip-bg: var(--fg-body), |
| --tooltip-border-radius: var(--radius-5), |
| --tooltip-opacity: .95, |
| --tooltip-arrow-width: .8rem, |
| --tooltip-arrow-height: .4rem, |
| --tooltip-transition-property: "opacity", |
| --tooltip-transition-duration: .15s, |
| --tooltip-transition-timing: linear, |
| ), |
| $tooltip-tokens |
| ); |
| // scss-docs-end tooltip-tokens |
| |
| @layer components { |
| .tooltip { |
| @include tokens($tooltip-tokens); |
| |
| z-index: var(--tooltip-zindex); |
| display: block; |
| // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element. |
| // So reset our font and text properties to avoid inheriting weird values. |
| @include reset-text(); |
| font-size: var(--tooltip-font-size); |
| // Allow breaking very long words so they don't overflow the tooltip's bounds |
| word-wrap: break-word; |
| opacity: 0; |
| |
| // The JS inserts the tip, so the fade needs a starting state below. Add |
| // .tooltip-instant, or pass `animation: false`, to skip it. |
| &:not(.tooltip-instant) { |
| @include transition-props( |
| var(--tooltip-transition-property), |
| var(--tooltip-transition-duration), |
| var(--tooltip-transition-timing) |
| ); |
| } |
| |
| &.show { opacity: var(--tooltip-opacity); } |
| |
| .tooltip-arrow { |
| display: block; |
| width: var(--tooltip-arrow-width); |
| height: var(--tooltip-arrow-height); |
| |
| &::before { |
| position: absolute; |
| content: ""; |
| border-color: transparent; |
| border-style: solid; |
| } |
| } |
| } |
| |
| @starting-style { |
| .tooltip:not(.tooltip-instant).show { |
| opacity: 0; |
| } |
| } |
| |
| .bs-tooltip-top .tooltip-arrow { |
| bottom: calc(-1 * var(--tooltip-arrow-height)); |
| |
| &::before { |
| top: -1px; |
| border-width: var(--tooltip-arrow-height) calc(var(--tooltip-arrow-width) * .5) 0; |
| border-block-start-color: var(--tooltip-bg); |
| } |
| } |
| |
| .bs-tooltip-end .tooltip-arrow { |
| left: calc(-1 * var(--tooltip-arrow-height)); |
| width: var(--tooltip-arrow-height); |
| height: var(--tooltip-arrow-width); |
| |
| &::before { |
| right: -1px; |
| border-width: calc(var(--tooltip-arrow-width) * .5) var(--tooltip-arrow-height) calc(var(--tooltip-arrow-width) * .5) 0; |
| border-inline-end-color: var(--tooltip-bg); |
| } |
| } |
| |
| .bs-tooltip-bottom .tooltip-arrow { |
| top: calc(-1 * var(--tooltip-arrow-height)); |
| |
| &::before { |
| bottom: -1px; |
| border-width: 0 calc(var(--tooltip-arrow-width) * .5) var(--tooltip-arrow-height); |
| border-block-end-color: var(--tooltip-bg); |
| } |
| } |
| |
| .bs-tooltip-start .tooltip-arrow { |
| right: calc(-1 * var(--tooltip-arrow-height)); |
| width: var(--tooltip-arrow-height); |
| height: var(--tooltip-arrow-width); |
| |
| &::before { |
| left: -1px; |
| border-width: calc(var(--tooltip-arrow-width) * .5) 0 calc(var(--tooltip-arrow-width) * .5) var(--tooltip-arrow-height); |
| border-inline-start-color: var(--tooltip-bg); |
| } |
| } |
| |
| .bs-tooltip-auto { |
| &[data-bs-placement^="top"] { |
| @extend .bs-tooltip-top; |
| } |
| &[data-bs-placement^="right"] { |
| @extend .bs-tooltip-end; |
| } |
| &[data-bs-placement^="bottom"] { |
| @extend .bs-tooltip-bottom; |
| } |
| &[data-bs-placement^="left"] { |
| @extend .bs-tooltip-start; |
| } |
| } |
| |
| // Wrapper for the tooltip content |
| .tooltip-inner { |
| max-width: var(--tooltip-max-width); |
| padding: var(--tooltip-padding-y) var(--tooltip-padding-x); |
| color: var(--tooltip-color); |
| text-align: center; |
| background-color: var(--tooltip-bg); |
| @include border-radius(var(--tooltip-border-radius)); |
| } |
| } |