Connectaksa commited on
Commit
71c9d6d
·
verified ·
1 Parent(s): 0aeb01e

make the code more clean

Browse files
Files changed (3) hide show
  1. index.html +3 -144
  2. script.js +54 -0
  3. style.css +189 -18
index.html CHANGED
@@ -1,153 +1,12 @@
 
1
  <!DOCTYPE html>
2
  <html lang="en">
3
  <head>
4
  <meta charset="utf-8" />
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
  <title>Why Consulta</title>
7
- <style>
8
- :root{
9
- --bg:#06294a; /* primary */
10
- --accent:#008bca; /* accent */
11
-
12
- --text-1:rgba(255,255,255,.92);
13
- --text-2:rgba(255,255,255,.78);
14
-
15
- --accent-20:rgba(0,139,202,.20);
16
- --accent-30:rgba(0,139,202,.30);
17
- --accent-40:rgba(0,139,202,.40);
18
-
19
- --shadow-strong:0 10px 30px rgba(0,0,0,.5);
20
-
21
- /* fluid scales */
22
- --pad-x:clamp(1rem, 5vw, 10vw);
23
- --pad-y:clamp(2rem, 6vw, 4rem);
24
- --h1:clamp(1.5rem, 3vw + 1rem, 2.5rem);
25
- --lead:clamp(1rem, .7vw + .9rem, 1.1rem);
26
- --feature:clamp(1rem, .6vw + .9rem, 1.05rem);
27
- }
28
-
29
- *{box-sizing:border-box}
30
- html,body{margin:0;padding:0;background:var(--bg);font-family:system-ui,-apple-system,Segoe UI,Roboto,Inter,Arial,sans-serif}
31
- img{max-width:100%;height:auto;display:block}
32
-
33
- .whyconsulta{position:relative;overflow:hidden;min-height:100vh;background:var(--bg)}
34
-
35
- /* Particles */
36
- .particles{position:absolute;inset:0;pointer-events:none}
37
- .particle{
38
- position:absolute;border-radius:999px;
39
- background:var(--accent-30);
40
- box-shadow:0 0 10px 2px var(--accent-20);
41
- animation:floatY 6s ease-in-out infinite, floatFade 6s ease-in-out infinite;
42
- }
43
- @keyframes floatY{0%{transform:translateY(0)}50%{transform:translateY(-30px)}100%{transform:translateY(0)}}
44
- @keyframes floatFade{0%,100%{opacity:.3}50%{opacity:.6}}
45
-
46
- .radial-overlay{
47
- position:absolute;inset:0;pointer-events:none;
48
- background:radial-gradient(circle at 30% 50%, var(--accent-20) 0%, transparent 50%);
49
- animation:overlayPulse 8s ease-in-out infinite;
50
- }
51
- @keyframes overlayPulse{0%,100%{opacity:.3}50%{opacity:.5}}
52
-
53
- .section{
54
- position:relative;
55
- display:grid;
56
- grid-template-columns: 1fr 1fr;
57
- gap:clamp(1rem, 3vw, 2rem);
58
- padding:var(--pad-y) var(--pad-x);
59
- align-items:center;
60
- }
61
- @media (max-width: 880px){
62
- .section{grid-template-columns:1fr}
63
- }
64
-
65
- .content{max-width:60ch}
66
- .visual{text-align:center}
67
-
68
- /* Heading */
69
- h1{
70
- margin:0 0 1rem 0;color:var(--text-1);
71
- font-weight:800;letter-spacing:.2px;font-size:var(--h1);line-height:1.15
72
- }
73
- .title-accent{color:var(--accent);position:relative;display:inline-block}
74
-
75
- .underline{
76
- height:4px;border-radius:999px;margin-top:.5rem;overflow:hidden;
77
- background:linear-gradient(90deg,var(--accent),var(--accent));
78
- background-size:200% 100%;position:relative
79
- }
80
- .underline .runner{
81
- position:absolute;inset:0;background:linear-gradient(90deg,var(--accent),var(--accent));
82
- background-size:200% 100%;animation:underlineRun 3s linear infinite
83
- }
84
- @keyframes underlineRun{0%{background-position:0% 50%}100%{background-position:100% 50%}}
85
-
86
- .lead{color:var(--text-2);font-size:var(--lead);line-height:1.65;margin:0 0 1rem 0}
87
-
88
- /* Features */
89
- .features{list-style:none;padding:0;margin:1.25rem 0 0 0;display:flex;flex-direction:column;gap:clamp(.75rem,1.6vw,1rem)}
90
- .feature{display:flex;align-items:center;gap:.75rem;position:relative;transform:translateX(-20px);opacity:0;transition:.5s ease}
91
- .feature.in-view{transform:translateX(0);opacity:1}
92
- .feature .icon-wrap{position:relative;display:inline-flex}
93
- .feature .icon-glow{position:absolute;inset:0;border-radius:999px;filter:blur(6px);opacity:.6;background:var(--accent-40);animation:glowPulse 2s ease-in-out infinite}
94
- @keyframes glowPulse{0%,100%{opacity:.5}50%{opacity:.8}}
95
- .feature .text{color:var(--text-2);font-size:var(--feature)}
96
- .feature:hover{transform:translateX(10px)}
97
-
98
- /* Visual card with glowing border + parallax */
99
- .frame{position:relative;display:inline-block;will-change:transform}
100
- .glow-border{
101
- position:absolute;inset:-6px;border-radius:1rem;filter:blur(8px);opacity:.4;
102
- background:linear-gradient(45deg,var(--accent),var(--accent));
103
- background-size:300% 300%;
104
- animation:borderFlow 5s linear infinite;
105
- z-index:0;
106
- }
107
- @keyframes borderFlow{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}
108
- .image-card{
109
- position:relative;border-radius:1rem;overflow:hidden;box-shadow:var(--shadow-strong);z-index:1;
110
- max-width:min(560px, 100%);
111
- margin-inline:auto;
112
- transform:translateZ(0); /* Create stacking context */
113
- }
114
- .image-shimmer{position:absolute;inset:0;pointer-events:none;background:linear-gradient(90deg,transparent,rgba(255,255,255,.18),transparent);background-size:200% 100%;transform:translateZ(0);opacity:0;transition:opacity .2s ease}
115
- .frame:hover .image-shimmer{opacity:1;animation:shimmer 1s linear forwards}
116
- @keyframes shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}
117
-
118
- /* In-view reveal helpers */
119
- .reveal-up{opacity:0;transform:translateY(20px);transition:.6s ease}
120
- .reveal-up.in-view{opacity:1;transform:translateY(0)}
121
- .reveal-left{opacity:0;transform:translateX(-50px);transition:.8s ease}
122
- .reveal-left.in-view{opacity:1;transform:translateX(0)}
123
- .reveal-scale{opacity:0;transform:scale(.9);transition:.8s ease}
124
- .reveal-scale.in-view{opacity:1;transform:scale(1)}
125
-
126
- /* Ticker */
127
- .ticker-wrap{
128
- width:110%;transform:rotate(-2deg);padding:clamp(.9rem,2.2vw,20px) 0;margin:clamp(1.25rem, 3.5vw, 2.5rem) -5% 0;
129
- position:relative;overflow:hidden;
130
- background:linear-gradient(90deg,var(--accent),#39a9df,var(--accent),#39a9df,var(--accent));
131
- background-size:200% 100%;
132
- animation:tickerBg 8s linear infinite;
133
- }
134
- @keyframes tickerBg{0%{background-position:0% 50%}50%{background-position:200% 50%}100%{background-position:0% 50%}}
135
- .ticker-gloss{position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);background-size:200% 100%;animation:gloss 3s linear infinite;pointer-events:none}
136
- @keyframes gloss{0%{background-position:0% 0}100%{background-position:200% 0}}
137
- .ticker{position:relative;display:flex;white-space:nowrap;will-change:transform;animation:marquee 18s linear infinite}
138
- .ticker span{display:inline-flex;align-items:center;gap:.5rem;margin:0 clamp(.75rem, 2vw, 1.25rem);color:#012537;font-size:clamp(1rem, .8vw + .9rem, 1.2rem);text-shadow:0 1px 2px rgba(255,255,255,.3)}
139
- .ticker .star{display:inline-block;animation:spin 2s linear infinite}
140
- @keyframes marquee{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}
141
- @keyframes spin{0%{transform:rotate(0) scale(1)}50%{transform:rotate(180deg) scale(1.2)}100%{transform:rotate(360deg) scale(1)}}
142
-
143
- .parallax{transform:translateY(var(--img-ty,0px)) rotate(var(--img-r,0deg));transition:transform .05s linear}
144
-
145
- /* Respect reduced motion */
146
- @media (prefers-reduced-motion: reduce){
147
- *{animation:none!important;transition:none!important}
148
- .parallax{transform:none!important}
149
- }
150
- </style>
151
  </head>
152
  <body>
153
  <div class="whyconsulta">
 
1
+
2
  <!DOCTYPE html>
3
  <html lang="en">
4
  <head>
5
  <meta charset="utf-8" />
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
7
  <title>Why Consulta</title>
8
+ <link rel="stylesheet" href="style.css">
9
+ <link rel="stylesheet" href="components/animations.css">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  </head>
11
  <body>
12
  <div class="whyconsulta">
script.js ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ```javascript
2
+ // Initialize particles
3
+ function initParticles() {
4
+ const particleHost = document.getElementById('particles');
5
+ const VW = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
6
+ const VH = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
7
+ const BASE = 12;
8
+ const density = Math.round((VW * VH) / (900 * 900));
9
+ const PARTICLE_COUNT = Math.max(8, Math.min(22, BASE + density * 4));
10
+
11
+ const make = (t, c) => {
12
+ const e = document.createElement(t);
13
+ if (c) e.className = c;
14
+ return e;
15
+ };
16
+
17
+ const rand = (a, b) => Math.random() * (b - a) + a;
18
+
19
+ for (let i = 0; i < PARTICLE_COUNT; i++) {
20
+ const p = make('div', 'particle');
21
+ const size = rand(2, 6);
22
+ p.style.width = p.style.height = size + 'px';
23
+ p.style.left = rand(0, 100) + '%';
24
+ p.style.top = rand(0, 100) + '%';
25
+ p.style.animationDelay = rand(0, 5) + 's';
26
+ const dur = (4 + Math.random() * 3).toFixed(2) + 's';
27
+ p.style.animationDuration = dur;
28
+ particleHost.appendChild(p);
29
+ }
30
+ }
31
+
32
+ // Initialize intersection observer for reveals
33
+ function initReveals() {
34
+ const io = new IntersectionObserver((entries) => {
35
+ entries.forEach(e => {
36
+ if (e.isIntersecting) {
37
+ e.target.classList.add('in-view');
38
+ io.unobserve(e.target);
39
+ }
40
+ });
41
+ }, { root: null, rootMargin: '-100px', threshold: 0 });
42
+
43
+ document.querySelectorAll('.reveal-up, .reveal-left, .reveal-scale, .feature').forEach(el => io.observe(el));
44
+ document.querySelectorAll('.feature').forEach((el, i) => {
45
+ el.style.transitionDelay = (0.6 + i * 0.1) + 's';
46
+ });
47
+ document.querySelectorAll('.reveal-up').forEach((el, i) => {
48
+ if (!el.style.transitionDelay) {
49
+ el.style.transitionDelay = (0.2 + i * 0.2) + 's';
50
+ });
51
+ }
52
+
53
+ // Initialize parallax effect
54
+ function init
style.css CHANGED
@@ -1,28 +1,199 @@
1
- body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
 
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
 
 
 
 
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --bg: #06294a;
3
+ --accent: #008bca;
4
+
5
+ --text-1: rgba(255, 255, 255, 0.92);
6
+ --text-2: rgba(255, 255, 255, 0.78);
7
+
8
+ --accent-20: rgba(0, 139, 202, 0.2);
9
+ --accent-30: rgba(0, 139, 202, 0.3);
10
+ --accent-40: rgba(0, 139, 202, 0.4);
11
+
12
+ --shadow-strong: 0 10px 30px rgba(0, 0, 0, 0.5);
13
+
14
+ --pad-x: clamp(1rem, 5vw, 10vw);
15
+ --pad-y: clamp(2rem, 6vw, 4rem);
16
+ --h1: clamp(1.5rem, 3vw + 1rem, 2.5rem);
17
+ --lead: clamp(1rem, 0.7vw + 0.9rem, 1.1rem);
18
+ --feature: clamp(1rem, 0.6vw + 0.9rem, 1.05rem);
19
+ }
20
+
21
+ * {
22
+ box-sizing: border-box;
23
+ }
24
+
25
+ html, body {
26
+ margin: 0;
27
+ padding: 0;
28
+ background: var(--bg);
29
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, Inter, Arial, sans-serif;
30
+ }
31
+
32
+ img {
33
+ max-width: 100%;
34
+ height: auto;
35
+ display: block;
36
+ }
37
+
38
+ .whyconsulta {
39
+ position: relative;
40
+ overflow: hidden;
41
+ min-height: 100vh;
42
+ background: var(--bg);
43
  }
44
 
45
+ /* Layout */
46
+ .section {
47
+ position: relative;
48
+ display: grid;
49
+ grid-template-columns: 1fr 1fr;
50
+ gap: clamp(1rem, 3vw, 2rem);
51
+ padding: var(--pad-y) var(--pad-x);
52
+ align-items: center;
53
+ }
54
+
55
+ @media (max-width: 880px) {
56
+ .section {
57
+ grid-template-columns: 1fr;
58
+ }
59
+ }
60
+
61
+ .content {
62
+ max-width: 60ch;
63
+ }
64
+
65
+ .visual {
66
+ text-align: center;
67
+ }
68
+
69
+ /* Typography */
70
  h1 {
71
+ margin: 0 0 1rem 0;
72
+ color: var(--text-1);
73
+ font-weight: 800;
74
+ letter-spacing: 0.2px;
75
+ font-size: var(--h1);
76
+ line-height: 1.15;
77
  }
78
 
79
+ .title-accent {
80
+ color: var(--accent);
81
+ position: relative;
82
+ display: inline-block;
 
83
  }
84
 
85
+ .lead {
86
+ color: var(--text-2);
87
+ font-size: var(--lead);
88
+ line-height: 1.65;
89
+ margin: 0 0 1rem 0;
 
90
  }
91
 
92
+ /* Features */
93
+ .features {
94
+ list-style: none;
95
+ padding: 0;
96
+ margin: 1.25rem 0 0 0;
97
+ display: flex;
98
+ flex-direction: column;
99
+ gap: clamp(0.75rem, 1.6vw, 1rem);
100
  }
101
+
102
+ .feature {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 0.75rem;
106
+ position: relative;
107
+ transform: translateX(-20px);
108
+ opacity: 0;
109
+ transition: 0.5s ease;
110
+ }
111
+
112
+ .feature.in-view {
113
+ transform: translateX(0);
114
+ opacity: 1;
115
+ }
116
+
117
+ .feature .icon-wrap {
118
+ position: relative;
119
+ display: inline-flex;
120
+ }
121
+
122
+ .feature .icon-glow {
123
+ position: absolute;
124
+ inset: 0;
125
+ border-radius: 999px;
126
+ filter: blur(6px);
127
+ opacity: 0.6;
128
+ background: var(--accent-40);
129
+ }
130
+
131
+ .feature .text {
132
+ color: var(--text-2);
133
+ font-size: var(--feature);
134
+ }
135
+
136
+ .feature:hover {
137
+ transform: translateX(10px);
138
+ }
139
+
140
+ /* Visual card */
141
+ .frame {
142
+ position: relative;
143
+ display: inline-block;
144
+ will-change: transform;
145
+ }
146
+
147
+ .glow-border {
148
+ position: absolute;
149
+ inset: -6px;
150
+ border-radius: 1rem;
151
+ filter: blur(8px);
152
+ opacity: 0.4;
153
+ background: linear-gradient(45deg, var(--accent), var(--accent));
154
+ background-size: 300% 300%;
155
+ z-index: 0;
156
+ }
157
+
158
+ .image-card {
159
+ position: relative;
160
+ border-radius: 1rem;
161
+ overflow: hidden;
162
+ box-shadow: var(--shadow-strong);
163
+ z-index: 1;
164
+ max-width: min(560px, 100%);
165
+ margin-inline: auto;
166
+ transform: translateZ(0);
167
+ }
168
+
169
+ .image-shimmer {
170
+ position: absolute;
171
+ inset: 0;
172
+ pointer-events: none;
173
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.18), transparent);
174
+ background-size: 200% 100%;
175
+ transform: translateZ(0);
176
+ opacity: 0;
177
+ transition: opacity 0.2s ease;
178
+ }
179
+
180
+ .frame:hover .image-shimmer {
181
+ opacity: 1;
182
+ }
183
+
184
+ .parallax {
185
+ transform: translateY(var(--img-ty, 0px)) rotate(var(--img-r, 0deg));
186
+ transition: transform 0.05s linear;
187
+ }
188
+
189
+ /* Respect reduced motion */
190
+ @media (prefers-reduced-motion: reduce) {
191
+ * {
192
+ animation: none !important;
193
+ transition: none !important;
194
+ }
195
+
196
+ .parallax {
197
+ transform: none !important;
198
+ }
199
+ }