MateusFF commited on
Commit
bdb03b6
·
verified ·
1 Parent(s): 0df5209

Promote version 3379a82 to main

Browse files

Promoted commit 3379a82fb54cfd9696078bafc8bd7f5c7c4973b2 to main branch

Files changed (3) hide show
  1. index.html +278 -13
  2. script.js +285 -3
  3. style.css +126 -153
index.html CHANGED
@@ -4,21 +4,286 @@
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>Model Intellect Hub</title>
7
- <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8
  <link rel="stylesheet" href="style.css">
9
- <link href="https://cdn.jsdelivr.net/npm/@mdi/font@7.x/css/materialdesignicons.min.css" rel="stylesheet">
10
- <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
11
- </head>
12
- <body>
13
- <div id="app"></div>
14
- <script type="importmap">
15
- {
16
- "imports": {
17
- "vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js",
18
- "vuetify": "https://unpkg.com/vuetify@3.4.0/dist/vuetify.esm.js"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  }
20
- }
21
  </script>
22
- <script type="module" src="app.js"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  </body>
24
  </html>
 
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>Model Intellect Hub</title>
 
7
  <link rel="stylesheet" href="style.css">
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
10
+ <script src="https://unpkg.com/feather-icons"></script>
11
+ <script>
12
+ tailwind.config = {
13
+ darkMode: 'class',
14
+ theme: {
15
+ extend: {
16
+ colors: {
17
+ primary: {
18
+ 50: '#f0f9ff',
19
+ 100: '#e0f2fe',
20
+ 200: '#bae6fd',
21
+ 300: '#7dd3fc',
22
+ 400: '#38bdf8',
23
+ 500: '#0ea5e9',
24
+ 600: '#0284c7',
25
+ 700: '#0369a1',
26
+ 800: '#075985',
27
+ 900: '#0c4a6e',
28
+ },
29
+ secondary: {
30
+ 50: '#fdf4ff',
31
+ 100: '#fae8ff',
32
+ 200: '#f5d0fe',
33
+ 300: '#f0abfc',
34
+ 400: '#e879f9',
35
+ 500: '#d946ef',
36
+ 600: '#c026d3',
37
+ 700: '#a21caf',
38
+ 800: '#86198f',
39
+ 900: '#701a75',
40
+ }
41
+ }
42
+ }
43
+ }
44
  }
 
45
  </script>
46
+ </head>
47
+ <body class="bg-gray-50 dark:bg-gray-900 min-h-screen transition-colors duration-300">
48
+ <div class="container mx-auto px-4 py-8 max-w-4xl">
49
+ <!-- Header -->
50
+ <header class="mb-8 text-center">
51
+ <h1 class="text-3xl md:text-4xl font-bold text-gray-800 dark:text-white mb-2">
52
+ <span class="bg-gradient-to-r from-primary-500 to-secondary-500 bg-clip-text text-transparent">
53
+ Model Intellect Hub
54
+ </span>
55
+ 🔮
56
+ </h1>
57
+ <p class="text-gray-600 dark:text-gray-400">Explore AI models with intelligent insights</p>
58
+ </header>
59
+
60
+ <!-- Main Card -->
61
+ <div class="bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-6 md:p-8 border border-gray-100 dark:border-gray-700">
62
+ <div class="flex items-center gap-3 mb-6">
63
+ <div class="w-10 h-10 rounded-xl bg-gradient-to-br from-primary-500 to-secondary-500 flex items-center justify-center">
64
+ <i data-feather="image" class="text-white w-5 h-5"></i>
65
+ </div>
66
+ <div>
67
+ <h2 class="text-lg font-semibold text-gray-800 dark:text-white">Image Generation Model</h2>
68
+ <p class="text-sm text-gray-500 dark:text-gray-400">Configure your AI image generation settings</p>
69
+ </div>
70
+ </div>
71
+ <!-- Model Selector Component -->
72
+ <div class="space-y-4">
73
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
74
+ Select Model
75
+ </label>
76
+
77
+ <!-- Custom Dropdown with Info Button Inside -->
78
+ <div class="relative group" id="customDropdown">
79
+ <!-- Dropdown Trigger -->
80
+ <button
81
+ id="dropdownTrigger"
82
+ class="w-full flex items-center justify-between bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-xl px-4 py-3 text-gray-700 dark:text-gray-200 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-all duration-200 hover:border-primary-300 dark:hover:border-primary-700"
83
+ >
84
+ <span id="dropdownSelectedText">Choose a model...</span>
85
+ <i data-feather="chevron-down" class="w-5 h-5 text-gray-400 transition-transform duration-200" id="dropdownArrow"></i>
86
+ </button>
87
+
88
+ <!-- Floating Label Animation -->
89
+ <div class="absolute -top-2 left-3 px-1 bg-white dark:bg-gray-800 text-xs text-primary-500 font-medium opacity-0 transition-opacity duration-200" id="floatingLabel">
90
+ Modelo
91
+ </div>
92
+
93
+ <!-- Dropdown Menu -->
94
+ <div id="dropdownMenu" class="absolute z-20 w-full mt-2 bg-white dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded-xl shadow-xl opacity-0 invisible transform scale-95 transition-all duration-200 origin-top">
95
+ <div class="py-1 max-h-64 overflow-y-auto">
96
+ <!-- Stable Diffusion XL -->
97
+ <div class="dropdown-item group/item flex items-center justify-between px-4 py-3 hover:bg-primary-50 dark:hover:bg-primary-900/20 cursor-pointer transition-colors border-b border-gray-100 dark:border-gray-600 last:border-b-0" data-value="stable-diffusion-xl">
98
+ <div class="flex items-center gap-3">
99
+ <div class="w-8 h-8 rounded-lg bg-gradient-to-br from-blue-500 to-cyan-500 flex items-center justify-center">
100
+ <i data-feather="cpu" class="text-white w-4 h-4"></i>
101
+ </div>
102
+ <span class="font-medium text-gray-800 dark:text-gray-200">Stable Diffusion XL</span>
103
+ </div>
104
+ <button class="info-btn p-2 rounded-lg hover:bg-primary-200 dark:hover:bg-primary-800 transition-colors opacity-0 group-hover/item:opacity-100" data-model="stable-diffusion-xl">
105
+ <i data-feather="info" class="w-4 h-4 text-primary-600 dark:text-primary-400"></i>
106
+ </button>
107
+ </div>
108
+
109
+ <!-- DALL-E 3 -->
110
+ <div class="dropdown-item group/item flex items-center justify-between px-4 py-3 hover:bg-primary-50 dark:hover:bg-primary-900/20 cursor-pointer transition-colors border-b border-gray-100 dark:border-gray-600 last:border-b-0" data-value="dall-e-3">
111
+ <div class="flex items-center gap-3">
112
+ <div class="w-8 h-8 rounded-lg bg-gradient-to-br from-green-500 to-emerald-500 flex items-center justify-center">
113
+ <i data-feather="image" class="text-white w-4 h-4"></i>
114
+ </div>
115
+ <span class="font-medium text-gray-800 dark:text-gray-200">DALL-E 3</span>
116
+ </div>
117
+ <button class="info-btn p-2 rounded-lg hover:bg-primary-200 dark:hover:bg-primary-800 transition-colors opacity-0 group-hover/item:opacity-100" data-model="dall-e-3">
118
+ <i data-feather="info" class="w-4 h-4 text-primary-600 dark:text-primary-400"></i>
119
+ </button>
120
+ </div>
121
+
122
+ <!-- Midjourney V6 -->
123
+ <div class="dropdown-item group/item flex items-center justify-between px-4 py-3 hover:bg-primary-50 dark:hover:bg-primary-900/20 cursor-pointer transition-colors border-b border-gray-100 dark:border-gray-600 last:border-b-0" data-value="midjourney-v6">
124
+ <div class="flex items-center gap-3">
125
+ <div class="w-8 h-8 rounded-lg bg-gradient-to-br from-purple-500 to-pink-500 flex items-center justify-center">
126
+ <i data-feather="aperture" class="text-white w-4 h-4"></i>
127
+ </div>
128
+ <span class="font-medium text-gray-800 dark:text-gray-200">Midjourney V6</span>
129
+ </div>
130
+ <button class="info-btn p-2 rounded-lg hover:bg-primary-200 dark:hover:bg-primary-800 transition-colors opacity-0 group-hover/item:opacity-100" data-model="midjourney-v6">
131
+ <i data-feather="info" class="w-4 h-4 text-primary-600 dark:text-primary-400"></i>
132
+ </button>
133
+ </div>
134
+
135
+ <!-- Imagen 3 -->
136
+ <div class="dropdown-item group/item flex items-center justify-between px-4 py-3 hover:bg-primary-50 dark:hover:bg-primary-900/20 cursor-pointer transition-colors border-b border-gray-100 dark:border-gray-600 last:border-b-0" data-value="imagen-3">
137
+ <div class="flex items-center gap-3">
138
+ <div class="w-8 h-8 rounded-lg bg-gradient-to-br from-red-500 to-orange-500 flex items-center justify-center">
139
+ <i data-feather="camera" class="text-white w-4 h-4"></i>
140
+ </div>
141
+ <span class="font-medium text-gray-800 dark:text-gray-200">Imagen 3</span>
142
+ </div>
143
+ <button class="info-btn p-2 rounded-lg hover:bg-primary-200 dark:hover:bg-primary-800 transition-colors opacity-0 group-hover/item:opacity-100" data-model="imagen-3">
144
+ <i data-feather="info" class="w-4 h-4 text-primary-600 dark:text-primary-400"></i>
145
+ </button>
146
+ </div>
147
+
148
+ <!-- Adobe Firefly 3 -->
149
+ <div class="dropdown-item group/item flex items-center justify-between px-4 py-3 hover:bg-primary-50 dark:hover:bg-primary-900/20 cursor-pointer transition-colors border-b border-gray-100 dark:border-gray-600 last:border-b-0" data-value="firefly-3">
150
+ <div class="flex items-center gap-3">
151
+ <div class="w-8 h-8 rounded-lg bg-gradient-to-br from-yellow-500 to-amber-500 flex items-center justify-center">
152
+ <i data-feather="sun" class="text-white w-4 h-4"></i>
153
+ </div>
154
+ <span class="font-medium text-gray-800 dark:text-gray-200">Adobe Firefly 3</span>
155
+ </div>
156
+ <button class="info-btn p-2 rounded-lg hover:bg-primary-200 dark:hover:bg-primary-800 transition-colors opacity-0 group-hover/item:opacity-100" data-model="firefly-3">
157
+ <i data-feather="info" class="w-4 h-4 text-primary-600 dark:text-primary-400"></i>
158
+ </button>
159
+ </div>
160
+
161
+ <!-- Leonardo Phoenix -->
162
+ <div class="dropdown-item group/item flex items-center justify-between px-4 py-3 hover:bg-primary-50 dark:hover:bg-primary-900/20 cursor-pointer transition-colors" data-value="leonardo-phoenix">
163
+ <div class="flex items-center gap-3">
164
+ <div class="w-8 h-8 rounded-lg bg-gradient-to-br from-indigo-500 to-violet-500 flex items-center justify-center">
165
+ <i data-feather="zap" class="text-white w-4 h-4"></i>
166
+ </div>
167
+ <span class="font-medium text-gray-800 dark:text-gray-200">Leonardo Phoenix</span>
168
+ </div>
169
+ <button class="info-btn p-2 rounded-lg hover:bg-primary-200 dark:hover:bg-primary-800 transition-colors opacity-0 group-hover/item:opacity-100" data-model="leonardo-phoenix">
170
+ <i data-feather="info" class="w-4 h-4 text-primary-600 dark:text-primary-400"></i>
171
+ </button>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+
177
+ <!-- Selected Model Display -->
178
+ <div id="selectedDisplay" class="hidden mt-4 p-4 bg-gradient-to-r from-primary-50 to-secondary-50 dark:from-primary-900/20 dark:to-secondary-900/20 rounded-xl border border-primary-100 dark:border-primary-800">
179
+ <div class="flex items-center gap-3">
180
+ <div class="w-8 h-8 rounded-lg bg-primary-500 flex items-center justify-center">
181
+ <i data-feather="check" class="text-white w-4 h-4"></i>
182
+ </div>
183
+ <div>
184
+ <p class="text-sm text-gray-500 dark:text-gray-400">Selected Model</p>
185
+ <p id="selectedModelName" class="font-semibold text-gray-800 dark:text-white"></p>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ <!-- Additional Settings -->
191
+ <div class="mt-8 pt-6 border-t border-gray-100 dark:border-gray-700">
192
+ <h3 class="text-sm font-medium text-gray-700 dark:text-gray-300 mb-4">Quick Settings</h3>
193
+ <div class="grid grid-cols-2 gap-4">
194
+ <button class="p-3 rounded-xl border border-gray-200 dark:border-gray-600 hover:border-primary-300 dark:hover:border-primary-700 hover:bg-primary-50 dark:hover:bg-primary-900/10 transition-all text-left">
195
+ <i data-feather="sliders" class="w-4 h-4 text-primary-500 mb-2"></i>
196
+ <p class="text-sm font-medium text-gray-700 dark:text-gray-300">Advanced</p>
197
+ </button>
198
+ <button class="p-3 rounded-xl border border-gray-200 dark:border-gray-600 hover:border-secondary-300 dark:hover:border-secondary-700 hover:bg-secondary-50 dark:hover:bg-secondary-900/10 transition-all text-left">
199
+ <i data-feather="zap" class="w-4 h-4 text-secondary-500 mb-2"></i>
200
+ <p class="text-sm font-medium text-gray-700 dark:text-gray-300">Turbo Mode</p>
201
+ </button>
202
+ </div>
203
+ </div>
204
+ </div>
205
+ </div>
206
+
207
+ <!-- Modal/Dialog -->
208
+ <div id="modelModal" class="fixed inset-0 z-50 hidden">
209
+ <!-- Backdrop -->
210
+ <div class="absolute inset-0 bg-black/50 backdrop-blur-sm transition-opacity duration-300 opacity-0" id="modalBackdrop"></div>
211
+
212
+ <!-- Modal Content -->
213
+ <div class="absolute inset-0 flex items-center justify-center p-4">
214
+ <div class="bg-white dark:bg-gray-800 rounded-2xl shadow-2xl max-w-md w-full transform scale-95 opacity-0 transition-all duration-300" id="modalContent">
215
+ <!-- Modal Header -->
216
+ <div class="relative p-6 pb-4">
217
+ <div class="absolute top-4 right-4">
218
+ <button id="closeModal" class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">
219
+ <i data-feather="x" class="w-5 h-5 text-gray-500 dark:text-gray-400"></i>
220
+ </button>
221
+ </div>
222
+
223
+ <div class="flex items-center gap-4">
224
+ <div class="w-14 h-14 rounded-2xl bg-gradient-to-br from-primary-500 to-secondary-500 flex items-center justify-center shadow-lg shadow-primary-500/25">
225
+ <i data-feather="cpu" class="text-white w-7 h-7"></i>
226
+ </div>
227
+ <div>
228
+ <h3 id="modalTitle" class="text-xl font-bold text-gray-800 dark:text-white">Model Name</h3>
229
+ <span id="modalVersion" class="text-xs font-medium px-2 py-1 rounded-full bg-primary-100 dark:bg-primary-900 text-primary-600 dark:text-primary-400">v1.0</span>
230
+ </div>
231
+ </div>
232
+ </div>
233
+
234
+ <!-- Modal Body -->
235
+ <div class="px-6 pb-6">
236
+ <p id="modalDescription" class="text-gray-600 dark:text-gray-300 leading-relaxed mb-6">
237
+ Model description goes here...
238
+ </p>
239
+
240
+ <!-- Specs Grid -->
241
+ <div class="grid grid-cols-2 gap-3 mb-6">
242
+ <div class="p-3 bg-gray-50 dark:bg-gray-700/50 rounded-xl">
243
+ <p class="text-xs text-gray-500 dark:text-gray-400 mb-1">Resolution</p>
244
+ <p id="modalResolution" class="font-semibold text-gray-800 dark:text-white">1024×1024</p>
245
+ </div>
246
+ <div class="p-3 bg-gray-50 dark:bg-gray-700/50 rounded-xl">
247
+ <p class="text-xs text-gray-500 dark:text-gray-400 mb-1">Speed</p>
248
+ <p id="modalSpeed" class="font-semibold text-gray-800 dark:text-white">Fast</p>
249
+ </div>
250
+ <div class="p-3 bg-gray-50 dark:bg-gray-700/50 rounded-xl">
251
+ <p class="text-xs text-gray-500 dark:text-gray-400 mb-1">Style</p>
252
+ <p id="modalStyle" class="font-semibold text-gray-800 dark:text-white">Photorealistic</p>
253
+ </div>
254
+ <div class="p-3 bg-gray-50 dark:bg-gray-700/50 rounded-xl">
255
+ <p class="text-xs text-gray-500 dark:text-gray-400 mb-1">License</p>
256
+ <p id="modalLicense" class="font-semibold text-gray-800 dark:text-white">Commercial</p>
257
+ </div>
258
+ </div>
259
+
260
+ <!-- Tags -->
261
+ <div id="modalTags" class="flex flex-wrap gap-2">
262
+ <!-- Tags injected via JS -->
263
+ </div>
264
+ </div>
265
+
266
+ <!-- Modal Footer -->
267
+ <div class="px-6 pb-6 pt-2 flex gap-3">
268
+ <button id="useModelBtn" class="flex-1 bg-gradient-to-r from-primary-500 to-secondary-500 hover:from-primary-600 hover:to-secondary-600 text-white font-medium py-3 px-4 rounded-xl transition-all duration-200 shadow-lg shadow-primary-500/25 hover:shadow-primary-500/40 transform hover:-translate-y-0.5">
269
+ Use This Model
270
+ </button>
271
+ <button id="docsBtn" class="px-4 py-3 border border-gray-200 dark:border-gray-600 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors">
272
+ <i data-feather="external-link" class="w-5 h-5 text-gray-600 dark:text-gray-400"></i>
273
+ </button>
274
+ </div>
275
+ </div>
276
+ </div>
277
+ </div>
278
+
279
+ <!-- Theme Toggle -->
280
+ <button id="themeToggle" class="fixed bottom-6 right-6 p-3 rounded-full bg-white dark:bg-gray-800 shadow-lg border border-gray-200 dark:border-gray-700 hover:scale-110 transition-transform">
281
+ <i data-feather="sun" class="w-5 h-5 text-amber-500 hidden dark:block"></i>
282
+ <i data-feather="moon" class="w-5 h-5 text-primary-500 block dark:hidden"></i>
283
+ </button>
284
+
285
+ <script src="script.js"></script>
286
+ <script>feather.replace();</script>
287
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
288
  </body>
289
  </html>
script.js CHANGED
@@ -1,4 +1,286 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
 
2
- // This file is no longer needed as the application is now built with Vue 3 and Vuetify 3
3
- // All logic has been moved to app.js
4
- console.log('Legacy script.js - Vue 3 app is running from app.js');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Model data with descriptions and specs
2
+ const modelData = {
3
+ 'stable-diffusion-xl': {
4
+ name: 'Stable Diffusion XL',
5
+ version: 'SDXL 1.0',
6
+ description: 'Open-source latent diffusion model capable of generating photo-realistic images given any text input. Features enhanced composition and improved face generation with a native 1024×1024 resolution.',
7
+ resolution: '1024×1024',
8
+ speed: 'Medium',
9
+ style: 'Versatile',
10
+ license: 'Open Source',
11
+ tags: ['Open Source', 'Customizable', 'Local Run', 'Community']
12
+ },
13
+ 'dall-e-3': {
14
+ name: 'DALL-E 3',
15
+ version: 'Latest',
16
+ description: 'OpenAI\'s most advanced image generation model with exceptional prompt understanding and text rendering capabilities. Produces highly detailed, accurate images that closely follow complex prompts.',
17
+ resolution: '1024×1024',
18
+ speed: 'Fast',
19
+ style: 'Photorealistic',
20
+ license: 'Commercial',
21
+ tags: ['OpenAI', 'Text Rendering', 'API', 'Enterprise']
22
+ },
23
+ 'midjourney-v6': {
24
+ name: 'Midjourney V6',
25
+ version: 'Alpha',
26
+ description: 'Latest iteration with unprecedented realism, coherent text generation, and improved prompt accuracy. Known for stunning artistic quality and aesthetic appeal in generated imagery.',
27
+ resolution: 'Up to 2048×2048',
28
+ speed: 'Medium',
29
+ style: 'Artistic',
30
+ license: 'Commercial',
31
+ tags: ['Discord', 'Artistic', 'High Quality', 'Trending']
32
+ },
33
+ 'imagen-3': {
34
+ name: 'Imagen 3',
35
+ version: 'v3.0',
36
+ description: 'Google DeepMind\'s highest quality text-to-image model with exceptional detail, lighting, and fewer distracting artifacts. Excels at rendering text and following complex prompts.',
37
+ resolution: '1024×1024',
38
+ speed: 'Fast',
39
+ style: 'Photorealistic',
40
+ license: 'Commercial',
41
+ tags: ['Google', 'Safe', 'Reliable', 'Enterprise']
42
+ },
43
+ 'firefly-3': {
44
+ name: 'Adobe Firefly 3',
45
+ version: 'v3.0',
46
+ description: 'Adobe\'s creative generative AI designed for safe commercial use. Integrated with Creative Cloud, featuring structure reference and style reference for precise control.',
47
+ resolution: '1024×1024',
48
+ speed: 'Fast',
49
+ style: 'Commercial',
50
+ license: 'Commercial Safe',
51
+ tags: ['Adobe', 'Creative Cloud', 'Safe', 'Designers']
52
+ },
53
+ 'leonardo-phoenix': {
54
+ name: 'Leonardo Phoenix',
55
+ version: 'Phoenix',
56
+ description: 'Leonardo.ai\'s flagship model with exceptional coherence, prompt adherence, and native 1536×1536 resolution. Features Alchemy for premium quality enhancement.',
57
+ resolution: '1536×1536',
58
+ speed: 'Medium',
59
+ style: 'Game Assets',
60
+ license: 'Commercial',
61
+ tags: ['Gaming', 'Assets', 'Fine-tune', 'Community']
62
+ }
63
+ };
64
+ // DOM Elements
65
+ const dropdownTrigger = document.getElementById('dropdownTrigger');
66
+ const dropdownMenu = document.getElementById('dropdownMenu');
67
+ const dropdownArrow = document.getElementById('dropdownArrow');
68
+ const dropdownSelectedText = document.getElementById('dropdownSelectedText');
69
+ const customDropdown = document.getElementById('customDropdown');
70
+ const modal = document.getElementById('modelModal');
71
+ const modalBackdrop = document.getElementById('modalBackdrop');
72
+ const modalContent = document.getElementById('modalContent');
73
+ const closeModal = document.getElementById('closeModal');
74
+ const floatingLabel = document.getElementById('floatingLabel');
75
+ const selectedDisplay = document.getElementById('selectedDisplay');
76
+ const selectedModelName = document.getElementById('selectedModelName');
77
+ const themeToggle = document.getElementById('themeToggle');
78
+ // Modal content elements
79
+ const modalTitle = document.getElementById('modalTitle');
80
+ const modalVersion = document.getElementById('modalVersion');
81
+ const modalDescription = document.getElementById('modalDescription');
82
+ const modalResolution = document.getElementById('modalResolution');
83
+ const modalSpeed = document.getElementById('modalSpeed');
84
+ const modalStyle = document.getElementById('modalStyle');
85
+ const modalLicense = document.getElementById('modalLicense');
86
+ const modalTags = document.getElementById('modalTags');
87
+ // State
88
+ let currentModel = null;
89
+ let isDropdownOpen = false;
90
 
91
+ // Initialize
92
+ document.addEventListener('DOMContentLoaded', () => {
93
+ feather.replace();
94
+ initTheme();
95
+ initDropdown();
96
+ });
97
+ // Theme handling
98
+ function initTheme() {
99
+ const savedTheme = localStorage.getItem('theme') || 'light';
100
+ if (savedTheme === 'dark') {
101
+ document.documentElement.classList.add('dark');
102
+ }
103
+ }
104
+
105
+ themeToggle.addEventListener('click', () => {
106
+ document.documentElement.classList.toggle('dark');
107
+ const isDark = document.documentElement.classList.contains('dark');
108
+ localStorage.setItem('theme', isDark ? 'dark' : 'light');
109
+ feather.replace();
110
+ });
111
+ // Dropdown functions
112
+ function initDropdown() {
113
+ // Toggle dropdown on trigger click
114
+ dropdownTrigger.addEventListener('click', (e) => {
115
+ e.stopPropagation();
116
+ toggleDropdown();
117
+ });
118
+
119
+ // Handle dropdown item clicks
120
+ document.querySelectorAll('.dropdown-item').forEach(item => {
121
+ item.addEventListener('click', (e) => {
122
+ // Don't select if info button was clicked
123
+ if (e.target.closest('.info-btn')) {
124
+ e.stopPropagation();
125
+ return;
126
+ }
127
+
128
+ const value = item.dataset.value;
129
+ selectModel(value);
130
+ closeDropdown();
131
+ });
132
+ });
133
+
134
+ // Handle info button clicks
135
+ document.querySelectorAll('.info-btn').forEach(btn => {
136
+ btn.addEventListener('click', (e) => {
137
+ e.stopPropagation();
138
+ const modelKey = btn.dataset.model;
139
+ showModelInfo(modelKey);
140
+ });
141
+ });
142
+
143
+ // Close dropdown when clicking outside
144
+ document.addEventListener('click', (e) => {
145
+ if (isDropdownOpen && !customDropdown.contains(e.target)) {
146
+ closeDropdown();
147
+ }
148
+ });
149
+
150
+ // Close dropdown on escape key
151
+ document.addEventListener('keydown', (e) => {
152
+ if (e.key === 'Escape' && isDropdownOpen) {
153
+ closeDropdown();
154
+ }
155
+ });
156
+ }
157
+
158
+ function toggleDropdown() {
159
+ if (isDropdownOpen) {
160
+ closeDropdown();
161
+ } else {
162
+ openDropdown();
163
+ }
164
+ }
165
+
166
+ function openDropdown() {
167
+ isDropdownOpen = true;
168
+ dropdownMenu.classList.remove('opacity-0', 'invisible', 'scale-95');
169
+ dropdownMenu.classList.add('opacity-100', 'visible', 'scale-100');
170
+ dropdownArrow.classList.add('rotate-180');
171
+ dropdownTrigger.classList.add('ring-2', 'ring-primary-500', 'border-transparent');
172
+ }
173
+
174
+ function closeDropdown() {
175
+ isDropdownOpen = false;
176
+ dropdownMenu.classList.add('opacity-0', 'invisible', 'scale-95');
177
+ dropdownMenu.classList.remove('opacity-100', 'visible', 'scale-100');
178
+ dropdownArrow.classList.remove('rotate-180');
179
+ dropdownTrigger.classList.remove('ring-2', 'ring-primary-500', 'border-transparent');
180
+ }
181
+
182
+ function selectModel(value) {
183
+ currentModel = value;
184
+
185
+ if (value) {
186
+ // Show floating label
187
+ floatingLabel.classList.add('show-label');
188
+
189
+ // Update trigger text
190
+ const model = modelData[value];
191
+ dropdownSelectedText.textContent = model.name;
192
+ dropdownSelectedText.classList.add('text-gray-800', 'dark:text-white');
193
+
194
+ // Show selected display
195
+ selectedModelName.textContent = model.name;
196
+ selectedDisplay.classList.remove('hidden');
197
+ selectedDisplay.classList.add('selected-show');
198
+
199
+ // Add focus ring animation
200
+ dropdownTrigger.classList.add('focus-ring-animate');
201
+ setTimeout(() => {
202
+ dropdownTrigger.classList.remove('focus-ring-animate');
203
+ }, 300);
204
+ }
205
+ }
206
+
207
+ function showModelInfo(modelKey) {
208
+ const model = modelData[modelKey];
209
+ if (!model) return;
210
+
211
+ // Populate modal
212
+ modalTitle.textContent = model.name;
213
+ modalVersion.textContent = model.version;
214
+ modalDescription.textContent = model.description;
215
+ modalResolution.textContent = model.resolution;
216
+ modalSpeed.textContent = model.speed;
217
+ modalStyle.textContent = model.style;
218
+ modalLicense.textContent = model.license;
219
+
220
+ // Populate tags
221
+ modalTags.innerHTML = model.tags.map((tag, i) => `
222
+ <span class="px-3 py-1 text-xs font-medium rounded-full bg-gradient-to-r from-primary-100 to-secondary-100 dark:from-primary-900/50 dark:to-secondary-900/50 text-primary-700 dark:text-primary-300 border border-primary-200 dark:border-primary-800 tag-pop" style="animation-delay: ${i * 50}ms">
223
+ ${tag}
224
+ </span>
225
+ `).join('');
226
+
227
+ // Show modal
228
+ openModal();
229
+ }
230
+ // Modal functions
231
+ function openModal() {
232
+ modal.classList.remove('hidden');
233
+ // Trigger reflow
234
+ void modal.offsetWidth;
235
+
236
+ modalBackdrop.classList.remove('opacity-0');
237
+ modalContent.classList.remove('scale-95', 'opacity-0');
238
+ modalContent.classList.add('scale-100', 'opacity-100');
239
+ }
240
+
241
+ function closeModalFunc() {
242
+ modalBackdrop.classList.add('opacity-0');
243
+ modalContent.classList.remove('scale-100', 'opacity-100');
244
+ modalContent.classList.add('scale-95', 'opacity-0');
245
+
246
+ setTimeout(() => {
247
+ modal.classList.add('hidden');
248
+ }, 300);
249
+ }
250
+
251
+ // Close modal handlers
252
+ closeModal.addEventListener('click', closeModalFunc);
253
+ modalBackdrop.addEventListener('click', closeModalFunc);
254
+
255
+ // Close on escape key
256
+ document.addEventListener('keydown', (e) => {
257
+ if (e.key === 'Escape' && !modal.classList.contains('hidden')) {
258
+ closeModalFunc();
259
+ }
260
+ });
261
+
262
+ // Use model button
263
+ document.getElementById('useModelBtn').addEventListener('click', () => {
264
+ closeModalFunc();
265
+ // Add a subtle confirmation animation
266
+ modelSelect.parentElement.classList.add('focus-ring-animate');
267
+ setTimeout(() => {
268
+ modelSelect.parentElement.classList.remove('focus-ring-animate');
269
+ }, 300);
270
+ });
271
+
272
+ // Docs button
273
+ document.getElementById('docsBtn').addEventListener('click', () => {
274
+ const urls = {
275
+ 'stable-diffusion-xl': 'https://stability.ai/stable-diffusion',
276
+ 'dall-e-3': 'https://openai.com/dall-e-3',
277
+ 'midjourney-v6': 'https://www.midjourney.com',
278
+ 'imagen-3': 'https://deepmind.google/technologies/imagen-3/',
279
+ 'firefly-3': 'https://www.adobe.com/products/firefly.html',
280
+ 'leonardo-phoenix': 'https://leonardo.ai'
281
+ };
282
+
283
+ if (currentModel && urls[currentModel]) {
284
+ window.open(urls[currentModel], '_blank');
285
+ }
286
+ });
style.css CHANGED
@@ -1,6 +1,3 @@
1
- /* Import Vuetify styles */
2
- @import "https://unpkg.com/vuetify@3.4.0/dist/vuetify.min.css";
3
-
4
  /* Custom scrollbar */
5
  ::-webkit-scrollbar {
6
  width: 8px;
@@ -20,221 +17,197 @@
20
  background: #94a3b8;
21
  }
22
 
23
- /* Gradient text */
24
- .gradient-text {
25
- background: linear-gradient(135deg, #0ea5e9 0%, #d946ef 100%);
26
- -webkit-background-clip: text;
27
- -webkit-text-fill-color: transparent;
28
- background-clip: text;
29
- }
30
-
31
- /* Gradient avatar */
32
- .gradient-avatar {
33
- background: linear-gradient(135deg, #0ea5e9 0%, #d946ef 100%) !important;
34
- }
35
-
36
- /* Model selector button */
37
- .model-selector-btn {
38
- text-transform: none !important;
39
- letter-spacing: normal !important;
40
- font-weight: 400 !important;
41
- border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important;
42
- transition: all 0.2s ease !important;
43
- }
44
-
45
- .model-selector-btn:hover {
46
- border-color: rgb(var(--v-theme-primary)) !important;
47
- }
48
-
49
- .model-selector-btn.has-selection {
50
- border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important;
51
- }
52
-
53
- .dropdown-arrow {
54
- transition: transform 0.2s ease;
55
- }
56
-
57
- .model-selector-btn[aria-expanded="true"] .dropdown-arrow {
58
- transform: rotate(180deg);
59
- }
60
-
61
- /* Model dropdown list */
62
- .model-dropdown-list {
63
- min-width: 100%;
64
- }
65
-
66
- .model-list-item {
67
- transition: all 0.2s ease;
68
- position: relative;
69
- }
70
-
71
- .model-list-item::before {
72
- content: '';
73
- position: absolute;
74
- left: 0;
75
- top: 0;
76
- bottom: 0;
77
- width: 3px;
78
- background: linear-gradient(to bottom, #0ea5e9, #d946ef);
79
- opacity: 0;
80
- transition: opacity 0.2s ease;
81
  }
82
 
83
- .model-list-item:hover::before,
84
- .model-list-item--active::before {
85
- opacity: 1;
86
  }
87
 
88
- .model-list-item:hover,
89
- .model-list-item--active {
90
- background: rgba(var(--v-theme-primary), 0.08) !important;
91
  }
92
 
93
- /* Info button in dropdown */
94
- .info-btn {
95
- opacity: 0;
96
- transition: all 0.2s ease;
97
  }
98
 
99
- .model-list-item:hover .info-btn {
100
- opacity: 1;
 
101
  }
102
 
103
- .info-btn:hover {
104
- transform: scale(1.1);
 
105
  }
106
 
107
- /* Selected model sheet */
108
- .selected-model-sheet {
109
- animation: slideDown 0.3s ease-out;
110
  }
111
 
112
- @keyframes slideDown {
113
  from {
114
  opacity: 0;
115
- transform: translateY(-10px);
116
  }
117
  to {
118
  opacity: 1;
119
- transform: translateY(0);
120
  }
121
  }
122
 
123
- /* Settings buttons */
124
- .settings-btn {
125
- text-transform: none !important;
126
- letter-spacing: normal !important;
127
- border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important;
128
- transition: all 0.2s ease !important;
 
 
 
 
 
 
 
 
 
129
  }
130
 
131
- .settings-btn:hover {
132
- border-color: rgb(var(--v-theme-primary)) !important;
133
- background: rgba(var(--v-theme-primary), 0.04) !important;
134
  }
135
 
136
- /* Tag chips animation */
137
- .tag-chip {
138
- animation: tagPop 0.3s ease-out backwards;
 
 
 
 
 
139
  }
140
 
141
  @keyframes tagPop {
142
- 0% {
143
- transform: scale(0);
144
- opacity: 0;
145
- }
146
- 70% {
147
- transform: scale(1.1);
148
- }
149
- 100% {
150
- transform: scale(1);
151
- opacity: 1;
152
- }
153
  }
154
 
155
- /* Theme toggle */
156
- .theme-toggle {
157
- position: fixed !important;
158
- bottom: 24px;
159
- right: 24px;
160
- border-radius: 50% !important;
161
- transition: transform 0.2s ease !important;
162
  }
163
 
164
- .theme-toggle:hover {
165
- transform: scale(1.1) !important;
 
 
 
166
  }
167
 
168
- /* Dialog animations */
169
- .v-dialog-enter-active,
170
- .v-dialog-leave-active {
171
- transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
172
  }
173
 
174
- .v-dialog-enter-from,
175
- .v-dialog-leave-to {
176
- opacity: 0;
177
- transform: scale(0.95) translateY(10px);
 
 
 
 
178
  }
179
 
180
- /* Gap utility */
181
- .gap-3 {
182
- gap: 12px;
183
  }
184
 
185
- .gap-4 {
186
- gap: 16px;
187
  }
188
 
189
- /* Focus ring animation */
190
- .focus-ring-animate {
191
- animation: focusPulse 0.3s ease-out;
192
  }
193
 
194
- @keyframes focusPulse {
195
- 0% {
196
- box-shadow: 0 0 0 0 rgba(14, 165, 233, 0.4);
197
- }
198
- 100% {
199
- box-shadow: 0 0 0 4px rgba(14, 165, 233, 0);
200
- }
201
  }
202
 
203
- /* Button glow effect */
204
- .btn-glow:hover {
205
- box-shadow: 0 0 20px rgba(14, 165, 233, 0.4) !important;
 
 
 
 
 
 
 
206
  }
207
 
208
- /* Smooth transitions */
209
- .transition-smooth {
210
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
211
  }
212
 
213
- /* Glass effect */
214
- .glass {
215
- background: rgba(255, 255, 255, 0.7) !important;
216
- backdrop-filter: blur(10px);
217
- -webkit-backdrop-filter: blur(10px);
218
  }
219
 
220
- .v-theme--dark .glass {
221
- background: rgba(15, 23, 42, 0.7) !important;
222
  }
223
 
224
  /* Custom scrollbar for dropdown */
225
- .model-dropdown-list::-webkit-scrollbar {
226
  width: 6px;
227
  }
228
 
229
- .model-dropdown-list::-webkit-scrollbar-track {
230
  background: transparent;
 
231
  }
232
 
233
- .model-dropdown-list::-webkit-scrollbar-thumb {
234
  background: #cbd5e1;
235
  border-radius: 3px;
236
  }
237
 
238
- .v-theme--dark .model-dropdown-list::-webkit-scrollbar-thumb {
239
  background: #475569;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  }
 
 
 
 
1
  /* Custom scrollbar */
2
  ::-webkit-scrollbar {
3
  width: 8px;
 
17
  background: #94a3b8;
18
  }
19
 
20
+ .dark ::-webkit-scrollbar-thumb {
21
+ background: #475569;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  }
23
 
24
+ .dark ::-webkit-scrollbar-thumb:hover {
25
+ background: #64748b;
 
26
  }
27
 
28
+ /* Select styling enhancements */
29
+ select {
30
+ background-image: none !important;
31
  }
32
 
33
+ /* Focus ring animation */
34
+ .focus-ring-animate {
35
+ animation: focusPulse 0.3s ease-out;
 
36
  }
37
 
38
+ @keyframes focusPulse {
39
+ 0% { box-shadow: 0 0 0 0 rgba(14, 165, 233, 0.4); }
40
+ 100% { box-shadow: 0 0 0 4px rgba(14, 165, 233, 0); }
41
  }
42
 
43
+ /* Modal animations */
44
+ .modal-enter {
45
+ animation: modalIn 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards;
46
  }
47
 
48
+ .modal-exit {
49
+ animation: modalOut 0.2s ease-out forwards;
 
50
  }
51
 
52
+ @keyframes modalIn {
53
  from {
54
  opacity: 0;
55
+ transform: scale(0.95) translateY(10px);
56
  }
57
  to {
58
  opacity: 1;
59
+ transform: scale(1) translateY(0);
60
  }
61
  }
62
 
63
+ @keyframes modalOut {
64
+ from {
65
+ opacity: 1;
66
+ transform: scale(1) translateY(0);
67
+ }
68
+ to {
69
+ opacity: 0;
70
+ transform: scale(0.95) translateY(10px);
71
+ }
72
+ }
73
+
74
+ /* Gradient text animation */
75
+ .gradient-text-animate {
76
+ background-size: 200% auto;
77
+ animation: gradientShift 3s ease infinite;
78
  }
79
 
80
+ @keyframes gradientShift {
81
+ 0%, 100% { background-position: 0% center; }
82
+ 50% { background-position: 100% center; }
83
  }
84
 
85
+ /* Button hover glow */
86
+ .btn-glow:hover {
87
+ box-shadow: 0 0 20px rgba(14, 165, 233, 0.4);
88
+ }
89
+
90
+ /* Tag animation */
91
+ .tag-pop {
92
+ animation: tagPop 0.3s ease-out;
93
  }
94
 
95
  @keyframes tagPop {
96
+ 0% { transform: scale(0); opacity: 0; }
97
+ 70% { transform: scale(1.1); }
98
+ 100% { transform: scale(1); opacity: 1; }
 
 
 
 
 
 
 
 
99
  }
100
 
101
+ /* Smooth transitions */
102
+ .transition-smooth {
103
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
 
 
 
 
104
  }
105
 
106
+ /* Glass effect */
107
+ .glass {
108
+ background: rgba(255, 255, 255, 0.7);
109
+ backdrop-filter: blur(10px);
110
+ -webkit-backdrop-filter: blur(10px);
111
  }
112
 
113
+ .dark .glass {
114
+ background: rgba(15, 23, 42, 0.7);
 
 
115
  }
116
 
117
+ /* Custom select dropdown styling */
118
+ select option {
119
+ padding: 12px;
120
+ font-size: 14px;
121
+ }
122
+ /* Dropdown menu animations */
123
+ #dropdownMenu {
124
+ transform-origin: top;
125
  }
126
 
127
+ /* Info button in dropdown */
128
+ .info-btn {
129
+ transition: all 0.2s ease;
130
  }
131
 
132
+ .info-btn:hover {
133
+ transform: scale(1.1);
134
  }
135
 
136
+ .info-btn:active {
137
+ transform: scale(0.95);
 
138
  }
139
 
140
+ /* Dropdown item hover effects */
141
+ .dropdown-item {
142
+ position: relative;
 
 
 
 
143
  }
144
 
145
+ .dropdown-item::before {
146
+ content: '';
147
+ position: absolute;
148
+ left: 0;
149
+ top: 0;
150
+ bottom: 0;
151
+ width: 3px;
152
+ background: linear-gradient(to bottom, #0ea5e9, #d946ef);
153
+ opacity: 0;
154
+ transition: opacity 0.2s ease;
155
  }
156
 
157
+ .dropdown-item:hover::before {
158
+ opacity: 1;
 
159
  }
160
 
161
+ /* Dropdown arrow rotation */
162
+ #dropdownArrow {
163
+ transition: transform 0.2s ease;
 
 
164
  }
165
 
166
+ #dropdownArrow.rotate-180 {
167
+ transform: rotate(180deg);
168
  }
169
 
170
  /* Custom scrollbar for dropdown */
171
+ #dropdownMenu::-webkit-scrollbar {
172
  width: 6px;
173
  }
174
 
175
+ #dropdownMenu::-webkit-scrollbar-track {
176
  background: transparent;
177
+ border-radius: 0 8px 8px 0;
178
  }
179
 
180
+ #dropdownMenu::-webkit-scrollbar-thumb {
181
  background: #cbd5e1;
182
  border-radius: 3px;
183
  }
184
 
185
+ .dark #dropdownMenu::-webkit-scrollbar-thumb {
186
  background: #475569;
187
+ }
188
+
189
+ /* Dropdown trigger focus state */
190
+ #dropdownTrigger:focus,
191
+ #dropdownTrigger.ring-2 {
192
+ border-color: transparent;
193
+ }
194
+ /* Floating label show */
195
+ .show-label {
196
+ opacity: 1 !important;
197
+ }
198
+
199
+ /* Selected display animation */
200
+ .selected-show {
201
+ animation: slideDown 0.3s ease-out;
202
+ }
203
+
204
+ @keyframes slideDown {
205
+ from {
206
+ opacity: 0;
207
+ transform: translateY(-10px);
208
+ }
209
+ to {
210
+ opacity: 1;
211
+ transform: translateY(0);
212
+ }
213
  }