diff --git a/index.html b/index.html index 5073af1..faebfe1 100644 --- a/index.html +++ b/index.html @@ -1,7 +1,7 @@ nostr army knife - -
+ +
diff --git a/src/main/scala/Input.scala b/src/main/scala/Input.scala new file mode 100644 index 0000000..f05aa62 --- /dev/null +++ b/src/main/scala/Input.scala @@ -0,0 +1,38 @@ +import cats.effect.* +import cats.effect.syntax.all.* +import cats.syntax.all.* +import fs2.concurrent.* +import fs2.dom.{Event => _, *} +import io.circe.parser.* +import calico.* +import calico.html.io.{*, given} +import calico.syntax.* +import snow.* + +object Input { + def apply(): Resource[IO, HtmlDivElement[IO]] = + SignallingRef[IO] + .of("") + .toResource + .flatMap { input => + div( + textArea.withSelf { self => + ( + cls := "w-2/3 min-h-fit max-h-96 p-3", + placeholder := "paste something nostric", + onInput --> (_.foreach(_ => self.value.get.flatMap(input.set))), + value <-- input + ) + }, + div( + input.map(inp => + decode[Event](inp) match { + case Left(err) => err.toString + case Right(event) => event.toString + } + ) + ) + ) + } + +} diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala index 20f3f9a..99b877b 100644 --- a/src/main/scala/Main.scala +++ b/src/main/scala/Main.scala @@ -1,63 +1,13 @@ +import cats.effect.* import calico.* import calico.html.io.{*, given} import calico.syntax.* -import calico.unsafe.given -import cats.effect.* -import cats.effect.syntax.all.* -import cats.syntax.all.* -import fs2.* -import fs2.concurrent.* import fs2.dom.* object Main extends IOWebApp { - def Counter( - label: String, - initialStep: Int - ): Resource[IO, HtmlDivElement[IO]] = - SignallingRef[IO] - .of(initialStep) - .product(Channel.unbounded[IO, Int]) - .toResource - .flatMap { (step, diff) => - val allowedSteps = List(1, 2, 3, 5, 10) - - div( - p( - "Step: ", - select.withSelf { self => - ( - allowedSteps - .map(step => option(value := step.toString, step.toString)), - value <-- step.map(_.toString), - onChange --> { - _.evalMap(_ => self.value.get) - .map(_.toIntOption) - .unNone - .foreach(step.set) - } - ) - } - ), - p( - label + ": ", - b(diff.stream.scanMonoid.map(_.toString).holdOptionResource), - " ", - button( - "-", - onClick --> { - _.evalMap(_ => step.get).map(-1 * _).foreach(diff.send(_).void) - } - ), - button( - "+", - onClick --> (_.evalMap(_ => step.get).foreach(diff.send(_).void)) - ) - ) - ) - } - def render: Resource[IO, HtmlDivElement[IO]] = div( - h1("Let's count!"), - Counter("Sheep", initialStep = 3) + cls := "flex w-full h-full flex-col items-center justify-center", + h1(cls := "px-1 py-2 text-lg", "nostr army knife"), + Input() ) }