| @use "config" as *; |
| @use "functions" as *; |
| @use "mixins/border-radius" as *; |
| @use "mixins/tokens" as *; |
| @use "mixins/transition" as *; |
| |
| $toast-tokens: () !default; |
| |
| // scss-docs-start toast-tokens |
| // stylelint-disable custom-property-no-missing-var-function |
| // stylelint-disable-next-line scss/dollar-variable-default |
| $toast-tokens: defaults( |
| ( |
| --toast-zindex: var(--z-toast), |
| --toast-padding-x: 1rem, |
| --toast-padding-y: .75rem, |
| --toast-spacing: #{$container-padding-x}, |
| --toast-max-width: 350px, |
| --toast-font-size: var(--font-size-sm), |
| --toast-color: null, |
| --toast-bg: var(--bg-body), |
| --toast-border-width: var(--border-width), |
| --toast-border-color: var(--border-color-translucent), |
| --toast-border-radius: null, |
| --toast-box-shadow: var(--box-shadow), |
| --toast-header-color: var(--fg-3), |
| --toast-header-bg: var(--bg-1), |
| --toast-header-border-color: var(--border-color-translucent), |
| --toast-transition-property: "opacity, display", |
| --toast-transition-duration: .15s, |
| --toast-transition-timing: linear, |
| ), |
| $toast-tokens |
| ); |
| // stylelint-enable custom-property-no-missing-var-function |
| // scss-docs-end toast-tokens |
| |
| @layer components { |
| .toast { |
| @include tokens($toast-tokens); |
| |
| display: none; |
| flex-direction: column; |
| width: var(--toast-max-width); |
| max-width: 100%; |
| overflow: hidden; |
| font-size: var(--toast-font-size); |
| color: var(--toast-color, var(--fg-body)); |
| pointer-events: auto; |
| background-color: var(--toast-bg); |
| background-clip: padding-box; |
| border: var(--toast-border-width) solid var(--theme-border, var(--toast-border-color)); |
| box-shadow: var(--toast-box-shadow); |
| @include border-radius(var(--toast-border-radius, var(--radius-7))); |
| |
| // scss-docs-start toast-transition |
| // Animated variant (default). `display` transitions discretely so the toast |
| // stays laid out until the fade-out finishes. Add .toast-instant to skip it. |
| &:not(.toast-instant) { |
| opacity: 0; |
| @include transition-props( |
| var(--toast-transition-property), |
| var(--toast-transition-duration), |
| var(--toast-transition-timing), |
| allow-discrete |
| ); |
| } |
| |
| &.show { |
| display: flex; |
| opacity: 1; |
| } |
| // scss-docs-end toast-transition |
| } |
| |
| // The toast is not rendered before .show lands, so the fade-in needs an |
| // explicit starting state — the base opacity above cannot serve as one. |
| @starting-style { |
| .toast:not(.toast-instant).show { |
| opacity: 0; |
| } |
| } |
| |
| .toast-container { |
| --toast-zindex: var(--z-toast); |
| |
| position: absolute; |
| z-index: var(--toast-zindex); |
| width: max-content; |
| max-width: 100%; |
| pointer-events: none; |
| |
| > :not(:last-child) { |
| margin-bottom: var(--toast-spacing); |
| } |
| } |
| |
| .toast-header { |
| display: flex; |
| align-items: center; |
| padding: var(--toast-padding-y) var(--toast-padding-x); |
| color: var(--theme-fg-emphasis, var(--toast-header-color)); |
| background-color: var(--theme-bg-subtle, var(--toast-header-bg)); |
| // background-clip: padding-box; |
| border-block-end: var(--toast-border-width, var(--border-width)) solid var(--theme-border, var(--toast-header-border-color, var(--border-color-translucent))); |
| |
| .btn-close { |
| margin-inline-start: calc(.5 * var(--toast-padding-x)); |
| margin-inline-end: calc(-.25 * var(--toast-padding-x)); |
| color: inherit; |
| } |
| } |
| |
| .toast-translucent { |
| backdrop-filter: blur(5px) saturate(180%); |
| } |
| |
| .toast-body { |
| padding: var(--toast-padding-x); |
| word-wrap: break-word; |
| } |
| } |