diff --git a/examples/button.nim b/examples/button.nim new file mode 100644 index 0000000..bd49dc3 --- /dev/null +++ b/examples/button.nim @@ -0,0 +1,16 @@ + +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 new file mode 100644 index 0000000..2ddadff --- /dev/null +++ b/examples/buttonlambda.nim @@ -0,0 +1,14 @@ +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/hellouniverse.nim b/examples/hellouniverse.nim new file mode 100644 index 0000000..9d6ebc6 --- /dev/null +++ b/examples/hellouniverse.nim @@ -0,0 +1,13 @@ + +include karax / prelude +import random + +proc createDom(): VNode = + result = buildHtml(tdiv): + if random(100) <= 50: + text "Hello World!" + else: + text "Hello Universe" + +randomize() +setRenderer createDom diff --git a/examples/helloworld.nim b/examples/helloworld.nim new file mode 100644 index 0000000..76c43db --- /dev/null +++ b/examples/helloworld.nim @@ -0,0 +1,7 @@ +include karax / prelude + +proc createDom(): VNode = + result = buildHtml(tdiv): + text "Hello World!" + +setRenderer createDom diff --git a/examples/login.nim b/examples/login.nim new file mode 100644 index 0000000..4980269 --- /dev/null +++ b/examples/login.nim @@ -0,0 +1,48 @@ + +include karax / prelude +from future 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, onkeyuplater = validator(field)) + +const + login = kstring"login" # a const to prevent typos + +proc validateNotEmpty(field: kstring): proc () = + result = proc () = + let x = getVNodeById(field) + if x.text.isNil or x.text == "": + errors.setError(login, field & " must not be empty") + else: + errors.setError(login, "") + + +# some consts in order to prevent typos: +const + username = kstring"username" + password = kstring"password" + +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(login) + else: + p: + text "You are now logged in." + +setError login, username & " must not be empty" + +when not declared(toychat): + setRenderer loginDialog diff --git a/examples/toychat.nim b/examples/toychat.nim new file mode 100644 index 0000000..66c4cd0 --- /dev/null +++ b/examples/toychat.nim @@ -0,0 +1,36 @@ + +include login + +const + message = "message" + +type + TextMessage = ref object + name, content: kstring + +var allMessages: seq[TextMessage] = @[] + +proc doSendMessage() = + let inputField = getVNodeById(message) + allMessages.add(TextMessage(name: "you", content: inputField.text)) + inputField.setInputText "" + +proc main(): VNode = + result = buildHtml(tdiv): + loginDialog() + tdiv: + table: + for m in allMessages: + tr: + td: + bold: + text m.name + td: + text m.content + tdiv: + if loggedIn: + label(`for` = message): + text "Message: " + input(class = "input", id = message, onkeyupenter = doSendMessage) + +setRenderer main diff --git a/karax/karax.nim b/karax/karax.nim index 68b2048..9aea015 100644 --- a/karax/karax.nim +++ b/karax/karax.nim @@ -4,8 +4,9 @@ import kdom, vdom, jstrutils, compact, jdict, vstyles export kdom.Event -proc kout*[T](x: T) {.importc: "console.log", varargs.} - ## the preferred way of debugging karax applications. +proc kout*[T](x: T) {.importc: "console.log", varargs, deprecated.} + ## the preferred way of debugging karax applications. Now deprecated, + ## you can now use ``system.echo`` instead. type PatchKind = enum diff --git a/karax/prelude.nim b/karax/prelude.nim index ed9349c..3cd25e2 100644 --- a/karax/prelude.nim +++ b/karax/prelude.nim @@ -1,3 +1,3 @@ ## Include file that contains the common imports for the Karax framework. -import karax, karaxdsl, vdom, compact +import kbase, karax, karaxdsl, vdom, compact, jstrutils diff --git a/tests/tester.nim b/tests/tester.nim index ea4022a..2ff9968 100644 --- a/tests/tester.nim +++ b/tests/tester.nim @@ -16,4 +16,7 @@ proc main = exec("nim js -d:nodejs -r tests/difftest.nim") exec("nim c tests/nativehtmlgen.nim") + for test in os.walkFiles("examples/*.nim"): + exec("nim js " & test) + main()