├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── build.sbt ├── project ├── build.properties └── build.sbt ├── site └── d3demo.png ├── src ├── main │ └── scala │ │ └── org │ │ └── singlespaced │ │ └── d3js │ │ ├── Ops.scala │ │ ├── behavior.scala │ │ ├── d3.scala │ │ ├── geo.scala │ │ ├── geom.scala │ │ ├── layout.scala │ │ ├── misc.scala │ │ ├── ns.scala │ │ ├── scale.scala │ │ ├── selection.scala │ │ ├── svg.scala │ │ └── time.scala └── test │ └── scala │ └── org │ └── singlespaced │ └── d3js │ ├── AxisTest.scala │ ├── D3Test.scala │ ├── LayoutTest.scala │ ├── ScaleTest.scala │ ├── SelectionTest.scala │ ├── SvgAreaTest.scala │ └── SvgLineTest.scala └── version.sbt /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | .cache 3 | .classpath 4 | .project 5 | .settings/ 6 | .idea/ 7 | 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: scala 2 | script: 3 | - sbt ++$TRAVIS_SCALA_VERSION package 4 | after_success: 5 | - if [[ "${PUBLISH_ENABLED}" == "true" && "${TRAVIS_PULL_REQUEST}" == "false" && "${TRAVIS_BRANCH}" == "master" && "${PUBLISH_USER}" != "" && "${PUBLISH_PASS}" != "" ]]; then sbt ++$TRAVIS_SCALA_VERSION publish; fi 6 | scala: 7 | - 2.10.4 8 | - 2.11.1 9 | jdk: 10 | - oraclejdk7 11 | env: 12 | global: 13 | - PUBLISH_ENABLED=true 14 | - secure: "Wb/CtlPhsX5BCkdT+tU0f3T7dJ/wIq0lWM6V/p2+XxoEzaob5Ps+V4rm2YelMwGQGrW25EM5icXvYaTWL8ceyc4anegA25erHQzCUSrQ6M9X0cDxyltdAcsx0tyKY2JP6prNu6Zj1/8ddCn3X/gJWg6iHkQg+pA5stHToDocXVo=" 15 | - secure: "NeiG7z40oqapLDEoi9Cs0u7BgFsEiZuKRF8iLDhOCtsKBLHWbrVylD/Z8RJioNn1Fkj8rp1R4ii/O6ASIRgSxl+dthHgrNkTfo/bgZemWws9GYvTHRgp+OwDktsMNxW/BGWLW7dg8C5z8nAvwq8TzFm8VDV671VSs4GhiSFyjjQ=" 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * Neither the name of the {organization} nor the names of its 15 | contributors may be used to endorse or promote products derived from 16 | this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DEPRECATED 2 | This repository is no longer actively maintained. 3 | Use ScalaJS facade types for D3 version 5 4 | [fdietze/scala-js-d3v4](https://github.com/fdietze/scala-js-d3v4) 5 | 6 | 7 | scala-js-d3 8 | =============== 9 | [![Scala.js](http://scala-js.org/assets/badges/scalajs-0.6.5.svg)](http://scala-js.org) 10 | [![Scala.js](http://scala-js.org/assets/badges/scalajs-0.6.13.svg)](http://scala-js.org) 11 | 12 | Static types for the d3 API for [Scala.js](http://www.scala-js.org/) programs. 13 | 14 | ![](https://github.com/spaced/scala-js-d3/blob/master/site/d3demo.png) 15 | 16 | Usage 17 | ----- 18 | Add the following to your sbt build definition: 19 | 20 | libraryDependencies += "org.singlespaced" %%% "scalajs-d3" % "0.3.4" 21 | 22 | Enjoy the types available in `org.singlespaced.d3js`: 23 | ``` 24 | package example 25 | 26 | import scala.scalajs.js 27 | import org.scalajs.dom 28 | import org.singlespaced.d3js.d3 29 | import org.singlespaced.d3js.Ops._ 30 | 31 | object ScalaJSExample extends js.JSApp { 32 | 33 | def main() { 34 | val sel=d3.selectAll("div").data(js.Array(5,2,4,6)) 35 | sel.style("width", (d:Int) => d*2 ) 36 | } 37 | 38 | ``` 39 | 40 | more about [d3js.org](http://d3js.org) 41 | 42 | See also example project [scala-js-d3-example-app](https://github.com/spaced/scala-js-d3-example-app) 43 | - [Bar graph](https://github.com/spaced/scala-js-d3-example-app/blob/master/src/main/scala/example/ScalaJSExample.scala) 44 | - [Histogram](https://github.com/spaced/scala-js-d3-example-app/blob/histogram/src/main/scala/example/ScalaJSExample.scala) 45 | - [Table](https://github.com/spaced/scala-js-d3-example-app/blob/table_data_example/src/main/scala/example/ScalaJSExample.scala) 46 | 47 | 48 | Versions 49 | -------- 50 | - [Release notes](https://github.com/spaced/scala-js-d3/releases) 51 | - scalajs-d3 0.3.4 is for Scala.js 0.6.13+, with Scala 2.10, 2.11 and 2.12 52 | - scalajs-d3 0.3.3 is for Scala.js 0.6.6+, with both Scala 2.10 and 2.11. 53 | - scalajs-d3 0.2.0 is for Scala.js 0.6.5, with both Scala 2.10 and 2.11. 54 | 55 | 56 | 57 | License 58 | ------- 59 | 60 | Copyright (c) 2002-2015 61 | 62 | All rights reserved. 63 | 64 | Redistribution and use in source and binary forms, with or without modification, 65 | are permitted provided that the following conditions are met: 66 | 67 | * Redistributions of source code must retain the above copyright notice, 68 | this list of conditions and the following disclaimer. 69 | * Redistributions in binary form must reproduce the above copyright notice, 70 | this list of conditions and the following disclaimer in the documentation 71 | and/or other materials provided with the distribution. 72 | * Neither the name of the singlespaced.org nor the names of its contributors 73 | may be used to endorse or promote products derived from this software 74 | without specific prior written permission. 75 | 76 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 77 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 78 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 79 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 80 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 81 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 82 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 83 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 84 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 85 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 86 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 87 | -------------------------------------------------------------------------------- /build.sbt: -------------------------------------------------------------------------------- 1 | enablePlugins(ScalaJSPlugin) 2 | 3 | name := "Scala.js d3" 4 | 5 | normalizedName := "scalajs-d3" 6 | 7 | organization := "org.singlespaced" 8 | 9 | scalaVersion := "2.12.0" 10 | 11 | scalacOptions ++= Seq("-deprecation", "-feature") 12 | 13 | crossScalaVersions := Seq("2.10.6", "2.11.8", "2.12.0") 14 | 15 | libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "0.9.1" 16 | 17 | resolvers += Resolver.jcenterRepo 18 | 19 | jsDependencies += "org.webjars" % "d3js" % "3.5.17" / "3.5.17/d3.min.js" 20 | jsDependencies += RuntimeDOM 21 | 22 | // uTest settings 23 | libraryDependencies += "com.lihaoyi" %%% "utest" % "0.4.4" % "test" 24 | testFrameworks += new TestFramework("utest.runner.Framework") 25 | 26 | homepage := Some(url("https://github.com/spaced/scala-js-d3")) 27 | licenses += ("BSD New", url("https://github.com/spaced/scala-js-d3/blob/master/LICENSE")) 28 | 29 | scmInfo := Some(ScmInfo( 30 | url("https://github.com/spaced/scala-js-d3"), 31 | "scm:git:git@github.com:spaced/scala-js-d3.git", 32 | Some("scm:git:git@github.com:spaced/scala-js-d3.git"))) 33 | 34 | 35 | pomExtra := ( 36 | 37 | 38 | spaced 39 | Adi Stadelmann 40 | http://singlespaced.org 41 | 42 | ) 43 | 44 | publishMavenStyle := true 45 | 46 | releasePublishArtifactsAction := PgpKeys.publishSigned.value 47 | 48 | useGpg := true 49 | 50 | //bintray.Keys.repository := "maven" 51 | -------------------------------------------------------------------------------- /project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=0.13.13 2 | -------------------------------------------------------------------------------- /project/build.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.13") 2 | 3 | addSbtPlugin("me.lessis" % "bintray-sbt" % "0.3.0") 4 | 5 | addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.1") 6 | 7 | addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.3") 8 | -------------------------------------------------------------------------------- /site/d3demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spaced/scala-js-d3/6913f140b796265418a65e28a3a48e149fd33f64/site/d3demo.png -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/Ops.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.singlespaced.d3js.d3.Primitive 4 | 5 | import scala.language.implicitConversions 6 | import scala.scalajs.js 7 | 8 | /** 9 | * Implicit conversion from [scala.Function1] and [scala.Function2] to [[js.Function3]]. 10 | * Implicit conversion for a Function using [Primitive] 11 | */ 12 | object Ops { 13 | 14 | @inline implicit def fromFunction1To3StringPrimitive[Datum](value: Datum => String): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 15 | asPrimitive(value) 16 | 17 | @inline implicit def fromFunction1To3DoublePrimitive[Datum](value: Datum => Double): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 18 | asPrimitive(value) 19 | 20 | @inline implicit def fromFunction1To3IntPrimitive[Datum](value: Datum => Int): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 21 | asPrimitive(value) 22 | 23 | @inline implicit def fromFunction1To3BooleanPrimitive[Datum](value: Datum => Boolean): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 24 | asPrimitive(value) 25 | 26 | @inline implicit def fromFunction2To3StringPrimitive[Datum](value: (Datum, Int) => String): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 27 | asPrimitive(value) 28 | 29 | @inline implicit def fromFunction2To3DoublePrimitive[Datum](value: (Datum, Int) => Double): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 30 | asPrimitive(value) 31 | 32 | @inline implicit def fromFunction2To3BooleanPrimitive[Datum](value: (Datum, Int) => Boolean): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 33 | asPrimitive(value) 34 | 35 | @inline implicit def fromFunction2To3IntPrimitive[Datum](value: (Datum, Int) => Int): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 36 | asPrimitive(value) 37 | 38 | @inline implicit def fromJsFunction1To3StringPrimitive[Datum](value: js.Function1[Datum,String]): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 39 | asPrimitive(value) 40 | 41 | @inline implicit def fromJsFunction1To3DoublePrimitive[Datum](value: js.Function1[Datum,Double]): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 42 | asPrimitive(value) 43 | 44 | @inline implicit def fromJsFunction1To3IntPrimitive[Datum](value: js.Function1[Datum,Int]): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 45 | asPrimitive(value) 46 | 47 | @inline implicit def fromJsFunction1To3BooleanPrimitive[Datum](value: js.Function1[Datum,Boolean]): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 48 | asPrimitive(value) 49 | 50 | @inline implicit def fromJsFunction2To3StringPrimitive[Datum](value: js.Function2[Datum, Int,String]): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 51 | asPrimitive(value) 52 | 53 | @inline implicit def fromJsFunction2To3DoublePrimitive[Datum](value: js.Function2[Datum, Int, Double]): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 54 | asPrimitive(value) 55 | 56 | @inline implicit def fromJsFunction2To3BooleanPrimitive[Datum](value: js.Function2[Datum, Int, Boolean]): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 57 | asPrimitive(value) 58 | 59 | @inline implicit def fromJsFunction2To3IntPrimitive[Datum](value: js.Function2[Datum, Int, Int]): js.Function3[Datum, Int, js.UndefOr[Int], Primitive] = 60 | asPrimitive(value) 61 | 62 | 63 | @inline implicit def asPrimitive[Datum, T](value: Datum => T) = 64 | fromFunction1To3(value.andThen(_.asInstanceOf[Primitive])) 65 | 66 | @inline implicit def asPrimitive[Datum, T](value: (Datum, Int) => T) = 67 | fromFunction2To3((d: Datum, i: Int) => value.apply(d, i).asInstanceOf[Primitive]) 68 | 69 | @inline implicit def fromFunction1To3[Datum, M](value: Datum => M): js.Function3[Datum, Int, js.UndefOr[Int], M] = 70 | (d: Datum, i: Int, x: js.UndefOr[Int]) => value.apply(d) 71 | 72 | @inline implicit def fromFunction1To2[Datum, M](value: Datum => M): js.Function2[Datum, Int, M] = 73 | (d: Datum, i: Int) => value.apply(d) 74 | 75 | @inline implicit def fromFunction2To3[Datum, M](value: (Datum, Int) => M): js.Function3[Datum, Int, js.UndefOr[Int], M] = 76 | (d: Datum, i: Int, x: js.UndefOr[Int]) => value.apply(d, i) 77 | 78 | 79 | } 80 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/behavior.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | 4 | import scala.scalajs.js 5 | import scala.scalajs.js.annotation.JSName 6 | 7 | @JSName("d3.behavior") 8 | @js.native 9 | trait BehaviorObject extends js.Object { 10 | def drag[Datum](): behavior.Drag[Datum] = js.native 11 | 12 | def zoom[Datum](): behavior.Zoom[Datum] = js.native 13 | 14 | } 15 | package behavior { 16 | 17 | @js.native 18 | trait Drag[Datum] extends js.Function1[Selection[Datum],Unit] { 19 | 20 | def on(`type`: String): js.Function2[Datum, Double, Any] = js.native 21 | 22 | def on(`type`: String, listener: js.Function2[Datum, Double, Any]): Drag[Datum] = js.native 23 | 24 | def origin(): js.Function2[Datum, Double, js.Any] = js.native 25 | 26 | def origin(accessor: js.Function2[Datum, Double, js.Any]): Drag[Datum] = js.native 27 | } 28 | 29 | @js.native 30 | trait Zoom[Datum] extends js.Function1[Selection[Datum],Unit] { 31 | 32 | def translate(): js.Tuple2[Double, Double] = js.native 33 | 34 | def translate(translate: js.Tuple2[Double, Double]): Zoom[Datum] = js.native 35 | 36 | def scale(): Double = js.native 37 | 38 | def scale(scale: Double): Zoom[Datum] = js.native 39 | 40 | def scaleExtent(): js.Tuple2[Double, Double] = js.native 41 | 42 | def scaleExtent(extent: js.Tuple2[Double, Double]): Zoom[Datum] = js.native 43 | 44 | def center(): js.Tuple2[Double, Double] = js.native 45 | 46 | def center(center: js.Tuple2[Double, Double]): Zoom[Datum] = js.native 47 | 48 | def size(): js.Tuple2[Double, Double] = js.native 49 | 50 | def size(size: js.Tuple2[Double, Double]): Zoom[Datum] = js.native 51 | 52 | def x(): zoom.Scale = js.native 53 | 54 | def x[S<:BaseScale[_,_,S]](x:S): Zoom[Datum] = js.native 55 | 56 | def y(): zoom.Scale = js.native 57 | 58 | def y[S<:BaseScale[_,_,S]](x:S): Zoom[Datum] = js.native 59 | 60 | def on(`type`: String): js.Function2[Datum, Double, Any] = js.native 61 | 62 | def on(`type`: String, listener: js.Function2[Datum, Double, Any]): Zoom[Datum] = js.native 63 | 64 | def event(selection: Selection[Datum]): Unit = js.native 65 | 66 | def event(transition: Transition[Datum]): Unit = js.native 67 | } 68 | 69 | package zoom { 70 | 71 | 72 | @js.native 73 | trait Scale extends BaseScale[Double,Double,Scale] { 74 | 75 | } 76 | 77 | 78 | } 79 | 80 | 81 | } 82 | 83 | 84 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/d3.scala: -------------------------------------------------------------------------------- 1 | 2 | package org.singlespaced.d3js 3 | 4 | import org.scalajs.dom 5 | 6 | import scala.scalajs.js 7 | import scala.scalajs.js.`|` 8 | import scala.scalajs.js.annotation.JSName 9 | 10 | 11 | @JSName("d3") 12 | @js.native 13 | object d3 extends js.Object { 14 | 15 | type Primitive = Double | String | Boolean 16 | 17 | var version: String = js.native 18 | def select(selector: String): Selection[dom.EventTarget] = js.native 19 | def select(node: dom.EventTarget): Selection[dom.EventTarget] = js.native 20 | def selectAll(selector: String): Selection[dom.EventTarget] = js.native 21 | def selectAll(nodes: js.Array[dom.EventTarget]): Selection[dom.EventTarget] = js.native 22 | def selection(): Selection[dom.Element] = js.native 23 | def transition(): Transition[dom.Element] = js.native 24 | def ease(`type`: String, args: js.Any*): js.Function1[Double, Double] = js.native 25 | def timer(func: js.Function0[Any], delay: Double = ???, time: Double = ???): Unit = js.native 26 | var event: dom.Event | BaseEvent = js.native 27 | def mouse(container: dom.EventTarget): js.Tuple2[Double, Double] = js.native 28 | def touch(container: dom.EventTarget, identifer: Double): js.Tuple2[Double, Double] = js.native 29 | def touch(container: dom.EventTarget, touches: dom.TouchList, identifer: Double): js.Tuple2[Double, Double] = js.native 30 | def touches(container: dom.EventTarget, touches: dom.TouchList = ???): js.Array[js.Tuple2[Double, Double]] = js.native 31 | def ascending(a: Primitive, b: Primitive): Double = js.native 32 | def descending(a: Primitive, b: Primitive): Double = js.native 33 | def min(array: js.Array[Double]): Double = js.native 34 | def minString(array: js.Array[String]): String = js.native 35 | def min[T <: Numeric](array: js.Array[T]): T = js.native 36 | def min[T](array: js.Array[T], accessor: js.Function2[T, Int, Double]): Double = js.native 37 | def min[T](array: js.Array[T], accessor: js.Function2[T, Int, String]): String = js.native 38 | def min[T, U <: Numeric](array: js.Array[T], accessor: js.Function2[T, Double, U]): U = js.native 39 | def max(array: js.Array[Double]): Double = js.native 40 | def maxString(array: js.Array[String]): String = js.native 41 | def max[T <: Numeric](array: js.Array[T]): T = js.native 42 | def max[T](array: js.Array[T], accessor: js.Function2[T, Int, Double]): Double = js.native 43 | def max[T](array: js.Array[T], accessor: js.Function2[T, Int, String]): String = js.native 44 | def max[T, U <: Numeric](array: js.Array[T], accessor: js.Function2[T, Int, U]): U = js.native 45 | //TODO def extent(array: js.Array[Double]): js.Tuple2[Double, Double] = js.native 46 | //TODO def extent(array: js.Array[String]): js.Tuple2[String, String] = js.native 47 | def extent[T](array: js.Array[T]): js.Tuple2[T, T] = js.native 48 | //TODO def extent[T <: Numeric](array: js.Array[T | Primitive]): js.Tuple2[T | Primitive, T | Primitive] = js.native 49 | //TODO def extent[T] (array: js.Array[T], accessor: js.Function2[T, Double, Double]): js.Tuple2[Double, Double] = js.native 50 | //TODO def extent[T] (array: js.Array[T], accessor: js.Function2[T, Double, String]): js.Tuple2[String, String] = js.native 51 | //TODO def extent[T, U <: Numeric](array: js.Array[U], accessor: js.Function2[T, Double, U]): js.Tuple2[U | Primitive, U | Primitive] = js.native 52 | def sum(array: js.Array[Double]): Double = js.native 53 | def sum[T](array: js.Array[T], accessor: js.Function2[T, Int, Double]): Double = js.native 54 | def mean(array: js.Array[Double]): Double = js.native 55 | def mean[T](array: js.Array[T], accessor: js.Function2[T, Int, Double]): Double = js.native 56 | def median(array: js.Array[Double]): Double = js.native; 57 | def median[T](array: js.Array[T], accessor: js.Function2[T, Int, Double]): Double = js.native; 58 | def quantile(array: js.Array[Double], p: Double): Double = js.native 59 | def variance(array: js.Array[Double]): Double = js.native 60 | def variance[T](array: js.Array[T], accessor: js.Function2[T, Int, Double]): Double = js.native 61 | def deviation(array: js.Array[Double]): Double = js.native 62 | def deviation[T](array: js.Array[T], accessor: js.Function2[T, Int, Double]): Double = js.native 63 | def bisectLeft(array: js.Array[Double], x: Double, lo: Double , hi: Double ): Double = js.native 64 | def bisectLeft(array: js.Array[String], x: String, lo: Double = ???, hi: Double = ???): Double = js.native 65 | //TODO:fix var bisect: bisectRight.type = js.native 66 | def bisectRight[T](array: js.Array[T], x: T, lo: Double , hi: Double ): Double = js.native 67 | def bisector[T, U](accessor: js.Function1[T, U]): js.Any = js.native 68 | def bisector[T, U](comparator: js.Function2[T, U, Double]): js.Any = js.native 69 | def shuffle[T](array: js.Array[T], lo: Double, hi: Double): js.Array[T] = js.native 70 | def keys(`object`: Object): js.Array[String] = js.native 71 | def values[T](`object`: js.Dictionary[T]): js.Array[T] = js.native 72 | def values[T](`object`: js.Any): js.Array[T] = js.native 73 | def values(`object`: Object): js.Array[js.Any] = js.native 74 | def entries[T](`object`: js.Dictionary[T]): js.Array[js.Any] = js.native 75 | def entries(`object`: Object): js.Array[js.Any] = js.native 76 | def map[T](): Map[T] = js.native 77 | def map[T](`object`: Map[T]): Map[T] = js.native 78 | def map[T](`object`: js.Dictionary[T]): Map[T] = js.native 79 | def map[T](`object`: js.Any): Map[T] = js.native 80 | def map[T](array: js.Array[T], key: js.Function2[T, Double, String]): Map[T] = js.native 81 | def set(): Set = js.native 82 | def set(array: js.Array[String]): Set = js.native 83 | def merge[T](arrays: js.Array[js.Array[T]]): js.Array[T] = js.native 84 | def range(stop: Double): js.Array[Double] = js.native 85 | def range(start: Double, stop: Double, step: Double = ???): js.Array[Double] = js.native 86 | def permute[T](array: js.Any, keys: js.Array[Double]): js.Array[T] = js.native 87 | def permute[T](`object`: js.Dictionary[T], keys: js.Array[String]): js.Array[T] = js.native 88 | def zip[T](arrays: js.Array[T]*): js.Array[js.Array[T]] = js.native 89 | def transpose[T](matrix: js.Array[js.Array[T]]): js.Array[js.Array[T]] = js.native 90 | def pairs[T](array: js.Array[T]): js.Array[js.Tuple2[T, T]] = js.native 91 | def nest[T](): Nest[T] = js.native 92 | def transform(transform: String): Transform = js.native 93 | def format(specifier: String): js.Function1[Double, String] = js.native 94 | def formatPrefix(value: Double, precision: Double = ???): FormatPrefix = js.native 95 | def round(x: Double, n: Double = ???): Double = js.native 96 | def requote(string: String): String = js.native 97 | def functorWithFun[T <: js.Function](value: T): T = js.native 98 | def functor[T](value: T): js.Function0[T] = js.native 99 | def rebind(target: js.Any, source: js.Any, names: String*): js.Dynamic = js.native 100 | def dispatch(names: String*): Dispatch = js.native 101 | def interpolate(a: Double, b: Double): js.Function1[Double, Double] = js.native 102 | def interpolate(a: String, b: String): js.Function1[Double, String] = js.native 103 | def interpolate(a: String | Color, b: Color): js.Function1[Double, String] = js.native 104 | //TODO def interpolate(a: js.Array[String | Color], b: js.Array[Color]): js.Function1[Double, String] = js.native 105 | //TODO def interpolate[Range, Output](a: js.Array[Range], b: js.Array[Output]): js.Function1[Double, js.Array[Output]] = js.native 106 | def interpolate[Range, Output](a: js.Array[Range], b: js.Array[Range]): js.Function1[Double, js.Array[Output]] = js.native 107 | //TODO def interpolate(a: js.Dictionary[String | Color], b: js.Dictionary[Color]): js.Function1[Double, js.Dictionary[String]] = js.native 108 | def interpolate[Range, Output](a: js.Dictionary[Range], b: js.Dictionary[Output]): js.Function1[Double, js.Dictionary[Output]] = js.native 109 | //TODO def interpolate[Range, Output](a: js.Dictionary[Range], b: js.Dictionary[Range]): js.Function1[Double, js.Dictionary[Output]] = js.native 110 | def interpolateNumber(a: Double, b: Double): js.Function1[Double, Double] = js.native 111 | def interpolateRound(a: Double, b: Double): js.Function1[Double, Double] = js.native 112 | def interpolateString(a: String, b: String): js.Function1[Double, String] = js.native 113 | def interpolateRgb(a: String | Color, b: String | Color): js.Function1[Double, String] = js.native 114 | def interpolateHsl(a: String | Color, b: String | Color): js.Function1[Double, String] = js.native 115 | def interpolateLab(a: String | Color, b: String | Color): js.Function1[Double, String] = js.native 116 | def interpolateHcl(a: String | Color, b: String | Color): js.Function1[Double, String] = js.native 117 | //TODO def interpolateArray(a: js.Array[String | Color], b: js.Array[Color]): js.Function1[Double, js.Array[String]] = js.native 118 | def interpolateArray[Range, Output](a: js.Array[Range], b: js.Array[Range]): js.Function1[Double, js.Array[Output]] = js.native 119 | //TODO def interpolateArray[Range, Output](a: js.Array[Range], b: js.Array[Output]): js.Function1[Double, js.Array[Output]] = js.native 120 | //TODO def interpolateObject(a: js.Dictionary[String | Color], b: js.Dictionary[Color]): js.Function1[Double, js.Dictionary[String]] = js.native 121 | def interpolateObject[Range, Output](a: js.Dictionary[Range], b: js.Dictionary[Output]): js.Function1[Double, js.Dictionary[Output]] = js.native 122 | //TODO def interpolateObject[Range, Output](a: js.Dictionary[Range], b: js.Dictionary[Range]): js.Function1[Double, js.Dictionary[Output]] = js.native 123 | def interpolateTransform(a: String | Transform, b: String | Transform): js.Function1[Double, String] = js.native 124 | def interpolateZoom(a: js.Tuple3[Double, Double, Double], b: js.Tuple3[Double, Double, Double]): js.Any = js.native 125 | var interpolators: js.Array[js.Function2[js.Any, js.Any, js.Function1[Double, Any]]] = js.native 126 | def xhr(url: String, mimeType: String = ???, callback: js.Function2[js.Any, js.Any, Unit] = ???): Xhr = js.native 127 | def xhr(url: String, callback: js.Function2[js.Any, js.Any, Unit]): Xhr = js.native 128 | def text(url: String, mimeType: String = ???, callback: js.Function2[js.Any, String, Unit] = ???): Xhr = js.native 129 | def text(url: String, callback: js.Function2[js.Any, String, Unit]): Xhr = js.native 130 | def json(url: String, callback: js.Function2[js.Any, js.Any, Unit] = ???): Xhr = js.native 131 | def xml(url: String, mimeType: String = ???, callback: js.Function2[js.Any, js.Any, Unit] = ???): Xhr = js.native 132 | def xml(url: String, callback: js.Function2[js.Any, js.Any, Unit]): Xhr = js.native 133 | def html(url: String, callback: js.Function2[js.Any, dom.DocumentFragment, Unit] = ???): Xhr = js.native 134 | var csv: Dsv = js.native 135 | var tsv: Dsv = js.native 136 | def dsv(delimiter: String, mimeType: String): Dsv = js.native 137 | def locale(definition: LocaleDefinition): Locale = js.native 138 | //forwarders 139 | 140 | def behavior:BehaviorObject=js.native 141 | def geo:GeoObject=js.native 142 | def geom:GeomObject=js.native 143 | def layout:LayoutObject=js.native 144 | //TODO def transition=d3modules.transition 145 | def timer:TimerObject=js.native 146 | def random:RandomObject=js.native 147 | def rgb:RgbObject=js.native 148 | def hsl:HslObject=js.native 149 | def hcl:HclObject=js.native 150 | def lab:LabObject=js.native 151 | def color:ColorObject=js.native 152 | def scale:ScaleObject=js.native 153 | def ns:NsObject=js.native 154 | def svg:SvgObject=js.native 155 | def time:TimeObject=js.native 156 | 157 | 158 | 159 | } 160 | 161 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/geo.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | 4 | 5 | import scala.scalajs.js 6 | import js.annotation.JSName 7 | import org.scalajs.dom 8 | import js.`|` 9 | 10 | @JSName("d3.geo") 11 | @js.native 12 | trait GeoObject extends js.Object { 13 | import geo._ 14 | 15 | def path(): Path = js.native 16 | 17 | def graticule(): Graticule = js.native 18 | 19 | def circle(): Circle = js.native 20 | 21 | def area(feature: js.Any): Double = js.native 22 | 23 | def centroid(feature: js.Any): js.Tuple2[Double, Double] = js.native 24 | 25 | def bounds(feature: js.Any): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 26 | 27 | def distance(a: js.Tuple2[Double, Double], b: js.Tuple2[Double, Double]): Double = js.native 28 | 29 | def length(feature: js.Any): Double = js.native 30 | 31 | def interpolate(a: js.Tuple2[Double, Double], b: js.Tuple2[Double, Double]): js.Function1[Double, js.Tuple2[Double, Double]] = js.native 32 | 33 | def rotation(rotate: js.Tuple2[Double, Double] | js.Tuple3[Double, Double, Double]): Rotation = js.native 34 | 35 | def stream(`object`: js.Any, listener: Listener): Unit = js.native 36 | 37 | def transform(methods: TransformMethods): Transform = js.native 38 | 39 | def clipExtent(): ClipExtent = js.native 40 | 41 | def projection(raw: RawInvertibleProjection): InvertibleProjection = js.native 42 | 43 | def projection(raw: RawProjection): Projection = js.native 44 | 45 | def projectionMutator(factory: js.Function): js.Function = js.native 46 | 47 | def albers(): ConicProjection = js.native 48 | 49 | def albersUsa(): ConicProjection = js.native 50 | 51 | def azimuthalEqualArea(): InvertibleProjection = js.native 52 | 53 | def azimuthalEquidistant(): InvertibleProjection = js.native 54 | 55 | def conicConformal(): ConicProjection = js.native 56 | 57 | def conicEqualArea(): ConicProjection = js.native 58 | 59 | def conicEquidistant(): ConicProjection = js.native 60 | 61 | def equirectangular(): InvertibleProjection = js.native 62 | 63 | def gnomonic(): InvertibleProjection = js.native 64 | 65 | def mercator(): InvertibleProjection = js.native 66 | 67 | def orthographic(): InvertibleProjection = js.native 68 | 69 | def stereographic(): InvertibleProjection = js.native 70 | 71 | def transverseMercator(): InvertibleProjection = js.native 72 | 73 | //forwarders 74 | //TODO define forwarders 75 | 76 | } 77 | package geo { 78 | @js.native 79 | trait Path extends js.Function2[/*feature*/ js.Any, /*index*/ Double,String] { 80 | def area(feature: js.Any): Double = js.native 81 | def centroid(feature: js.Any): js.Tuple2[Double, Double] = js.native 82 | def bounds(feature: js.Any): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 83 | def projection(): Transform | js.Function1[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 84 | def projection(stream: Transform): Path = js.native 85 | def projection(projection: js.Function1[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): Path = js.native 86 | def pointRadius(): Double | js.Function2[js.Any, Double, Double] = js.native 87 | def pointRadius(radius: Double): Path = js.native 88 | def pointRadius(radius: js.Function2[js.Any, Double, Double]): Path = js.native 89 | def context(): dom.CanvasRenderingContext2D = js.native 90 | def context(context: dom.CanvasRenderingContext2D): Path = js.native 91 | } 92 | @js.native 93 | trait Graticule extends js.Object { 94 | def apply(): js.Dynamic = js.native 95 | def lines(): js.Array[js.Any] = js.native 96 | def outline(): js.Dynamic = js.native 97 | def extent(): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 98 | def extent(extent: js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): Graticule = js.native 99 | def majorExtent(): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 100 | def majorExtent(extent: js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): Graticule = js.native 101 | def minorExtent(): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 102 | def minorExtent(extent: js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): Graticule = js.native 103 | def step(): js.Tuple2[Double, Double] = js.native 104 | def step(step: js.Tuple2[Double, Double]): Graticule = js.native 105 | def majorStep(): js.Tuple2[Double, Double] = js.native 106 | def majorStep(step: js.Tuple2[Double, Double]): Graticule = js.native 107 | def minorStep(): js.Tuple2[Double, Double] = js.native 108 | def minorStep(step: js.Tuple2[Double, Double]): Graticule = js.native 109 | def precision(): Double = js.native 110 | def precision(precision: Double): Graticule = js.native 111 | } 112 | 113 | @js.native 114 | trait Circle extends js.Object { 115 | def apply(args: js.Any*): js.Dynamic = js.native 116 | def origin(): js.Tuple2[Double, Double] | js.Function = js.native 117 | def origin(origin: js.Tuple2[Double, Double]): Circle = js.native 118 | def origin(origin: js.Function): Circle = js.native 119 | def angle(): Double = js.native 120 | def angle(angle: Double): Circle = js.native 121 | def precision(): Double = js.native 122 | def precision(precision: Double): Circle = js.native 123 | } 124 | 125 | @js.native 126 | trait Rotation extends js.Object { 127 | def apply(location: js.Tuple2[Double, Double]): js.Tuple2[Double, Double] = js.native 128 | def invert(location: js.Tuple2[Double, Double]): js.Tuple2[Double, Double] = js.native 129 | } 130 | 131 | @js.native 132 | trait Listener extends js.Object { 133 | def point(x: Double, y: Double, z: Double): Unit = js.native 134 | def lineStart(): Unit = js.native 135 | def lineEnd(): Unit = js.native 136 | def polygonStart(): Unit = js.native 137 | def polygonEnd(): Unit = js.native 138 | def sphere(): Unit = js.native 139 | } 140 | 141 | @js.native 142 | trait TransformMethods extends js.Object { 143 | def point(x: Double, y: Double, z: Double): Unit = js.native 144 | def lineStart(): Unit = js.native 145 | def lineEnd(): Unit = js.native 146 | def polygonStart(): Unit = js.native 147 | def polygonEnd(): Unit = js.native 148 | def sphere(): Unit = js.native 149 | } 150 | 151 | @js.native 152 | trait Transform extends js.Object { 153 | def stream(stream: Listener): Listener = js.native 154 | } 155 | 156 | @js.native 157 | trait ClipExtent extends Transform { 158 | def extent(): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 159 | def extent(extent: js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): ClipExtent = js.native 160 | } 161 | 162 | @JSName("d3.geo.azimuthalEqualArea") 163 | @js.native 164 | object azimuthalEqualArea_ extends js.Object { 165 | def raw(lambda: Double, phi: Double): js.Tuple2[Double, Double] = js.native 166 | 167 | @JSName("d3.geo.azimuthalEqualArea.raw") 168 | @js.native 169 | object raw extends js.Object { 170 | def invert(x: Double, y: Double): js.Tuple2[Double, Double] = js.native 171 | } 172 | 173 | } 174 | 175 | @JSName("d3.geo.azimuthalEquidistant") 176 | @js.native 177 | object azimuthalEquidistant_ extends js.Object { 178 | 179 | def raw(lambda: Double, phi: Double): js.Tuple2[Double, Double] = js.native 180 | @JSName("d3.geo.azimuthalEquidistant.raw") 181 | @js.native 182 | object raw extends js.Object { 183 | def invert(x: Double, y: Double): js.Tuple2[Double, Double] = js.native 184 | } 185 | 186 | } 187 | 188 | 189 | @JSName("d3.geo.conicConformal") 190 | @js.native 191 | object conicConformal_ extends js.Object { 192 | def raw(phi0: Double, phi1: Double): RawInvertibleProjection = js.native 193 | } 194 | 195 | @JSName("d3.geo.conicEqualArea") 196 | @js.native 197 | object conicEqualArea_ extends js.Object { 198 | def raw(phi0: Double, phi1: Double): RawInvertibleProjection = js.native 199 | } 200 | 201 | @JSName("d3.geo.conicEquidistant") 202 | @js.native 203 | object conicEquidistant_ extends js.Object { 204 | def raw(phi0: Double, phi1: Double): RawInvertibleProjection = js.native 205 | } 206 | 207 | 208 | @JSName("d3.geo.equirectangular") 209 | @js.native 210 | object equirectangular_ extends js.Object { 211 | def raw(lambda: Double, phi: Double): js.Tuple2[Double, Double] = js.native 212 | @JSName("d3.geo.equirectangular.raw") 213 | @js.native 214 | object raw extends js.Object { 215 | def invert(x: Double, y: Double): js.Tuple2[Double, Double] = js.native 216 | } 217 | } 218 | 219 | 220 | @JSName("d3.geo.gnomonic") 221 | @js.native 222 | object gnomonic_ extends js.Object { 223 | 224 | def raw(lambda: Double, phi: Double): js.Tuple2[Double, Double] = js.native 225 | @JSName("d3.geo.gnomonic.raw") 226 | @js.native 227 | object raw extends js.Object { 228 | def invert(x: Double, y: Double): js.Tuple2[Double, Double] = js.native 229 | } 230 | 231 | } 232 | 233 | 234 | @JSName("d3.geo.mercator") 235 | @js.native 236 | object mercator_ extends js.Object { 237 | def raw(lambda: Double, phi: Double): js.Tuple2[Double, Double] = js.native 238 | @JSName("d3.geo.mercator.raw") 239 | @js.native 240 | object raw extends js.Object { 241 | def invert(x: Double, y: Double): js.Tuple2[Double, Double] = js.native 242 | } 243 | 244 | } 245 | 246 | 247 | @JSName("d3.geo.orthographic") 248 | @js.native 249 | object orthographic_ extends js.Object { 250 | def raw(lambda: Double, phi: Double): js.Tuple2[Double, Double] = js.native 251 | @JSName("d3.geo.orthographic.raw") 252 | @js.native 253 | object raw extends js.Object { 254 | def invert(x: Double, y: Double): js.Tuple2[Double, Double] = js.native 255 | } 256 | 257 | } 258 | 259 | 260 | @JSName("d3.geo.stereographic") 261 | @js.native 262 | object stereographic_ extends js.Object { 263 | def raw(lambda: Double, phi: Double): js.Tuple2[Double, Double] = js.native 264 | @JSName("d3.geo.stereographic.raw") 265 | @js.native 266 | object raw extends js.Object { 267 | def invert(x: Double, y: Double): js.Tuple2[Double, Double] = js.native 268 | } 269 | 270 | } 271 | 272 | 273 | @JSName("d3.geo.transverseMercator") 274 | @js.native 275 | object transverseMercator_ extends js.Object { 276 | def raw(lambda: Double, phi: Double): js.Tuple2[Double, Double] = js.native 277 | @JSName("d3.geo.transverseMercator.raw") 278 | @js.native 279 | object raw extends js.Object { 280 | def invert(x: Double, y: Double): js.Tuple2[Double, Double] = js.native 281 | } 282 | 283 | } 284 | 285 | @js.native 286 | trait Projection extends js.Object { 287 | def apply(location: js.Tuple2[Double, Double]): js.Tuple2[Double, Double] = js.native 288 | def rotate(): js.Tuple3[Double, Double, Double] = js.native 289 | def rotate(rotation: js.Tuple3[Double, Double, Double]): Projection = js.native 290 | def center(): js.Tuple2[Double, Double] = js.native 291 | def center(location: js.Tuple2[Double, Double]): Projection = js.native 292 | def translate(): js.Tuple2[Double, Double] = js.native 293 | def translate(point: js.Tuple2[Double, Double]): Projection = js.native 294 | def scale(): Double = js.native 295 | def scale(scale: Double): Projection = js.native 296 | def clipAngle(): Double = js.native 297 | def clipAngle(angle: Double): Projection = js.native 298 | def clipExtent(): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 299 | def clipExtent(extent: js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): Projection = js.native 300 | def precision(): Double = js.native 301 | def precision(precision: Double): Projection = js.native 302 | def stream(listener: Listener): Listener = js.native 303 | } 304 | 305 | @js.native 306 | trait InvertibleProjection extends Projection { 307 | def invert(point: js.Tuple2[Double, Double]): js.Tuple2[Double, Double] = js.native 308 | } 309 | 310 | @js.native 311 | trait ConicProjection extends InvertibleProjection { 312 | def parallels(): js.Tuple2[Double, Double] = js.native 313 | def parallels(parallels: js.Tuple2[Double, Double]): ConicProjection = js.native 314 | override def rotate(): js.Tuple3[Double, Double, Double] = js.native 315 | override def rotate(rotation: js.Tuple3[Double, Double, Double]): ConicProjection = js.native 316 | override def center(): js.Tuple2[Double, Double] = js.native 317 | override def center(location: js.Tuple2[Double, Double]): ConicProjection = js.native 318 | override def translate(): js.Tuple2[Double, Double] = js.native 319 | override def translate(point: js.Tuple2[Double, Double]): ConicProjection = js.native 320 | override def scale(): Double = js.native 321 | override def scale(scale: Double): ConicProjection = js.native 322 | override def clipAngle(): Double = js.native 323 | override def clipAngle(angle: Double): ConicProjection = js.native 324 | override def clipExtent(): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 325 | override def clipExtent(extent: js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): ConicProjection = js.native 326 | override def precision(): Double = js.native 327 | override def precision(precision: Double): ConicProjection = js.native 328 | } 329 | 330 | @js.native 331 | trait RawProjection extends js.Object { 332 | def apply(lambda: Double, phi: Double): js.Tuple2[Double, Double] = js.native 333 | } 334 | 335 | @js.native 336 | trait RawInvertibleProjection extends RawProjection { 337 | def invert(x: Double, y: Double): js.Tuple2[Double, Double] = js.native 338 | } 339 | 340 | } 341 | 342 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/geom.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import scala.scalajs.js 4 | import scala.scalajs.js.`|` 5 | import scala.scalajs.js.annotation.JSName 6 | 7 | @JSName("d3.geom") 8 | @js.native 9 | trait GeomObject extends js.Object { 10 | 11 | import geom._ 12 | 13 | def voronoi(): Voronoi[js.Tuple2[Double, Double]] = js.native 14 | 15 | //TODO def voronoi[T](): Voronoi[T] = js.native 16 | def delaunay(vertices: js.Array[js.Tuple2[Double, Double]]): js.Array[js.Tuple3[js.Tuple2[Double, Double], js.Tuple2[Double, Double], js.Tuple2[Double, Double]]] = js.native 17 | 18 | def quadtree(): Quadtree[js.Tuple2[Double, Double]] = js.native 19 | 20 | def quadtree[T](nodes: js.Array[T], x1: Double = ???, y1: Double = ???, x2: Double = ???, y2: Double = ???): quadtreeModule.Quadtree[T] = js.native 21 | 22 | def hull(vertices: js.Array[js.Tuple2[Double, Double]]): js.Array[js.Tuple2[Double, Double]] = js.native 23 | 24 | def hull(): Hull[js.Tuple2[Double, Double]] = js.native 25 | 26 | //TODO def hull[T](): Hull[T] = js.native 27 | def polygon(vertices: js.Array[js.Tuple2[Double, Double]]): Polygon = js.native 28 | 29 | 30 | } 31 | package geom { 32 | 33 | @js.native 34 | trait Voronoi[T] extends js.Object { 35 | def apply(data: js.Array[T]): js.Array[js.Tuple2[Double, Double]] = js.native 36 | 37 | def x(): js.Function1[T, Double] = js.native 38 | 39 | def x(x: js.Function1[T, Double]): Voronoi[T] = js.native 40 | 41 | def y(): js.Function1[T, Double] = js.native 42 | 43 | def y(y: js.Function1[T, Double]): Voronoi[T] = js.native 44 | 45 | def clipExtent(): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 46 | 47 | def clipExtent(extent: js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): Voronoi[T] = js.native 48 | 49 | def links(data: js.Array[T]): js.Array[voronoiModule.Link[T]] = js.native 50 | 51 | def triangles(data: js.Array[T]): js.Array[js.Tuple3[T, T, T]] = js.native 52 | } 53 | 54 | 55 | @js.native 56 | trait Quadtree[T] extends js.Object { 57 | def apply(points: js.Array[T]): quadtreeModule.Quadtree[T] = js.native 58 | 59 | def x(): js.Function2[T, Double, Double] = js.native 60 | 61 | def x(x: Double): Quadtree[T] = js.native 62 | 63 | def x(x: js.Function2[T, Double, Double]): Quadtree[T] = js.native 64 | 65 | def y(): js.Function2[T, Double, Double] = js.native 66 | 67 | def y(y: Double): Quadtree[T] = js.native 68 | 69 | def y(y: js.Function2[T, Double, Double]): Quadtree[T] = js.native 70 | 71 | def extent(): js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 72 | 73 | def extent(extent: js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): Quadtree[T] = js.native 74 | } 75 | 76 | 77 | @js.native 78 | trait Hull[T] extends js.Object { 79 | def apply(vertices: js.Array[T]): js.Array[js.Tuple2[Double, Double]] = js.native 80 | 81 | def x(): js.Function1[T, Double] = js.native 82 | 83 | def x(x: js.Function1[T, Double]): Hull[T] = js.native 84 | 85 | def y(): js.Function1[T, Double] = js.native 86 | 87 | def y(y: js.Function1[T, Double]): Hull[T] = js.native 88 | } 89 | 90 | @js.native 91 | trait Polygon extends js.Object { 92 | def area(): Double = js.native 93 | 94 | def centroid(): js.Tuple2[Double, Double] = js.native 95 | 96 | def clip(subject: js.Array[js.Tuple2[Double, Double]]): js.Array[js.Tuple2[Double, Double]] = js.native 97 | } 98 | 99 | package quadtreeModule { 100 | 101 | 102 | @js.native 103 | trait Node[T] extends js.Object { 104 | var nodes: js.Tuple4[Node[T], Node[T], Node[T], Node[T]] = js.native 105 | var leaf: Boolean = js.native 106 | var point: T = js.native 107 | var x: Double = js.native 108 | var y: Double = js.native 109 | } 110 | 111 | @js.native 112 | trait Quadtree[T] extends Node[T] { 113 | def add(point: T): Unit = js.native 114 | 115 | def visit(callback: js.Function5[Node[T], Double, Double, Double, Double, Boolean | Unit]): Unit = js.native 116 | 117 | def find(point: js.Tuple2[Double, Double]): T = js.native 118 | } 119 | 120 | } 121 | 122 | package voronoiModule { 123 | 124 | 125 | @js.native 126 | trait Link[T] extends js.Object { 127 | var source: T = js.native 128 | var target: T = js.native 129 | } 130 | 131 | } 132 | 133 | } 134 | 135 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/layout.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import scala.scalajs.js 4 | import scala.scalajs.js.`|` 5 | import scala.scalajs.js.annotation.{JSExportAll, JSName, ScalaJSDefined} 6 | 7 | @JSName("d3.layout") 8 | @js.native 9 | trait LayoutObject extends js.Object { 10 | 11 | def bundle[Node <: bundleModule.Node](): Bundle[Node] = js.native 12 | 13 | def chord(): Chord = js.native 14 | 15 | def cluster[Node](): Cluster[Node] = js.native 16 | 17 | def force[Node, L <: Link[Node] ](): forceModule.Force[Node, L] = js.native 18 | 19 | def hierarchy[Node](): Hierarchy[Node] = js.native 20 | 21 | def histogram[T](): Histogram[T] = js.native 22 | 23 | def partition[Node](): Partition[Node] = js.native 24 | 25 | def pack[Node](): Pack[Node] = js.native 26 | 27 | def pie[T](): Pie[T] = js.native 28 | 29 | def stack[Value](): Stack[js.Array[Value], Value] = js.native 30 | 31 | //TODO def stack[Series, Value](): Stack[Series, Value] = js.native 32 | 33 | def tree[Node](): Tree[Node] = js.native 34 | 35 | def treemap[Node](): Treemap[Node] = js.native 36 | 37 | 38 | } 39 | 40 | @JSExportAll 41 | trait Link[Node] { 42 | def source:Node 43 | def target:Node 44 | } 45 | 46 | case class SimpleLink[Node](sourceNode:Node,targetNode:Node) extends Link[Node] { 47 | def source=sourceNode 48 | def target=targetNode 49 | } 50 | 51 | 52 | @js.native 53 | trait Bundle[T <: bundleModule.Node] extends js.Function1[js.Array[Link[T]], js.Array[js.Array[T]]] { 54 | } 55 | 56 | package bundleModule { 57 | 58 | @JSExportAll 59 | trait Node { 60 | def parent: Node 61 | } 62 | 63 | 64 | } 65 | 66 | 67 | package chordModule { 68 | 69 | @js.native 70 | trait Node extends js.Object { 71 | var index: Double = js.native 72 | var subindex: Double = js.native 73 | var startAngle: Double = js.native 74 | var endAngle: Double = js.native 75 | var value: Double = js.native 76 | } 77 | 78 | @js.native 79 | trait Group extends js.Object { 80 | var index: Double = js.native 81 | var startAngle: Double = js.native 82 | var endAngle: Double = js.native 83 | var value: Double = js.native 84 | } 85 | 86 | } 87 | 88 | @js.native 89 | trait Chord extends js.Object { 90 | def matrix(): js.Array[js.Array[Double]] = js.native 91 | 92 | def matrix(matrix: js.Array[js.Array[Double]]): Chord = js.native 93 | 94 | def padding(): Double = js.native 95 | 96 | def padding(padding: Double): Chord = js.native 97 | 98 | def sortGroups(): js.Function2[Double, Double, Double] = js.native 99 | 100 | def sortGroups(comparator: js.Function2[Double, Double, Double]): Chord = js.native 101 | 102 | def sortSubgroups(): js.Function2[Double, Double, Double] = js.native 103 | 104 | def sortSubgroups(comparator: js.Function2[Double, Double, Double]): Chord = js.native 105 | 106 | def sortChords(): js.Function2[Double, Double, Double] = js.native 107 | 108 | def sortChords(comparator: js.Function2[Double, Double, Double]): Chord = js.native 109 | 110 | def chords(): js.Array[Link[chordModule.Group]] = js.native 111 | 112 | def groups(): js.Array[chordModule.Group] = js.native 113 | } 114 | 115 | package clusterModule { 116 | 117 | 118 | trait Node extends hierarchyModule.Node { 119 | var x: js.UndefOr[Double] = js.undefined 120 | var y: js.UndefOr[Double] = js.undefined 121 | } 122 | 123 | 124 | } 125 | 126 | @js.native 127 | trait Cluster[Node] extends BaseHierarchy[Node,Hierarchy[Node]] { 128 | 129 | def nodes(root: Node): js.Array[Node] = js.native 130 | 131 | def separation(): js.Function2[Node, Node, Double] = js.native 132 | 133 | def separation(separation: js.Function2[Node, Node, Double]): Cluster[Node] = js.native 134 | 135 | def size(): js.Tuple2[Double, Double] = js.native 136 | 137 | def size(size: js.Tuple2[Double, Double]): Cluster[Node] = js.native 138 | 139 | def nodeSize(): js.Tuple2[Double, Double] = js.native 140 | 141 | def nodeSize(nodeSize: js.Tuple2[Double, Double]): Cluster[Node] = js.native 142 | 143 | } 144 | 145 | package forceModule { 146 | 147 | 148 | @JSExportAll 149 | trait Node { 150 | var index: js.UndefOr[Double] = js.undefined 151 | var x: js.UndefOr[Double] = js.undefined 152 | var y: js.UndefOr[Double] = js.undefined 153 | var px: js.UndefOr[Double] = js.undefined 154 | var py: js.UndefOr[Double] = js.undefined 155 | var fixed: js.UndefOr[Double] = js.undefined 156 | var weight: js.UndefOr[Double] = js.undefined 157 | } 158 | 159 | @js.native 160 | trait Event extends org.scalajs.dom.Event { 161 | var alpha: Double = js.native 162 | } 163 | 164 | @js.native 165 | trait Force[Node, L <: Link[Node] ] extends js.Object { 166 | def size(): js.Tuple2[Double, Double] = js.native 167 | 168 | def size(size: js.Tuple2[Double, Double]): Force[Node,L] = js.native 169 | 170 | def linkDistance(): Double | js.Function2[L, Double, Double] = js.native 171 | 172 | def linkDistance(distance: Double): Force[Node,L] = js.native 173 | 174 | def linkDistance(distance: js.Function2[L, Double, Double]): Force[Node,L] = js.native 175 | 176 | def linkStrength(): Double | js.Function2[L, Double, Double] = js.native 177 | 178 | def linkStrength(strength: Double): Force[Node,L] = js.native 179 | 180 | def linkStrength(strength: js.Function2[L, Double, Double]): Force[Node,L] = js.native 181 | 182 | def friction(): Double = js.native 183 | 184 | def friction(friction: Double): Force[Node,L] = js.native 185 | 186 | def charge(): Double | js.Function2[Node, Double, Double] = js.native 187 | 188 | def charge(charge: Double): Force[Node,L] = js.native 189 | 190 | def charge(charge: js.Function2[Node, Double, Double]): Force[Node,L] = js.native 191 | 192 | def chargeDistance(): Double = js.native 193 | 194 | def chargeDistance(distance: Double): Force[Node,L] = js.native 195 | 196 | def theta(): Double = js.native 197 | 198 | def theta(theta: Double): Force[Node,L] = js.native 199 | 200 | def gravity(): Double = js.native 201 | 202 | def gravity(gravity: Double): Force[Node,L] = js.native 203 | 204 | def nodes(): js.Array[Node] = js.native 205 | 206 | def nodes(nodes: js.Array[Node]): Force[Node,L] = js.native 207 | 208 | def links(): js.Array[L] = js.native 209 | 210 | def links(links: js.Array[L] ): Force[Node,L] = js.native 211 | 212 | def start(): Force[Node,L] = js.native 213 | 214 | def alpha(): Double = js.native 215 | 216 | def alpha(value: Double): Force[Node,L] = js.native 217 | 218 | def resume(): Force[Node,L] = js.native 219 | 220 | def stop(): Force[Node,L] = js.native 221 | 222 | def on(`type`: String): js.Function1[org.scalajs.dom.Event, Unit] = js.native 223 | 224 | def on(`type`: String, listener: js.Function1[org.scalajs.dom.Event, Unit]): Force[Node,L] = js.native 225 | 226 | def drag(): behavior.Drag[Node] = js.native 227 | 228 | def drag(selection: Selection[Node]): Unit = js.native 229 | } 230 | 231 | } 232 | 233 | 234 | package hierarchyModule { 235 | 236 | @JSExportAll 237 | trait Node { 238 | var parent: js.UndefOr[Node] = js.undefined 239 | var children: js.UndefOr[js.Array[Node]] = js.undefined 240 | var value: js.UndefOr[Double] = js.undefined 241 | var depth: js.UndefOr[Int] = js.undefined 242 | } 243 | 244 | } 245 | 246 | 247 | 248 | @js.native 249 | trait BaseHierarchy[Node, T <: BaseHierarchy[Node,T]] extends js.Function1[Node,js.Array[Node]] { 250 | 251 | def links(nodes: js.Array[Node]): js.Array[Link[Node]] = js.native 252 | 253 | def children(): js.Function1[Node, js.Array[Node]] = js.native 254 | 255 | def children(accessor: js.Function1[Node, js.Array[Node]]): T = js.native 256 | 257 | def sort(): js.Function2[Node, Node, Double] = js.native 258 | 259 | def sort(comparator: js.Function2[Node, Node, Double]): T = js.native 260 | 261 | def value(): js.Function1[Node, Double] = js.native 262 | 263 | def value(accessor: js.Function1[Node, Double]): T = js.native 264 | 265 | def revalue(root: Node): js.Array[Node] = js.native 266 | } 267 | 268 | @js.native 269 | trait Hierarchy[Node] extends BaseHierarchy[Node,Hierarchy[Node]] { 270 | 271 | } 272 | 273 | 274 | package histogramModule { 275 | 276 | @js.native 277 | trait Bin[T] extends js.Array[T] { 278 | var x: Double = js.native 279 | var dx: Double = js.native 280 | var y: Double = js.native 281 | } 282 | 283 | } 284 | 285 | @js.native 286 | trait Histogram[T] extends js.Object { 287 | def apply(values: js.Array[T], index: Double = ???): js.Array[histogramModule.Bin[T]] = js.native 288 | 289 | def value(): js.Function2[T, Double, Double] = js.native 290 | 291 | def value(value: js.Function2[T, Double, Double]): Histogram[T] = js.native 292 | 293 | def range(): js.Function2[js.Array[T], Double, js.Tuple2[Double, Double]] = js.native 294 | 295 | def range(range: js.Function2[js.Array[T], Double, js.Tuple2[Double, Double]]): Histogram[T] = js.native 296 | 297 | def bins(): js.Function3[js.Tuple2[Double, Double], js.Array[T], Double, js.Array[Double]] = js.native 298 | 299 | def bins(count: Double): Histogram[T] = js.native 300 | 301 | def bins(thresholds: js.Array[Double]): Histogram[T] = js.native 302 | 303 | def bins(func: js.Function3[js.Tuple2[Double, Double], js.Array[T], Double, js.Array[Double]]): Histogram[T] = js.native 304 | 305 | def frequency(): Boolean = js.native 306 | 307 | def frequency(frequency: Boolean): Histogram[T] = js.native 308 | } 309 | 310 | package packModule { 311 | 312 | 313 | trait Node extends hierarchyModule.Node { 314 | var x: js.UndefOr[Double] = js.undefined 315 | var y: js.UndefOr[Double] = js.undefined 316 | var r: js.UndefOr[Double] = js.undefined 317 | } 318 | 319 | } 320 | 321 | @js.native 322 | trait Pack[Node] extends BaseHierarchy[Node,Hierarchy[Node]] { 323 | 324 | def nodes(root: Node): js.Array[Node] = js.native 325 | 326 | def children(children: js.Function2[Node, Double, js.Array[Node]]): Pack[Node] = js.native 327 | 328 | def size(): js.Tuple2[Double, Double] = js.native 329 | 330 | def size(size: js.Tuple2[Double, Double]): Pack[Node] = js.native 331 | 332 | def radius(): Double | js.Function1[Node, Double] = js.native 333 | 334 | def radius(radius: Double): Pack[Node] = js.native 335 | 336 | def radius(radius: js.Function1[Node, Double]): Pack[Node] = js.native 337 | 338 | def padding(): Double = js.native 339 | 340 | def padding(padding: Double): Pack[Node] = js.native 341 | } 342 | 343 | package partitionModule { 344 | 345 | 346 | 347 | @JSExportAll 348 | trait Node extends hierarchyModule.Node { 349 | var x: js.UndefOr[Double] = js.undefined 350 | var y: js.UndefOr[Double] = js.undefined 351 | var dx: js.UndefOr[Double] = js.undefined 352 | var dy: js.UndefOr[Double] = js.undefined 353 | } 354 | 355 | } 356 | 357 | @js.native 358 | trait Partition[Node] extends BaseHierarchy[Node,Partition[Node]] { 359 | def nodes(root: Node): js.Array[Node] = js.native 360 | def size(): js.Tuple2[Double, Double] = js.native 361 | def size(size: js.Tuple2[Double, Double]): Partition[Node] = js.native 362 | } 363 | 364 | package pieModule { 365 | 366 | @js.native 367 | trait Arc[T] extends js.Object { 368 | var value: Double = js.native 369 | var startAngle: Double = js.native 370 | var endAngle: Double = js.native 371 | var padAngle: Double = js.native 372 | var data: T = js.native 373 | } 374 | 375 | } 376 | 377 | 378 | @js.native 379 | trait Pie[T] extends js.Function1[js.Array[T],js.Array[pieModule.Arc[T]]] { 380 | 381 | def apply(values: js.Array[T], index:Double): js.Array[pieModule.Arc[T]] = js.native 382 | 383 | def value(): js.Function2[T, Double, Double] = js.native 384 | 385 | def value(accessor: js.Function2[T, Double, Double]): Pie[T] = js.native 386 | 387 | def sort(): js.Function2[T, T, Double] = js.native 388 | 389 | def sort(comparator: js.Function2[T, T, Double]): Pie[T] = js.native 390 | 391 | def startAngle(): Double | js.Function2[js.Array[T], Double, Double] = js.native 392 | 393 | def startAngle(angle: Double): Pie[T] = js.native 394 | 395 | def startAngle(angle: js.Function2[js.Array[T], Double, Double]): Pie[T] = js.native 396 | 397 | def endAngle(): Double | js.Function2[js.Array[T], Double, Double] = js.native 398 | 399 | def endAngle(angle: Double): Pie[T] = js.native 400 | 401 | def endAngle(angle: js.Function2[js.Array[T], Double, Double]): Pie[T] = js.native 402 | 403 | def padAngle(): Double | js.Function2[js.Array[T], Double, Double] = js.native 404 | 405 | def padAngle(angle: Double): Pie[T] = js.native 406 | 407 | def padAngle(angle: js.Function2[js.Array[T], Double, Double]): Pie[T] = js.native 408 | } 409 | 410 | package stackModule { 411 | 412 | @JSExportAll 413 | trait Value { 414 | var x: js.UndefOr[Double] = js.undefined 415 | var y: js.UndefOr[Double] = js.undefined 416 | var y0: js.UndefOr[Double] = js.undefined 417 | } 418 | 419 | } 420 | 421 | @js.native 422 | trait Stack[Series, Value] extends js.Function1[js.Array[Series],js.Array[Series]] { 423 | def apply(layers: js.Array[Series], index: Double): js.Array[Series] = js.native 424 | 425 | def values(): js.Function2[Series, Double, js.Array[Value]] = js.native 426 | 427 | def values(accessor: js.Function2[Series, Double, js.Array[Value]]): Stack[Series, Value] = js.native 428 | 429 | def offset(): js.Function1[js.Array[js.Tuple2[Double, Double]], js.Array[Double]] = js.native 430 | 431 | def offset(offset: String): Stack[Series, Value] = js.native 432 | 433 | def offset(offset: js.Function1[js.Array[js.Tuple2[Double, Double]], js.Array[Double]]): Stack[Series, Value] = js.native 434 | 435 | def order(): js.Function1[js.Array[js.Tuple2[Double, Double]], js.Array[Double]] = js.native 436 | 437 | def order(order: String): Stack[Series, Value] = js.native 438 | 439 | def order(order: js.Function1[js.Array[js.Tuple2[Double, Double]], js.Array[Double]]): Stack[Series, Value] = js.native 440 | 441 | def x(): js.Function2[Value, Double, Double] = js.native 442 | 443 | def x(accessor: js.Function2[Value, Double, Double]): Stack[Series, Value] = js.native 444 | 445 | def y(): js.Function2[Value, Double, Double] = js.native 446 | 447 | def y(accessor: js.Function2[Value, Double, Double]): Stack[Series, Value] = js.native 448 | 449 | def out(): js.Function3[Value, Double, Double, Unit] = js.native 450 | 451 | def out(setter: js.Function3[Value, Double, Double, Unit]): Stack[Series, Value] = js.native 452 | } 453 | package treeModule { 454 | 455 | 456 | @JSExportAll 457 | trait Node extends hierarchyModule.Node { 458 | var x: js.UndefOr[Double] = js.undefined 459 | var y: js.UndefOr[Double] = js.undefined 460 | } 461 | 462 | 463 | 464 | } 465 | 466 | @js.native 467 | trait Tree[Node] extends BaseHierarchy[Node,Tree[Node]] { 468 | 469 | def nodes(root: Node, index: Double = ???): js.Array[Node] = js.native 470 | 471 | def separation(): js.Function2[Node, Node, Double] = js.native 472 | 473 | def separation(separation: js.Function2[Node, Node, Double]): Tree[Node] = js.native 474 | 475 | def size(): js.Tuple2[Double, Double] = js.native 476 | 477 | def size(size: js.Tuple2[Double, Double]): Tree[Node] = js.native 478 | 479 | def nodeSize(): js.Tuple2[Double, Double] = js.native 480 | 481 | def nodeSize(size: js.Tuple2[Double, Double]): Tree[Node] = js.native 482 | 483 | } 484 | 485 | @JSName("d3.layout.treemap") 486 | @js.native 487 | object treemapObject extends js.Object { 488 | type Padding = Double | js.Tuple4[Double, Double, Double, Double] 489 | } 490 | package treemapModule { 491 | 492 | @JSExportAll 493 | trait Node extends treeModule.Node { 494 | var dx: js.UndefOr[Double] = js.undefined 495 | var dy: js.UndefOr[Double] = js.undefined 496 | } 497 | 498 | 499 | } 500 | 501 | 502 | @js.native 503 | trait Treemap[Node] extends BaseHierarchy[Node,Treemap[Node]] { 504 | 505 | def nodes(root: Node, index: Double = ???): js.Array[Node] = js.native 506 | 507 | def size(): js.Tuple2[Double, Double] = js.native 508 | 509 | def size(size: js.Tuple2[Double, Double]): Treemap[Node] = js.native 510 | 511 | def padding(): js.Function2[Node, Double, treemapObject.Padding] = js.native 512 | 513 | def padding(padding: treemapObject.Padding): Treemap[Node] = js.native 514 | 515 | def padding(padding: js.Function2[Node, Double, treemapObject.Padding]): Treemap[Node] = js.native 516 | 517 | def round(): Boolean = js.native 518 | 519 | def round(round: Boolean): Treemap[Node] = js.native 520 | 521 | def sticky(): Boolean = js.native 522 | 523 | def sticky(sticky: Boolean): Boolean = js.native 524 | 525 | def mode(): String = js.native 526 | 527 | def mode(mode: String): Treemap[Node] = js.native 528 | 529 | def ratio(): Double = js.native 530 | 531 | def ratio(ratio: Double): Treemap[Node] = js.native 532 | } 533 | 534 | 535 | 536 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/misc.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.scalajs.dom 4 | import d3.Primitive 5 | 6 | import scala.scalajs.js 7 | import scala.scalajs.js.`|` 8 | import scala.scalajs.js.annotation.{JSBracketAccess, JSName} 9 | 10 | 11 | @js.native 12 | trait Numeric extends js.Object { 13 | override def valueOf(): Double = js.native 14 | } 15 | 16 | 17 | @JSName("d3.transition") 18 | @js.native 19 | trait TransitionObject extends js.Object { 20 | var prototype: Transition[js.Any] = js.native 21 | } 22 | 23 | 24 | @js.native 25 | trait BaseScale[Datum,Range, T <: BaseScale[Datum,Range,T]] extends js.Function1[Double,Double] { 26 | def domain(): js.Array[Datum] = js.native 27 | 28 | def domain(values: js.Array[Datum]): T = js.native 29 | 30 | def invert(y: Double): Datum = js.native 31 | 32 | def range(values: js.Array[Range]): T = js.native 33 | 34 | def range(): js.Array[Range] = js.native 35 | } 36 | 37 | @js.native 38 | trait BaseDom[Datum,T <: BaseDom[Datum,T]] extends js.Object { 39 | // self: T => 40 | 41 | type DatumFunction[M]=js.Function3[Datum, Int, js.UndefOr[Int], M] 42 | type SelfOrDatumFunction[M]=M | js.Function3[Datum, Int, Int, M] 43 | 44 | def attr(name: String, value: Primitive): T = js.native 45 | def attr(name: String, value: DatumFunction[Primitive]): T = js.native 46 | def attr(obj: js.Dictionary[SelfOrDatumFunction[Primitive]]): T = js.native 47 | 48 | def style(name: String, value: Primitive): T = js.native 49 | def style(name: String, value: Primitive,priority: String): T = js.native 50 | def style(name: String, value: DatumFunction[Primitive], priority: String = ???): T = js.native 51 | 52 | def text(value: Primitive): T = js.native 53 | def text(value: DatumFunction[Primitive]): T = js.native 54 | 55 | def filter(selector: String): T = js.native 56 | 57 | def remove(): T = js.native 58 | 59 | def empty(): Boolean = js.native 60 | 61 | def call(func: js.Function, args: js.Any*): T = js.native 62 | 63 | def node(): dom.EventTarget = js.native 64 | 65 | def size(): Double = js.native 66 | } 67 | 68 | 69 | 70 | @js.native 71 | trait Transition[Datum] extends BaseDom[Datum,Transition[Datum]] { 72 | 73 | def transition(): Transition[Datum] = js.native 74 | 75 | def delay(): Double = js.native 76 | 77 | def delay(delay: Double): Transition[Datum] = js.native 78 | 79 | def delay(delay: DatumFunction[Double]): Transition[Datum] = js.native 80 | 81 | def duration(): Double = js.native 82 | 83 | def duration(duration: Double): Transition[Datum] = js.native 84 | 85 | def duration(duration: DatumFunction[Double]): Transition[Datum] = js.native 86 | 87 | def ease(): js.Function1[Double, Double] = js.native 88 | 89 | def ease(value: String, args: js.Any*): Transition[Datum] = js.native 90 | 91 | def ease(value: js.Function1[Double, Double]): Transition[Datum] = js.native 92 | 93 | def attrTween(name: String, tween: js.Function3[Datum, Double, String, js.Function1[Double, Primitive]]): Transition[Datum] = js.native 94 | 95 | def styleTween(name: String, tween: js.Function3[Datum, Double, String, js.Function1[Double, Primitive]], priority: String = ???): Transition[Datum] = js.native 96 | 97 | def tween(name: String, factory: js.Function0[js.Function1[Double, Any]]): Transition[Datum] = js.native 98 | 99 | def select(selector: String): Transition[Datum] = js.native 100 | 101 | def select(selector: js.Function2[Datum, Double, dom.EventTarget]): Transition[Datum] = js.native 102 | 103 | def selectAll(selector: String): Transition[js.Any] = js.native 104 | 105 | def selectAll(selector: js.Function2[Datum, Double, js.Array[dom.EventTarget]]): Transition[js.Any] = js.native 106 | 107 | def filter(selector: js.Function2[Datum, Double, Boolean]): Transition[Datum] = js.native 108 | 109 | def each(`type`: String, listener: js.Function2[Datum, Double, Any]): Transition[Datum] = js.native 110 | 111 | def each(listener: js.Function2[Datum, Double, Any]): Transition[Datum] = js.native 112 | 113 | } 114 | 115 | @JSName("d3.timer") 116 | @js.native 117 | trait TimerObject extends js.Object { 118 | def flush(): Unit = js.native 119 | } 120 | 121 | @js.native 122 | trait BaseEvent extends js.Object { 123 | var `type`: String = js.native 124 | var sourceEvent: dom.Event = js.native 125 | } 126 | 127 | @js.native 128 | trait ZoomEvent extends BaseEvent { 129 | var scale: Double = js.native 130 | var translate: js.Tuple2[Double, Double] = js.native 131 | } 132 | 133 | @js.native 134 | trait DragEvent extends BaseEvent { 135 | var x: Double = js.native 136 | var y: Double = js.native 137 | var dx: Double = js.native 138 | var dy: Double = js.native 139 | } 140 | 141 | @js.native 142 | trait Map[T] extends js.Object { 143 | def has(key: String): Boolean = js.native 144 | 145 | def get(key: String): T = js.native 146 | 147 | def set(key: String, value: T): T = js.native 148 | 149 | def remove(key: String): Boolean = js.native 150 | 151 | def keys(): js.Array[String] = js.native 152 | 153 | def values(): js.Array[T] = js.native 154 | 155 | def entries(): js.Array[js.Any] = js.native 156 | 157 | def forEach(func: js.Function2[String, T, Any]): Unit = js.native 158 | 159 | def empty(): Boolean = js.native 160 | 161 | def size(): Double = js.native 162 | } 163 | 164 | @js.native 165 | trait Set extends js.Object { 166 | def has(value: String): Boolean = js.native 167 | 168 | def add(value: String): String = js.native 169 | 170 | def remove(value: String): Boolean = js.native 171 | 172 | def values(): js.Array[String] = js.native 173 | 174 | def forEach(func: js.Function1[String, Any]): Unit = js.native 175 | 176 | def empty(): Boolean = js.native 177 | 178 | def size(): Double = js.native 179 | } 180 | 181 | @js.native 182 | trait Nest[T] extends js.Object { 183 | def key(func: js.Function1[T, String]): Nest[T] = js.native 184 | 185 | def sortKeys(comparator: js.Function2[String, String, Double]): Nest[T] = js.native 186 | 187 | def sortValues(comparator: js.Function2[T, T, Double]): Nest[T] = js.native 188 | 189 | def rollup[U](func: js.Function1[js.Array[T], U]): Nest[T] = js.native 190 | 191 | def map(array: js.Array[T]): js.Dictionary[js.Any] = js.native 192 | 193 | //TODO:Fix map def map(array: js.Array[T], mapType: d3.map.type): Map[js.Any] = js.native 194 | def entries(array: js.Array[T]): js.Array[js.Any] = js.native 195 | } 196 | 197 | @JSName("d3.random") 198 | @js.native 199 | trait RandomObject extends js.Object { 200 | def normal(mean: Double = ???, deviation: Double = ???): js.Function0[Double] = js.native 201 | 202 | def logNormal(mean: Double = ???, deviation: Double = ???): js.Function0[Double] = js.native 203 | 204 | def bates(count: Double): js.Function0[Double] = js.native 205 | 206 | def irwinHall(count: Double): js.Function0[Double] = js.native 207 | } 208 | 209 | @js.native 210 | trait Transform extends js.Object { 211 | var rotate: Double = js.native 212 | var translate: js.Tuple2[Double, Double] = js.native 213 | var skew: Double = js.native 214 | var scale: js.Tuple2[Double, Double] = js.native 215 | 216 | override def toString(): String = js.native 217 | } 218 | 219 | @js.native 220 | trait FormatPrefix extends js.Object { 221 | var symbol: String = js.native 222 | 223 | def scale(n: Double): Double = js.native 224 | } 225 | 226 | @js.native 227 | @JSName("d3.rgb") 228 | trait RgbObject extends js.Object { 229 | /* ??? ConstructorMember(FunSignature(List(),List(FunParam(Ident(r),false,Some(TypeRef(CoreType(number),List()))), FunParam(Ident(g),false,Some(TypeRef(CoreType(number),List()))), FunParam(Ident(b),false,Some(TypeRef(CoreType(number),List())))),Some(TypeRef(TypeName(Rgb),List())))) */ 230 | /* ??? ConstructorMember(FunSignature(List(),List(FunParam(Ident(color),false,Some(TypeRef(CoreType(string),List())))),Some(TypeRef(TypeName(Rgb),List())))) */ 231 | def apply(r: Double, g: Double, b: Double): Rgb = js.native 232 | 233 | def apply(color: String): Rgb = js.native 234 | } 235 | 236 | @js.native 237 | trait Rgb extends Color { 238 | var r: Double = js.native 239 | var g: Double = js.native 240 | var b: Double = js.native 241 | 242 | def brighter(k: Double = ???): Rgb = js.native 243 | 244 | def darker(k: Double = ???): Rgb = js.native 245 | 246 | def hsl(): Hsl = js.native 247 | 248 | override def toString(): String = js.native 249 | } 250 | 251 | @js.native 252 | @JSName("d3.hsl") 253 | trait HslObject extends js.Object { 254 | /* ??? ConstructorMember(FunSignature(List(),List(FunParam(Ident(h),false,Some(TypeRef(CoreType(number),List()))), FunParam(Ident(s),false,Some(TypeRef(CoreType(number),List()))), FunParam(Ident(l),false,Some(TypeRef(CoreType(number),List())))),Some(TypeRef(TypeName(Hsl),List())))) */ 255 | /* ??? ConstructorMember(FunSignature(List(),List(FunParam(Ident(color),false,Some(TypeRef(CoreType(string),List())))),Some(TypeRef(TypeName(Hsl),List())))) */ 256 | def apply(h: Double, s: Double, l: Double): Hsl = js.native 257 | 258 | def apply(color: String): Hsl = js.native 259 | } 260 | 261 | @js.native 262 | trait Hsl extends Color { 263 | var h: Double = js.native 264 | var s: Double = js.native 265 | var l: Double = js.native 266 | 267 | def brighter(k: Double = ???): Hsl = js.native 268 | 269 | def darker(k: Double = ???): Hsl = js.native 270 | 271 | override def rgb(): Rgb = js.native 272 | 273 | override def toString(): String = js.native 274 | } 275 | 276 | @js.native 277 | @JSName("d3.hcl") 278 | trait HclObject extends js.Object { 279 | /* ??? ConstructorMember(FunSignature(List(),List(FunParam(Ident(h),false,Some(TypeRef(CoreType(number),List()))), FunParam(Ident(c),false,Some(TypeRef(CoreType(number),List()))), FunParam(Ident(l),false,Some(TypeRef(CoreType(number),List())))),Some(TypeRef(TypeName(Hcl),List())))) */ 280 | /* ??? ConstructorMember(FunSignature(List(),List(FunParam(Ident(color),false,Some(TypeRef(CoreType(string),List())))),Some(TypeRef(TypeName(Hcl),List())))) */ 281 | def apply(h: Double, c: Double, l: Double): Hcl = js.native 282 | 283 | def apply(color: String): Hcl = js.native 284 | } 285 | 286 | @js.native 287 | trait Hcl extends Color { 288 | var h: Double = js.native 289 | var c: Double = js.native 290 | var l: Double = js.native 291 | 292 | def brighter(k: Double = ???): Hcl = js.native 293 | 294 | def darker(k: Double = ???): Hcl = js.native 295 | } 296 | 297 | @js.native 298 | @JSName("d3.lab") 299 | trait LabObject extends js.Object { 300 | /* ??? ConstructorMember(FunSignature(List(),List(FunParam(Ident(l),false,Some(TypeRef(CoreType(number),List()))), FunParam(Ident(a),false,Some(TypeRef(CoreType(number),List()))), FunParam(Ident(b),false,Some(TypeRef(CoreType(number),List())))),Some(TypeRef(TypeName(Lab),List())))) */ 301 | /* ??? ConstructorMember(FunSignature(List(),List(FunParam(Ident(color),false,Some(TypeRef(CoreType(string),List())))),Some(TypeRef(TypeName(Lab),List())))) */ 302 | def apply(l: Double, a: Double, b: Double): Lab = js.native 303 | 304 | def apply(color: String): Lab = js.native 305 | } 306 | 307 | @js.native 308 | trait Lab extends Color { 309 | var l: Double = js.native 310 | var a: Double = js.native 311 | var b: Double = js.native 312 | 313 | def brighter(k: Double = ???): Lab = js.native 314 | 315 | def darker(k: Double = ???): Lab = js.native 316 | 317 | override def rgb(): Rgb = js.native 318 | 319 | override def toString(): String = js.native 320 | } 321 | 322 | @js.native 323 | @JSName("d3.color") 324 | trait ColorObject extends js.Object { 325 | def apply(): Color = js.native 326 | 327 | /* ??? ConstructorMember(FunSignature(List(),List(),Some(TypeRef(TypeName(Color),List())))) */ 328 | } 329 | 330 | @js.native 331 | trait Color extends js.Object { 332 | def rgb(): Rgb = js.native 333 | } 334 | 335 | 336 | @js.native 337 | trait Dispatch extends js.Object { 338 | def on(`type`: String): js.Function = js.native 339 | 340 | def on(`type`: String, listener: js.Function): Dispatch = js.native 341 | 342 | @JSBracketAccess 343 | def apply(event: String): js.Function = js.native 344 | 345 | @JSBracketAccess 346 | def update(event: String, v: js.Function): Unit = js.native 347 | } 348 | 349 | 350 | @js.native 351 | trait Xhr extends js.Object { 352 | def header(name: String): String = js.native 353 | 354 | def header(name: String, value: String): Xhr = js.native 355 | 356 | def mimeType(): String = js.native 357 | 358 | def mimeType(`type`: String): Xhr = js.native 359 | 360 | def responseType(): String = js.native 361 | 362 | def responseType(`type`: String): Xhr = js.native 363 | 364 | def response(): js.Function1[dom.XMLHttpRequest, Any] = js.native 365 | 366 | def response(value: js.Function1[dom.XMLHttpRequest, Any]): Xhr = js.native 367 | 368 | def get(callback: js.Function2[js.Any, js.Any, Unit] = ???): Xhr = js.native 369 | 370 | def post(data: js.Any = ???, callback: js.Function2[js.Any, js.Any, Unit] = ???): Xhr = js.native 371 | 372 | def post(callback: js.Function2[js.Any, js.Any, Unit]): Xhr = js.native 373 | 374 | def send(method: String, data: js.Any = ???, callback: js.Function2[js.Any, js.Any, Unit] = ???): Xhr = js.native 375 | 376 | def send(method: String, callback: js.Function2[js.Any, js.Any, Unit]): Xhr = js.native 377 | 378 | def abort(): Xhr = js.native 379 | 380 | def on(`type`: String): js.Function = js.native 381 | 382 | def on(`type`: String, listener: js.Function): Xhr = js.native 383 | } 384 | 385 | @js.native 386 | trait Dsv extends js.Object { 387 | def apply(url: String, callback: js.Function1[js.Array[js.Dictionary[String]], Unit]): DsvXhr[js.Dictionary[String]] = js.native 388 | 389 | def apply(url: String, callback: js.Function2[js.Any, js.Array[js.Dictionary[String]], Unit]): DsvXhr[js.Dictionary[String]] = js.native 390 | 391 | def apply(url: String): DsvXhr[js.Dictionary[String]] = js.native 392 | 393 | //TODO def apply[T](url: String, accessor: js.Function1[js.Dictionary[String], T], callback: js.Function1[js.Array[T], Unit]): DsvXhr[T] = js.native 394 | //TODO def apply[T](url: String, accessor: js.Function1[js.Dictionary[String], T], callback: js.Function2[js.Any, js.Array[T], Unit]): DsvXhr[T] = js.native 395 | //TODO def apply[T](url: String, accessor: js.Function1[js.Dictionary[String], T]): DsvXhr[T] = js.native 396 | def parse(string: String): js.Array[js.Dictionary[String]] = js.native 397 | 398 | def parse[T](string: String, accessor: js.Function2[js.Dictionary[String], Double, T]): js.Array[T] = js.native 399 | 400 | def parseRows(string: String): js.Array[js.Array[String]] = js.native 401 | 402 | def parseRows[T](string: String, accessor: js.Function2[js.Array[String], Double, T]): js.Array[T] = js.native 403 | 404 | def format(rows: js.Array[Object]): String = js.native 405 | 406 | def formatRows(rows: js.Array[js.Array[String]]): String = js.native 407 | } 408 | 409 | @js.native 410 | trait DsvXhr[T] extends Xhr { 411 | def row(): js.Function1[js.Dictionary[String], T] = js.native 412 | 413 | def row[U](accessor: js.Function1[js.Dictionary[String], U]): DsvXhr[U] = js.native 414 | 415 | override def header(name: String): String = js.native 416 | 417 | override def header(name: String, value: String): DsvXhr[T] = js.native 418 | 419 | override def mimeType(): String = js.native 420 | 421 | override def mimeType(`type`: String): DsvXhr[T] = js.native 422 | 423 | override def responseType(): String = js.native 424 | 425 | override def responseType(`type`: String): DsvXhr[T] = js.native 426 | 427 | override def response(): js.Function1[dom.XMLHttpRequest, Any] = js.native 428 | 429 | override def response(value: js.Function1[dom.XMLHttpRequest, Any]): DsvXhr[T] = js.native 430 | 431 | def get(callback: js.Function2[js.Any, T, Unit]): DsvXhr[T] = js.native 432 | 433 | def post(data: js.Any, callback: js.Function2[js.Any, T, Unit]): DsvXhr[T] = js.native 434 | 435 | def post(callback: js.Function2[js.Any, T, Unit]): DsvXhr[T] = js.native 436 | 437 | def send(method: String, data: js.Any, callback: js.Function2[js.Any, T, Unit]): DsvXhr[T] = js.native 438 | 439 | def send(method: String, callback: js.Function2[js.Any, T, Unit]): DsvXhr[T] = js.native 440 | 441 | override def abort(): DsvXhr[T] = js.native 442 | 443 | override def on(`type`: String): js.Function = js.native 444 | 445 | override def on(`type`: String, listener: js.Function): DsvXhr[T] = js.native 446 | } 447 | 448 | @js.native 449 | trait LocaleDefinition extends js.Object { 450 | var decimal: String = js.native 451 | var thousands: String = js.native 452 | var grouping: js.Array[Double] = js.native 453 | var currency: js.Tuple2[String, String] = js.native 454 | var dateTime: String = js.native 455 | var date: String = js.native 456 | var time: String = js.native 457 | var periods: js.Tuple2[String, String] = js.native 458 | var days: js.Tuple7[String, String, String, String, String, String, String] = js.native 459 | var shortDays: js.Tuple7[String, String, String, String, String, String, String] = js.native 460 | var months: js.Tuple12[String, String, String, String, String, String, String, String, String, String, String, String] = js.native 461 | var shortMonths: js.Tuple12[String, String, String, String, String, String, String, String, String, String, String, String] = js.native 462 | } 463 | 464 | @js.native 465 | trait Locale extends js.Object { 466 | def numberFormat(specifier: String): js.Function1[Double, String] = js.native 467 | 468 | var timeFormat: js.Any = js.native 469 | } 470 | 471 | 472 | 473 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/ns.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import scala.scalajs.js 4 | import scala.scalajs.js.`|` 5 | import scala.scalajs.js.annotation.{JSBracketAccess, JSName} 6 | 7 | @JSName("d3.ns") 8 | @js.native 9 | trait NsObject extends js.Object { 10 | 11 | import ns._ 12 | 13 | def qualify(name: String): Qualified | String = js.native 14 | 15 | def prefix: PrefixObject = js.native 16 | 17 | } 18 | package ns { 19 | 20 | @js.native 21 | trait Qualified extends js.Object { 22 | var space: String = js.native 23 | var local: String = js.native 24 | } 25 | 26 | @js.native 27 | @JSName("d3.ns.prefix") 28 | trait PrefixObject extends js.Object { 29 | @JSBracketAccess 30 | def apply(key: String): String = js.native 31 | 32 | @JSBracketAccess 33 | def update(key: String, v: String): Unit = js.native 34 | } 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/scale.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import scala.scalajs.js 4 | import scala.scalajs.js.annotation._ 5 | 6 | @JSName("d3.scale") 7 | @js.native 8 | trait ScaleObject extends js.Object { 9 | 10 | import scale._ 11 | 12 | def identity(): Identity = js.native 13 | 14 | def linear(): Linear[Double, Double] = js.native 15 | 16 | //TODO def linear[Output](): Linear[Output, Output] = js.native 17 | //TODO def linear[Range, Output](): Linear[Range, Output] = js.native 18 | def sqrt(): Pow[Double, Double] = js.native 19 | 20 | //TODO def sqrt[Output](): Pow[Output, Output] = js.native 21 | //TODO def sqrt[Range, Output](): Pow[Range, Output] = js.native 22 | def pow(): Pow[Double, Double] = js.native 23 | 24 | //TODO def pow[Output](): Pow[Output, Output] = js.native 25 | //TODO def pow[Range, Output](): Pow[Range, Output] = js.native 26 | def log(): Log[Double, Double] = js.native 27 | 28 | //TODO def log[Output](): Log[Output, Output] = js.native 29 | //TODO def log[Range, Output](): Log[Range, Output] = js.native 30 | def quantize[T](): Quantize[T] = js.native 31 | 32 | def quantile[T](): Quantile[T] = js.native 33 | 34 | def threshold[Range](): Threshold[Double, Range] = js.native 35 | 36 | //TODO def threshold[Domain, Range](): Threshold[Domain, Range] = js.native 37 | def ordinal[Range](): Ordinal[String, Range] = js.native 38 | 39 | //TODO def ordinal[Domain, Range](): Ordinal[Domain, Range] = js.native 40 | def category10(): Ordinal[String, String] = js.native 41 | 42 | //TODO def category10[Domain](): Ordinal[Domain, String] = js.native 43 | def category20(): Ordinal[String, String] = js.native 44 | 45 | //TODO def category20[Domain](): Ordinal[Domain, String] = js.native 46 | def category20b(): Ordinal[String, String] = js.native 47 | 48 | //TODO def category20b[Domain](): Ordinal[Domain, String] = js.native 49 | def category20c(): Ordinal[String, String] = js.native 50 | 51 | //TODO def category20c[Domain](): Ordinal[Domain, String] = js.native 52 | } 53 | package scale { 54 | 55 | @js.native 56 | trait Identity extends BaseScale[Double,Double,Identity]{ 57 | 58 | def ticks(count: Double = ???): js.Array[Double] = js.native 59 | 60 | def tickFormat(count: Double = ???, format: String = ???): js.Function1[Double, String] = js.native 61 | 62 | def copy(): Identity = js.native 63 | } 64 | 65 | @js.native 66 | trait Linear[Range, Output] extends BaseScale[Double,Range,Linear[Range,Output]] { 67 | 68 | def rangeRound(values: js.Array[Double]): Linear[Double, Double] = js.native 69 | 70 | def interpolate(): js.Function2[Range, Range, js.Function1[Double, Output]] = js.native 71 | 72 | def interpolate(factory: js.Function2[Range, Range, js.Function1[Double, Output]]): Linear[Range, Output] = js.native 73 | 74 | def clamp(): Boolean = js.native 75 | 76 | def clamp(clamp: Boolean): Linear[Range, Output] = js.native 77 | 78 | def nice(count: Double = ???): Linear[Range, Output] = js.native 79 | 80 | def ticks(count: Double = ???): js.Array[Double] = js.native 81 | 82 | def tickFormat(count: Double = ???, format: String = ???): js.Function1[Double, String] = js.native 83 | 84 | def copy(): Linear[Range, Output] = js.native 85 | } 86 | 87 | @js.native 88 | trait Pow[Range, Output] extends BaseScale[Double,Range,Pow[Range,Output]] { 89 | 90 | def rangeRound(values: js.Array[Double]): Pow[Double, Double] = js.native 91 | 92 | def exponent(): Double = js.native 93 | 94 | def exponent(k: Double): Pow[Range, Output] = js.native 95 | 96 | def interpolate(): js.Function2[Range, Range, js.Function1[Double, Output]] = js.native 97 | 98 | def interpolate(factory: js.Function2[Range, Range, js.Function1[Double, Output]]): Pow[Range, Output] = js.native 99 | 100 | def clamp(): Boolean = js.native 101 | 102 | def clamp(clamp: Boolean): Pow[Range, Output] = js.native 103 | 104 | def nice(m: Double = ???): Pow[Range, Output] = js.native 105 | 106 | def ticks(count: Double = ???): js.Array[Double] = js.native 107 | 108 | def tickFormat(count: Double = ???, format: String = ???): js.Function1[Double, String] = js.native 109 | 110 | def copy(): Pow[Range, Output] = js.native 111 | } 112 | 113 | @js.native 114 | trait Log[Range, Output] extends BaseScale[Double,Range,Log[Range,Output]] { 115 | 116 | def rangeRound(values: js.Array[Double]): Log[Double, Double] = js.native 117 | 118 | def base(): Double = js.native 119 | 120 | def base(base: Double): Log[Range, Output] = js.native 121 | 122 | def interpolate(): js.Function2[Range, Range, js.Function1[Double, Output]] = js.native 123 | 124 | def interpolate(factory: js.Function2[Range, Range, js.Function1[Double, Output]]): Log[Range, Output] = js.native 125 | 126 | def clamp(): Boolean = js.native 127 | 128 | def clamp(clamp: Boolean): Log[Range, Output] = js.native 129 | 130 | def nice(): Log[Range, Output] = js.native 131 | 132 | def ticks(): js.Array[Double] = js.native 133 | 134 | def tickFormat(count: Double = ???, format: String = ???): js.Function1[Double, String] = js.native 135 | 136 | def copy(): Log[Range, Output] = js.native 137 | } 138 | 139 | @js.native 140 | trait Quantize[T] extends js.Function1[Double,T] { 141 | 142 | def invertExtent(y: T): js.Tuple2[Double, Double] = js.native 143 | 144 | def domain(): js.Array[Double] = js.native 145 | 146 | def domain(numbers: js.Array[Double]): Quantize[T] = js.native 147 | 148 | def range(): js.Array[T] = js.native 149 | 150 | def range(values: js.Array[T]): Quantize[T] = js.native 151 | 152 | def copy(): Quantize[T] = js.native 153 | } 154 | 155 | @js.native 156 | trait Quantile[T] extends js.Function1[Double,T] { 157 | 158 | def invertExtent(y: T): js.Tuple2[Double, Double] = js.native 159 | 160 | def domain(): js.Array[Double] = js.native 161 | 162 | def domain(numbers: js.Array[Double]): Quantile[T] = js.native 163 | 164 | def range(): js.Array[T] = js.native 165 | 166 | def range(values: js.Array[T]): Quantile[T] = js.native 167 | 168 | def quantiles(): js.Array[Double] = js.native 169 | 170 | def copy(): Quantile[T] = js.native 171 | } 172 | 173 | @js.native 174 | trait Threshold[Domain, Range] extends js.Function1[Double, Range] { 175 | 176 | def invertExtent(y: Range): js.Tuple2[Domain, Domain] = js.native 177 | 178 | def domain(): js.Array[Domain] = js.native 179 | 180 | def domain(domain: js.Array[Domain]): Threshold[Domain, Range] = js.native 181 | 182 | def range(): js.Array[Range] = js.native 183 | 184 | def range(values: js.Array[Range]): Threshold[Domain, Range] = js.native 185 | 186 | def copy(): Threshold[Domain, Range] = js.native 187 | } 188 | 189 | @js.native 190 | trait Ordinal[Domain, Range] extends js.Function1[Domain,Range] { 191 | 192 | def domain(): js.Array[Domain] = js.native 193 | 194 | def domain(values: js.Array[Domain]): Ordinal[Domain, Range] = js.native 195 | 196 | def range(): js.Array[Range] = js.native 197 | 198 | def range(values: js.Array[Range]): Ordinal[Domain, Range] = js.native 199 | 200 | def rangePoints(interval: js.Tuple2[Double, Double], padding: Double = ???): Ordinal[Domain, Double] = js.native 201 | 202 | def rangeRoundPoints(interval: js.Tuple2[Double, Double], padding: Double = ???): Ordinal[Domain, Double] = js.native 203 | 204 | def rangeBands(interval: js.Tuple2[Double, Double], padding: Double = ???, outerPadding: Double = ???): Ordinal[Domain, Double] = js.native 205 | 206 | def rangeRoundBands(interval: js.Tuple2[Double, Double], padding: Double = ???, outerPadding: Double = ???): Ordinal[Domain, Double] = js.native 207 | 208 | def rangeBand(): Double = js.native 209 | 210 | def rangeExtent(): js.Tuple2[Double, Double] = js.native 211 | 212 | def copy(): Ordinal[Domain, Range] = js.native 213 | } 214 | 215 | } 216 | 217 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/selection.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.scalajs.dom 4 | import d3.Primitive 5 | 6 | import scala.scalajs.js 7 | import scala.scalajs.js.`|` 8 | import scala.scalajs.js.annotation.{JSBracketAccess, JSName} 9 | 10 | @JSName("d3.selection") 11 | @js.native 12 | trait SelectionObject extends js.Object { 13 | var prototype: Selection[js.Any] = js.native 14 | } 15 | 16 | package selection { 17 | 18 | import scala.scalajs.js 19 | 20 | 21 | @js.native 22 | trait Group extends js.Array[dom.EventTarget] { 23 | var parentNode: dom.EventTarget = js.native 24 | } 25 | 26 | 27 | 28 | @js.native 29 | trait BaseSelection[Datum, T <: BaseSelection[Datum,T]] extends BaseDom[Datum,T] { 30 | 31 | var length: Double = js.native 32 | 33 | @JSBracketAccess 34 | def apply(index: Double): Group = js.native 35 | 36 | @JSBracketAccess 37 | def update(index: Double, v: Group): Unit = js.native 38 | 39 | def attr(name: String): String = js.native 40 | 41 | def classed(name: String): Boolean = js.native 42 | def classed(name: String, value: Boolean): T = js.native 43 | def classed(name: String, value: DatumFunction[Boolean]): T = js.native 44 | def classed(obj: js.Dictionary[SelfOrDatumFunction[Boolean]]): T = js.native 45 | 46 | def style(name: String): String = js.native 47 | 48 | def style(obj: js.Dictionary[SelfOrDatumFunction[Primitive]], priority: String ): T = js.native 49 | 50 | def property(name: String): js.Dynamic = js.native 51 | def property(name: String, value: Any): T = js.native 52 | def property(name: String, value: DatumFunction[Any]): T = js.native 53 | def property(obj: js.Dictionary[SelfOrDatumFunction[Any]]): T = js.native 54 | 55 | def text(): String = js.native 56 | def text(value: String): T = js.native 57 | def text(value: DatumFunction[String]): T = js.native 58 | 59 | def html(): String = js.native 60 | def html(value: String): T = js.native 61 | def html(value: DatumFunction[String]): T = js.native 62 | 63 | def append(name: String): T = js.native 64 | def append(name: DatumFunction[dom.EventTarget]): T = js.native 65 | 66 | def insert(name: String, before: String): T = js.native 67 | def insert(name: String, before: DatumFunction[dom.EventTarget]): T = js.native 68 | def insert(name: DatumFunction[dom.EventTarget], before: String): T = js.native 69 | def insert(name: DatumFunction[dom.EventTarget], before: DatumFunction[dom.EventTarget]): T = js.native 70 | 71 | def data(): js.Array[Datum] = js.native 72 | def data[NewDatum](data: js.Array[NewDatum]): Update[NewDatum] = js.native 73 | def data[NewDatum](data: js.Array[NewDatum], key: js.ThisFunction2[dom.Node|js.Array[NewDatum],js.UndefOr[NewDatum], Int, String]): Update[NewDatum] = js.native 74 | def data[NewDatum <: Datum](data: js.Array[NewDatum], key: js.Function2[Datum, Int, String]): Update[NewDatum] = js.native 75 | def data[NewDatum](data: DatumFunction[js.Array[NewDatum]]): Update[NewDatum] = js.native 76 | def data[NewDatum](data: DatumFunction[js.Array[NewDatum]], key: js.ThisFunction2[dom.Node|js.Array[NewDatum],js.UndefOr[NewDatum], Int, String]): Update[NewDatum] = js.native 77 | 78 | 79 | def filter(selector: DatumFunction[Boolean]): T = js.native 80 | 81 | def datum(): Datum = js.native 82 | def datum[NewDatum](value: NewDatum): Update[NewDatum] = js.native 83 | def datum[NewDatum](value: js.Array[NewDatum]): Update[NewDatum] = js.native 84 | def datum[NewDatum](value: DatumFunction[NewDatum]): Update[NewDatum] = js.native 85 | 86 | def sort(comparator: js.Function2[Datum, Datum, Double] = ???): T = js.native 87 | 88 | def order(): T = js.native 89 | 90 | def on(`type`: String): DatumFunction[Unit] = js.native 91 | def on(`type`: String, listener: DatumFunction[Unit], capture: Boolean = false): T = js.native 92 | 93 | def transition(name: String = ???): Transition[Datum] = js.native 94 | 95 | def interrupt(name: String = ???): T = js.native 96 | 97 | def select(selector: String): T = js.native 98 | def select(selector: DatumFunction[dom.EventTarget]): T = js.native 99 | 100 | def each(func: js.ThisFunction2[T,Datum,Int, Unit]): T = js.native 101 | 102 | } 103 | 104 | @js.native 105 | trait Update[Datum] extends BaseSelection[Datum,Update[Datum]] { 106 | 107 | def selectAll[SelData](selector: String): Update[SelData] = js.native 108 | 109 | def selectAll[SelData](selector: js.Function3[Datum, Double, Double, js.Array[dom.EventTarget] | dom.NodeList]): Update[SelData] = js.native 110 | 111 | def enter(): Enter[Datum] = js.native 112 | 113 | def exit(): Selection[Datum] = js.native 114 | } 115 | 116 | @js.native 117 | trait Enter[Datum] extends js.Object { 118 | def append(name: String): Selection[Datum] = js.native 119 | 120 | def append(name: js.Function3[Datum, Double, Double, dom.EventTarget]): Selection[Datum] = js.native 121 | 122 | def insert(name: String, before: String): Selection[Datum] = js.native 123 | 124 | def insert(name: String, before: js.Function3[Datum, Double, Double, dom.EventTarget]): Selection[Datum] = js.native 125 | 126 | def insert(name: js.Function3[Datum, Double, Double, dom.EventTarget], before: String): Selection[Datum] = js.native 127 | 128 | def insert(name: js.Function3[Datum, Double, Double, dom.EventTarget], before: js.Function3[Datum, Double, Double, dom.EventTarget]): Selection[Datum] = js.native 129 | 130 | def select(name: js.Function3[Datum, Double, Double, dom.EventTarget]): Selection[Datum] = js.native 131 | 132 | def call(func: js.Function, args: js.Any*): Enter[Datum] = js.native 133 | } 134 | 135 | 136 | } 137 | 138 | @js.native 139 | trait Selection[Datum] extends selection.BaseSelection[Datum,Selection[Datum]] { 140 | 141 | //def selectAll(selector: String): Selection[js.Any] = js.native 142 | def selectAll[SelData](selector: String): Selection[SelData] = js.native 143 | 144 | //def selectAll(selector: js.Function3[Datum, Double, Double, js.Array[dom.EventTarget] | dom.NodeList]): Selection[js.Any] = js.native 145 | def selectAll[SelData](selector: DatumFunction[js.Array[dom.EventTarget] | dom.NodeList]): Selection[SelData] = js.native 146 | } 147 | 148 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/svg.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | import scala.scalajs.js 3 | import scala.scalajs.js.`|` 4 | import scala.scalajs.js.annotation.JSName 5 | 6 | @JSName("d3.svg") 7 | @js.native 8 | trait SvgObject extends js.Object { 9 | 10 | import svg._ 11 | 12 | val line: Line[Any] = js.native 13 | 14 | val area: Area[Any] = js.native 15 | 16 | def arc[T](): Arc[T] = js.native 17 | 18 | def symbol[T](): Symbol[T] = js.native 19 | 20 | var symbolTypes: js.Array[String] = js.native 21 | 22 | def chord(): Chord[chordModule.Link[chordModule.Node], chordModule.Node] = js.native 23 | 24 | //TODO def chord[Node](): Chord[chordModule.Link[Node], Node] = js.native 25 | 26 | //TODO def chord[Link, Node](): Chord[Link, Node] = js.native 27 | 28 | def diagonal(): Diagonal[diagonalModule.Link[diagonalModule.Node], diagonalModule.Node] = js.native 29 | 30 | //TODO def diagonal[Node](): Diagonal[diagonalModule.Link[Node], Node] = js.native 31 | 32 | //TODO def diagonal[Link, Node](): Diagonal[Link, Node] = js.native 33 | 34 | def axis(): Axis = js.native 35 | 36 | def brush(): Brush[js.Any] = js.native 37 | 38 | //TODO def brush[T](): Brush[T] = js.native 39 | 40 | } 41 | package svg { 42 | 43 | @js.native 44 | trait Line[T] extends js.Function1[T,String] { 45 | 46 | def apply[T]():Line[T] = js.native 47 | 48 | def x(): Double | js.Function2[T, Int, Double] = js.native 49 | 50 | def x(x: Double): Line[T] = js.native 51 | 52 | def x(x: js.Function2[T, Int, Double]): Line[T] = js.native 53 | 54 | def y(): Double | js.Function2[T, Int, Double] = js.native 55 | 56 | def y(x: Double): Line[T] = js.native 57 | 58 | def y(y: js.Function2[T, Int, Double]): Line[T] = js.native 59 | 60 | def interpolate(): String | js.Function1[js.Array[js.Tuple2[Double, Double]], String] = js.native 61 | 62 | def interpolate(interpolate: String | js.Function1[js.Array[js.Tuple2[Double, Double]], String]): Line[T] = js.native 63 | 64 | def tension(): Double = js.native 65 | 66 | def tension(tension: Double): Line[T] = js.native 67 | 68 | def defined(): js.Function2[T, Double, Boolean] = js.native 69 | 70 | def defined(defined: js.Function2[T, Int, Boolean]): Line[T] = js.native 71 | 72 | def radial(): Line[T] = js.native 73 | 74 | def radius(): js.Function2[T, Double, Double] = js.native 75 | 76 | def radius(radius: Double): Line[T] = js.native 77 | 78 | def radius(radius: js.Function2[T, Double, Double]): Line[T] = js.native 79 | 80 | def angle(): js.Function2[T, Double, Double] = js.native 81 | 82 | def angle(angle: Double): Line[T] = js.native 83 | 84 | def angle(angle: js.Function2[T, Double, Double]): Line[T] = js.native 85 | 86 | } 87 | 88 | @js.native 89 | trait Diagonal[Link, Node] extends js.Function2[Link,Double,String] { 90 | 91 | def source(): js.Function2[Link, Double, Node] = js.native 92 | 93 | def source(source: Node): Diagonal[Link, Node] = js.native 94 | 95 | def source(source: js.Function2[Link, Double, Node]): Diagonal[Link, Node] = js.native 96 | 97 | def target(): js.Function2[Link, Double, Node] = js.native 98 | 99 | def target(target: Node): Diagonal[Link, Node] = js.native 100 | 101 | def target(target: js.Function2[Link, Double, Node]): Diagonal[Link, Node] = js.native 102 | 103 | def projection(): js.Function2[Node, Double, js.Tuple2[Double, Double]] = js.native 104 | 105 | def projection(projection: js.Function2[Node, Double, js.Tuple2[Double, Double]]): Diagonal[Link, Node] = js.native 106 | } 107 | 108 | @js.native 109 | trait Axis extends js.Function1[Selection[js.Any] | Transition[js.Any],Unit] { 110 | def apply(selection: Selection[js.Any]): Unit = js.native 111 | 112 | def apply(selection: Transition[js.Any]): Unit = js.native 113 | 114 | def scale(): js.Dynamic = js.native 115 | 116 | def scale(scale: js.Any): Axis = js.native 117 | 118 | def orient(): String = js.native 119 | 120 | def orient(orientation: String): Axis = js.native 121 | 122 | def ticks(): js.Array[js.Any] = js.native 123 | 124 | def ticks(args: js.Any*): Axis = js.native 125 | 126 | def tickValues(): js.Array[js.Any] = js.native 127 | 128 | def tickValues(values: js.Array[js.Any]): Axis = js.native 129 | 130 | def tickSize(): Double = js.native 131 | 132 | def tickSize(size: Double): Axis = js.native 133 | 134 | def tickSize(inner: Double, outer: Double): Axis = js.native 135 | 136 | def innerTickSize(): Double = js.native 137 | 138 | def innerTickSize(size: Double): Axis = js.native 139 | 140 | def outerTickSize(): Double = js.native 141 | 142 | def outerTickSize(size: Double): Axis = js.native 143 | 144 | def tickPadding(): Double = js.native 145 | 146 | def tickPadding(padding: Double): Axis = js.native 147 | 148 | def tickFormat(): js.Function1[js.Any, String] = js.native 149 | 150 | def tickFormat(format: js.Function1[js.Any, String]): Axis = js.native 151 | 152 | def tickFormat(format: String): Axis = js.native 153 | } 154 | 155 | 156 | @js.native 157 | trait Brush[T] extends js.Function1[Selection[T] | Transition[T], Unit] { 158 | 159 | def event(selection: Selection[T]): Unit = js.native 160 | 161 | def event(selection: Transition[T]): Unit = js.native 162 | 163 | def x(): brushModule.Scale = js.native 164 | 165 | def x[S<:BaseScale[_,_,S]](x:S): Brush[T] = js.native 166 | 167 | def y(): brushModule.Scale = js.native 168 | 169 | def y[S<:BaseScale[_,_,S]](x:S): Brush[T] = js.native 170 | 171 | def extent(): js.Tuple2[Double, Double] | js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]] = js.native 172 | 173 | def extent(extent: js.Tuple2[Double, Double] | js.Tuple2[js.Tuple2[Double, Double], js.Tuple2[Double, Double]]): Brush[T] = js.native 174 | 175 | def clamp(): Boolean | js.Tuple2[Boolean, Boolean] = js.native 176 | 177 | def clamp(clamp: Boolean | js.Tuple2[Boolean, Boolean]): Brush[T] = js.native 178 | 179 | def clear(): Unit = js.native 180 | 181 | def empty(): Boolean = js.native 182 | 183 | def on(`type`: String): js.Function2[T, Double, Unit] = js.native 184 | 185 | def on(`type`: String, listener: js.Function2[T, Double, Unit]): Brush[T] = js.native 186 | } 187 | 188 | 189 | @js.native 190 | trait Area[T] extends js.Function1[T,String] { 191 | 192 | def apply[T]():Area[T] = js.native 193 | 194 | def x(): Double | js.Function2[T, Int, Double] = js.native 195 | 196 | def x(x: Double): Area[T] = js.native 197 | 198 | def x(x: js.Function2[T, Int, Double]): Area[T] = js.native 199 | 200 | def x0(): Double | js.Function2[T, Int, Double] = js.native 201 | 202 | def x0(x0: Double): Area[T] = js.native 203 | 204 | def x0(x0: js.Function2[T, Int, Double]): Area[T] = js.native 205 | 206 | def x1(): Double | js.Function2[T, Int, Double] = js.native 207 | 208 | def x1(x1: Double): Area[T] = js.native 209 | 210 | def x1(x1: js.Function2[T, Int, Double]): Area[T] = js.native 211 | 212 | def y(): Double | js.Function2[T, Int, Double] = js.native 213 | 214 | def y(y: Double): Area[T] = js.native 215 | 216 | def y(y: js.Function2[T, Int, Double]): Area[T] = js.native 217 | 218 | def y0(): Double | js.Function2[T, Int, Double] = js.native 219 | 220 | def y0(y0: Double): Area[T] = js.native 221 | 222 | def y0(y0: js.Function2[T, Int, Double]): Area[T] = js.native 223 | 224 | def y1(): Double | js.Function2[T, Int, Double] = js.native 225 | 226 | def y1(y1: Double): Area[T] = js.native 227 | 228 | def y1(y1: js.Function2[T, Int, Double]): Area[T] = js.native 229 | 230 | def radial(): Line[T] = js.native 231 | 232 | def interpolate(): String | js.Function1[js.Array[js.Tuple2[Double, Double]], String] = js.native 233 | 234 | def interpolate(interpolate: String | js.Function1[js.Array[js.Tuple2[Double, Double]], String]): Area[T] = js.native 235 | 236 | def tension(): Double = js.native 237 | 238 | def tension(tension: Double): Area[T] = js.native 239 | 240 | def defined(): js.Function2[T, Int, Boolean] = js.native 241 | 242 | def defined(defined: js.Function2[T, Int, Boolean]): Area[T] = js.native 243 | } 244 | 245 | @js.native 246 | trait Arc[T] extends js.Object { 247 | def apply(d: T, i: Int = ???): String = js.native 248 | 249 | def innerRadius(): js.Function2[T, Int, Double] = js.native 250 | 251 | def innerRadius(radius: Double): Arc[T] = js.native 252 | 253 | def innerRadius(radius: js.Function2[T, Int, Double]): Arc[T] = js.native 254 | 255 | def outerRadius(): js.Function2[T, Int, Double] = js.native 256 | 257 | def outerRadius(radius: Double): Arc[T] = js.native 258 | 259 | def outerRadius(radius: js.Function2[T, Int, Double]): Arc[T] = js.native 260 | 261 | def cornerRadius(): js.Function2[T, Int, Double] = js.native 262 | 263 | def cornerRadius(radius: Double): Arc[T] = js.native 264 | 265 | def cornerRadius(radius: js.Function2[T, Int, Double]): Arc[T] = js.native 266 | 267 | def padRadius(): String | js.Function2[T, Int, Double] = js.native 268 | 269 | def padRadius(radius: String): Arc[T] = js.native 270 | 271 | def padRadius(radius: js.Function2[T, Int, Double]): Arc[T] = js.native 272 | 273 | def startAngle(): js.Function2[T, Int, Double] = js.native 274 | 275 | def startAngle(angle: Double): Arc[T] = js.native 276 | 277 | def startAngle(angle: js.Function2[T, Int, Double]): Arc[T] = js.native 278 | 279 | def endAngle(): js.Function2[T, Int, Double] = js.native 280 | 281 | def endAngle(angle: Double): Arc[T] = js.native 282 | 283 | def endAngle(angle: js.Function2[T, Int, Double]): Arc[T] = js.native 284 | 285 | def padAngle(): js.Function2[T, Int, Double] = js.native 286 | 287 | def padAngle(angle: Double): Arc[T] = js.native 288 | 289 | def padAngle(angle: js.Function2[T, Int, Double]): Arc[T] = js.native 290 | 291 | def centroid(d: T, i: Double = ???): js.Tuple2[Double, Double] = js.native 292 | } 293 | 294 | @js.native 295 | trait Symbol[T] extends js.Object { 296 | def apply(d: T, i: Int = ???): String = js.native 297 | 298 | def `type`(): js.Function2[T, Int, String] = js.native 299 | 300 | def `type`(`type`: String): Symbol[T] = js.native 301 | 302 | def `type`(`type`: js.Function2[T, Int, String]): Symbol[T] = js.native 303 | 304 | def size(): js.Function2[T, String, Double] = js.native 305 | 306 | def size(size: Double): Symbol[T] = js.native 307 | 308 | def size(size: js.Function2[T, Double, Double]): Symbol[T] = js.native 309 | } 310 | 311 | @js.native 312 | trait Chord[Link, Node] extends js.Object { 313 | def apply(d: Link, i: Double): String = js.native 314 | 315 | def source(): js.Function2[Link, Double, Node] = js.native 316 | 317 | def source(source: Node): Chord[Link, Node] = js.native 318 | 319 | def source(source: js.Function2[Link, Double, Node]): Chord[Link, Node] = js.native 320 | 321 | def target(): js.Function2[Link, Double, Node] = js.native 322 | 323 | def target(target: Node): Chord[Link, Node] = js.native 324 | 325 | def target(target: js.Function2[Link, Double, Node]): Chord[Link, Node] = js.native 326 | 327 | def radius(): js.Function2[Node, Double, Double] = js.native 328 | 329 | def radius(radius: Double): Chord[Link, Node] = js.native 330 | 331 | def radius(radius: js.Function2[Node, Double, Double]): Chord[Link, Node] = js.native 332 | 333 | def startAngle(): js.Function2[Node, Double, Double] = js.native 334 | 335 | def startAngle(angle: Double): Chord[Link, Node] = js.native 336 | 337 | def startAngle(angle: js.Function2[Node, Double, Double]): Chord[Link, Node] = js.native 338 | 339 | def endAngle(): js.Function2[Node, Double, Double] = js.native 340 | 341 | def endAngle(angle: Double): Chord[Link, Node] = js.native 342 | 343 | def endAngle(angle: js.Function2[Node, Double, Double]): Chord[Link, Node] = js.native 344 | } 345 | 346 | 347 | @JSName("d3.svg.line") 348 | @js.native 349 | trait LineObject extends js.Object { 350 | def radial(): lineModule.Radial[js.Tuple2[Double, Double]] = js.native 351 | 352 | //TODO def radial[T](): Radial[T] = js.native 353 | } 354 | package lineModule { 355 | 356 | @js.native 357 | trait Radial[T] extends js.Function1[js.Array[T],String] { 358 | 359 | def radius(): Double | js.Function2[T, Int, Double] = js.native 360 | 361 | def radius(radius: Double): Radial[T] = js.native 362 | 363 | def radius(radius: js.Function2[T, Int, Double]): Radial[T] = js.native 364 | 365 | def angle(): Double | js.Function2[T, Int, Double] = js.native 366 | 367 | def angle(angle: Double): Radial[T] = js.native 368 | 369 | def angle(angle: js.Function2[T, Int, Double]): Radial[T] = js.native 370 | 371 | def interpolate(): String | js.Function1[js.Array[js.Tuple2[Double, Double]], String] = js.native 372 | 373 | def interpolate(interpolate: String | js.Function1[js.Array[js.Tuple2[Double, Double]], String]): Radial[T] = js.native 374 | 375 | def tension(): Double = js.native 376 | 377 | def tension(tension: Double): Radial[T] = js.native 378 | 379 | def defined(): js.Function2[T, Int, Boolean] = js.native 380 | 381 | def defined(defined: js.Function2[T, Int, Boolean]): Radial[T] = js.native 382 | } 383 | 384 | } 385 | 386 | @JSName("d3.svg.area") 387 | @js.native 388 | trait AreaObject extends js.Object { 389 | def radial(): areaModule.Radial[js.Tuple2[Double, Double]] = js.native 390 | 391 | //TODO def radial[T](): Radial[T] = js.native 392 | } 393 | package areaModule { 394 | 395 | @js.native 396 | trait Radial[T] extends js.Function1[js.Array[T],String] { 397 | 398 | def radius(): Double | js.Function2[T, Int, Double] = js.native 399 | 400 | def radius(radius: Double): Radial[T] = js.native 401 | 402 | def radius(radius: js.Function2[T, Int, Double]): Radial[T] = js.native 403 | 404 | def innerRadius(): Double | js.Function2[T, Int, Double] = js.native 405 | 406 | def innerRadius(innerRadius: Double): Radial[T] = js.native 407 | 408 | def innerRadius(innerRadius: js.Function2[T, Int, Double]): Radial[T] = js.native 409 | 410 | def outerRadius(): Double | js.Function2[T, Int, Double] = js.native 411 | 412 | def outerRadius(outerRadius: Double): Radial[T] = js.native 413 | 414 | def outerRadius(outerRadius: js.Function2[T, Int, Double]): Radial[T] = js.native 415 | 416 | def angle(): Double | js.Function2[T, Int, Double] = js.native 417 | 418 | def angle(angle: Double): Radial[T] = js.native 419 | 420 | def angle(angle: js.Function2[T, Int, Double]): Radial[T] = js.native 421 | 422 | def startAngle(): Double | js.Function2[T, Int, Double] = js.native 423 | 424 | def startAngle(startAngle: Double): Radial[T] = js.native 425 | 426 | def startAngle(startAngle: js.Function2[T, Int, Double]): Radial[T] = js.native 427 | 428 | def endAngle(): Double | js.Function2[T, Int, Double] = js.native 429 | 430 | def endAngle(endAngle: Double): Radial[T] = js.native 431 | 432 | def endAngle(endAngle: js.Function2[T, Int, Double]): Radial[T] = js.native 433 | 434 | def interpolate(): String | js.Function1[js.Array[js.Tuple2[Double, Double]], String] = js.native 435 | 436 | def interpolate(interpolate: String | js.Function1[js.Array[js.Tuple2[Double, Double]], String]): Radial[T] = js.native 437 | 438 | def tension(): Double = js.native 439 | 440 | def tension(tension: Double): Radial[T] = js.native 441 | 442 | def defined(): js.Function2[T, Int, Boolean] = js.native 443 | 444 | def defined(defined: js.Function2[T, Int, Boolean]): Radial[T] = js.native 445 | } 446 | 447 | } 448 | 449 | 450 | @JSName("d3.svg.diagonal") 451 | @js.native 452 | trait DiagonalObject extends js.Object { 453 | 454 | import diagonalModule._ 455 | 456 | def radial(): Radial[Link[Node], Node] = js.native 457 | 458 | //TODO def radial[Node](): Radial[Link[Node], Node] = js.native 459 | //TODO def radial[Link, Node](): Radial[Link, Node] = js.native 460 | } 461 | package diagonalModule { 462 | 463 | @js.native 464 | trait Link[Node] extends js.Object { 465 | var source: Node = js.native 466 | var target: Node = js.native 467 | } 468 | 469 | @js.native 470 | trait Node extends js.Object { 471 | var x: Double = js.native 472 | var y: Double = js.native 473 | } 474 | 475 | @js.native 476 | trait Radial[Link, Node] extends js.Object { 477 | def apply(d: Link, i: Double): String = js.native 478 | 479 | def source(): js.Function2[Link, Double, Node] = js.native 480 | 481 | def source(source: Node): Radial[Link, Node] = js.native 482 | 483 | def source(source: js.Function2[Link, Double, Node]): Radial[Link, Node] = js.native 484 | 485 | def target(): js.Function2[Link, Double, Node] = js.native 486 | 487 | def target(target: Node): Radial[Link, Node] = js.native 488 | 489 | def target(target: js.Function2[Link, Double, Node]): Radial[Link, Node] = js.native 490 | 491 | def projection(): js.Function2[Node, Double, js.Tuple2[Double, Double]] = js.native 492 | 493 | def projection(projection: js.Function2[Node, Double, js.Tuple2[Double, Double]]): Radial[Link, Node] = js.native 494 | } 495 | 496 | } 497 | 498 | 499 | package brushModule { 500 | 501 | @js.native 502 | trait Scale extends BaseScale[Double,Double,Scale] { 503 | 504 | } 505 | 506 | } 507 | 508 | package chordModule { 509 | 510 | @js.native 511 | trait Link[Node] extends js.Object { 512 | var source: Node = js.native 513 | var target: Node = js.native 514 | } 515 | 516 | @js.native 517 | trait Node extends js.Object { 518 | var radius: Double = js.native 519 | var startAngle: Double = js.native 520 | var endAngle: Double = js.native 521 | } 522 | 523 | } 524 | 525 | package arcModule { 526 | 527 | @js.native 528 | trait Arc extends js.Object { 529 | var innerRadius: Double = js.native 530 | var outerRadius: Double = js.native 531 | var startAngle: Double = js.native 532 | var endAngle: Double = js.native 533 | var padAngle: Double = js.native 534 | } 535 | 536 | } 537 | 538 | } 539 | -------------------------------------------------------------------------------- /src/main/scala/org/singlespaced/d3js/time.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import scala.scalajs.js 4 | import scala.scalajs.js.annotation.JSName 5 | import scala.scalajs.js.{Date, `|`} 6 | 7 | @JSName("d3.time") 8 | @js.native 9 | trait TimeObject extends js.Object { 10 | 11 | import timeModule._ 12 | 13 | var second: Interval = js.native 14 | var minute: Interval = js.native 15 | var hour: Interval = js.native 16 | var day: Interval = js.native 17 | var week: Interval = js.native 18 | var sunday: Interval = js.native 19 | var monday: Interval = js.native 20 | var tuesday: Interval = js.native 21 | var wednesday: Interval = js.native 22 | var thursday: Interval = js.native 23 | var friday: Interval = js.native 24 | var saturday: Interval = js.native 25 | var month: Interval = js.native 26 | var year: Interval = js.native 27 | 28 | def seconds(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 29 | 30 | def minutes(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 31 | 32 | def hours(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 33 | 34 | def days(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 35 | 36 | def weeks(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 37 | 38 | def sundays(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 39 | 40 | def mondays(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 41 | 42 | def tuesdays(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 43 | 44 | def wednesdays(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 45 | 46 | def thursdays(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 47 | 48 | def fridays(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 49 | 50 | def saturdays(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 51 | 52 | def months(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 53 | 54 | def years(start: Date, stop: Date, step: Double = ???): js.Array[Date] = js.native 55 | 56 | def dayOfYear(d: Date): Double = js.native 57 | 58 | def weekOfYear(d: Date): Double = js.native 59 | 60 | def sundayOfYear(d: Date): Double = js.native 61 | 62 | def mondayOfYear(d: Date): Double = js.native 63 | 64 | def tuesdayOfYear(d: Date): Double = js.native 65 | 66 | def wednesdayOfYear(d: Date): Double = js.native 67 | 68 | def fridayOfYear(d: Date): Double = js.native 69 | 70 | def saturdayOfYear(d: Date): Double = js.native 71 | 72 | def format(specifier: String): Format = js.native 73 | 74 | def scale(): Scale[Double, Double] = js.native 75 | 76 | 77 | //TODO def scale[Output](): Scale[Output, Output] = js.native 78 | //TODO def scale[Range, Output](): Scale[Range, Output] = js.native 79 | //Forwarders 80 | def format: timeModule.FormatObject = js.native 81 | } 82 | 83 | package timeModule { 84 | 85 | @js.native 86 | trait Interval extends js.Object { 87 | def apply(d: Date): Date = js.native 88 | 89 | def floor(d: Date): Date = js.native 90 | 91 | def round(d: Date): Date = js.native 92 | 93 | def ceil(d: Date): Date = js.native 94 | 95 | def range(start: Date, stop: Date, step: Double): js.Array[Date] = js.native 96 | 97 | def offset(date: Date, step: Double): Date = js.native 98 | 99 | var utc: js.Any = js.native 100 | } 101 | 102 | 103 | @JSName("d3.time.format") 104 | @js.native 105 | trait FormatObject extends js.Object { 106 | def multi(formats: js.Array[js.Tuple2[String, js.Function1[Date, Boolean | Double]]]): Format = js.native 107 | 108 | def utc(specifier: String): Format = js.native 109 | 110 | var iso: Format = js.native 111 | 112 | //Forwarders 113 | def utc: formatModule.UtcObject = js.native 114 | } 115 | 116 | package formatModule { 117 | 118 | @JSName("d3.time.format.utc") 119 | @js.native 120 | trait UtcObject extends js.Object { 121 | def multi(formats: js.Array[js.Tuple2[String, js.Function1[Date, Boolean | Double]]]): Format = js.native 122 | } 123 | 124 | } 125 | 126 | @js.native 127 | trait Format extends js.Object { 128 | def apply(d: Date): String = js.native 129 | 130 | def parse(input: String): Date = js.native 131 | } 132 | 133 | @JSName("d3.time.scale") 134 | @js.native 135 | trait ScaleObject extends js.Object { 136 | def utc(): Scale[Double, Double] = js.native 137 | 138 | //TODO def utc[Output](): Scale[Output, Output] = js.native 139 | //TODO def utc[Range, Output](): Scale[Range, Output] = js.native 140 | } 141 | 142 | 143 | @js.native 144 | trait Scale[Range, Output] extends BaseScale[Date,Range,Scale[Range, Output]] { 145 | def apply(x: Date): Output = js.native 146 | 147 | def nice(): Scale[Range, Output] = js.native 148 | 149 | def nice(interval: Interval, step: Double): Scale[Range, Output] = js.native 150 | 151 | def rangeRound(values: js.Array[Double]): Scale[Double, Double] = js.native 152 | 153 | def interpolate(): js.Function2[Range, Range, js.Function1[Double, Output]] = js.native 154 | 155 | def interpolate(factory: js.Function2[Range, Range, js.Function1[Double, Output]]): Scale[Range, Output] = js.native 156 | 157 | def clamp(): Boolean = js.native 158 | 159 | def clamp(clamp: Boolean): Scale[Range, Output] = js.native 160 | 161 | def ticks(): js.Array[Date] = js.native 162 | 163 | def ticks(interval: Interval, step: Double): js.Array[Date] = js.native 164 | 165 | def ticks(count: Double): js.Array[Date] = js.native 166 | 167 | def tickFormat(count: Double): js.Function1[Date, String] = js.native 168 | 169 | def copy(): Scale[Range, Output] = js.native 170 | } 171 | 172 | } 173 | 174 | -------------------------------------------------------------------------------- /src/test/scala/org/singlespaced/d3js/AxisTest.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.scalajs.dom 4 | import scala.scalajs.js 5 | import utest._ 6 | 7 | object AxisTest extends TestSuite { 8 | 9 | 10 | val elem=dom.document.createElement("p") 11 | dom.document.body.appendChild(elem) 12 | 13 | 14 | val tests = TestSuite { 15 | 'd3_axis_call { 16 | //arrange 17 | val x = d3.time.scale().range(js.Array(0, 1000)) 18 | val xAxis = d3.svg.axis().scale(x).orient("bottom").ticks(5) 19 | //act 20 | d3.select("p").append("svg").call(xAxis) 21 | //assert 22 | val actual=dom.document.getElementsByClassName("tick") 23 | assert( actual.length == 2) 24 | } 25 | 26 | 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /src/test/scala/org/singlespaced/d3js/D3Test.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.scalajs.dom 4 | import org.singlespaced.d3js.Ops._ 5 | import org.singlespaced.d3js.d3.Primitive 6 | import utest._ 7 | 8 | import scala.scalajs.js 9 | 10 | object D3Test extends TestSuite { 11 | 12 | 13 | val elem=dom.document.createElement("p") 14 | dom.document.body.appendChild(elem) 15 | val sel=d3.selectAll("p").data(js.Array(5)) 16 | 17 | val tests = TestSuite { 18 | 'd3_selection_attr_fun1WithInt { 19 | sel.attr("tabindex", (d:Int) => d*2 ) 20 | assert("10" == elem.getAttribute("tabindex")) 21 | } 22 | 'd3_selection_classed_fun2WithBoolean { 23 | val f= (d:Int,i:Int) => d==5 24 | sel.classed("myclass", f ) 25 | assert(elem.classList.contains("myclass")) 26 | } 27 | 28 | } 29 | } 30 | 31 | -------------------------------------------------------------------------------- /src/test/scala/org/singlespaced/d3js/LayoutTest.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.scalajs.dom 4 | import utest._ 5 | 6 | import scala.scalajs.js 7 | 8 | object LayoutTest extends TestSuite { 9 | 10 | val elem = dom.document.createElement("p") 11 | dom.document.body.appendChild(elem) 12 | 13 | val tests = TestSuite { 14 | 15 | 'd3_forcelayout_simplelink_source { 16 | //arrange 17 | val node1 = "one" 18 | val node2 = "two" 19 | //act 20 | val testee=SimpleLink[String](node1,node2) 21 | //assert 22 | val actualSource=testee.asInstanceOf[js.Dynamic].source 23 | assert(node1 == actualSource) 24 | } 25 | 26 | 'd3_forcelayout_node_afterstart_runtime_attr { 27 | //arrange 28 | case class Test(id:String) extends forceModule.Node 29 | val node1 = new Test("one") 30 | val node2 = new Test("two") 31 | val link = SimpleLink[Test](node1,node2) 32 | val force = d3.layout.force[Test, Link[Test]]() 33 | .nodes(js.Array(node1,node2)) 34 | .links(js.Array(link)) 35 | .charge(-400) 36 | .linkDistance(120) 37 | .size(js.Tuple2(100, 100)) 38 | //act 39 | force.start() 40 | //assert 41 | val actualX=node1.asInstanceOf[js.Dynamic].x 42 | 43 | assert( actualX.isInstanceOf[Double] ) 44 | assert( node1.x.isInstanceOf[Double] ) 45 | assert( node1.x == actualX ) 46 | } 47 | 48 | 49 | } 50 | } 51 | 52 | -------------------------------------------------------------------------------- /src/test/scala/org/singlespaced/d3js/ScaleTest.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.scalajs.dom 4 | import utest._ 5 | 6 | import scala.scalajs.js 7 | 8 | object ScaleTest extends TestSuite { 9 | 10 | 11 | val elem=dom.document.createElement("p") 12 | dom.document.body.appendChild(elem) 13 | 14 | 15 | val tests = TestSuite { 16 | 'd3_timeScale_withZoomBehavior { 17 | //arrange 18 | val timeScale = d3.time.scale().range(js.Array(0, 1000)) 19 | val zoomBehavior = d3.behavior.zoom() 20 | //act 21 | zoomBehavior.x(timeScale) 22 | } 23 | 24 | 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /src/test/scala/org/singlespaced/d3js/SelectionTest.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.scalajs.dom 4 | import utest._ 5 | import scala.scalajs.js 6 | import scala.scalajs.js.`|` 7 | import org.singlespaced.d3js.Ops._ 8 | object SelectionTest extends TestSuite { 9 | 10 | 11 | val elem=dom.document.createElement("p") 12 | dom.document.body.appendChild(elem) 13 | 14 | 15 | val tests = TestSuite { 16 | 'd3_select_element { 17 | val sel:Selection[dom.EventTarget]=d3.select("p") 18 | val n:dom.EventTarget=sel.node() 19 | assert(elem == n) 20 | } 21 | 'd3_selectAll_element { 22 | val sel:Selection[dom.EventTarget]=d3.selectAll("p") 23 | val n:dom.EventTarget=sel.node() 24 | assert(elem == n) 25 | } 26 | 'd3_dataWithKey_twoLoopsAndThisFunction { 27 | val sel:Selection[dom.EventTarget]=d3.selectAll("p") 28 | val function= { (t: dom.Node | js.Array[Int] ,d:js.UndefOr[Int],i:Int) => 29 | //dom.window.console.log("d is "+d+" and i is "+i+" and this is "+t) 30 | "a" 31 | } 32 | sel.data[Int](js.Array(5,7,8),function).enter().append("p") 33 | } 34 | 'd3_dataWithKey_simpleFunction { 35 | //arrange 36 | class MyData(val id:String) 37 | class MySubData(id:String) extends MyData(id) 38 | val sel=d3.selectAll("p").data(js.Array(new MyData("1"))) 39 | val function= (d:MyData) => d.id 40 | //act 41 | sel.data[MySubData](js.Array(new MySubData("2")),function).enter().append("p") 42 | //assert 43 | } 44 | 45 | 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/test/scala/org/singlespaced/d3js/SvgAreaTest.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.scalajs.dom 4 | import org.singlespaced.d3js.Ops._ 5 | import utest._ 6 | 7 | import scala.scalajs.js 8 | 9 | 10 | object SvgAreaTest extends TestSuite { 11 | 12 | 13 | val elem=dom.document.createElement("svg") 14 | dom.document.body.appendChild(elem) 15 | 16 | 17 | val tests = TestSuite { 18 | 'd3_area_xy { 19 | //arrange 20 | case class TestDatum(v:Int) 21 | val data=js.Array[TestDatum](TestDatum(1),TestDatum(4)) 22 | val testee = d3.svg.area[TestDatum]() 23 | //act 24 | val result=testee 25 | .x((d:TestDatum,i:Int) => d.v.toDouble ) 26 | .y((d:TestDatum,i:Int) => d.v.toDouble ) 27 | //assert 28 | 29 | d3.select(elem).datum(data) 30 | .append("path") 31 | .attr("d", result) 32 | 33 | val actual=dom.document.getElementsByTagName("path") 34 | assert( actual.length == 1) 35 | assert( actual.item(0).asInstanceOf[dom.Element].getAttribute("d") =="M1,1L4,4L4,4L1,1Z") 36 | 37 | } 38 | 'd3_area_radial { 39 | val area = d3.svg.area.radial().interpolate("basis").tension(0).radius(100) 40 | } 41 | } 42 | } 43 | 44 | -------------------------------------------------------------------------------- /src/test/scala/org/singlespaced/d3js/SvgLineTest.scala: -------------------------------------------------------------------------------- 1 | package org.singlespaced.d3js 2 | 3 | import org.scalajs.dom 4 | import utest._ 5 | 6 | import scala.scalajs.js 7 | import org.singlespaced.d3js.Ops._ 8 | 9 | 10 | 11 | object SvgLineTest extends TestSuite { 12 | 13 | 14 | val elem=dom.document.createElement("svg") 15 | dom.document.body.appendChild(elem) 16 | 17 | 18 | val tests = TestSuite { 19 | 'd3_line_xy { 20 | //arrange 21 | case class TestDatum(v:Int) 22 | val data=js.Array[TestDatum](TestDatum(1),TestDatum(4)) 23 | val testee = d3.svg.line[TestDatum]() 24 | //act 25 | val result=testee 26 | .x((d:TestDatum,i:Int) => d.v.toDouble ) 27 | .y((d:TestDatum,i:Int) => d.v.toDouble ) 28 | //assert 29 | d3.select(elem).datum(data) 30 | .append("path") 31 | .attr("d", result) 32 | 33 | val actual=dom.document.getElementsByTagName("path") 34 | assert( actual.length == 1) 35 | assert( actual.item(0).asInstanceOf[dom.Element].getAttribute("d") =="M1,1L4,4") 36 | } 37 | 'd3_line_function1 { 38 | //arrange 39 | case class TestDatum(v:Int) 40 | val data=js.Array[TestDatum](TestDatum(1),TestDatum(4)) 41 | val testee = d3.svg.line[TestDatum]() 42 | //act 43 | val result=testee 44 | .x((d:TestDatum) => d.v.toDouble ) 45 | .y((d:TestDatum) => d.v.toDouble ) 46 | } 47 | 'd3_line_radial_issue_21 { 48 | val line = d3.svg.line.radial().interpolate("basis").tension(0).radius(100) 49 | } 50 | 51 | } 52 | } 53 | 54 | -------------------------------------------------------------------------------- /version.sbt: -------------------------------------------------------------------------------- 1 | version in ThisBuild := "0.3.5-SNAPSHOT" 2 | --------------------------------------------------------------------------------