Skip to content

Commit fb7ef6d

Browse files
committed
Create responsive cards with hover effective
1 parent ce07a29 commit fb7ef6d

File tree

3 files changed

+72
-29
lines changed

3 files changed

+72
-29
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "hyperwave",
33
"version": "0.2.1",
44
"scripts": {
5-
"build": "bun build:css && bun build:server && bun build:worker && build:hyperwavejs",
5+
"build": "bun build:css && bun build:server && bun build:worker && bun build:hyperwavejs",
66
"build:css": "unocss \"src/**/*.tsx\" -o public/styles/uno.css",
77
"build:server": "bun build --compile ./src/server.tsx --outfile ./dist/server",
88
"build:worker": "bun build --compile ./src/worker.ts --outfile ./dist/worker",

public/styles/uno.css

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,36 @@
11
/* layer: preflights */
22
*,::before,::after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / 0.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: ;}::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgb(0 0 0 / 0);--un-ring-shadow:0 0 rgb(0 0 0 / 0);--un-shadow-inset: ;--un-shadow:0 0 rgb(0 0 0 / 0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgb(147 197 253 / 0.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: ;}
33
/* layer: default */
4+
.grid{display:grid;}
5+
.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr));}
46
.m-0{margin:0;}
5-
.mb-1{margin-bottom:0.25rem;}
67
.mr-4{margin-right:1rem;}
78
.mt-1{margin-top:0.25rem;}
9+
.mt-2{margin-top:0.5rem;}
810
.h-12{height:3rem;}
911
.h-8{height:2rem;}
1012
.min-h-screen{min-height:100vh;}
1113
.w-12{width:3rem;}
12-
.w-full{width:100%;}
13-
.flex{display:flex;}
14+
.w-full,
15+
[w-full=""]{width:100%;}
16+
[h1=""]{height:0.25rem;}
17+
.flex,
18+
[flex=""]{display:flex;}
1419
.flex-col{flex-direction:column;}
20+
.hover\:-translate-y-1:hover{--un-translate-y:-0.25rem;transform:translateX(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotateZ(var(--un-rotate-z)) skewX(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z));}
21+
.transform{transform:translateX(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotateZ(var(--un-rotate-z)) skewX(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z));}
1522
.cursor-pointer{cursor:pointer;}
16-
.list-none{list-style-type:none;}
17-
.items-center{align-items:center;}
23+
.items-center,
24+
[items-center=""]{align-items:center;}
1825
.justify-center{justify-content:center;}
1926
.gap-2{gap:0.5rem;}
2027
.gap-3{gap:0.75rem;}
28+
.gap-4{gap:1rem;}
29+
.overflow-hidden{overflow:hidden;}
2130
.border{border-width:1px;}
22-
.border-b{border-bottom-width:1px;}
2331
.border-gray-2{--un-border-opacity:1;border-color:rgb(229 231 235 / var(--un-border-opacity));}
2432
.focus\:border-blue-200:focus{--un-border-opacity:1;border-color:rgb(191 219 254 / var(--un-border-opacity));}
33+
.rounded-lg{border-radius:0.5rem;}
2534
.rounded-md{border-radius:0.375rem;}
2635
.rounded-sm{border-radius:0.125rem;}
2736
.border-none{border-style:none;}
@@ -30,35 +39,62 @@
3039
.bg-transparent{background-color:transparent /* transparent */;}
3140
.bg-white,
3241
[bg-white=""]{--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity)) /* #fff */;}
42+
.dark .dark\:bg-gray-800{--un-bg-opacity:1;background-color:rgb(31 41 55 / var(--un-bg-opacity)) /* #1f2937 */;}
3343
.dark .dark\:bg-gray-900,
3444
.dark [dark\:bg-gray-900=""]{--un-bg-opacity:1;background-color:rgb(17 24 39 / var(--un-bg-opacity)) /* #111827 */;}
3545
.hover\:bg-blue-400:hover{--un-bg-opacity:1;background-color:rgb(96 165 250 / var(--un-bg-opacity)) /* #60a5fa */;}
36-
.from-blue-500{--un-gradient-from-position:0%;--un-gradient-from:rgb(59 130 246 / var(--un-from-opacity, 1)) var(--un-gradient-from-position);--un-gradient-to-position:100%;--un-gradient-to:rgb(59 130 246 / 0) var(--un-gradient-to-position);--un-gradient-stops:var(--un-gradient-from), var(--un-gradient-to);}
37-
.to-purple-500{--un-gradient-to-position:100%;--un-gradient-to:rgb(168 85 247 / var(--un-to-opacity, 1)) var(--un-gradient-to-position);}
38-
.bg-gradient-to-r{--un-gradient-shape:to right;--un-gradient:var(--un-gradient-shape), var(--un-gradient-stops);background-image:linear-gradient(var(--un-gradient));}
46+
.from-blue-500,
47+
[from-blue-500=""]{--un-gradient-from-position:0%;--un-gradient-from:rgb(59 130 246 / var(--un-from-opacity, 1)) var(--un-gradient-from-position);--un-gradient-to-position:100%;--un-gradient-to:rgb(59 130 246 / 0) var(--un-gradient-to-position);--un-gradient-stops:var(--un-gradient-from), var(--un-gradient-to);}
48+
.to-purple-500,
49+
[to-purple-500=""]{--un-gradient-to-position:100%;--un-gradient-to:rgb(168 85 247 / var(--un-to-opacity, 1)) var(--un-gradient-to-position);}
50+
.bg-gradient-to-r,
51+
[bg-gradient-to-r=""]{--un-gradient-shape:to right;--un-gradient:var(--un-gradient-shape), var(--un-gradient-stops);background-image:linear-gradient(var(--un-gradient));}
3952
.p-0{padding:0;}
4053
.p-4{padding:1rem;}
41-
.px-4{padding-left:1rem;padding-right:1rem;}
54+
.px-4,
55+
[px-4=""]{padding-left:1rem;padding-right:1rem;}
4256
.py-1{padding-top:0.25rem;padding-bottom:0.25rem;}
43-
.py-2{padding-top:0.5rem;padding-bottom:0.5rem;}
57+
.py-2,
58+
[py-2=""]{padding-top:0.5rem;padding-bottom:0.5rem;}
4459
.pl-3{padding-left:0.75rem;}
4560
.pr-10{padding-right:2.5rem;}
4661
.text-base{font-size:1rem;line-height:1.5rem;}
62+
.text-lg{font-size:1.125rem;line-height:1.75rem;}
4763
.text-sm{font-size:0.875rem;line-height:1.25rem;}
4864
.text-xl{font-size:1.25rem;line-height:1.75rem;}
65+
.dark .dark\:text-blue-400{--un-text-opacity:1;color:rgb(96 165 250 / var(--un-text-opacity)) /* #60a5fa */;}
66+
.dark .dark\:text-gray-400{--un-text-opacity:1;color:rgb(156 163 175 / var(--un-text-opacity)) /* #9ca3af */;}
4967
.dark .dark\:text-white,
5068
.dark [dark\:text-white=""],
51-
.text-white{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity)) /* #fff */;}
69+
.text-white,
70+
[text-white=""]{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity)) /* #fff */;}
5271
.text-black{--un-text-opacity:1;color:rgb(0 0 0 / var(--un-text-opacity)) /* #000 */;}
72+
.text-blue-600{--un-text-opacity:1;color:rgb(37 99 235 / var(--un-text-opacity)) /* #2563eb */;}
5373
.text-gray-500{--un-text-opacity:1;color:rgb(107 114 128 / var(--un-text-opacity)) /* #6b7280 */;}
5474
.text-neutral-500{--un-text-opacity:1;color:rgb(115 115 115 / var(--un-text-opacity)) /* #737373 */;}
5575
.text-slate-900{--un-text-opacity:1;color:rgb(15 23 42 / var(--un-text-opacity)) /* #0f172a */;}
56-
.text-teal-500{--un-text-opacity:1;color:rgb(20 184 166 / var(--un-text-opacity)) /* #14b8a6 */;}
76+
.dark .dark\:visited\:text-purple-400:visited{--un-text-opacity:1;color:rgb(192 132 252 / var(--un-text-opacity)) /* #c084fc */;}
5777
.visited\:text-purple-600:visited{--un-text-opacity:1;color:rgb(147 51 234 / var(--un-text-opacity)) /* #9333ea */;}
78+
.dark .dark\:hover\:text-blue-600:hover{--un-text-opacity:1;color:rgb(37 99 235 / var(--un-text-opacity)) /* #2563eb */;}
79+
.hover\:text-blue-800:hover{--un-text-opacity:1;color:rgb(30 64 175 / var(--un-text-opacity)) /* #1e40af */;}
5880
.font-bold{font-weight:700;}
81+
.font-semibold{font-weight:600;}
5982
.font-serif{font-family:ui-serif,Georgia,Cambria,"Times New Roman",Times,serif;}
6083
.italic{font-style:italic;}
61-
.hover\:underline:hover{text-decoration-line:underline;}
62-
.shadow-lg{--un-shadow:var(--un-shadow-inset) 0 10px 15px -3px var(--un-shadow-color, rgb(0 0 0 / 0.1)),var(--un-shadow-inset) 0 4px 6px -4px var(--un-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow);}
84+
.shadow-lg,
85+
[shadow-lg=""]{--un-shadow:var(--un-shadow-inset) 0 10px 15px -3px var(--un-shadow-color, rgb(0 0 0 / 0.1)),var(--un-shadow-inset) 0 4px 6px -4px var(--un-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow);}
6386
.shadow-md{--un-shadow:var(--un-shadow-inset) 0 4px 6px -1px var(--un-shadow-color, rgb(0 0 0 / 0.1)),var(--un-shadow-inset) 0 2px 4px -2px var(--un-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow);}
64-
.outline{outline-style:solid;}
87+
.hover\:shadow-2xl:hover{--un-shadow:var(--un-shadow-inset) 0 25px 50px -12px var(--un-shadow-color, rgb(0 0 0 / 0.25));box-shadow:var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow);}
88+
.outline{outline-style:solid;}
89+
.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
90+
.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;}
91+
.duration-300{transition-duration:300ms;}
92+
@media (min-width: 768px){
93+
.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr));}
94+
}
95+
@media (min-width: 1024px){
96+
.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr));}
97+
}
98+
@media (min-width: 1280px){
99+
.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr));}
100+
}

src/components/Articles.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,27 @@ export default function Articles(props: { articles: Article[] }) {
66
formatRelativeTime(new Date(article.created_at));
77

88
return (
9-
<ul class="list-none m-0 p-0">
9+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 p-4">
1010
{props.articles.map((article) => (
11-
<li key={article.id} class="p-0 m-0 border-b list-none mb-1">
12-
<a
13-
href={article.link}
14-
class="text-teal-500 hover:underline visited:text-purple-600"
15-
>
16-
{article.title}
17-
</a>
18-
<div class="text-gray-500 text-sm">
19-
{relativeDate(article)} - {article.source}
11+
<div
12+
key={article.id}
13+
className="bg-white dark:bg-gray-800 rounded-lg shadow-md overflow-hidden hover:shadow-2xl transition-shadow duration-300 transform hover:-translate-y-1"
14+
>
15+
<div className="p-4">
16+
<a
17+
href={article.link}
18+
className="text-lg font-semibold text-blue-600 hover:text-blue-800 visited:text-purple-600 dark:text-blue-400 dark:hover:text-blue-600 dark:visited:text-purple-400 transition-colors duration-300"
19+
target="_blank"
20+
rel="noopener noreferrer"
21+
>
22+
{article.title}
23+
</a>
24+
<div className="text-gray-500 dark:text-gray-400 text-sm mt-2">
25+
{relativeDate(article)} - {article.source}
26+
</div>
2027
</div>
21-
</li>
28+
</div>
2229
))}
23-
</ul>
30+
</div>
2431
);
2532
}

0 commit comments

Comments
 (0)