Skip to content

Commit 0514a9b

Browse files
committed
feat: refine home skill cards
1 parent 541f96c commit 0514a9b

File tree

3 files changed

+93
-30
lines changed

3 files changed

+93
-30
lines changed

src/components/SkillCard.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Link } from '@tanstack/react-router'
2+
import type { ReactNode } from 'react'
3+
import type { Doc } from '../../convex/_generated/dataModel'
4+
5+
type SkillCardProps = {
6+
skill: Doc<'skills'>
7+
badge?: string
8+
summaryFallback: string
9+
meta: ReactNode
10+
}
11+
12+
export function SkillCard({ skill, badge, summaryFallback, meta }: SkillCardProps) {
13+
return (
14+
<Link to="/skills/$slug" params={{ slug: skill.slug }} className="card skill-card">
15+
{badge ? <div className="tag">{badge}</div> : null}
16+
<h3 className="skill-card-title">{skill.displayName}</h3>
17+
<p className="skill-card-summary">{skill.summary ?? summaryFallback}</p>
18+
<div className="skill-card-footer">{meta}</div>
19+
</Link>
20+
)
21+
}

src/routes/index.tsx

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { createFileRoute, Link } from '@tanstack/react-router'
22
import { useQuery } from 'convex/react'
33
import { api } from '../../convex/_generated/api'
44
import type { Doc } from '../../convex/_generated/dataModel'
5+
import { SkillCard } from '../components/SkillCard'
56

67
export const Route = createFileRoute('/')({
78
component: Home,
@@ -44,8 +45,10 @@ function Home() {
4445
Search
4546
</Link>
4647
</div>
47-
<div style={{ display: 'grid', gap: 12, marginTop: 18 }}>
48+
<div className="hero-install" style={{ marginTop: 18 }}>
4849
<div className="stat">Search skills. Versioned, rollback-ready.</div>
50+
<div className="stat">Install any skill folder in one shot:</div>
51+
<div className="hero-install-code mono">npx clawdhub@latest install sonoscli</div>
4952
</div>
5053
</div>
5154
</div>
@@ -59,23 +62,17 @@ function Home() {
5962
<div className="card">No highlighted skills yet.</div>
6063
) : (
6164
highlighted.map((skill) => (
62-
<Link
65+
<SkillCard
6366
key={skill._id}
64-
to="/skills/$slug"
65-
params={{ slug: skill.slug }}
66-
className="card"
67-
>
68-
<div className="tag">Highlighted</div>
69-
<h3 className="section-title" style={{ fontSize: '1.2rem', margin: 0 }}>
70-
{skill.displayName}
71-
</h3>
72-
<p className="section-subtitle" style={{ margin: 0 }}>
73-
{skill.summary ?? 'A fresh skill bundle.'}
74-
</p>
75-
<div className="stat">
76-
{skill.stats.stars} · ⤓ {skill.stats.downloads}
77-
</div>
78-
</Link>
67+
skill={skill}
68+
badge="Highlighted"
69+
summaryFallback="A fresh skill bundle."
70+
meta={
71+
<div className="stat">
72+
{skill.stats.stars} · ⤓ {skill.stats.downloads}
73+
</div>
74+
}
75+
/>
7976
))
8077
)}
8178
</div>
@@ -89,20 +86,16 @@ function Home() {
8986
<div className="card">No skills yet. Be the first.</div>
9087
) : (
9188
latest.map((skill) => (
92-
<Link
89+
<SkillCard
9390
key={skill._id}
94-
to="/skills/$slug"
95-
params={{ slug: skill.slug }}
96-
className="card"
97-
>
98-
<div className="stat">{skill.summary ?? 'Agent-ready skill pack.'}</div>
99-
<h3 className="section-title" style={{ fontSize: '1.2rem', margin: 0 }}>
100-
{skill.displayName}
101-
</h3>
102-
<div className="stat">
103-
{skill.stats.versions} versions · {skill.stats.downloads} downloads
104-
</div>
105-
</Link>
91+
skill={skill}
92+
summaryFallback="Agent-ready skill pack."
93+
meta={
94+
<div className="stat">
95+
{skill.stats.versions} versions · {skill.stats.downloads} downloads
96+
</div>
97+
}
98+
/>
10699
))
107100
)}
108101
</div>

src/styles.css

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,55 @@ code {
622622
box-shadow 0.2s ease;
623623
}
624624

625+
.skill-card {
626+
min-height: 176px;
627+
}
628+
629+
.skill-card-title {
630+
font-family: var(--font-display);
631+
font-size: 1.2rem;
632+
letter-spacing: -0.02em;
633+
margin: 0;
634+
display: -webkit-box;
635+
-webkit-line-clamp: 2;
636+
-webkit-box-orient: vertical;
637+
overflow: hidden;
638+
}
639+
640+
.skill-card-summary {
641+
margin: 0;
642+
color: var(--ink-soft);
643+
font-size: 0.95rem;
644+
line-height: 1.45;
645+
display: -webkit-box;
646+
-webkit-line-clamp: 3;
647+
-webkit-box-orient: vertical;
648+
overflow: hidden;
649+
}
650+
651+
.skill-card-footer {
652+
margin-top: auto;
653+
}
654+
655+
.hero-install {
656+
display: grid;
657+
gap: 10px;
658+
}
659+
660+
.hero-install-code {
661+
border: 1px solid rgba(255, 107, 74, 0.2);
662+
background: rgba(255, 107, 74, 0.08);
663+
border-radius: 14px;
664+
padding: 10px 12px;
665+
font-size: 0.95rem;
666+
color: var(--ink);
667+
}
668+
669+
[data-theme="dark"] .hero-install-code {
670+
border-color: rgba(232, 106, 71, 0.32);
671+
background: rgba(232, 106, 71, 0.14);
672+
}
673+
625674
.tag {
626675
display: inline-flex;
627676
align-items: center;

0 commit comments

Comments
 (0)