| --- |
| interface Props { |
| |
| layout?: "2-column" | "3-column" | "4-column" | "auto"; |
| |
| gap?: "small" | "medium" | "large" | string; |
| |
| class?: string; |
| |
| id?: string; |
| } |
|
|
| const { |
| layout = "2-column", |
| gap = "medium", |
| class: className, |
| id, |
| } = Astro.props as Props; |
|
|
| |
| const getFlexProperties = () => { |
| switch (layout) { |
| case "2-column": |
| return { flexBasis: "50%", maxWidth: "50%" }; |
| case "3-column": |
| return { flexBasis: "33.333%", maxWidth: "33.333%" }; |
| case "4-column": |
| return { flexBasis: "25%", maxWidth: "25%" }; |
| case "auto": |
| return { flexBasis: "auto", maxWidth: "none" }; |
| default: |
| |
| return { flexBasis: "auto", maxWidth: "none" }; |
| } |
| }; |
|
|
| const getGapSize = () => { |
| |
| switch (gap) { |
| case "small": |
| return "0.5rem"; |
| case "medium": |
| return "1rem"; |
| case "large": |
| return "1.5rem"; |
| default: |
| |
| return gap; |
| } |
| }; |
|
|
| const flexProps = getFlexProperties(); |
| const gapSize = getGapSize(); |
| --- |
|
|
| <div |
| class={`stack ${className || ""}`} |
| data-layout={layout} |
| data-gap={gap} |
| {id} |
| style={`gap: ${gapSize}`} |
| > |
| <slot /> |
| </div> |
|
|
| <style> |
| .stack { |
| display: grid; |
| gap: 1rem; |
| margin: var(--block-spacing-y) 0; |
| width: 100%; |
| max-width: 100%; |
| box-sizing: border-box; |
| } |
|
|
| |
| .stack[data-layout="2-column"] { |
| grid-template-columns: repeat(2, 1fr); |
| } |
|
|
| .stack[data-layout="3-column"] { |
| grid-template-columns: repeat(3, 1fr); |
| } |
|
|
| .stack[data-layout="4-column"] { |
| grid-template-columns: repeat(4, 1fr); |
| } |
|
|
| .stack[data-layout="auto"] { |
| grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); |
| } |
|
|
| |
| .stack:not([data-layout]) { |
| grid-template-columns: repeat(2, 1fr); |
| } |
|
|
| |
| .stack :global(> *) { |
| min-width: 0 !important; |
| max-width: 100% !important; |
| box-sizing: border-box !important; |
| word-wrap: break-word !important; |
| overflow-wrap: break-word !important; |
| overflow: hidden !important; |
| } |
|
|
| |
| .stack pre { |
| overflow-x: auto; |
| max-width: 100%; |
| width: 100%; |
| word-wrap: break-word; |
| white-space: pre-wrap; |
| box-sizing: border-box; |
| min-width: 0 !important; |
| } |
|
|
| .stack code { |
| word-wrap: break-word; |
| white-space: pre-wrap; |
| max-width: 100%; |
| box-sizing: border-box; |
| min-width: 0 !important; |
| } |
|
|
| |
| .stack pre code { |
| min-width: 0 !important; |
| } |
|
|
| |
| .stack section.content-grid pre code { |
| min-width: 0 !important; |
| } |
|
|
| |
| @media (max-width: 768px) { |
| .stack[data-layout="3-column"], |
| .stack[data-layout="4-column"], |
| .stack[data-layout="2-column"], |
| .stack[data-layout="auto"], |
| .stack:not([data-layout]) { |
| grid-template-columns: 1fr !important; |
| } |
| } |
|
|
| @media (min-width: 769px) and (max-width: 1100px) { |
| .stack[data-layout="3-column"], |
| .stack[data-layout="4-column"], |
| .stack[data-layout="auto"] { |
| grid-template-columns: repeat(2, 1fr) !important; |
| } |
| } |
|
|
| @media (min-width: 1101px) and (max-width: 1400px) { |
| .stack[data-layout="4-column"] { |
| grid-template-columns: repeat(2, 1fr) !important; |
| } |
| } |
| </style> |
|
|