@c8y/style
Version:
Styles for Cumulocity IoT applications
190 lines (178 loc) • 6.19 kB
text/less
// Base grid + column span utilities
.responsive-grid-table {
display: grid;
grid-template-columns: repeat(12, 1fr);
background: inherit;
&-wrapper--striped{
.responsive-grid-table:nth-child(even) {
background: @component-background-odd;
}
}
&__header{
box-shadow: inset 0 -1px 0 var(--c8y-component-border-color, var(--c8y-root-component-border-color));
> [class^="col-"],
> [class*=" col-"] {
padding: calc(@size-base + @size-10) @component-padding;
color: var(--c8y-component-form-label-color, var(--c8y-form-label-color));
vertical-align: bottom;
text-transform: uppercase;
font-size: var(--c8y-font-size-small);
font-weight: bold;
line-height: calc(var(--c8y-unit-base) * 2.5);
}
.inner-scroll &{
position: sticky;
top: 0;
z-index: 1;
background: var(--c8y-page-sticky-header-background-default);
}
}
&__body{
> [class^="col-"],
> [class*=" col-"] {
display: flex;
align-items: center;
padding-top: calc(@size-base + @size-10);
padding-bottom: calc(@size-base + @size-10);
&.align-right {
justify-content: flex-end;
text-align: right;
}
}
}
&--separator{
box-shadow: inset 0 -1px 0 var(--c8y-component-border-color, var(--c8y-root-component-border-color));
&:last-child {
box-shadow: none;
}
}
// Padding modifiers — -x (horizontal), -y (vertical), shorthand (both)
&--padded-x {
&.responsive-grid-table__header > [class^="col-"],
&.responsive-grid-table__header > [class*=" col-"],
&.responsive-grid-table__body > [class^="col-"],
&.responsive-grid-table__body > [class*=" col-"] {
padding-left: @component-padding;
padding-right: @component-padding;
}
}
&--padded-y {
&.responsive-grid-table__header > [class^="col-"],
&.responsive-grid-table__header > [class*=" col-"],
&.responsive-grid-table__body > [class^="col-"],
&.responsive-grid-table__body > [class*=" col-"] {
padding-top: @component-padding;
padding-bottom: @component-padding;
}
}
&--padded {
&.responsive-grid-table__header > [class^="col-"],
&.responsive-grid-table__header > [class*=" col-"],
&.responsive-grid-table__body > [class^="col-"],
&.responsive-grid-table__body > [class*=" col-"] {
padding-left: @component-padding;
padding-right: @component-padding;
padding-top: @component-padding;
padding-bottom: @component-padding;
}
}
// Condensed modifiers — -x (horizontal), -y (vertical + font-size), shorthand (both)
&--condensed-x {
&.responsive-grid-table__header > [class^="col-"],
&.responsive-grid-table__header > [class*=" col-"],
&.responsive-grid-table__body > [class^="col-"],
&.responsive-grid-table__body > [class*=" col-"] {
padding-left: var(--c8y-table-cell-padding-condensed);
padding-right: var(--c8y-table-cell-padding-condensed);
}
}
&--condensed-y {
&.responsive-grid-table__header > [class^="col-"],
&.responsive-grid-table__header > [class*=" col-"] {
padding-top: var(--c8y-table-cell-padding-condensed);
padding-bottom: var(--c8y-table-cell-padding-condensed);
font-size: calc(var(--c8y-unit-base) * 1.25);
}
&.responsive-grid-table__body > [class^="col-"],
&.responsive-grid-table__body > [class*=" col-"] {
padding-top: calc(var(--c8y-table-cell-padding-condensed) - 1px);
padding-bottom: calc(var(--c8y-table-cell-padding-condensed) - 1px);
font-size: var(--c8y-font-size-small);
}
}
&--condensed {
&.responsive-grid-table__header > [class^="col-"],
&.responsive-grid-table__header > [class*=" col-"] {
padding-top: var(--c8y-table-cell-padding-condensed);
padding-bottom: var(--c8y-table-cell-padding-condensed);
padding-left: var(--c8y-table-cell-padding-condensed);
padding-right: var(--c8y-table-cell-padding-condensed);
font-size: calc(var(--c8y-unit-base) * 1.25);
}
&.responsive-grid-table__body > [class^="col-"],
&.responsive-grid-table__body > [class*=" col-"] {
padding-top: calc(var(--c8y-table-cell-padding-condensed) - 1px);
padding-bottom: calc(var(--c8y-table-cell-padding-condensed) - 1px);
padding-left: var(--c8y-table-cell-padding-condensed);
padding-right: var(--c8y-table-cell-padding-condensed);
font-size: var(--c8y-font-size-small);
}
}
.col-actions{
display: flex;
align-items: center;
justify-content: flex-end;
}
}
// Replaces SCSS: @for $i from 1 through 12
.generate-col-spans(@i) when (@i > 0) {
.col-@{i} {
grid-column: span @i;
}
.generate-col-spans((@i - 1));
}
.generate-col-spans(12);
// Mixin to create a wrapper + container query pair
// @name -> suffix for class/container name and width
.responsive-grid-table-wrapper(@name) {
@cq-name: ~"responsive-grid-table-wrapper--@{name}";
.responsive-grid-table-wrapper--@{name} {
container-type: inline-size;
container-name: @cq-name;
width: 100%;
// When a header is present, inline labels are redundant — hide them
&:has(.responsive-grid-table__header) .text-label-small {
display: none;
}
}
@container @cq-name (max-width: unit(@name, px)) {
.responsive-grid-table {
grid-template-columns: 1fr; // stack
&__header {
display: none;
}
.col-actions {
justify-content: flex-start;
}
}
// Header is hidden when stacked — show inline labels so values stay identifiable
.text-label-small {
display: block ;
}
// hover-only element that becomes visible when stacked
.showOnHover {
opacity: 1 ;
}
// Any class that contains "col-" becomes full-width when stacked
.responsive-grid-table > [class^="col-"],
.responsive-grid-table > [class*=" col-"] {
grid-column: span 1;
}
}
}
// Replaces SCSS: @for $w from 600 through 200 (step -50)
.generate-wrappers(@w) when (@w >= 200) {
.responsive-grid-table-wrapper(@w);
.generate-wrappers((@w - 50));
}
.generate-wrappers(600);