moreiraj93 commited on
Commit
f058db1
·
verified ·
1 Parent(s): 7c4873d

MAKE EVERYTHING FUNCTIONAL USE OPEN HUGGING FACE MODELS FOR THE IMAGE TO IMAGE

Browse files
Files changed (4) hide show
  1. components/image-processor.js +347 -0
  2. components/navbar.js +1 -3
  3. gallery.html +161 -2
  4. index.html +1 -2
components/image-processor.js ADDED
@@ -0,0 +1,347 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ```javascript
2
+ class ImageProcessor extends HTMLElement {
3
+ constructor() {
4
+ super();
5
+ this.selectedModel = 'prompthero/openjourney';
6
+ this.uploadedImage = null;
7
+ }
8
+
9
+ connectedCallback() {
10
+ this.render();
11
+ this.attachEventListeners();
12
+ }
13
+
14
+ render() {
15
+ this.innerHTML = `
16
+ <style>
17
+ .processor-container {
18
+ max-width: 1200px;
19
+ margin: 0 auto;
20
+ padding: 20px;
21
+ }
22
+ .model-selector {
23
+ display: flex;
24
+ gap: 15px;
25
+ margin-bottom: 30px;
26
+ flex-wrap: wrap;
27
+ }
28
+ .model-option {
29
+ padding: 15px;
30
+ border: 2px solid #e5e7eb;
31
+ border-radius: 8px;
32
+ cursor: pointer;
33
+ flex: 1;
34
+ min-width: 200px;
35
+ text-align: center;
36
+ transition: all 0.3s;
37
+ }
38
+ .model-option:hover {
39
+ border-color: #3b82f6;
40
+ }
41
+ .model-option.active {
42
+ border-color: #3b82f6;
43
+ background-color: #dbeafe;
44
+ }
45
+ .upload-area {
46
+ border: 2px dashed #d1d5db;
47
+ border-radius: 8px;
48
+ padding: 40px;
49
+ text-align: center;
50
+ margin-bottom: 30px;
51
+ position: relative;
52
+ }
53
+ .upload-area.drag-over {
54
+ border-color: #3b82f6;
55
+ background-color: #eff6ff;
56
+ }
57
+ .preview-container {
58
+ display: flex;
59
+ gap: 30px;
60
+ flex-wrap: wrap;
61
+ }
62
+ .image-preview {
63
+ flex: 1;
64
+ min-width: 300px;
65
+ }
66
+ .preview-image {
67
+ max-width: 100%;
68
+ max-height: 400px;
69
+ display: block;
70
+ margin: 0 auto;
71
+ border-radius: 8px;
72
+ }
73
+ .controls {
74
+ margin: 20px 0;
75
+ }
76
+ .prompt-input {
77
+ width: 100%;
78
+ padding: 12px;
79
+ border: 1px solid #d1d5db;
80
+ border-radius: 6px;
81
+ margin-bottom: 15px;
82
+ }
83
+ .process-btn {
84
+ background-color: #10b981;
85
+ color: white;
86
+ border: none;
87
+ padding: 12px 24px;
88
+ border-radius: 6px;
89
+ cursor: pointer;
90
+ font-weight: bold;
91
+ width: 100%;
92
+ }
93
+ .process-btn:hover:not(:disabled) {
94
+ background-color: #059669;
95
+ }
96
+ .process-btn:disabled {
97
+ background-color: #9ca3af;
98
+ cursor: not-allowed;
99
+ }
100
+ .result-container {
101
+ position: relative;
102
+ min-height: 400px;
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: center;
106
+ }
107
+ .processing-overlay {
108
+ position: absolute;
109
+ top: 0;
110
+ left: 0;
111
+ right: 0;
112
+ bottom: 0;
113
+ background-color: rgba(255, 255, 255, 0.8);
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ flex-direction: column;
118
+ z-index: 10;
119
+ }
120
+ .spinner {
121
+ border: 4px solid #f3f3f3;
122
+ border-top: 4px solid #3b82f6;
123
+ border-radius: 50%;
124
+ width: 40px;
125
+ height: 40px;
126
+ animation: spin 1s linear infinite;
127
+ margin-bottom: 15px;
128
+ }
129
+ @keyframes spin {
130
+ 0% { transform: rotate(0deg); }
131
+ 100% { transform: rotate(360deg); }
132
+ }
133
+ .action-buttons {
134
+ display: flex;
135
+ gap: 15px;
136
+ margin-top: 20px;
137
+ }
138
+ .action-btn {
139
+ flex: 1;
140
+ padding: 12px;
141
+ border: none;
142
+ border-radius: 6px;
143
+ font-weight: bold;
144
+ cursor: pointer;
145
+ }
146
+ .download-btn {
147
+ background-color: #3b82f6;
148
+ color: white;
149
+ }
150
+ .save-btn {
151
+ background-color: #ef4444;
152
+ color: white;
153
+ }
154
+ .action-btn:disabled {
155
+ background-color: #9ca3af;
156
+ cursor: not-allowed;
157
+ }
158
+ </style>
159
+ <div class="processor-container">
160
+ <h2>AI Image Processor</h2>
161
+
162
+ <div class="model-selector">
163
+ <div class="model-option active" data-model="prompthero/openjourney">
164
+ <h3>Artistic Style Transfer</h3>
165
+ <p>Apply artistic styles to your images</p>
166
+ </div>
167
+ <div class="model-option" data-model="stabilityai/stable-diffusion-x4-upscaler">
168
+ <h3>Super Resolution</h3>
169
+ <p>Enhance image resolution and details</p>
170
+ </div>
171
+ <div class="model-option" data-model="lllyasviel/sd-controlnet-canny">
172
+ <h3>Edge Enhancement</h3>
173
+ <p>Transform images using edge detection</p>
174
+ </div>
175
+ </div>
176
+
177
+ <div class="upload-area" id="drop-zone">
178
+ <p>Drag & drop your image here or click to browse</p>
179
+ <input type="file" id="file-input" accept="image/*" style="display: none;">
180
+ <button id="browse-btn">Select Image</button>
181
+ <img id="preview" class="preview-image" style="display: none; margin-top: 20px;">
182
+ </div>
183
+
184
+ <div class="preview-container">
185
+ <div class="image-preview">
186
+ <h3>Input Image</h3>
187
+ <div id="input-preview" class="result-container">
188
+ <p>No image selected</p>
189
+ </div>
190
+ </div>
191
+
192
+ <div class="image-preview">
193
+ <h3>Processed Result</h3>
194
+ <div id="output-preview" class="result-container">
195
+ <p>Processed image will appear here</p>
196
+ </div>
197
+ </div>
198
+ </div>
199
+ </div>
200
+ `;
201
+ }
202
+
203
+ attachEventListeners() {
204
+ // Model selection
205
+ const modelOptions = this.querySelectorAll('.model-option');
206
+ modelOptions.forEach(option => {
207
+ option.addEventListener('click', (e) => {
208
+ modelOptions.forEach(opt => opt.classList.remove('active'));
209
+ e.currentTarget.classList.add('active');
210
+ this.selectedModel = e.currentTarget.dataset.model;
211
+ });
212
+ });
213
+
214
+ // File upload
215
+ const dropZone = this.querySelector('#drop-zone');
216
+ const fileInput = this.querySelector('#file-input');
217
+ const browseBtn = this.querySelector('#browse-btn');
218
+ const preview = this.querySelector('#preview');
219
+
220
+ browseBtn.addEventListener('click', () => fileInput.click());
221
+
222
+ fileInput.addEventListener('change', (e) => {
223
+ if (e.target.files.length) {
224
+ this.handleFile(e.target.files[0]);
225
+ }
226
+ });
227
+
228
+ // Drag and drop events
229
+ dropZone.addEventListener('dragover', (e) => {
230
+ e.preventDefault();
231
+ dropZone.classList.add('drag-over');
232
+ });
233
+
234
+ dropZone.addEventListener('dragleave', () => {
235
+ dropZone.classList.remove('drag-over');
236
+ });
237
+
238
+ dropZone.addEventListener('drop', (e) => {
239
+ e.preventDefault();
240
+ dropZone.classList.remove('drag-over');
241
+ if (e.dataTransfer.files.length) {
242
+ this.handleFile(e.dataTransfer.files[0]);
243
+ }
244
+ });
245
+ }
246
+
247
+ handleFile(file) {
248
+ if (!file.type.match('image.*')) {
249
+ alert('Please select an image file');
250
+ return;
251
+ }
252
+
253
+ const reader = new FileReader();
254
+ reader.onload = (e) => {
255
+ this.uploadedImage = e.target.result;
256
+ this.updatePreview();
257
+ };
258
+ reader.readAsDataURL(file);
259
+ }
260
+
261
+ updatePreview() {
262
+ const inputPreview = this.querySelector('#input-preview');
263
+ inputPreview.innerHTML = `<img src="${this.uploadedImage}" class="preview-image">`;
264
+ }
265
+
266
+ async processImage(prompt) {
267
+ if (!this.uploadedImage) {
268
+ alert('Please upload an image first');
269
+ return;
270
+ }
271
+
272
+ const outputPreview = this.querySelector('#output-preview');
273
+ outputPreview.innerHTML = `
274
+ <div class="processing-overlay">
275
+ <div class="spinner"></div>
276
+ <p>Processing image...</p>
277
+ </div>
278
+ <img src="${this.uploadedImage}" class="preview-image" style="opacity: 0.3;">
279
+ `;
280
+
281
+ try {
282
+ // Convert base64 to blob
283
+ const imageData = this.uploadedImage.split(',')[1];
284
+ const byteString = atob(imageData);
285
+ const mimeString = this.uploadedImage.split(',')[0].split(':')[1].split(';')[0];
286
+ const ab = new ArrayBuffer(byteString.length);
287
+ const ia = new Uint8Array(ab);
288
+
289
+ for (let i = 0; i < byteString.length; i++) {
290
+ ia[i] = byteString.charCodeAt(i);
291
+ }
292
+
293
+ const blob = new Blob([ab], {type: mimeString});
294
+
295
+ // Prepare form data
296
+ const formData = new FormData();
297
+ formData.append('inputs', prompt);
298
+ formData.append('image', blob, 'input.png');
299
+
300
+ // Call Hugging Face API
301
+ const response = await fetch(
302
+ `https://api-inference.huggingface.co/models/${this.selectedModel}`,
303
+ {
304
+ headers: {
305
+ 'Authorization': 'Bearer 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'
306
+ },
307
+ method: 'POST',
308
+ body: formData
309
+ }
310
+ );
311
+
312
+ if (!response.ok) {
313
+ throw new Error(`API error: ${response.status}`);
314
+ }
315
+
316
+ const blobResult = await response.blob();
317
+ const imageUrl = URL.createObjectURL(blobResult);
318
+
319
+ // Display result
320
+ outputPreview.innerHTML = `
321
+ <img src="${imageUrl}" class="preview-image">
322
+ <div class="action-buttons">
323
+ <button class="action-btn download-btn" onclick="this.downloadImage('${imageUrl}')">Download</button>
324
+ <button class="action-btn save-btn">Save to Gallery</button>
325
+ </div>
326
+ `;
327
+ } catch (error) {
328
+ console.error('Error processing image:', error);
329
+ outputPreview.innerHTML = `
330
+ <p>Error processing image. Please try again.</p>
331
+ <img src="${this.uploadedImage}" class="preview-image" style="opacity: 0.3;">
332
+ `;
333
+ }
334
+ }
335
+
336
+ downloadImage(url) {
337
+ const link = document.createElement('a');
338
+ link.href = url;
339
+ link.download = 'processed-image.png';
340
+ document.body.appendChild(link);
341
+ link.click();
342
+ document.body.removeChild(link);
343
+ }
344
+ }
345
+
346
+ customElements.define('image-processor', ImageProcessor);
347
+ >>>>>>> REPLACE
components/navbar.js CHANGED
@@ -83,7 +83,6 @@ class CustomNavbar extends HTMLElement {
83
  <button class="mobile-menu-btn">
84
  <i data-feather="menu"></i>
85
  </button>
86
-
87
  <ul class="nav-links">
88
  <li><a href="index.html"><i data-feather="home"></i> Home</a></li>
89
  <li><a href="gallery.html"><i data-feather="grid"></i> Gallery</a></li>
@@ -91,8 +90,7 @@ class CustomNavbar extends HTMLElement {
91
  <li><a href="marketplace.html"><i data-feather="shopping-bag"></i> Marketplace</a></li>
92
  <li><a href="about.html"><i data-feather="info"></i> About</a></li>
93
  </ul>
94
-
95
- <div class="user-actions">
96
  <button id="darkModeToggle" class="dark-mode-toggle">
97
  <i data-feather="moon"></i>
98
  </button>
 
83
  <button class="mobile-menu-btn">
84
  <i data-feather="menu"></i>
85
  </button>
 
86
  <ul class="nav-links">
87
  <li><a href="index.html"><i data-feather="home"></i> Home</a></li>
88
  <li><a href="gallery.html"><i data-feather="grid"></i> Gallery</a></li>
 
90
  <li><a href="marketplace.html"><i data-feather="shopping-bag"></i> Marketplace</a></li>
91
  <li><a href="about.html"><i data-feather="info"></i> About</a></li>
92
  </ul>
93
+ <div class="user-actions">
 
94
  <button id="darkModeToggle" class="dark-mode-toggle">
95
  <i data-feather="moon"></i>
96
  </button>
gallery.html CHANGED
@@ -30,6 +30,165 @@
30
  <option>Portrait</option>
31
  <option>Landscape</option>
32
  <option>Concept Art</option>
33
- <option>Digital Painting</option{"ok":false,"message":"Request timeout: The AI model took too long to respond. Please try again with a simpler prompt or try a different model."}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  </body>
35
- </html>
 
30
  <option>Portrait</option>
31
  <option>Landscape</option>
32
  <option>Concept Art</option>
33
+ <option>Digital Painting</option>
34
+ </select>
35
+ <i data-feather="chevron-down" class="absolute right-3 top-2.5 text-gray-400"></i>
36
+ </div>
37
+ </div>
38
+ </div>
39
+
40
+ <!-- Gallery Grid -->
41
+ <div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
42
+ <!-- Gallery Item 1 -->
43
+ <div class="gallery-item bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
44
+ <div class="h-64 overflow-hidden">
45
+ <img src="http://static.photos/abstract/640x360/201" alt="AI Artwork" class="w-full h-full object-cover">
46
+ </div>
47
+ <div class="p-4">
48
+ <h3 class="font-bold text-gray-900 dark:text-white mb-1">Digital Dreams</h3>
49
+ <p class="text-gray-600 dark:text-gray-300 text-sm mb-3">By AI Artist Pro</p>
50
+ <div class="flex justify-between items-center">
51
+ <span class="text-accent-blue font-bold">$120</span>
52
+ <button class="bg-accent-blue hover:bg-blue-600 text-white py-1 px-3 rounded-full text-sm transition-colors">
53
+ <i data-feather="heart" class="w-4 h-4"></i>
54
+ </button>
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ <!-- Gallery Item 2 -->
60
+ <div class="gallery-item bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
61
+ <div class="h-64 overflow-hidden">
62
+ <img src="http://static.photos/nature/640x360/202" alt="AI Artwork" class="w-full h-full object-cover">
63
+ </div>
64
+ <div class="p-4">
65
+ <h3 class="font-bold text-gray-900 dark:text-white mb-1">Forest Awakening</h3>
66
+ <p class="text-gray-600 dark:text-gray-300 text-sm mb-3">By NatureGPT</p>
67
+ <div class="flex justify-between items-center">
68
+ <span class="text-accent-blue font-bold">$95</span>
69
+ <button class="bg-accent-blue hover:bg-blue-600 text-white py-1 px-3 rounded-full text-sm transition-colors">
70
+ <i data-feather="heart" class="w-4 h-4"></i>
71
+ </button>
72
+ </div>
73
+ </div>
74
+ </div>
75
+
76
+ <!-- Gallery Item 3 -->
77
+ <div class="gallery-item bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
78
+ <div class="h-64 overflow-hidden">
79
+ <img src="http://static.photos/people/640x360/203" alt="AI Artwork" class="w-full h-full object-cover">
80
+ </div>
81
+ <div class="p-4">
82
+ <h3 class="font-bold text-gray-900 dark:text-white mb-1">Urban Portrait</h3>
83
+ <p class="text-gray-600 dark:text-gray-300 text-sm mb-3">By CityScape AI</p>
84
+ <div class="flex justify-between items-center">
85
+ <span class="text-accent-blue font-bold">$150</span>
86
+ <button class="bg-accent-blue hover:bg-blue-600 text-white py-1 px-3 rounded-full text-sm transition-colors">
87
+ <i data-feather="heart" class="w-4 h-4"></i>
88
+ </button>
89
+ </div>
90
+ </div>
91
+ </div>
92
+
93
+ <!-- Gallery Item 4 -->
94
+ <div class="gallery-item bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
95
+ <div class="h-64 overflow-hidden">
96
+ <img src="http://static.photos/technology/640x360/204" alt="AI Artwork" class="w-full h-full object-cover">
97
+ </div>
98
+ <div class="p-4">
99
+ <h3 class="font-bold text-gray-900 dark:text-white mb-1">Cybernetic Vision</h3>
100
+ <p class="text-gray-600 dark:text-gray-300 text-sm mb-3">By TechArtist</p>
101
+ <div class="flex justify-between items-center">
102
+ <span class="text-accent-blue font-bold">$200</span>
103
+ <button class="bg-accent-blue hover:bg-blue-600 text-white py-1 px-3 rounded-full text-sm transition-colors">
104
+ <i data-feather="heart" class="w-4 h-4"></i>
105
+ </button>
106
+ </div>
107
+ </div>
108
+ </div>
109
+
110
+ <!-- Gallery Item 5 -->
111
+ <div class="gallery-item bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
112
+ <div class="h-64 overflow-hidden">
113
+ <img src="http://static.photos/abstract/640x360/205" alt="AI Artwork" class="w-full h-full object-cover">
114
+ </div>
115
+ <div class="p-4">
116
+ <h3 class="font-bold text-gray-900 dark:text-white mb-1">Geometric Harmony</h3>
117
+ <p class="text-gray-600 dark:text-gray-300 text-sm mb-3">By ShapeShifter AI</p>
118
+ <div class="flex justify-between items-center">
119
+ <span class="text-accent-blue font-bold">$85</span>
120
+ <button class="bg-accent-blue hover:bg-blue-600 text-white py-1 px-3 rounded-full text-sm transition-colors">
121
+ <i data-feather="heart" class="w-4 h-4"></i>
122
+ </button>
123
+ </div>
124
+ </div>
125
+ </div>
126
+
127
+ <!-- Gallery Item 6 -->
128
+ <div class="gallery-item bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
129
+ <div class="h-64 overflow-hidden">
130
+ <img src="http://static.photos/minimal/640x360/206" alt="AI Artwork" class="w-full h-full object-cover">
131
+ </div>
132
+ <div class="p-4">
133
+ <h3 class="font-bold text-gray-900 dark:text-white mb-1">Minimal Essence</h3>
134
+ <p class="text-gray-600 dark:text-gray-300 text-sm mb-3">By SimpleAI</p>
135
+ <div class="flex justify-between items-center">
136
+ <span class="text-accent-blue font-bold">$75</span>
137
+ <button class="bg-accent-blue hover:bg-blue-600 text-white py-1 px-3 rounded-full text-sm transition-colors">
138
+ <i data-feather="heart" class="w-4 h-4"></i>
139
+ </button>
140
+ </div>
141
+ </div>
142
+ </div>
143
+
144
+ <!-- Gallery Item 7 -->
145
+ <div class="gallery-item bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
146
+ <div class="h-64 overflow-hidden">
147
+ <img src="http://static.photos/abstract/640x360/207" alt="AI Artwork" class="w-full h-full object-cover">
148
+ </div>
149
+ <div class="p-4">
150
+ <h3 class="font-bold text-gray-900 dark:text-white mb-1">Color Explosion</h3>
151
+ <p class="text-gray-600 dark:text-gray-300 text-sm mb-3">By PaletteMaster</p>
152
+ <div class="flex justify-between items-center">
153
+ <span class="text-accent-blue font-bold">$110</span>
154
+ <button class="bg-accent-blue hover:bg-blue-600 text-white py-1 px-3 rounded-full text-sm transition-colors">
155
+ <i data-feather="heart" class="w-4 h-4"></i>
156
+ </button>
157
+ </div>
158
+ </div>
159
+ </div>
160
+
161
+ <!-- Gallery Item 8 -->
162
+ <div class="gallery-item bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
163
+ <div class="h-64 overflow-hidden">
164
+ <img src="http://static.photos/nature/640x360/208" alt="AI Artwork" class="w-full h-full object-cover">
165
+ </div>
166
+ <div class="p-4">
167
+ <h3 class="font-bold text-gray-900 dark:text-white mb-1">Mountain Majesty</h3>
168
+ <p class="text-gray-600 dark:text-gray-300 text-sm mb-3">By LandscapePro</p>
169
+ <div class="flex justify-between items-center">
170
+ <span class="text-accent-blue font-bold">$130</span>
171
+ <button class="bg-accent-blue hover:bg-blue-600 text-white py-1 px-3 rounded-full text-sm transition-colors">
172
+ <i data-feather="heart" class="w-4 h-4"></i>
173
+ </button>
174
+ </div>
175
+ </div>
176
+ </div>
177
+ </div>
178
+
179
+ <!-- Load More Button -->
180
+ <div class="text-center mt-12">
181
+ <button class="bg-accent-blue hover:bg-blue-600 text-white font-bold py-3 px-8 rounded-full transition-colors">
182
+ Load More
183
+ </button>
184
+ </div>
185
+ </main>
186
+
187
+ <custom-footer></custom-footer>
188
+ <script src="components/navbar.js"></script>
189
+ <script src="components/footer.js"></script>
190
+ <script>
191
+ feather.replace();
192
+ </script>
193
  </body>
194
+ </html>
index.html CHANGED
@@ -56,8 +56,7 @@
56
  </div>
57
  </div>
58
  </section>
59
-
60
- <!-- Featured Section -->
61
  <section class="mb-16">
62
  <h2 class="text-3xl font-bold text-gray-900 dark:text-white mb-8 text-center">Featured Creations</h2>
63
  <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
 
56
  </div>
57
  </div>
58
  </section>
59
+ <!-- Featured Section -->
 
60
  <section class="mb-16">
61
  <h2 class="text-3xl font-bold text-gray-900 dark:text-white mb-8 text-center">Featured Creations</h2>
62
  <div class="grid grid-cols-1 md:grid-cols-3 gap-6">