@@ -46,11 +46,11 @@ const features = [
4646 <div class =" hero-grid" >
4747 <div class =" hero-copy" >
4848 <p class =" section-kicker" ><span class =" kicker-dot" ></span >vision</p >
49- <h1 class =" hero-title" >Run every project with execution-grade AI orchestration, from inbox to roadmap to shipped work with local tasks and real tool execution .</h1 >
49+ <h1 class =" hero-title" >< span style = " opacity: 0.4; " >Claude Code is for coding.</ span >< br />aipm is for PM-ing .</h1 >
5050 <pre
5151 class =" install-cmd"
5252 title =" Click to copy"
53- ><code ><span class =" terminal-prompt" aria-hidden =" true" >$</span ><span >brew tap ComputelessComputer/aipm && brew install aipm</span ><button class =" copy-btn" type =" button" onclick =" navigator .clipboard .writeText (' brew tap ComputelessComputer/aipm && brew install aipm' ); const btn = this ; btn .classList .add (' copied' ); clearTimeout (btn .copyTimer ); btn .copyTimer = setTimeout (() => btn .classList .remove (' copied' ), 1200 );" aria-label =" Copy to clipboard" ><span class =" copy-icon" ><svg xmlns =' http://www.w3.org/2000/svg' width =' 16' height =' 16' viewBox =' 0 0 24 24' fill =' none' stroke =' currentColor' stroke-width =' 2' stroke-linecap =' round' stroke-linejoin =' round' ><rect width =' 14' height =' 14' x =' 8' y =' 8' rx =' 2' ry =' 2' /><path d =' M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2' /></svg ></span ><span class =" check-icon" ><CheckIcon size ={ 16 } strokeWidth ={ 2.5 } /></span ></button ></code ></pre >
53+ ><code><span class="terminal-prompt" aria-hidden="true">$</span><span>brew tap ComputelessComputer/aipm && brew install aipm</span><button class="copy-btn" type="button" onclick="navigator.clipboard.writeText('brew tap ComputelessComputer/aipm && brew install aipm'); const btn = this; btn.classList.add('copied'); clearTimeout(btn.copyTimer); btn.copyTimer = setTimeout(() => btn.classList.remove('copied'), 1200);" aria-label="Copy to clipboard"><span class="copy-icon"><svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect width='14' height='14' x='8' y='8' rx='2' ry='2'/><path d='M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2'/></svg></span><span class="check-icon"><svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><path d='M20 6 9 17l-5-5'/></svg></span></button></code></pre>
5454 </div >
5555 </div >
5656 </section >
@@ -101,6 +101,59 @@ const features = [
101101 </section >
102102</BaseLayout >
103103
104+ <script is:inline >
105+ (() => {
106+ const kickers = document.querySelectorAll('.section-kicker');
107+
108+ if (!kickers.length) {
109+ return;
110+ }
111+
112+ const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
113+
114+ const lightDot = (kicker) => {
115+ const dot = kicker.querySelector('.kicker-dot');
116+
117+ if (!dot) {
118+ return;
119+ }
120+
121+ if (reducedMotion) {
122+ dot.classList.add('is-lit');
123+ return;
124+ }
125+
126+ dot.classList.add('blink-in');
127+ dot.addEventListener(
128+ 'animationend',
129+ () => {
130+ dot.classList.remove('blink-in');
131+ dot.classList.add('is-lit');
132+ },
133+ { once: true }
134+ );
135+ };
136+
137+ const observer = new IntersectionObserver(
138+ (entries) => {
139+ for (const entry of entries) {
140+ if (!entry.isIntersecting) {
141+ continue;
142+ }
143+
144+ lightDot(entry.target);
145+ observer.unobserve(entry.target);
146+ }
147+ },
148+ { threshold: 0.35 }
149+ );
150+
151+ for (const kicker of kickers) {
152+ observer.observe(kicker);
153+ }
154+ })();
155+ </script >
156+
104157<style >
105158 .section-kicker {
106159 display: inline-flex;
@@ -119,6 +172,55 @@ const features = [
119172 height: 0.45rem;
120173 border-radius: 999px;
121174 background: linear-gradient(135deg, #c07a3e, #d4a574);
175+ opacity: 0.28;
176+ box-shadow: 0 0 0 rgba(192, 122, 62, 0);
177+ }
178+
179+ .kicker-dot.blink-in {
180+ animation: kicker-dot-blink 540ms linear 1 forwards;
181+ }
182+
183+ .kicker-dot.is-lit {
184+ opacity: 1;
185+ box-shadow: 0 0 0.5rem rgba(192, 122, 62, 0.45);
186+ }
187+
188+ @keyframes kicker-dot-blink {
189+ 0%,
190+ 8% {
191+ opacity: 0.2;
192+ box-shadow: 0 0 0 rgba(192, 122, 62, 0);
193+ }
194+
195+ 16%,
196+ 26% {
197+ opacity: 1;
198+ box-shadow: 0 0 0.5rem rgba(192, 122, 62, 0.45);
199+ }
200+
201+ 34%,
202+ 44% {
203+ opacity: 0.2;
204+ box-shadow: 0 0 0 rgba(192, 122, 62, 0);
205+ }
206+
207+ 52%,
208+ 62% {
209+ opacity: 1;
210+ box-shadow: 0 0 0.5rem rgba(192, 122, 62, 0.45);
211+ }
212+
213+ 70%,
214+ 80% {
215+ opacity: 0.2;
216+ box-shadow: 0 0 0 rgba(192, 122, 62, 0);
217+ }
218+
219+ 88%,
220+ 100% {
221+ opacity: 1;
222+ box-shadow: 0 0 0.5rem rgba(192, 122, 62, 0.45);
223+ }
122224 }
123225
124226 .hero {
@@ -166,15 +268,10 @@ const features = [
166268 text-align: left;
167269 border-radius: 10px;
168270 border: 1px solid #e5dbc8;
169- background: #f3ede4 ;
271+ background: #ffffff ;
170272 padding: 0.9rem 1rem;
171- transition: border-color var(--transition-fast), background-color var(--transition-fast);
172273 }
173274
174- .install-cmd:hover {
175- border-color: #d4c4a8;
176- background: #fffdfb;
177- }
178275
179276 .install-cmd code {
180277 display: flex;
@@ -275,7 +372,6 @@ const features = [
275372 .demo h2,
276373 .features h2 {
277374 margin-bottom: 1.2rem;
278- max-width: 16ch;
279375 }
280376
281377 .video-container {
@@ -344,4 +440,15 @@ const features = [
344440 }
345441
346442 }
443+
444+ @media (prefers-reduced-motion: reduce) {
445+ .kicker-dot {
446+ opacity: 1;
447+ box-shadow: 0 0 0.5rem rgba(192, 122, 62, 0.45);
448+ }
449+
450+ .kicker-dot.blink-in {
451+ animation: none;
452+ }
453+ }
347454</style >
0 commit comments