summaryrefslogtreecommitdiff
path: root/scss/values/spacing
diff options
context:
space:
mode:
Diffstat (limited to 'scss/values/spacing')
-rw-r--r--scss/values/spacing/_constants.scss58
-rw-r--r--scss/values/spacing/_grid.scss63
-rw-r--r--scss/values/spacing/_index.scss24
-rw-r--r--scss/values/spacing/_spacing.scss32
4 files changed, 177 insertions, 0 deletions
diff --git a/scss/values/spacing/_constants.scss b/scss/values/spacing/_constants.scss
new file mode 100644
index 0000000..9a990b8
--- /dev/null
+++ b/scss/values/spacing/_constants.scss
@@ -0,0 +1,58 @@
+$grid-column-width-er: 32;
+$grid-gutter-width-er: 4;
+
+$grid-padding-er: (
+ 'xxl': 32,
+ 'xl': 26,
+ 'lg': 20,
+ 'md': 16,
+ 'sm': 12,
+ 'xs': 4,
+ 'initial': 1
+);
+
+$grid-column-count: (
+ 'xxl': 12,
+ 'xl': 12,
+ 'lg': 12,
+ 'md': 8,
+ 'sm': 8,
+ 'xs': 4,
+ 'initial': 1
+);
+
+$grid-prose-column-count: (
+ 'xxl': 8,
+ 'xl': 8,
+ 'lg': 8,
+ 'md': 8,
+ 'sm': 8,
+ 'xs': 4,
+ 'initial': 1
+);
+
+$grid-padding-er: (
+ 'xxl': 32,
+ 'xl': 26,
+ 'lg': 20,
+ 'md': 16,
+ 'sm': 12,
+ 'xs': 4,
+ 'initial': 1
+);
+
+$spacing-factor: (
+ 'inline': (lg: 4, md: 2, sm: 1),
+ 'block': (lg: 16, md: 10, sm: 5)
+);
+
+$grid-min-total-width-absolute: (
+ 'xxl': 100rem,
+ 'xl': 80rem,
+ 'lg': 64rem,
+ 'md': 48rem,
+ 'sm': 30rem,
+ 'xs': 100vw,
+ 'initial': 100vw
+);
+
diff --git a/scss/values/spacing/_grid.scss b/scss/values/spacing/_grid.scss
new file mode 100644
index 0000000..50d11c9
--- /dev/null
+++ b/scss/values/spacing/_grid.scss
@@ -0,0 +1,63 @@
+@use 'sass:list';
+@use 'sass:map';
+
+@use 'constants';
+
+@function padding($breakpoint: initial) {
+ @return er-to-absolute(map.get(constants.$grid-padding-er, $breakpoint), $breakpoint);
+}
+
+@function column-width($breakpoint: initial) {
+ @return er-to-absolute(constants.$grid-column-width-er, $breakpoint);
+}
+
+@function gutter-width($breakpoint: initial) {
+ @return er-to-absolute(constants.$grid-gutter-width-er, $breakpoint);
+}
+
+@function column-count($breakpoint: initial) {
+ @return map.get(constants.$grid-column-count, $breakpoint);
+}
+
+@function total-width-er($breakpoint) {
+ $padding-width: calc(2 * map.get(constants.$grid-padding-er, $breakpoint));
+ $column-count: map.get(constants.$grid-column-count, $breakpoint);
+ $columns-width: calc($column-count * constants.$grid-column-width-er);
+ $gutters-width: calc(($column-count - 1) * constants.$grid-gutter-width-er);
+ @return $padding-width + $columns-width + $gutters-width;
+}
+
+@function total-width-absolute($breakpoint: initial) {
+ /**
+ * In theory, the grid total width should be clamped between the min at this
+ * breakpoint and the min at the next breakpoint minus grid padding. In
+ * practice, the only time this makes a difference is at xs, so at every
+ * other breakpoint, we'll just return the min at the current breakpoint.
+ */
+
+ @if $breakpoint == xs {
+ $min-width-xs: map.get(constants.$grid-min-total-width-absolute, xs);
+ $min-width-sm: map.get(constants.$grid-min-total-width-absolute, sm);
+ $padding-sm: calc(2 * padding(sm));
+ @return min($min-width-xs, calc($min-width-sm - $padding-sm));
+ }
+
+ @return map.get(constants.$grid-min-total-width-absolute, $breakpoint);
+}
+
+/**
+ * Converts er units to absolute units.
+ *
+ * This doesn't really belong here, but I think it has to, because it depends
+ * on grid-total-width-absolute which depends on grid-padding which depends on
+ * this. It's fine here, it's just a recursion. But if it lived in a separate
+ * module you'd end up with a circular dependency.
+ */
+@function er-to-absolute($length-er, $breakpoint: initial) {
+ $absolute-per-er: calc(
+ total-width-absolute($breakpoint)
+ / total-width-er($breakpoint)
+ );
+ @return calc($length-er * $absolute-per-er);
+}
+
diff --git a/scss/values/spacing/_index.scss b/scss/values/spacing/_index.scss
new file mode 100644
index 0000000..8f8a454
--- /dev/null
+++ b/scss/values/spacing/_index.scss
@@ -0,0 +1,24 @@
+/**
+ * 'er' (from 'eighth-rem') is a conceptual unit of length. It is determined
+ * by the total width of the grid, the relative eighth rem length of the grid
+ * padding, and the number of columns in the grid. This means you can just
+ * specify those values for each breakpoint, and the rest of the nitty-gritty
+ * griddy details happens by SCSS magic.
+ */
+
+/**
+ * Breakpoints can be:
+ * - initial
+ * - xs
+ * - sm
+ * - md
+ * - lg
+ * - xl
+ * - xxl
+ */
+
+@forward 'constants' show $grid-column-count, $grid-prose-column-count;
+@forward 'grid' as grid-* hide er-to-absolute;
+@forward 'grid' show er-to-absolute;
+@forward 'spacing';
+
diff --git a/scss/values/spacing/_spacing.scss b/scss/values/spacing/_spacing.scss
new file mode 100644
index 0000000..4fd94e8
--- /dev/null
+++ b/scss/values/spacing/_spacing.scss
@@ -0,0 +1,32 @@
+@use 'sass:list';
+@use 'sass:map';
+
+@use 'constants';
+@use 'grid';
+
+/**
+ * - size: sm, md, lg
+ * - direction: inline, block
+ */
+@function spacing($direction, $size, $breakpoint: initial) {
+ $factor: map.get(
+ map.get(constants.$spacing-factor, $direction),
+ $size
+ );
+
+ @if list.index([xxl xl lg md sm], ($breakpoint)) {
+ @return grid.er-to-absolute($factor, $breakpoint);
+ }
+ @else if $breakpoint == xs {
+ @return clamp(
+ spacing($direction, $size, initial),
+ grid.er-to-absolute($factor, xs),
+ spacing($direction, $size, sm)
+ );
+ }
+ @else if $breakpoint == initial {
+ @return calc($factor * 0.0625rem);
+ }
+ @error "Invalid breakpoint: #{$breakpoint}";
+}
+