Badge
Badgeは、主に情報を表示するためのコンポーネントです。
必要に応じて、リンクやボタンとして遷移可能なパーツとしても活用できます。
<script lang="ts">
import Badge from '$lib/components/ui/atoms/Badge.svelte';
</script>
<Badge tone="filled">バッジ</Badge>
プロパティ
Badgeは、以下のプロパティをサポートしています。
| 名前 | 型 | デフォルト値 | 説明 |
|---|---|---|---|
tone |
string |
filled |
バッジのトーンを指定します。filled, outlined のいずれかを選択できます。 |
インストールの手順
以下のコンポーネントのコードを、使いたいプロジェクトにコピー&ペーストします。
パスは実際のプロジェクトの構成にあわせて更新します。
atoms/Badge.svelte
<!--
@component
## 概要
- ラベルやステータスなどの短い情報を表示するためのコンポーネントです
- 必要に応じて、リンクやボタンとしてナビゲーションやフィルターUIなど幅広い用途に対応します
## 機能
- クリックやフォーカスなどのインタラクションに対応します
- 見た目を変更するためのいくつかのスタイル用Propsが追加されています(詳細はPropsセクションを参照)
## Props
- tone: 塗りのスタイルを指定します
- link: ボタンやリンクスタイルに適用可能です
## Usage
```svelte
// バッジ
<Badge tone="filled">バッジ</Badge>
// リンク
<a href="/" class={badgeVariants({ tone: 'filled', link: true })}>バッジ</a>
```
-->
<script module lang="ts">
import type { Snippet } from 'svelte';
import type { ClassValue } from 'svelte/elements';
import { cva, type VariantProps } from 'class-variance-authority';
export const badgeVariants = cva('inline-flex items-center w-fit rounded-full font-semibold leading-none text-xs outline-primary', {
variants: {
/** ボタンの塗りの値 */
tone: {
filled: ['px-2.5 py-1 bg-primary text-base-foreground-on-fill-bright'],
outlined: ['px-[0.5625rem] py-[0.1875rem] border border-primary text-base-foreground-default'],
},
/** リンク */
link: {
true: [],
false: [],
},
},
compoundVariants: [
{
tone: 'filled',
link: true,
class:
'transition-colors active:bg-primary/80 hover:bg-primary/90 focus-visible:outline-[0.125rem] focus-visible:outline-offset-[0.125rem]',
},
{
tone: 'outlined',
link: true,
class:
'transition-colors active:bg-base-container-accent/80 hover:bg-base-container-accent/90 active:border-primary/80 hover:border-primary/90 focus-visible:outline-[0.125rem] focus-visible:outline-offset-[0.125rem]',
},
],
defaultVariants: {
tone: 'filled',
link: false,
},
});
export type BadgeVariants = VariantProps<typeof badgeVariants>;
export interface BadgeProps extends BadgeVariants {
/** クラス */
class?: ClassValue;
children?: Snippet<[]>;
}
</script>
<script lang="ts">
let { tone = 'filled', link = false, class: className, children }: BadgeProps = $props();
let badgeVariantClass = $derived(badgeVariants({ tone, link, class: className }));
</script>
<div class={badgeVariantClass}>
{@render children?.()}
</div>
使い方
<script lang="ts">
import Badge from '$lib/components/ui/atoms/Badge.svelte';
</script>
<Badge tone="filled">バッジ</Badge>
サンプル
Default
強調したい情報や目立たせたい要素に使用します。
<script lang="ts">
import Badge from '$lib/components/ui/atoms/Badge.svelte';
</script>
<Badge tone="filled">バッジ</Badge>
Outlined
情報を控えめに表示したい場合に使用します。
<script lang="ts">
import Badge from '$lib/components/ui/atoms/Badge.svelte';
</script>
<Badge tone="outlined">バッジ</Badge>
Link
リンクとして Badge を利用したい場合は、<a> タグ等にBadgeのクラスやスタイルを適用することで、同じ見た目を再現できます。
<script lang="ts">
import { badgeVariants } from '$lib/components/ui/atoms/Badge.svelte';
</script>
<a href="#" class={badgeVariants({ tone: 'filled', link: true })}>バッジ</a>