MateusFF commited on
Commit
050a659
·
verified ·
1 Parent(s): 3379a82

YOU MUST USE VUETIFY3 and VUE3. Do not use tailwindcss

Browse files
Files changed (4) hide show
  1. app.js +461 -0
  2. index.html +13 -278
  3. script.js +3 -285
  4. style.css +153 -126
app.js ADDED
@@ -0,0 +1,461 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { createApp, ref, computed, onMounted } from 'vue'
2
+ import { createVuetify } from 'vuetify'
3
+
4
+ const vuetify = createVuetify({
5
+ theme: {
6
+ defaultTheme: 'light',
7
+ themes: {
8
+ light: {
9
+ colors: {
10
+ primary: '#0ea5e9',
11
+ secondary: '#d946ef',
12
+ surface: '#ffffff',
13
+ background: '#f8fafc',
14
+ error: '#ef4444',
15
+ info: '#3b82f6',
16
+ success: '#22c55e',
17
+ warning: '#f59e0b',
18
+ }
19
+ },
20
+ dark: {
21
+ colors: {
22
+ primary: '#38bdf8',
23
+ secondary: '#e879f9',
24
+ surface: '#1e293b',
25
+ background: '#0f172a',
26
+ error: '#f87171',
27
+ info: '#60a5fa',
28
+ success: '#4ade80',
29
+ warning: '#fbbf24',
30
+ }
31
+ }
32
+ }
33
+ },
34
+ defaults: {
35
+ VBtn: {
36
+ variant: 'elevated',
37
+ rounded: 'lg',
38
+ },
39
+ VCard: {
40
+ rounded: 'xl',
41
+ elevation: 4,
42
+ },
43
+ VTextField: {
44
+ variant: 'outlined',
45
+ rounded: 'lg',
46
+ density: 'comfortable',
47
+ },
48
+ VSelect: {
49
+ variant: 'outlined',
50
+ rounded: 'lg',
51
+ density: 'comfortable',
52
+ },
53
+ VDialog: {
54
+ rounded: 'xl',
55
+ }
56
+ }
57
+ })
58
+
59
+ const modelData = {
60
+ 'stable-diffusion-xl': {
61
+ name: 'Stable Diffusion XL',
62
+ version: 'SDXL 1.0',
63
+ 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.',
64
+ resolution: '1024×1024',
65
+ speed: 'Medium',
66
+ style: 'Versatile',
67
+ license: 'Open Source',
68
+ tags: ['Open Source', 'Customizable', 'Local Run', 'Community'],
69
+ icon: 'mdi-cpu-64-bit',
70
+ color: 'cyan',
71
+ gradient: 'linear-gradient(135deg, #06b6d4 0%, #3b82f6 100%)'
72
+ },
73
+ 'dall-e-3': {
74
+ name: 'DALL-E 3',
75
+ version: 'Latest',
76
+ 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.',
77
+ resolution: '1024×1024',
78
+ speed: 'Fast',
79
+ style: 'Photorealistic',
80
+ license: 'Commercial',
81
+ tags: ['OpenAI', 'Text Rendering', 'API', 'Enterprise'],
82
+ icon: 'mdi-image',
83
+ color: 'green',
84
+ gradient: 'linear-gradient(135deg, #22c55e 0%, #10b981 100%)'
85
+ },
86
+ 'midjourney-v6': {
87
+ name: 'Midjourney V6',
88
+ version: 'Alpha',
89
+ description: 'Latest iteration with unprecedented realism, coherent text generation, and improved prompt accuracy. Known for stunning artistic quality and aesthetic appeal in generated imagery.',
90
+ resolution: 'Up to 2048×2048',
91
+ speed: 'Medium',
92
+ style: 'Artistic',
93
+ license: 'Commercial',
94
+ tags: ['Discord', 'Artistic', 'High Quality', 'Trending'],
95
+ icon: 'mdi-camera-iris',
96
+ color: 'purple',
97
+ gradient: 'linear-gradient(135deg, #a855f7 0%, #ec4899 100%)'
98
+ },
99
+ 'imagen-3': {
100
+ name: 'Imagen 3',
101
+ version: 'v3.0',
102
+ 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.',
103
+ resolution: '1024×1024',
104
+ speed: 'Fast',
105
+ style: 'Photorealistic',
106
+ license: 'Commercial',
107
+ tags: ['Google', 'Safe', 'Reliable', 'Enterprise'],
108
+ icon: 'mdi-camera',
109
+ color: 'red',
110
+ gradient: 'linear-gradient(135deg, #ef4444 0%, #f97316 100%)'
111
+ },
112
+ 'firefly-3': {
113
+ name: 'Adobe Firefly 3',
114
+ version: 'v3.0',
115
+ description: 'Adobe\'s creative generative AI designed for safe commercial use. Integrated with Creative Cloud, featuring structure reference and style reference for precise control.',
116
+ resolution: '1024×1024',
117
+ speed: 'Fast',
118
+ style: 'Commercial',
119
+ license: 'Commercial Safe',
120
+ tags: ['Adobe', 'Creative Cloud', 'Safe', 'Designers'],
121
+ icon: 'mdi-weather-sunny',
122
+ color: 'amber',
123
+ gradient: 'linear-gradient(135deg, #eab308 0%, #f59e0b 100%)'
124
+ },
125
+ 'leonardo-phoenix': {
126
+ name: 'Leonardo Phoenix',
127
+ version: 'Phoenix',
128
+ description: 'Leonardo.ai\'s flagship model with exceptional coherence, prompt adherence, and native 1536×1536 resolution. Features Alchemy for premium quality enhancement.',
129
+ resolution: '1536×1536',
130
+ speed: 'Medium',
131
+ style: 'Game Assets',
132
+ license: 'Commercial',
133
+ tags: ['Gaming', 'Assets', 'Fine-tune', 'Community'],
134
+ icon: 'mdi-lightning-bolt',
135
+ color: 'indigo',
136
+ gradient: 'linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)'
137
+ }
138
+ }
139
+
140
+ const modelUrls = {
141
+ 'stable-diffusion-xl': 'https://stability.ai/stable-diffusion',
142
+ 'dall-e-3': 'https://openai.com/dall-e-3',
143
+ 'midjourney-v6': 'https://www.midjourney.com',
144
+ 'imagen-3': 'https://deepmind.google/technologies/imagen-3/',
145
+ 'firefly-3': 'https://www.adobe.com/products/firefly.html',
146
+ 'leonardo-phoenix': 'https://leonardo.ai'
147
+ }
148
+
149
+ createApp({
150
+ setup() {
151
+ const theme = ref('light')
152
+ const selectedModel = ref(null)
153
+ const dialogOpen = ref(false)
154
+ const dialogModel = ref(null)
155
+
156
+ const modelOptions = computed(() => {
157
+ return Object.entries(modelData).map(([key, data]) => ({
158
+ key,
159
+ ...data
160
+ }))
161
+ })
162
+
163
+ const currentModelData = computed(() => {
164
+ return selectedModel.value ? modelData[selectedModel.value] : null
165
+ })
166
+
167
+ const toggleTheme = () => {
168
+ theme.value = theme.value === 'light' ? 'dark' : 'light'
169
+ }
170
+
171
+ const openModelInfo = (modelKey) => {
172
+ dialogModel.value = modelKey
173
+ dialogOpen.value = true
174
+ }
175
+
176
+ const useModel = () => {
177
+ if (dialogModel.value) {
178
+ selectedModel.value = dialogModel.value
179
+ dialogOpen.value = false
180
+ }
181
+ }
182
+
183
+ const openDocs = () => {
184
+ if (dialogModel.value && modelUrls[dialogModel.value]) {
185
+ window.open(modelUrls[dialogModel.value], '_blank')
186
+ }
187
+ }
188
+
189
+ const selectModelFromDropdown = (key) => {
190
+ selectedModel.value = key
191
+ }
192
+
193
+ return {
194
+ theme,
195
+ selectedModel,
196
+ dialogOpen,
197
+ dialogModel,
198
+ modelOptions,
199
+ currentModelData,
200
+ modelData,
201
+ modelUrls,
202
+ toggleTheme,
203
+ openModelInfo,
204
+ useModel,
205
+ openDocs,
206
+ selectModelFromDropdown
207
+ }
208
+ },
209
+ template: `
210
+ <v-app :theme="theme">
211
+ <v-main class="bg-background">
212
+ <v-container class="py-8" style="max-width: 900px;">
213
+ <!-- Header -->
214
+ <div class="text-center mb-8">
215
+ <h1 class="text-h3 font-weight-bold mb-2">
216
+ <span class="gradient-text">Model Intellect Hub</span>
217
+ <span class="ml-2">🔮</span>
218
+ </h1>
219
+ <p class="text-subtitle-1 text-medium-emphasis">
220
+ Explore AI models with intelligent insights
221
+ </p>
222
+ </div>
223
+
224
+ <!-- Main Card -->
225
+ <v-card class="pa-6 pa-md-8">
226
+ <!-- Card Header -->
227
+ <div class="d-flex align-center gap-3 mb-6">
228
+ <v-avatar size="48" class="gradient-avatar">
229
+ <v-icon icon="mdi-image" color="white" size="24"></v-icon>
230
+ </v-avatar>
231
+ <div>
232
+ <h2 class="text-h6 font-weight-semibold">Image Generation Model</h2>
233
+ <p class="text-body-2 text-medium-emphasis">Configure your AI image generation settings</p>
234
+ </div>
235
+ </div>
236
+
237
+ <!-- Model Selector -->
238
+ <div class="mb-4">
239
+ <label class="text-subtitle-2 font-weight-medium mb-2 d-block">Select Model</label>
240
+
241
+ <!-- Custom Dropdown -->
242
+ <v-menu location="bottom" :close-on-content-click="true" offset="8">
243
+ <template v-slot:activator="{ props }">
244
+ <v-btn
245
+ v-bind="props"
246
+ variant="outlined"
247
+ class="model-selector-btn w-100 justify-space-between"
248
+ height="56"
249
+ :class="{ 'has-selection': selectedModel }"
250
+ >
251
+ <span v-if="!selectedModel" class="text-medium-emphasis">Choose a model...</span>
252
+ <span v-else class="d-flex align-center gap-3">
253
+ <v-avatar size="32" :style="{ background: modelData[selectedModel].gradient }">
254
+ <v-icon :icon="modelData[selectedModel].icon" color="white" size="18"></v-icon>
255
+ </v-avatar>
256
+ {{ modelData[selectedModel].name }}
257
+ </span>
258
+ <v-icon icon="mdi-chevron-down" class="dropdown-arrow"></v-icon>
259
+ </v-btn>
260
+ </template>
261
+
262
+ <v-list class="model-dropdown-list py-2" rounded="lg" elevation="4">
263
+ <v-list-item
264
+ v-for="option in modelOptions"
265
+ :key="option.key"
266
+ @click="selectModelFromDropdown(option.key)"
267
+ class="model-list-item px-4 py-3"
268
+ :active="selectedModel === option.key"
269
+ >
270
+ <template v-slot:prepend>
271
+ <v-avatar size="36" :style="{ background: option.gradient }" class="mr-3">
272
+ <v-icon :icon="option.icon" color="white" size="20"></v-icon>
273
+ </v-avatar>
274
+ </template>
275
+ <v-list-item-title class="font-weight-medium">
276
+ {{ option.name }}
277
+ </v-list-item-title>
278
+ <template v-slot:append>
279
+ <v-btn
280
+ icon="mdi-information"
281
+ variant="text"
282
+ size="small"
283
+ color="primary"
284
+ class="info-btn"
285
+ @click.stop="openModelInfo(option.key)"
286
+ ></v-btn>
287
+ </template>
288
+ </v-list-item>
289
+ </v-list>
290
+ </v-menu>
291
+ </div>
292
+
293
+ <!-- Selected Model Display -->
294
+ <v-expand-transition>
295
+ <div v-if="selectedModel" class="mt-4">
296
+ <v-sheet
297
+ class="selected-model-sheet pa-4 rounded-xl"
298
+ color="primary"
299
+ variant="tonal"
300
+ >
301
+ <div class="d-flex align-center gap-3">
302
+ <v-avatar size="40" color="primary">
303
+ <v-icon icon="mdi-check" color="white" size="20"></v-icon>
304
+ </v-avatar>
305
+ <div>
306
+ <p class="text-caption text-medium-emphasis mb-0">Selected Model</p>
307
+ <p class="text-subtitle-1 font-weight-semibold mb-0">{{ currentModelData.name }}</p>
308
+ </div>
309
+ </div>
310
+ </v-sheet>
311
+ </div>
312
+ </v-expand-transition>
313
+
314
+ <!-- Quick Settings -->
315
+ <v-divider class="my-6"></v-divider>
316
+
317
+ <h3 class="text-subtitle-2 font-weight-medium mb-4">Quick Settings</h3>
318
+
319
+ <div class="d-flex gap-4">
320
+ <v-btn
321
+ variant="outlined"
322
+ class="settings-btn flex-grow-1 justify-start text-left"
323
+ height="72"
324
+ rounded="xl"
325
+ >
326
+ <div>
327
+ <v-icon icon="mdi-tune" color="primary" size="20" class="mb-2"></v-icon>
328
+ <p class="text-body-2 font-weight-medium mb-0">Advanced</p>
329
+ </div>
330
+ </v-btn>
331
+
332
+ <v-btn
333
+ variant="outlined"
334
+ class="settings-btn flex-grow-1 justify-start text-left"
335
+ height="72"
336
+ rounded="xl"
337
+ >
338
+ <div>
339
+ <v-icon icon="mdi-lightning-bolt" color="secondary" size="20" class="mb-2"></v-icon>
340
+ <p class="text-body-2 font-weight-medium mb-0">Turbo Mode</p>
341
+ </div>
342
+ </v-btn>
343
+ </div>
344
+ </v-card>
345
+ </v-container>
346
+
347
+ <!-- Model Info Dialog -->
348
+ <v-dialog v-model="dialogOpen" max-width="480" scrollable>
349
+ <v-card v-if="dialogModel">
350
+ <v-card-item>
351
+ <template v-slot:prepend>
352
+ <v-avatar size="56" :style="{ background: modelData[dialogModel].gradient }" class="mr-4">
353
+ <v-icon :icon="modelData[dialogModel].icon" color="white" size="28"></v-icon>
354
+ </v-avatar>
355
+ </template>
356
+ <v-card-title class="text-h5 font-weight-bold pa-0">
357
+ {{ modelData[dialogModel].name }}
358
+ </v-card-title>
359
+ <template v-slot:append>
360
+ <v-btn
361
+ icon="mdi-close"
362
+ variant="text"
363
+ @click="dialogOpen = false"
364
+ ></v-btn>
365
+ </template>
366
+ </v-card-item>
367
+
368
+ <v-chip
369
+ size="small"
370
+ color="primary"
371
+ variant="tonal"
372
+ class="ml-4 mb-4"
373
+ >
374
+ {{ modelData[dialogModel].version }}
375
+ </v-chip>
376
+
377
+ <v-card-text>
378
+ <p class="text-body-1 text-medium-emphasis mb-6">
379
+ {{ modelData[dialogModel].description }}
380
+ </p>
381
+
382
+ <!-- Specs Grid -->
383
+ <v-row class="mb-6">
384
+ <v-col cols="6">
385
+ <v-sheet class="pa-3 rounded-lg" color="surface-variant">
386
+ <p class="text-caption text-medium-emphasis mb-1">Resolution</p>
387
+ <p class="text-body-2 font-weight-semibold">{{ modelData[dialogModel].resolution }}</p>
388
+ </v-sheet>
389
+ </v-col>
390
+ <v-col cols="6">
391
+ <v-sheet class="pa-3 rounded-lg" color="surface-variant">
392
+ <p class="text-caption text-medium-emphasis mb-1">Speed</p>
393
+ <p class="text-body-2 font-weight-semibold">{{ modelData[dialogModel].speed }}</p>
394
+ </v-sheet>
395
+ </v-col>
396
+ <v-col cols="6">
397
+ <v-sheet class="pa-3 rounded-lg" color="surface-variant">
398
+ <p class="text-caption text-medium-emphasis mb-1">Style</p>
399
+ <p class="text-body-2 font-weight-semibold">{{ modelData[dialogModel].style }}</p>
400
+ </v-sheet>
401
+ </v-col>
402
+ <v-col cols="6">
403
+ <v-sheet class="pa-3 rounded-lg" color="surface-variant">
404
+ <p class="text-caption text-medium-emphasis mb-1">License</p>
405
+ <p class="text-body-2 font-weight-semibold">{{ modelData[dialogModel].license }}</p>
406
+ </v-sheet>
407
+ </v-col>
408
+ </v-row>
409
+
410
+ <!-- Tags -->
411
+ <div class="d-flex flex-wrap gap-2">
412
+ <v-chip
413
+ v-for="(tag, index) in modelData[dialogModel].tags"
414
+ :key="index"
415
+ size="small"
416
+ color="primary"
417
+ variant="tonal"
418
+ class="tag-chip"
419
+ :style="{ animationDelay: index * 50 + 'ms' }"
420
+ >
421
+ {{ tag }}
422
+ </v-chip>
423
+ </div>
424
+ </v-card-text>
425
+
426
+ <v-card-actions class="pa-6 pt-2">
427
+ <v-btn
428
+ color="primary"
429
+ variant="elevated"
430
+ class="flex-grow-1"
431
+ height="48"
432
+ @click="useModel"
433
+ >
434
+ Use This Model
435
+ </v-btn>
436
+ <v-btn
437
+ variant="outlined"
438
+ icon="mdi-open-in-new"
439
+ @click="openDocs"
440
+ ></v-btn>
441
+ </v-card-actions>
442
+ </v-card>
443
+ </v-dialog>
444
+
445
+ <!-- Theme Toggle -->
446
+ <v-btn
447
+ icon
448
+ class="theme-toggle"
449
+ size="large"
450
+ elevation="4"
451
+ @click="toggleTheme"
452
+ >
453
+ <v-icon :icon="theme === 'light' ? 'mdi-weather-sunny' : 'mdi-weather-night'"
454
+ :color="theme === 'light' ? 'amber' : 'primary'"></v-icon>
455
+ </v-btn>
456
+ </v-main>
457
+ </v-app>
458
+ `
459
+ })
460
+ .use(vuetify)
461
+ .mount('#app')
index.html CHANGED
@@ -4,286 +4,21 @@
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>
 
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>
script.js CHANGED
@@ -1,286 +1,4 @@
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
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
style.css CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  /* Custom scrollbar */
2
  ::-webkit-scrollbar {
3
  width: 8px;
@@ -17,197 +20,221 @@
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
  }
 
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
  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
  }