@spark-web/columns 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # @spark-web/columns
2
+
3
+ ## 1.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - [#27](https://github.com/brighte-labs/spark-web/pull/27)
8
+ [`4c8e398`](https://github.com/brighte-labs/spark-web/commit/4c8e3988f8a59d3dab60a6b67b1128b6ff2a5f2c)
9
+ Thanks [@JedWatson](https://github.com/JedWatson)! - Initial Version
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+ [[`4c8e398`](https://github.com/brighte-labs/spark-web/commit/4c8e3988f8a59d3dab60a6b67b1128b6ff2a5f2c)]:
15
+ - @spark-web/box@1.0.0
16
+ - @spark-web/theme@1.0.0
17
+ - @spark-web/utils@1.0.0
package/README.md ADDED
@@ -0,0 +1,96 @@
1
+ ---
2
+ title: Columns
3
+ storybookPath: page-layout-columns--default
4
+ ---
5
+
6
+ Use the columns primitive to layout content in configurable columns.
7
+
8
+ Each child represents a single column. By default that column will span 1
9
+ fraction of the total number of children.
10
+
11
+ ```jsx live
12
+ <Columns>
13
+ <Placeholder />
14
+ <Placeholder />
15
+ <Placeholder />
16
+ </Columns>
17
+ ```
18
+
19
+ ## Examples
20
+
21
+ ### Gap
22
+
23
+ The spacing between children can be adjusted using the `gap` prop.
24
+
25
+ ```jsx live
26
+ <Columns gap="large">
27
+ <Placeholder />
28
+ <Placeholder />
29
+ <Placeholder />
30
+ </Columns>
31
+ ```
32
+
33
+ ### Vertical alignment
34
+
35
+ Columns can be aligned vertically using the `alignY` prop.
36
+
37
+ ```jsx live
38
+ <Stack gap="medium" dividers>
39
+ <Columns gap="small" alignY="top">
40
+ <Placeholder />
41
+ <Placeholder label="top (default)" height={64} />
42
+ <Placeholder />
43
+ </Columns>
44
+ <Columns gap="small" alignY="center">
45
+ <Placeholder />
46
+ <Placeholder label="center" height={64} />
47
+ <Placeholder />
48
+ </Columns>
49
+ <Columns gap="small" alignY="bottom">
50
+ <Placeholder />
51
+ <Placeholder label="bottom" height={64} />
52
+ <Placeholder />
53
+ </Columns>
54
+ <Columns gap="small" alignY="stretch">
55
+ <Placeholder />
56
+ <Placeholder label="stretch" height={64} />
57
+ <Placeholder />
58
+ </Columns>
59
+ </Stack>
60
+ ```
61
+
62
+ ### Collapsing across breakpoints
63
+
64
+ Columns can be collapsed into a single vertical stack responsively using the
65
+ `collapseBelow` prop.
66
+
67
+ ```jsx live
68
+ <Columns gap="large" collapseBelow="desktop">
69
+ <Placeholder />
70
+ <Placeholder />
71
+ <Placeholder />
72
+ </Columns>
73
+ ```
74
+
75
+ ## Props
76
+
77
+ | Prop | Type | Default | Description |
78
+ | -------------- | ------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------- |
79
+ | alignY? | [ResponsiveProp][responsive-prop]<AlignY\> | | Vertically align items within the container. |
80
+ | children | React.ReactNode | | Children elements to be rendered within the column component representing each column. |
81
+ | collapseBelow? | [ResponsiveRangeProps][responsive-range-props]('below') | | At which breakpoint, if amy, should the columns collapse. |
82
+ | gap? | [Gap][gap] | | The size of the gap between each column. |
83
+ | template? | number[] | | Define the relative width of each column. By default each column is the same width. |
84
+
85
+ [`Box`](/package/box) props are also included as `Column` props and are not
86
+ listed here (excluding `display`, `alignItems`, `gap`, `flexDirection`,
87
+ `justifyContent` and `flexWrap`).
88
+
89
+ Extra props are passed into the underlying [`Box`](/package/box) component.
90
+
91
+ [responsive-prop]:
92
+ https://bitbucket.org/brighte-energy/energy/src/537c678a81090af545969504776c6b3d2e67743e/spark-web/packages/theme/src/themeUtils.ts#spark-web/packages/theme/src/themeUtils.ts-11
93
+ [responsive-range-props]:
94
+ https://bitbucket.org/brighte-energy/energy/src/537c678a81090af545969504776c6b3d2e67743e/spark-web/packages/theme/src/themeutils.ts#spark-web/packages/theme/src/themeutils.ts-130
95
+ [gap]:
96
+ https://bitbucket.org/brighte-energy/energy/src/537c678a81090af545969504776c6b3d2e67743e/spark-web/packages/columns/src/Columns.tsx#spark-web/packages/columns/src/Columns.tsx-14
@@ -0,0 +1,34 @@
1
+ import type { BoxProps } from '@spark-web/box';
2
+ import type { BrighteTheme, ResponsiveProp, ResponsiveRangeProps } from '@spark-web/theme';
3
+ import type { ReactNode } from 'react';
4
+ import type { AlignY } from './alignment';
5
+ declare type Gap = ResponsiveProp<keyof Omit<BrighteTheme['spacing'], 'none'>>;
6
+ declare type ValidBoxProps = Omit<BoxProps, 'display' | 'alignItems' | 'gap' | 'flexDirection' | 'justifyContent' | 'flexWrap'>;
7
+ export declare type ColumnsProps = {
8
+ /** Vertically align items within the container. */
9
+ alignY?: ResponsiveProp<AlignY>;
10
+ /** Elements representing each column. */
11
+ children: ReactNode;
12
+ /** At which breakpoint, if any, should the columns collapse. */
13
+ collapseBelow?: ResponsiveRangeProps['below'];
14
+ /** The size of the gap between each column. */
15
+ gap?: Gap;
16
+ /** Define the relative width of each column. By default each column is the same width. */
17
+ template?: number[];
18
+ } & ValidBoxProps;
19
+ export declare const Columns: <Comp extends import("react").ElementType<any> = "div">(props: {
20
+ as?: Comp | undefined;
21
+ ref?: import("react").Ref<Comp extends "symbol" | "clipPath" | "filter" | "mask" | "marker" | "text" | "circle" | "svg" | "animate" | "animateMotion" | "animateTransform" | "defs" | "desc" | "ellipse" | "feBlend" | "feColorMatrix" | "feComponentTransfer" | "feComposite" | "feConvolveMatrix" | "feDiffuseLighting" | "feDisplacementMap" | "feDistantLight" | "feDropShadow" | "feFlood" | "feFuncA" | "feFuncB" | "feFuncG" | "feFuncR" | "feGaussianBlur" | "feImage" | "feMerge" | "feMergeNode" | "feMorphology" | "feOffset" | "fePointLight" | "feSpecularLighting" | "feSpotLight" | "feTile" | "feTurbulence" | "foreignObject" | "g" | "image" | "line" | "linearGradient" | "metadata" | "mpath" | "path" | "pattern" | "polygon" | "polyline" | "radialGradient" | "rect" | "stop" | "switch" | "textPath" | "tspan" | "use" | "view" | keyof HTMLElementTagNameMap | "set" ? (HTMLElementTagNameMap & Pick<SVGElementTagNameMap, "symbol" | "clipPath" | "filter" | "mask" | "marker" | "text" | "circle" | "svg" | "animate" | "animateMotion" | "animateTransform" | "defs" | "desc" | "ellipse" | "feBlend" | "feColorMatrix" | "feComponentTransfer" | "feComposite" | "feConvolveMatrix" | "feDiffuseLighting" | "feDisplacementMap" | "feDistantLight" | "feDropShadow" | "feFlood" | "feFuncA" | "feFuncB" | "feFuncG" | "feFuncR" | "feGaussianBlur" | "feImage" | "feMerge" | "feMergeNode" | "feMorphology" | "feOffset" | "fePointLight" | "feSpecularLighting" | "feSpotLight" | "feTile" | "feTurbulence" | "foreignObject" | "g" | "image" | "line" | "linearGradient" | "metadata" | "mpath" | "path" | "pattern" | "polygon" | "polyline" | "radialGradient" | "rect" | "stop" | "switch" | "textPath" | "tspan" | "use" | "view" | "set">)[Comp] : Comp extends new (...args: any) => any ? InstanceType<Comp> : undefined> | undefined;
22
+ } & Omit<import("react").PropsWithoutRef<import("react").ComponentProps<Comp>>, "as"> & {
23
+ /** Vertically align items within the container. */
24
+ alignY?: ResponsiveProp<"bottom" | "top" | "stretch" | "center"> | undefined;
25
+ /** Elements representing each column. */
26
+ children: ReactNode;
27
+ /** At which breakpoint, if any, should the columns collapse. */
28
+ collapseBelow?: ResponsiveRangeProps['below'];
29
+ /** The size of the gap between each column. */
30
+ gap?: Gap | undefined;
31
+ /** Define the relative width of each column. By default each column is the same width. */
32
+ template?: number[] | undefined;
33
+ } & ValidBoxProps) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
34
+ export {};
@@ -0,0 +1,14 @@
1
+ declare const alignYLookup: {
2
+ readonly top: "start";
3
+ readonly center: "center";
4
+ readonly bottom: "end";
5
+ readonly stretch: "stretch";
6
+ };
7
+ export declare type AlignY = keyof typeof alignYLookup;
8
+ export declare const alignYToAlignItems: (prop?: import("@spark-web/theme").ResponsiveProp<"bottom" | "top" | "stretch" | "center"> | undefined) => "stretch" | "center" | "end" | "start" | {
9
+ mobile: "stretch" | "center" | "end" | "start" | undefined;
10
+ tablet: "stretch" | "center" | "end" | "start" | undefined;
11
+ desktop: "stretch" | "center" | "end" | "start" | undefined;
12
+ wide: "stretch" | "center" | "end" | "start" | undefined;
13
+ } | undefined;
14
+ export {};
@@ -0,0 +1,2 @@
1
+ export { Columns } from './Columns';
2
+ export type { ColumnsProps } from './Columns';
@@ -0,0 +1 @@
1
+ export * from "./declarations/src/index";
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _extends = require('@babel/runtime/helpers/esm/extends');
6
+ var _slicedToArray = require('@babel/runtime/helpers/esm/slicedToArray');
7
+ var _objectWithoutProperties = require('@babel/runtime/helpers/esm/objectWithoutProperties');
8
+ var React = require('react');
9
+ var css = require('@emotion/css');
10
+ var box = require('@spark-web/box');
11
+ var theme = require('@spark-web/theme');
12
+ var ts = require('@spark-web/utils/ts');
13
+
14
+ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
15
+
16
+ var React__default = /*#__PURE__*/_interopDefault(React);
17
+
18
+ var alignYLookup = {
19
+ top: 'start',
20
+ center: 'center',
21
+ bottom: 'end',
22
+ stretch: 'stretch'
23
+ };
24
+ var alignYToAlignItems = theme.createResponsiveMapFn(alignYLookup);
25
+
26
+ var _excluded = ["alignY", "collapseBelow", "gap", "template"];
27
+ var __jsx = React__default["default"].createElement;
28
+ var Columns = ts.forwardRefWithAs(function (_ref, forwardedRef) {
29
+ var _ref$alignY = _ref.alignY,
30
+ alignY = _ref$alignY === void 0 ? 'top' : _ref$alignY,
31
+ collapseBelow = _ref.collapseBelow,
32
+ gap = _ref.gap,
33
+ template = _ref.template,
34
+ props = _objectWithoutProperties(_ref, _excluded);
35
+
36
+ var _useTheme = theme.useTheme(),
37
+ spacing = _useTheme.spacing,
38
+ utils = _useTheme.utils;
39
+
40
+ var alignItems = alignYToAlignItems(alignY);
41
+ var count = React.Children.count(props.children);
42
+ var gridTemplateColumns = template ? template.map(function (c) {
43
+ return "".concat(c, "fr");
44
+ }).join(' ') : "repeat(".concat(count, ", 1fr)");
45
+
46
+ var _utils$responsiveRang = utils.responsiveRange({
47
+ below: collapseBelow
48
+ }),
49
+ _utils$responsiveRang2 = _slicedToArray(_utils$responsiveRang, 4),
50
+ collapseOnMobile = _utils$responsiveRang2[0],
51
+ collapseOnTablet = _utils$responsiveRang2[1],
52
+ collapseOnDesktop = _utils$responsiveRang2[2],
53
+ collapseOnWide = _utils$responsiveRang2[3];
54
+
55
+ return __jsx(box.Box, _extends({
56
+ ref: forwardedRef,
57
+ className: css.css(utils.resolveResponsiveProps({
58
+ alignItems: alignItems,
59
+ display: 'grid',
60
+ gap: utils.mapResponsiveScale(gap, spacing),
61
+ gridTemplateColumns: collapseBelow ? utils.optimizeResponsiveArray([collapseOnMobile ? null : gridTemplateColumns, collapseOnTablet ? null : gridTemplateColumns, collapseOnDesktop ? null : gridTemplateColumns, collapseOnWide ? null : gridTemplateColumns]) : gridTemplateColumns,
62
+ // fix flex overflow bug that prevents text truncation
63
+ '> *': {
64
+ minWidth: 0
65
+ }
66
+ }))
67
+ }, props));
68
+ });
69
+
70
+ exports.Columns = Columns;
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ if (process.env.NODE_ENV === "production") {
4
+ module.exports = require("./spark-web-columns.cjs.prod.js");
5
+ } else {
6
+ module.exports = require("./spark-web-columns.cjs.dev.js");
7
+ }
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _extends = require('@babel/runtime/helpers/esm/extends');
6
+ var _slicedToArray = require('@babel/runtime/helpers/esm/slicedToArray');
7
+ var _objectWithoutProperties = require('@babel/runtime/helpers/esm/objectWithoutProperties');
8
+ var React = require('react');
9
+ var css = require('@emotion/css');
10
+ var box = require('@spark-web/box');
11
+ var theme = require('@spark-web/theme');
12
+ var ts = require('@spark-web/utils/ts');
13
+
14
+ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
15
+
16
+ var React__default = /*#__PURE__*/_interopDefault(React);
17
+
18
+ var alignYLookup = {
19
+ top: 'start',
20
+ center: 'center',
21
+ bottom: 'end',
22
+ stretch: 'stretch'
23
+ };
24
+ var alignYToAlignItems = theme.createResponsiveMapFn(alignYLookup);
25
+
26
+ var _excluded = ["alignY", "collapseBelow", "gap", "template"];
27
+ var __jsx = React__default["default"].createElement;
28
+ var Columns = ts.forwardRefWithAs(function (_ref, forwardedRef) {
29
+ var _ref$alignY = _ref.alignY,
30
+ alignY = _ref$alignY === void 0 ? 'top' : _ref$alignY,
31
+ collapseBelow = _ref.collapseBelow,
32
+ gap = _ref.gap,
33
+ template = _ref.template,
34
+ props = _objectWithoutProperties(_ref, _excluded);
35
+
36
+ var _useTheme = theme.useTheme(),
37
+ spacing = _useTheme.spacing,
38
+ utils = _useTheme.utils;
39
+
40
+ var alignItems = alignYToAlignItems(alignY);
41
+ var count = React.Children.count(props.children);
42
+ var gridTemplateColumns = template ? template.map(function (c) {
43
+ return "".concat(c, "fr");
44
+ }).join(' ') : "repeat(".concat(count, ", 1fr)");
45
+
46
+ var _utils$responsiveRang = utils.responsiveRange({
47
+ below: collapseBelow
48
+ }),
49
+ _utils$responsiveRang2 = _slicedToArray(_utils$responsiveRang, 4),
50
+ collapseOnMobile = _utils$responsiveRang2[0],
51
+ collapseOnTablet = _utils$responsiveRang2[1],
52
+ collapseOnDesktop = _utils$responsiveRang2[2],
53
+ collapseOnWide = _utils$responsiveRang2[3];
54
+
55
+ return __jsx(box.Box, _extends({
56
+ ref: forwardedRef,
57
+ className: css.css(utils.resolveResponsiveProps({
58
+ alignItems: alignItems,
59
+ display: 'grid',
60
+ gap: utils.mapResponsiveScale(gap, spacing),
61
+ gridTemplateColumns: collapseBelow ? utils.optimizeResponsiveArray([collapseOnMobile ? null : gridTemplateColumns, collapseOnTablet ? null : gridTemplateColumns, collapseOnDesktop ? null : gridTemplateColumns, collapseOnWide ? null : gridTemplateColumns]) : gridTemplateColumns,
62
+ // fix flex overflow bug that prevents text truncation
63
+ '> *': {
64
+ minWidth: 0
65
+ }
66
+ }))
67
+ }, props));
68
+ });
69
+
70
+ exports.Columns = Columns;
@@ -0,0 +1,62 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray';
3
+ import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';
4
+ import React, { Children } from 'react';
5
+ import { css } from '@emotion/css';
6
+ import { Box } from '@spark-web/box';
7
+ import { createResponsiveMapFn, useTheme } from '@spark-web/theme';
8
+ import { forwardRefWithAs } from '@spark-web/utils/ts';
9
+
10
+ var alignYLookup = {
11
+ top: 'start',
12
+ center: 'center',
13
+ bottom: 'end',
14
+ stretch: 'stretch'
15
+ };
16
+ var alignYToAlignItems = createResponsiveMapFn(alignYLookup);
17
+
18
+ var _excluded = ["alignY", "collapseBelow", "gap", "template"];
19
+ var __jsx = React.createElement;
20
+ var Columns = forwardRefWithAs(function (_ref, forwardedRef) {
21
+ var _ref$alignY = _ref.alignY,
22
+ alignY = _ref$alignY === void 0 ? 'top' : _ref$alignY,
23
+ collapseBelow = _ref.collapseBelow,
24
+ gap = _ref.gap,
25
+ template = _ref.template,
26
+ props = _objectWithoutProperties(_ref, _excluded);
27
+
28
+ var _useTheme = useTheme(),
29
+ spacing = _useTheme.spacing,
30
+ utils = _useTheme.utils;
31
+
32
+ var alignItems = alignYToAlignItems(alignY);
33
+ var count = Children.count(props.children);
34
+ var gridTemplateColumns = template ? template.map(function (c) {
35
+ return "".concat(c, "fr");
36
+ }).join(' ') : "repeat(".concat(count, ", 1fr)");
37
+
38
+ var _utils$responsiveRang = utils.responsiveRange({
39
+ below: collapseBelow
40
+ }),
41
+ _utils$responsiveRang2 = _slicedToArray(_utils$responsiveRang, 4),
42
+ collapseOnMobile = _utils$responsiveRang2[0],
43
+ collapseOnTablet = _utils$responsiveRang2[1],
44
+ collapseOnDesktop = _utils$responsiveRang2[2],
45
+ collapseOnWide = _utils$responsiveRang2[3];
46
+
47
+ return __jsx(Box, _extends({
48
+ ref: forwardedRef,
49
+ className: css(utils.resolveResponsiveProps({
50
+ alignItems: alignItems,
51
+ display: 'grid',
52
+ gap: utils.mapResponsiveScale(gap, spacing),
53
+ gridTemplateColumns: collapseBelow ? utils.optimizeResponsiveArray([collapseOnMobile ? null : gridTemplateColumns, collapseOnTablet ? null : gridTemplateColumns, collapseOnDesktop ? null : gridTemplateColumns, collapseOnWide ? null : gridTemplateColumns]) : gridTemplateColumns,
54
+ // fix flex overflow bug that prevents text truncation
55
+ '> *': {
56
+ minWidth: 0
57
+ }
58
+ }))
59
+ }, props));
60
+ });
61
+
62
+ export { Columns };
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@spark-web/columns",
3
+ "license": "MIT",
4
+ "version": "1.0.0",
5
+ "main": "dist/spark-web-columns.cjs.js",
6
+ "module": "dist/spark-web-columns.esm.js",
7
+ "devDependencies": {
8
+ "@types/react": "^17.0.12"
9
+ },
10
+ "dependencies": {
11
+ "@babel/runtime": "^7.14.6",
12
+ "@emotion/css": "^11.7.1",
13
+ "@spark-web/box": "^1.0.0",
14
+ "@spark-web/theme": "^1.0.0",
15
+ "@spark-web/utils": "^1.0.0",
16
+ "react": "^17.0.2"
17
+ },
18
+ "engines": {
19
+ "node": ">= 14.13"
20
+ }
21
+ }
@@ -0,0 +1,27 @@
1
+ import type { ComponentMeta, ComponentStory } from '@storybook/react';
2
+
3
+ import { Placeholder } from '../../../docs/components/example-helpers';
4
+ import type { ColumnsProps } from './Columns';
5
+ import { Columns } from './Columns';
6
+
7
+ export default {
8
+ title: 'Page & Layout / Columns',
9
+ component: Columns,
10
+ } as ComponentMeta<typeof Columns>;
11
+
12
+ const ColumnsStory: ComponentStory<typeof Columns> = (
13
+ args: Omit<ColumnsProps, 'className'>
14
+ ) => <Columns {...args} />;
15
+
16
+ export const Default = ColumnsStory.bind({});
17
+
18
+ Default.args = {
19
+ gap: 'large',
20
+ children: (
21
+ <>
22
+ <Placeholder height={40} />
23
+ <Placeholder height={40} />
24
+ <Placeholder height={40} />
25
+ </>
26
+ ),
27
+ } as ColumnsProps;
@@ -0,0 +1,85 @@
1
+ import { css } from '@emotion/css';
2
+ import type { BoxProps } from '@spark-web/box';
3
+ import { Box } from '@spark-web/box';
4
+ import type {
5
+ BrighteTheme,
6
+ ResponsiveProp,
7
+ ResponsiveRangeProps,
8
+ } from '@spark-web/theme';
9
+ import { useTheme } from '@spark-web/theme';
10
+ import { forwardRefWithAs } from '@spark-web/utils/ts';
11
+ import type { ReactNode } from 'react';
12
+ import { Children } from 'react';
13
+
14
+ import type { AlignY } from './alignment';
15
+ import { alignYToAlignItems } from './alignment';
16
+
17
+ type Gap = ResponsiveProp<keyof Omit<BrighteTheme['spacing'], 'none'>>;
18
+ type ValidBoxProps = Omit<
19
+ BoxProps,
20
+ | 'display'
21
+ | 'alignItems'
22
+ | 'gap'
23
+ | 'flexDirection'
24
+ | 'justifyContent'
25
+ | 'flexWrap'
26
+ >;
27
+
28
+ export type ColumnsProps = {
29
+ /** Vertically align items within the container. */
30
+ alignY?: ResponsiveProp<AlignY>;
31
+ /** Elements representing each column. */
32
+ children: ReactNode;
33
+ /** At which breakpoint, if any, should the columns collapse. */
34
+ collapseBelow?: ResponsiveRangeProps['below'];
35
+ /** The size of the gap between each column. */
36
+ gap?: Gap;
37
+ /** Define the relative width of each column. By default each column is the same width. */
38
+ template?: number[];
39
+ } & ValidBoxProps;
40
+
41
+ export const Columns = forwardRefWithAs<'div', ColumnsProps>(
42
+ (
43
+ { alignY = 'top', collapseBelow, gap, template, ...props },
44
+ forwardedRef
45
+ ) => {
46
+ const { spacing, utils } = useTheme();
47
+ const alignItems = alignYToAlignItems(alignY);
48
+ const count = Children.count(props.children);
49
+ const gridTemplateColumns = template
50
+ ? template.map(c => `${c}fr`).join(' ')
51
+ : `repeat(${count}, 1fr)`;
52
+
53
+ const [
54
+ collapseOnMobile,
55
+ collapseOnTablet,
56
+ collapseOnDesktop,
57
+ collapseOnWide,
58
+ ] = utils.responsiveRange({ below: collapseBelow });
59
+
60
+ return (
61
+ <Box
62
+ ref={forwardedRef}
63
+ className={css(
64
+ utils.resolveResponsiveProps({
65
+ alignItems,
66
+ display: 'grid',
67
+ gap: utils.mapResponsiveScale(gap, spacing),
68
+ gridTemplateColumns: collapseBelow
69
+ ? utils.optimizeResponsiveArray([
70
+ collapseOnMobile ? null : gridTemplateColumns,
71
+ collapseOnTablet ? null : gridTemplateColumns,
72
+ collapseOnDesktop ? null : gridTemplateColumns,
73
+ collapseOnWide ? null : gridTemplateColumns,
74
+ ])
75
+ : gridTemplateColumns,
76
+
77
+ // fix flex overflow bug that prevents text truncation
78
+ '> *': { minWidth: 0 },
79
+ })
80
+ )}
81
+ {...props}
82
+ />
83
+ );
84
+ }
85
+ );
@@ -0,0 +1,12 @@
1
+ import { createResponsiveMapFn } from '@spark-web/theme';
2
+
3
+ const alignYLookup = {
4
+ top: 'start',
5
+ center: 'center',
6
+ bottom: 'end',
7
+ stretch: 'stretch',
8
+ } as const;
9
+
10
+ export type AlignY = keyof typeof alignYLookup;
11
+
12
+ export const alignYToAlignItems = createResponsiveMapFn(alignYLookup);
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { Columns } from './Columns';
2
+
3
+ // types
4
+
5
+ export type { ColumnsProps } from './Columns';