Suggestions.svelte 3.5 KB
Newer Older
1
<script lang="ts">
Timothy J. Baek's avatar
Timothy J. Baek committed
2
	import Bolt from '$lib/components/icons/Bolt.svelte';
Jannik Streidl's avatar
Jannik Streidl committed
3
4
5
	import { onMount, getContext } from 'svelte';

	const i18n = getContext('i18n');
Timothy J. Baek's avatar
Timothy J. Baek committed
6

7
	export let submitPrompt: Function;
8
	export let suggestionPrompts = [];
9
10
11

	let prompts = [];

Timothy J. Baek's avatar
Timothy J. Baek committed
12
13
14
	$: prompts = suggestionPrompts
		.reduce((acc, current) => [...acc, ...[current]], [])
		.sort(() => Math.random() - 0.5);
15
16
17
	// suggestionPrompts.length <= 4
	// 	? suggestionPrompts
	// 	: suggestionPrompts.sort(() => Math.random() - 0.5).slice(0, 4);
Timothy J. Baek's avatar
Timothy J. Baek committed
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

	onMount(() => {
		const containerElement = document.getElementById('suggestions-container');

		if (containerElement) {
			containerElement.addEventListener('wheel', function (event) {
				if (event.deltaY !== 0) {
					// If scrolling vertically, prevent default behavior
					event.preventDefault();
					// Adjust horizontal scroll position based on vertical scroll
					containerElement.scrollLeft += event.deltaY;
				}
			});
		}
	});
33
34
</script>

Timothy J. Baek's avatar
Timothy J. Baek committed
35
36
37
{#if prompts.length > 0}
	<div class="mb-2 flex gap-1 text-sm font-medium items-center text-gray-400 dark:text-gray-600">
		<Bolt />
Jannik Streidl's avatar
Jannik Streidl committed
38
		{$i18n.t('Suggested')}
Timothy J. Baek's avatar
Timothy J. Baek committed
39
40
41
	</div>
{/if}

Timothy J. Baek's avatar
Timothy J. Baek committed
42
<div class="w-full">
Timothy J. Baek's avatar
Timothy J. Baek committed
43
44
45
46
	<div
		class="relative w-full flex gap-2 snap-x snap-mandatory md:snap-none overflow-x-auto tabs"
		id="suggestions-container"
	>
Timothy J. Baek's avatar
Timothy J. Baek committed
47
		{#each prompts as prompt, promptIdx}
48
			<div class="snap-center shrink-0">
Timothy J. Baek's avatar
Timothy J. Baek committed
49
				<button
Timothy J. Baek's avatar
Timothy J. Baek committed
50
					class="flex flex-col flex-1 shrink-0 w-64 justify-between h-36 p-5 px-6 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 rounded-3xl transition group"
Timothy J. Baek's avatar
Timothy J. Baek committed
51
52
53
					on:click={() => {
						submitPrompt(prompt.content);
					}}
54
				>
Timothy J. Baek's avatar
Timothy J. Baek committed
55
					<div class="flex flex-col text-left">
Timothy J. Baek's avatar
Timothy J. Baek committed
56
						{#if prompt.title && prompt.title[0] !== ''}
57
58
59
60
61
							<div
								class="  font-medium dark:text-gray-300 dark:group-hover:text-gray-200 transition"
							>
								{prompt.title[0]}
							</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
62
							<div class="text-sm text-gray-600 font-normal line-clamp-2">{prompt.title[1]}</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
63
						{:else}
64
65
66
							<div
								class=" self-center text-sm font-medium dark:text-gray-300 dark:group-hover:text-gray-100 transition line-clamp-2"
							>
Timothy J. Baek's avatar
Timothy J. Baek committed
67
68
69
70
71
								{prompt.content}
							</div>
						{/if}
					</div>

Timothy J. Baek's avatar
Timothy J. Baek committed
72
					<div class="w-full flex justify-between">
73
74
75
						<div
							class="text-xs text-gray-400 group-hover:text-gray-500 dark:text-gray-600 dark:group-hover:text-gray-500 transition self-center"
						>
Jannik Streidl's avatar
Jannik Streidl committed
76
							{$i18n.t('Prompt')}
77
						</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
78
79
80

						<div
							class="self-end p-1 rounded-lg text-gray-300 group-hover:text-gray-800 dark:text-gray-700 dark:group-hover:text-gray-100 transition"
Timothy J. Baek's avatar
Timothy J. Baek committed
81
						>
Timothy J. Baek's avatar
Timothy J. Baek committed
82
83
84
85
86
87
88
89
90
91
92
93
94
							<svg
								xmlns="http://www.w3.org/2000/svg"
								viewBox="0 0 16 16"
								fill="currentColor"
								class="size-4"
							>
								<path
									fill-rule="evenodd"
									d="M8 14a.75.75 0 0 1-.75-.75V4.56L4.03 7.78a.75.75 0 0 1-1.06-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1-1.06 1.06L8.75 4.56v8.69A.75.75 0 0 1 8 14Z"
									clip-rule="evenodd"
								/>
							</svg>
						</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
95
96
97
98
					</div>
				</button>
			</div>
		{/each}
99

Timothy J. Baek's avatar
Timothy J. Baek committed
100
101
102
103
104
105
		<!-- <div class="snap-center shrink-0">
		<img
			class="shrink-0 w-80 h-40 rounded-lg shadow-xl bg-white"
			src="https://images.unsplash.com/photo-1604999565976-8913ad2ddb7c?ixlib=rb-1.2.1&amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&amp;auto=format&amp;fit=crop&amp;w=320&amp;h=160&amp;q=80"
		/>
	</div> -->
Timothy J. Baek's avatar
Timothy J. Baek committed
106
	</div>
107
</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
108
109
110
111
112
113
114
115
116
117
118

<style>
	.tabs::-webkit-scrollbar {
		display: none; /* for Chrome, Safari and Opera */
	}

	.tabs {
		-ms-overflow-style: none; /* IE and Edge */
		scrollbar-width: none; /* Firefox */
	}
</style>