mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-12-06 17:27:57 +00:00
175 lines
5.0 KiB
SCSS
175 lines
5.0 KiB
SCSS
// XRPL Grid
|
|
// -----------------------------------------------------------------------------
|
|
// A namespaced grid layer that reuses Bootstrap's grid mixins while providing
|
|
// XRPL-specific gutters and container padding.
|
|
|
|
$xrpl-grid-gutter: 8px;
|
|
|
|
// Custom mixin that accounts for gap spacing in width calculations
|
|
@mixin xrpl-make-col($size, $columns) {
|
|
flex: 0 0 auto;
|
|
// Calculate width accounting for gap spacing
|
|
// Formula: width per column * span + gap spacing between spanned columns
|
|
// Total gaps in grid: ($columns - 1)
|
|
// Total available width: 100% - (gap * total gaps)
|
|
// Width per column: available width / columns
|
|
// For span of $size: (width per column * size) + (gap * (size - 1))
|
|
width: calc(((100% - (#{$xrpl-grid-gutter} * (#{$columns} - 1))) / #{$columns}) * #{$size} + (#{$xrpl-grid-gutter} * (#{$size} - 1)));
|
|
}
|
|
|
|
@mixin xrpl-grid-generate-cols($columns, $suffix: null) {
|
|
@for $i from 1 through $columns {
|
|
$selector: if($suffix, ".xrpl-grid__col-#{$suffix}-#{$i}", ".xrpl-grid__col-#{$i}");
|
|
|
|
#{$selector} {
|
|
@include xrpl-make-col($i, $columns);
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin xrpl-grid-generate-auto($suffix: null) {
|
|
$selector: if($suffix, ".xrpl-grid__col-#{$suffix}-auto", ".xrpl-grid__col-auto");
|
|
|
|
#{$selector} {
|
|
@include make-col-auto();
|
|
}
|
|
}
|
|
|
|
@mixin xrpl-grid-generate-fill($suffix: null) {
|
|
$selector: if($suffix, ".xrpl-grid__col-#{$suffix}", ".xrpl-grid__col");
|
|
|
|
#{$selector} {
|
|
flex: 1 0 0;
|
|
}
|
|
}
|
|
|
|
@mixin xrpl-grid-generate-offsets($columns, $suffix: null) {
|
|
@for $i from 0 through ($columns - 1) {
|
|
$selector: if($suffix, ".xrpl-grid__offset-#{$suffix}-#{$i}", ".xrpl-grid__offset-#{$i}");
|
|
|
|
#{$selector} {
|
|
@include make-col-offset($i, $columns);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Mixin to generate responsive base column classes (1-12) with built-in breakpoint behavior
|
|
@mixin xrpl-grid-generate-responsive-base-cols() {
|
|
@for $i from 1 through 12 {
|
|
.xrpl-grid__col-#{$i} {
|
|
// Base breakpoint (4 columns): if span > 4, clamp to 4 (which gives 4/4 = 100%)
|
|
@if $i > 4 {
|
|
@include xrpl-make-col(4, 4);
|
|
} @else {
|
|
@include xrpl-make-col($i, 4);
|
|
}
|
|
|
|
// SM breakpoint (8 columns): if span > 8, clamp to 8 (which gives 8/8 = 100%)
|
|
@include media-breakpoint-up(sm) {
|
|
@if $i > 8 {
|
|
@include xrpl-make-col(8, 8);
|
|
} @else {
|
|
@include xrpl-make-col($i, 8);
|
|
}
|
|
}
|
|
|
|
// MD breakpoint (8 columns): if span > 8, clamp to 8 (which gives 8/8 = 100%)
|
|
@include media-breakpoint-up(md) {
|
|
@if $i > 8 {
|
|
@include xrpl-make-col(8, 8);
|
|
} @else {
|
|
@include xrpl-make-col($i, 8);
|
|
}
|
|
}
|
|
|
|
// LG+ breakpoints (12 columns): always calculate based on 12 cols
|
|
@include media-breakpoint-up(lg) {
|
|
@include xrpl-make-col($i, 12);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.xrpl-grid {
|
|
&__container {
|
|
width: 100%;
|
|
margin-right: auto;
|
|
margin-left: auto;
|
|
padding-right: 16px;
|
|
padding-left: 16px;
|
|
box-sizing: border-box;
|
|
|
|
@include media-breakpoint-up(sm) {
|
|
padding-right: 24px;
|
|
padding-left: 24px;
|
|
}
|
|
|
|
@include media-breakpoint-up(lg) {
|
|
padding-right: 32px;
|
|
padding-left: 32px;
|
|
}
|
|
|
|
@media (min-width: 1280px) {
|
|
padding-right: 112px;
|
|
padding-left: 112px;
|
|
max-width: 1440px;
|
|
}
|
|
}
|
|
|
|
&__row {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
// Use gap for spacing - works with our calc-based column widths
|
|
gap: $xrpl-grid-gutter;
|
|
}
|
|
|
|
&__col {
|
|
box-sizing: border-box;
|
|
flex-shrink: 0;
|
|
width: 100%;
|
|
max-width: 100%;
|
|
// No padding/margin for gutters - spacing handled by gap on row
|
|
// Column widths are calculated to account for gap spacing
|
|
// Padding can be added via style prop without affecting grid spacing
|
|
}
|
|
}
|
|
|
|
// Base (0 - 575px) — 4-column grid with responsive behavior built-in
|
|
@include xrpl-grid-generate-fill();
|
|
@include xrpl-grid-generate-responsive-base-cols();
|
|
@include xrpl-grid-generate-auto();
|
|
@include xrpl-grid-generate-offsets(4);
|
|
|
|
// Tablet (≥576px) — maintain 8-column grid across sm/md ranges
|
|
@include media-breakpoint-up(sm) {
|
|
@include xrpl-grid-generate-fill('sm');
|
|
@include xrpl-grid-generate-cols(8, 'sm');
|
|
@include xrpl-grid-generate-auto('sm');
|
|
@include xrpl-grid-generate-offsets(8, 'sm');
|
|
}
|
|
|
|
@include media-breakpoint-up(md) {
|
|
@include xrpl-grid-generate-fill('md');
|
|
@include xrpl-grid-generate-cols(8, 'md');
|
|
@include xrpl-grid-generate-auto('md');
|
|
@include xrpl-grid-generate-offsets(8, 'md');
|
|
}
|
|
|
|
// Large (≥992px) — 12-column grid
|
|
@include media-breakpoint-up(lg) {
|
|
@include xrpl-grid-generate-fill('lg');
|
|
@include xrpl-grid-generate-cols(12, 'lg');
|
|
@include xrpl-grid-generate-auto('lg');
|
|
@include xrpl-grid-generate-offsets(12, 'lg');
|
|
}
|
|
|
|
// XL (≥1280px) — retain 12-column grid with wider margins
|
|
@include media-breakpoint-up(xl) {
|
|
@include xrpl-grid-generate-fill('xl');
|
|
@include xrpl-grid-generate-cols(12, 'xl');
|
|
@include xrpl-grid-generate-auto('xl');
|
|
@include xrpl-grid-generate-offsets(12, 'xl');
|
|
}
|
|
|
|
|