feat: Events

This commit is contained in:
DavidOnTop 2024-09-21 18:17:23 +02:00
parent 959241c16b
commit a942723186
No known key found for this signature in database
GPG key ID: 5D05538A45D5149F
13 changed files with 69 additions and 14 deletions

View file

@ -1,6 +1,6 @@
package top.davidon.sfs.dom
import top.davidon.sfs.dom.codecs.StringCodec
import top.davidon.sfs.dom.mods.Modifier
import top.davidon.sfs.dom.tags.Tag
/** tag + modifiers + value */

View file

@ -0,0 +1,9 @@
package top.davidon.sfs.dom
import org.scalajs.dom
import top.davidon.sfs.dom.mods.Modifier
trait ReactiveRenderer {
def valueFunc[F](element: dom.Element, value: F): Unit
def modifierFunc[F, T](modifier: Modifier[F, T], value: F): Unit
}

View file

@ -0,0 +1,5 @@
package top.davidon.sfs.dom
trait TriggerableValue[T] {
def trigger[T](value: T): Unit
}

View file

@ -0,0 +1,6 @@
package top.davidon.sfs.dom.codecs
class EmptyCodec[T] extends Codec[T, Unit] {
override def decode(domValue: Unit): T = ???
override def encode(scalaValue: T): Unit = {}
}

View file

@ -1,6 +1,7 @@
package top.davidon.sfs.dom.keys
import top.davidon.sfs.dom.codecs.{Codec, StringCodec}
import top.davidon.sfs.dom.{Modifier, Value}
import top.davidon.sfs.dom.Value
import top.davidon.sfs.dom.mods.Modifier
class AriaAttr[V](
suffix: String,

View file

@ -1,5 +1,33 @@
package top.davidon.sfs.dom.keys
import org.scalajs.dom
import top.davidon.sfs.dom.codecs.{EmptyCodec, StringAsIsCodec}
import top.davidon.sfs.dom.mods.{EventMod, Modifier}
import top.davidon.sfs.dom.{TriggerableValue, Value}
class EventProp[Event <: dom.Event](override val name: String) extends Key {}
class EventProp[E <: dom.Event](override val name: String) extends Key {
/** Don't use with StringRenderer and ssr off/false
* @param value
* @return
*/
def :=(value: E => Unit): Modifier[EventMod[E], Unit] = {
Modifier(this, Value(EventMod(this, value), EmptyCodec()))
}
/** Don't use with StringRenderer and ssr off/false
* @param value
* @return
*/
def :=(value: TriggerableValue[E]): Modifier[EventMod[E], Unit] = {
Modifier(this, Value(EventMod(this, value.trigger), EmptyCodec()))
}
/** Only use with StringRenderer and ssr off/false
* @param value
* @return
*/
def :=(value: String): Modifier[String, String] = {
Modifier(this, Value(value, StringAsIsCodec))
}
}

View file

@ -1,7 +1,8 @@
package top.davidon.sfs.dom.keys
import top.davidon.sfs.dom.codecs.{Codec, StringCodec}
import top.davidon.sfs.dom.{Modifier, Value}
import top.davidon.sfs.dom.Value
import top.davidon.sfs.dom.mods.Modifier
class HtmlAttr[V](
override val name: String,

View file

@ -1,6 +1,7 @@
package top.davidon.sfs.dom.keys
import top.davidon.sfs.dom.codecs.Codec
import top.davidon.sfs.dom.{Modifier, Value}
import top.davidon.sfs.dom.Value
import top.davidon.sfs.dom.mods.Modifier
class HtmlProp[V, DomV](
override val name: String,

View file

@ -1,6 +1,7 @@
package top.davidon.sfs.dom.keys
import top.davidon.sfs.dom.codecs.{Codec, StringCodec}
import top.davidon.sfs.dom.{Modifier, Value}
import top.davidon.sfs.dom.Value
import top.davidon.sfs.dom.mods.Modifier
class SvgAttr[V](
val localName: String,

View file

@ -0,0 +1,6 @@
package top.davidon.sfs.dom.mods
import org.scalajs.dom
import top.davidon.sfs.dom.keys.EventProp
class EventMod[E <: dom.Event](val key: EventProp[E], val value: E => Unit) {}

View file

@ -1,5 +1,6 @@
package top.davidon.sfs.dom
package top.davidon.sfs.dom.mods
import top.davidon.sfs.dom.Value
import top.davidon.sfs.dom.codecs.Codec
import top.davidon.sfs.dom.keys.Key

View file

@ -1,8 +1,8 @@
package top.davidon.sfs.dom.tags
import org.scalajs.dom
import top.davidon.sfs.dom.codecs.StringCodec
import top.davidon.sfs.dom.{Element, Modifier, Value}
import top.davidon.sfs.dom.mods.{EventMod, Modifier}
import top.davidon.sfs.dom.{Element, Value}
trait Tag[+Ref <: dom.Element] {
val name: String