import classNames from "classnames";
import React, { Ref } from "react";
const DEVICE_SIZES = ["large", "small"];
/** colSize shorthand */
type colSizeShorthand = boolean | number | "fitContent" | "fillSpace";
type column =
| colSizeShorthand
| {
/** Draw border on this single column. */
border: "top" | "bottom" | "left" | "right" | "sides" | "ends" | "all";
/** Push columns around with an offset. */
offset: string | number;
/** Specify a content display order different from HTML source order. */
order: string | number;
/** Pad inner content with a default amount. */
paddedContent: "none" | "around" | "sides" | "ends" | "remove";
/** Size of this column; allows for some shorthand. */
size: colSizeShorthand;
};
type ColPropTypes = {
/** Specify an element besides
. */
as?: React.ElementType;
/** Add single border column. */
border?: "top" | "bottom" | "left" | "right" | "sides" | "ends" | "all";
/** Inner contents. */
children: React.ReactNode;
/** Whether or not this is a reading column layout */
isReadingColumn?: boolean;
/**
* The number of columns to span on large devices (≥992px)
*
* @type {("fillSpace"|"fitContent"|number|
* { span: "fillSpace"|"fitContent"|number, offset: number, order: number }
* )}
*/
large?: column;
/**
* Force overflow scrolling
*/
overflow?: "overflow-y--scroll" | "overflow-x--auto" | "overflow-y--auto";
/** Add default amount of padding. */
paddedContent?: "around" | "sides" | "ends" | "none" | "remove";
/** Optional pass through ref. */
ref?: Ref
;
/**
* The number of columns to span on small devices (≥576px)
*
* @type {("fillSpace"|"fitContent"|number|
* { span: "fillSpace"|"fitContent"|number, offset: number, order: number }
* )}
*/
small?: column;
/**
* How to vertically align self
*/
alignSelf?: "start" | "center" | "end";
};
/**
* @deprecated This component has been deprecated 2021-06-04. Use Grid or LayoutGrid instead.
*/
const Col: React.SFC = React.forwardRef(
(
{
as: Component = "div",
border,
children,
overflow,
paddedContent = "none",
isReadingColumn,
alignSelf,
...props
},
ref?: React.Ref
) => {
const prefix = "col";
const spans: string[] = [];
const classes: string[] = [];
if (border) {
classes.push(`border--${border}`);
}
if (overflow) {
classes.push(overflow);
classes.push("height--1-1");
}
if (paddedContent !== "none") {
classes.push(`padded-content--${paddedContent}`);
}
if (alignSelf) {
classes.push(`align-self-${alignSelf}`);
}
if (isReadingColumn) {
children = {children}
;
}
DEVICE_SIZES.forEach(brkPoint => {
const propValue = props[brkPoint];
delete props[brkPoint];
let span;
let offset;
let order;
if (propValue !== null && propValue !== undefined && typeof propValue === "object") {
({ span = "fillSpace", offset, order } = propValue);
} else {
span = propValue;
}
if (offset !== null && offset !== undefined) {
classes.push(`offset-${brkPoint}-${offset}`);
}
if (order !== null && order !== undefined) {
classes.push(`order-${brkPoint}-${order}`);
}
if (span !== null && span !== undefined) {
spans.push(span === "fillSpace" ? `${prefix}-${brkPoint}` : `${prefix}-${brkPoint}-${span}`);
}
});
if (!spans.length) {
spans.push(prefix); // plain 'col'
}
return (
{children}
);
}
);
Col.displayName = "Col";
Col.defaultProps = {
isReadingColumn: false,
};
export default Col;