// Columns -- a simple multi-column split for page content. // // ... // // Columns and Grid overlap deliberately: Columns is the coarse two or three // way split of a page, and its gaps are wider for that reason. Grid is the one // to reach for when the items are cards and the count matters. // // NOTE: the style block uses /* */ comments only -- // is not a CSS comment // and silently swallows the rule that follows it. component Columns { props { size: string = "default" color: string = "primary" columns: number = 2 gap: string = "md" maxWidth: string = "xl" class: string = "" } functions { shared function columnCount() { var value = Number(columns) if (!value || value < 1) { return 1 } return Math.min(4, value) } } view {
} style { .wire-columns { --columns-gap: 1.5rem; display: grid; width: 100%; min-width: 0; gap: var(--columns-gap); grid-template-columns: 1fr; align-items: start; } .wire-columns[data-max-width="md"] { max-width: 48rem; } .wire-columns[data-max-width="lg"] { max-width: 64rem; } .wire-columns[data-max-width="xl"] { max-width: 80rem; } .wire-columns[data-max-width="2xl"] { max-width: 96rem; } .wire-columns[data-max-width="full"] { max-width: none; } .wire-columns[data-gap="sm"] { --columns-gap: 0.75rem; } .wire-columns[data-gap="lg"] { --columns-gap: 2.5rem; } .wire-columns[data-gap="xl"] { --columns-gap: 3.5rem; } /* * Splits at the tablet breakpoint rather than the phone one: a page split * is worth keeping single-column for longer than a card deck is. */ @media (min-width: 768px) { .wire-columns:not([data-columns="1"]) { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (min-width: 1024px) { .wire-columns[data-columns="3"] { grid-template-columns: repeat(3, minmax(0, 1fr)); } .wire-columns[data-columns="4"] { grid-template-columns: repeat(4, minmax(0, 1fr)); } } } }