Admin 元件

Color Picker

參考API
從呼叫端傳入的色票陣列挑選顏色。

安裝

Terminal
pnpm dlx shadcn-vue add @admin/color-picker
import type { ColorPickerSwatch } from '@/components/admin/color-picker'import {  AdminColorPicker,  AdminColorPickerContent,  AdminColorPickerTrigger,} from '@/components/admin/color-picker'

用法

<script setup lang="ts">import type { ColorPickerSwatch } from '@/components/admin/color-picker'import { ref } from 'vue'import {  AdminColorPicker,  AdminColorPickerContent,  AdminColorPickerTrigger} from '@/components/admin/color-picker'​const swatches = [  { value: 'red', color: '#e1615e' },  { value: 'orange', color: '#ff7a00' },  { value: 'green', color: '#7abe53' },  { value: 'blue', color: '#4567f3' },  { value: 'violet', color: '#694cfe' }] as const satisfies readonly ColorPickerSwatch[]​const value = ref<(typeof swatches)[number]['value']>()</script>​<template>  <admin-color-picker v-model="value" :swatches="swatches">    <admin-color-picker-trigger />    <admin-color-picker-content />  </admin-color-picker></template>

場景

停用狀態

<script setup lang="ts">import type { ColorPickerSwatch } from '@/components/admin/color-picker'import { ref } from 'vue'import {  AdminColorPicker,  AdminColorPickerContent,  AdminColorPickerTrigger} from '@/components/admin/color-picker'​const swatches = [  { value: 'red', color: '#e1615e' },  { value: 'orange', color: '#ff7a00' },  { value: 'green', color: '#7abe53' },  { value: 'blue', color: '#4567f3' },  { value: 'violet', color: '#694cfe' }] as const satisfies readonly ColorPickerSwatch[]​const value = ref<(typeof swatches)[number]['value'] | undefined>('blue')</script>​<template>  <admin-color-picker v-model="value" disabled :swatches="swatches">    <admin-color-picker-trigger />    <admin-color-picker-content />  </admin-color-picker></template>

自訂 trigger

當預設 trigger 樣式不符需求,透過 AdminColorPickerTrigger 的 default slot 自行渲染觸發器;slot 內第一個元素會直接成為觸發 DOM。

<script setup lang="ts">import type { ColorPickerSwatch } from '@/components/admin/color-picker'import { ref } from 'vue'import { cn } from '@/lib/utils'import {  AdminColorPicker,  AdminColorPickerContent,  AdminColorPickerTrigger} from '@/components/admin/color-picker'​const swatches = [  { value: 'red', color: '#e1615e', label: '紅' },  { value: 'orange', color: '#ff7a00', label: '橘' },  { value: 'green', color: '#7abe53', label: '綠' },  { value: 'blue', color: '#4567f3', label: '藍' },  { value: 'violet', color: '#694cfe', label: '紫' }] as const satisfies readonly ColorPickerSwatch[]​const value = ref<(typeof swatches)[number]['value']>()</script>​<template>  <admin-color-picker v-model="value" :swatches="swatches">    <admin-color-picker-trigger v-slot="{ swatch, open, disabled }">      <button        type="button"        :class="          cn(`            flex items-center gap-1 rounded-full border border-text-30 bg-bg-90 px-3 py-1            text-text-90 outline-hidden            hover:border-text-50            focus-visible:ring-2 focus-visible:ring-info-40            data-[state=open]:border-info-40          `)        "        :disabled="disabled"      >        <span          class="size-3 rounded-full"          :style="{ backgroundColor: swatch?.color ?? 'transparent' }"        ></span>        <span class="text-sm">{{ swatch?.label ?? swatch?.value ?? '未選擇' }}</span>        <span class="text-xs text-text-50">{{ open ? '收合' : '展開' }}</span>      </button>    </admin-color-picker-trigger>    <admin-color-picker-content />  </admin-color-picker></template>

API 參考

swatches 中每個 value 須唯一,且 v-model 綁定值須為其中某個 value;若綁定值不在清單內,trigger 會顯示為未選狀態。

以 as const satisfies readonly ColorPickerSwatch[] 宣告 swatches,modelValue 會收斂成各 value 的 literal union,綁定清單外的字串即觸發 TypeScript 型別錯誤;未加 as const 時 modelValue 退回 string,維持向後相容。

組成

<script setup lang="ts">import type { ColorPickerSwatch } from '@/components/admin/color-picker'​const swatches = [  { value: 'red', color: '#e1615e' },  { value: 'blue', color: '#4567f3' },] as const satisfies readonly ColorPickerSwatch[]const value = ref<(typeof swatches)[number]['value']>()</script>​<template>  <admin-color-picker v-model="value" :swatches="swatches">    <admin-color-picker-trigger />    <admin-color-picker-content />  </admin-color-picker></template>

需要自訂 trigger 時放入 slot 內容:

<template>  <admin-color-picker v-model="value" :swatches="swatches">    <admin-color-picker-trigger v-slot="{ swatch, disabled }">      <button :disabled="disabled">        <span v-if="swatch" :style="{ background: swatch.color }"></span>        <span v-else>選擇顏色</span>      </button>    </admin-color-picker-trigger>    <admin-color-picker-content />  </admin-color-picker></template>

admin-color-picker

Props

名稱型別預設值說明
classunknown——
modelValueTValue | undefined—受控值,以 `v-model` 綁定;須為 `swatches` 中某個 `value`,否則 trigger 視為未選
swatches*readonly ColorPickerSwatch<TValue>[]—可選顏色清單(必填);每個 `value` 須唯一。以 `as const satisfies readonly ColorPickerSwatch[]` 宣告時,`modelValue` 會收斂成各 `value` 的 literal union
disabledboolean | undefinedfalse設為 `true` 時禁用 picker

* 代表必填

Events

名稱Payload說明
update:modelValueTValue | undefinedmodelValue 更新時觸發;未選 / 取消選擇時為 `undefined`

Slots

名稱Bindings說明
default{}—

admin-color-picker-content

Props

名稱型別預設值說明
align"start" | "end" | "center" | undefined"center"對齊 trigger 之位置
sideOffsetnumber | undefined4content 與 trigger 之間的距離
classClassValue—根元素之自訂 class

admin-color-picker-trigger

Props

名稱型別預設值說明
classunknown——

Slots

名稱Bindings說明
default{ value: string | undefined; swatch: ColorPickerSwatch<string> | undefined; open: boolean; disabled: boolean; }預設 slot;若提供則以自訂內容取代預設 trigger,並傳遞當前值、選中之 swatch、open 與 disabled 狀態

更新紀錄

  • revert: 還原清除色票外框與勾勾顏色修正d36c714
  • fix: 修正清除色票在浮層中看不見a177831
  • fix: 補上 Vue 核心 API 的顯式 import3c2c030
  • feat: modelValue 支援收斂為 swatch value 的 literal union0238cc9
  • fix: 修正停用狀態行為並補 swatch 群組 a11yc5ae5c1
  • refactor: cn import 路徑統一為 @/lib/utils1c379e6
  • chore: 啟用 vue/no-useless-v-bind 與 vue/prefer-separate-static-class16c34a8