Source code
Revision control
Copy as Markdown
Other Tools
@use 'sass:map';
// Shared styling of article images shown as background
@mixin image-as-background {
background-color: var(--newtab-element-secondary-color);
background-position: center;
background-repeat: no-repeat;
background-size: cover;
border-radius: var(--border-radius-small);
box-shadow: $shadow-image-inset;
}
// Note: lineHeight and fontSize should be unitless but can be derived from pixel values
// Bug 1550624 to clean up / remove this mixin to avoid duplicate styles
@mixin limit-visible-lines($line-count, $line-height, $font-size) {
font-size: $font-size;
-webkit-line-clamp: $line-count;
line-height: $line-height;
}
@mixin dark-theme-only {
[lwt-newtab-brighttext] & {
@content;
}
}
@mixin ds-border-top {
@content;
@include dark-theme-only {
border-block-start: 1px solid $grey-60;
}
border-block-start: 1px solid $grey-30;
}
@mixin ds-border-bottom {
@content;
@include dark-theme-only {
border-block-end: 1px solid $grey-60;
}
border-block-end: 1px solid $grey-30;
}
@mixin ds-fade-in($halo-color: $blue-50-30) {
box-shadow: 0 0 0 5px $halo-color;
transition: box-shadow 150ms;
border-radius: var(--border-radius-small);
outline: none;
}
// Some wallpapers are light/dark, and may not match the user set contrast,
// so some text, icons, etc that are displayed over the wallpaper need a contrast fix.
@mixin wallpaper-contrast-fix {
.lightWallpaper & {
color-scheme: light;
}
.darkWallpaper & {
color-scheme: dark;
}
}
// Used to visualize the different breakpoints on an applied element
// See variables.scss for $debug-breakpoints
@mixin debug-breakpoints {
@each $name, $value in $debug-breakpoints {
$color: map.get($debug-breakpoint-colors, $name);
@media (min-width: $value) {
outline: 1px solid #{$color};
}
}
}
// Bug 2020945 - CSS custom properties cannot be used in container queries, so these values
// are stored as SCSS variables to be interpolated into calc() expressions.
$col-width-px: 75px;
$col-gap-px: 0.75rem;
$side-col-width-px: $col-width-px * 2;
// Use this mixin instead of static media query breakpoints. It applies styles
// when the content grid has room for at least $cols columns, making layouts
// adapt to the available column count rather than fixed viewport widths.
// Usage: @include at-content-cols(6) { grid-column: span 6; }
@mixin at-content-cols($cols) {
$min-width: calc(#{$cols} * #{$col-width-px} + #{$cols - 1} * #{$col-gap-px});
@container content-grid (inline-size >= #{$min-width}) {
@content;
}
}
// Like at-content-cols but applies only within an exclusive column-count range.
// $min-cols: lower bound (inclusive); use 0 to match from the smallest size.
// $max-cols: upper bound (exclusive).
// Usage: @include at-content-cols-range(8, 12) { … }
@mixin at-content-cols-range($min-cols, $max-cols) {
$max-width: calc(#{$max-cols} * #{$col-width-px} + #{$max-cols - 1} * #{$col-gap-px});
@if $min-cols == 0 {
@container content-grid (inline-size < #{$max-width}) {
@content;
}
} @else {
$min-width: calc(#{$min-cols} * #{$col-width-px} + #{$min-cols - 1} * #{$col-gap-px});
@container content-grid ((inline-size >= #{$min-width}) and (inline-size < #{$max-width})) {
@content;
}
}
}
// Use for elements outside .content (e.g. in .sidebar-inline-start).
// Queries the outer .container when it is wide enough to give the content
// area room for at least $cols columns.
// Usage: @include at-outer-grid-cols(6) { display: inline-block; }
@mixin at-outer-grid-cols($cols) {
$min-width: calc(2 * #{$side-col-width-px} + #{$cols + 1} * #{$col-gap-px} + #{$cols} * #{$col-width-px});
@container outer-grid (inline-size >= #{$min-width}) {
@content;
}
}
// Adds transparency and a hover effect to card background.
@mixin newtab-card-style {
background: var(--newtab-background-card);
transition: opacity 0.2s ease;
&:hover {
background: var(--newtab-background-color-secondary);
}
}