@gechiui/components
Version:
UI components for GeChiUI.
184 lines (169 loc) • 4.37 kB
JavaScript
/* eslint-disable no-alert */
/* globals alert */
/**
* External dependencies
*/
import { boolean, select } from '@storybook/addon-knobs';
/**
* GeChiUI dependencies
*/
import { typography } from '@gechiui/icons';
/**
* Internal dependencies
*/
import { ItemGroup, Item } from '..';
import Button from '../../button';
import { FlexItem, FlexBlock } from '../../flex';
import { Flyout } from '../../flyout';
import { HStack } from '../../h-stack';
import Icon from '../../icon';
import { Text } from '../../text';
import { Truncate } from '../../truncate';
import { ZStack } from '../../z-stack';
export default {
component: ItemGroup,
title: 'Components (Experimental)/ItemGroup',
parameters: {
knobs: { disabled: false },
},
};
// Using `unset` instead of `undefined` as Storybook seems to sometimes pass an
// empty string instead of `undefined`, which is not ideal.
// https://github.com/storybookjs/storybook/issues/800
const PROP_UNSET = 'unset';
export const _default = () => {
const itemGroupProps = {
isBordered: boolean( 'ItemGroup: isBordered', false ),
isSeparated: boolean( 'ItemGroup: isSeparated', false ),
isRounded: boolean( 'ItemGroup: isRounded', true ),
size: select(
'ItemGroup: size',
[ 'small', 'medium', 'large' ],
'medium'
),
};
const itemProps = {
size: select(
'Item 1: size',
{
'unset (defaults to the value set on the <ItemGroup> parent)': PROP_UNSET,
small: 'small',
medium: 'medium',
large: 'large',
},
PROP_UNSET
),
};
// Do not pass the `size` prop when its value is `undefined`.
// This allows the `Item` component to use the values that are set on the
// parent `ItemGroup` component by default.
if ( itemProps.size === PROP_UNSET ) {
delete itemProps.size;
}
return (
<ItemGroup style={ { width: '350px' } } { ...itemGroupProps }>
<Item { ...itemProps }>Code is Poetry (no click handlers)</Item>
<Item onClick={ () => alert( 'www.GeChiUI.com' ) }>
Code is Poetry — Click me!
</Item>
<Item onClick={ () => alert( 'www.GeChiUI.com' ) }>
Code is Poetry — Click me!
</Item>
<Item onClick={ () => alert( 'www.GeChiUI.com' ) }>
Code is Poetry — Click me!
</Item>
</ItemGroup>
);
};
export const dropdown = () => (
<Flyout
style={ { width: '350px' } }
trigger={ <Button>Open Popover</Button> }
>
<ItemGroup style={ { padding: 4 } }>
<Item>Code is Poetry (no click handlers)</Item>
<Item onClick={ () => alert( 'www.GeChiUI.com' ) }>
Code is Poetry — Click me!
</Item>
<Item onClick={ () => alert( 'www.GeChiUI.com' ) }>
Code is Poetry — Click me!
</Item>
<Item onClick={ () => alert( 'www.GeChiUI.com' ) }>
Code is Poetry — Click me!
</Item>
</ItemGroup>
</Flyout>
);
const SimpleColorSwatch = ( { color, style } ) => (
<div
style={ {
...style,
borderRadius: '50%',
border: '1px solid rgba(0, 0, 0, 0.2)',
width: '24px',
height: '24px',
backgroundColor: color,
} }
/>
);
export const complexLayouts = () => {
const colors = [
{
color: '#00A19D',
id: 'teal',
},
{
color: '#FFF8E5',
id: 'cream',
},
{
color: '#FFB344',
id: 'yellow',
},
{
color: '#E05D5D',
id: 'red',
},
];
return (
<ItemGroup isBordered isSeparated style={ { width: '250px' } }>
<Item onClick={ () => alert( 'Color palette' ) }>
<HStack>
<FlexBlock>
<ZStack isLayered={ false } offset={ -8 }>
{ colors.map( ( { color, id } ) => (
<SimpleColorSwatch key={ id } color={ color } />
) ) }
</ZStack>
</FlexBlock>
<FlexItem as={ Text } variant="muted">
23 colors
</FlexItem>
</HStack>
</Item>
<Item onClick={ () => alert( 'Single color setting' ) }>
<HStack justify="flex-start">
<FlexItem
as={ SimpleColorSwatch }
color="#22577A"
style={ { flexShrink: 0 } }
/>
<FlexItem as={ Truncate }>
Single color setting with very long description
</FlexItem>
</HStack>
</Item>
<Item onClick={ () => alert( 'Single typography setting' ) }>
<HStack justify="flex-start">
<FlexItem>
<Icon icon={ typography } size={ 24 } />
</FlexItem>
<FlexItem as={ Truncate }>
Single typography setting
</FlexItem>
</HStack>
</Item>
</ItemGroup>
);
};
/* eslint-enable no-alert */