diff --git a/libs/tailwindcss-config/src/theme.js b/libs/tailwindcss-config/src/theme.js index 2e2055015..d80221a69 100644 --- a/libs/tailwindcss-config/src/theme.js +++ b/libs/tailwindcss-config/src/theme.js @@ -151,6 +151,7 @@ module.exports = { extend: { boxShadow: { callout: '5px 5px 0 1px rgba(0, 0, 0, 0.05)', + focus: '0px 0px 0px 1px #000000, 0px 0px 3px 2px #FFE600', }, }, }; diff --git a/libs/ui-toolkit/src/components/button/Button.spec.tsx b/libs/ui-toolkit/src/components/button/Button.spec.tsx index bd506341b..34802619c 100644 --- a/libs/ui-toolkit/src/components/button/Button.spec.tsx +++ b/libs/ui-toolkit/src/components/button/Button.spec.tsx @@ -1,6 +1,6 @@ import { render } from '@testing-library/react'; -import Button from './Button'; +import Button from './button'; describe('Button', () => { it('should render successfully', () => { diff --git a/libs/ui-toolkit/src/components/button/Button.stories.tsx b/libs/ui-toolkit/src/components/button/Button.stories.tsx index 3b26417c4..6a27fd8c3 100644 --- a/libs/ui-toolkit/src/components/button/Button.stories.tsx +++ b/libs/ui-toolkit/src/components/button/Button.stories.tsx @@ -1,5 +1,5 @@ import { Story, Meta } from '@storybook/react'; -import { Button } from './Button'; +import { Button } from './button'; export default { component: Button, diff --git a/libs/ui-toolkit/src/components/input/input.spec.tsx b/libs/ui-toolkit/src/components/input/input.spec.tsx new file mode 100644 index 000000000..e5e2ff05a --- /dev/null +++ b/libs/ui-toolkit/src/components/input/input.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import Input from './input'; + +describe('Input', () => { + it('should render successfully', () => { + const { baseElement } = render(); + expect(baseElement).toBeTruthy(); + }); +}); diff --git a/libs/ui-toolkit/src/components/input/input.stories.tsx b/libs/ui-toolkit/src/components/input/input.stories.tsx new file mode 100644 index 000000000..cef41c3b6 --- /dev/null +++ b/libs/ui-toolkit/src/components/input/input.stories.tsx @@ -0,0 +1,22 @@ +import { Story, Meta } from '@storybook/react'; +import { Input } from './input'; + +export default { + component: Input, + title: 'Input', +} as Meta; + +const Template: Story = (args) => ; + +export const Default = Template.bind({}); +Default.args = {}; + +export const WithError = Template.bind({}); +WithError.args = { + hasError: true, +}; + +export const Disabled = Template.bind({}); +Disabled.args = { + disabled: true, +}; diff --git a/libs/ui-toolkit/src/components/input/input.tsx b/libs/ui-toolkit/src/components/input/input.tsx new file mode 100644 index 000000000..60fe0da4e --- /dev/null +++ b/libs/ui-toolkit/src/components/input/input.tsx @@ -0,0 +1,75 @@ +import classNames from 'classnames'; + +/* eslint-disable-next-line */ +export interface InputProps { + onChange?: React.FormEventHandler; + hasError?: boolean; + disabled?: boolean; + className?: string; + value?: string | number; +} + +export const inputClassNames = ({ + hasError, + disabled, + className, +}: { + hasError?: boolean; + disabled?: boolean; + className?: string; +}) => + classNames( + [ + 'inline-flex', + 'items-center', + 'box-border', + 'h-28', + 'pl-8', + 'pr-8', + 'border', + 'border-light-gray-50', + 'bg-neutral-753', + 'text-light-gray-50', + 'text-ui', + 'focus-visible:shadow-focus', + 'focus-visible:outline-0', + ], + { + 'border-vega-pink': hasError, + 'text-disabled': disabled, + 'bg-transparent': disabled, + }, + className + ); + +export const inputStyle = ({ disabled }: { disabled?: boolean }) => { + const style: React.CSSProperties = {}; + if (disabled) { + style.backgroundImage = + 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAAXNSR0IArs4c6QAAACNJREFUGFdjtLS0/M8ABcePH2eEsRlJl4BpBdHIuuFmEi0BABqjEQVjx/LTAAAAAElFTkSuQmCC)'; + } + return style; +}; + +export function Input({ + hasError, + onChange, + disabled, + className, + value, +}: InputProps) { + return ( + + ); +} + +export default Input; diff --git a/libs/ui-toolkit/src/components/textArea/textArea.spec.tsx b/libs/ui-toolkit/src/components/textArea/textArea.spec.tsx new file mode 100644 index 000000000..37bbe8353 --- /dev/null +++ b/libs/ui-toolkit/src/components/textArea/textArea.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import TextArea from './textArea'; + +describe('TextArea', () => { + it('should render successfully', () => { + const { baseElement } = render( +); + +export const Default = Template.bind({}); +Default.args = {}; + +export const WithError = Template.bind({}); +WithError.args = { + hasError: true, +}; + +export const Disabled = Template.bind({}); +Disabled.args = { + disabled: true, +}; diff --git a/libs/ui-toolkit/src/components/textArea/textArea.tsx b/libs/ui-toolkit/src/components/textArea/textArea.tsx new file mode 100644 index 000000000..0da8fa647 --- /dev/null +++ b/libs/ui-toolkit/src/components/textArea/textArea.tsx @@ -0,0 +1,73 @@ +import classNames from 'classnames'; + +/* eslint-disable-next-line */ +export interface TextAreaProps { + onChange?: React.FormEventHandler; + hasError?: boolean; + disabled?: boolean; + className?: string; + value?: string | number; + children?: React.ReactNode; +} + +export const inputClassNames = ({ + hasError, + disabled, + className, +}: { + hasError?: boolean; + disabled?: boolean; + className?: string; +}) => + classNames( + [ + 'inline-flex', + 'items-center', + 'box-border', + 'pl-8', + 'pr-8', + 'border', + 'border-light-gray-50', + 'bg-neutral-753', + 'text-light-gray-50', + 'text-ui', + 'focus-visible:shadow-focus', + 'focus-visible:outline-0', + ], + { + 'border-vega-pink': hasError, + 'text-disabled': disabled, + 'bg-transparent': disabled, + }, + className + ); + +export const inputStyle = ({ disabled }: { disabled?: boolean }) => { + const style: React.CSSProperties = {}; + if (disabled) { + style.backgroundImage = + 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAAXNSR0IArs4c6QAAACNJREFUGFdjtLS0/M8ABcePH2eEsRlJl4BpBdHIuuFmEi0BABqjEQVjx/LTAAAAAElFTkSuQmCC)'; + } + return style; +}; + +export function TextArea({ + hasError, + onChange, + disabled, + className, + children, +}: TextAreaProps) { + return ( + + ); +} + +export default TextArea; diff --git a/libs/ui-toolkit/src/index.ts b/libs/ui-toolkit/src/index.ts index 4535fe7f8..6eedd84de 100644 --- a/libs/ui-toolkit/src/index.ts +++ b/libs/ui-toolkit/src/index.ts @@ -1,5 +1,7 @@ import * as EthereumUtils from './utils/web3'; export { Callout } from './components/callout'; +export { Button } from './components/button/button'; +export { Input } from './components/input/input'; export { EtherscanLink } from './components/etherscan-link'; export { EthereumUtils };