fleet/frontend/components/TableContainer/DataTable/_styles.scss

450 lines
11 KiB
SCSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

$shadow-width: 40px;
$shadow-transition-width: 10px;
.data-table-block {
position: relative;
display: inline-block;
width: 100%;
.data-table {
&__wrapper {
position: relative;
border: 1px solid $ui-fleet-black-10;
border-radius: 6px;
flex-grow: 1;
width: 100%;
// Shadow
background-image:
/* Shadows */ linear-gradient(
to right,
white,
$transparent
),
linear-gradient(to left, white, $transparent),
/* Shadow covers */
linear-gradient(to right, $ui-shadow, white $shadow-transition-width),
linear-gradient(to left, $ui-shadow, white $shadow-transition-width);
background-position: left center, right center, left center, right center;
background-repeat: no-repeat;
background-color: white;
background-size: $shadow-width 100%, $shadow-width 100%, 50% 100%,
50% 100%;
/* Opera doesn't support this in the shorthand */
background-attachment: local, local, scroll, scroll;
// End shadow
}
// applied to same element as data-table__table while loading
&__no-rows {
min-height: 272px;
}
&__table {
position: relative;
width: 100%;
border-collapse: collapse;
color: $ui-fleet-black-75;
font-size: $x-small;
}
tr {
border-bottom: 1px solid $ui-fleet-black-10;
&:last-child {
border-bottom: 0;
}
// override styles of checkbox data cells
.form-field--checkbox {
display: flex;
justify-content: center;
margin-bottom: 0;
.fleet-checkbox__label {
padding-left: 0;
}
}
// Cleaner when tabbing
a:focus-visible {
outline-offset: 0;
border-radius: $border-radius-medium;
}
}
thead {
background-color: $ui-off-white-opaque; // opaque needed for horizontal scroll shadow
color: $core-fleet-black;
text-align: left;
border-bottom: 1px solid $ui-fleet-black-10;
// resize header icons
img {
width: 16px;
height: 16px;
vertical-align: top;
}
// do not resize button icons inside headers
.button {
img {
width: initial;
height: initial;
vertical-align: initial;
}
}
th {
padding: 0 $table-cell-padding;
white-space: nowrap;
border-left: 1px solid $ui-fleet-black-10;
font-weight: $bold;
font-size: $xx-small;
height: 40px; // Match body row height
&:first-child {
border-top-left-radius: 6px;
border-left: none;
}
&.selection__header,
&.active-selection__checkbox {
width: 16px;
padding: 0 $pad-medium;
}
&:last-child {
border-top-right-radius: 6px;
}
&.actions__header,
&.id__header // Same as actions__header on some pages
{
border-left: none;
width: 99px;
}
&.linkToFilteredHosts__header,
&.view-all-hosts__header // Same as linkToFilteredHosts__header on some pages
{
border-left: none;
width: 120px;
}
.column-header {
display: flex;
flex-direction: column; // Filters under header name
min-width: max-content;
font-weight: $bold;
span {
display: flex;
align-items: center;
gap: 3px;
}
}
.header-cell {
font-weight: $bold;
}
// Sort arrows change color on hover
.sortable-header {
.column-header {
.header-cell {
min-height: 32px; // Leave room for outline on keyboard focus
}
}
&:hover {
.header-cell:not(.ascending) {
.ascending-arrow {
border-bottom-color: $ui-fleet-black-50;
}
}
.header-cell.ascending {
.descending-arrow {
border-top-color: $ui-fleet-black-50;
}
}
}
}
}
&.active-selection {
background: none;
z-index: 1;
th {
border: 0;
}
.fleet-checkbox {
opacity: 0;
}
.active-selection__container {
background-color: $ui-off-white;
width: 100% !important; // Too much specificity currently at page-level styling. Revisit after data table CSS update to remove !important.
.active-selection__inner {
justify-content: flex-start;
}
}
}
}
.active-selection {
position: absolute;
top: 0px;
width: 100%;
border: 0;
border-radius: 6px;
&__checkbox {
width: 16px;
}
&__container {
padding: 0 $table-cell-padding;
}
&__inner {
display: flex;
justify-content: space-between;
align-items: center;
p {
margin: 0 $pad-medium 0 0;
font-weight: $regular;
span {
font-weight: $bold;
}
}
button {
margin-right: $pad-medium;
}
}
&__inner-left,
&__inner-right {
display: flex;
align-items: center;
}
}
tbody {
.component__tooltip-wrapper {
margin: 10px 0; // vertical padding multiline text with tooltip
}
.component__tooltip-wrapper__element {
white-space: initial; // wraps long text with tooltip
}
tr,
.single-row {
transition: background-color 150ms ease-out;
&:hover {
background-color: $ui-off-white-opaque; // opaque needed for horizontal scroll shadow
}
&:focus-visible {
outline: 2px solid $core-focused-outline;
background: $ui-off-white;
border-radius: $border-radius;
}
}
.single-row {
&:hover {
cursor: pointer;
}
&:active {
background-color: $ui-vibrant-blue-10-opaque; // opaque needed for horizontal scroll shadow
}
}
.clickable-row {
&:hover {
cursor: pointer;
}
}
td {
height: 40px;
padding: 0 $table-cell-padding;
max-width: 500px;
word-wrap: break-word;
&.actions__cell,
&.id__cell // Same as actions__cell on some pages
{
display: flex;
justify-content: end; // Aligns actions dropdown to right of table
max-width: 99px;
}
&.linkToFilteredHosts__cell,
&.view-all-hosts__cell // Same as linkToFilteredHosts__cell on some pages
{
text-align: right;
max-width: 140px;
// display: flex causes layout issues on /software/vulnerabilities table
align-items: center;
}
&.selection__cell {
width: 0px;
padding: 0 $pad-medium;
}
.link-cell,
.text-cell {
display: block; // inline-block is not vertically centered
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
margin: 0;
.__react_component_tooltip {
white-space: normal;
}
}
// Caution: LinkCell depends on this to have animation only under text and not icons etc
.link-cell {
display: inline-block; // Underline only words
overflow: visible;
@include link;
&:not(.link-cell--tooltip-truncate) {
@include animated-bottom-border;
}
&.link-cell--tooltip-truncate {
min-width: 100%; // Take up as much of cell as possible
.data-table__tooltip-truncated-text-container {
position: relative;
@include bottom-border;
}
&:hover,
&:focus {
margin-bottom: 0; // Undo margin-bottom of animated bottom border
.data-table__tooltip-truncated-text::after,
.data-table__tooltip-truncated-text::after {
transform: scaleX(1);
}
}
}
&:hover {
.data-table__tooltip-truncated-text-container {
@include animated-bottom-border;
margin-bottom: 0; // Undo margin-bottom of animated bottom border
&:hover {
margin-bottom: 0; // Undo margin-bottom of animated bottom border
}
&::after {
transform: scaleX(
1
); // This gets the animation on the text only when hovering over the whole link-cell
}
}
}
> div {
display: flex;
align-items: center;
gap: $pad-small;
white-space: nowrap;
text-overflow: ellipsis;
}
.truncated-tooltip {
font-weight: $regular;
}
}
// css to properly style link-cell with tooltip
.link-cell-tooltip-wrapper {
overflow: visible; // fixes tooltip overflow cut off by cell
white-space: nowrap; // single line
margin: 0; // padding applied to .link-cell for larger clickable area
.component__tooltip-wrapper {
&__element {
display: block;
white-space: nowrap; // single line
text-overflow: ellipsis; // truncates text
overflow: hidden;
// TODO this naming is now confusing, as this .link-cell is not the outermost layer of
// the cell it's a NameCell
.link-cell {
padding: 0;
}
}
&__tip-text {
cursor: auto;
}
}
}
.w400 {
max-width: 352px; // 400px - 48px padding
min-width: 100%;
text-align: left;
}
.w250 {
max-width: 202px; // 250px - 48px padding
min-width: 100%;
text-align: left;
}
.w150 {
max-width: 102px; // 250px - 48px padding
min-width: 100%;
text-align: left;
}
.italic-cell {
font-style: italic;
.__react_component_tooltip {
font-style: normal;
}
}
.grey-cell {
color: $ui-fleet-black-50;
}
}
.disable-highlight:hover {
background-color: initial;
}
}
}
.loading-overlay {
display: flex;
flex-grow: 1;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: rgba(255, 255, 255, 0.8);
z-index: 1;
}
&__footer {
display: flex;
align-items: center;
height: 50px; // Match pagination height as pagination is optionally rendered
}
&__table-help-text {
font-size: $x-small;
display: flex;
align-items: center;
}
}