File size: 2,070 Bytes
e8700b8
fe3e1db
e8700b8
 
 
de8eb79
2d9278d
fe3e1db
e8700b8
 
e509579
dd979ff
e509579
e8700b8
 
dd979ff
e509579
e8700b8
 
 
de8eb79
 
dd979ff
e8700b8
2d9278d
e8700b8
 
 
 
 
 
 
5fe840a
fe3e1db
5fe840a
e8700b8
 
e509579
2d9278d
 
 
 
 
e8700b8
 
 
 
 
 
de8eb79
fe3e1db
de8eb79
043242c
 
 
 
 
 
 
 
 
 
 
 
e8700b8
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<script lang="ts">
	import { X } from '@lucide/svelte';

	import { Button } from '$lib/components/ui/button';
	import SettingsModel from './SettingsModel.svelte';
	import { modelsState } from '$lib/state/models.svelte';
	import { mode } from 'mode-watcher';
	import ModelImageInput from './ModelImageInput.svelte';

	let {
		selectedModels,
		showSelector = false,
		onToggleModel
	}: {
		selectedModels: string[];
		showSelector?: boolean;
		onToggleModel?: (model: string) => void;
	} = $props();
</script>

{#each selectedModels as model (model)}
	{@const modelData = modelsState.models.find((m) => m.id === model)}
	{#if !showSelector}
		<div
			class="group relative inline-flex h-8 shrink-0 items-center justify-center gap-1.5 rounded-md border bg-background px-3 text-sm font-normal! text-primary has-[>svg]:px-2.5 dark:bg-secondary dark:text-secondary-foreground"
		>
			<img
				src={`https://huggingface.co/api/avatars/${model.split('/')[0]}`}
				alt={model.split('/')[0]}
				class="size-3.5 rounded"
			/>
			{model.split('/').pop() ?? model}
			{#if modelData?.architecture?.input_modalities?.includes('image')}
				<ModelImageInput />
			{/if}
		</div>
	{:else}
		<SettingsModel {model} {selectedModels} {onToggleModel}>
			<Button
				variant={mode.current === 'dark' ? 'secondary' : 'outline'}
				size="sm"
				class="group relative font-normal! shadow-none!"
			>
				<img
					src={`https://huggingface.co/api/avatars/${model.split('/')[0]}`}
					alt={model.split('/')[0]}
					class="size-3.5 rounded"
				/>
				{model.split('/').pop() ?? model}
				{#if modelData?.architecture?.input_modalities?.includes('image')}
					<ModelImageInput />
				{/if}
				<Button
					variant="default"
					size="icon-3xs"
					class="!shadow-none! absolute -top-1 -right-1 rounded-full! opacity-0 transition-opacity duration-300 group-hover:opacity-100"
					onclick={(e) => {
						e.preventDefault();
						e.stopPropagation();
						onToggleModel?.(model);
					}}
				>
					<X class="size-3" />
				</Button>
			</Button>
		</SettingsModel>
	{/if}
{/each}