@@ -65,6 +65,46 @@ const jsonLd = {
6565 },
6666 ],
6767}
68+
69+ // Each feature card carries its own hue (--c) and a hand-drawn-ish line icon.
70+ const features = [
71+ {
72+ title: ' Pressure ink' ,
73+ body: " The pen's width follows stylus pressure — or velocity for mouse users — and strokes taper like a real pen." ,
74+ hue: ' #2f6fed' ,
75+ icon: ` <path fill="currentColor" stroke="none" d="M2.6 20.9c-.5.1-.8-.5-.4-.8 3.6-2.6 6.3-5.9 8.6-9.6 2.3-3.7 5-6.7 8.6-8.6.5-.3 1 .3.6.7-2.7 2.8-4.7 5.8-6.6 9.1-2.3 4-5.6 7.6-10.8 9.2Z"/><path d="M19.6 2.3c1.1-.7 2.2-1 3.2-.9" stroke-linecap="round"/> ` ,
76+ },
77+ {
78+ title: ' Hand-drawn shapes' ,
79+ body: ' Rectangles, ellipses, triangles, diamonds, hexagons, stars — with a subtle sketched wobble, four fill styles, and editable labels.' ,
80+ hue: ' #d97706' ,
81+ icon: ` <path d="M12 2.7c.3 0 .5.2.6.4l3.6 6.2c.2.4-.1.9-.6.9H8.4c-.5 0-.8-.5-.6-.9l3.6-6.2c.1-.2.3-.4.6-.4Z" stroke-linejoin="round"/><rect x="2.6" y="13.4" width="8" height="8" rx="1.8"/><circle cx="17.4" cy="17.4" r="4"/> ` ,
82+ },
83+ {
84+ title: ' Real-time sync' ,
85+ body: ' Every change emits a JSON-safe diff. Ship it over any transport; remote changes never pollute local undo.' ,
86+ hue: ' #0f9d58' ,
87+ icon: ` <path d="M3.8 12a8.2 8.2 0 0 1 14-5.8" stroke-linecap="round"/><path d="M18.2 2.6v3.9h-3.9" stroke-linecap="round" stroke-linejoin="round"/><path d="M20.2 12a8.2 8.2 0 0 1-14 5.8" stroke-linecap="round"/><path d="M5.8 21.4v-3.9h3.9" stroke-linecap="round" stroke-linejoin="round"/><circle cx="12" cy="12" r="1.9" fill="currentColor" stroke="none"/> ` ,
88+ },
89+ {
90+ title: ' Palm rejection' ,
91+ body: ' Once a stylus is seen, fingers steer the camera and the pen draws. Apple Pencil feels native.' ,
92+ hue: ' #7c4dcc' ,
93+ icon: ` <path d="M8.4 11.2V4.9a1.7 1.7 0 0 1 3.4 0v5.1" stroke-linecap="round"/><path d="M11.8 10V3.7a1.7 1.7 0 0 1 3.4 0v6.4" stroke-linecap="round"/><path d="M15.2 10.5V6.3a1.7 1.7 0 0 1 3.4 0V14c0 4.2-2.7 7.3-6.7 7.3-3.4 0-5.2-1.7-6.8-4.4l-2-3.4a1.7 1.7 0 0 1 2.9-1.7l1.6 2.6" stroke-linecap="round" stroke-linejoin="round"/> ` ,
94+ },
95+ {
96+ title: ' Infinite canvas' ,
97+ body: ' Pan, wheel zoom, two-finger pinch, zoom-to-fit. Ruled or dotted grids that adapt to the zoom.' ,
98+ hue: ' #0e8f9b' ,
99+ icon: ` <path d="M2.7 5.6V3.4a.7.7 0 0 1 .7-.7h2.2M18.4 2.7h2.2c.4 0 .7.3.7.7v2.2M21.3 18.4v2.2c0 .4-.3.7-.7.7h-2.2M5.6 21.3H3.4a.7.7 0 0 1-.7-.7v-2.2" stroke-linecap="round"/><path d="M8.7 9.3c-1.9 0-3.4 1.2-3.4 2.7s1.5 2.7 3.4 2.7c2.9 0 3.4-5.4 6.6-5.4 1.9 0 3.4 1.2 3.4 2.7s-1.5 2.7-3.4 2.7c-2.9 0-3.7-5.4-6.6-5.4Z"/> ` ,
100+ },
101+ {
102+ title: ' And the rest' ,
103+ body: ' Arrows with draggable bend, sticky notes, images, laser pointer, PNG export, per-gesture undo, light & dark themes, full keyboard map.' ,
104+ hue: ' #d1476b' ,
105+ icon: ` <path d="M11 2.9c.3-.9 1.6-.9 1.9 0l1.4 3.7c.1.3.3.5.6.6l3.7 1.4c.9.3.9 1.6 0 1.9l-3.7 1.4c-.3.1-.5.3-.6.6l-1.4 3.7c-.3.9-1.6.9-1.9 0l-1.4-3.7a1 1 0 0 0-.6-.6l-3.7-1.4c-.9-.3-.9-1.6 0-1.9l3.7-1.4c.3-.1.5-.3.6-.6z" stroke-linejoin="round"/><path d="m5.6 15.6.8 2 2 .8-2 .8-.8 2-.8-2-2-.8 2-.8z" stroke-linejoin="round"/><path d="m18.2 14.4.6 1.7 1.7.6-1.7.6-.6 1.7-.6-1.7-1.7-.6 1.7-.6z" stroke-linejoin="round"/> ` ,
106+ },
107+ ]
68108---
69109<Base jsonLd ={ jsonLd } >
70110 <main >
@@ -100,12 +140,15 @@ const jsonLd = {
100140 <section class =" features" id =" features" >
101141 <h2 >A simple, joyful drawing experience</h2 >
102142 <div class =" grid" >
103- <div class =" card" ><h3 >Pressure ink</h3 ><p >The pen's width follows stylus pressure — or velocity for mouse users — and strokes taper like a real pen.</p ></div >
104- <div class =" card" ><h3 >Hand-drawn shapes</h3 ><p >Rectangles, ellipses, triangles, diamonds, hexagons, stars — with a subtle sketched wobble, four fill styles, and editable labels.</p ></div >
105- <div class =" card" ><h3 >Real-time sync</h3 ><p >Every change emits a JSON-safe diff. Ship it over any transport; remote changes never pollute local undo.</p ></div >
106- <div class =" card" ><h3 >Palm rejection</h3 ><p >Once a stylus is seen, fingers steer the camera and the pen draws. Apple Pencil feels native.</p ></div >
107- <div class =" card" ><h3 >Infinite canvas</h3 ><p >Pan, wheel zoom, two-finger pinch, zoom-to-fit. Ruled or dotted grids that adapt to the zoom.</p ></div >
108- <div class =" card" ><h3 >And the rest</h3 ><p >Arrows with draggable bend, sticky notes, images, laser pointer, PNG export, per-gesture undo, light & dark themes, full keyboard map.</p ></div >
143+ { features .map ((f ) => (
144+ <div class = " card" style = { ` --c: ${f .hue } ` } >
145+ <span class = " card-icon" aria-hidden = " true" >
146+ <svg viewBox = " 0 0 24 24" width = " 24" height = " 24" fill = " none" stroke = " currentColor" stroke-width = " 1.6" set :html = { f .icon } />
147+ </span >
148+ <h3 >{ f .title } </h3 >
149+ <p >{ f .body } </p >
150+ </div >
151+ ))}
109152 </div >
110153 </section >
111154
@@ -359,11 +402,45 @@ createQuickdraw({
359402
360403 .features .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(270px, 1fr)); gap: 18px; }
361404 .card {
405+ --c: var(--accent);
406+ position: relative; overflow: hidden; isolation: isolate;
362407 background: #fff; border: 1px solid var(--line); border-radius: var(--radius);
363- padding: 22px 24px;
408+ padding: 24px 24px 26px;
409+ transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
410+ }
411+ /* A faint wash of the card's own hue, bloomed from the icon corner. */
412+ .card::before {
413+ content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none;
414+ background: radial-gradient(260px 150px at 8% -10%, color-mix(in srgb, var(--c) 12%, transparent), transparent 72%);
415+ opacity: 0.75; transition: opacity 180ms ease;
416+ }
417+ .card:hover {
418+ transform: translateY(-3px);
419+ border-color: color-mix(in srgb, var(--c) 38%, var(--line));
420+ box-shadow: 0 18px 34px -22px color-mix(in srgb, var(--c) 60%, rgba(28, 27, 24, 0.5));
421+ }
422+ .card:hover::before { opacity: 1; }
423+ .card-icon {
424+ display: inline-flex; align-items: center; justify-content: center;
425+ width: 44px; height: 44px; margin-bottom: 16px;
426+ border-radius: 13px; color: var(--c);
427+ background: color-mix(in srgb, var(--c) 11%, #fff);
428+ border: 1px solid color-mix(in srgb, var(--c) 24%, transparent);
429+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
430+ transition: transform 180ms ease, background 180ms ease;
431+ }
432+ .card:hover .card-icon {
433+ transform: rotate(-4deg) scale(1.04);
434+ background: color-mix(in srgb, var(--c) 16%, #fff);
435+ }
436+ .card h3 { margin: 0 0 8px; font-size: 17.5px; letter-spacing: -0.005em; }
437+ .card p { margin: 0; color: var(--ink-soft); font-size: 15px; line-height: 1.6; text-wrap: pretty; }
438+
439+ @media (prefers-reduced-motion: reduce) {
440+ .card, .card-icon { transition: none; }
441+ .card:hover { transform: none; }
442+ .card:hover .card-icon { transform: none; }
364443 }
365- .card h3 { margin: 0 0 8px; font-size: 17px; }
366- .card p { margin: 0; color: var(--ink-soft); font-size: 15px; }
367444
368445 .qs-panel {
369446 background: #14130f; border-radius: var(--radius); overflow: hidden;
0 commit comments