I wrote the first version of my tileui library. I will use it to create my own node based GUI builder tool. It will work as a hybrid of declarative and programmatic paradigms. It will generate JSON for UI.
Below is a calculator sample program:
needs nk/gui
needs nk/tileui
32 constant FONTHEIGHT
FONTHEIGHT 1.75 n:* constant ROWHEIGHT
FONTHEIGHT font:system font:new "font1" font:atlas! drop
: +n \ nk n --
  >r 
  "calculator.display:num" tileui:data@ 10 n:*
  r> n:+ "calculator.display:num" swap tileui:data! ;
: mathop \ nk w -- nk
  "calculator:op" swap tileui:data!
  "calculator.display:num" tileui:data@  "calculator:a" swap tileui:data!
  "calculator.display:num" 0 tileui:data! ;
{
  name: "calculator",
  grid: null,
  layout: { rows: [ @ROWHEIGHT, -1], cols: 1, rgap: 4, cgap: 4, margin: 4 },
  data: { },
  cb: null , 
  tiles: [
           {
             name: "display",
             grid: { row: 0, rows: 1, col: 0, cols: 1 },
             data: { num: 0 }, 
             cb: ( nk:rect>local nk:grid-push     
                   "num" m:@ >s 32 nk:EDIT_SELECTABLE nk:EDIT_CLIPBOARD n:bor 
                   nk:PLUGIN_FILTER_FLOAT edit-string drop >n "num" m:_! drop )                
           },
           {
             name: "keypad",
             grid: { row: 1, rows: 1, col: 0, cols: 1 },
             layout: { rows: 4, cols: 4, rgap: 4, cgap: 4, margin: 4 },  
             data: { },
             cb: ( 2 2 "black" nk:stroke-rect drop ),
             tiles: [
                      {
                        name: "7",
                        grid: { row: 0, rows: 1, col: 0, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "7" ( 7 +n ) nk:button-label drop )
                      },
                      {
                        name: "8",
                        grid: { row: 0, rows: 1, col: 1, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "8" ( 8 +n ) nk:button-label drop )
                      },
                      {      
                        name: "9",
                        grid: { row: 0, rows: 1, col: 2, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "9" ( 9 +n ) nk:button-label drop )
                      },                                 
                      {
                        name: "+",
                        grid: { row: 0, rows: 1, col: 3, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "+"  ( ' n:+ mathop ) nk:button-label drop )
                      },
                      {
                        name: "4",
                        grid: { row: 1, rows: 1, col: 0, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "4" ( 4 +n ) nk:button-label drop )
                      },
                      {
                        name: "5",
                        grid: { row: 1, rows: 1, col: 1, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "5" ( 5 +n ) nk:button-label drop )
                      },
                      {
                        name: "6",
                        grid: { row: 1, rows: 1, col: 2, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "6" ( 6 +n ) nk:button-label drop )
                      },
                      {
                        name: "-",
                        grid: { row: 1, rows: 1, col: 3, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "-" ( ' n:- mathop ) nk:button-label drop )
                      },
                      {      
                        name: "1",
                        grid: { row: 2, rows: 1, col: 0, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "1" ( 1 +n ) nk:button-label drop )
                      },
                      {
                        name: "2",
                        grid: { row: 2, rows: 1, col: 1, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "2" ( 2 +n ) nk:button-label drop )
                      },
                      {
                        name: "3",
                        grid: { row: 2, rows: 1, col: 2, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "3" ( 3 +n ) nk:button-label drop )
                      },
                      {
                        name: "*",
                        grid: { row: 2, rows: 1, col: 3, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "*" ( ' n:* mathop ) nk:button-label drop )
                      },
                      {
                        name: "C",
                        grid: { row: 3, rows: 1, col: 0, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "C" 
                              ( "calculator:a" 0 tileui:data! "calculator.display:num" 0 tileui:data! )
                              nk:button-label drop 
                            )
                      },
                      {
                        name: "0",
                        grid: { row: 3, rows: 1, col: 1, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "0" ( 0 +n ) nk:button-label drop )
                      },
                      {
                        name: "=",
                        grid: { row: 3, rows: 1, col: 2, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "=" ( "calculator:op" tileui:data@ >r
                                                               "calculator.display:num" tileui:data@ >r
                                                               "calculator:a" tileui:data@ r> r> w:exec
                                                               "calculator.display:num" swap tileui:data!
                                                               "calculator:a" 0 tileui:data! ) nk:button-label drop )
                      },
                      {
                        name: "/",
                        grid: { row: 3, rows: 1, col: 3, cols: 1 },
                        data: { }, 
                        cb: ( nk:rect>local nk:grid-push "/"  ( ' n:/ mathop ) nk:button-label drop )
                      }
                    ]
           }
         ]
} constant UI
: init-window-size
  mobile? if
    hw:displaysize?
  else
    240 260
  then ;
init-window-size constant HEIGHT constant WIDTH
: new-win
  {
    name: "main",
    wide: @WIDTH,
    high: @HEIGHT,
    resizable: true,
    title: "Calculator"
  }
  nk:win ;
: main-render
  {
    name: "main",
    title: "main",
    bg: "white",
    padding: [0,0],
    flags: [ @nk:WINDOW_NO_SCROLLBAR ]
  }
 
  nk:begin
    UI tileui:render
  nk:end ;
           
: app:main
  UI tileui:init
  new-win ' main-render -1 nk:render-loop ;
