diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala deleted file mode 100644 index 88f0b9a..0000000 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala +++ /dev/null @@ -1,12 +0,0 @@ -package works.iterative.ui.components.tailwind - -import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent - -object LinkSupport: - - extension [El <: org.scalajs.dom.EventTarget]( - ep: EventProcessor[TypedTargetMouseEvent[El], TypedTargetMouseEvent[El]] - ) - def noKeyMod = - ep.filter(ev => !(ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala deleted file mode 100644 index 88f0b9a..0000000 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala +++ /dev/null @@ -1,12 +0,0 @@ -package works.iterative.ui.components.tailwind - -import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent - -object LinkSupport: - - extension [El <: org.scalajs.dom.EventTarget]( - ep: EventProcessor[TypedTargetMouseEvent[El], TypedTargetMouseEvent[El]] - ) - def noKeyMod = - ep.filter(ev => !(ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala index e1016e2..976cbd3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala @@ -16,7 +16,7 @@ )(using codec: FormCodec[V, String]): Input = input( idAttr := prop.id, - name := prop.name, + nameAttr := prop.name, tpe := inputType, cls := "block max-w-lg w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm border-gray-300 rounded-md", prop.value.map(v => value(codec.toForm(v))), diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala deleted file mode 100644 index 88f0b9a..0000000 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala +++ /dev/null @@ -1,12 +0,0 @@ -package works.iterative.ui.components.tailwind - -import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent - -object LinkSupport: - - extension [El <: org.scalajs.dom.EventTarget]( - ep: EventProcessor[TypedTargetMouseEvent[El], TypedTargetMouseEvent[El]] - ) - def noKeyMod = - ep.filter(ev => !(ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala index e1016e2..976cbd3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala @@ -16,7 +16,7 @@ )(using codec: FormCodec[V, String]): Input = input( idAttr := prop.id, - name := prop.name, + nameAttr := prop.name, tpe := inputType, cls := "block max-w-lg w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm border-gray-300 rounded-md", prop.value.map(v => value(codec.toForm(v))), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala index a8c3d81..de8760e 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala @@ -32,7 +32,7 @@ if v then "translate-x-5" else "translate-x-0" ) ), - composeEvents(onClick)( + onClick.compose( _.sample(currentValue.signal).map(v => !v) ) --> currentValue ), diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala deleted file mode 100644 index 88f0b9a..0000000 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala +++ /dev/null @@ -1,12 +0,0 @@ -package works.iterative.ui.components.tailwind - -import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent - -object LinkSupport: - - extension [El <: org.scalajs.dom.EventTarget]( - ep: EventProcessor[TypedTargetMouseEvent[El], TypedTargetMouseEvent[El]] - ) - def noKeyMod = - ep.filter(ev => !(ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala index e1016e2..976cbd3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala @@ -16,7 +16,7 @@ )(using codec: FormCodec[V, String]): Input = input( idAttr := prop.id, - name := prop.name, + nameAttr := prop.name, tpe := inputType, cls := "block max-w-lg w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm border-gray-300 rounded-md", prop.value.map(v => value(codec.toForm(v))), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala index a8c3d81..de8760e 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala @@ -32,7 +32,7 @@ if v then "translate-x-5" else "translate-x-0" ) ), - composeEvents(onClick)( + onClick.compose( _.sample(currentValue.signal).map(v => !v) ) --> currentValue ), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala index d41b4ab..5bb8f69 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala @@ -32,7 +32,7 @@ textArea( changeBus.events.map(numberOfLines) --> rowNo, changeBus.events --> updates, - name := fieldName, + nameAttr := fieldName, rows <-- rowNo.signal.map(_ + 2), mods, currentValue.map(value(_)), diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala deleted file mode 100644 index 88f0b9a..0000000 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala +++ /dev/null @@ -1,12 +0,0 @@ -package works.iterative.ui.components.tailwind - -import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent - -object LinkSupport: - - extension [El <: org.scalajs.dom.EventTarget]( - ep: EventProcessor[TypedTargetMouseEvent[El], TypedTargetMouseEvent[El]] - ) - def noKeyMod = - ep.filter(ev => !(ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala index e1016e2..976cbd3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala @@ -16,7 +16,7 @@ )(using codec: FormCodec[V, String]): Input = input( idAttr := prop.id, - name := prop.name, + nameAttr := prop.name, tpe := inputType, cls := "block max-w-lg w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm border-gray-300 rounded-md", prop.value.map(v => value(codec.toForm(v))), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala index a8c3d81..de8760e 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala @@ -32,7 +32,7 @@ if v then "translate-x-5" else "translate-x-0" ) ), - composeEvents(onClick)( + onClick.compose( _.sample(currentValue.signal).map(v => !v) ) --> currentValue ), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala index d41b4ab..5bb8f69 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala @@ -32,7 +32,7 @@ textArea( changeBus.events.map(numberOfLines) --> rowNo, changeBus.events --> updates, - name := fieldName, + nameAttr := fieldName, rows <-- rowNo.signal.map(_ + 2), mods, currentValue.map(value(_)), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala index 9f5a7b1..248c457 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala @@ -2,8 +2,8 @@ package list import com.raquo.laminar.api.L.{*, given} +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom -import com.raquo.laminar.builders.HtmlTag object IconText: case class ViewModel(text: HtmlElement, icon: SvgElement) diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala deleted file mode 100644 index 88f0b9a..0000000 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala +++ /dev/null @@ -1,12 +0,0 @@ -package works.iterative.ui.components.tailwind - -import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent - -object LinkSupport: - - extension [El <: org.scalajs.dom.EventTarget]( - ep: EventProcessor[TypedTargetMouseEvent[El], TypedTargetMouseEvent[El]] - ) - def noKeyMod = - ep.filter(ev => !(ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala index e1016e2..976cbd3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala @@ -16,7 +16,7 @@ )(using codec: FormCodec[V, String]): Input = input( idAttr := prop.id, - name := prop.name, + nameAttr := prop.name, tpe := inputType, cls := "block max-w-lg w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm border-gray-300 rounded-md", prop.value.map(v => value(codec.toForm(v))), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala index a8c3d81..de8760e 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala @@ -32,7 +32,7 @@ if v then "translate-x-5" else "translate-x-0" ) ), - composeEvents(onClick)( + onClick.compose( _.sample(currentValue.signal).map(v => !v) ) --> currentValue ), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala index d41b4ab..5bb8f69 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala @@ -32,7 +32,7 @@ textArea( changeBus.events.map(numberOfLines) --> rowNo, changeBus.events --> updates, - name := fieldName, + nameAttr := fieldName, rows <-- rowNo.signal.map(_ + 2), mods, currentValue.map(value(_)), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala index 9f5a7b1..248c457 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala @@ -2,8 +2,8 @@ package list import com.raquo.laminar.api.L.{*, given} +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom -import com.raquo.laminar.builders.HtmlTag object IconText: case class ViewModel(text: HtmlElement, icon: SvgElement) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala index 54d74f1..197ea5d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala @@ -3,7 +3,6 @@ import com.raquo.laminar.api.L.{*, given} import org.scalajs.dom -import com.raquo.laminar.builders.HtmlTag import com.raquo.laminar.nodes.ReactiveHtmlElement trait AsListRow[A]: diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala deleted file mode 100644 index 88f0b9a..0000000 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala +++ /dev/null @@ -1,12 +0,0 @@ -package works.iterative.ui.components.tailwind - -import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent - -object LinkSupport: - - extension [El <: org.scalajs.dom.EventTarget]( - ep: EventProcessor[TypedTargetMouseEvent[El], TypedTargetMouseEvent[El]] - ) - def noKeyMod = - ep.filter(ev => !(ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala index e1016e2..976cbd3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala @@ -16,7 +16,7 @@ )(using codec: FormCodec[V, String]): Input = input( idAttr := prop.id, - name := prop.name, + nameAttr := prop.name, tpe := inputType, cls := "block max-w-lg w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm border-gray-300 rounded-md", prop.value.map(v => value(codec.toForm(v))), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala index a8c3d81..de8760e 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala @@ -32,7 +32,7 @@ if v then "translate-x-5" else "translate-x-0" ) ), - composeEvents(onClick)( + onClick.compose( _.sample(currentValue.signal).map(v => !v) ) --> currentValue ), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala index d41b4ab..5bb8f69 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala @@ -32,7 +32,7 @@ textArea( changeBus.events.map(numberOfLines) --> rowNo, changeBus.events --> updates, - name := fieldName, + nameAttr := fieldName, rows <-- rowNo.signal.map(_ + 2), mods, currentValue.map(value(_)), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala index 9f5a7b1..248c457 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala @@ -2,8 +2,8 @@ package list import com.raquo.laminar.api.L.{*, given} +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom -import com.raquo.laminar.builders.HtmlTag object IconText: case class ViewModel(text: HtmlElement, icon: SvgElement) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala index 54d74f1..197ea5d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala @@ -3,7 +3,6 @@ import com.raquo.laminar.api.L.{*, given} import org.scalajs.dom -import com.raquo.laminar.builders.HtmlTag import com.raquo.laminar.nodes.ReactiveHtmlElement trait AsListRow[A]: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala index 0b7841b..5771e4d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala @@ -6,14 +6,14 @@ import works.iterative.ui.components.tailwind.TimeUtils import java.time.temporal.TemporalAccessor import java.text.DateFormat -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import java.time.format.DateTimeFormatter import java.time.ZoneId object SimpleWithIcons: def simpleDate(i: TemporalAccessor): HtmlElement = - time( - customHtmlAttr( + timeTag( + htmlAttr( "datetime", StringAsIsCodec ) := DateTimeFormatter.ISO_LOCAL_DATE @@ -28,19 +28,17 @@ date: HtmlElement, last: Boolean ): HtmlElement = + val lastDivider: Modifier[HtmlElement] = + span( + cls( + "absolute top-4 left-4 -ml-px h-full w-0.5 bg-gray-200" + ), + aria.hidden := true + ) li( div( cls("relative pb-8"), - if !last then - Some( - span( - cls( - "absolute top-4 left-4 -ml-px h-full w-0.5 bg-gray-200" - ), - aria.hidden := true - ) - ) - else None, + if !last then lastDivider else emptyMod, div( cls("relative flex space-x-3"), div( diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala deleted file mode 100644 index 88f0b9a..0000000 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala +++ /dev/null @@ -1,12 +0,0 @@ -package works.iterative.ui.components.tailwind - -import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent - -object LinkSupport: - - extension [El <: org.scalajs.dom.EventTarget]( - ep: EventProcessor[TypedTargetMouseEvent[El], TypedTargetMouseEvent[El]] - ) - def noKeyMod = - ep.filter(ev => !(ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala index e1016e2..976cbd3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala @@ -16,7 +16,7 @@ )(using codec: FormCodec[V, String]): Input = input( idAttr := prop.id, - name := prop.name, + nameAttr := prop.name, tpe := inputType, cls := "block max-w-lg w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm border-gray-300 rounded-md", prop.value.map(v => value(codec.toForm(v))), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala index a8c3d81..de8760e 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala @@ -32,7 +32,7 @@ if v then "translate-x-5" else "translate-x-0" ) ), - composeEvents(onClick)( + onClick.compose( _.sample(currentValue.signal).map(v => !v) ) --> currentValue ), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala index d41b4ab..5bb8f69 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala @@ -32,7 +32,7 @@ textArea( changeBus.events.map(numberOfLines) --> rowNo, changeBus.events --> updates, - name := fieldName, + nameAttr := fieldName, rows <-- rowNo.signal.map(_ + 2), mods, currentValue.map(value(_)), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala index 9f5a7b1..248c457 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala @@ -2,8 +2,8 @@ package list import com.raquo.laminar.api.L.{*, given} +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom -import com.raquo.laminar.builders.HtmlTag object IconText: case class ViewModel(text: HtmlElement, icon: SvgElement) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala index 54d74f1..197ea5d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala @@ -3,7 +3,6 @@ import com.raquo.laminar.api.L.{*, given} import org.scalajs.dom -import com.raquo.laminar.builders.HtmlTag import com.raquo.laminar.nodes.ReactiveHtmlElement trait AsListRow[A]: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala index 0b7841b..5771e4d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala @@ -6,14 +6,14 @@ import works.iterative.ui.components.tailwind.TimeUtils import java.time.temporal.TemporalAccessor import java.text.DateFormat -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import java.time.format.DateTimeFormatter import java.time.ZoneId object SimpleWithIcons: def simpleDate(i: TemporalAccessor): HtmlElement = - time( - customHtmlAttr( + timeTag( + htmlAttr( "datetime", StringAsIsCodec ) := DateTimeFormatter.ISO_LOCAL_DATE @@ -28,19 +28,17 @@ date: HtmlElement, last: Boolean ): HtmlElement = + val lastDivider: Modifier[HtmlElement] = + span( + cls( + "absolute top-4 left-4 -ml-px h-full w-0.5 bg-gray-200" + ), + aria.hidden := true + ) li( div( cls("relative pb-8"), - if !last then - Some( - span( - cls( - "absolute top-4 left-4 -ml-px h-full w-0.5 bg-gray-200" - ), - aria.hidden := true - ) - ) - else None, + if !last then lastDivider else emptyMod, div( cls("relative flex space-x-3"), div( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/navigation/Tabs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/navigation/Tabs.scala index 5918215..aac3596 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/navigation/Tabs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/navigation/Tabs.scala @@ -24,7 +24,7 @@ label(forId := "tabs", cls := "sr-only", "Select a tab"), select( idAttr := "tabs", - name := "tabs", + nameAttr := "tabs", cls := "block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md", tabs.map { case (t, _) => option( @@ -40,7 +40,7 @@ cls := "hidden sm:block", div( cls := "border-b border-gray-200", - nav( + navTag( cls := "-mb-px flex space-x-8", aria.label := "Tabs", tabs.map { case (t, v) => diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt index 324e88a..eb56cda 100644 --- a/project/project/plugins.sbt +++ b/project/project/plugins.sbt @@ -3,5 +3,5 @@ resolvers += "IW snapshots" at "https://dig.iterative.works/maven/snapshots" addSbtPlugin( - "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.16" + "works.iterative.sbt" % "sbt-iw-plugin-presets" % "0.3.17" ) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala index cc4ee36..cdc03d6 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileSelector.scala @@ -2,14 +2,14 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import works.iterative.ui.components.tailwind.Loading import io.laminext.syntax.core.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec object FileSelector: - import FilePicker._ + import FilePicker.* def apply( initialFiles: List[File], @@ -22,7 +22,7 @@ "inline-block transform overflow-hidden rounded-lg bg-white text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-7xl sm:align-middle" ), role("dialog"), - customHtmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), + htmlAttr("aria.modal", BooleanAsTrueFalseStringCodec)(true), aria.labelledBy("modal-headline"), div( cls("bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4"), @@ -50,7 +50,7 @@ "focus:shadow-outline-green inline-flex w-full justify-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-base font-medium leading-6 text-white shadow-sm transition duration-150 ease-in-out hover:bg-indigo-500 focus:border-indigo-700 focus:outline-none sm:text-sm sm:leading-5" ), "Potvrdit", - composeEvents(onClick)( + onClick.compose( _.sample(selectedFiles) .map(SelectionUpdated(_)) ) --> selectionUpdates diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala index c665744..fb129be 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/FileTable.scala @@ -2,7 +2,7 @@ package components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import works.iterative.ui.components.tailwind.Icons import java.time.format.DateTimeFormatter import java.time.format.FormatStyle @@ -15,7 +15,7 @@ files: Signal[List[File]], maybeSelection: Option[Var[Set[File]]] = None ): HtmlElement = - val scope = customHtmlAttr("scope", StringAsIsCodec) + val scope = htmlAttr("scope", StringAsIsCodec) val selectedFiles = maybeSelection.getOrElse(Var(Set.empty)) val openCategories = Var[Set[String]]( maybeSelection.map(_.now().map(_.category)).getOrElse(Set.empty) diff --git a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala index 8de85e4..ce2e119 100644 --- a/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala +++ b/ui/js/src/main/scala/works/iterative/services/files/components/tailwind/UploadButton.scala @@ -35,7 +35,7 @@ input( cls := "cursor-pointer hidden", tpe := "file", - name := "files", + nameAttr := "files", multiple := true, inContext(thisNode => onInput.mapTo(thisNode.ref.files) --> upload) ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala index 8e6cab2..56f3864 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/headless/Toggle.scala @@ -21,7 +21,7 @@ val state: Var[Boolean] = Var(initialValue) children( Ctx( - composeEvents(onClick)(_.sample(state).map(v => !v)) --> state, + onClick.compose(_.sample(state).map(v => !v)) --> state, el => state.signal.map { case true => el diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala index 9a54dea..a2c637c 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/Bins.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag case class Bin[Source, +Value]( label: String, diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala index 480f5a9..646e73d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/DashboardComponentsModule.scala @@ -4,7 +4,7 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import works.iterative.ui.model.color.ColorDef -import com.raquo.laminar.builders.HtmlTag +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom.html.UList import com.raquo.laminar.nodes.ReactiveHtmlElement import works.iterative.ui.components.tailwind.ComponentContext @@ -22,7 +22,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li + ): LI def cardInitials( initials: String, color: Signal[ColorKind], @@ -71,7 +71,7 @@ label: String, initials: Div, children: Modifier[HtmlElement] - ): Li = + ): LI = li( div( cls("col-span-1 flex shadow-sm rounded-md"), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala index c97ca24..7714490 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/FormComponentsModule.scala @@ -5,8 +5,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala index 6713728..8cfc1d9 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/IconsModule.scala @@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import works.iterative.ui.components.tailwind.CustomAttrs trait IconsModule: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala index f7bacb1..46e826d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LaminarComponent.scala @@ -20,7 +20,7 @@ val actions$ = actions.events.recover(handleFailure) - val processor$ = actions$.foldLeft(zero) { case ((m, _), a) => + val processor$ = actions$.scanLeft(zero) { case ((m, _), a) => handle(a, m) } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala index d00f80c..5946974 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/ListComponentsModule.scala @@ -6,7 +6,6 @@ import works.iterative.ui.components.tailwind.laminar.LaminarExtensions.given import com.raquo.laminar.nodes.ReactiveHtmlElement import org.scalajs.dom.html.Paragraph -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.nodes.TextNode trait ListComponentsModule: @@ -20,7 +19,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li + ): LI def unordered( children: Modifier[HtmlElement] ): ReactiveHtmlElement[org.scalajs.dom.html.UList] @@ -42,7 +41,7 @@ subtitle: Option[String], right: Modifier[HtmlElement] = emptyMod, avatar: Option[Modifier[HtmlElement]] = None - ): Li = + ): LI = li( cls("group"), div( @@ -102,7 +101,7 @@ ) override def navigation(sections: Modifier[HtmlElement]): HtmlElement = - nav( + navTag( cls("flex-1 min-h-0 overflow-y-auto"), sections ) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala index 31d860d..4a2af6a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/LocalDateSelect.scala @@ -3,11 +3,10 @@ import com.raquo.laminar.api.L import com.raquo.laminar.api.L.{*, given} import works.iterative.ui.components.tailwind.ComponentContext + import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent -import org.scalajs.dom.html +import org.scalajs.dom.{Event, html} import com.raquo.laminar.modifiers.KeyUpdater trait LocalDateSelectModule: @@ -23,28 +22,27 @@ // Does not work in `controlled` // Laminar refuses the custom prop, requries its own `value` or `checked` - val value: ReactiveProp[Option[LocalDate], String] = - customProp("value", OptLocalDateAsStringCodec) + val value: HtmlProp[Option[LocalDate]] = + htmlProp("value", OptLocalDateAsStringCodec) - val min: ReactiveProp[LocalDate, String] = - customProp("min", LocalDateAsStringCodec) + val min: HtmlProp[LocalDate] = + htmlProp("min", LocalDateAsStringCodec) - val max: ReactiveProp[LocalDate, String] = - customProp("max", LocalDateAsStringCodec) + val max: HtmlProp[LocalDate] = + htmlProp("max", LocalDateAsStringCodec) - val onInput: EventProcessor[TypedTargetEvent[html.Element], LocalDate] = + val onInput: EventProcessor[Event, LocalDate] = L.onInput.mapToValue.setAsValue.map(parseDate).collect { case Some(d) => d } - val onOptInput - : EventProcessor[TypedTargetEvent[html.Element], Option[LocalDate]] = + val onOptInput: EventProcessor[Event, Option[LocalDate]] = onInput.mapToValue.setAsValue.map(parseDate) object LocalDateSelect: import java.time.format.DateTimeFormatter import java.time.LocalDate - import com.raquo.domtypes.generic.codecs.Codec + import com.raquo.laminar.codecs.Codec private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala index 318d3d3..210bbf8 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/tailwindui/LabelsOnLeftFormComponentsModule.scala @@ -6,8 +6,6 @@ import works.iterative.ui.components.tailwind.ComponentContext import java.time.LocalDate import java.time.format.DateTimeFormatter -import com.raquo.laminar.keys.ReactiveProp -import com.raquo.domtypes.jsdom.defs.events.TypedTargetEvent import org.scalajs.dom.html import com.raquo.laminar.modifiers.KeyUpdater @@ -98,7 +96,7 @@ ), input( tpe := "search", - name := "search", + nameAttr := "search", idAttr := id, cls := "focus:ring-pink-500 focus:border-pink-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md", placeholderText @@ -145,7 +143,7 @@ labelText, input( idAttr(id), - name(id), + nameAttr(id), autoComplete("date"), tpe("date"), cls( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala index 637c787..7d6cc70 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Avatar.scala @@ -2,7 +2,7 @@ import CustomAttrs.ariaHidden import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec // TODO: macros for size class Avatar($avatarImg: Signal[Option[String]]): diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala index 6fb453c..b803b06 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/CustomAttrs.scala @@ -1,19 +1,18 @@ package works.iterative.ui.components.tailwind import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.generic.codecs.StringAsIsCodec -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec +import com.raquo.laminar.codecs.{StringAsIsCodec, BooleanAsTrueFalseStringCodec} object CustomAttrs { // Made a pull request to add aria-current to scala-dom-types, remove after - val ariaCurrent = customHtmlAttr("aria-current", StringAsIsCodec) - val ariaHidden = customHtmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + val ariaCurrent = htmlAttr("aria-current", StringAsIsCodec) + val ariaHidden = htmlAttr("aria-hidden", BooleanAsTrueFalseStringCodec) - val datetime = customHtmlAttr("datetime", StringAsIsCodec) + val datetime = htmlAttr("datetime", StringAsIsCodec) object svg { import com.raquo.laminar.api.L.svg.{*, given} val ariaHidden = - customSvgAttr("aria-hidden", BooleanAsTrueFalseStringCodec) + svgAttr("aria-hidden", BooleanAsTrueFalseStringCodec, None) } } diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala index a2f8519..4cb815d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/Icons.scala @@ -1,12 +1,9 @@ package works.iterative.ui.components.tailwind -import com.raquo.domtypes.generic.codecs.BooleanAsTrueFalseStringCodec -import com.raquo.domtypes.generic.defs.attrs.AriaAttrs +import com.raquo.laminar.codecs.BooleanAsTrueFalseStringCodec import com.raquo.laminar.api.L.svg.{*, given} import com.raquo.laminar.api.L.SvgElement -import com.raquo.laminar.builders.SvgBuilders -import com.raquo.laminar.keys.ReactiveSvgAttr -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import com.raquo.laminar.nodes.ReactiveSvgElement object Icons: @@ -16,7 +13,7 @@ inline def spinner(extraClasses: String): SvgElement = svg( cls(extraClasses), - customSvgAttr("role", StringAsIsCodec) := "status", + svgAttr("role", StringAsIsCodec, None) := "status", cls := "inline mr-2 text-gray-200 animate-spin dark:text-gray-600 fill-indigo-600", viewBox := "0 0 100 101", fill := "none", diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala deleted file mode 100644 index 88f0b9a..0000000 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/LinkSupport.scala +++ /dev/null @@ -1,12 +0,0 @@ -package works.iterative.ui.components.tailwind - -import com.raquo.laminar.api.L.{*, given} -import com.raquo.domtypes.jsdom.defs.events.TypedTargetMouseEvent - -object LinkSupport: - - extension [El <: org.scalajs.dom.EventTarget]( - ep: EventProcessor[TypedTargetMouseEvent[El], TypedTargetMouseEvent[El]] - ) - def noKeyMod = - ep.filter(ev => !(ev.ctrlKey || ev.metaKey || ev.shiftKey || ev.altKey)) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala index e1016e2..976cbd3 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Inputs.scala @@ -16,7 +16,7 @@ )(using codec: FormCodec[V, String]): Input = input( idAttr := prop.id, - name := prop.name, + nameAttr := prop.name, tpe := inputType, cls := "block max-w-lg w-full shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm border-gray-300 rounded-md", prop.value.map(v => value(codec.toForm(v))), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala index a8c3d81..de8760e 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/Switch.scala @@ -32,7 +32,7 @@ if v then "translate-x-5" else "translate-x-0" ) ), - composeEvents(onClick)( + onClick.compose( _.sample(currentValue.signal).map(v => !v) ) --> currentValue ), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala index d41b4ab..5bb8f69 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/form/TextArea.scala @@ -32,7 +32,7 @@ textArea( changeBus.events.map(numberOfLines) --> rowNo, changeBus.events --> updates, - name := fieldName, + nameAttr := fieldName, rows <-- rowNo.signal.map(_ + 2), mods, currentValue.map(value(_)), diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala index 9f5a7b1..248c457 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/IconText.scala @@ -2,8 +2,8 @@ package list import com.raquo.laminar.api.L.{*, given} +import com.raquo.laminar.tags.HtmlTag import org.scalajs.dom -import com.raquo.laminar.builders.HtmlTag object IconText: case class ViewModel(text: HtmlElement, icon: SvgElement) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala index 54d74f1..197ea5d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/list/ListRow.scala @@ -3,7 +3,6 @@ import com.raquo.laminar.api.L.{*, given} import org.scalajs.dom -import com.raquo.laminar.builders.HtmlTag import com.raquo.laminar.nodes.ReactiveHtmlElement trait AsListRow[A]: diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala index 0b7841b..5771e4d 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/lists/feeds/SimpleWithIcons.scala @@ -6,14 +6,14 @@ import works.iterative.ui.components.tailwind.TimeUtils import java.time.temporal.TemporalAccessor import java.text.DateFormat -import com.raquo.domtypes.generic.codecs.StringAsIsCodec +import com.raquo.laminar.codecs.StringAsIsCodec import java.time.format.DateTimeFormatter import java.time.ZoneId object SimpleWithIcons: def simpleDate(i: TemporalAccessor): HtmlElement = - time( - customHtmlAttr( + timeTag( + htmlAttr( "datetime", StringAsIsCodec ) := DateTimeFormatter.ISO_LOCAL_DATE @@ -28,19 +28,17 @@ date: HtmlElement, last: Boolean ): HtmlElement = + val lastDivider: Modifier[HtmlElement] = + span( + cls( + "absolute top-4 left-4 -ml-px h-full w-0.5 bg-gray-200" + ), + aria.hidden := true + ) li( div( cls("relative pb-8"), - if !last then - Some( - span( - cls( - "absolute top-4 left-4 -ml-px h-full w-0.5 bg-gray-200" - ), - aria.hidden := true - ) - ) - else None, + if !last then lastDivider else emptyMod, div( cls("relative flex space-x-3"), div( diff --git a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/navigation/Tabs.scala b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/navigation/Tabs.scala index 5918215..aac3596 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/tailwind/navigation/Tabs.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/tailwind/navigation/Tabs.scala @@ -24,7 +24,7 @@ label(forId := "tabs", cls := "sr-only", "Select a tab"), select( idAttr := "tabs", - name := "tabs", + nameAttr := "tabs", cls := "block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md", tabs.map { case (t, _) => option( @@ -40,7 +40,7 @@ cls := "hidden sm:block", div( cls := "border-b border-gray-200", - nav( + navTag( cls := "-mb-px flex space-x-8", aria.label := "Tabs", tabs.map { case (t, v) => diff --git a/ui/js/src/main/scala/works/iterative/ui/scenarios/ScenarioMain.scala b/ui/js/src/main/scala/works/iterative/ui/scenarios/ScenarioMain.scala index 90e446c..ea8fe8a 100644 --- a/ui/js/src/main/scala/works/iterative/ui/scenarios/ScenarioMain.scala +++ b/ui/js/src/main/scala/works/iterative/ui/scenarios/ScenarioMain.scala @@ -42,7 +42,7 @@ identity[String], routeFallback = _ => scenarios.head.id )( - windowEvents.onPopState, + windowEvents(_.onPopState), unsafeWindowOwner ) @@ -64,12 +64,12 @@ cls( "flex grow flex-col gap-y-5 overflow-y-auto border-r border-gray-200 bg-white px-6 pb-4" ), - nav( + navTag( cls("flex flex-1 flex-col"), ul( role("list"), cls("flex flex-1 flex-col gap-y-7"), - children <-- router.$currentPage.map(id => + children <-- router.currentPageSignal.map(id => scenarios.map(s => li( a( @@ -92,13 +92,13 @@ ) ) ), - com.raquo.laminar.api.L.main( + mainTag( cls("h-full pl-72"), div( cls( "h-full max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8" ), - child <-- router.$currentPage.map(scenarioMap(_).element) + child <-- router.currentPageSignal.map(scenarioMap(_).element) ) ) )