diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-10-04 15:06:29 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-11-11 18:14:41 +0100 |
| commit | e97325a2c174a87c29593d1b42b9a1cc1eaf11af (patch) | |
| tree | 8bc2f9bd386512350ef596729dae1a9b14b7f3fd /src/components/molecules/buttons/help-button | |
| parent | 9eeb49155e2e74df4d5cb2833da20669b85fafe5 (diff) | |
refactor(components): rewrite HelpButton component
Diffstat (limited to 'src/components/molecules/buttons/help-button')
5 files changed, 130 insertions, 0 deletions
diff --git a/src/components/molecules/buttons/help-button/help-button.module.scss b/src/components/molecules/buttons/help-button/help-button.module.scss new file mode 100644 index 0000000..2dbba69 --- /dev/null +++ b/src/components/molecules/buttons/help-button/help-button.module.scss @@ -0,0 +1,24 @@ +@use "../../../../styles/abstracts/functions" as fun; +@use "../../../../styles/abstracts/mixins" as mix; + +.btn { + padding: fun.convert-px(7); + + @include mix.pointer("fine") { + padding: fun.convert-px(4); + } + + &[aria-pressed="true"] { + background: var(--color-primary-dark); + border-color: var(--color-primary-dark); + box-shadow: fun.convert-px(1) fun.convert-px(1) 0 0 var(--color-shadow); + + .icon { + :global { + path { + fill: var(--color-fg-inverted); + } + } + } + } +} diff --git a/src/components/molecules/buttons/help-button/help-button.stories.tsx b/src/components/molecules/buttons/help-button/help-button.stories.tsx new file mode 100644 index 0000000..556dd74 --- /dev/null +++ b/src/components/molecules/buttons/help-button/help-button.stories.tsx @@ -0,0 +1,50 @@ +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { HelpButton as HelpButtonComponent } from './help-button'; + +/** + * HelpButton - Storybook Meta + */ +export default { + title: 'Molecules/Buttons', + component: HelpButtonComponent, + argTypes: { + className: { + control: { + type: 'text', + }, + description: 'Set additional classnames to the button wrapper.', + table: { + category: 'Options', + }, + type: { + name: 'string', + required: false, + }, + }, + onClick: { + control: { + type: null, + }, + description: 'A callback function to handle click on button.', + table: { + category: 'Events', + }, + type: { + name: 'function', + required: false, + }, + }, + }, +} as ComponentMeta<typeof HelpButtonComponent>; + +const Template: ComponentStory<typeof HelpButtonComponent> = (args) => ( + <HelpButtonComponent {...args} /> +); + +/** + * Help Button Stories - Level 1 + */ +export const HelpButton = Template.bind({}); +HelpButton.args = { + label: 'Help', +}; diff --git a/src/components/molecules/buttons/help-button/help-button.test.tsx b/src/components/molecules/buttons/help-button/help-button.test.tsx new file mode 100644 index 0000000..f36fba7 --- /dev/null +++ b/src/components/molecules/buttons/help-button/help-button.test.tsx @@ -0,0 +1,13 @@ +import { describe, expect, it } from '@jest/globals'; +import { render, screen as rtlScreen } from '@testing-library/react'; +import { HelpButton } from './help-button'; + +describe('Help', () => { + it('renders a help button', () => { + const label = 'hic'; + + render(<HelpButton label={label} />); + + expect(rtlScreen.getByRole('button')).toHaveAccessibleName(label); + }); +}); diff --git a/src/components/molecules/buttons/help-button/help-button.tsx b/src/components/molecules/buttons/help-button/help-button.tsx new file mode 100644 index 0000000..1951b4d --- /dev/null +++ b/src/components/molecules/buttons/help-button/help-button.tsx @@ -0,0 +1,42 @@ +import { forwardRef, type ForwardRefRenderFunction } from 'react'; +import { Button, VisuallyHidden, type ButtonProps, Icon } from '../../../atoms'; +import styles from './help-button.module.scss'; + +export type HelpButtonProps = Omit< + ButtonProps, + 'aria-label' | 'children' | 'kind' | 'shape' +> & { + /** + * Define an accessible name for the button. + */ + label: string; +}; + +const HelpButtonWithRef: ForwardRefRenderFunction< + HTMLButtonElement, + HelpButtonProps +> = ({ className = '', isPressed = false, label, ...props }, ref) => { + const btnClass = `${styles.btn} ${className}`; + + return ( + <Button + {...props} + className={btnClass} + isPressed={isPressed} + ref={ref} + // eslint-disable-next-line react/jsx-no-literals -- Shape allowed + shape="circle" + > + {/* eslint-disable-next-line react/jsx-no-literals -- Config allowed */} + <Icon aria-hidden className={styles.icon} shape="help" size="sm" /> + <VisuallyHidden>{label}</VisuallyHidden> + </Button> + ); +}; + +/** + * HelpButton component + * + * Render a button with an interrogation mark icon. + */ +export const HelpButton = forwardRef(HelpButtonWithRef); diff --git a/src/components/molecules/buttons/help-button/index.ts b/src/components/molecules/buttons/help-button/index.ts new file mode 100644 index 0000000..952119e --- /dev/null +++ b/src/components/molecules/buttons/help-button/index.ts @@ -0,0 +1 @@ +export * from './help-button'; |
