@financial-times/ft-concept-button
Version:
ft concept button (includes the ft follow button)
129 lines (99 loc) • 4.52 kB
Markdown
# ft-concept-button
A special button used around ft.com when performing actions on concepts.
## Usage
Check out [how to include Origami components in your project](https://origami.ft.com/documentation/components/#including-origami-components-in-your-project) to get started with `ft-concept-button`.
## Markup
## Concept pill
```html
<div
class="ft-concept-button ft-concept-button--standard"
data-o-component="ft-concept-button"
>
<button aria-pressed="false" class="ft-concept-button__button">Movies</button>
</div>
```
### Follow button
```html
<div
class="ft-concept-button ft-concept-button--follow ft-concept-button--standard"
data-ft-concept-button-pressed-text="Signed up"
data-ft-concept-button-unpressed-text="Sign up"
data-ft-concept-button-aria-live-pressed-text="Now signed up"
data-ft-concept-button-aria-live-unpressed-text="No longer signed up"
data-o-component="ft-concept-button"
>
<div class="ft-concept-button__announcement" aria-live="assertive"></div>
<button aria-pressed="false" class="ft-concept-button__button">
Sign up
</button>
</div>
```
### FT follow button
This one has a little plus or a tick icon. You'd be advised to include the `data-ft-concept-button-aria-live-pressed-text` and `data-ft-concept-button-aria-live-unpressed-text` options so screenreader users are informed that a change has occurred.
```html
<div
class="ft-concept-button ft-concept-button--follow ft-concept-button--standard"
data-ft-concept-button-aria-live-pressed-text="Now following movies on my FT"
data-ft-concept-button-aria-live-unpressed-text="No longer following movies on my FT"
data-ft-concept-button-aria-label-pressed-text="Stop following movies on my FT"
data-ft-concept-button-aria-label-unpressed-text="Follow movies on my FT"
data-o-component="ft-concept-button"
>
<div class="ft-concept-button__announcement" aria-live="assertive"></div>
<button aria-pressed="false" type="submit" class="ft-concept-button__button">
Movies
</button>
</div>
```
## JavaScript
```js
import ConceptButton from '-times/ft-concept-button';
```
### Options
The options accepted by the constructor are as follows:
`ariaPressedText` :: the text to announce to screenreaders when the button state changes to pressed
`ariaUnpressedText` :: the text to announce to screenreaders when the button state changes to unpressed
`ariaLabelText` :: the button aria abel to set when the button state changes to pressed
`ariaLabelText` :: the button aria label to set when the button state changes to unpressed
`pressedText` :: the text content of the button to set when the button state changes to pressed
`unpressedText` :: the text content of the button to set when the button state changes to unpressed
### State
You can set the pressed state (which will also update the labels and announce the new state to screenreaders) like this:
```js
conceptButton.isPressed = true;
```
You can check the pressed state by reading `conceptButton.isPressed`.
## React
Users with a React-compatible runtime aren't expected to load the Origami JavaScript at all, and are expected instead to take care of the labels and pressed state by themselves.
The provided `.tsx` template sets the button type to `submit`, so you can wrap a form around it and add any required business logic in the `onSubmit`.
You can attach a click handler to the button by passing an `onClick` function inside `extraButtonProps`.
The [stories](stories/concept-button.stories.tsx) should provide some guidance here.
### Props
```ts
export interface ConceptButtonProps {
// button text
label: string;
// text to announce to screenreaders
ariaLiveText?: string;
// descriptive label for button
ariaLabel?: string;
// button theme
theme?:
| 'standard'
| 'inverse'
| 'opinion'
| 'monochrome'
| 'inverse-monochrome';
// button type (the follow type has an icon)
type?: 'concept' | 'follow';
// whether the button is currently pressed
pressed?: boolean;
// for props that aren't appropriate in Origami
extraButtonProps: any;
}
```
## Migration
| State | Major Version | Last Minor Release | Migration guide |
| :----------: | :-----------: | :----------------: | :---------------------------------------------------: |
| ⚠ maintained | 2 | N/A | [migrate to v2](MIGRATION.md#migrating-from-v1-to-v2) |
| ╳ deprecated | 1 | 1.3 | N/A |