refactor: Button components (#6929)

* feat: refactor button components

* fix: qa

* fix: storybook

* a11y: pass

* fix: build

* fix: rename default ->md

* fix: lint

* docs: buttons.md

* refactor part 1

* refactor part 2

* fix: undo refactor for fresh restart

* refactor

* Revert "refactor"

This reverts commit 96d65902d7.

* refactor: part 1

* fix: qa

* fix: qa

* fix: qa

* fix: qa

* fix: qa

* fix: qa

* fix: qa

* fix: qa

* fix: remove text-contrast

* fix: qa

* fix: v-tooltip

* fix: lint

* fix: split broken

* fix: passkey qa

* fix: qa

* fix: qa

* fix: prepr

* fix: splitbutton

* improve button group seam

---------

Signed-off-by: Calum H. <calum@modrinth.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
This commit is contained in:
Calum H.
2026-08-04 13:54:04 -07:00
committed by GitHub
co-authored by Prospector
parent 6cfe999cb3
commit bb2193b6f5
398 changed files with 13688 additions and 13133 deletions
@@ -54,17 +54,17 @@
</div>
</template>
</Combobox>
<ButtonStyled color="brand">
<button
v-tooltip="searchInviteTooltip"
class="shrink-0"
:disabled="!canInviteSearchTarget"
@click="inviteSearchTarget"
>
<PlusIcon aria-hidden="true" />
{{ addButtonLabel }}
</button>
</ButtonStyled>
<Button
v-tooltip="searchInviteTooltip"
type="colored"
color="brand"
class="shrink-0"
:disabled="!canInviteSearchTarget"
@click="inviteSearchTarget"
>
<PlusIcon aria-hidden="true" />
{{ addButtonLabel }}
</Button>
</div>
</div>
@@ -102,18 +102,17 @@
<div class="text-base font-semibold text-contrast">
{{ inviteLinkHeading }}
</div>
<ButtonStyled>
<button
type="button"
class="!h-10 w-full !justify-between !px-4 text-left !shadow-none"
@click="copyInviteLink"
>
<span class="min-w-0 truncate text-base font-semibold text-primary">
{{ link }}
</span>
<ClipboardCopyIcon class="size-5 shrink-0 text-secondary" aria-hidden="true" />
</button>
</ButtonStyled>
<Button
native-type="button"
size="lg"
class="w-full !justify-between text-left"
@click="copyInviteLink"
>
<span class="min-w-0 truncate text-base font-semibold text-primary">
{{ link }}
</span>
<ClipboardCopyIcon class="size-5 shrink-0 text-secondary" aria-hidden="true" />
</Button>
<p v-if="link && linkExpiryDescription" class="m-0 text-base text-primary">
{{ linkExpiryDescription }}
<button
@@ -144,10 +143,11 @@
import { ClipboardCopyIcon, PlusIcon } from '@modrinth/assets'
import { computed, ref } from 'vue'
import { Button } from '#ui/components/base/buttons'
import { defineMessages, useVIntl } from '../../../composables/i18n'
import { injectNotificationManager } from '../../../providers'
import Avatar from '../../base/Avatar.vue'
import ButtonStyled from '../../base/ButtonStyled.vue'
import Combobox from '../../base/Combobox.vue'
import NewModal from '../../modal/NewModal.vue'
import InvitePlayersModalInviteLinkEditor from './invite-players-modal-invite-link-editor.vue'
@@ -31,20 +31,18 @@
calendar-class="!border-none"
/>
<div class="flex justify-end gap-2 p-3 pt-1">
<ButtonStyled type="outlined">
<button type="button" @click="cancelCustomExpiry">
{{ formatMessage(messages.cancel) }}
</button>
</ButtonStyled>
<ButtonStyled color="brand">
<button
type="button"
:disabled="!canApplyCustomExpiry"
@click="applyCustomExpiry"
>
{{ formatMessage(messages.apply) }}
</button>
</ButtonStyled>
<Button type="outlined" native-type="button" @click="cancelCustomExpiry">
{{ formatMessage(messages.cancel) }}
</Button>
<Button
type="colored"
color="brand"
native-type="button"
:disabled="!canApplyCustomExpiry"
@click="applyCustomExpiry"
>
{{ formatMessage(messages.apply) }}
</Button>
</div>
</div>
<button
@@ -73,19 +71,15 @@
</div>
<template #actions>
<div class="flex justify-end gap-2">
<ButtonStyled>
<button :disabled="saving" @click="modal?.hide()">
<XIcon aria-hidden="true" />
{{ formatMessage(messages.cancel) }}
</button>
</ButtonStyled>
<ButtonStyled color="brand">
<button :disabled="!canSave" @click="save">
<SpinnerIcon v-if="saving" class="animate-spin" aria-hidden="true" />
<SaveIcon v-else aria-hidden="true" />
{{ formatMessage(messages.save) }}
</button>
</ButtonStyled>
<Button :disabled="saving" @click="modal?.hide()">
<XIcon aria-hidden="true" />
{{ formatMessage(messages.cancel) }}
</Button>
<Button type="colored" color="brand" :disabled="!canSave" @click="save">
<SpinnerIcon v-if="saving" class="animate-spin" aria-hidden="true" />
<SaveIcon v-else aria-hidden="true" />
{{ formatMessage(messages.save) }}
</Button>
</div>
</template>
</NewModal>
@@ -95,10 +89,11 @@
import { SaveIcon, SpinnerIcon, XIcon } from '@modrinth/assets'
import { computed, ref, watch } from 'vue'
import { Button } from '#ui/components/base/buttons'
import { useFormatDateTime } from '../../../composables'
import { defineMessages, useVIntl } from '../../../composables/i18n'
import { injectNotificationManager } from '../../../providers'
import ButtonStyled from '../../base/ButtonStyled.vue'
import Combobox, { type ComboboxOption } from '../../base/Combobox.vue'
import DatePicker from '../../base/DatePicker.vue'
import StyledInput from '../../base/StyledInput.vue'
@@ -30,29 +30,26 @@
</AutoLink>
</div>
<ButtonStyled v-if="status === 'added'" type="standard" color-fill="none">
<button disabled>
<CheckIcon aria-hidden="true" />
{{ addedLabel }}
</button>
</ButtonStyled>
<ButtonStyled v-else-if="status === 'pending'" type="outlined">
<button :disabled="disabled" @click="$emit('cancel', user)">
{{ cancelLabel }}
</button>
</ButtonStyled>
<Button v-if="status === 'added'" type="quiet" disabled>
<CheckIcon aria-hidden="true" />
{{ addedLabel }}
</Button>
<Button
v-else-if="status === 'pending'"
type="outlined"
:disabled="disabled"
@click="$emit('cancel', user)"
>
{{ cancelLabel }}
</Button>
<span v-else-if="status === 'requested'" v-tooltip="requestedTooltip" class="inline-flex">
<ButtonStyled type="standard" color-fill="none">
<button disabled>
{{ requestedLabel }}
</button>
</ButtonStyled>
<Button type="quiet" disabled>
{{ requestedLabel }}
</Button>
</span>
<ButtonStyled v-else color-fill="none">
<button :disabled="disabled" @click="$emit('invite', user)">
{{ inviteLabel }}
</button>
</ButtonStyled>
<Button v-else type="quiet" :disabled="disabled" @click="$emit('invite', user)">
{{ inviteLabel }}
</Button>
</div>
</template>
@@ -60,9 +57,10 @@
import { CheckIcon } from '@modrinth/assets'
import { computed } from 'vue'
import { Button } from '#ui/components/base/buttons'
import AutoLink from '../../base/AutoLink.vue'
import Avatar from '../../base/Avatar.vue'
import ButtonStyled from '../../base/ButtonStyled.vue'
import type { InvitePlayersUser, InvitePlayersUserProfileLink } from './types'
const props = withDefaults(