11<template >
2- <button
3- type =" button"
4- class =" group flex min-h-16 w-full cursor-pointer items-center gap-3 rounded-xl border border-gray-200 bg-white px-3 py-2.5 text-left shadow-sm transition-[border-color,background-color,box-shadow] duration-200 hover:border-gray-300 hover:bg-gray-50 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/60 dark:border-dark-700 dark:bg-dark-900/45 dark:hover:border-dark-600 dark:hover:bg-dark-800/70"
5- :aria-label =" t('availableChannels.viewModelDetails', { model: model.name })"
6- :aria-expanded =" expanded"
7- @click =" $emit('select')"
2+ <div
3+ class =" group relative flex min-h-16 w-full cursor-pointer items-center gap-3 rounded-xl border border-gray-200 bg-white px-3 py-2.5 text-left shadow-sm transition-[border-color,background-color,box-shadow] duration-200 hover:border-gray-300 hover:bg-gray-50 hover:shadow-md dark:border-dark-700 dark:bg-dark-900/45 dark:hover:border-dark-600 dark:hover:bg-dark-800/70"
84 >
5+ <button
6+ type =" button"
7+ class =" absolute inset-0 rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500/60"
8+ :aria-label =" t('availableChannels.viewModelDetails', { model: model.name })"
9+ :aria-expanded =" expanded"
10+ @click =" $emit('select')"
11+ />
912 <span class =" flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-gray-50 ring-1 ring-inset ring-gray-200 dark:bg-dark-800 dark:ring-dark-700" >
1013 <ModelIcon :model =" model .name " size="20px" />
1114 </span >
4851 </span >
4952 </span >
5053
54+ <button
55+ type =" button"
56+ class =" relative flex h-7 w-7 shrink-0 items-center justify-center rounded-lg transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/60"
57+ :class =" copied
58+ ? 'text-emerald-500 dark:text-emerald-400'
59+ : 'text-gray-300 hover:bg-gray-100 hover:text-gray-600 dark:text-dark-600 dark:hover:bg-dark-700 dark:hover:text-dark-300'"
60+ :title =" t('availableChannels.copyModel', { model: model.name })"
61+ :aria-label =" t('availableChannels.copyModel', { model: model.name })"
62+ @click =" copyModelName"
63+ >
64+ <Icon :name =" copied ? ' check' : ' copy' " size="sm" />
65+ </button >
66+
5167 <Icon
5268 name="chevronRight"
5369 size="sm"
5672 expanded ? ' rotate-90' : ' ' ,
5773 ] "
5874 />
59- </button >
75+ </div >
6076</template >
6177
6278<script setup lang="ts">
@@ -66,6 +82,7 @@ import Icon from '@/components/icons/Icon.vue'
6682import ModelIcon from ' @/components/common/ModelIcon.vue'
6783import type { UserSupportedModel } from ' @/api/channels'
6884import type { MonitorStatus } from ' @/api/channelMonitor'
85+ import { useClipboard } from ' @/composables/useClipboard'
6986import { availableModelPriceSummary } from ' @/utils/availableModelPricing'
7087
7188export interface AvailableModelMonitorSummary {
@@ -97,6 +114,12 @@ const props = withDefaults(
97114defineEmits <{ (event : ' select' ): void }>()
98115
99116const { t } = useI18n ()
117+ const { copied, copyToClipboard } = useClipboard ()
118+
119+ function copyModelName(): void {
120+ void copyToClipboard (props .model .name , t (' availableChannels.copiedModel' , { model: props .model .name }))
121+ }
122+
100123const priceSummary = computed (() =>
101124 availableModelPriceSummary (
102125 props .model ,
0 commit comments