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()
)
}