Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Storybook exploration #74

Merged
merged 3 commits into from Aug 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .npmrc
@@ -0,0 +1 @@
legacy-peer-deps=true
12 changes: 12 additions & 0 deletions .storybook/main.js
@@ -0,0 +1,12 @@
module.exports = {
stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
addons: [
'@storybook/addon-links',
'@storybook/addon-essentials',
'@storybook/addon-interactions',
],
framework: '@storybook/react',
core: {
builder: '@storybook/builder-webpack5',
},
};
9 changes: 9 additions & 0 deletions .storybook/preview.js
@@ -0,0 +1,9 @@
export const parameters = {
actions: { argTypesRegex: "^on[A-Z].*" },
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/,
},
},
}
15 changes: 14 additions & 1 deletion package.json
Expand Up @@ -9,7 +9,9 @@
"clean": "rimraf .next node_modules",
"lint": "next lint",
"generate": "gqty generate",
"wpe-build": "next build"
"wpe-build": "next build",
"storybook": "start-storybook -p 6006",
"build-storybook": "build-storybook"
},
"dependencies": {
"@faustjs/core": "^0.15.2",
Expand All @@ -23,13 +25,24 @@
"sass": "^1.44.0"
},
"devDependencies": {
"@babel/core": "^7.18.10",
"@gqty/cli": "^2.3.1",
"@storybook/addon-actions": "^6.5.10",
"@storybook/addon-essentials": "^6.5.10",
"@storybook/addon-interactions": "^6.5.10",
"@storybook/addon-links": "^6.5.10",
"@storybook/builder-webpack5": "^6.5.10",
"@storybook/manager-webpack5": "^6.5.10",
"@storybook/react": "^6.5.10",
"@storybook/testing-library": "^0.0.13",
"@types/node": "^17.0.35",
"@types/react": "^17.0.37",
"babel-loader": "^8.2.5",
"dotenv-flow": "3.2.0",
"eslint": "^8.4.1",
"eslint-config-next": "^12.0.7",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-storybook": "^0.6.3",
"prettier": "^2.7.1",
"rimraf": "^3.0.2",
"typescript": "^4.5.2"
Expand Down
27 changes: 27 additions & 0 deletions src/components/ButtonAction.stories.tsx
@@ -0,0 +1,27 @@
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import ButtonAction from './ButtonAction';

export default {
title: 'ButtonAction',
component: ButtonAction,
argTypes: {
label: { control: 'Button Label' },
},
} as ComponentMeta<typeof ButtonAction>;

const Template: ComponentStory<typeof ButtonAction> = (args) => (
<ButtonAction {...args} />
);

export const Default = Template.bind({});
Default.args = {
default: true,
label: 'Click me',
};
export const Primary = Template.bind({});
// More on args: https://storybook.js.org/docs/react/writing-stories/args
Primary.args = {
primary: true,
label: 'Click me',
};
14 changes: 14 additions & 0 deletions src/components/ButtonAction.tsx
@@ -0,0 +1,14 @@
import React from 'react';

interface ButtonActionProps {
label?: string;
}

const ButtonAction: React.FunctionComponent<ButtonActionProps> = ({
label,
}) => (
<a className={['btn', 'btn-link'].join(' ')} href="#">
{label}
</a>
);
export default ButtonAction;
1 change: 1 addition & 0 deletions src/pages/academics/programs.tsx
Expand Up @@ -5,6 +5,7 @@ import styles from 'scss/pages/Programs.module.scss';
import Script from 'next/script';
import { prependOnceListener } from 'process';
import content from '../../_data/programs.json';
import ButtonAction from 'components/ButtonAction';

function Programs() {
console.log(content);
Expand Down
7 changes: 7 additions & 0 deletions src/scss/components/ButtonAction.module.scss
@@ -0,0 +1,7 @@
/** Currently not used

// .button-action{
// text-decoration: none;
// margin-left: 1.5rem;
// margin-bottom: 3rem;
// }
12 changes: 6 additions & 6 deletions src/scss/framework/_custom_variables.scss
Expand Up @@ -337,12 +337,12 @@ $font-weight-base: $font-weight-normal !default;
$line-height-base: 1.5 !default;


$h1-font-size: $font-size-base * 4.52; // 5.65
$h2-font-size: $font-size-base * 3.2; // 4rem
$h3-font-size: $font-size-base * 2.264; // 2.83rem
$h4-font-size: $font-size-base * 1.6; // 2rem
$h5-font-size: $font-size-base * 1.128; // 1.41rem
$h6-font-size: $font-size-base; // 1.25rem
$h1-font-size: $font-size-base * 3.7224; // 5.653rem
$h2-font-size: $font-size-base * 2.7368; // 3.998rem
$h3-font-size: $font-size-base * 2.012; // 2.827rem
$h4-font-size: $font-size-base * 1.48; // 1.999rem
$h5-font-size: $font-size-base * 1.088; // 1.414rem
$h6-font-size: $font-size-base * 0.8; // 1rem


$headings-margin-bottom: calc($spacer / 2) !default;
Expand Down
41 changes: 41 additions & 0 deletions src/stories/Button.stories.tsx
@@ -0,0 +1,41 @@
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';

import { Button } from './Button';

// More on default export: https://storybook.js.org/docs/react/writing-stories/introduction#default-export
export default {
title: 'Example/Button',
component: Button,
// More on argTypes: https://storybook.js.org/docs/react/api/argtypes
argTypes: {
backgroundColor: { control: 'color' },
},
} as ComponentMeta<typeof Button>;

// More on component templates: https://storybook.js.org/docs/react/writing-stories/introduction#using-args
const Template: ComponentStory<typeof Button> = (args) => <Button {...args} />;

export const Primary = Template.bind({});
// More on args: https://storybook.js.org/docs/react/writing-stories/args
Primary.args = {
primary: true,
label: 'Click me',
};

export const Secondary = Template.bind({});
Secondary.args = {
label: 'Button',
};

export const Large = Template.bind({});
Large.args = {
size: 'large',
label: 'Button',
};

export const Small = Template.bind({});
Small.args = {
size: 'small',
label: 'Button',
};
48 changes: 48 additions & 0 deletions src/stories/Button.tsx
@@ -0,0 +1,48 @@
import React from 'react';
import './button.css';

interface ButtonProps {
/**
* Is this the principal call to action on the page?
*/
primary?: boolean;
/**
* What background color to use
*/
backgroundColor?: string;
/**
* How large should the button be?
*/
size?: 'small' | 'medium' | 'large';
/**
* Button contents
*/
label: string;
/**
* Optional click handler
*/
onClick?: () => void;
}

/**
* Primary UI component for user interaction
*/
export const Button = ({
primary = false,
size = 'medium',
backgroundColor,
label,
...props
}: ButtonProps) => {
const mode = primary ? 'storybook-button--primary' : 'storybook-button--secondary';
return (
<button
type="button"
className={['storybook-button', `storybook-button--${size}`, mode].join(' ')}
style={{ backgroundColor }}
{...props}
>
{label}
</button>
);
};
25 changes: 25 additions & 0 deletions src/stories/Header.stories.tsx
@@ -0,0 +1,25 @@
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';

import { Header } from './Header';

export default {
title: 'Example/Header',
component: Header,
parameters: {
// More on Story layout: https://storybook.js.org/docs/react/configure/story-layout
layout: 'fullscreen',
},
} as ComponentMeta<typeof Header>;

const Template: ComponentStory<typeof Header> = (args) => <Header {...args} />;

export const LoggedIn = Template.bind({});
LoggedIn.args = {
user: {
name: 'Jane Doe',
},
};

export const LoggedOut = Template.bind({});
LoggedOut.args = {};
56 changes: 56 additions & 0 deletions src/stories/Header.tsx
@@ -0,0 +1,56 @@
import React from 'react';

import { Button } from './Button';
import './header.css';

type User = {
name: string;
};

interface HeaderProps {
user?: User;
onLogin: () => void;
onLogout: () => void;
onCreateAccount: () => void;
}

export const Header = ({ user, onLogin, onLogout, onCreateAccount }: HeaderProps) => (
<header>
<div className="wrapper">
<div>
<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fillRule="evenodd">
<path
d="M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z"
fill="#FFF"
/>
<path
d="M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z"
fill="#555AB9"
/>
<path
d="M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z"
fill="#91BAF8"
/>
</g>
</svg>
<h1>Acme</h1>
</div>
<div>
{user ? (
<>
<span className="welcome">
Welcome, <b>{user.name}</b>!
</span>
<Button size="small" onClick={onLogout} label="Log out" />
</>
) : (
<>
<Button size="small" onClick={onLogin} label="Log in" />
<Button primary size="small" onClick={onCreateAccount} label="Sign up" />
</>
)}
</div>
</div>
</header>
);