parent
e6538a62a5
commit
58255b3c2e
@ -0,0 +1,53 @@
|
||||
import React, { useState } from 'react';
|
||||
import type { ComponentMeta } from '@storybook/react';
|
||||
import type { BannerSize } from '@tih/ui';
|
||||
import { Banner } from '@tih/ui';
|
||||
|
||||
const bannerSizes: ReadonlyArray<BannerSize> = ['xs', 'sm', 'md'];
|
||||
|
||||
export default {
|
||||
argTypes: {
|
||||
children: {
|
||||
control: 'text',
|
||||
},
|
||||
size: {
|
||||
control: { type: 'select' },
|
||||
options: bannerSizes,
|
||||
},
|
||||
},
|
||||
component: Banner,
|
||||
title: 'Banner',
|
||||
} as ComponentMeta<typeof Banner>;
|
||||
|
||||
export const Basic = {
|
||||
args: {
|
||||
children: 'This notice is going to change your life',
|
||||
size: 'md',
|
||||
},
|
||||
};
|
||||
|
||||
export function Sizes() {
|
||||
const [isShown, setIsShown] = useState(true);
|
||||
const [isShown2, setIsShown2] = useState(true);
|
||||
const [isShown3, setIsShown3] = useState(true);
|
||||
return (
|
||||
<div className="space-y-4">
|
||||
{isShown && (
|
||||
<Banner onHide={() => setIsShown(false)}>
|
||||
This notice is going to change your life unless you close it.
|
||||
</Banner>
|
||||
)}
|
||||
{isShown2 && (
|
||||
<Banner size="sm" onHide={() => setIsShown2(false)}>
|
||||
This smaller notice is going to change your life unless you close it.
|
||||
</Banner>
|
||||
)}
|
||||
{isShown3 && (
|
||||
<Banner size="xs" onHide={() => setIsShown3(false)}>
|
||||
This even smaller notice is going to change your life unless you close
|
||||
it.
|
||||
</Banner>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
import clsx from 'clsx';
|
||||
import React from 'react';
|
||||
import { XMarkIcon } from '@heroicons/react/24/outline';
|
||||
|
||||
export type BannerSize = 'md' | 'sm' | 'xs';
|
||||
|
||||
type Props = Readonly<{
|
||||
children: React.ReactNode;
|
||||
onHide?: () => void;
|
||||
size?: BannerSize;
|
||||
}>;
|
||||
|
||||
export default function Banner({ children, size = 'md', onHide }: Props) {
|
||||
return (
|
||||
<div
|
||||
className={clsx(
|
||||
'bg-primary-600 relative',
|
||||
size === 'sm' && 'text-sm',
|
||||
size === 'xs' && 'text-xs',
|
||||
)}>
|
||||
<div className="mx-auto max-w-7xl py-3 px-3 sm:px-6 lg:px-8">
|
||||
<div className="pr-16 sm:px-16 sm:text-center">
|
||||
<p className="font-medium text-white">{children}</p>
|
||||
</div>
|
||||
{onHide != null && (
|
||||
<div
|
||||
className={clsx(
|
||||
'absolute inset-y-0 right-0 flex items-start sm:items-start',
|
||||
size === 'md' && 'pt-2 pr-2',
|
||||
size === 'sm' && 'pt-2 pr-2',
|
||||
size === 'xs' && 'pt-1.5 pr-2',
|
||||
)}>
|
||||
<button
|
||||
className={clsx(
|
||||
'hover:bg-primary-400 flex rounded-md focus:outline-none focus:ring-2 focus:ring-white',
|
||||
size === 'md' && 'p-1',
|
||||
size === 'sm' && 'p-0.5',
|
||||
size === 'xs' && 'p-0.5',
|
||||
)}
|
||||
type="button"
|
||||
onClick={onHide}>
|
||||
<span className="sr-only">Dismiss</span>
|
||||
<XMarkIcon aria-hidden="true" className="h-6 w-6 text-white" />
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
Loading…
Reference in new issue