diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index 5e6c415..0000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-# This is a basic workflow to help you get started with Actions
-
-name: CI
-
-# Controls when the action will run.
-on:
- # Triggers the workflow on push or pull request events but only for the master branch
- push:
- branches: [ master ]
- pull_request:
- branches: [ master ]
-
- # Allows you to run this workflow manually from the Actions tab
- workflow_dispatch:
-
-# A workflow run is made up of one or more jobs that can run sequentially or in parallel
-jobs:
- # This workflow contains a single job called "build"
- build:
- # The type of runner that the job will run on
- runs-on: ubuntu-latest
- container: nimlang/nim
- # Steps represent a sequence of tasks that will be executed as part of the job
- steps:
- # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- - uses: actions/checkout@v2
- # Runs a single command using the runners shell
- - name: Tests
- run: |
- nimble develop -y
- nim c -r tests/tester.nim
diff --git a/.gitignore b/.gitignore
index 842e140..67d9b34 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1 @@
nimcache/
-/tests/tester
-karax/tools/karun
-*.code-workspace
-*.exe
-app.js
-app.html
diff --git a/LICENSE.txt b/LICENSE.txt
deleted file mode 100644
index ac49796..0000000
--- a/LICENSE.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2017 Xored Software, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/docs/docs.rst b/docs/docs.rst
index 3eec1a4..8298ba9 100644
--- a/docs/docs.rst
+++ b/docs/docs.rst
@@ -10,17 +10,17 @@ and some extensions that allow for an efficient component system.
These extensions are:
``VNodeKind.int``
- The node has a single integer field.
+ The node havs a single integer field.
``VNodeKind.bool``
The node has a single boolean field.
-``VNodeKind.vthunk``
+``VNodeKint.vthunk``
The node is a `virtual thunk`:idx:. This means there is a
function attached to it that produces the ``VNode`` structure
on demand.
-``VNodeKind.dthunk``
+``VNodeKint.dthunk``
The node is a `DOM thunk`:idx:. This means there is a
function attached to it that produces the ``Node`` DOM structure
on demand.
@@ -53,6 +53,6 @@ Event system
Karax does not abstract over the event system the DOM offers much: The same
``Event`` structure is used. Every callback has the
-signature ``proc (ev: Event; n: VNode)`` or empty ``proc ()``.
+signature ``proc (ev: Event; n: VNode)``.
diff --git a/examples/button.nim b/examples/button.nim
deleted file mode 100644
index d86fa82..0000000
--- a/examples/button.nim
+++ /dev/null
@@ -1,15 +0,0 @@
-include karax / prelude
-
-var lines: seq[kstring] = @[]
-
-proc createDom(): VNode =
- result = buildHtml(tdiv):
- button:
- text "Say hello!"
- proc onclick(ev: Event; n: VNode) =
- lines.add "Hello simulated universe"
- for x in lines:
- tdiv:
- text x
-
-setRenderer createDom
diff --git a/examples/buttonlambda.nim b/examples/buttonlambda.nim
deleted file mode 100644
index 2ddadff..0000000
--- a/examples/buttonlambda.nim
+++ /dev/null
@@ -1,14 +0,0 @@
-include karax / prelude
-from future import `=>`
-
-var lines: seq[kstring] = @[]
-
-proc createDom(): VNode =
- result = buildHtml(tdiv):
- button(onclick = () => lines.add "Hello simulated universe"):
- text "Say hello!"
- for x in lines:
- tdiv:
- text x
-
-setRenderer createDom
diff --git a/examples/carousel/carousel.html b/examples/carousel/carousel.html
deleted file mode 100644
index 500e73a..0000000
--- a/examples/carousel/carousel.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- Carousel app
-
-
-
-
-
-
-
-
-
-
diff --git a/examples/carousel/carousel.nim b/examples/carousel/carousel.nim
deleted file mode 100644
index c2db56c..0000000
--- a/examples/carousel/carousel.nim
+++ /dev/null
@@ -1,69 +0,0 @@
-## This demo shows how you can develop your own stateful components with Karax.
-
-import vdom, vstyles, karax, karaxdsl, jdict, jstrutils, kdom
-
-type
- Carousel = ref object of VComponent
- counter: int
- cntdown: int
- timer: TimeOut
- list: seq[cstring]
-
-const ticksUntilChange = 5
-
-var
- images: seq[cstring] = @[cstring"a", "b", "c", "d"]
-
-proc render(x: VComponent): VNode =
- let self = Carousel(x)
-
- proc docount() =
- dec self.cntdown
- if self.cntdown == 0:
- self.counter = (self.counter + 1) mod self.list.len
- self.cntdown = ticksUntilChange
- else:
- self.timer = setTimeout(docount, 30)
- markDirty(self)
- redraw()
-
- proc onclick(ev: Event; n: VNode) =
- if self.timer != nil:
- clearTimeout(self.timer)
- self.timer = setTimeout(docount, 30)
-
- let col =
- case self.counter
- of 0: cstring"#4d4d4d"
- of 1: cstring"#ff00ff"
- of 2: cstring"#00ffff"
- of 3: cstring"#ffff00"
- else: cstring"red"
- result = buildHtml(tdiv()):
- text self.list[self.counter]
- button(onclick = onclick):
- text "Next"
- tdiv(style = style(StyleAttr.color, col)):
- text "This changes its color."
- if self.cntdown != ticksUntilChange:
- text &self.cntdown
-
-proc carousel(): Carousel =
- result = newComponent(Carousel, render)
- result.list = images
- result.cntdown = ticksUntilChange
-
-proc createDom(): VNode =
- result = buildHtml(table):
- tr:
- td:
- carousel()
- td:
- carousel()
- tr:
- td:
- carousel()
- td:
- carousel()
-
-setRenderer createDom
diff --git a/examples/carousel/carousel.nims b/examples/carousel/carousel.nims
deleted file mode 100644
index cef2dec..0000000
--- a/examples/carousel/carousel.nims
+++ /dev/null
@@ -1 +0,0 @@
---path: "../../karax"
diff --git a/examples/config.nims b/examples/config.nims
deleted file mode 100644
index 76ed4d9..0000000
--- a/examples/config.nims
+++ /dev/null
@@ -1 +0,0 @@
---path: ".."
diff --git a/examples/hellostyle.nim b/examples/hellostyle.nim
deleted file mode 100644
index 716c2f0..0000000
--- a/examples/hellostyle.nim
+++ /dev/null
@@ -1,17 +0,0 @@
-include karax / prelude
-import karax / vstyles
-
-proc createDom(): VNode =
- result = buildHtml(tdiv):
- tdiv(style = style(StyleAttr.color, "red".cstring)):
- text "red"
- tdiv(style = style(StyleAttr.color, "blue")):
- text "blue"
- # explicit `kstring` required for varargs overload
- tdiv(style = style((fontStyle, "italic".kstring), (color, "orange".kstring))):
- text "italic orange"
- # can use a string directly
- tdiv(style = "font-style: oblique; color: pink".toCss):
- text "oblique pink"
-
-setRenderer createDom
diff --git a/examples/hellouniverse.nim b/examples/hellouniverse.nim
deleted file mode 100644
index 8343d07..0000000
--- a/examples/hellouniverse.nim
+++ /dev/null
@@ -1,12 +0,0 @@
-include karax / prelude
-import random
-
-proc createDom(): VNode =
- result = buildHtml(tdiv):
- if rand(100) <= 50:
- text "Hello World!"
- else:
- text "Hello Universe"
-
-randomize()
-setRenderer createDom
diff --git a/examples/helloworld.nim b/examples/helloworld.nim
deleted file mode 100644
index 76c43db..0000000
--- a/examples/helloworld.nim
+++ /dev/null
@@ -1,7 +0,0 @@
-include karax / prelude
-
-proc createDom(): VNode =
- result = buildHtml(tdiv):
- text "Hello World!"
-
-setRenderer createDom
diff --git a/examples/login.nim b/examples/login.nim
deleted file mode 100644
index 0350e23..0000000
--- a/examples/login.nim
+++ /dev/null
@@ -1,46 +0,0 @@
-include karax / prelude
-from sugar import `=>`
-import karax / errors
-
-proc loginField(desc, field, class: kstring;
- validator: proc (field: kstring): proc ()): VNode =
- result = buildHtml(tdiv):
- label(`for` = field):
- text desc
- input(class = class, id = field, onchange = validator(field))
-
-# some consts in order to prevent typos:
-const
- username = kstring"username"
- password = kstring"password"
-
-proc validateNotEmpty(field: kstring): proc () =
- result = proc () =
- let x = getVNodeById(field)
- if x.text == "":
- errors.setError(field, field & " must not be empty")
- else:
- errors.setError(field, "")
-
-var loggedIn: bool
-
-proc loginDialog(): VNode =
- result = buildHtml(tdiv):
- if not loggedIn:
- loginField("Name: ", username, "input", validateNotEmpty)
- loginField("Password: ", password, "password", validateNotEmpty)
- button(onclick = () => (loggedIn = true), disabled = errors.disableOnError()):
- text "Login"
- p:
- text errors.getError(username)
- p:
- text errors.getError(password)
- else:
- p:
- text "You are now logged in."
-
-setError username, username & " must not be empty"
-setError password, password & " must not be empty"
-
-when not declared(toychat):
- setRenderer loginDialog
diff --git a/examples/mediaplayer/mediaplayer.nim b/examples/mediaplayer/mediaplayer.nim
index c84b68b..18179c1 100644
--- a/examples/mediaplayer/mediaplayer.nim
+++ b/examples/mediaplayer/mediaplayer.nim
@@ -1,5 +1,5 @@
-import karax / [karax, karaxdsl, vdom, kdom, compact]
+import karax, karaxdsl, vdom, dom, components
const
Play = 0
@@ -12,10 +12,10 @@ proc play(n: Node) {.importcpp.}
proc pause(n: Node) {.importcpp.}
proc `width=`(n: Node, w: int) {.importcpp: "#.width = #".}
-proc mplayer*(id, resource: cstring): VNode {.compact.} =
+proc mplayer*(id, resource: cstring): VNode {.component.} =
proc handler(ev: Event; n: VNode) =
let myVideo = document.getElementById(id)
- case n.index
+ case n.key
of Play:
if myVideo.paused:
myVideo.play()
@@ -27,13 +27,13 @@ proc mplayer*(id, resource: cstring): VNode {.compact.} =
else: discard
result = buildHtml(tdiv):
- button(onclick=handler, index=Play):
+ button(onclick=handler, key=Play):
text "Play/Pause"
- button(onclick=handler, index=Big):
+ button(onclick=handler, key=Big):
text "Big"
- button(onclick=handler, index=Small):
+ button(onclick=handler, key=Small):
text "Small"
- button(onclick=handler, index=Normal):
+ button(onclick=handler, key=Normal):
text "Normal"
br()
br()
diff --git a/examples/mediaplayer/playerapp.html b/examples/mediaplayer/playerapp.html
index a45a2e8..9e076e6 100644
--- a/examples/mediaplayer/playerapp.html
+++ b/examples/mediaplayer/playerapp.html
@@ -1,15 +1,15 @@
-
- Player app
-
+
+ Player app
+
-
+
-
+
-
+
-
+
diff --git a/examples/mediaplayer/playerapp.nim b/examples/mediaplayer/playerapp.nim
index acb2e68..e611eec 100644
--- a/examples/mediaplayer/playerapp.nim
+++ b/examples/mediaplayer/playerapp.nim
@@ -1,6 +1,6 @@
## Example app that shows how to write and embed a custom component.
-include karax/prelude
+include karaxprelude
import mediaplayer
const url = "https://www.w3schools.com/html/mov_bbb.mp4"
diff --git a/examples/mediaplayer/playerapp.nims b/examples/mediaplayer/playerapp.nims
index cf2eb9e..9028ff1 100644
--- a/examples/mediaplayer/playerapp.nims
+++ b/examples/mediaplayer/playerapp.nims
@@ -1 +1 @@
---path: "../.."
+--path: "../../src"
diff --git a/examples/scrollapp/scrollapp.html b/examples/scrollapp/scrollapp.html
index 44d657e..1ff8b1b 100644
--- a/examples/scrollapp/scrollapp.html
+++ b/examples/scrollapp/scrollapp.html
@@ -1,15 +1,15 @@
-
- Todo app
-
+
+ Todo app
+
-
+
-
+
-
+
-
+
diff --git a/examples/scrollapp/scrollapp.nim b/examples/scrollapp/scrollapp.nim
index 4490447..e5ef9c1 100644
--- a/examples/scrollapp/scrollapp.nim
+++ b/examples/scrollapp/scrollapp.nim
@@ -1,7 +1,7 @@
## Example that shows how to accomplish an "infinitely scrolling" app.
-include karax/prelude
-import karax / [jstrutils, kdom, vstyles]
+include karaxprelude
+import jstrutils, dom
var entries: seq[cstring] = @[]
for i in 1..500:
@@ -16,8 +16,7 @@ proc scrollEvent(ev: Event; n: VNode) =
proc createDom(): VNode =
result = buildHtml():
- tdiv(onscroll=scrollEvent, style=style(
- (StyleAttr.height, cstring"400px"), (StyleAttr.overflow, cstring"scroll"))):
+ tdiv(onscroll=scrollEvent, style="height: 400px; overflow: scroll"):
for x in entries:
tdiv:
text x
diff --git a/examples/scrollapp/scrollapp.nims b/examples/scrollapp/scrollapp.nims
index cf2eb9e..9028ff1 100644
--- a/examples/scrollapp/scrollapp.nims
+++ b/examples/scrollapp/scrollapp.nims
@@ -1 +1 @@
---path: "../.."
+--path: "../../src"
diff --git a/examples/todoapp/todoapp.html b/examples/todoapp/todoapp.html
index ab3daa7..488a3bf 100644
--- a/examples/todoapp/todoapp.html
+++ b/examples/todoapp/todoapp.html
@@ -1,16 +1,16 @@
-
- Todo app
-
-
+
+ Todo app
+
+
-
+
-
+
-
+
-
+
diff --git a/examples/todoapp/todoapp.nim b/examples/todoapp/todoapp.nim
index e3720fd..802bfc9 100644
--- a/examples/todoapp/todoapp.nim
+++ b/examples/todoapp/todoapp.nim
@@ -1,5 +1,5 @@
-import karax / [vdom, karax, karaxdsl, jstrutils, compact, localstorage]
+import vdom, karax, karaxdsl, jstrutils, components, localstorage
type
Filter = enum
@@ -9,7 +9,7 @@ var
selectedEntry = -1
filter: Filter
entriesLen: int
- doneswitch = true
+
const
contentSuffix = cstring"content"
completedSuffix = cstring"completed"
@@ -41,30 +41,29 @@ proc updateEntry(pos: int, content: cstring, completed: bool) =
markAsCompleted(pos, completed)
proc onTodoEnter(ev: Event; n: VNode) =
- if n.value.strip() != "":
- addEntry(n.value, false)
- n.value = ""
+ addEntry(n.value, false)
+ n.value = ""
proc removeHandler(ev: Event; n: VNode) =
- updateEntry(n.index, cstring(nil), false)
+ updateEntry(n.key, cstring(nil), false)
proc editHandler(ev: Event; n: VNode) =
- selectedEntry = n.index
+ selectedEntry = n.key
proc focusLost(ev: Event; n: VNode) = selectedEntry = -1
proc editEntry(ev: Event; n: VNode) =
- setEntryContent(n.index, n.value)
+ setEntryContent(n.key, n.value)
selectedEntry = -1
proc toggleEntry(ev: Event; n: VNode) =
- let id = n.index
+ let id = n.key
markAsCompleted(id, not isCompleted(id))
proc onAllDone(ev: Event; n: VNode) =
- for i in 0..
-
+