151 lines
3.0 KiB
SCSS
151 lines
3.0 KiB
SCSS
// Copyright 2025 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
@use '../../mixins';
|
|
@use '../../variables';
|
|
@use './FunConstants.scss';
|
|
|
|
@mixin virtual-position($size, $offset) {
|
|
position: absolute;
|
|
top: 0;
|
|
inset-inline-start: 0;
|
|
width: 100%;
|
|
height: $size;
|
|
transform: translateY($offset);
|
|
}
|
|
|
|
.FunGrid__Container {
|
|
contain: strict;
|
|
position: relative;
|
|
width: 100%;
|
|
height: var(--fun-grid-container-total-size);
|
|
}
|
|
|
|
.FunGrid__ScrollerSection {
|
|
contain: strict;
|
|
@include virtual-position(
|
|
var(--fun-grid-scroller-section-size),
|
|
var(--fun-grid-scroller-section-offset)
|
|
);
|
|
}
|
|
|
|
.FunGrid__Header {
|
|
contain: strict;
|
|
@include virtual-position(
|
|
var(--fun-grid-header-size),
|
|
var(--fun-grid-header-offset)
|
|
);
|
|
display: flex;
|
|
align-items: center;
|
|
margin: 0;
|
|
}
|
|
|
|
.FunGrid__HeaderText {
|
|
padding-block: 4px;
|
|
flex: 1;
|
|
@include mixins.font-body-2;
|
|
font-weight: 600;
|
|
color: light-dark(
|
|
variables.$color-black-alpha-50,
|
|
variables.$color-white-alpha-50
|
|
);
|
|
}
|
|
|
|
.FunGrid__HeaderButton {
|
|
@include mixins.button-reset();
|
|
& {
|
|
display: flex;
|
|
width: 24px;
|
|
height: 24px;
|
|
align-items: center;
|
|
justify-content: center;
|
|
border-radius: 9999px;
|
|
}
|
|
|
|
&:hover,
|
|
&:focus {
|
|
background: light-dark(variables.$color-gray-02, variables.$color-gray-78);
|
|
}
|
|
|
|
&:focus {
|
|
outline: none;
|
|
@include mixins.keyboard-mode {
|
|
outline: 2px solid variables.$color-ultramarine;
|
|
outline-offset: -2px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.FunGrid__HeaderIcon {
|
|
width: 16px;
|
|
height: 16px;
|
|
}
|
|
|
|
@mixin icon($svg) {
|
|
@include mixins.color-svg(
|
|
$svg,
|
|
light-dark(variables.$color-black-alpha-50, variables.$color-white-alpha-50)
|
|
);
|
|
}
|
|
|
|
.FunGrid__HeaderIcon--More {
|
|
@include icon('../images/icons/v3/more/more-circle-bold.svg');
|
|
}
|
|
|
|
$popover-margin: 12px;
|
|
|
|
.FunGrid__HeaderPopoverDialog {
|
|
width: FunConstants.$Fun__PanelWidth - ($popover-margin * 2);
|
|
border-radius: 8px;
|
|
box-shadow: 0 7px 18px variables.$color-black-alpha-30;
|
|
background: FunConstants.$Fun__BgColor;
|
|
user-select: none;
|
|
overflow: clip;
|
|
padding: 16px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
gap: 12px;
|
|
|
|
&:focus {
|
|
outline: none;
|
|
@include mixins.keyboard-mode {
|
|
outline: 2px solid variables.$color-ultramarine;
|
|
outline-offset: -2px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.FunGrid__HeaderPopoverHeader {
|
|
@include mixins.font-body-2;
|
|
color: light-dark(variables.$color-gray-90, variables.$color-gray-05);
|
|
}
|
|
|
|
.FunGrid__RowGroup {
|
|
contain: strict;
|
|
@include virtual-position(
|
|
var(--fun-grid-row-group-size),
|
|
var(--fun-grid-row-group-offset)
|
|
);
|
|
display: grid;
|
|
grid-template-columns: repeat(
|
|
var(--fun-grid-container-column-count),
|
|
var(--fun-grid-container-cell-width)
|
|
);
|
|
grid-auto-rows: var(--fun-grid-container-cell-height);
|
|
justify-items: center;
|
|
}
|
|
|
|
.FunGrid__Row {
|
|
// Note: `contain: strict` breaks CSS subgrid.
|
|
display: grid;
|
|
grid-column: 1 / -1;
|
|
grid-row: var(--fun-grid-row-index);
|
|
grid-template-columns: subgrid;
|
|
}
|
|
|
|
.FunGrid__Cell {
|
|
contain: strict;
|
|
content-visibility: auto;
|
|
}
|