From d1b82707dd641c2dfc0762ae483ba7d76e25049c Mon Sep 17 00:00:00 2001 From: Ethan Vinh Date: Mon, 16 Mar 2026 18:09:47 -0700 Subject: [PATCH 1/2] Heartbeat component --- src/main/scala/gsoc/contributors/all.scala | 1 + src/main/scala/gsoc/contributors/etvinh.scala | 73 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/main/scala/gsoc/contributors/etvinh.scala diff --git a/src/main/scala/gsoc/contributors/all.scala b/src/main/scala/gsoc/contributors/all.scala index 86894ff..d5149ef 100644 --- a/src/main/scala/gsoc/contributors/all.scala +++ b/src/main/scala/gsoc/contributors/all.scala @@ -36,6 +36,7 @@ val allContributors = NonEmptyList.of( ap44444, saifk16, `alokkumardalei-wq`, + etvinh, `nvshinde`, lucasdu2, boss6825, diff --git a/src/main/scala/gsoc/contributors/etvinh.scala b/src/main/scala/gsoc/contributors/etvinh.scala new file mode 100644 index 0000000..3b56850 --- /dev/null +++ b/src/main/scala/gsoc/contributors/etvinh.scala @@ -0,0 +1,73 @@ +package gsoc +package contributors + +import cats.effect.* +import cats.effect.syntax.all.* +import fs2.concurrent.* +import fs2.dom.HtmlElement +import calico.html.io.{*, given} +import calico.syntax.* +import scala.concurrent.duration.* + +val etvinh: Contributor = Contributor("etvinh"): + SignallingRef[IO].of(0).toResource.flatMap { frame => + val smallHeart = Vector( + " ### ### ", + " ##### ##### ", + " ########### ", + " ######### ", + " ####### ", + " ##### ", + " ### ", + " # ", + ) + + val bigHeart = Vector( + " #### #### ", + "###### ######", + "#############", + " ########### ", + " ######### ", + " ####### ", + " ##### ", + " ### ", + " # ", + ) + + // lub, deflate, dub, deflate, pause + val frames = Vector(bigHeart, smallHeart, bigHeart, smallHeart, smallHeart) + val delays = Vector(120, 120, 120, 120, 800) + + val ticker = frame.get.flatMap { f => + IO.sleep(delays(f).millis) >> frame.update(f => (f + 1) % frames.size) + }.foreverM.background + + ticker.flatMap { _ => + div( + styleAttr := """ + font-family: arial; + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; + padding: 20px; + """, + frame.map(f => frames(f)).changes.map { lines => + pre( + styleAttr := """ + font-size: 20px; + line-height: 1.3; + margin: 0; + color: rgb(219, 12, 84); + transition: font-size 0.1s; + """, + lines.mkString("\n") + ) + }, + p( + "Hello, I'm @etvinh on GitHub. I agree to follow the Typelevel CoC and GSoC AI policy." + ), + p("Excited to start building <3") + ) + } + } \ No newline at end of file From f058fa93a8b4d9e9c3b2fd9f85581c51bcd2b2fc Mon Sep 17 00:00:00 2001 From: etvinh Date: Mon, 16 Mar 2026 18:20:52 -0700 Subject: [PATCH 2/2] formatted etvinh.scala --- src/main/scala/gsoc/contributors/etvinh.scala | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/scala/gsoc/contributors/etvinh.scala b/src/main/scala/gsoc/contributors/etvinh.scala index 3b56850..b6afb75 100644 --- a/src/main/scala/gsoc/contributors/etvinh.scala +++ b/src/main/scala/gsoc/contributors/etvinh.scala @@ -19,7 +19,7 @@ val etvinh: Contributor = Contributor("etvinh"): " ####### ", " ##### ", " ### ", - " # ", + " # " ) val bigHeart = Vector( @@ -31,16 +31,18 @@ val etvinh: Contributor = Contributor("etvinh"): " ####### ", " ##### ", " ### ", - " # ", + " # " ) - + // lub, deflate, dub, deflate, pause val frames = Vector(bigHeart, smallHeart, bigHeart, smallHeart, smallHeart) val delays = Vector(120, 120, 120, 120, 800) - val ticker = frame.get.flatMap { f => - IO.sleep(delays(f).millis) >> frame.update(f => (f + 1) % frames.size) - }.foreverM.background + val ticker = frame + .get + .flatMap { f => IO.sleep(delays(f).millis) >> frame.update(f => (f + 1) % frames.size) } + .foreverM + .background ticker.flatMap { _ => div( @@ -70,4 +72,4 @@ val etvinh: Contributor = Contributor("etvinh"): p("Excited to start building <3") ) } - } \ No newline at end of file + }