VoidVision commited on
Commit
adedd68
·
verified ·
1 Parent(s): 8004faa

i need it very very professional type

Browse files
Files changed (4) hide show
  1. components/artwork-modal.js +128 -0
  2. index.html +2 -0
  3. script.js +43 -12
  4. style.css +26 -17
components/artwork-modal.js ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class ArtworkModal extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ :host {
7
+ position: fixed;
8
+ top: 0;
9
+ left: 0;
10
+ width: 100%;
11
+ height: 100%;
12
+ z-index: 9998;
13
+ display: flex;
14
+ justify-content: center;
15
+ align-items: center;
16
+ opacity: 0;
17
+ pointer-events: none;
18
+ transition: opacity 0.4s cubic-bezier(0.33, 1, 0.68, 1);
19
+ }
20
+ :host([open]) {
21
+ opacity: 1;
22
+ pointer-events: all;
23
+ }
24
+ .modal-backdrop {
25
+ position: absolute;
26
+ top: 0;
27
+ left: 0;
28
+ width: 100%;
29
+ height: 100%;
30
+ background: rgba(0, 0, 0, 0.88);
31
+ backdrop-filter: blur(20px);
32
+ -webkit-backdrop-filter: blur(20px);
33
+ }
34
+ .modal-container {
35
+ position: relative;
36
+ width: 90%;
37
+ max-width: 1200px;
38
+ max-height: 90vh;
39
+ background: white;
40
+ border-radius: 24px;
41
+ overflow: hidden;
42
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
43
+ transform: scale(0.95);
44
+ transition: transform 0.4s cubic-bezier(0.33, 1, 0.68, 1);
45
+ z-index: 1;
46
+ }
47
+ :host([open]) .modal-container {
48
+ transform: scale(1);
49
+ }
50
+ .modal-content {
51
+ display: grid;
52
+ grid-template-columns: 1fr 1fr;
53
+ height: 100%;
54
+ }
55
+ .modal-image {
56
+ height: 100%;
57
+ background-size: cover;
58
+ background-position: center;
59
+ }
60
+ .modal-details {
61
+ padding: 3rem;
62
+ overflow-y: auto;
63
+ }
64
+ .close-button {
65
+ position: absolute;
66
+ top: 1.5rem;
67
+ right: 1.5rem;
68
+ width: 2.5rem;
69
+ height: 2.5rem;
70
+ border-radius: 50%;
71
+ background: white;
72
+ border: none;
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ cursor: pointer;
77
+ z-index: 2;
78
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
79
+ transition: all 0.3s ease;
80
+ }
81
+ .close-button:hover {
82
+ transform: rotate(90deg);
83
+ }
84
+ </style>
85
+ <div class="modal-backdrop"></div>
86
+ <div class="modal-container">
87
+ <button class="close-button">
88
+ <i data-feather="x"></i>
89
+ </button>
90
+ <div class="modal-content">
91
+ <div class="modal-image"></div>
92
+ <div class="modal-details">
93
+ <h3 class="artwork-title"></h3>
94
+ <p class="artwork-meta"></p>
95
+ <p class="artwork-description"></p>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ `;
100
+
101
+ this.closeButton = this.shadowRoot.querySelector('.close-button');
102
+ this.closeButton.addEventListener('click', () => this.close());
103
+ this.shadowRoot.querySelector('.modal-backdrop').addEventListener('click', () => this.close());
104
+ }
105
+
106
+ open(artworkData) {
107
+ const image = this.shadowRoot.querySelector('.modal-image');
108
+ const title = this.shadowRoot.querySelector('.artwork-title');
109
+ const meta = this.shadowRoot.querySelector('.artwork-meta');
110
+ const desc = this.shadowRoot.querySelector('.artwork-description');
111
+
112
+ image.style.backgroundImage = `url(${artworkData.image})`;
113
+ title.textContent = artworkData.title;
114
+ meta.textContent = `${artworkData.medium} | ${artworkData.year}`;
115
+ desc.textContent = artworkData.description;
116
+
117
+ this.setAttribute('open', '');
118
+ document.body.style.overflow = 'hidden';
119
+ feather.replace();
120
+ }
121
+
122
+ close() {
123
+ this.removeAttribute('open');
124
+ document.body.style.overflow = '';
125
+ }
126
+ }
127
+
128
+ customElements.define('artwork-modal', ArtworkModal);
index.html CHANGED
@@ -8,6 +8,8 @@
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@700&family=IBM+Plex+Mono&family=Lora:ital,wght@0,400;0,600;1,400&display=swap" rel="stylesheet">
10
  <link href="https://fonts.cdnfonts.com/css/clash-display" rel="stylesheet">
 
 
11
  <link rel="stylesheet" href="style.css">
12
  <script src="https://cdn.tailwindcss.com"></script>
13
  <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
 
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@700&family=IBM+Plex+Mono&family=Lora:ital,wght@0,400;0,600;1,400&display=swap" rel="stylesheet">
10
  <link href="https://fonts.cdnfonts.com/css/clash-display" rel="stylesheet">
11
+ <link href="https://api.fontshare.com/v2/css?f[]=satoshi@900,700,500,300,400&display=swap" rel="stylesheet">
12
+ <link href="https://api.fontshare.com/v2/css?f[]=cabinet-grotesk@800,700,500,300,400&display=swap" rel="stylesheet">
13
  <link rel="stylesheet" href="style.css">
14
  <script src="https://cdn.tailwindcss.com"></script>
15
  <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
script.js CHANGED
@@ -180,28 +180,59 @@ const cursorTrail = document.createElement('div');
180
  }
181
  });
182
  });
183
-
184
  // Artwork modal functionality
185
- const artworkButtons = document.querySelectorAll('[data-artwork]');
186
- artworkButtons.forEach(button => {
187
- button.addEventListener('click', function() {
188
- const artworkId = this.getAttribute('data-artwork');
189
- // In a real implementation, you would show a modal with the artwork details
190
- console.log(`Viewing artwork ${artworkId}`);
 
 
 
 
 
 
 
 
 
 
 
 
191
  });
192
  });
193
-
194
  // Form submission
195
  const contactForm = document.querySelector('form');
196
  if (contactForm) {
197
  contactForm.addEventListener('submit', function(e) {
198
  e.preventDefault();
199
- // In a real implementation, you would send the form data to a server
200
- alert('Thank you for your message! I will get back to you soon.');
201
- this.reset();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
  });
203
  }
204
- // Enhanced Intersection Observer for animations
205
  const animateOnScroll = () => {
206
  const elements = document.querySelectorAll('[data-animate]');
207
 
 
180
  }
181
  });
182
  });
 
183
  // Artwork modal functionality
184
+ const artworkModal = document.createElement('artwork-modal');
185
+ document.body.appendChild(artworkModal);
186
+
187
+ const artworkButtons = document.querySelectorAll('.professional-card button');
188
+ artworkButtons.forEach((button, index) => {
189
+ button.addEventListener('click', () => {
190
+ const card = button.closest('.professional-card');
191
+ const img = card.querySelector('img');
192
+ const title = card.querySelector('h3').textContent;
193
+ const meta = card.querySelector('p').textContent;
194
+
195
+ artworkModal.open({
196
+ image: img.src,
197
+ title: title,
198
+ medium: meta.split('|')[0].trim(),
199
+ year: meta.split('|')[1].trim(),
200
+ description: 'This artwork represents a unique blend of digital techniques and creative vision. Each element was carefully crafted to evoke emotion and tell a visual story.'
201
+ });
202
  });
203
  });
 
204
  // Form submission
205
  const contactForm = document.querySelector('form');
206
  if (contactForm) {
207
  contactForm.addEventListener('submit', function(e) {
208
  e.preventDefault();
209
+
210
+ // Show success state
211
+ const submitButton = this.querySelector('button[type="submit"]');
212
+ submitButton.innerHTML = '<i data-feather="check"></i> Message Sent';
213
+ submitButton.disabled = true;
214
+
215
+ // Add micro-interaction
216
+ gsap.to(submitButton, {
217
+ scale: 0.95,
218
+ duration: 0.2,
219
+ yoyo: true,
220
+ repeat: 1,
221
+ ease: "power1.inOut",
222
+ onComplete: () => {
223
+ setTimeout(() => {
224
+ this.reset();
225
+ submitButton.innerHTML = 'Send Message <i data-feather="send" class="ml-2 inline"></i>';
226
+ submitButton.disabled = false;
227
+ feather.replace();
228
+ }, 2000);
229
+ }
230
+ });
231
+
232
+ feather.replace();
233
  });
234
  }
235
+ // Enhanced Intersection Observer for animations
236
  const animateOnScroll = () => {
237
  const elements = document.querySelectorAll('[data-animate]');
238
 
style.css CHANGED
@@ -296,8 +296,9 @@
296
  --font-mono: 'IBM Plex Mono', monospace;
297
  --font-serif: 'Lora', serif;
298
  --font-display: 'Clash Display', sans-serif;
299
-
300
- /* Enhanced color system */
 
301
  --color-primary: 14, 165, 233;
302
  --color-secondary: 124, 58, 237;
303
  --color-accent: 236, 72, 153;
@@ -373,26 +374,28 @@ h6 { font-size: var(--text-lg); }
373
 
374
  /* Typography Enhancements */
375
  .professional-headline {
376
- font-family: var(--font-display);
377
  font-size: var(--text-6xl);
378
- line-height: 0.9;
379
  letter-spacing: -0.03em;
380
- font-weight: 700;
381
  text-transform: none;
382
- background: linear-gradient(90deg,
383
- rgba(var(--color-primary), 0.95),
384
- rgba(var(--color-secondary), 0.95));
385
  -webkit-background-clip: text;
386
  background-clip: text;
387
  color: transparent;
388
  text-shadow:
389
- 0 1px 1px rgba(0,0,0,0.05),
390
- 0 2px 2px rgba(0,0,0,0.05),
391
- 0 4px 4px rgba(0,0,0,0.05);
 
392
  position: relative;
393
  display: inline-block;
 
 
394
  }
395
-
396
  .professional-headline::after {
397
  content: '';
398
  position: absolute;
@@ -520,15 +523,21 @@ h6 { font-size: var(--text-lg); }
520
  .professional-card {
521
  position: relative;
522
  overflow: hidden;
523
- transition: all 0.6s cubic-bezier(0.16, 1, 0.3, 1);
524
  transform: translateZ(0);
525
  will-change: transform;
526
- border-radius: 16px;
527
- box-shadow: 0 30px 60px -20px rgba(0,0,0,0.1);
 
 
 
 
 
528
  background: white;
529
- border: 1px solid rgba(var(--color-dark), 0.05);
 
 
530
  }
531
-
532
  .professional-card::before {
533
  content: '';
534
  position: absolute;
 
296
  --font-mono: 'IBM Plex Mono', monospace;
297
  --font-serif: 'Lora', serif;
298
  --font-display: 'Clash Display', sans-serif;
299
+ --font-sans: 'Satoshi', 'Inter', sans-serif;
300
+ --font-decorative: 'Cabinet Grotesk', 'Space Grotesk', sans-serif;
301
+ /* Enhanced color system */
302
  --color-primary: 14, 165, 233;
303
  --color-secondary: 124, 58, 237;
304
  --color-accent: 236, 72, 153;
 
374
 
375
  /* Typography Enhancements */
376
  .professional-headline {
377
+ font-family: var(--font-decorative);
378
  font-size: var(--text-6xl);
379
+ line-height: 0.95;
380
  letter-spacing: -0.03em;
381
+ font-weight: 900;
382
  text-transform: none;
383
+ background: linear-gradient(91.83deg,
384
+ rgba(var(--color-primary), 0.95) 0%,
385
+ rgba(var(--color-secondary), 0.95) 100%);
386
  -webkit-background-clip: text;
387
  background-clip: text;
388
  color: transparent;
389
  text-shadow:
390
+ 0 1px 1px rgba(0,0,0,0.03),
391
+ 0 2px 2px rgba(0,0,0,0.03),
392
+ 0 4px 4px rgba(0,0,0,0.03),
393
+ 0 8px 8px rgba(0,0,0,0.03);
394
  position: relative;
395
  display: inline-block;
396
+ padding-bottom: 0.5rem;
397
+ margin-bottom: 1.5rem;
398
  }
 
399
  .professional-headline::after {
400
  content: '';
401
  position: absolute;
 
523
  .professional-card {
524
  position: relative;
525
  overflow: hidden;
526
+ transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1);
527
  transform: translateZ(0);
528
  will-change: transform;
529
+ border-radius: 24px;
530
+ box-shadow:
531
+ 0 1px 1px rgba(0,0,0,0.04),
532
+ 0 2px 2px rgba(0,0,0,0.04),
533
+ 0 4px 4px rgba(0,0,0,0.04),
534
+ 0 8px 8px rgba(0,0,0,0.04),
535
+ 0 16px 16px rgba(0,0,0,0.04);
536
  background: white;
537
+ border: 1px solid rgba(var(--color-dark), 0.03);
538
+ backdrop-filter: blur(12px);
539
+ -webkit-backdrop-filter: blur(12px);
540
  }
 
541
  .professional-card::before {
542
  content: '';
543
  position: absolute;