From bbe54e07160cecc11eb2901e5bbc6b2cfa3ebbd3 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Fri, 28 Jul 2023 09:02:00 +0300 Subject: [PATCH] feat: add col component (#51012) Co-authored-by: Naomi Carrigan --- tools/ui-components/src/col/col.stories.tsx | 35 ++++++++ tools/ui-components/src/col/col.test.tsx | 25 ++++++ tools/ui-components/src/col/col.tsx | 92 +++++++++++++++++++++ tools/ui-components/src/col/index.ts | 2 + tools/ui-components/src/col/types.ts | 13 +++ 5 files changed, 167 insertions(+) create mode 100644 tools/ui-components/src/col/col.stories.tsx create mode 100644 tools/ui-components/src/col/col.test.tsx create mode 100644 tools/ui-components/src/col/col.tsx create mode 100644 tools/ui-components/src/col/index.ts create mode 100644 tools/ui-components/src/col/types.ts diff --git a/tools/ui-components/src/col/col.stories.tsx b/tools/ui-components/src/col/col.stories.tsx new file mode 100644 index 00000000000..48b969c343c --- /dev/null +++ b/tools/ui-components/src/col/col.stories.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Story } from '@storybook/react'; +import { Col, ColProps } from '.'; + +const story = { + title: 'Example/Col', + component: Col, + argTypes: { + className: { control: { type: 'text' } }, + xs: { options: [8, 12, undefined] }, + sm: { options: [2, 4, 6, 8, 10, 12, undefined] }, + md: { options: [4, 6, 8, 10, undefined] }, + lg: { options: [6, 8, 10, undefined] }, + xsOffset: { options: [2, 3, undefined] }, + smOffset: { options: [1, 2, 3, 4, undefined] }, + mdOffset: { options: [1, 2, 3, 4, undefined] }, + lgOffset: { options: [0, 1, 2, undefined] }, + smPush: { options: [1, undefined] } + } +}; + +const Template: Story = args => { + return ( + +

Random text to test the element width

+ + ); +}; + +export const Default = Template.bind({}); +Default.args = { + // default props go here +}; + +export default story; diff --git a/tools/ui-components/src/col/col.test.tsx b/tools/ui-components/src/col/col.test.tsx new file mode 100644 index 00000000000..c023a118635 --- /dev/null +++ b/tools/ui-components/src/col/col.test.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; + +import { Col } from '.'; + +describe('', () => { + it('should change className when props are passed', () => { + render( + + Learn to code for free. + + ); + expect(screen.getByText('Learn to code for free.')).toHaveClass( + 'relative min-h-[1px] px-[15px] float-left sm:w-full md:w-[83.3%] min-[1200px]:w-[66.6%] md:ml-[8.3%] min-[1200px]:ml-[16.6%]' + ); + }); + it('should add className to it', () => { + render( + Learn to code for free. + ); + expect(screen.getByText('Learn to code for free.')).toHaveClass( + 'relative min-h-[1px] px-[15px] float-left certificate-outer-wrapper' + ); + }); +}); diff --git a/tools/ui-components/src/col/col.tsx b/tools/ui-components/src/col/col.tsx new file mode 100644 index 00000000000..8d90cdb7b82 --- /dev/null +++ b/tools/ui-components/src/col/col.tsx @@ -0,0 +1,92 @@ +import React from 'react'; + +import { ColProps } from './types'; + +const ExtraSmallClasses = { + 12: 'sm:w-full', + 8: 'sm:w-[66.6%]' +}; + +const ExtraSmallOffsetClasses = { + 3: 'ml-[25%]', + 2: 'ml-[16.6%]' +}; + +const SmallClasses = { + 12: 'md:w-full', + 10: 'md:w-[83.3%]', + 8: 'md:w-[66.6%]', + 6: 'md:w-[50%]', + 5: 'md:w-[41.6%]', + 4: 'md:w-[33.3%]', + 2: 'md:w-[16.6%]' +}; + +const SmallOffsetClasses = { + 1: 'md:ml-[8.3%]', + 2: 'md:ml-[16.6%]', + 3: 'md:ml-[25%]', + 4: 'md:ml-[33.3%]' +}; + +const MediumClasses = { + 10: 'min-[992px]:w-[83.3%]', + 8: 'min-[992px]:w-[66.6%]', + 6: 'min-[992px]:w-[50%]', + 4: 'min-[992px]:w-[33.3%]' +}; + +const MediumOffsetClasses = { + 1: 'min-[992px]:ml-[8.3%]', + 2: 'min-[992px]:ml-[16.6%]', + 3: 'min-[992px]:ml-[25%]', + 4: 'min-[992px]:ml-[33.3%]' +}; + +const LargeClasses = { + 10: 'min-[1200px]:w-[83.3%]', + 8: 'min-[1200px]:w-[66.6%]', + 6: 'min-[1200px]:w-[50%]' +}; + +const LargeOffsetClasses = { + 0: 'min-[1200px]:ml-0', + 1: 'min-[1200px]:ml-[8.3%]', + 2: 'min-[1200px]:ml-[16.6%]' +}; + +export const Col = ({ + className, + children, + xs, + sm, + md, + lg, + smPush, + xsOffset, + smOffset, + mdOffset, + lgOffset, + ...props +}: ColProps) => { + const xsClass = xs ? ExtraSmallClasses[xs] : ''; + const xsOffsetClass = xsOffset ? ExtraSmallOffsetClasses[xsOffset] : ''; + const smPushClass = smPush ? 'md:left-[8.3%]' : ''; + const smClass = sm ? SmallClasses[sm] : ''; + const smOffsetClass = smOffset ? SmallOffsetClasses[smOffset] : ''; + const mdClass = md ? MediumClasses[md] : ''; + const mdOffsetClass = mdOffset ? MediumOffsetClasses[mdOffset] : ''; + const lgClass = lg ? LargeClasses[lg] : ''; + const lgOffsetClass = lgOffset ? LargeOffsetClasses[lgOffset] : ''; + + return ( +
+ {children} +
+ ); +}; diff --git a/tools/ui-components/src/col/index.ts b/tools/ui-components/src/col/index.ts new file mode 100644 index 00000000000..d62b8ec2215 --- /dev/null +++ b/tools/ui-components/src/col/index.ts @@ -0,0 +1,2 @@ +export { Col } from './col'; +export type { ColProps } from './types'; diff --git a/tools/ui-components/src/col/types.ts b/tools/ui-components/src/col/types.ts new file mode 100644 index 00000000000..7991b31bdbb --- /dev/null +++ b/tools/ui-components/src/col/types.ts @@ -0,0 +1,13 @@ +export interface ColProps extends React.HTMLAttributes { + className?: string; + children?: React.ReactNode; + xs?: 8 | 12; + sm?: 2 | 4 | 5 | 6 | 8 | 10 | 12; + md?: 4 | 6 | 8 | 10; + lg?: 6 | 8 | 10; + xsOffset?: 2 | 3; + smOffset?: 1 | 2 | 3 | 4; + mdOffset?: 1 | 2 | 3 | 4; + lgOffset?: 0 | 1 | 2; + smPush?: 1; +}