Skip to content

Commit cca49c6

Browse files
author
ComputelessComputer
committed
Align checklist layout
1 parent a535b16 commit cca49c6

3 files changed

Lines changed: 128 additions & 10 deletions

File tree

apps/tui/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/tui/package.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"name": "@aipm/tui",
3+
"private": true,
4+
"scripts": {
5+
"dev": "cargo run --manifest-path Cargo.toml",
6+
"build": "cargo build --manifest-path Cargo.toml --release",
7+
"check": "cargo check --manifest-path Cargo.toml",
8+
"clippy": "cargo clippy --manifest-path Cargo.toml --all-targets -- -D warnings",
9+
"test": "cargo test --manifest-path Cargo.toml"
10+
}
11+
}

apps/web/src/pages/index.astro

Lines changed: 116 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)