From 14a22083b2cc38d5db48d2c6ad6a2bfcee656e8d Mon Sep 17 00:00:00 2001 From: Comfy Org PR Bot Date: Thu, 22 Jan 2026 10:42:48 +0900 Subject: [PATCH] [backport cloud/1.37] feat(StatusBadge): add dot mode with CVA variants (#8231) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backport of #8202 to `cloud/1.37` Automatically created by backport workflow. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8231-backport-cloud-1-37-feat-StatusBadge-add-dot-mode-with-CVA-variants-2f06d73d365081438b3ee0121ef4f239) by [Unito](https://www.unito.io) Co-authored-by: Alexander Brown Co-authored-by: Amp --- src/components/common/StatusBadge.stories.ts | 95 +++++++++++++++++++ src/components/common/StatusBadge.vue | 43 ++++----- src/components/common/statusBadge.variants.ts | 26 +++++ 3 files changed, 141 insertions(+), 23 deletions(-) create mode 100644 src/components/common/StatusBadge.stories.ts create mode 100644 src/components/common/statusBadge.variants.ts diff --git a/src/components/common/StatusBadge.stories.ts b/src/components/common/StatusBadge.stories.ts new file mode 100644 index 000000000..39ef6253c --- /dev/null +++ b/src/components/common/StatusBadge.stories.ts @@ -0,0 +1,95 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' + +import StatusBadge from './StatusBadge.vue' + +const meta = { + title: 'Common/StatusBadge', + component: StatusBadge, + tags: ['autodocs'], + argTypes: { + label: { control: 'text' }, + severity: { + control: 'select', + options: ['default', 'secondary', 'warn', 'danger', 'contrast'] + }, + variant: { + control: 'select', + options: ['label', 'dot', 'circle'] + } + }, + args: { + label: 'Status', + severity: 'default' + } +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Default: Story = {} + +export const Failed: Story = { + args: { + label: 'Failed', + severity: 'danger' + } +} + +export const Finished: Story = { + args: { + label: 'Finished', + severity: 'contrast' + } +} + +export const Dot: Story = { + args: { + label: undefined, + variant: 'dot', + severity: 'danger' + } +} + +export const Circle: Story = { + args: { + label: '3', + variant: 'circle' + } +} + +export const AllSeverities: Story = { + render: () => ({ + components: { StatusBadge }, + template: ` +
+ + + + + +
+ ` + }) +} + +export const AllVariants: Story = { + render: () => ({ + components: { StatusBadge }, + template: ` +
+
+ + label +
+
+ + dot +
+
+ + circle +
+
+ ` + }) +} diff --git a/src/components/common/StatusBadge.vue b/src/components/common/StatusBadge.vue index 46ef7ac79..a29cd966d 100644 --- a/src/components/common/StatusBadge.vue +++ b/src/components/common/StatusBadge.vue @@ -1,30 +1,27 @@ diff --git a/src/components/common/statusBadge.variants.ts b/src/components/common/statusBadge.variants.ts new file mode 100644 index 000000000..479a0dda8 --- /dev/null +++ b/src/components/common/statusBadge.variants.ts @@ -0,0 +1,26 @@ +import type { VariantProps } from 'cva' +import { cva } from 'cva' + +export const statusBadgeVariants = cva({ + base: 'inline-flex items-center justify-center rounded-full', + variants: { + severity: { + default: 'bg-primary-background text-base-foreground', + secondary: 'bg-secondary-background text-base-foreground', + warn: 'bg-warning-background text-base-background', + danger: 'bg-destructive-background text-white', + contrast: 'bg-base-foreground text-base-background' + }, + variant: { + label: 'h-3.5 px-1 text-xxxs font-semibold uppercase', + dot: 'size-2', + circle: 'size-3.5 text-xxxs font-semibold' + } + }, + defaultVariants: { + severity: 'default', + variant: 'label' + } +}) + +export type StatusBadgeVariants = VariantProps