feat(ui): add FieldButton component (#2448)

This commit is contained in:
Neko
2026-09-03 02:13:09 +08:00
committed by GitHub
parent 93f26a5714
commit c1d23081b4
3 changed files with 60 additions and 0 deletions
+17
View File
@@ -527,6 +527,23 @@ Tab-like selection using radio buttons with animated indicator.
All Field components wrap a base input with `label`, `description`, and consistent layout. Common slots: `label`, `description`. All Field components wrap a base input with `label`, `description`, and consistent layout. Common slots: `label`, `description`.
### FieldButton
Displays field information on the left and a compact action button on the right.
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `label` | `string` | *(required)* | Field label |
| `description` | `string?` | — | Helper text |
| `buttonLabel` | `string` | *(required)* | Action button label |
| `buttonIcon` | `string?` | — | UnoCSS/Iconify class for the action button |
| `disabled` | `boolean?` | — | Prevents the action |
| `loading` | `boolean?` | — | Shows a spinner and prevents the action |
**Slots**: `label`, `description`
**Emits**: `click(event: MouseEvent)`
### FieldInput ### FieldInput
| Prop | Type | Default | Description | | Prop | Type | Default | Description |
@@ -0,0 +1,42 @@
<script setup lang="ts">
import { Button } from '../../misc'
const props = defineProps<{
label: string
description?: string
buttonLabel: string
buttonIcon?: string
disabled?: boolean
loading?: boolean
}>()
const emit = defineEmits<{
click: [event: MouseEvent]
}>()
</script>
<template>
<div :class="['flex items-center gap-4']">
<div :class="['min-w-0 flex-1']">
<div :class="['flex items-center gap-1 text-sm font-medium']">
<slot name="label">
{{ props.label }}
</slot>
</div>
<div :class="['text-xs opacity-60']">
<slot name="description">
{{ props.description }}
</slot>
</div>
</div>
<Button
:label="props.buttonLabel"
:icon="props.buttonIcon"
:disabled="props.disabled"
:loading="props.loading"
size="sm"
variant="secondary"
@click="emit('click', $event)"
/>
</div>
</template>
@@ -1,3 +1,4 @@
export { default as FieldButton } from './field-button.vue'
export { default as FieldCheckbox } from './field-checkbox.vue' export { default as FieldCheckbox } from './field-checkbox.vue'
export { default as FieldCombobox } from './field-combobox-select.vue' export { default as FieldCombobox } from './field-combobox-select.vue'
export { default as FieldInputFile } from './field-input-file.vue' export { default as FieldInputFile } from './field-input-file.vue'