funkwhale/front/ui-docs/components/ui/button.md

6.6 KiB

Button

Buttons are UI elements that users can interact with to perform actions. Funkwhale uses buttons in many contexts.

Prop Data type Required? Default Description
variant solid | outline | ghost No solid Whether to render the button as an solid, outline or ghost button.
shadow Boolean No false Whether to render the button with a shadow
round Boolean No false Whether to render the button as a round button
icon String No The icon attached to the button
is-active Boolean No false Whether the button is in an active state
is-loading Boolean No false Whether the button is in a loading state
color primary | secondary | destructive No primary Renders a colored button

Button colors

Buttons come in different types depending on the type of action they represent.

Primary

Primary buttons represent positive actions such as uploading, confirming, and accepting changes.

::: info This is the default type. If you don't specify a type, a primary button is rendered. :::

<fw-button>
  Primary button
</fw-button>
Primary button

Secondary

Secondary buttons represent neutral actions such as cancelling a change or dismissing a notification.

<fw-button color="secondary">
  Secondary button
</fw-button>
Secondary button

Destructive

Desctrutive buttons represent dangerous actions including deleting items or purging domain information.

<fw-button color="destructive">
  Destructive button
</fw-button>
Destructive button

Button variants

Buttons come in different styles that you can use depending on the location of the button.

Solid

Solid buttons have a filled background. Use these to emphasize the action the button performs.

::: info This is the default style. If you don't specify a style, a solid button is rendered. :::

<fw-button>
  Filled button
</fw-button>
Filled button

Outline

Outline buttons have a transparent background. Use these to deemphasize the action the button performs.

<fw-button variant="outline" color="secondary">
  Outline button
</fw-button>
Outline button

Ghost

Ghost buttons have a transparent background and border. Use these to deemphasize the action the button performs.

<fw-button variant="ghost" color="secondary">
  Ghost button
</fw-button>
Ghost button

Button styles

Shadow

You can give a button a shadow to add depth.

<fw-button shadow>
  Shadow button
</fw-button>
Shadow button

Button shapes

You can choose different shapes for buttons depending on their location and use.

Normal

Normal buttons are slightly rounded rectangles.

::: info This is the default shape. If you don't specify a type, a normal button is rendered. :::

<fw-button>
  Normal button
</fw-button>
Normal button

Round

Round buttons have fully rounded edges.

<fw-button round>
  Round button
</fw-button>
Round button

Button states

You can pass a state to indicate whether a user can interact with a button.

Active

A button is active when clicked by a user. You can force an active state by passing an is-active prop.

<fw-button is-active>
  Active button
</fw-button>
Active button

Disabled

Disabled buttons are non-interactive and inherit a less bold color than the one provided. You can apply a disabled state by passing a disabled prop.

<fw-button disabled>
  Disabled button
</fw-button>
Disabled button

Loading

If a user can't interact with a button until something has finished loading, you can add a spinner by passing the is-loading prop.

<fw-button is-loading>
  Loading button
</fw-button>
Loading button

Promise handling in @click

When a function passed to @click returns a promise, the button automatically toggles a loading state on click. When the promise resolves or is rejected, the loading state turns off.

::: danger There is no promise rejection mechanism implemented in the <fw-button> component. Make sure the @click handler never rejects. :::

<script setup lang="ts">
const click = () => new Promise((resolve) => setTimeout(resolve, 1000));
</script>

<template>
  <fw-button @click="click"> Click me </fw-button>
</template>

<fw-button @click="click"> Click me

You can override the promise state by passing a false is-loading prop.

<fw-button :is-loading="false">
  Click me
</fw-button>
Click me

Icons

You can use Bootstrap Icons in your button component

::: info Icon buttons shrink down to the icon size if you don't pass any content. If you want to keep the button at full width with just an icon, add &nbsp; into the slot. :::

<fw-button color="secondary" icon="bi-three-dots-vertical" />

<fw-button color="secondary" is-round icon="bi-x" />

<fw-button icon="bi-save">&nbsp;</fw-button>

<fw-button color="destructive" icon="bi-trash">
  Delete
</fw-button>
  Delete