From 69d7878b83c015cfd14189446fa96bcd7368f89f Mon Sep 17 00:00:00 2001 From: Cause Chung Date: Mon, 1 May 2017 17:37:03 +0800 Subject: [PATCH 1/3] Setup devolopment build environment. --- .gitignore | 1 + build.sbt | 11 +- incubation/README.md | 38 + incubation/index.html | 67 ++ incubation/package.json | 32 + .../sri.web.vdom/bugfix/DOMPropsTest.scala | 8 + .../main/scala/sri/web/template/WebApp.scala | 18 + .../web/template/components/HomeScreen.scala | 51 ++ .../components/StyledTagsComTest.scala | 34 + .../sri/web/template/styles/AppStyles.scala | 12 + .../sri/web/template/styles/GlobalStyle.scala | 28 + incubation/webpack.config.js | 50 ++ .../sri/macros/web/StyledAttributes.scala | 767 ++++++++++++++++++ .../scala/sri/macros/web/StyledTags.scala | 371 +++++++++ .../main/scala/sri/macros/web/TagMacro.scala | 99 +++ .../main/scala/sri/macros/web/package.scala | 10 + .../scala/sri/macros/web/styledtags.scala | 25 + project/IntegrationProjectsSettings.scala | 57 ++ 18 files changed, 1678 insertions(+), 1 deletion(-) create mode 100644 incubation/README.md create mode 100644 incubation/index.html create mode 100644 incubation/package.json create mode 100644 incubation/src/main/scala/sri.web.vdom/bugfix/DOMPropsTest.scala create mode 100644 incubation/src/main/scala/sri/web/template/WebApp.scala create mode 100644 incubation/src/main/scala/sri/web/template/components/HomeScreen.scala create mode 100644 incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala create mode 100644 incubation/src/main/scala/sri/web/template/styles/AppStyles.scala create mode 100644 incubation/src/main/scala/sri/web/template/styles/GlobalStyle.scala create mode 100644 incubation/webpack.config.js create mode 100644 macros/src/main/scala/sri/macros/web/StyledAttributes.scala create mode 100644 macros/src/main/scala/sri/macros/web/StyledTags.scala create mode 100644 macros/src/main/scala/sri/macros/web/TagMacro.scala create mode 100644 macros/src/main/scala/sri/macros/web/package.scala create mode 100644 macros/src/main/scala/sri/macros/web/styledtags.scala create mode 100644 project/IntegrationProjectsSettings.scala diff --git a/.gitignore b/.gitignore index 49c05a7..c6ff1ba 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ npm-debug.log #project +incubation/assets/ \ No newline at end of file diff --git a/build.sbt b/build.sbt index 49275f7..575770b 100644 --- a/build.sbt +++ b/build.sbt @@ -1,3 +1,4 @@ +shellPrompt in ThisBuild := { state => Project.extract(state).currentRef.project + "> " } name := "vdom" //version := "2017.4.0-SNAPSHOT" @@ -8,7 +9,7 @@ val scala211 = "2.11.11" val scala212 = "2.12.2" -scalaVersion := scala211 +scalaVersion := scala212 crossScalaVersions := Seq(scala211, scala212) @@ -47,3 +48,11 @@ scalaJSStage in Global := FastOptStage //Tasks: Tasks.taskSettings + +//Integration Incubation and Test Project: +import IntegrationProjectsSettings._ +val vdom = project in file(".") +val incubationMacros = (project in file("./macros")) + .settings(commonSettings,macrosSettings).enablePlugins(ScalaJSPlugin).dependsOn(vdom) +val incubation = (project in file("./incubation")) + .settings(commonSettings,incubationSettings).enablePlugins(ScalaJSPlugin).dependsOn(incubationMacros) diff --git a/incubation/README.md b/incubation/README.md new file mode 100644 index 0000000..24455b5 --- /dev/null +++ b/incubation/README.md @@ -0,0 +1,38 @@ +# sri-vdom-incubation + +This is a sub project of **vdom** + +## How to Run + +```scala + +sbt ~fastOptJS + +//open new terminal + +npm install + +npm start + +//open http://localhost:8090/ in browser + +``` + +### scalatags-like Styled Tags + +```scala +import sri.core._ +import sri.macros.web.styledtagsPrefix_<^._ + +def render(): ReactElement = <.div( + ^.className := "some", + ^.value := "asdf" + )( + <.p()("This is generated by styled tags."), + <.input( + ^.onClick := onTextChange _, + ^.value := props.getState().text + ) + ) +``` +Compatible with Intellij IDEA. \ No newline at end of file diff --git a/incubation/index.html b/incubation/index.html new file mode 100644 index 0000000..eae3af5 --- /dev/null +++ b/incubation/index.html @@ -0,0 +1,67 @@ + + + + + Sri web template + + + + +
+ + + + + + diff --git a/incubation/package.json b/incubation/package.json new file mode 100644 index 0000000..71c54ae --- /dev/null +++ b/incubation/package.json @@ -0,0 +1,32 @@ +{ + "name": "sri-web-template", + "version": "0.6.0", + "description": "sri web template project", + "repository": { + "type": "git", + "url": "" + }, + "scripts": { + "start": "webpack & webpack-dev-server --progress --colors --port 8090 --history-api-fallback", + "build": "webpack --config webpack.config.prod.js" + }, + "devDependencies": { + "babel": "5.8.21", + "babel-loader": "5.3.2", + "compression-webpack-plugin": "^0.2.0", + "css-loader": "^0.14.5", + "file-loader": "^0.8.4", + "image-webpack-loader": "^1.6.1", + "lodash": "^3.9.3", + "node-libs-browser": "^0.5.2", + "style-loader": "^0.12.3", + "url-loader": "^0.5.6", + "webpack": "^1.12.13", + "webpack-dev-server": "^1.14.1" + }, + "dependencies": { + "history": "4.4.0", + "react": "15.4.1", + "react-dom": "15.4.1" + } +} diff --git a/incubation/src/main/scala/sri.web.vdom/bugfix/DOMPropsTest.scala b/incubation/src/main/scala/sri.web.vdom/bugfix/DOMPropsTest.scala new file mode 100644 index 0000000..36993b7 --- /dev/null +++ b/incubation/src/main/scala/sri.web.vdom/bugfix/DOMPropsTest.scala @@ -0,0 +1,8 @@ +package sri.web.vdom.bugfix + +/** + * Created by cuz on 17-5-1. + */ +object DOMPropsTest { + +} diff --git a/incubation/src/main/scala/sri/web/template/WebApp.scala b/incubation/src/main/scala/sri/web/template/WebApp.scala new file mode 100644 index 0000000..2bb65cf --- /dev/null +++ b/incubation/src/main/scala/sri/web/template/WebApp.scala @@ -0,0 +1,18 @@ +package sri.web.template + +import org.scalajs.dom +import sri.web.ReactDOM +import sri.web.template.components.HomeScreen +import sri.web.template.styles.AppStyles + +import scala.scalajs.js.JSApp + +object WebApp extends JSApp { + + def main(): Unit = { + AppStyles.load() + ReactDOM.render(HomeScreen(), dom.document.getElementById("app")) + println("[info] Client rendering completed.") + } + +} diff --git a/incubation/src/main/scala/sri/web/template/components/HomeScreen.scala b/incubation/src/main/scala/sri/web/template/components/HomeScreen.scala new file mode 100644 index 0000000..a0d2618 --- /dev/null +++ b/incubation/src/main/scala/sri/web/template/components/HomeScreen.scala @@ -0,0 +1,51 @@ +package sri.web.template.components + +import org.scalajs.dom +import sri.core._ +import sri.web.template.styles.GlobalStyle +import sri.web.vdom.tags._ +import sri.scalacss.Defaults._ +import sri.web.vdom.DOMProps + +import scala.scalajs.js.annotation.ScalaJSDefined +import scala.scalajs.js.{UndefOr => U} + +@ScalaJSDefined +class HomeScreen extends ComponentS[HomeScreen.State] { + + import HomeScreen._ + + initialState(State("sri")) + + def render() = { + div(className = GlobalStyle.flexOneAndCenter)( + span(className = GlobalStyle.bigText)("Home Screen"), + input(value = state.text, onChange = onTextChange _), + input(value = state.text, extraProps = attr), + StyledTagsComTest(StyledTagsComTest.Props(() => state, _setState)) + ) + } + + def _setState(s: State): Unit = setState(_ => s) + + val attr = { + val domProps = new DOMProps {override val className = "some class name"} + domProps.onChange = (_: ReactEventI) => println("asdfasfasdfasdfasdf") + domProps + } + + + def onTextChange(e: ReactEventI) = { + val value = e.target.value + dom.window.console.log(value) + setState((state: State) => state.copy(text = value)) + } +} + +object HomeScreen { + + case class State(text: String) + + def apply() = CreateElementNoProps[HomeScreen]() + +} diff --git a/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala b/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala new file mode 100644 index 0000000..8ef8c36 --- /dev/null +++ b/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala @@ -0,0 +1,34 @@ +package sri.web.template.components + +import org.scalajs.dom +import sri.core.{ComponentP, CreateElement, ReactElement} +import sri.macros.web.styledtagsPrefix_<^._ +import sri.web.template.components.HomeScreen.State +import sri.web.vdom.tags.ReactEventI + +import scala.scalajs.js.annotation.ScalaJSDefined + +@ScalaJSDefined +private class StyledTagsComTest extends ComponentP[StyledTagsComTest.Props] { + override def render(): ReactElement = <.div( + ^.className := "some", + ^.value := "asdf" + )( + <.p()("This is generated by styled tags."), + <.input( + ^.onClick := onTextChange _, + ^.value := props.getState().text + ) + ) + + def onTextChange(e: ReactEventI) = { + val value = e.target.value + dom.window.console.log(value) + props.setState(props.getState().copy(text = value)) + } +} + +private object StyledTagsComTest { + case class Props(getState: () => State, setState: State => Unit) + def apply(props: Props): ReactElement = CreateElement[StyledTagsComTest](props) +} \ No newline at end of file diff --git a/incubation/src/main/scala/sri/web/template/styles/AppStyles.scala b/incubation/src/main/scala/sri/web/template/styles/AppStyles.scala new file mode 100644 index 0000000..e7341a7 --- /dev/null +++ b/incubation/src/main/scala/sri/web/template/styles/AppStyles.scala @@ -0,0 +1,12 @@ +package sri.web.template.styles + +import scalacss.Defaults._ +import scalacss.internal.mutable.GlobalRegistry + +object AppStyles { + + def load() = { + GlobalRegistry.register(GlobalStyle) + GlobalRegistry.addToDocumentOnRegistration() + } +} diff --git a/incubation/src/main/scala/sri/web/template/styles/GlobalStyle.scala b/incubation/src/main/scala/sri/web/template/styles/GlobalStyle.scala new file mode 100644 index 0000000..abef207 --- /dev/null +++ b/incubation/src/main/scala/sri/web/template/styles/GlobalStyle.scala @@ -0,0 +1,28 @@ +package sri.web.template.styles + +import scalacss.Defaults._ + +object GlobalStyle extends StyleSheet.Inline { + + import dsl._ + + val flexOneAndCenter = style( + display.flex, + flexDirection.column, + flex := "1", + alignItems.center, + justifyContent.center) + + val vertical = style(display.flex, flexDirection.column) + + val horizontal = style(display.flex, flexDirection.row) + + val flexOneAndDirectionRow = style(horizontal, flex := "1") + + val flexOneAndDirectionVertical = style(vertical, flex := "1") + + + val bigText = style(fontWeight._500, + fontSize(1.5.em)) + +} diff --git a/incubation/webpack.config.js b/incubation/webpack.config.js new file mode 100644 index 0000000..7dc06f0 --- /dev/null +++ b/incubation/webpack.config.js @@ -0,0 +1,50 @@ +'use strict'; + +var webpack = require('webpack'); +var path = require('path'); +var NODE_ENV = process.env.NODE_ENV; + + +module.exports = { + + entry: { + mainpage: './assets/scalajs-output.js' + }, + output: { + path: __dirname + '/assets', + publicPath: "/assets/", + filename: '[name]-bundle.js' + }, + plugins: [ + new webpack.NoErrorsPlugin(), + new webpack.DefinePlugin({ + 'process.env': { + 'NODE_ENV': JSON.stringify('development') + } + }) + ], + module: { + loaders: [ + + { + test: /\.json$/, + loader: "json-loader" + }, + + { + test: /\.css$/, + loader: 'style-loader!css-loader' + }, + + { + test: /\.(png|jpg|svg)$/, + loaders: [ + 'url-loader?limit=8192', + 'image-webpack?optimizationLevel=7&progressive=true'] + } // inline base64 URLs for <=8k images, direct URLs for the rest, + + ] + } + + +}; \ No newline at end of file diff --git a/macros/src/main/scala/sri/macros/web/StyledAttributes.scala b/macros/src/main/scala/sri/macros/web/StyledAttributes.scala new file mode 100644 index 0000000..47e78c3 --- /dev/null +++ b/macros/src/main/scala/sri/macros/web/StyledAttributes.scala @@ -0,0 +1,767 @@ +package sri.macros.web + +import scalajs.js +import js.| + +/** The code is generated by sbt task. */ +trait StyledAttributes { + object defer {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object coords {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object span {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object method {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object keyType {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object challenge {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object name {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object formNoValidate {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object tabIndex {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object is {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object accept {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object loop {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object marginWidth {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object step {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object classID {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object size {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object optimum {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object readOnly {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object pattern {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object scrolling {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object nonce {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object cellSpacing {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object frameBorder {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object contentEditable {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object role {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object checked {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object acceptCharset {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object scope {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object icon {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object hrefLang {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object data {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object label {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object hidden {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object marginHeight {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object rel {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object height {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object radioGroup {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object min {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object selected {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object cellPadding {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object srcDoc {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object charSet {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object placeholder {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object open {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object inputMode {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object dateTime {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object crossOrigin {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object autoFocus {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object formTarget {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object poster {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object htmlFor {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object seamless {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object dir {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object low {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object id {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object async {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object wrap {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object autoComplete {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object max {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object profile {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object allowFullScreen {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object cite {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object draggable {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object alt {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object httpEquiv {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object formMethod {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object default {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object accessKey {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object className {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object srcLang {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object sandbox {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object src {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object encType {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object colSpan {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object content {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object mediaGroup {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object rowSpan {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object media {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object useMap {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object scoped {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object disabled {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object target {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object srcSet {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object minLength {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object spellCheck {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object shape {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object formEncType {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object sizes {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object manifest {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object multiple {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object kind {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object title {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object allowTransparency {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object lang {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object headers {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object `type` {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object form {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object required {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object href {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object start {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object capture {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object preload {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object rows {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object width {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object autoPlay {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object reversed {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object download {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object value {def :=(v: js.UndefOr[String | Double | Int]): TypedProp[js.UndefOr[String | Double | Int]] = DummyProp} + + object muted {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object noValidate {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object maxLength {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object action {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object summary {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object integrity {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object contextMenu {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object high {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object cols {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object formAction {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object list {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object keyParams {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object controls {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object amplitude {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object numOctaves {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object colorInterpolation {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object format {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object divisor {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object kernelUnitLength {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object floodColor {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object clipPathUnits {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object x {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object contentStyleType {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object begin {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object intercept {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object xlinkRole {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object maskUnits {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object accumulate {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object contentScriptType {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object k2 {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object in {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object textRendering {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object kernelMatrix {def :=(v: js.UndefOr[js.Array[Double]]): TypedProp[js.UndefOr[js.Array[Double]]] = DummyProp} + + object keyTimes {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object shapeRendering {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object dy {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object mask {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object pointsAtZ {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object seed {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object tableValues {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object overflow {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object xlinkShow {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object strokeDasharray {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object maskContentUnits {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object textAnchor {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object arabicForm {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object xlinkActuate {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object keyPoints {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object y {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object strokeOpacity {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object refY {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object viewBox {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object patternTransform {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object cx {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object textDecoration {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object scale {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object filterUnits {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object externalResourcesRequired {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object baseFrequency {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object g2 {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object stroke {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object clipPath {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object result {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object specularExponent {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object fillOpacity {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object horizOriginY {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object fontSizeAdjust {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object clipRule {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object limitingConeAngle {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object fx {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object additive {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object local {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object paintOrder {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object stopOpacity {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object colorInterpolationFilters {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object calcMode {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object refX {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object pointsAtY {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object repeatDur {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object dur {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object fontStyle {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object in2 {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object direction {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object enableBackground {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object pathLength {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object colorRendering {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object g1 {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object rx {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object specularConstant {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object x2 {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object viewTarget {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object exponent {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object cursor {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object radius {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object yChannelSelector {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object cy {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object xmlBase {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object to {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object attributeName {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object glyphRef {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object xmlSpace {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object filter {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object rotate {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object lengthAdjust {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object repeatCount {def :=(v: js.UndefOr[String | Int]): TypedProp[js.UndefOr[String | Int]] = DummyProp} + + object gradientTransform {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object fy {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object version {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object xlinkHref {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object markerWidth {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object fontFamily {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object gradientUnits {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object points {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object pointsAtX {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object kerning {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object offset {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object strokeDashoffset {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object horizOriginX {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object glyphOrientationHorizontal {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object elevation {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object letterSpacing {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object preserveAspectRatio {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object strokeLinecap {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object y1 {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object baseProfile {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object horizAdvX {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object wordSpacing {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object xmlLang {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object xChannelSelector {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object order {def :=(v: js.UndefOr[Int]): TypedProp[js.UndefOr[Int]] = DummyProp} + + object fill {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object systemLanguage {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object operator {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object by {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object origin {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object markerUnits {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object markerHeight {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object pointerEvents {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object floodOpacity {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object writingMode {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object patternContentUnits {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object xlinkType {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object xlinkArcrole {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object from {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object preserveAlpha {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object fontVariant {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object requiredExtensions {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object baselineShift {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object bias {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object requiredFeatures {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object fontSize {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object ry {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object mode {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object y2 {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object edgeMode {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object markerMid {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object startOffset {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object strokeMiterlimit {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object x1 {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object end {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object values {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object attributeType {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object k1 {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object targetY {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object glyphOrientationVertical {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object keySplines {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object opacity {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object markerStart {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object primitiveUnits {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object alignmentBaseline {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object patternUnits {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object surfaceScale {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object k4 {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object dx {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object allowReorder {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} + + object r {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object clip {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object k3 {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object restart {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object fontStretch {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object imageRendering {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object stdDeviation {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object xlinkTitle {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object colorProfile {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object spacing {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object stopColor {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object strokeLinejoin {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object lightingColor {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object transform {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object fontWeight {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object diffuseConstant {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object visibility {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object unicodeBidi {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object targetX {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object strokeWidth {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object dominantBaseline {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object textLength {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object slope {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object azimuth {def :=(v: js.UndefOr[Double]): TypedProp[js.UndefOr[Double]] = DummyProp} + + object zoomAndPan {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object spreadMethod {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object markerEnd {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object z {def :=(v: js.UndefOr[String | Double]): TypedProp[js.UndefOr[String | Double]] = DummyProp} + + object display {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object fillRule {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object stitchTiles {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object d {def :=(v: js.UndefOr[String]): TypedProp[js.UndefOr[String]] = DummyProp} + + object onTimeUpdate {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onAnimationStart {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onKeyUp {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDrag {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onCompositionStart {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onAnimationIteration {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onCanPlayThrough {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDragStart {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onLoadStart {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onMouseUp {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onKeyPress {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onError {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDragExit {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onSelect {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onCompositionEnd {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onTouchCancel {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onTouchEnd {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onTransitionEnd {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onSeeking {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onPlay {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDoubleClick {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDragOver {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onEnded {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onEmptied {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onMouseEnter {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDragLeave {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onCompositionUpdate {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onMouseLeave {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onPlaying {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onMouseDown {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onSuspend {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onEncrypted {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onProgress {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDurationChange {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onFocus {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onCut {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onSeeked {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onLoadedData {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onStalled {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onCanPlay {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onKeyDown {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onTouchStart {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onBlur {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onAbort {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onChange {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onVolumeChange {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onSubmit {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onLoadedMetadata {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onContextMenu {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onMouseMove {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onScroll {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onRateChange {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onAnimationEnd {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onWaiting {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onCopy {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDragEnd {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onWheel {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onPause {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDragEnter {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onClick {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onTouchMove {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onDrop {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onLoad {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onInput {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object onPaste {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} +} diff --git a/macros/src/main/scala/sri/macros/web/StyledTags.scala b/macros/src/main/scala/sri/macros/web/StyledTags.scala new file mode 100644 index 0000000..287290e --- /dev/null +++ b/macros/src/main/scala/sri/macros/web/StyledTags.scala @@ -0,0 +1,371 @@ +package sri.macros.web + +import sri.core.{ReactElement, ReactNode} +import scala.language.experimental.macros + +/** The code is generated by sbt task. */ +trait StyledTags { + @inline def solidcolor(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def big(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def tr(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def cite(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def html(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def footer(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def h4(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def caption(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def datalist(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def header(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def wbr(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def canvas(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def base(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def source(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def feFuncB(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def b(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def mesh(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def table(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def style(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def title(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def keygen(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def tfoot(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def view(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def area(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def details(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feDistantLight(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def hgroup(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def hr(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def q(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def meshpatch(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def legend(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feTurbulence(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def set(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def link(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def meshgradient(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def del(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def line(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def rt(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def map(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def fieldset(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def menu(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def polygon(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def ol(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def unknown(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def tbody(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feDiffuseLighting(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feImage(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def pre(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def filter(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def optgroup(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def mask(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def embed(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def u(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def image(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def select(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def s(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def use(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def input(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def thead(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feMergeNode(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def h6(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def abbr(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def meshrow(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def td(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def em(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feFlood(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def svg(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def colgroup(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def track(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def bdo(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def circle(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def time(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feBlend(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def ul(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def body(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def output(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feOffset(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def `var`(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def progress(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def h1(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def figcaption(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def stop(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def defs(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def iframe(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def small(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def textPath(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def picture(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def a(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def meta(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def article(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def blockquote(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def fePointLight(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feFuncA(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def bdi(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def li(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def cursor(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def h5(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def col(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def dialog(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def kbd(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def nav(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def aside(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def animateTransform(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def g(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def span(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def ellipse(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feSpotLight(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feFuncG(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def th(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def pattern(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def ins(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def p(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def `object`(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def hatchpath(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feMerge(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feColorMatrix(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def script(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feMorphology(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def summary(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feFuncR(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def br(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def sup(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def clipPath(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def dt(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def hatch(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def code(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def polyline(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def h2(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def menuitem(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def address(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feComponentTransfer(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feDropShadow(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def ruby(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feSpecularLighting(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def path(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feTile(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def metadata(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feGaussianBlur(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def symbol(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def desc(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def dl(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def meter(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def figure(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def samp(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def rp(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def foreignObject(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def dfn(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feConvolveMatrix(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def option(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def head(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def video(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def main(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def i(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def sub(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def label(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def button(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feComposite(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def mpath(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def h3(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def animate(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def discard(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def section(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def linearGradient(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def text(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def div(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def audio(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def tspan(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def mark(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def animateMotion(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def form(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def textarea(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def param(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def marker(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def noscript(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def dd(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def radialGradient(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def rect(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def feDisplacementMap(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def switch(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def data(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl + + @inline def img(props: TypedProp[_]*): ReactElement = macro MacroImpl.domChooseNoChildrenImpl + + @inline def strong(props: TypedProp[_]*)(children: ReactNode*): ReactElement = macro MacroImpl.domChooseImpl +} diff --git a/macros/src/main/scala/sri/macros/web/TagMacro.scala b/macros/src/main/scala/sri/macros/web/TagMacro.scala new file mode 100644 index 0000000..8c55954 --- /dev/null +++ b/macros/src/main/scala/sri/macros/web/TagMacro.scala @@ -0,0 +1,99 @@ +package sri.macros.web + +import sri.web.vdom.{DOMProps, SyntheticEvent} + +import scala.language.experimental.macros +import scala.reflect.macros.whitebox +import scala.scalajs.js.annotation.ScalaJSDefined + + +trait TypedProp[+A] +private case object DummyProp extends TypedProp[Nothing] + +@ScalaJSDefined +class ConcreteDOMProps extends DOMProps + +private object MacroImpl { + + trait VarOrVal + case object Var extends VarOrVal + case object Val extends VarOrVal + + def domChooseImpl(c: whitebox.Context)(props: c.Tree*)(children: c.Tree*): c.Tree = { + import c.universe._ + val domName = c.macroApplication.symbol.asTerm.name + if (props.nonEmpty) { + val allProps = parseProps(c)(props) + val varProps = allProps.filter(_._2 == Var).map(_._1) + val valProps = allProps.filter(_._2 == Val).map(_._1) + q""" + { + val domProps = new sri.macros.web.ConcreteDOMProps { + ..$valProps + } + ..$varProps + sri.web.vdom.tags.$domName(domProps)(..$children) + } + """ + } + else { + q""" + { + sri.web.vdom.tags.$domName()(..$children) + } + """ + } + } + + def domChooseNoChildrenImpl(c: whitebox.Context)(props: c.Tree*): c.Tree = { + import c.universe._ + val domName = c.macroApplication.symbol.asTerm.name + val t = if (props.nonEmpty) { + val allProps = parseProps(c)(props) + val varProps = allProps.filter(_._2 == Var).map(_._1) + val valProps = allProps.filter(_._2 == Val).map(_._1) + q""" + { + val domProps = new sri.macros.web.ConcreteDOMProps { + ..$valProps + } + ..$varProps + sri.web.vdom.tags.$domName(domProps) + } + """ + } + else { + q""" + { + sri.web.vdom.tags.$domName() + } + """ + } + println("macro-"+showCode(t)) + t + } + + private def parseProps(c: whitebox.Context)(props: Seq[c.Tree]): Seq[(c.Tree, VarOrVal)] = { + import c.universe._ + val allProps = props.map { + case q"$propName := $propValue" => + val propTermName = propName.symbol.asTerm.name + isVar(c)(propTermName.decodedName.toString) match { + case Var => (q"""domProps.$propTermName = $propValue""", Var) + case Val => (q"""override val $propTermName = $propValue""", Val) + } + } + //allProps.foreach(t=>println("macro-"+showCode(t._1))) + allProps + } + + private def isVar(c: whitebox.Context)(propName: String): VarOrVal = { + //println(s"[macro]PropName is $propName.") + val tpe = c.typeOf[DOMProps] + tpe.members.filter(_.isMethod).find(_.asMethod.name.toString == propName) match { + case Some(v) if v.asMethod.isVal => Val + case Some(v) if v.asMethod.isVar => Var + case None => c.abort(c.enclosingPosition, s"Cannot find field[$propName] in DOMProprs") + } + } +} \ No newline at end of file diff --git a/macros/src/main/scala/sri/macros/web/package.scala b/macros/src/main/scala/sri/macros/web/package.scala new file mode 100644 index 0000000..8e95672 --- /dev/null +++ b/macros/src/main/scala/sri/macros/web/package.scala @@ -0,0 +1,10 @@ +package sri.macros + +import sri.web.vdom.SyntheticEvent + +/** + * Created by cuz on 17-4-26. + */ +package object web { + type SyntheticEventCallback = (_ <: SyntheticEvent[_]) => _ +} diff --git a/macros/src/main/scala/sri/macros/web/styledtags.scala b/macros/src/main/scala/sri/macros/web/styledtags.scala new file mode 100644 index 0000000..9cd81c4 --- /dev/null +++ b/macros/src/main/scala/sri/macros/web/styledtags.scala @@ -0,0 +1,25 @@ +package sri.macros.web + +import sri.web.vdom.{ReactEventAliases, SyntheticEvent} + +import scala.language.implicitConversions +import scala.scalajs.js + +/** + * Created by cuz on 17-4-26. + */ +object styledtags extends StyledTags with StyledAttributes with ReactEventAliases with IntellijHelper{ + type SyntheticEventCallback = sri.macros.web.SyntheticEventCallback +} + +object styledtagsPrefix_<^ extends ReactEventAliases with IntellijHelper{ + type SyntheticEventCallback = sri.macros.web.SyntheticEventCallback + object < extends StyledTags + object ^ extends StyledAttributes +} + + +trait IntellijHelper { + implicit def eventConversion[T <: SyntheticEvent[_]](in: T => _): js.UndefOr[SyntheticEventCallback] = + in.asInstanceOf[js.UndefOr[SyntheticEventCallback]] +} \ No newline at end of file diff --git a/project/IntegrationProjectsSettings.scala b/project/IntegrationProjectsSettings.scala new file mode 100644 index 0000000..b9fd7c3 --- /dev/null +++ b/project/IntegrationProjectsSettings.scala @@ -0,0 +1,57 @@ +import sbt.Keys._ +import sbt._ +import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._ + +object IntegrationProjectsSettings { + val commonSettings = Seq( + resolvers ++= Seq( + Resolver.bintrayRepo("scalajs-react-interface", "maven"), + Resolver.jcenterRepo + ), + organization := "scalajs-react-interface", + scalaVersion := "2.12.2", + crossScalaVersions := Seq("2.11.11", "2.12.2"), + scalacOptions ++= Seq( + "-Xlint", + "-unchecked", + "-deprecation", + "-feature", + "-language:postfixOps", + "-language:implicitConversions", + "-language:higherKinds", + "-language:existentials"), + libraryDependencies ++= Seq( + "com.lihaoyi" %%% "utest" % "0.4.5" % "test" + ), + logBuffered in Test := false, + testFrameworks += new TestFramework("utest.runner.Framework"), + parallelExecution in Test := false, + licenses += ("Apache-2.0", url("https://opensource.org/licenses/Apache-2.0")) + ) + + val macrosSettings = Seq( + name := "incubation-macros", + libraryDependencies ++= Seq( + "org.scala-lang" % "scala-reflect" % scalaVersion.value, + //"org.scalameta" %% "scalameta" % "1.7.0" % "provided", + "scalajs-react-interface" %%% "core" % "2017.3.26-beta" % "provided", + "scalajs-react-interface" %%% "macros" % "2017.3.26-beta" % "provided", + "org.scala-js" %%% "scalajs-dom" % "0.9.1" % "provided" + ) + ) + + val incubationSettings = Seq( + name := "incubation", + description := "Playground for testing and developing vdom features.", + libraryDependencies ++= Seq( + "scalajs-react-interface" %%% "core" % "2017.3.26-beta", + "scalajs-react-interface" %%% "web" % "2017.3.26-beta", + "scalajs-react-interface" %%% "universal" % "2017.4.9-beta", + "scalajs-react-interface" %%% "scalacss" % "2017.3.26-beta", + "scalajs-react-interface" %%% "macros" % "2017.3.26-beta" + ), + artifactPath in Compile in fastOptJS := baseDirectory.value / "assets/scalajs-output.js", + scalaJSModuleKind := ModuleKind.CommonJSModule, + scalaJSUseMainModuleInitializer := true + ) +} \ No newline at end of file From bd104575f6e70edcedfc9520a804c1db88672a9c Mon Sep 17 00:00:00 2001 From: Cause Chung Date: Wed, 3 May 2017 08:04:55 +0800 Subject: [PATCH 2/3] Implement new style tags with macros. 1. */macros/ macros and updated tags, attributes. 2. project/ update development environment and src gen tasks. 3. /web/template/ tests. --- .../sri.web.vdom/bugfix/DOMPropsTest.scala | 8 -- .../main/scala/sri/web/template/WebApp.scala | 7 +- .../web/template/components/HomeScreen.scala | 112 +++++++++-------- .../components/StyledTagsComTest.scala | 52 +++++--- .../src/test/scala/sri.web.vdom/Test1.scala | 12 ++ .../sri/macros/web/StyledAttributes.scala | 5 + .../main/scala/sri/macros/web/TagMacro.scala | 115 ++++++------------ .../main/scala/sri/macros/web/package.scala | 10 +- .../scala/sri/macros/web/styledtags.scala | 10 +- project/IntegrationProjectsSettings.scala | 5 +- project/Tasks.scala | 10 +- 11 files changed, 179 insertions(+), 167 deletions(-) delete mode 100644 incubation/src/main/scala/sri.web.vdom/bugfix/DOMPropsTest.scala create mode 100644 incubation/src/test/scala/sri.web.vdom/Test1.scala diff --git a/incubation/src/main/scala/sri.web.vdom/bugfix/DOMPropsTest.scala b/incubation/src/main/scala/sri.web.vdom/bugfix/DOMPropsTest.scala deleted file mode 100644 index 36993b7..0000000 --- a/incubation/src/main/scala/sri.web.vdom/bugfix/DOMPropsTest.scala +++ /dev/null @@ -1,8 +0,0 @@ -package sri.web.vdom.bugfix - -/** - * Created by cuz on 17-5-1. - */ -object DOMPropsTest { - -} diff --git a/incubation/src/main/scala/sri/web/template/WebApp.scala b/incubation/src/main/scala/sri/web/template/WebApp.scala index 2bb65cf..773c5f2 100644 --- a/incubation/src/main/scala/sri/web/template/WebApp.scala +++ b/incubation/src/main/scala/sri/web/template/WebApp.scala @@ -2,17 +2,18 @@ package sri.web.template import org.scalajs.dom import sri.web.ReactDOM -import sri.web.template.components.HomeScreen +import sri.web.template.components.{StyledTagsComTest} import sri.web.template.styles.AppStyles import scala.scalajs.js.JSApp +import scala.util.Random object WebApp extends JSApp { def main(): Unit = { AppStyles.load() - ReactDOM.render(HomeScreen(), dom.document.getElementById("app")) - println("[info] Client rendering completed.") + ReactDOM.render(StyledTagsComTest(), dom.document.getElementById("app")) + println("[info] Client rendering completed." + Random.nextInt()) } } diff --git a/incubation/src/main/scala/sri/web/template/components/HomeScreen.scala b/incubation/src/main/scala/sri/web/template/components/HomeScreen.scala index a0d2618..571f107 100644 --- a/incubation/src/main/scala/sri/web/template/components/HomeScreen.scala +++ b/incubation/src/main/scala/sri/web/template/components/HomeScreen.scala @@ -1,51 +1,61 @@ -package sri.web.template.components - -import org.scalajs.dom -import sri.core._ -import sri.web.template.styles.GlobalStyle -import sri.web.vdom.tags._ -import sri.scalacss.Defaults._ -import sri.web.vdom.DOMProps - -import scala.scalajs.js.annotation.ScalaJSDefined -import scala.scalajs.js.{UndefOr => U} - -@ScalaJSDefined -class HomeScreen extends ComponentS[HomeScreen.State] { - - import HomeScreen._ - - initialState(State("sri")) - - def render() = { - div(className = GlobalStyle.flexOneAndCenter)( - span(className = GlobalStyle.bigText)("Home Screen"), - input(value = state.text, onChange = onTextChange _), - input(value = state.text, extraProps = attr), - StyledTagsComTest(StyledTagsComTest.Props(() => state, _setState)) - ) - } - - def _setState(s: State): Unit = setState(_ => s) - - val attr = { - val domProps = new DOMProps {override val className = "some class name"} - domProps.onChange = (_: ReactEventI) => println("asdfasfasdfasdfasdf") - domProps - } - - - def onTextChange(e: ReactEventI) = { - val value = e.target.value - dom.window.console.log(value) - setState((state: State) => state.copy(text = value)) - } -} - -object HomeScreen { - - case class State(text: String) - - def apply() = CreateElementNoProps[HomeScreen]() - -} +//package sri.web.template.components +// +//import org.scalajs.dom +//import sri.core._ +//import sri.web.template.styles.GlobalStyle +//import sri.web.vdom.tags._ +//import sri.scalacss.Defaults._ +//import sri.web.vdom.{CreateDOMElement, DOMProps, SyntheticEvent} +// +//import scala.scalajs.js.annotation.ScalaJSDefined +//import scala.scalajs.js +// +//@ScalaJSDefined +//trait A extends js.Object +// +//@ScalaJSDefined +//class HomeScreen extends ComponentS[HomeScreen.State] { +// +// import HomeScreen._ +// +// initialState(State("sri")) +// +// def render() = { +// div(className = GlobalStyle.flexOneAndCenter)( +// span(className = GlobalStyle.bigText)("Home Screen"), +// input(value = state.text, onChange = onTextChange _), +// input2 +// //StyledTagsComTest(StyledTagsComTest.Props(() => state, _setState)) +// ) +// } +// +// def _setState(s: State): Unit = setState(_ => s) +// +// +// val input2 = CreateDOMElement("input", attr) +// def attr = { +// val domProps = new A { +// val className = "some class name4" +// val value = state.text +// val onChange: js.UndefOr[js.Function1[_ <: SyntheticEvent[_], _]] = +// js.UndefOr.any2undefOrA((e: ReactEventI) => ()) +// } +// dom.window.console.dir(domProps) +// domProps +// } +// +// +// def onTextChange(e: ReactEventI) = { +// val value = e.target.value +// dom.window.console.log(value) +// setState((state: State) => state.copy(text = value)) +// } +//} +// +//object HomeScreen { +// +// case class State(text: String) +// +// def apply() = CreateElementNoProps[HomeScreen]() +// +//} diff --git a/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala b/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala index 8ef8c36..6a6153e 100644 --- a/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala +++ b/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala @@ -1,34 +1,50 @@ package sri.web.template.components import org.scalajs.dom -import sri.core.{ComponentP, CreateElement, ReactElement} +import sri.core.{ComponentS, CreateElement, CreateElementNoProps, ReactElement} import sri.macros.web.styledtagsPrefix_<^._ -import sri.web.template.components.HomeScreen.State +import sri.scalacss.Defaults._ +import sri.web.template.styles.GlobalStyle +import sri.web.vdom.SyntheticEvent import sri.web.vdom.tags.ReactEventI +import scala.scalajs.js import scala.scalajs.js.annotation.ScalaJSDefined @ScalaJSDefined -private class StyledTagsComTest extends ComponentP[StyledTagsComTest.Props] { - override def render(): ReactElement = <.div( - ^.className := "some", - ^.value := "asdf" +private class StyledTagsComTest extends ComponentS[State] { + initialState(State("sri")) + override def render(): ReactElement = test + def onTextChange(e: ReactEventI) = { + val value = e.target.value + dom.window.console.log(value) + setState(_.copy(text = value)) + } + private def test1 = <.div()("Only contants.") + private def test2 = <.div(^.value := "some value")("Contents with value") + private def test3 = <.div(^.value := "some value")( + "Has child:", + <.p(^.value := "v1")("I'm a child

") + ) + private def test4 = <.a( + ^.onClick := ((e: SyntheticEvent[_]) => println("something1")) + )("Click me will log something.") + + private def test = <.div( + ^.key := 3, + ^.ref := ((n: dom.Node) => n), + ^.className := GlobalStyle.flexOneAndCenter, )( <.p()("This is generated by styled tags."), <.input( - ^.onClick := onTextChange _, - ^.value := props.getState().text - ) + ^.onChange := onTextChange _, + ^.value := state.text + ), + <.button(^.onClick := ((e: ReactEvent) => setState(_ => State(""))))("Click me to clear.") ) - def onTextChange(e: ReactEventI) = { - val value = e.target.value - dom.window.console.log(value) - props.setState(props.getState().copy(text = value)) - } } - -private object StyledTagsComTest { - case class Props(getState: () => State, setState: State => Unit) - def apply(props: Props): ReactElement = CreateElement[StyledTagsComTest](props) +case class State(text: String) +object StyledTagsComTest { + def apply(): ReactElement = CreateElementNoProps[StyledTagsComTest]() } \ No newline at end of file diff --git a/incubation/src/test/scala/sri.web.vdom/Test1.scala b/incubation/src/test/scala/sri.web.vdom/Test1.scala new file mode 100644 index 0000000..af0a409 --- /dev/null +++ b/incubation/src/test/scala/sri.web.vdom/Test1.scala @@ -0,0 +1,12 @@ +package sri.web.vdom + +import org.scalajs.dom + +import scala.scalajs.js + +object Test1 extends js.JSApp{ + override def main(): Unit = { + val v1 = js.Dynamic.literal(props = (s:String) => println(s)) + dom.window.console.dir(v1) + } +} diff --git a/macros/src/main/scala/sri/macros/web/StyledAttributes.scala b/macros/src/main/scala/sri/macros/web/StyledAttributes.scala index 47e78c3..0e2af49 100644 --- a/macros/src/main/scala/sri/macros/web/StyledAttributes.scala +++ b/macros/src/main/scala/sri/macros/web/StyledAttributes.scala @@ -2,6 +2,7 @@ package sri.macros.web import scalajs.js import js.| +import org.scalajs.dom /** The code is generated by sbt task. */ trait StyledAttributes { @@ -764,4 +765,8 @@ trait StyledAttributes { object onInput {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} object onPaste {def :=(v: js.UndefOr[SyntheticEventCallback]): TypedProp[js.UndefOr[SyntheticEventCallback]] = DummyProp} + + object key {def :=(v: String | Int): TypedProp[String | Int] = DummyProp} + + object ref {def :=(v: js.Function1[_<:dom.Node, Unit]): TypedProp[js.Function1[_<:dom.Node, Unit]] = DummyProp} } diff --git a/macros/src/main/scala/sri/macros/web/TagMacro.scala b/macros/src/main/scala/sri/macros/web/TagMacro.scala index 8c55954..2c2fc96 100644 --- a/macros/src/main/scala/sri/macros/web/TagMacro.scala +++ b/macros/src/main/scala/sri/macros/web/TagMacro.scala @@ -1,99 +1,58 @@ package sri.macros.web -import sri.web.vdom.{DOMProps, SyntheticEvent} - import scala.language.experimental.macros import scala.reflect.macros.whitebox -import scala.scalajs.js.annotation.ScalaJSDefined - trait TypedProp[+A] private case object DummyProp extends TypedProp[Nothing] -@ScalaJSDefined -class ConcreteDOMProps extends DOMProps - -private object MacroImpl { +private class MacroImpl(val c: whitebox.Context) { - trait VarOrVal - case object Var extends VarOrVal - case object Val extends VarOrVal + import c.universe._ - def domChooseImpl(c: whitebox.Context)(props: c.Tree*)(children: c.Tree*): c.Tree = { - import c.universe._ - val domName = c.macroApplication.symbol.asTerm.name - if (props.nonEmpty) { - val allProps = parseProps(c)(props) - val varProps = allProps.filter(_._2 == Var).map(_._1) - val valProps = allProps.filter(_._2 == Val).map(_._1) - q""" - { - val domProps = new sri.macros.web.ConcreteDOMProps { - ..$valProps - } - ..$varProps - sri.web.vdom.tags.$domName(domProps)(..$children) - } - """ - } - else { - q""" + def domChooseImpl(props: c.Tree*)(children: c.Tree*): c.Tree = { + val domName = c.macroApplication.symbol.asTerm.name.toString + val allProps = parseProps(props) + q""" { - sri.web.vdom.tags.$domName()(..$children) + import scala.scalajs.js + val domProps = js.Dynamic.literal() + ..$allProps + val _children = js.Array[sri.core.ReactNode](..$children) + sri.web.vdom.CreateDOMElement(ctor = $domName, props = domProps, children = _children ) } """ - } } - def domChooseNoChildrenImpl(c: whitebox.Context)(props: c.Tree*): c.Tree = { - import c.universe._ - val domName = c.macroApplication.symbol.asTerm.name - val t = if (props.nonEmpty) { - val allProps = parseProps(c)(props) - val varProps = allProps.filter(_._2 == Var).map(_._1) - val valProps = allProps.filter(_._2 == Val).map(_._1) - q""" - { - val domProps = new sri.macros.web.ConcreteDOMProps { - ..$valProps - } - ..$varProps - sri.web.vdom.tags.$domName(domProps) - } - """ - } - else { - q""" - { - sri.web.vdom.tags.$domName() - } - """ - } - println("macro-"+showCode(t)) - t + def domChooseNoChildrenImpl(props: c.Tree*): c.Tree = { + val tree = domChooseImpl(props: _*)() + q"$tree" } - private def parseProps(c: whitebox.Context)(props: Seq[c.Tree]): Seq[(c.Tree, VarOrVal)] = { - import c.universe._ - val allProps = props.map { - case q"$propName := $propValue" => - val propTermName = propName.symbol.asTerm.name - isVar(c)(propTermName.decodedName.toString) match { - case Var => (q"""domProps.$propTermName = $propValue""", Var) - case Val => (q"""override val $propTermName = $propValue""", Val) - } + private def parseProps(props: Seq[c.Tree]): Seq[c.Tree] = { + val allProps = props.map { prop => + val argTpe = scala.util.Try(prop.symbol.typeSignature.paramLists.head.head.typeSignature).toOption + if (argTpe.isEmpty) c.abort(c.enclosingPosition, "Param type cannot be parsed by macros.") + + val (propName, propValue) = prop match { + case q"$propName := $ideaFunc($propValue)" + if ideaFunc.symbol.name.toString == "intellijIdeaEventConversion" => (propName, propValue) + case q"$propName := $propValue" => (propName, propValue) + case bad => c.abort(c.enclosingPosition, + s"Content after :=($bad) cannot be parsed by macros. Check your argument types.") + } + val propTermName = propName.symbol.asTerm.name.toString + val v = { + val funcTpe = typeOf[scala.scalajs.js.UndefOr[sri.macros.web.SyntheticEventCallback]].toString + if (argTpe.get.toString == funcTpe) q"$propValue" + else q"$propValue.asInstanceOf[js.Any]" + } + //println(typeOf[scala.scalajs.js.UndefOr[sri.macros.web.SyntheticEventCallback]]) + q""" + domProps.updateDynamic($propTermName)($v) + """ } - //allProps.foreach(t=>println("macro-"+showCode(t._1))) + //allProps.foreach(t => println("macro-" + showCode(t))) allProps } - - private def isVar(c: whitebox.Context)(propName: String): VarOrVal = { - //println(s"[macro]PropName is $propName.") - val tpe = c.typeOf[DOMProps] - tpe.members.filter(_.isMethod).find(_.asMethod.name.toString == propName) match { - case Some(v) if v.asMethod.isVal => Val - case Some(v) if v.asMethod.isVar => Var - case None => c.abort(c.enclosingPosition, s"Cannot find field[$propName] in DOMProprs") - } - } } \ No newline at end of file diff --git a/macros/src/main/scala/sri/macros/web/package.scala b/macros/src/main/scala/sri/macros/web/package.scala index 8e95672..c2d28db 100644 --- a/macros/src/main/scala/sri/macros/web/package.scala +++ b/macros/src/main/scala/sri/macros/web/package.scala @@ -2,9 +2,17 @@ package sri.macros import sri.web.vdom.SyntheticEvent +import scala.scalajs.js + /** * Created by cuz on 17-4-26. */ package object web { - type SyntheticEventCallback = (_ <: SyntheticEvent[_]) => _ + /** When function is assigned to val/var field, it has to be explicitly typed out as js.Function(N) + * to make the val/var field recognized by node/browser as `Function` instead of an object named + * AnnonymousFunctionXX. + * + * Note: Syntax sugar of scala function cannot achieve this. + */ + type SyntheticEventCallback = js.Function1[_ <: SyntheticEvent[_], _] } diff --git a/macros/src/main/scala/sri/macros/web/styledtags.scala b/macros/src/main/scala/sri/macros/web/styledtags.scala index 9cd81c4..e046a46 100644 --- a/macros/src/main/scala/sri/macros/web/styledtags.scala +++ b/macros/src/main/scala/sri/macros/web/styledtags.scala @@ -1,5 +1,6 @@ package sri.macros.web +import org.scalajs.dom import sri.web.vdom.{ReactEventAliases, SyntheticEvent} import scala.language.implicitConversions @@ -8,11 +9,11 @@ import scala.scalajs.js /** * Created by cuz on 17-4-26. */ -object styledtags extends StyledTags with StyledAttributes with ReactEventAliases with IntellijHelper{ +object styledtags extends StyledTags with StyledAttributes with ReactEventAliases with IntellijHelper { type SyntheticEventCallback = sri.macros.web.SyntheticEventCallback } -object styledtagsPrefix_<^ extends ReactEventAliases with IntellijHelper{ +object styledtagsPrefix_<^ extends ReactEventAliases with IntellijHelper { type SyntheticEventCallback = sri.macros.web.SyntheticEventCallback object < extends StyledTags object ^ extends StyledAttributes @@ -20,6 +21,7 @@ object styledtagsPrefix_<^ extends ReactEventAliases with IntellijHelper{ trait IntellijHelper { - implicit def eventConversion[T <: SyntheticEvent[_]](in: T => _): js.UndefOr[SyntheticEventCallback] = - in.asInstanceOf[js.UndefOr[SyntheticEventCallback]] + /** Do not change name of this function, which is used in macro.*/ + implicit def intellijIdeaEventConversion[N <: dom.Node, T <: SyntheticEvent[N]](in: T => _): js.UndefOr[SyntheticEventCallback] = + throw new AssertionError("This implicit method should be stripped off by macro, thus should not be accessed.") } \ No newline at end of file diff --git a/project/IntegrationProjectsSettings.scala b/project/IntegrationProjectsSettings.scala index b9fd7c3..dbd0870 100644 --- a/project/IntegrationProjectsSettings.scala +++ b/project/IntegrationProjectsSettings.scala @@ -12,14 +12,13 @@ object IntegrationProjectsSettings { scalaVersion := "2.12.2", crossScalaVersions := Seq("2.11.11", "2.12.2"), scalacOptions ++= Seq( - "-Xlint", + //"-Xlint", "-unchecked", "-deprecation", "-feature", "-language:postfixOps", "-language:implicitConversions", - "-language:higherKinds", - "-language:existentials"), + "-language:higherKinds"), libraryDependencies ++= Seq( "com.lihaoyi" %%% "utest" % "0.4.5" % "test" ), diff --git a/project/Tasks.scala b/project/Tasks.scala index 88d8328..ffa1c95 100644 --- a/project/Tasks.scala +++ b/project/Tasks.scala @@ -78,6 +78,7 @@ object Tasks { | |import scalajs.js |import js.| + |import org.scalajs.dom | |/** The code is generated by sbt task. */ |trait StyledAttributes { @@ -91,8 +92,15 @@ object Tasks { |""".stripMargin } + val extra = + s"""| + | object key {def :=(v: String | Int): TypedProp[String | Int] = DummyProp} + | + | object ref {def :=(v: js.Function1[_<:dom.Node, Unit]): TypedProp[js.Function1[_<:dom.Node, Unit]] = DummyProp} + """.stripMargin + val dest = new File("./bak/generatedSource/StyledAttributes.scala") - IO.write(dest, head + body.mkString(IO.Newline) + "}" + IO.Newline) + IO.write(dest, head + body.mkString(IO.Newline) + extra + "}" + IO.Newline) streams.value.log.info(s"Dom ^ generated into ${dest.getCanonicalPath}") } catch { case e: Exception => e.printStackTrace() From 9c5eccc879905b8de828402d74c6a908156af4ea Mon Sep 17 00:00:00 2001 From: Cause Chung Date: Wed, 3 May 2017 09:18:36 +0800 Subject: [PATCH 3/3] Integrate styled tags. 1. Move styled tags to package sri.web.vdom.styled. 2. Update build dependency: add scala-reflect due to macros. 3. Update README.md. --- README.md | 38 +++++++++++++++++++ build.sbt | 7 +++- .../components/StyledTagsComTest.scala | 13 +++---- project/IntegrationProjectsSettings.scala | 4 +- .../main/scala/sri}/web/styledtags.scala | 7 ++-- .../web/vdom/styled}/StyledAttributes.scala | 7 ++-- .../sri/web/vdom/styled}/StyledTags.scala | 3 +- .../scala/sri/web/vdom/styled}/TagMacro.scala | 6 +-- .../scala/sri/web/vdom/styled}/package.scala | 6 +-- 9 files changed, 64 insertions(+), 27 deletions(-) rename {macros/src/main/scala/sri/macros => src/main/scala/sri}/web/styledtags.scala (75%) rename {macros/src/main/scala/sri/macros/web => src/main/scala/sri/web/vdom/styled}/StyledAttributes.scala (99%) rename {macros/src/main/scala/sri/macros/web => src/main/scala/sri/web/vdom/styled}/StyledTags.scala (99%) rename {macros/src/main/scala/sri/macros/web => src/main/scala/sri/web/vdom/styled}/TagMacro.scala (93%) rename {macros/src/main/scala/sri/macros/web => src/main/scala/sri/web/vdom/styled}/package.scala (85%) diff --git a/README.md b/README.md index b5ad770..f7c2a60 100644 --- a/README.md +++ b/README.md @@ -1 +1,39 @@ # VDOM + +### New styled tags' features: + +1. Type safety. Tags and attributes are `object`s, which have static types. +2. Compatible with Intellij IDEA editor. No highlighting error if correct. +3. Almost no performance penalty. Codes are generated by macro. + +### Dependency: + + "scalajs-react-interface" %%% "vdom" % "version" + +### How to use: +```scala +import sri.web.styledtagsPrefix_<^._ //recommended for avioding name conflicts. + //tags begin with `<`, attributes begin with `^` + //or +import sri.web.styledtags._ + //you still have type safety. +``` + +#### example: +```scala +import sri.core._ +import sri.web.styledtagsPrefix_<^._ + +<.div()("Only contents.") +<.div(^.value := "some value")("Contents with value") +<.div()( + "Has child:", + <.p(^.value := "v1")("I'm a child

") + ) +<.a( + ^.onClick := ((e: ReactEventI) => println("this is a callback")) + )("Click me will log something.") + //note := is a method, when pass complicated code in, you need give them parentheses. +``` + +[Complete example](incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala) diff --git a/build.sbt b/build.sbt index 575770b..88c9061 100644 --- a/build.sbt +++ b/build.sbt @@ -21,8 +21,11 @@ scalacOptions ++= Seq( ) //Dependencies -libraryDependencies += "scalajs-react-interface" %%% "core" % "2017.3.26-beta" % Provided -libraryDependencies += "scalajs-react-interface" %%% "universal" % "2017.4.9-beta" % Provided +libraryDependencies ++= Seq( + "org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided, + "scalajs-react-interface" %%% "core" % "2017.3.26-beta" % Provided, + "scalajs-react-interface" %%% "universal" % "2017.4.9-beta" % Provided +) //bintray resolvers += Resolver.jcenterRepo diff --git a/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala b/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala index 6a6153e..288a2e1 100644 --- a/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala +++ b/incubation/src/main/scala/sri/web/template/components/StyledTagsComTest.scala @@ -1,14 +1,11 @@ package sri.web.template.components import org.scalajs.dom -import sri.core.{ComponentS, CreateElement, CreateElementNoProps, ReactElement} -import sri.macros.web.styledtagsPrefix_<^._ +import sri.core._ import sri.scalacss.Defaults._ +import sri.web.styledtagsPrefix_<^._ import sri.web.template.styles.GlobalStyle -import sri.web.vdom.SyntheticEvent -import sri.web.vdom.tags.ReactEventI -import scala.scalajs.js import scala.scalajs.js.annotation.ScalaJSDefined @ScalaJSDefined @@ -20,20 +17,20 @@ private class StyledTagsComTest extends ComponentS[State] { dom.window.console.log(value) setState(_.copy(text = value)) } - private def test1 = <.div()("Only contants.") + private def test1 = <.div()("Only contents.") private def test2 = <.div(^.value := "some value")("Contents with value") private def test3 = <.div(^.value := "some value")( "Has child:", <.p(^.value := "v1")("I'm a child

") ) private def test4 = <.a( - ^.onClick := ((e: SyntheticEvent[_]) => println("something1")) + ^.onClick := ((e: ReactEventI) => println("something1")) )("Click me will log something.") private def test = <.div( ^.key := 3, ^.ref := ((n: dom.Node) => n), - ^.className := GlobalStyle.flexOneAndCenter, + ^.className := GlobalStyle.flexOneAndCenter )( <.p()("This is generated by styled tags."), <.input( diff --git a/project/IntegrationProjectsSettings.scala b/project/IntegrationProjectsSettings.scala index dbd0870..c55eacb 100644 --- a/project/IntegrationProjectsSettings.scala +++ b/project/IntegrationProjectsSettings.scala @@ -31,10 +31,10 @@ object IntegrationProjectsSettings { val macrosSettings = Seq( name := "incubation-macros", libraryDependencies ++= Seq( - "org.scala-lang" % "scala-reflect" % scalaVersion.value, + "org.scala-lang" % "scala-reflect" % scalaVersion.value % "provided", //"org.scalameta" %% "scalameta" % "1.7.0" % "provided", "scalajs-react-interface" %%% "core" % "2017.3.26-beta" % "provided", - "scalajs-react-interface" %%% "macros" % "2017.3.26-beta" % "provided", + //"scalajs-react-interface" %%% "macros" % "2017.3.26-beta" % "provided", "org.scala-js" %%% "scalajs-dom" % "0.9.1" % "provided" ) ) diff --git a/macros/src/main/scala/sri/macros/web/styledtags.scala b/src/main/scala/sri/web/styledtags.scala similarity index 75% rename from macros/src/main/scala/sri/macros/web/styledtags.scala rename to src/main/scala/sri/web/styledtags.scala index e046a46..99f3ef6 100644 --- a/macros/src/main/scala/sri/macros/web/styledtags.scala +++ b/src/main/scala/sri/web/styledtags.scala @@ -1,6 +1,7 @@ -package sri.macros.web +package sri.web import org.scalajs.dom +import sri.web.vdom.styled.{StyledAttributes, StyledTags, SyntheticEventCallback} import sri.web.vdom.{ReactEventAliases, SyntheticEvent} import scala.language.implicitConversions @@ -10,11 +11,11 @@ import scala.scalajs.js * Created by cuz on 17-4-26. */ object styledtags extends StyledTags with StyledAttributes with ReactEventAliases with IntellijHelper { - type SyntheticEventCallback = sri.macros.web.SyntheticEventCallback + type SyntheticEventCallback = sri.web.vdom.styled.SyntheticEventCallback } object styledtagsPrefix_<^ extends ReactEventAliases with IntellijHelper { - type SyntheticEventCallback = sri.macros.web.SyntheticEventCallback + type SyntheticEventCallback = sri.web.vdom.styled.SyntheticEventCallback object < extends StyledTags object ^ extends StyledAttributes } diff --git a/macros/src/main/scala/sri/macros/web/StyledAttributes.scala b/src/main/scala/sri/web/vdom/styled/StyledAttributes.scala similarity index 99% rename from macros/src/main/scala/sri/macros/web/StyledAttributes.scala rename to src/main/scala/sri/web/vdom/styled/StyledAttributes.scala index 0e2af49..851d9d5 100644 --- a/macros/src/main/scala/sri/macros/web/StyledAttributes.scala +++ b/src/main/scala/sri/web/vdom/styled/StyledAttributes.scala @@ -1,9 +1,10 @@ -package sri.macros.web +package sri.web.vdom.styled -import scalajs.js -import js.| import org.scalajs.dom +import scala.scalajs.js +import scala.scalajs.js.| + /** The code is generated by sbt task. */ trait StyledAttributes { object defer {def :=(v: js.UndefOr[Boolean]): TypedProp[js.UndefOr[Boolean]] = DummyProp} diff --git a/macros/src/main/scala/sri/macros/web/StyledTags.scala b/src/main/scala/sri/web/vdom/styled/StyledTags.scala similarity index 99% rename from macros/src/main/scala/sri/macros/web/StyledTags.scala rename to src/main/scala/sri/web/vdom/styled/StyledTags.scala index 287290e..04246f7 100644 --- a/macros/src/main/scala/sri/macros/web/StyledTags.scala +++ b/src/main/scala/sri/web/vdom/styled/StyledTags.scala @@ -1,6 +1,7 @@ -package sri.macros.web +package sri.web.vdom.styled import sri.core.{ReactElement, ReactNode} + import scala.language.experimental.macros /** The code is generated by sbt task. */ diff --git a/macros/src/main/scala/sri/macros/web/TagMacro.scala b/src/main/scala/sri/web/vdom/styled/TagMacro.scala similarity index 93% rename from macros/src/main/scala/sri/macros/web/TagMacro.scala rename to src/main/scala/sri/web/vdom/styled/TagMacro.scala index 2c2fc96..2417ca0 100644 --- a/macros/src/main/scala/sri/macros/web/TagMacro.scala +++ b/src/main/scala/sri/web/vdom/styled/TagMacro.scala @@ -1,4 +1,4 @@ -package sri.macros.web +package sri.web.vdom.styled import scala.language.experimental.macros import scala.reflect.macros.whitebox @@ -7,9 +7,7 @@ trait TypedProp[+A] private case object DummyProp extends TypedProp[Nothing] private class MacroImpl(val c: whitebox.Context) { - import c.universe._ - def domChooseImpl(props: c.Tree*)(children: c.Tree*): c.Tree = { val domName = c.macroApplication.symbol.asTerm.name.toString val allProps = parseProps(props) @@ -43,7 +41,7 @@ private class MacroImpl(val c: whitebox.Context) { } val propTermName = propName.symbol.asTerm.name.toString val v = { - val funcTpe = typeOf[scala.scalajs.js.UndefOr[sri.macros.web.SyntheticEventCallback]].toString + val funcTpe = typeOf[scala.scalajs.js.UndefOr[sri.web.vdom.styled.SyntheticEventCallback]].toString if (argTpe.get.toString == funcTpe) q"$propValue" else q"$propValue.asInstanceOf[js.Any]" } diff --git a/macros/src/main/scala/sri/macros/web/package.scala b/src/main/scala/sri/web/vdom/styled/package.scala similarity index 85% rename from macros/src/main/scala/sri/macros/web/package.scala rename to src/main/scala/sri/web/vdom/styled/package.scala index c2d28db..e559475 100644 --- a/macros/src/main/scala/sri/macros/web/package.scala +++ b/src/main/scala/sri/web/vdom/styled/package.scala @@ -1,13 +1,11 @@ -package sri.macros - -import sri.web.vdom.SyntheticEvent +package sri.web.vdom import scala.scalajs.js /** * Created by cuz on 17-4-26. */ -package object web { +package object styled { /** When function is assigned to val/var field, it has to be explicitly typed out as js.Function(N) * to make the val/var field recognized by node/browser as `Function` instead of an object named * AnnonymousFunctionXX.